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: springBreak:
`; `;
const output = parseHolidays(testString); const output = parseHolidays(testString);
expect(output).toEqual({ springBreak: [] }); expect(output).toEqual([{ name: "springBreak", days: [] }]);
}); });
it("can parse list with date", () => { it("can parse list with date", () => {
const testString = ` const testString = `
@@ -15,7 +15,7 @@ springBreak:
- 10/12/2024 - 10/12/2024
`; `;
const output = parseHolidays(testString); 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", () => { it("can parse list with two dates", () => {
const testString = ` const testString = `
@@ -24,6 +24,8 @@ springBreak:
- 10/13/2024 - 10/13/2024
`; `;
const output = parseHolidays(testString); 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 fs from "fs/promises";
import { Lecture } from "@/models/local/lecture"; import { Lecture } from "@/models/local/lecture";
import { extractLabelValue } from "@/models/local/assignment/utils/markdownUtils"; import { extractLabelValue } from "@/models/local/assignment/utils/markdownUtils";
import { getDateOnlyMarkdownString } from "@/models/local/timeUtils";
export async function getLectures(courseName: string) { export async function getLectures(courseName: string) {
const courseLectureRoot = path.join(basePath, courseName, "lectures"); const courseLectureRoot = path.join(basePath, courseName, "lectures");
@@ -38,18 +39,30 @@ export async function getLectures(courseName: string) {
return lecturesByWeek; return lecturesByWeek;
} }
function parseLecture(fileContent: string): Lecture { export function parseLecture(fileContent: string): Lecture {
const settings = fileContent.split("---\n")[0]; try {
const name = extractLabelValue(settings, "Name"); const settings = fileContent.split("---\n")[0];
const date = extractLabelValue(settings, "Date"); const name = extractLabelValue(settings, "Name");
const date = extractLabelValue(settings, "Date");
const content = fileContent.split("---\n")[1].trim(); const content = fileContent.split("---\n")[1].trim();
return { return {
name, name,
date, date,
content, 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> => { const directoryExists = async (path: string): Promise<boolean> => {

View File

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