From 8a43d2608e12b6f26bbd285eb2e78af6039352cb Mon Sep 17 00:00:00 2001 From: tohlh Date: Tue, 25 Mar 2025 16:33:14 +0800 Subject: [PATCH 1/4] Add options field --- lib/cadet/assessments/library.ex | 3 ++- lib/cadet/jobs/xml_parser.ex | 45 ++++++++++++++++++++------------ 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/lib/cadet/assessments/library.ex b/lib/cadet/assessments/library.ex index 50e2d14f4..b2b1e6105 100644 --- a/lib/cadet/assessments/library.ex +++ b/lib/cadet/assessments/library.ex @@ -12,11 +12,12 @@ defmodule Cadet.Assessments.Library do field(:variant, :string, default: nil) field(:exec_time_ms, :integer, default: 1000) field(:globals, :map, default: %{}) + field(:options, :map, default: %{}) embeds_one(:external, ExternalLibrary, on_replace: :update) end @required_fields ~w(chapter)a - @optional_fields ~w(globals variant exec_time_ms)a + @optional_fields ~w(globals variant options exec_time_ms)a @required_embeds ~w(external)a def changeset(library, params \\ %{}) do diff --git a/lib/cadet/jobs/xml_parser.ex b/lib/cadet/jobs/xml_parser.ex index b49128506..6beff98aa 100644 --- a/lib/cadet/jobs/xml_parser.ex +++ b/lib/cadet/jobs/xml_parser.ex @@ -133,8 +133,8 @@ defmodule Cadet.Updater.XMLParser do @spec process_questions(String.t()) :: {:ok, [map()]} | {:error, String.t()} defp process_questions(xml) do - default_library = xpath(xml, ~x"//TASK/DEPLOYMENT"e) - default_grading_library = xpath(xml, ~x"//TASK/GRADERDEPLOYMENT"e) + default_library = xpath(xml, ~x"//TASK/PROGRAMMINGLANGUAGE"e) + default_grading_library = xpath(xml, ~x"//TASK/GRADERPROGRAMMINGLANGUAGE"e) questions_params = xml @@ -270,22 +270,23 @@ defmodule Cadet.Updater.XMLParser do @spec process_question_library(map(), any(), any()) :: map() | {:error, String.t()} defp process_question_library(question, default_library, default_grading_library) do - library = xpath(question[:entity], ~x"./DEPLOYMENT"o) || default_library + library = xpath(question[:entity], ~x"./PROGRAMMINGLANGUAGE"o) || default_library grading_library = - xpath(question[:entity], ~x"./GRADERDEPLOYMENT"o) || default_grading_library || library + xpath(question[:entity], ~x"./GRADERPROGRAMMINGLANGUAGE"o) || default_grading_library || + library if library do question - |> Map.put(:library, process_question_library(library)) - |> Map.put(:grading_library, process_question_library(grading_library)) + |> Map.put(:library, parse_programming_language(library)) + |> Map.put(:grading_library, parse_programming_language(grading_library)) else - {:error, "Missing DEPLOYMENT"} + {:error, "Missing PROGRAMMINGLANGUAGE"} end end - @spec process_question_library(any()) :: map() - defp process_question_library(library_entity) do + @spec parse_programming_language(any()) :: map() + defp parse_programming_language(library_entity) do globals = library_entity |> xpath( @@ -305,15 +306,25 @@ defmodule Cadet.Updater.XMLParser do symbols: ~x"./SYMBOL/text()"sl ) + options_list = + library_entity + |> xpath(~x"./OPTION"el, key: ~x"./@key"s, value: ~x"./@value"s) + + options_map = + Enum.reduce(options_list, %{}, fn %{key: k, value: v}, acc -> + Map.put(acc, k, v) + end) + library_entity - |> xpath( - ~x"."e, - chapter: ~x"./@interpreter"i, - exec_time_ms: ~x"./@exectime"oi, - variant: ~x"./@variant"os - ) - |> Map.put(:globals, globals) - |> Map.put(:external, external) + |> xpath( + ~x"."e, + chapter: ~x"./@chapter"i, + exec_time_ms: ~x"./@exectime"oi, + variant: ~x"./@variant"os + ) + |> Map.put(:globals, globals) + |> Map.put(:external, external) + |> Map.put(:options, options_map) end @spec process_charlist(charlist() | nil) :: String.t() | nil From 932a40bdaf19d9f6160746119a718b63a88985ec Mon Sep 17 00:00:00 2001 From: tohlh Date: Wed, 26 Mar 2025 16:39:02 +0800 Subject: [PATCH 2/4] Add options field --- lib/cadet/assessments/library.ex | 4 ++-- lib/cadet/jobs/xml_parser.ex | 2 +- lib/cadet_web/helpers/assessments_helpers.ex | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/cadet/assessments/library.ex b/lib/cadet/assessments/library.ex index b2b1e6105..9d1348fcc 100644 --- a/lib/cadet/assessments/library.ex +++ b/lib/cadet/assessments/library.ex @@ -12,12 +12,12 @@ defmodule Cadet.Assessments.Library do field(:variant, :string, default: nil) field(:exec_time_ms, :integer, default: 1000) field(:globals, :map, default: %{}) - field(:options, :map, default: %{}) + field(:language_options, :map, default: %{}) embeds_one(:external, ExternalLibrary, on_replace: :update) end @required_fields ~w(chapter)a - @optional_fields ~w(globals variant options exec_time_ms)a + @optional_fields ~w(globals variant language_options exec_time_ms)a @required_embeds ~w(external)a def changeset(library, params \\ %{}) do diff --git a/lib/cadet/jobs/xml_parser.ex b/lib/cadet/jobs/xml_parser.ex index 6beff98aa..987adcd74 100644 --- a/lib/cadet/jobs/xml_parser.ex +++ b/lib/cadet/jobs/xml_parser.ex @@ -324,7 +324,7 @@ defmodule Cadet.Updater.XMLParser do ) |> Map.put(:globals, globals) |> Map.put(:external, external) - |> Map.put(:options, options_map) + |> Map.put(:language_options, options_map) end @spec process_charlist(charlist() | nil) :: String.t() | nil diff --git a/lib/cadet_web/helpers/assessments_helpers.ex b/lib/cadet_web/helpers/assessments_helpers.ex index 967df1131..d492328f1 100644 --- a/lib/cadet_web/helpers/assessments_helpers.ex +++ b/lib/cadet_web/helpers/assessments_helpers.ex @@ -10,7 +10,8 @@ defmodule CadetWeb.AssessmentsHelpers do variant: :variant, execTimeMs: :exec_time_ms, globals: :globals, - external: &build_external_library(%{external_library: &1.external}) + external: &build_external_library(%{external_library: &1.external}), + languageOptions: :language_options }) end From e91ae103af36cf5064eb302326a2da83b4297b51 Mon Sep 17 00:00:00 2001 From: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> Date: Sun, 6 Apr 2025 11:23:20 +0800 Subject: [PATCH 3/4] Fix format --- lib/cadet/jobs/xml_parser.ex | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/cadet/jobs/xml_parser.ex b/lib/cadet/jobs/xml_parser.ex index 987adcd74..aaed605aa 100644 --- a/lib/cadet/jobs/xml_parser.ex +++ b/lib/cadet/jobs/xml_parser.ex @@ -316,15 +316,15 @@ defmodule Cadet.Updater.XMLParser do end) library_entity - |> xpath( - ~x"."e, - chapter: ~x"./@chapter"i, - exec_time_ms: ~x"./@exectime"oi, - variant: ~x"./@variant"os - ) - |> Map.put(:globals, globals) - |> Map.put(:external, external) - |> Map.put(:language_options, options_map) + |> xpath( + ~x"."e, + chapter: ~x"./@chapter"i, + exec_time_ms: ~x"./@exectime"oi, + variant: ~x"./@variant"os + ) + |> Map.put(:globals, globals) + |> Map.put(:external, external) + |> Map.put(:language_options, options_map) end @spec process_charlist(charlist() | nil) :: String.t() | nil From 839988ef05ee481e84e4fc6e709d7fcadbb809dc Mon Sep 17 00:00:00 2001 From: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> Date: Fri, 13 Jun 2025 19:10:28 +0800 Subject: [PATCH 4/4] Update some test cases --- .../admin_controllers/admin_grading_controller_test.exs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/cadet_web/admin_controllers/admin_grading_controller_test.exs b/test/cadet_web/admin_controllers/admin_grading_controller_test.exs index 87ac65e28..69cef101b 100644 --- a/test/cadet_web/admin_controllers/admin_grading_controller_test.exs +++ b/test/cadet_web/admin_controllers/admin_grading_controller_test.exs @@ -306,6 +306,7 @@ defmodule CadetWeb.AdminGradingControllerTest do "symbols" => &1.question.library.external.symbols }, "execTimeMs" => &1.question.library.exec_time_ms, + "languageOptions" => %{}, "variant" => &1.question.library.variant }, "maxXp" => &1.question.max_xp, @@ -347,6 +348,7 @@ defmodule CadetWeb.AdminGradingControllerTest do "symbols" => &1.question.library.external.symbols }, "execTimeMs" => &1.question.library.exec_time_ms, + "languageOptions" => %{}, "variant" => &1.question.library.variant }, "maxXp" => &1.question.max_xp, @@ -398,6 +400,7 @@ defmodule CadetWeb.AdminGradingControllerTest do "symbols" => &1.question.library.external.symbols }, "execTimeMs" => &1.question.library.exec_time_ms, + "languageOptions" => %{}, "variant" => &1.question.library.variant }, "maxXp" => &1.question.max_xp, @@ -1327,6 +1330,7 @@ defmodule CadetWeb.AdminGradingControllerTest do "symbols" => &1.question.library.external.symbols }, "execTimeMs" => &1.question.library.exec_time_ms, + "languageOptions" => %{}, "variant" => &1.question.library.variant }, "maxXp" => &1.question.max_xp, @@ -1368,6 +1372,7 @@ defmodule CadetWeb.AdminGradingControllerTest do "symbols" => &1.question.library.external.symbols }, "execTimeMs" => &1.question.library.exec_time_ms, + "languageOptions" => %{}, "variant" => &1.question.library.variant }, "content" => &1.question.question.content, @@ -1419,6 +1424,7 @@ defmodule CadetWeb.AdminGradingControllerTest do "symbols" => &1.question.library.external.symbols }, "execTimeMs" => &1.question.library.exec_time_ms, + "languageOptions" => %{}, "variant" => &1.question.library.variant }, "maxXp" => &1.question.max_xp,