Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions compiler/src/build-unit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,12 @@ import { mdastPhase } from './mdast';
import { combinedMdastPhase } from './mdast/combined';
import { convertToPdf } from './pdf';
import { preParsePhase } from './pre-parse';
import { VFileWithMessages } from './utils/message';

export type BuiltUnit = {
unit: Unit;
md: string;
files: VFile[];
files: VFileWithMessages[];
html?: {
mdast: MdastParent;
hast: HastParent;
Expand All @@ -45,7 +46,7 @@ export async function buildUnit(unit: Unit, ctx: Context) {
const result: BuiltUnit = {
unit,
md: combineMdFiles(unifiedFile),
files: [unifiedFile],
files: [unifiedFile as VFileWithMessages],
};

if (!ctx.options.noHtml) {
Expand Down
13 changes: 13 additions & 0 deletions compiler/src/linter/__test__/report.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { reportTestProcessor } from '../../test-utils/report-test-processor';

describe('assertTaskAnswerStructure', () => {
it('should fail on task with no answer', async () => {
const [message] = await reportTestProcessor('report-excerpts', {
shouldFail: true,
});

expect(message.excerpt).toBe(
`::::task\nHmm, this is the task content?\n::::`
);
});
});
19 changes: 15 additions & 4 deletions compiler/src/linter/assert-task-answer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { ContainerDirective } from 'mdast-util-directive';
import { visit } from 'unist-util-visit';
import { VFile } from 'vfile';

import { failMessage } from '../utils/message';
import { createExcerpt, failMessage } from '../utils/message';

export function assertTaskAnswerStructure() {
return (tree: Root, file: VFile) => {
Expand All @@ -14,10 +14,20 @@ export function assertTaskAnswerStructure() {
const children = node.children as ContainerDirective[];
const answers = children.filter((o) => o.name === 'answer');
if (answers.length < 1) {
failMessage(file, `Task ${count} has no answer`, node.position);
failMessage(
file,
`Task ${count} has no answer`,
node.position,
createExcerpt(file, node.position)
);
}
if (answers.length > 1) {
failMessage(file, 'Task has multiple answers', node.position);
failMessage(
file,
'Task has multiple answers',
node.position,
createExcerpt(file, node.position)
);
}
}
if (node.name === 'answer') {
Expand All @@ -26,7 +36,8 @@ export function assertTaskAnswerStructure() {
failMessage(
file,
'Answer must be nested inside task',
node.position
node.position,
createExcerpt(file, node.position)
);
}
}
Expand Down
17 changes: 12 additions & 5 deletions compiler/src/test-utils/has-message.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,11 @@ import {
reportHasFatalErrors,
reportHasWarnings,
} from '../linter/report';
import { MessageStatus } from '../utils/message';
import {
Message,
MessageStatus,
VFileWithMessages,
} from '../utils/message';

export function createHasFailingMessage(ctx: Context, files: VFile[]) {
return function hasFailingMessage(reason: string) {
Expand Down Expand Up @@ -55,9 +59,12 @@ export function createHasWarningMessage(ctx: Context, files: VFile[]) {
};
}

export function createMessageReasons(files: VFile[]) {
return files.reduce((acc: string[], o) => {
const reasons = o.messages.map((m) => m.reason);
return [...acc, ...reasons];
export function createMessages(files: VFileWithMessages[]) {
return files.reduce((acc: Message[], file) => {
return [...acc, ...file.messages];
}, []);
}

export function createMessageReasons(files: VFileWithMessages[]) {
return createMessages(files).map((o) => o.reason);
}
24 changes: 24 additions & 0 deletions compiler/src/test-utils/report-test-processor.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import path from 'path';

import { Options } from '../context';
import { createMessages } from './has-message';
import { rMarkdown } from '..';

export async function reportTestProcessor(
fixture: string,
options: Options = {}
) {
const fixturePath = path.join('./fixtures', fixture);

const [result] = await rMarkdown(fixturePath, {
noDoc: true,
noCache: true,
noPdf: true,
noWrite: true,
noReport: true,
noEmbedAssets: true,
...options,
});

return createMessages(result.files);
}
3 changes: 2 additions & 1 deletion compiler/src/test-utils/test-processor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { VFile } from 'vfile';
import { buildUnit } from '../build-unit';
import { Context, Options } from '../context';
import { getUnitTitles } from '../course';
import { VFileWithMessages } from '../utils/message';
import { writeFile } from '../utils/utils';
import {
createHasFailingMessage,
Expand All @@ -22,7 +23,7 @@ export async function testProcessor(md: string, options: Options = {}) {

const unit = {
md: '',
files: [] as VFile[],
files: [] as VFileWithMessages[],
mdast: {} as MDastParent,
hast: {} as HastParent,
html: '',
Expand Down
51 changes: 35 additions & 16 deletions compiler/src/utils/message.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
import { EOL } from 'os';

import { Position } from 'unist';
import { VFile } from 'vfile';
import { VFileMessage } from 'vfile-message';

export type VFileWithStatus = Omit<VFile, 'messages'> & {
messages: MessageWithStatus[];
};

export type MessageWithStatus = VFileMessage & {
status: MessageStatus;
export type VFileWithMessages = Omit<VFile, 'messages'> & {
messages: Message[];
};

export enum MessageStatus {
Expand All @@ -16,41 +14,62 @@ export enum MessageStatus {
info = 'info',
}

export type Message = VFileMessage & {
status: MessageStatus;
excerpt?: string;
};

export function createExcerpt(file: VFile, position?: Position) {
if (!position) {
return '';
}
const { start, end } = position;
const lines = String(file.value).split(EOL);
return lines.slice(start.line - 1, end.line).join(EOL);
}

export function failMessage(
file: VFile,
message: string,
position?: Position
position?: Position,
excerpt?: string
) {
const status = MessageStatus.fail;
return messageWithStatus(file, message, position, status);
return createMessage(file, message, status, position, excerpt);
}

export function warnMessage(
file: VFile,
message: string,
position: Position | undefined
position?: Position,
excerpt?: string
) {
const status = MessageStatus.warning;
return messageWithStatus(file, message, position, status);
return createMessage(file, message, status, position, excerpt);
}

export function infoMessage(
file: VFile,
message: string,
position: Position | undefined
position?: Position,
excerpt?: string
) {
const status = MessageStatus.info;
return messageWithStatus(file, message, position, status);
return createMessage(file, message, status, position, excerpt);
}

function messageWithStatus(
function createMessage(
file: VFile,
message: string,
position: Position | undefined,
status: MessageStatus
status: MessageStatus,
position?: Position,
excerpt?: string
) {
// console.log(message);
const msg = file.message(message, position) as MessageWithStatus;
const msg = file.message(message, position) as Message;
msg.status = status;
if (excerpt) {
msg.excerpt = excerpt;
}
return msg;
}
7 changes: 7 additions & 0 deletions fixtures/report-excerpts/course.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
title: Report excerpts
type: course
catalog: STATS5078
authors: David McArthur
academic_year: 2021-22
units:
- src: test/test.yaml
11 changes: 11 additions & 0 deletions fixtures/report-excerpts/test/test.Rmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
## Heading

Paragraph 1

Paragraph 2

::::task
Hmm, this is the task content?
::::

Paragraph 3
5 changes: 5 additions & 0 deletions fixtures/report-excerpts/test/test.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
name: 'Test'
title: 'Report excerpts'
content:
- type: text
src: test.Rmd