Skip to content
Permalink

Comparing changes

This is a direct comparison between two commits made in this repository or its related repositories. View the default comparison for this range or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: source-academy/backend
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 6c591c693895221b95e4b865bbdeb7d17f92eeee
Choose a base ref
..
head repository: source-academy/backend
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: f3e7b785a0b45951b21f8c7b130c5eeca6987b06
Choose a head ref
4 changes: 3 additions & 1 deletion lib/cadet/courses/course.ex
Original file line number Diff line number Diff line change
@@ -13,6 +13,7 @@ defmodule Cadet.Courses.Course do
enable_game: boolean(),
enable_achievements: boolean(),
enable_sourcecast: boolean(),
enable_stories: boolean(),
source_chapter: integer(),
source_variant: String.t(),
module_help_text: String.t(),
@@ -26,6 +27,7 @@ defmodule Cadet.Courses.Course do
field(:enable_game, :boolean, default: true)
field(:enable_achievements, :boolean, default: true)
field(:enable_sourcecast, :boolean, default: true)
field(:enable_stories, :boolean, default: false)
field(:source_chapter, :integer)
field(:source_variant, :string)
field(:module_help_text, :string)
@@ -39,7 +41,7 @@ defmodule Cadet.Courses.Course do
end

@required_fields ~w(course_name viewable enable_game
enable_achievements enable_sourcecast source_chapter source_variant)a
enable_achievements enable_sourcecast enable_stories source_chapter source_variant)a
@optional_fields ~w(course_short_name module_help_text)a

def changeset(course, params) do
Original file line number Diff line number Diff line change
@@ -107,6 +107,7 @@ defmodule CadetWeb.AdminCoursesController do
enable_game(:body, :boolean, "Enable game")
enable_achievements(:body, :boolean, "Enable achievements")
enable_sourcecast(:body, :boolean, "Enable sourcecast")
enable_stories(:body, :boolean, "Enable stories")
sublanguage(:body, Schema.ref(:AdminSublanguage), "sublanguage object")
module_help_text(:body, :string, "Module help text")
end
3 changes: 3 additions & 0 deletions lib/cadet_web/controllers/courses_controller.ex
Original file line number Diff line number Diff line change
@@ -55,6 +55,7 @@ defmodule CadetWeb.CoursesController do
enable_game(:body, :boolean, "Enable game", required: true)
enable_achievements(:body, :boolean, "Enable achievements", required: true)
enable_sourcecast(:body, :boolean, "Enable sourcecast", required: true)
enable_stories(:body, :boolean, "Enable stories", required: true)
source_chapter(:body, :number, "Default source chapter", required: true)

source_variant(:body, Schema.ref(:SourceVariant), "Default source variant name",
@@ -95,6 +96,7 @@ defmodule CadetWeb.CoursesController do
enable_game(:boolean, "Enable game", required: true)
enable_achievements(:boolean, "Enable achievements", required: true)
enable_sourcecast(:boolean, "Enable sourcecast", required: true)
enable_stories(:boolean, "Enable stories", required: true)
source_chapter(:integer, "Source Chapter number from 1 to 4", required: true)
source_variant(Schema.ref(:SourceVariant), "Source Variant name", required: true)
module_help_text(:string, "Module help text", required: true)
@@ -108,6 +110,7 @@ defmodule CadetWeb.CoursesController do
enable_game: true,
enable_achievements: true,
enable_sourcecast: true,
enable_stories: false,
source_chapter: 1,
source_variant: "default",
module_help_text: "Help text",
2 changes: 2 additions & 0 deletions lib/cadet_web/controllers/user_controller.ex
Original file line number Diff line number Diff line change
@@ -316,6 +316,7 @@ defmodule CadetWeb.UserController do
enable_game(:boolean, "Enable game", required: true)
enable_achievements(:boolean, "Enable achievements", required: true)
enable_sourcecast(:boolean, "Enable sourcecast", required: true)
enable_stories(:boolean, "Enable stories", required: true)
source_chapter(:integer, "Source Chapter number from 1 to 4", required: true)
source_variant(Schema.ref(:SourceVariant), "Source Variant name", required: true)
module_help_text(:string, "Module help text", required: true)
@@ -330,6 +331,7 @@ defmodule CadetWeb.UserController do
enable_game: true,
enable_achievements: true,
enable_sourcecast: true,
enable_stories: false,
source_chapter: 1,
source_variant: "default",
module_help_text: "Help text",
1 change: 1 addition & 0 deletions lib/cadet_web/views/courses_view.ex
Original file line number Diff line number Diff line change
@@ -11,6 +11,7 @@ defmodule CadetWeb.CoursesView do
enableGame: :enable_game,
enableAchievements: :enable_achievements,
enableSourcecast: :enable_sourcecast,
enableStories: :enable_stories,
sourceChapter: :source_chapter,
sourceVariant: :source_variant,
moduleHelpText: :module_help_text,
1 change: 1 addition & 0 deletions lib/cadet_web/views/user_view.ex
Original file line number Diff line number Diff line change
@@ -104,6 +104,7 @@ defmodule CadetWeb.UserView do
enableGame: :enable_game,
enableAchievements: :enable_achievements,
enableSourcecast: :enable_sourcecast,
enableStories: :enable_stories,
sourceChapter: :source_chapter,
sourceVariant: :source_variant,
moduleHelpText: :module_help_text,
6 changes: 3 additions & 3 deletions mix.lock
Original file line number Diff line number Diff line change
@@ -8,7 +8,7 @@
"blankable": {:hex, :blankable, "1.0.0", "89ab564a63c55af117e115144e3b3b57eb53ad43ba0f15553357eb283e0ed425", [:mix], [], "hexpm", "7cf11aac0e44f4eedbee0c15c1d37d94c090cb72a8d9fddf9f7aec30f9278899"},
"bunt": {:hex, :bunt, "0.2.1", "e2d4792f7bc0ced7583ab54922808919518d0e57ee162901a16a1b6664ef3b14", [:mix], [], "hexpm", "a330bfb4245239787b15005e66ae6845c9cd524a288f0d141c148b02603777a5"},
"bypass": {:hex, :bypass, "2.1.0", "909782781bf8e20ee86a9cabde36b259d44af8b9f38756173e8f5e2e1fabb9b1", [:mix], [{:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.0", [hex: :plug_cowboy, repo: "hexpm", optional: false]}, {:ranch, "~> 1.3", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "d9b5df8fa5b7a6efa08384e9bbecfe4ce61c77d28a4282f79e02f1ef78d96b80"},
"castore": {:hex, :castore, "1.0.4", "ff4d0fb2e6411c0479b1d965a814ea6d00e51eb2f58697446e9c41a97d940b28", [:mix], [], "hexpm", "9418c1b8144e11656f0be99943db4caf04612e3eaecefb5dae9a2a87565584f8"},
"castore": {:hex, :castore, "1.0.5", "9eeebb394cc9a0f3ae56b813459f990abb0a3dedee1be6b27fdb50301930502f", [:mix], [], "hexpm", "8d7c597c3e4a64c395980882d4bca3cebb8d74197c590dc272cfd3b6a6310578"},
"certifi": {:hex, :certifi, "2.12.0", "2d1cca2ec95f59643862af91f001478c9863c2ac9cb6e2f89780bfd8de987329", [:rebar3], [], "hexpm", "ee68d85df22e554040cdb4be100f33873ac6051387baf6a8f6ce82272340ff1c"},
"combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm", "1b1dbc1790073076580d0d1d64e42eae2366583e7aecd455d1215b0d16f2451b"},
"configparser_ex": {:hex, :configparser_ex, "4.0.0", "17e2b831cfa33a08c56effc610339b2986f0d82a9caa0ed18880a07658292ab6", [:mix], [], "hexpm", "02e6d1a559361a063cba7b75bc3eb2d6ad7e62730c551cc4703541fd11e65e5b"},
@@ -68,13 +68,13 @@
"openid_connect": {:hex, :openid_connect, "0.2.2", "c05055363330deab39ffd89e609db6b37752f255a93802006d83b45596189c0b", [:mix], [{:httpoison, "~> 1.2", [hex: :httpoison, repo: "hexpm", optional: false]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: false]}, {:jose, "~> 1.8", [hex: :jose, repo: "hexpm", optional: false]}], "hexpm", "735769b6d592124b58edd0582554ce638524c0214cd783d8903d33357d74cc13"},
"parallel_stream": {:hex, :parallel_stream, "1.1.0", "f52f73eb344bc22de335992377413138405796e0d0ad99d995d9977ac29f1ca9", [:mix], [], "hexpm", "684fd19191aedfaf387bbabbeb8ff3c752f0220c8112eb907d797f4592d6e871"},
"parse_trans": {:hex, :parse_trans, "3.4.1", "6e6aa8167cb44cc8f39441d05193be6e6f4e7c2946cb2759f015f8c56b76e5ff", [:rebar3], [], "hexpm", "620a406ce75dada827b82e453c19cf06776be266f5a67cff34e1ef2cbb60e49a"},
"phoenix": {:hex, :phoenix, "1.7.10", "02189140a61b2ce85bb633a9b6fd02dff705a5f1596869547aeb2b2b95edd729", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "cf784932e010fd736d656d7fead6a584a4498efefe5b8227e9f383bf15bb79d0"},
"phoenix": {:hex, :phoenix, "1.7.11", "1d88fc6b05ab0c735b250932c4e6e33bfa1c186f76dcf623d8dd52f07d6379c7", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "b1ec57f2e40316b306708fe59b92a16b9f6f4bf50ccfa41aa8c7feb79e0ec02a"},
"phoenix_ecto": {:hex, :phoenix_ecto, "4.4.3", "86e9878f833829c3f66da03d75254c155d91d72a201eb56ae83482328dc7ca93", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "d36c401206f3011fefd63d04e8ef626ec8791975d9d107f9a0817d426f61ac07"},
"phoenix_html": {:hex, :phoenix_html, "3.3.3", "380b8fb45912b5638d2f1d925a3771b4516b9a78587249cabe394e0a5d579dc9", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "923ebe6fec6e2e3b3e569dfbdc6560de932cd54b000ada0208b5f45024bdd76c"},
"phoenix_live_view": {:hex, :phoenix_live_view, "0.19.3", "3918c1b34df8ac71a9a636806ba5b7f053349a0392b312e16f35b0bf4d070aab", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "545626887948495fd8ea23d83b75bd7aaf9dc4221563e158d2c4b52ea1dd7e00"},
"phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.3", "3168d78ba41835aecad272d5e8cd51aa87a7ac9eb836eabc42f6e57538e3731d", [:mix], [], "hexpm", "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"},
"phoenix_swagger": {:hex, :phoenix_swagger, "0.8.3", "298d6204802409d3b0b4fc1013873839478707cf3a62532a9e10fec0e26d0e37", [:mix], [{:ex_json_schema, "~> 0.7.1", [hex: :ex_json_schema, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:plug, "~> 1.11", [hex: :plug, repo: "hexpm", optional: false]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}], "hexpm", "3bc0fa9f5b679b8a61b90a52b2c67dd932320e9a84a6f91a4af872a0ab367337"},
"phoenix_template": {:hex, :phoenix_template, "1.0.3", "32de561eefcefa951aead30a1f94f1b5f0379bc9e340bb5c667f65f1edfa4326", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "16f4b6588a4152f3cc057b9d0c0ba7e82ee23afa65543da535313ad8d25d8e2c"},
"phoenix_template": {:hex, :phoenix_template, "1.0.4", "e2092c132f3b5e5b2d49c96695342eb36d0ed514c5b252a77048d5969330d639", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "2c0c81f0e5c6753faf5cca2f229c9709919aba34fab866d3bc05060c9c444206"},
"phoenix_view": {:hex, :phoenix_view, "2.0.3", "4d32c4817fce933693741deeb99ef1392619f942633dde834a5163124813aad3", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}], "hexpm", "cd34049af41be2c627df99cd4eaa71fc52a328c0c3d8e7d4aa28f880c30e7f64"},
"plug": {:hex, :plug, "1.15.3", "712976f504418f6dff0a3e554c40d705a9bcf89a7ccef92fc6a5ef8f16a30a97", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "cc4365a3c010a56af402e0809208873d113e9c38c401cabd88027ef4f5c01fd2"},
"plug_cowboy": {:hex, :plug_cowboy, "2.7.0", "3ae9369c60641084363b08fe90267cbdd316df57e3557ea522114b30b63256ea", [:mix], [{:cowboy, "~> 2.7.0 or ~> 2.8.0 or ~> 2.9.0 or ~> 2.10.0", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "d85444fb8aa1f2fc62eabe83bbe387d81510d773886774ebdcb429b3da3c1a4a"},
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
defmodule Cadet.Repo.Migrations.AddStoriesToggleToCourseConfig do
use Ecto.Migration

def up do
alter table(:courses) do
add(:enable_stories, :boolean, null: false, default: false)
end
end

def down do
alter table(:courses) do
remove(:enable_stories)
end
end
end
13 changes: 13 additions & 0 deletions test/cadet/courses/course_test.exs
Original file line number Diff line number Diff line change
@@ -96,6 +96,19 @@ defmodule Cadet.Courses.CourseTest do
:valid
)

assert_changeset(
%{
enable_game: true,
enable_achievements: true,
enable_sourcecast: true,
enable_stories: false,
course_name: "Data Structures and Algorithms",
source_chapter: 1,
source_variant: "default"
},
:valid
)

assert_changeset(
%{
source_chapter: 1,
7 changes: 7 additions & 0 deletions test/cadet/courses/courses_test.exs
Original file line number Diff line number Diff line change
@@ -20,6 +20,7 @@ defmodule Cadet.CoursesTest do
enable_game: true,
enable_achievements: true,
enable_sourcecast: true,
enable_stories: false,
source_chapter: 1,
source_variant: "default",
module_help_text: "Help Text"
@@ -55,6 +56,7 @@ defmodule Cadet.CoursesTest do
assert course.enable_game == true
assert course.enable_achievements == true
assert course.enable_sourcecast == true
assert course.enable_stories == false
assert course.source_chapter == 1
assert course.source_variant == "default"
assert course.module_help_text == "Help Text"
@@ -81,6 +83,7 @@ defmodule Cadet.CoursesTest do
enable_game: false,
enable_achievements: false,
enable_sourcecast: false,
enable_stories: true,
module_help_text: ""
})

@@ -90,6 +93,7 @@ defmodule Cadet.CoursesTest do
assert updated_course.enable_game == false
assert updated_course.enable_achievements == false
assert updated_course.enable_sourcecast == false
assert updated_course.enable_stories == true
assert updated_course.source_chapter == 1
assert updated_course.source_variant == "default"
assert updated_course.module_help_text == nil
@@ -107,6 +111,7 @@ defmodule Cadet.CoursesTest do
enable_game: false,
enable_achievements: false,
enable_sourcecast: false,
enable_stories: true,
source_chapter: new_chapter,
source_variant: "default",
module_help_text: "help"
@@ -118,6 +123,7 @@ defmodule Cadet.CoursesTest do
assert updated_course.enable_game == false
assert updated_course.enable_achievements == false
assert updated_course.enable_sourcecast == false
assert updated_course.enable_stories == true
assert updated_course.source_chapter == new_chapter
assert updated_course.source_variant == "default"
assert updated_course.module_help_text == "help"
@@ -135,6 +141,7 @@ defmodule Cadet.CoursesTest do
enable_game: false,
enable_achievements: false,
enable_sourcecast: false,
enable_stories: false,
module_help_text: "help"
})

Original file line number Diff line number Diff line change
@@ -43,6 +43,7 @@ defmodule CadetWeb.AdminCoursesControllerTest do
"enableGame" => false,
"enableAchievements" => false,
"enableSourcecast" => true,
"enableStories" => false,
"sourceChapter" => 1,
"sourceVariant" => "default",
"moduleHelpText" => "help"
@@ -65,6 +66,7 @@ defmodule CadetWeb.AdminCoursesControllerTest do
"courseName" => "Data Structures and Algorithms",
"courseShortName" => "CS2040S",
"enableGame" => false,
"enableStories" => false,
"enableAchievements" => false,
"enableSourcecast" => true,
"moduleHelpText" => "help"
@@ -132,6 +134,7 @@ defmodule CadetWeb.AdminCoursesControllerTest do
"enableGame" => false,
"enableAchievements" => false,
"enableSourcecast" => true,
"enableStories" => false,
"moduleHelpText" => "help",
"sourceVariant" => "default"
})
6 changes: 6 additions & 0 deletions test/cadet_web/controllers/courses_controller_test.exs
Original file line number Diff line number Diff line change
@@ -27,6 +27,7 @@ defmodule CadetWeb.CoursesControllerTest do
"enable_game" => "true",
"enable_achievements" => "true",
"enable_sourcecast" => "true",
"enable_stories" => "true",
"source_chapter" => "1",
"source_variant" => "default",
"module_help_text" => "Help Text"
@@ -49,6 +50,7 @@ defmodule CadetWeb.CoursesControllerTest do
"viewable" => "true",
"enable_achievements" => "true",
"enable_sourcecast" => "true",
"enable_stories" => "true",
"source_variant" => "default",
"module_help_text" => "Help Text"
}
@@ -70,6 +72,7 @@ defmodule CadetWeb.CoursesControllerTest do
"enable_game" => "true",
"enable_achievements" => "true",
"enable_sourcecast" => "true",
"enable_stories" => "true",
"source_chapter" => "1",
"source_variant" => "default",
"module_help_text" => "Help Text"
@@ -92,6 +95,7 @@ defmodule CadetWeb.CoursesControllerTest do
"enable_game" => "true",
"enable_achievements" => "true",
"enable_sourcecast" => "true",
"enable_stories" => "true",
"source_chapter" => "1",
"source_variant" => "default",
"module_help_text" => "Help Text"
@@ -115,6 +119,7 @@ defmodule CadetWeb.CoursesControllerTest do
"enable_game" => "true",
"enable_achievements" => "true",
"enable_sourcecast" => "true",
"enable_stories" => "true",
"source_chapter" => "1",
"source_variant" => "default",
"module_help_text" => "Help Text"
@@ -155,6 +160,7 @@ defmodule CadetWeb.CoursesControllerTest do
"enableGame" => true,
"enableAchievements" => true,
"enableSourcecast" => true,
"enableStories" => false,
"sourceChapter" => 1,
"sourceVariant" => "default",
"moduleHelpText" => "Help Text",
2 changes: 2 additions & 0 deletions test/cadet_web/controllers/user_controller_test.exs
Original file line number Diff line number Diff line change
@@ -106,6 +106,7 @@ defmodule CadetWeb.UserControllerTest do
"enableAchievements" => true,
"enableGame" => true,
"enableSourcecast" => true,
"enableStories" => false,
"courseShortName" => "CS1101S",
"moduleHelpText" => "Help Text",
"courseName" => "Programming Methodology",
@@ -306,6 +307,7 @@ defmodule CadetWeb.UserControllerTest do
"enableGame" => true,
"enableSourcecast" => true,
"courseShortName" => "CS1101S",
"enableStories" => false,
"moduleHelpText" => "Help Text",
"courseName" => "Programming Methodology",
"sourceChapter" => 1,
Loading