deterministic lecture stringification

This commit is contained in:
2024-11-01 16:32:19 -06:00
parent 859c9033f0
commit dcecf3172e
4 changed files with 70 additions and 18 deletions

View File

@@ -7,7 +7,7 @@ describe("can parse holiday string", () => {
springBreak:
`;
const output = parseHolidays(testString);
expect(output).toEqual({ springBreak: [] });
expect(output).toEqual([{ name: "springBreak", days: [] }]);
});
it("can parse list with date", () => {
const testString = `
@@ -15,7 +15,7 @@ springBreak:
- 10/12/2024
`;
const output = parseHolidays(testString);
expect(output).toEqual({ springBreak: ["10/12/2024"] });
expect(output).toEqual([{ name: "springBreak", days: ["10/12/2024"] }]);
});
it("can parse list with two dates", () => {
const testString = `
@@ -24,6 +24,8 @@ springBreak:
- 10/13/2024
`;
const output = parseHolidays(testString);
expect(output).toEqual({ springBreak: ["10/12/2024", "10/13/2024"] });
expect(output).toEqual([
{ name: "springBreak", days: ["10/12/2024", "10/13/2024"] },
]);
});
});

View File

@@ -4,6 +4,7 @@ import { basePath } from "./utils/fileSystemUtils";
import fs from "fs/promises";
import { Lecture } from "@/models/local/lecture";
import { extractLabelValue } from "@/models/local/assignment/utils/markdownUtils";
import { getDateOnlyMarkdownString } from "@/models/local/timeUtils";
export async function getLectures(courseName: string) {
const courseLectureRoot = path.join(basePath, courseName, "lectures");
@@ -38,7 +39,8 @@ export async function getLectures(courseName: string) {
return lecturesByWeek;
}
function parseLecture(fileContent: string): Lecture {
export function parseLecture(fileContent: string): Lecture {
try {
const settings = fileContent.split("---\n")[0];
const name = extractLabelValue(settings, "Name");
const date = extractLabelValue(settings, "Date");
@@ -50,6 +52,17 @@ function parseLecture(fileContent: string): Lecture {
date,
content,
};
} catch (error) {
console.error("Error parsing lecture", fileContent);
throw error;
}
}
export function lectureToString(lecture: Lecture) {
return `Name: ${lecture.name}
Date: ${lecture.date}
---
${lecture.content}`;
}
const directoryExists = async (path: string): Promise<boolean> => {

View File

@@ -1,9 +1,6 @@
import { describe, it, expect, beforeEach } from "vitest";
import { promises as fs } from "fs";
import {
DayOfWeek,
LocalCourseSettings,
} from "@/models/local/localCourse";
import { DayOfWeek, LocalCourseSettings } from "@/models/local/localCourse";
import { fileStorageService } from "../fileStorage/fileStorageService";
describe("FileStorageTests", () => {
@@ -30,7 +27,7 @@ describe("FileStorageTests", () => {
canvasId: 0,
defaultAssignmentSubmissionTypes: [],
defaultFileUploadTypes: [],
holidays: {}
holidays: [],
};
await fileStorageService.settings.updateCourseSettings(name, settings);

View File

@@ -0,0 +1,40 @@
import { describe, expect, it } from "vitest";
import {
lectureToString,
parseLecture,
} from "../fileStorage/lectureFileStorageService";
import { Lecture } from "@/models/local/lecture";
describe("can parse and stringify lectures", () => {
it("can parse lecture", () => {
const rawLecture = `
Name: some name
Date: 6/22/2024
---
this is the lecture
content`;
const parsed = parseLecture(rawLecture);
expect(parsed.name).toBe("some name");
expect(parsed.date).toBe("6/22/2024");
expect(parsed.content).toBe(`this is the lecture
content`);
});
it("parsing and stringification is deterministic", () => {
const lecture: Lecture = {
name: "test lecture",
date: "06/*22/2024",
content: `some content
- with
- a
- list`,
};
const rawLecture = lectureToString(lecture);
const parsedLecture = parseLecture(rawLecture);
expect(parsedLecture).toStrictEqual(lecture);
});
});