From 9ca475dc44ddd25ca0be631338fedeecb1a69d8f Mon Sep 17 00:00:00 2001 From: alex Date: Tue, 3 Oct 2023 15:52:05 -0600 Subject: [PATCH] working on parsing markdown as a quiz --- .vscode/extensions.json | 1 - Management.Test/Markdown/QuizMarkdownTests.cs | 28 +++++++++ .../AssignmentSyncronizationExtensions.cs | 2 +- .../ModuleSyncronizationExtensions.cs | 4 +- .../QuizSyncronizationExtensions.cs | 8 ++- Management/Models/Local/LocalQuiz.cs | 58 +++++++++++++++++++ 6 files changed, 95 insertions(+), 6 deletions(-) diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 5c21a1d..327e78a 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,5 +1,4 @@ { "recommendations": [ - "csharpier.csharpier-vscode" ] } \ No newline at end of file diff --git a/Management.Test/Markdown/QuizMarkdownTests.cs b/Management.Test/Markdown/QuizMarkdownTests.cs index 9f78040..7e8dc8f 100644 --- a/Management.Test/Markdown/QuizMarkdownTests.cs +++ b/Management.Test/Markdown/QuizMarkdownTests.cs @@ -145,4 +145,32 @@ oneline question "; markdown.Should().Contain(expectedQuestionString); } + + [Test] + public void TestCanParseMarkdownQuizWithNoQuestions() + { + var rawMarkdownQuiz = @" +Name: Test Quiz +LockAtDueDate: true +ShuffleAnswers: true +OneQuestionAtATime: false +DueAt: 2023-08-21T23:59:00 +LockAt: 2023-08-21T23:59:00 +AssignmentGroup: Assignments +AllowedAttempts: -1 +Description: this is the +multi line +description +"; + var quiz = LocalQuiz.ParseMarkdown(rawMarkdownQuiz); + + quiz.Name.Should().Be("Test Quiz"); + quiz.LockAtDueDate.Should().Be(true); + quiz.ShuffleAnswers.Should().Be(true); + quiz.OneQuestionAtATime.Should().BeFalse(); + quiz.AllowedAttempts.Should().Be(-1); + quiz.Description.Should().Be(@"this is the +multi line +description"); + } } \ No newline at end of file diff --git a/Management/Features/Configuration/Synchronization/AssignmentSyncronizationExtensions.cs b/Management/Features/Configuration/Synchronization/AssignmentSyncronizationExtensions.cs index 750ef29..c8e8f53 100644 --- a/Management/Features/Configuration/Synchronization/AssignmentSyncronizationExtensions.cs +++ b/Management/Features/Configuration/Synchronization/AssignmentSyncronizationExtensions.cs @@ -249,7 +249,7 @@ public static partial class AssignmentSyncronizationExtensions var moduleTasks = localCourse.Modules.Select(async m => { var assignmentTasks = m.Assignments.Select( - (a) => localCourse.SyncAssignmentToCanvas(canvasCourseId, a, canvasAssignments, canvas) + async (a) => await localCourse.SyncAssignmentToCanvas(canvasCourseId, a, canvasAssignments, canvas) ); var assignments = await Task.WhenAll(assignmentTasks); return m with { Assignments = assignments }; diff --git a/Management/Features/Configuration/Synchronization/ModuleSyncronizationExtensions.cs b/Management/Features/Configuration/Synchronization/ModuleSyncronizationExtensions.cs index f4f2cee..73b1539 100644 --- a/Management/Features/Configuration/Synchronization/ModuleSyncronizationExtensions.cs +++ b/Management/Features/Configuration/Synchronization/ModuleSyncronizationExtensions.cs @@ -116,7 +116,7 @@ public static partial class ModuleSyncronizationExtensions ) { var anyUpdated = false; - foreach (var localAssignment in localModule.Assignments) + foreach (var localAssignment in localModule.Assignments.Where(a => a.DueAt > DateTime.Now)) { var canvasModuleItemContentIds = canvasModulesItems[moduleCanvasId].Select(i => i.ContentId); if (!canvasModuleItemContentIds.Contains(localAssignment.CanvasId)) @@ -135,7 +135,7 @@ public static partial class ModuleSyncronizationExtensions } } - foreach (var localQuiz in localModule.Quizzes) + foreach (var localQuiz in localModule.Quizzes.Where(q => q.DueAt > DateTime.Now)) { var canvasModuleItemContentIds = canvasModulesItems[moduleCanvasId].Select(i => i.ContentId); diff --git a/Management/Features/Configuration/Synchronization/QuizSyncronizationExtensions.cs b/Management/Features/Configuration/Synchronization/QuizSyncronizationExtensions.cs index ddae5e7..8bfeec0 100644 --- a/Management/Features/Configuration/Synchronization/QuizSyncronizationExtensions.cs +++ b/Management/Features/Configuration/Synchronization/QuizSyncronizationExtensions.cs @@ -23,8 +23,12 @@ public static partial class QuizSyncronizationExtensions { var moduleTasks = localCourse.Modules.Select(async m => { - var quizTasks = m.Quizzes.Select( - (q) => localCourse.SyncQuizToCanvas(canvasId, q, canvasQuizzes, canvas) + + var quizTasks = m.Quizzes + .Select( + async (q) => q.DueAt > DateTime.Now + ? await localCourse.SyncQuizToCanvas(canvasId, q, canvasQuizzes, canvas) + : q ); var quizzes = await Task.WhenAll(quizTasks); return m with { Quizzes = quizzes }; diff --git a/Management/Models/Local/LocalQuiz.cs b/Management/Models/Local/LocalQuiz.cs index a61da64..a0c3115 100644 --- a/Management/Models/Local/LocalQuiz.cs +++ b/Management/Models/Local/LocalQuiz.cs @@ -1,3 +1,4 @@ +using System.Text.RegularExpressions; using YamlDotNet.Serialization; namespace LocalModels; @@ -56,4 +57,61 @@ Description: {Description} {questionMarkdown} "; } + + public static LocalQuiz ParseMarkdown(string input) + { + + var splitInput = input.Split(Environment.NewLine + Environment.NewLine); + var settings = splitInput[0]; + + var name = extractLabelValue(settings, "Name"); + var lockAtDueDate = bool.Parse(extractLabelValue(settings, "LockAtDueDate")); + var shuffleAnswers = bool.Parse(extractLabelValue(settings, "ShuffleAnswers")); + var oneQuestionAtATime = bool.Parse(extractLabelValue(settings, "OneQuestionAtATime")); + var allowedAttempts = int.Parse(extractLabelValue(settings, "AllowedAttempts")); + var dueAt = DateTime.Parse(extractLabelValue(settings, "DueAt")); + var lockAt = DateTime.Parse(extractLabelValue(settings, "LockAt")); + var description = extractDescription(settings); + + // var assignmentGroup = ExtractLabelValue(settings, "AssignmentGroup"); + return new LocalQuiz() + { + Id = "id-" + name, + Name = name, + Description = description, + LockAtDueDate = lockAtDueDate, + LockAt = lockAt, + DueAt = dueAt, + ShuffleAnswers = shuffleAnswers, + OneQuestionAtATime = oneQuestionAtATime, + // LocalAssignmentGroupId = "someId", + AllowedAttempts = allowedAttempts, + Questions = new LocalQuizQuestion[] { } + }; + } + static string extractLabelValue(string input, string label) + { + string pattern = $@"{label}: (.*?)\n"; + Match match = Regex.Match(input, pattern); + + if (match.Success) + { + return match.Groups[1].Value; + } + + return string.Empty; + } + + static string extractDescription(string input) + { + string pattern = "Description: (.*?)$"; + Match match = Regex.Match(input, pattern, RegexOptions.Singleline); + + if (match.Success) + { + return match.Groups[1].Value; + } + + return string.Empty; + } }