adding github classroom links to settings

This commit is contained in:
2025-07-21 14:11:46 -06:00
parent 9aec082467
commit 42ce579eee
4 changed files with 108 additions and 17 deletions

View File

@@ -17,6 +17,8 @@ export interface LocalAssignment extends IModuleItem {
submissionTypes: AssignmentSubmissionType[]; submissionTypes: AssignmentSubmissionType[];
allowedFileUploadExtensions: string[]; allowedFileUploadExtensions: string[];
rubric: RubricItem[]; rubric: RubricItem[];
githubClassroomAssignmentShareLink?: string;
githubClassroomAssignmentLink?: string;
} }
export const zodLocalAssignment = z.object({ export const zodLocalAssignment = z.object({
@@ -28,6 +30,8 @@ export const zodLocalAssignment = z.object({
submissionTypes: zodAssignmentSubmissionType.array(), submissionTypes: zodAssignmentSubmissionType.array(),
allowedFileUploadExtensions: z.string().array(), allowedFileUploadExtensions: z.string().array(),
rubric: zodRubricItem.array(), rubric: zodRubricItem.array(),
githubClassroomAssignmentShareLink: z.string().optional(),
githubClassroomAssignmentLink: z.string().optional(),
}); });
export const localAssignmentMarkdown = { export const localAssignmentMarkdown = {

View File

@@ -52,6 +52,14 @@ const parseSettings = (input: string) => {
const assignmentGroupName = extractLabelValue(input, "AssignmentGroupName"); const assignmentGroupName = extractLabelValue(input, "AssignmentGroupName");
const submissionTypes = parseSubmissionTypes(input); const submissionTypes = parseSubmissionTypes(input);
const fileUploadExtensions = parseFileUploadExtensions(input); const fileUploadExtensions = parseFileUploadExtensions(input);
const githubClassroomAssignmentShareLink = extractLabelValue(
input,
"GithubClassroomAssignmentShareLink"
);
const githubClassroomAssignmentLink = extractLabelValue(
input,
"GithubClassroomAssignmentLink"
);
const dueAt = verifyDateOrThrow(rawDueAt, "DueAt"); const dueAt = verifyDateOrThrow(rawDueAt, "DueAt");
const lockAt = verifyDateStringOrUndefined(rawLockAt); const lockAt = verifyDateStringOrUndefined(rawLockAt);
@@ -62,6 +70,8 @@ const parseSettings = (input: string) => {
fileUploadExtensions, fileUploadExtensions,
dueAt, dueAt,
lockAt, lockAt,
githubClassroomAssignmentShareLink,
githubClassroomAssignmentLink,
}; };
}; };
@@ -111,12 +121,13 @@ export const assignmentMarkdownParser = {
parseMarkdown(input: string, name: string): LocalAssignment { parseMarkdown(input: string, name: string): LocalAssignment {
const settingsString = input.split("---")[0]; const settingsString = input.split("---")[0];
const { const {
// name,
assignmentGroupName, assignmentGroupName,
submissionTypes, submissionTypes,
fileUploadExtensions, fileUploadExtensions,
dueAt, dueAt,
lockAt, lockAt,
githubClassroomAssignmentShareLink,
githubClassroomAssignmentLink,
} = parseSettings(settingsString); } = parseSettings(settingsString);
const description = input const description = input
@@ -139,6 +150,13 @@ export const assignmentMarkdownParser = {
rubric: rubric, rubric: rubric,
description: description, description: description,
}; };
if (githubClassroomAssignmentShareLink) {
assignment.githubClassroomAssignmentShareLink =
githubClassroomAssignmentShareLink;
}
if (githubClassroomAssignmentLink) {
assignment.githubClassroomAssignmentLink = githubClassroomAssignmentLink;
}
return assignment; return assignment;
}, },
}; };

View File

@@ -25,15 +25,16 @@ const settingsToMarkdown = (assignment: LocalAssignment) => {
.map((fileExtension: string) => `- ${fileExtension}`) .map((fileExtension: string) => `- ${fileExtension}`)
.join("\n"); .join("\n");
const settingsMarkdown = [ const settingsMarkdownArr = [
`LockAt: ${printableLockAt}`, `LockAt: ${printableLockAt}`,
`DueAt: ${printableDueDate}`, `DueAt: ${printableDueDate}`,
`AssignmentGroupName: ${assignment.localAssignmentGroupName}`, `AssignmentGroupName: ${assignment.localAssignmentGroupName}`,
`SubmissionTypes:\n${submissionTypesMarkdown}`, `SubmissionTypes:\n${submissionTypesMarkdown}`,
`AllowedFileUploadExtensions:\n${allowedFileUploadExtensionsMarkdown}`, `AllowedFileUploadExtensions:\n${allowedFileUploadExtensionsMarkdown}`,
].join("\n"); `GithubClassroomAssignmentShareLink: ${assignment.githubClassroomAssignmentShareLink ?? ""}`,
`GithubClassroomAssignmentLink: ${assignment.githubClassroomAssignmentLink ?? ""}`,
return settingsMarkdown; ];
return settingsMarkdownArr.join("\n");
}; };
export const assignmentMarkdownSerializer = { export const assignmentMarkdownSerializer = {

View File

@@ -46,8 +46,10 @@ describe("AssignmentMarkdownTests", () => {
const assignmentMarkdown = const assignmentMarkdown =
assignmentMarkdownSerializer.toMarkdown(assignment); assignmentMarkdownSerializer.toMarkdown(assignment);
const parsedAssignment = const parsedAssignment = assignmentMarkdownParser.parseMarkdown(
assignmentMarkdownParser.parseMarkdown(assignmentMarkdown, name); assignmentMarkdown,
name
);
expect(parsedAssignment).toEqual(assignment); expect(parsedAssignment).toEqual(assignment);
}); });
@@ -70,8 +72,10 @@ describe("AssignmentMarkdownTests", () => {
const assignmentMarkdown = const assignmentMarkdown =
assignmentMarkdownSerializer.toMarkdown(assignment); assignmentMarkdownSerializer.toMarkdown(assignment);
const parsedAssignment = const parsedAssignment = assignmentMarkdownParser.parseMarkdown(
assignmentMarkdownParser.parseMarkdown(assignmentMarkdown, name); assignmentMarkdown,
name
);
expect(parsedAssignment).toEqual(assignment); expect(parsedAssignment).toEqual(assignment);
}); });
@@ -94,8 +98,10 @@ describe("AssignmentMarkdownTests", () => {
const assignmentMarkdown = const assignmentMarkdown =
assignmentMarkdownSerializer.toMarkdown(assignment); assignmentMarkdownSerializer.toMarkdown(assignment);
const parsedAssignment = const parsedAssignment = assignmentMarkdownParser.parseMarkdown(
assignmentMarkdownParser.parseMarkdown(assignmentMarkdown, name); assignmentMarkdown,
name
);
expect(parsedAssignment).toEqual(assignment); expect(parsedAssignment).toEqual(assignment);
}); });
@@ -118,8 +124,10 @@ describe("AssignmentMarkdownTests", () => {
const assignmentMarkdown = const assignmentMarkdown =
assignmentMarkdownSerializer.toMarkdown(assignment); assignmentMarkdownSerializer.toMarkdown(assignment);
const parsedAssignment = const parsedAssignment = assignmentMarkdownParser.parseMarkdown(
assignmentMarkdownParser.parseMarkdown(assignmentMarkdown, name); assignmentMarkdown,
name
);
expect(parsedAssignment).toEqual(assignment); expect(parsedAssignment).toEqual(assignment);
}); });
@@ -139,8 +147,10 @@ describe("AssignmentMarkdownTests", () => {
const assignmentMarkdown = const assignmentMarkdown =
assignmentMarkdownSerializer.toMarkdown(assignment); assignmentMarkdownSerializer.toMarkdown(assignment);
const parsedAssignment = const parsedAssignment = assignmentMarkdownParser.parseMarkdown(
assignmentMarkdownParser.parseMarkdown(assignmentMarkdown, name); assignmentMarkdown,
name
);
expect(parsedAssignment).toEqual(assignment); expect(parsedAssignment).toEqual(assignment);
}); });
@@ -160,9 +170,67 @@ describe("AssignmentMarkdownTests", () => {
const assignmentMarkdown = const assignmentMarkdown =
assignmentMarkdownSerializer.toMarkdown(assignment); assignmentMarkdownSerializer.toMarkdown(assignment);
const parsedAssignment = const parsedAssignment = assignmentMarkdownParser.parseMarkdown(
assignmentMarkdownParser.parseMarkdown(assignmentMarkdown, name); assignmentMarkdown,
name
);
expect(parsedAssignment).toEqual(assignment); expect(parsedAssignment).toEqual(assignment);
}); });
it("assignment with githubClassroomAssignmentShareLink and githubClassroomAssignmentLink can be parsed", () => {
const name = "test assignment";
const assignment: LocalAssignment = {
name,
description: "here is the description",
dueAt: "08/21/2023 23:59:00",
lockAt: "08/21/2023 23:59:00",
submissionTypes: [AssignmentSubmissionType.ONLINE_UPLOAD],
localAssignmentGroupName: "Final Project",
rubric: [],
allowedFileUploadExtensions: [],
githubClassroomAssignmentShareLink: "https://github.com/share-link",
githubClassroomAssignmentLink: "https://github.com/assignment-link",
};
const assignmentMarkdown =
assignmentMarkdownSerializer.toMarkdown(assignment);
const parsedAssignment = assignmentMarkdownParser.parseMarkdown(
assignmentMarkdown,
name
);
expect(parsedAssignment.githubClassroomAssignmentShareLink).toEqual(
"https://github.com/share-link"
);
expect(parsedAssignment.githubClassroomAssignmentLink).toEqual(
"https://github.com/assignment-link"
);
expect(parsedAssignment).toEqual(assignment);
});
it("assignment without githubClassroomAssignmentShareLink and githubClassroomAssignmentLink can be parsed", () => {
const name = "test assignment";
const assignment: LocalAssignment = {
name,
description: "here is the description",
dueAt: "08/21/2023 23:59:00",
lockAt: "08/21/2023 23:59:00",
submissionTypes: [AssignmentSubmissionType.ONLINE_UPLOAD],
localAssignmentGroupName: "Final Project",
rubric: [],
allowedFileUploadExtensions: [],
};
const assignmentMarkdown =
assignmentMarkdownSerializer.toMarkdown(assignment);
const parsedAssignment = assignmentMarkdownParser.parseMarkdown(
assignmentMarkdown,
name
);
expect(parsedAssignment.githubClassroomAssignmentShareLink).toBeUndefined();
expect(parsedAssignment.githubClassroomAssignmentLink).toBeUndefined();
expect(parsedAssignment).toEqual(assignment);
});
}); });