scorm_engine 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/Rakefile +13 -0
  4. data/lib/scorm_engine.rb +13 -0
  5. data/lib/scorm_engine/api/endpoints.rb +50 -0
  6. data/lib/scorm_engine/api/endpoints/about.rb +59 -0
  7. data/lib/scorm_engine/api/endpoints/courses.rb +136 -0
  8. data/lib/scorm_engine/api/endpoints/courses/configuration.rb +146 -0
  9. data/lib/scorm_engine/api/endpoints/courses/import.rb +83 -0
  10. data/lib/scorm_engine/api/endpoints/ping.rb +20 -0
  11. data/lib/scorm_engine/api/endpoints/registrations.rb +321 -0
  12. data/lib/scorm_engine/api/endpoints/registrations/configuration.rb +146 -0
  13. data/lib/scorm_engine/api/endpoints/registrations/launch_history.rb +47 -0
  14. data/lib/scorm_engine/client.rb +17 -0
  15. data/lib/scorm_engine/configuration.rb +43 -0
  16. data/lib/scorm_engine/faraday/connection.rb +35 -0
  17. data/lib/scorm_engine/faraday/request.rb +54 -0
  18. data/lib/scorm_engine/models.rb +9 -0
  19. data/lib/scorm_engine/models/course.rb +66 -0
  20. data/lib/scorm_engine/models/course_configuration.rb +37 -0
  21. data/lib/scorm_engine/models/course_import.rb +42 -0
  22. data/lib/scorm_engine/models/learner.rb +24 -0
  23. data/lib/scorm_engine/models/registration.rb +82 -0
  24. data/lib/scorm_engine/models/registration_activity_detail.rb +37 -0
  25. data/lib/scorm_engine/models/registration_configuration.rb +37 -0
  26. data/lib/scorm_engine/models/registration_launch_history.rb +92 -0
  27. data/lib/scorm_engine/models/registration_runtime_interaction.rb +52 -0
  28. data/lib/scorm_engine/response.rb +26 -0
  29. data/lib/scorm_engine/utils.rb +13 -0
  30. data/lib/scorm_engine/version.rb +3 -0
  31. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_About/_get_about/is_successful.yml +38 -0
  32. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_About/_get_about/knows_the_platform.yml +38 -0
  33. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_About/_get_about/knows_the_version.yml +38 -0
  34. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_About/_get_about_user_count/accepts_before_option.yml +38 -0
  35. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_About/_get_about_user_count/accepts_since_option.yml +38 -0
  36. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_About/_get_about_user_count/is_successful.yml +38 -0
  37. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_About/_get_about_user_count/tracks_combined_counts.yml +38 -0
  38. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_About/_get_about_user_count/tracks_per_tenantcounts.yml +38 -0
  39. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses/_delete_course/fails_when_id_is_invalid.yml +38 -0
  40. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses/_delete_course/works.yml +32 -0
  41. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses/_get_course_detail/is_successful.yml +41 -0
  42. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses/_get_course_detail/results/sucessfully_creates_the_Course_attributes.yml +41 -0
  43. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses/_get_course_preview/fails_when_id_is_invalid.yml +38 -0
  44. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses/_get_course_preview/is_successful.yml +38 -0
  45. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses/_get_course_preview/results/returns_a_URL_string.yml +38 -0
  46. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses/_get_courses/_course_id_option/fetches_a_single_course_but_perhaps_multiple_versions.yml +39 -0
  47. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses/_get_courses/_course_id_option/returns_404_when_ID_is_invalid.yml +38 -0
  48. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses/_get_courses/_more_option_pagination_/returns_all_the_courses.yml +89 -0
  49. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses/_get_courses/_more_option_pagination_/returns_the_more_key_in_the_raw_response.yml +48 -0
  50. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses/_get_courses/_since_option/fails_when_passed_an_invalid_value.yml +37 -0
  51. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses/_get_courses/_since_option/works.yml +43 -0
  52. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses/_get_courses/is_successful.yml +43 -0
  53. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses/_get_courses/results/is_an_enumerator_of_Course_models.yml +43 -0
  54. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses/_get_courses/results/sucessfully_creates_the_Course_attributes.yml +43 -0
  55. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Configuration/_get_course_configuration/fails_when_id_is_invalid.yml +38 -0
  56. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Configuration/_get_course_configuration/is_successful.yml +38 -0
  57. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Configuration/_get_course_configuration/results/makes_settings_available_as_key/value_pairs.yml +38 -0
  58. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Configuration/_get_course_configuration_setting/fails_when_course_id_is_invalid.yml +38 -0
  59. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Configuration/_get_course_configuration_setting/fails_when_setting_id_is_invalid.yml +36 -0
  60. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Configuration/_get_course_configuration_setting/is_successful.yml +65 -0
  61. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Configuration/_get_course_configuration_setting/results/returns_the_value_as_a_string.yml +65 -0
  62. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Configuration/_post_course_configuration/fails_when_id_is_invalid.yml +38 -0
  63. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Configuration/_post_course_configuration/fails_when_settings_are_invalid.yml +36 -0
  64. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Configuration/_post_course_configuration/is_successful.yml +32 -0
  65. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Configuration/_post_course_configuration/persists_the_settings.yml +131 -0
  66. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Configuration/_put_course_configuration_setting/fails_when_course_id_is_invalid.yml +38 -0
  67. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Configuration/_put_course_configuration_setting/fails_when_setting_id_is_invalid.yml +36 -0
  68. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Configuration/_put_course_configuration_setting/is_successful.yml +65 -0
  69. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Configuration/_put_course_configuration_setting/results/persists_the_changes.yml +98 -0
  70. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Import/_get_course_import/successful_imports/works.yml +147 -0
  71. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Import/_get_course_import/unsuccessful_imports/fails_to_import_given_an_invalid_url.yml +326 -0
  72. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Import/_post_course_import/successful_imports/works.yml +38 -0
  73. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Courses_Import/_post_course_import/unsuccessful_imports/fails_to_import_a_previously_existing_course.yml +36 -0
  74. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Ping/_get_ping/is_successful.yml +38 -0
  75. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Ping/_get_ping/reports_the_api_is_up.yml +38 -0
  76. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Ping/_get_ping/with_invalid_password/is_unsuccessful.yml +41 -0
  77. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Ping/_get_ping/with_invalid_password/returns_status_403.yml +41 -0
  78. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_delete_registration/is_failure_when_registration_does_not_exist.yml +38 -0
  79. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_delete_registration/is_successful_when_registration_exists.yml +32 -0
  80. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registration_exists/is_false_when_registration_does_not_exist.yml +38 -0
  81. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registration_exists/is_true_when_registration_exists.yml +36 -0
  82. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registration_instances/includes_results_we_expect.yml +39 -0
  83. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registration_instances/is_successful.yml +39 -0
  84. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registration_instances/returns_an_array_of_registrations.yml +39 -0
  85. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registration_launch_link/fails_when_id_is_invalid.yml +38 -0
  86. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registration_launch_link/is_successful.yml +38 -0
  87. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registration_launch_link/results/returns_a_URL_string.yml +38 -0
  88. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registration_progress/detail/does_not_return_activity_details_by_default.yml +39 -0
  89. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registration_progress/detail/returns_activity_details_if_requested.yml +41 -0
  90. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registration_progress/fails_when_registration_does_not_exist.yml +38 -0
  91. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registration_progress/returns_a_registration_when_it_exists.yml +39 -0
  92. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registrations/filtering_by_course_id/excludes_results.yml +38 -0
  93. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registrations/filtering_by_course_id/includes_results.yml +40 -0
  94. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registrations/filtering_by_learner_id/excludes_results.yml +38 -0
  95. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registrations/filtering_by_learner_id/includes_results.yml +39 -0
  96. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registrations/includes_results_we_expect.yml +40 -0
  97. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registrations/is_successful.yml +40 -0
  98. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_get_registrations/returns_an_array_of_registrations.yml +40 -0
  99. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_post_registration/fails_if_course_id_is_invalid.yml +36 -0
  100. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_post_registration/fails_if_registration_id_already_exists.yml +36 -0
  101. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations/_post_registration/is_successful.yml +61 -0
  102. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_Configuration/_get_registration_configuration/fails_when_id_is_invalid.yml +38 -0
  103. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_Configuration/_get_registration_configuration/is_successful.yml +38 -0
  104. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_Configuration/_get_registration_configuration/results/makes_settings_available_as_key/value_pairs.yml +38 -0
  105. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_Configuration/_get_registration_configuration_setting/fails_when_registration_id_is_invalid.yml +38 -0
  106. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_Configuration/_get_registration_configuration_setting/fails_when_setting_id_is_invalid.yml +36 -0
  107. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_Configuration/_get_registration_configuration_setting/is_successful.yml +65 -0
  108. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_Configuration/_get_registration_configuration_setting/results/returns_the_value_as_a_string.yml +65 -0
  109. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_Configuration/_post_registration_configuration/fails_when_id_is_invalid.yml +38 -0
  110. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_Configuration/_post_registration_configuration/fails_when_settings_are_invalid.yml +36 -0
  111. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_Configuration/_post_registration_configuration/is_successful.yml +32 -0
  112. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_Configuration/_post_registration_configuration/persists_the_settings.yml +131 -0
  113. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_Configuration/_put_registration_configuration_setting/fails_when_registration_id_is_invalid.yml +38 -0
  114. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_Configuration/_put_registration_configuration_setting/fails_when_setting_id_is_invalid.yml +36 -0
  115. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_Configuration/_put_registration_configuration_setting/is_successful.yml +65 -0
  116. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_Configuration/_put_registration_configuration_setting/results/persists_the_changes.yml +98 -0
  117. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_LaunchHistory/_get_registration_launch_history/fails_when_registration_does_not_exist.yml +38 -0
  118. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_LaunchHistory/_get_registration_launch_history/is_successful.yml +54 -0
  119. data/spec/fixtures/vcr/ScormEngine_Api_Endpoints_Registrations_LaunchHistory/_get_registration_launch_history/returns_an_array_of_registration_launch_histories.yml +54 -0
  120. data/spec/fixtures/zip/Non-working SCORM.zip +0 -0
  121. data/spec/fixtures/zip/RuntimeBasicCalls_SCORM20043rdEdition.zip +0 -0
  122. data/spec/scorm_engine/api/endpoints/about_spec.rb +59 -0
  123. data/spec/scorm_engine/api/endpoints/courses/configuration_spec.rb +143 -0
  124. data/spec/scorm_engine/api/endpoints/courses/import_spec.rb +92 -0
  125. data/spec/scorm_engine/api/endpoints/courses_spec.rb +155 -0
  126. data/spec/scorm_engine/api/endpoints/ping_spec.rb +27 -0
  127. data/spec/scorm_engine/api/endpoints/registrations/configuration_spec.rb +154 -0
  128. data/spec/scorm_engine/api/endpoints/registrations/launch_history_spec.rb +46 -0
  129. data/spec/scorm_engine/api/endpoints/registrations_spec.rb +201 -0
  130. data/spec/scorm_engine/configuration_spec.rb +29 -0
  131. data/spec/scorm_engine/models/course_configuration_spec.rb +16 -0
  132. data/spec/scorm_engine/models/course_import_spec.rb +86 -0
  133. data/spec/scorm_engine/models/course_spec.rb +92 -0
  134. data/spec/scorm_engine/models/learner_spec.rb +27 -0
  135. data/spec/scorm_engine/models/registration_activity_detail_spec.rb +101 -0
  136. data/spec/scorm_engine/models/registration_launch_history_spec.rb +86 -0
  137. data/spec/scorm_engine/models/registration_runtime_interaction_spec.rb +91 -0
  138. data/spec/scorm_engine/models/registration_spec.rb +82 -0
  139. data/spec/scorm_engine/utils_spec.rb +15 -0
  140. data/spec/scorm_engine/version_spec.rb +5 -0
  141. data/spec/scorm_engine_spec.rb +2 -0
  142. data/spec/spec_helper.rb +47 -0
  143. data/spec/support/scorm_engine.rb +72 -0
  144. data/spec/support/scorm_engine_client.rb +6 -0
  145. data/spec/support/scorm_engine_configuration.rb +7 -0
  146. data/spec/support/vcr.rb +53 -0
  147. metadata +329 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 4eb559da6c58e1d094b117f7309f63a57fd0ce8420f20f1b29e70db9ced197d5
4
+ data.tar.gz: a257cbd1dc47e8b30ff8aa23e4b6ec7179dafa476e137ef65ef14652aa62668d
5
+ SHA512:
6
+ metadata.gz: '0991ec18af0234a57b7d331a270b7149cc02e1d921f1c507d437138c38bb637d044789fb56c8a2e10ab5489585f90a24d34ce5a10a0d4a1cf0b59699aa705640'
7
+ data.tar.gz: c0312e3e6251c0de3cd92d620211e6a2d47098d7b30aaba3608e190ab347d5d3ffc6ff81d35bee5c25ec2d0c630585d7dfa731ada8d94c9d2cb1f20a90189caa
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
@@ -0,0 +1,13 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+ require "yard"
4
+
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ task default: :spec
8
+
9
+ YARD::Rake::YardocTask.new do |t|
10
+ t.files = ["lib/**/*.rb"]
11
+ t.options = []
12
+ t.stats_options = ["--list-undoc"]
13
+ end
@@ -0,0 +1,13 @@
1
+ require "ostruct"
2
+ require "json"
3
+
4
+ require "scorm_engine/version"
5
+ require "scorm_engine/utils"
6
+ require "scorm_engine/configuration"
7
+ require "scorm_engine/models"
8
+ require "scorm_engine/api/endpoints"
9
+ require "scorm_engine/client"
10
+ require "scorm_engine/response"
11
+
12
+ module ScormEngine
13
+ end
@@ -0,0 +1,50 @@
1
+ require_relative "endpoints/about"
2
+ require_relative "endpoints/courses"
3
+ require_relative "endpoints/courses/configuration"
4
+ require_relative "endpoints/courses/import"
5
+ require_relative "endpoints/ping"
6
+ require_relative "endpoints/registrations"
7
+ require_relative "endpoints/registrations/configuration"
8
+ require_relative "endpoints/registrations/launch_history"
9
+
10
+ module ScormEngine
11
+ module Api
12
+ module Endpoints
13
+ include About
14
+ include Courses
15
+ include Courses::Configuration
16
+ include Courses::Import
17
+ include Ping
18
+ include Registrations
19
+ include Registrations::Configuration
20
+ include Registrations::LaunchHistory
21
+
22
+ private
23
+
24
+ #
25
+ # Ensure that all of the keys are present in the hash passed and raise an error if not.
26
+ #
27
+ # @example
28
+ # require_options({foo: 1, bar: {"baz" => 2}}, :foo, [:bar, :baz], :moo)
29
+ # # will raise an errror due to lack of :moo
30
+ #
31
+ # @param [Hash] haystack
32
+ # The option hash in which to search for the given, optionally nested, key[s].
33
+ #
34
+ # @param [Array] sets_of_needles
35
+ # A splat of keys or array of nested keys to search for.
36
+ #
37
+ # @raise [ArgumentError] if any needle isn't found.
38
+ #
39
+ def require_options(haystack = {}, *sets_of_needles)
40
+ sets_of_needles.each { |needles| require_option(haystack, *needles) }
41
+ end
42
+
43
+ def require_option(haystack, *needles)
44
+ value = needles.reduce(haystack) { |m, o| m[o.to_sym] || m[o.to_s] }
45
+ return unless value.nil? # || (value.respond_to?(:empty?) && value.empty?)
46
+ raise ArgumentError, "Required option #{needles.join("/")} missing"
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,59 @@
1
+ module ScormEngine
2
+ module Api
3
+ module Endpoints
4
+ module About
5
+ #
6
+ # Get back the version and platform of the running instance of Engine
7
+ #
8
+ # @see http://rustici-docs.s3.amazonaws.com/engine/2017.1.x/api.html#tenant__about_get
9
+ #
10
+ # @return [ScormEngine::Response]
11
+ #
12
+ def get_about
13
+ response = get("about")
14
+
15
+ result = OpenStruct.new(response.body)
16
+
17
+ Response.new(raw_response: response, result: result)
18
+ end
19
+
20
+ #
21
+ # Gets the number of users across all tenants.
22
+ #
23
+ # @see http://rustici-docs.s3.amazonaws.com/engine/2017.1.x/api.html#tenant__about_userCount_get
24
+ #
25
+ # @param [Hash] options
26
+ #
27
+ # @option options [DateTime] :before
28
+ # Only userCount updated before the specified time (inclusive) are included.
29
+ # If a time zone is not specified, the server's time zone will be used.
30
+ #
31
+ # @option options [DateTime] :since
32
+ # Only userCount updated since the specified time (inclusive) are included.
33
+ # If a time zone is not specified, the server's time zone will be used.
34
+ #
35
+ # @return [ScormEngine::Response]
36
+ #
37
+ def get_about_user_count(options = {})
38
+ response = get("about/userCount", options)
39
+
40
+ result = OpenStruct.new
41
+ result.total = response.body["combinedTenants"]["total"]
42
+ result.dispatched = response.body["combinedTenants"]["dispatched"]
43
+ result.non_dispatched = response.body["combinedTenants"]["nonDispatched"]
44
+ result.by_tenant = {}
45
+
46
+ response.body["byTenant"].each do |tenant|
47
+ result.by_tenant[tenant["tenantName"]] = OpenStruct.new(
48
+ total: tenant["total"],
49
+ dispatched: tenant["dispatched"],
50
+ non_dispatched: tenant["nonDispatched"]
51
+ )
52
+ end
53
+
54
+ Response.new(raw_response: response, result: result)
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,136 @@
1
+ module ScormEngine
2
+ module Api
3
+ module Endpoints
4
+ module Courses
5
+
6
+ #
7
+ # Get the list of courses
8
+ #
9
+ # @see http://rustici-docs.s3.amazonaws.com/engine/2017.1.x/api.html#tenant__courses_get
10
+ # @see http://rustici-docs.s3.amazonaws.com/engine/2017.1.x/api.html#tenant__courses__courseId__get
11
+ #
12
+ # @param [Hash] options
13
+ #
14
+ # @option options [String] :course_id
15
+ # The ID of the single course to retrieve. If set no other options
16
+ # are respected. Note that multiple results may be returned if the
17
+ # course has multiple versions.
18
+ #
19
+ # @option options [DateTime] :since
20
+ # Only courses updated since the specified ISO 8601 TimeStamp
21
+ # (inclusive) are included. If a time zone is not specified, the
22
+ # server's time zone will be used.
23
+ #
24
+ # @return [Enumerator<ScormEngine::Models::Course>]
25
+ #
26
+ def get_courses(options = {})
27
+ options = options.dup
28
+
29
+ path = "courses"
30
+ path = "courses/#{options.delete(:course_id)}" if options[:course_id]
31
+
32
+ response = get(path, options)
33
+
34
+ result = Enumerator.new do |enum|
35
+ loop do
36
+ response.success? && response.body["courses"].each do |course|
37
+ enum << ScormEngine::Models::Course.new_from_api(course)
38
+ end
39
+ break if !response.success? || response.body["more"].nil?
40
+ response = get(response.body["more"])
41
+ end
42
+ end
43
+
44
+ Response.new(raw_response: response, result: result)
45
+ end
46
+
47
+ #
48
+ # Delete a course
49
+ #
50
+ # @see http://rustici-docs.s3.amazonaws.com/engine/2017.1.x/api.html#tenant__courses__courseId__delete
51
+ #
52
+ # @param [Hash] options
53
+ #
54
+ # @option options [String] :course_id
55
+ # The ID of the course to delete.
56
+ #
57
+ # @return [ScormEngine::Response]
58
+ #
59
+ def delete_course(options = {})
60
+ require_options(options, :course_id)
61
+
62
+ response = delete("courses/#{options[:course_id]}")
63
+
64
+ Response.new(raw_response: response)
65
+ end
66
+
67
+ #
68
+ # Get the details of a course
69
+ #
70
+ # @see http://rustici-docs.s3.amazonaws.com/engine/2017.1.x/api.html#tenant__courses__courseId__detail_get
71
+ #
72
+ # @param [Hash] options
73
+ #
74
+ # @option options [String] :course_id
75
+ # The ID of the course to get.
76
+ #
77
+ # @option options [Integer] :version (nil)
78
+ # The version of this course to use. If not provided, the latest
79
+ # version will be used.
80
+ #
81
+ # @return [ScormEngine::Models::Course]
82
+ #
83
+ def get_course_detail(options = {})
84
+ require_options(options, :course_id)
85
+
86
+ options = options.dup
87
+ course_id = options.delete(:course_id)
88
+
89
+ response = get("courses/#{course_id}/detail", options)
90
+
91
+ result = response.success? && ScormEngine::Models::Course.new_from_api(response.body)
92
+
93
+ Response.new(raw_response: response, result: result)
94
+ end
95
+
96
+ #
97
+ # Returns the launch link to use to preview this course
98
+ #
99
+ # @see http://rustici-docs.s3.amazonaws.com/engine/2017.1.x/api.html#tenant__courses__courseId__preview_get
100
+ #
101
+ # @param [Hash] options
102
+ #
103
+ # @option options [String] :course_id
104
+ # The ID of the course to get.
105
+ #
106
+ # @option options [Integer] :version (nil)
107
+ # The version of this course to use. If not provided, the latest
108
+ # version will be used.
109
+ #
110
+ # @option options [Integer] :expiry (0)
111
+ # Number of seconds from now this link will expire in. Use 0 for no
112
+ # expiration.
113
+ #
114
+ # @option options [String] :redirect_on_exit_url
115
+ # The URL the application should redirect to when the learner exits a
116
+ # course. If not specified, configured value will be used.
117
+ #
118
+ # @return [String]
119
+ #
120
+ def get_course_preview(options = {})
121
+ require_options(options, :course_id)
122
+
123
+ options = options.dup
124
+ course_id = options.delete(:course_id)
125
+ options[:redirectOnExitUrl] = options.delete(:redirect_on_exit_url) if options.key?(:redirect_on_exit_url)
126
+
127
+ response = get("courses/#{course_id}/preview", options)
128
+
129
+ result = response.success? && response.body["launchLink"]
130
+
131
+ Response.new(raw_response: response, result: result)
132
+ end
133
+ end
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,146 @@
1
+ #
2
+ # TODO: Consider consolidating this and Registrations::Configuration, but only
3
+ # after we're sure they are really 99.9% the same in terms of functionality.
4
+ #
5
+ module ScormEngine
6
+ module Api
7
+ module Endpoints
8
+ module Courses
9
+ module Configuration
10
+
11
+ #
12
+ # Returns the effective value of every setting at this level, as well
13
+ # as the effective value of any setting at a more specific level.
14
+ #
15
+ # @see http://rustici-docs.s3.amazonaws.com/engine/2017.1.x/api.html#tenant__courses__courseId__configuration_get
16
+ #
17
+ # @param [Hash] options
18
+ #
19
+ # @option options [String] :course_id
20
+ # The ID of the course to get.
21
+ #
22
+ # @option options [Integer] :version (nil)
23
+ # The version of this course to use. If not provided, the latest
24
+ # version will be used.
25
+ #
26
+ # @return [ScormEngine::Models::CourseConfiguration]
27
+ #
28
+ def get_course_configuration(options = {})
29
+ require_options(options, :course_id)
30
+
31
+ options = options.dup
32
+ course_id = options.delete(:course_id)
33
+
34
+ response = get("courses/#{course_id}/configuration", options)
35
+
36
+ result = response.success? && ScormEngine::Models::CourseConfiguration.new_from_api(response.body)
37
+
38
+ Response.new(raw_response: response, result: result)
39
+ end
40
+
41
+ #
42
+ # Bulk set configuration settings via POST request.
43
+ #
44
+ # @see http://rustici-docs.s3.amazonaws.com/engine/2017.1.x/api.html#tenant__courses__courseId__configuration_post
45
+ #
46
+ # @param [Hash] options
47
+ #
48
+ # @option options [String] :course_id
49
+ # The ID of the course to set.
50
+ #
51
+ # @option options [Integer] :version (nil)
52
+ # The version of this course to use. If not provided, the latest
53
+ # version will be used.
54
+ #
55
+ # @option options [Hash] :settings
56
+ # Key/value pairs of configuration options to set.
57
+ #
58
+ # @return [ScormEngine::Response]
59
+ #
60
+ def post_course_configuration(options = {})
61
+ require_options(options, :course_id, :settings)
62
+
63
+ options = options.dup
64
+ course_id = options.delete(:course_id)
65
+ settings = options.delete(:settings)
66
+
67
+ body = { settings: settings.map { |k, v| { "settingId" => k, "value" => v.to_s } } }
68
+
69
+ response = post("courses/#{course_id}/configuration", options, body)
70
+
71
+ Response.new(raw_response: response)
72
+ end
73
+
74
+ #
75
+ # Returns the effective value for this configuration setting for the resource being configured.
76
+ #
77
+ # @see http://rustici-docs.s3.amazonaws.com/engine/2017.1.x/api.html#tenant__courses__courseId__configuration__settingId__get
78
+ #
79
+ # @param [Hash] options
80
+ #
81
+ # @option options [String] :course_id
82
+ # The ID of the course to get.
83
+ #
84
+ # @option options [String] :setting_id
85
+ # The ID of the setting to get.
86
+ #
87
+ # @option options [Integer] :version (nil)
88
+ # The version of this course to use. If not provided, the latest
89
+ # version will be used.
90
+ #
91
+ # @return [String]
92
+ #
93
+ def get_course_configuration_setting(options = {})
94
+ require_options(options, :course_id, :setting_id)
95
+
96
+ options = options.dup
97
+ course_id = options.delete(:course_id)
98
+ setting_id = options.delete(:setting_id)
99
+
100
+ response = get("courses/#{course_id}/configuration/#{setting_id}", options)
101
+
102
+ result = response.success? && response.body["value"]
103
+
104
+ Response.new(raw_response: response, result: result)
105
+ end
106
+
107
+ #
108
+ # Sets the value for this configuration setting, for the resource being configured.
109
+ #
110
+ # @see http://rustici-docs.s3.amazonaws.com/engine/2017.1.x/api.html#tenant__courses__courseId__configuration__settingId__put
111
+ #
112
+ # @param [Hash] options
113
+ #
114
+ # @option options [String] :course_id
115
+ # The ID of the course to set.
116
+ #
117
+ # @option options [String] :setting_id
118
+ # The ID of the setting to set.
119
+ #
120
+ # @option options [String] :value ("")
121
+ # The value of the setting to set.
122
+ #
123
+ # @option options [Integer] :version (nil)
124
+ # The version of this course to use. If not provided, the latest
125
+ # version will be used.
126
+ #
127
+ # @return [ScormEngine::Response]
128
+ #
129
+ def put_course_configuration_setting(options = {})
130
+ require_options(options, :course_id, :setting_id)
131
+
132
+ options = options.dup
133
+ course_id = options.delete(:course_id)
134
+ setting_id = options.delete(:setting_id)
135
+
136
+ body = { value: options.delete(:value).to_s }
137
+
138
+ response = put("courses/#{course_id}/configuration/#{setting_id}", options, body)
139
+
140
+ Response.new(raw_response: response)
141
+ end
142
+ end
143
+ end
144
+ end
145
+ end
146
+ end
@@ -0,0 +1,83 @@
1
+ module ScormEngine
2
+ module Api
3
+ module Endpoints
4
+ module Courses
5
+ module Import
6
+
7
+ #
8
+ # Import a course
9
+ #
10
+ # Either the actual contents of the zip file to import may be posted,
11
+ # or JSON that references the remote location to import from.
12
+ #
13
+ # @see http://rustici-docs.s3.amazonaws.com/engine/2017.1.x/api.html#tenant__courses_importJobs_post
14
+ #
15
+ # @param [Hash] options
16
+ #
17
+ # @option options [String] :url
18
+ # URL path to the .zip package representing the course or the manifest file defining the course.
19
+ #
20
+ # @option options [String] :course_id
21
+ # A unique identifier your application will use to identify the
22
+ # course after import. Your application is responsible both for
23
+ # generating this unique ID and for keeping track of the ID for later
24
+ # use.
25
+ #
26
+ # @option options [Boolean] :may_create_new_version (false)
27
+ # Is it OK to create a new version of this course? If this is set to
28
+ # false and the course already exists, the upload will fail. If true
29
+ # and the course already exists then a new version will be created.
30
+ # No effect if the course doesn't already exist.
31
+ #
32
+ # @option options [String] :name (value of :course)
33
+ # A unique identifier that may be used as part of the directory name on disk.
34
+ #
35
+ # @return [ScormEngine::Models::CourseImport]
36
+ #
37
+ def post_course_import(options = {})
38
+ require_options(options, :course_id, :url)
39
+
40
+ query_params = {
41
+ course: options[:course_id],
42
+ mayCreateNewVersion: !!options[:may_create_new_version]
43
+ }
44
+
45
+ body = {
46
+ url: options[:url],
47
+ courseName: options[:name] || options[:course_id]
48
+ }
49
+
50
+ response = post("courses/importJobs", query_params, body)
51
+
52
+ result = response&.success? && ScormEngine::Models::CourseImport.new_from_api(response.body)
53
+
54
+ Response.new(raw_response: response, result: result)
55
+ end
56
+
57
+ #
58
+ # This method will check the status of a course import.
59
+ #
60
+ # @see http://rustici-docs.s3.amazonaws.com/engine/2017.1.x/api.html#tenant__courses_importJobs__importJobId__get
61
+ #
62
+ # @param [Hash] options
63
+ #
64
+ # @option options [String] :id
65
+ # The id of the import to check.
66
+ #
67
+ # @return [ScormEngine::Models::CourseImport]
68
+ #
69
+ def get_course_import(options = {})
70
+ require_options(options, :id)
71
+
72
+ response = get("courses/importJobs/#{options[:id]}")
73
+
74
+ # jobId is not always returned. :why:
75
+ result = response&.success? && ScormEngine::Models::CourseImport.new_from_api({ "jobId" => options[:id] }.merge(response.body))
76
+
77
+ Response.new(raw_response: response, result: result)
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end