canvas_sync 0.22.4 → 0.22.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (429) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -0
  3. data/Rakefile +0 -0
  4. data/app/controllers/canvas_sync/api/v1/health_check_controller.rb +0 -0
  5. data/app/controllers/canvas_sync/api/v1/live_events_controller.rb +0 -0
  6. data/app/models/canvas_sync/job_log.rb +5 -1
  7. data/app/models/canvas_sync/sync_batch.rb +0 -1
  8. data/config/initializers/apartment.rb +0 -0
  9. data/config/routes.rb +0 -0
  10. data/db/migrate/20170915210836_create_canvas_sync_job_log.rb +0 -0
  11. data/db/migrate/20180725155729_add_job_id_to_canvas_sync_job_logs.rb +0 -0
  12. data/db/migrate/20190916154829_add_fork_count_to_canvas_sync_job_logs.rb +0 -0
  13. data/db/migrate/20201018210836_create_canvas_sync_sync_batches.rb +0 -0
  14. data/db/migrate/20201030210836_add_full_sync_to_canvas_sync_sync_batch.rb +0 -0
  15. data/lib/canvas_sync/api_syncable.rb +0 -0
  16. data/lib/canvas_sync/batch_processor.rb +0 -0
  17. data/lib/canvas_sync/class_callback_executor.rb +0 -0
  18. data/lib/canvas_sync/concerns/ability_helper.rb +0 -0
  19. data/lib/canvas_sync/concerns/account/ancestry.rb +0 -0
  20. data/lib/canvas_sync/concerns/account/base.rb +0 -0
  21. data/lib/canvas_sync/concerns/api_syncable.rb +0 -0
  22. data/lib/canvas_sync/concerns/auto_relations.rb +11 -0
  23. data/lib/canvas_sync/concerns/legacy_columns.rb +0 -0
  24. data/lib/canvas_sync/concerns/live_event_sync.rb +0 -0
  25. data/lib/canvas_sync/concerns/role/base.rb +0 -0
  26. data/lib/canvas_sync/concerns/sync_mapping.rb +0 -0
  27. data/lib/canvas_sync/config.rb +0 -0
  28. data/lib/canvas_sync/engine.rb +0 -0
  29. data/lib/canvas_sync/generators/install_generator.rb +0 -0
  30. data/lib/canvas_sync/generators/install_live_events_generator.rb +0 -0
  31. data/lib/canvas_sync/generators/templates/migrations/create_accounts.rb +0 -0
  32. data/lib/canvas_sync/generators/templates/migrations/create_admins.rb +0 -0
  33. data/lib/canvas_sync/generators/templates/migrations/create_assignment_groups.rb +0 -0
  34. data/lib/canvas_sync/generators/templates/migrations/create_assignments.rb +0 -0
  35. data/lib/canvas_sync/generators/templates/migrations/create_content_migrations.rb +0 -0
  36. data/lib/canvas_sync/generators/templates/migrations/create_context_module_items.rb +0 -0
  37. data/lib/canvas_sync/generators/templates/migrations/create_context_modules.rb +0 -0
  38. data/lib/canvas_sync/generators/templates/migrations/create_course_nicknames.rb +0 -0
  39. data/lib/canvas_sync/generators/templates/migrations/create_course_progresses.rb +0 -0
  40. data/lib/canvas_sync/generators/templates/migrations/create_courses.rb +0 -0
  41. data/lib/canvas_sync/generators/templates/migrations/create_enrollments.rb +0 -0
  42. data/lib/canvas_sync/generators/templates/migrations/create_grading_period_groups.rb +0 -0
  43. data/lib/canvas_sync/generators/templates/migrations/create_grading_periods.rb +0 -0
  44. data/lib/canvas_sync/generators/templates/migrations/create_group_memberships.rb +0 -0
  45. data/lib/canvas_sync/generators/templates/migrations/create_groups.rb +0 -0
  46. data/lib/canvas_sync/generators/templates/migrations/create_learning_outcome_results.rb +0 -0
  47. data/lib/canvas_sync/generators/templates/migrations/create_learning_outcomes.rb +0 -0
  48. data/lib/canvas_sync/generators/templates/migrations/create_pseudonyms.rb +0 -0
  49. data/lib/canvas_sync/generators/templates/migrations/create_roles.rb +0 -0
  50. data/lib/canvas_sync/generators/templates/migrations/create_rubric_assessments.rb +0 -0
  51. data/lib/canvas_sync/generators/templates/migrations/create_rubric_associations.rb +0 -0
  52. data/lib/canvas_sync/generators/templates/migrations/create_rubrics.rb +0 -0
  53. data/lib/canvas_sync/generators/templates/migrations/create_sections.rb +0 -0
  54. data/lib/canvas_sync/generators/templates/migrations/create_submissions.rb +0 -0
  55. data/lib/canvas_sync/generators/templates/migrations/create_terms.rb +0 -0
  56. data/lib/canvas_sync/generators/templates/migrations/create_user_observers.rb +0 -0
  57. data/lib/canvas_sync/generators/templates/migrations/create_users.rb +0 -0
  58. data/lib/canvas_sync/generators/templates/models/account.rb +0 -0
  59. data/lib/canvas_sync/generators/templates/models/admin.rb +0 -0
  60. data/lib/canvas_sync/generators/templates/models/assignment.rb +0 -0
  61. data/lib/canvas_sync/generators/templates/models/assignment_group.rb +0 -0
  62. data/lib/canvas_sync/generators/templates/models/content_migration.rb +0 -0
  63. data/lib/canvas_sync/generators/templates/models/context_module.rb +0 -0
  64. data/lib/canvas_sync/generators/templates/models/context_module_item.rb +0 -0
  65. data/lib/canvas_sync/generators/templates/models/course.rb +0 -0
  66. data/lib/canvas_sync/generators/templates/models/course_nickname.rb +0 -0
  67. data/lib/canvas_sync/generators/templates/models/course_progress.rb +8 -0
  68. data/lib/canvas_sync/generators/templates/models/enrollment.rb +0 -0
  69. data/lib/canvas_sync/generators/templates/models/grading_period.rb +0 -0
  70. data/lib/canvas_sync/generators/templates/models/grading_period_group.rb +0 -0
  71. data/lib/canvas_sync/generators/templates/models/group.rb +0 -0
  72. data/lib/canvas_sync/generators/templates/models/group_membership.rb +0 -0
  73. data/lib/canvas_sync/generators/templates/models/learning_outcome.rb +0 -0
  74. data/lib/canvas_sync/generators/templates/models/learning_outcome_result.rb +0 -0
  75. data/lib/canvas_sync/generators/templates/models/pseudonym.rb +0 -0
  76. data/lib/canvas_sync/generators/templates/models/role.rb +0 -0
  77. data/lib/canvas_sync/generators/templates/models/rubric.rb +0 -0
  78. data/lib/canvas_sync/generators/templates/models/rubric_assessment.rb +0 -0
  79. data/lib/canvas_sync/generators/templates/models/rubric_association.rb +0 -0
  80. data/lib/canvas_sync/generators/templates/models/section.rb +0 -0
  81. data/lib/canvas_sync/generators/templates/models/submission.rb +0 -0
  82. data/lib/canvas_sync/generators/templates/models/term.rb +0 -0
  83. data/lib/canvas_sync/generators/templates/models/user.rb +0 -0
  84. data/lib/canvas_sync/generators/templates/models/user_observer.rb +0 -0
  85. data/lib/canvas_sync/generators/templates/services/live_events/assignment_event.rb +0 -0
  86. data/lib/canvas_sync/generators/templates/services/live_events/assignment_group_event.rb +0 -0
  87. data/lib/canvas_sync/generators/templates/services/live_events/course_event.rb +0 -0
  88. data/lib/canvas_sync/generators/templates/services/live_events/course_section_event.rb +0 -0
  89. data/lib/canvas_sync/generators/templates/services/live_events/enrollment_event.rb +0 -0
  90. data/lib/canvas_sync/generators/templates/services/live_events/grade_event.rb +0 -0
  91. data/lib/canvas_sync/generators/templates/services/live_events/module_event.rb +0 -0
  92. data/lib/canvas_sync/generators/templates/services/live_events/module_item_event.rb +0 -0
  93. data/lib/canvas_sync/generators/templates/services/live_events/submission_event.rb +0 -0
  94. data/lib/canvas_sync/generators/templates/services/live_events/syllabus_event.rb +0 -0
  95. data/lib/canvas_sync/generators/templates/services/live_events/user_event.rb +0 -0
  96. data/lib/canvas_sync/importers/bulk_importer.rb +0 -0
  97. data/lib/canvas_sync/importers/legacy_importer.rb +0 -0
  98. data/lib/canvas_sync/job.rb +0 -0
  99. data/lib/canvas_sync/job_batches/batch.rb +22 -18
  100. data/lib/canvas_sync/job_batches/callback.rb +0 -0
  101. data/lib/canvas_sync/job_batches/chain_builder.rb +24 -3
  102. data/lib/canvas_sync/job_batches/compat/active_job.rb +0 -0
  103. data/lib/canvas_sync/job_batches/compat/sidekiq/web/batches_assets/css/styles.less +0 -0
  104. data/lib/canvas_sync/job_batches/compat/sidekiq/web/batches_assets/js/batch_tree.js +0 -0
  105. data/lib/canvas_sync/job_batches/compat/sidekiq/web/batches_assets/js/util.js +0 -0
  106. data/lib/canvas_sync/job_batches/compat/sidekiq/web/helpers.rb +0 -0
  107. data/lib/canvas_sync/job_batches/compat/sidekiq/web/views/_batch_tree.erb +0 -0
  108. data/lib/canvas_sync/job_batches/compat/sidekiq/web/views/_batches_table.erb +0 -0
  109. data/lib/canvas_sync/job_batches/compat/sidekiq/web/views/_common.erb +0 -0
  110. data/lib/canvas_sync/job_batches/compat/sidekiq/web/views/_jobs_table.erb +0 -0
  111. data/lib/canvas_sync/job_batches/compat/sidekiq/web/views/_pagination.erb +0 -0
  112. data/lib/canvas_sync/job_batches/compat/sidekiq/web/views/batch.erb +0 -0
  113. data/lib/canvas_sync/job_batches/compat/sidekiq/web/views/batches.erb +0 -0
  114. data/lib/canvas_sync/job_batches/compat/sidekiq/web/views/pool.erb +0 -0
  115. data/lib/canvas_sync/job_batches/compat/sidekiq/web/views/pools.erb +0 -0
  116. data/lib/canvas_sync/job_batches/compat/sidekiq/web.rb +0 -0
  117. data/lib/canvas_sync/job_batches/compat/sidekiq.rb +0 -0
  118. data/lib/canvas_sync/job_batches/compat.rb +0 -0
  119. data/lib/canvas_sync/job_batches/context_hash.rb +0 -0
  120. data/lib/canvas_sync/job_batches/hier_batch_ids.lua +0 -0
  121. data/lib/canvas_sync/job_batches/jobs/base_job.rb +0 -0
  122. data/lib/canvas_sync/job_batches/jobs/concurrent_batch_job.rb +0 -0
  123. data/lib/canvas_sync/job_batches/jobs/managed_batch_job.rb +4 -0
  124. data/lib/canvas_sync/job_batches/jobs/serial_batch_job.rb +0 -0
  125. data/lib/canvas_sync/job_batches/pool.rb +0 -0
  126. data/lib/canvas_sync/job_batches/pool_refill.lua +0 -0
  127. data/lib/canvas_sync/job_batches/redis_model.rb +0 -0
  128. data/lib/canvas_sync/job_batches/redis_script.rb +0 -0
  129. data/lib/canvas_sync/job_batches/schedule_callback.lua +0 -0
  130. data/lib/canvas_sync/job_batches/status.rb +1 -0
  131. data/lib/canvas_sync/job_uniqueness/compat/active_job.rb +0 -0
  132. data/lib/canvas_sync/job_uniqueness/compat/sidekiq.rb +0 -0
  133. data/lib/canvas_sync/job_uniqueness/compat.rb +0 -0
  134. data/lib/canvas_sync/job_uniqueness/configuration.rb +0 -0
  135. data/lib/canvas_sync/job_uniqueness/job_uniqueness.rb +0 -0
  136. data/lib/canvas_sync/job_uniqueness/lock_context.rb +41 -7
  137. data/lib/canvas_sync/job_uniqueness/locksmith.rb +0 -0
  138. data/lib/canvas_sync/job_uniqueness/on_conflict/base.rb +0 -0
  139. data/lib/canvas_sync/job_uniqueness/on_conflict/log.rb +0 -0
  140. data/lib/canvas_sync/job_uniqueness/on_conflict/null_strategy.rb +0 -0
  141. data/lib/canvas_sync/job_uniqueness/on_conflict/raise.rb +0 -0
  142. data/lib/canvas_sync/job_uniqueness/on_conflict/reject.rb +0 -0
  143. data/lib/canvas_sync/job_uniqueness/on_conflict/reschedule.rb +0 -0
  144. data/lib/canvas_sync/job_uniqueness/on_conflict.rb +0 -0
  145. data/lib/canvas_sync/job_uniqueness/strategy/base.rb +0 -0
  146. data/lib/canvas_sync/job_uniqueness/strategy/until_and_while_executing.rb +0 -0
  147. data/lib/canvas_sync/job_uniqueness/strategy/until_executed.rb +0 -0
  148. data/lib/canvas_sync/job_uniqueness/strategy/until_executing.rb +0 -0
  149. data/lib/canvas_sync/job_uniqueness/strategy/until_expired.rb +0 -0
  150. data/lib/canvas_sync/job_uniqueness/strategy/while_executing.rb +0 -0
  151. data/lib/canvas_sync/job_uniqueness/strategy.rb +0 -0
  152. data/lib/canvas_sync/job_uniqueness/unique_job_common.rb +0 -0
  153. data/lib/canvas_sync/jobs/begin_sync_chain_job.rb +0 -0
  154. data/lib/canvas_sync/jobs/canvas_process_waiter.rb +0 -0
  155. data/lib/canvas_sync/jobs/report_checker.rb +0 -0
  156. data/lib/canvas_sync/jobs/report_processor_job.rb +0 -0
  157. data/lib/canvas_sync/jobs/report_starter.rb +0 -0
  158. data/lib/canvas_sync/jobs/sync_accounts_job.rb +0 -0
  159. data/lib/canvas_sync/jobs/sync_admins_job.rb +0 -0
  160. data/lib/canvas_sync/jobs/sync_assignment_groups_job.rb +0 -0
  161. data/lib/canvas_sync/jobs/sync_assignments_job.rb +0 -0
  162. data/lib/canvas_sync/jobs/sync_content_migrations_job.rb +0 -0
  163. data/lib/canvas_sync/jobs/sync_context_module_items_job.rb +0 -0
  164. data/lib/canvas_sync/jobs/sync_context_modules_job.rb +0 -0
  165. data/lib/canvas_sync/jobs/sync_course_progresses_job.rb +0 -0
  166. data/lib/canvas_sync/jobs/sync_provisioning_report_job.rb +0 -0
  167. data/lib/canvas_sync/jobs/sync_roles_job.rb +0 -0
  168. data/lib/canvas_sync/jobs/sync_rubric_assessments_job.rb +0 -0
  169. data/lib/canvas_sync/jobs/sync_rubric_associations_job.rb +0 -0
  170. data/lib/canvas_sync/jobs/sync_rubrics_job.rb +0 -0
  171. data/lib/canvas_sync/jobs/sync_simple_table_job.rb +0 -0
  172. data/lib/canvas_sync/jobs/sync_submissions_job.rb +0 -0
  173. data/lib/canvas_sync/jobs/sync_terms_job.rb +0 -0
  174. data/lib/canvas_sync/jobs/term_batches_job.rb +4 -1
  175. data/lib/canvas_sync/live_events/base_handler.rb +0 -0
  176. data/lib/canvas_sync/live_events/process_event_job.rb +0 -0
  177. data/lib/canvas_sync/live_events.rb +0 -0
  178. data/lib/canvas_sync/misc_helper.rb +0 -0
  179. data/lib/canvas_sync/processors/assignment_groups_processor.rb +0 -0
  180. data/lib/canvas_sync/processors/assignments_processor.rb +0 -0
  181. data/lib/canvas_sync/processors/content_migrations_processor.rb +0 -0
  182. data/lib/canvas_sync/processors/context_module_items_processor.rb +0 -0
  183. data/lib/canvas_sync/processors/context_modules_processor.rb +0 -0
  184. data/lib/canvas_sync/processors/course_completion_report_processor.rb +0 -0
  185. data/lib/canvas_sync/processors/model_mappings.yml +0 -0
  186. data/lib/canvas_sync/processors/normal_processor.rb +0 -0
  187. data/lib/canvas_sync/processors/provisioning_report_processor.rb +0 -0
  188. data/lib/canvas_sync/processors/report_processor.rb +0 -0
  189. data/lib/canvas_sync/processors/rubric_assessments_processor.rb +0 -0
  190. data/lib/canvas_sync/processors/rubric_associations_processor.rb +0 -0
  191. data/lib/canvas_sync/processors/rubrics_processor.rb +0 -0
  192. data/lib/canvas_sync/processors/submissions_processor.rb +0 -0
  193. data/lib/canvas_sync/record.rb +0 -0
  194. data/lib/canvas_sync/sidekiq_job.rb +0 -0
  195. data/lib/canvas_sync/version.rb +1 -1
  196. data/lib/canvas_sync.rb +0 -0
  197. data/spec/canvas_sync/canvas_sync_spec.rb +59 -41
  198. data/spec/canvas_sync/jobs/canvas_process_waiter_spec.rb +0 -0
  199. data/spec/canvas_sync/jobs/job_spec.rb +0 -0
  200. data/spec/canvas_sync/jobs/report_checker_spec.rb +0 -0
  201. data/spec/canvas_sync/jobs/report_processor_job_spec.rb +0 -0
  202. data/spec/canvas_sync/jobs/report_starter_spec.rb +0 -0
  203. data/spec/canvas_sync/jobs/sync_admins_job_spec.rb +0 -0
  204. data/spec/canvas_sync/jobs/sync_assignment_groups_job_spec.rb +0 -0
  205. data/spec/canvas_sync/jobs/sync_assignments_job_spec.rb +0 -0
  206. data/spec/canvas_sync/jobs/sync_content_migrations_job_spec.rb +0 -0
  207. data/spec/canvas_sync/jobs/sync_context_module_items_job_spec.rb +0 -0
  208. data/spec/canvas_sync/jobs/sync_context_modules_job_spec.rb +0 -0
  209. data/spec/canvas_sync/jobs/sync_provisioning_report_job_spec.rb +0 -0
  210. data/spec/canvas_sync/jobs/sync_roles_job_spec.rb +0 -0
  211. data/spec/canvas_sync/jobs/sync_simple_table_job_spec.rb +0 -0
  212. data/spec/canvas_sync/jobs/sync_submissions_job_spec.rb +0 -0
  213. data/spec/canvas_sync/jobs/sync_terms_job_spec.rb +0 -0
  214. data/spec/canvas_sync/live_events/live_event_sync_spec.rb +0 -0
  215. data/spec/canvas_sync/live_events/live_events_controller_spec.rb +0 -0
  216. data/spec/canvas_sync/live_events/process_event_job_spec.rb +0 -0
  217. data/spec/canvas_sync/misc_helper_spec.rb +0 -0
  218. data/spec/canvas_sync/models/accounts_spec.rb +0 -0
  219. data/spec/canvas_sync/models/admins_spec.rb +0 -0
  220. data/spec/canvas_sync/models/assignment_group_spec.rb +0 -0
  221. data/spec/canvas_sync/models/assignment_spec.rb +0 -0
  222. data/spec/canvas_sync/models/context_module_item_spec.rb +0 -0
  223. data/spec/canvas_sync/models/context_module_spec.rb +0 -0
  224. data/spec/canvas_sync/models/course_spec.rb +0 -0
  225. data/spec/canvas_sync/models/enrollment_spec.rb +0 -0
  226. data/spec/canvas_sync/models/group_membership_spec.rb +0 -0
  227. data/spec/canvas_sync/models/group_spec.rb +0 -0
  228. data/spec/canvas_sync/models/roles_spec.rb +0 -0
  229. data/spec/canvas_sync/models/section_spec.rb +0 -0
  230. data/spec/canvas_sync/models/submission_spec.rb +0 -0
  231. data/spec/canvas_sync/models/term_spec.rb +0 -0
  232. data/spec/canvas_sync/models/user_spec.rb +0 -0
  233. data/spec/canvas_sync/processors/assignment_groups_processor_spec.rb +0 -0
  234. data/spec/canvas_sync/processors/assignments_processor_spec.rb +0 -0
  235. data/spec/canvas_sync/processors/content_migrations_processor_spec.rb +0 -0
  236. data/spec/canvas_sync/processors/context_module_items_processor_spec.rb +0 -0
  237. data/spec/canvas_sync/processors/context_modules_processor_spec.rb +0 -0
  238. data/spec/canvas_sync/processors/course_completion_report_processor_spec.rb +0 -0
  239. data/spec/canvas_sync/processors/normal_processor_spec.rb +0 -0
  240. data/spec/canvas_sync/processors/provisioning_report_processor_spec.rb +0 -0
  241. data/spec/canvas_sync/processors/rubric_assessments_spec.rb +0 -0
  242. data/spec/canvas_sync/processors/rubric_associations_spec.rb +0 -0
  243. data/spec/canvas_sync/processors/rubrics_processor_spec.rb +0 -0
  244. data/spec/canvas_sync/processors/submissions_processor_spec.rb +0 -0
  245. data/spec/canvas_sync/services/module_event_spec.rb +0 -0
  246. data/spec/canvas_sync/services/module_item_event_spec.rb +0 -0
  247. data/spec/dummy/README.rdoc +0 -0
  248. data/spec/dummy/Rakefile +0 -0
  249. data/spec/dummy/app/models/account.rb +0 -0
  250. data/spec/dummy/app/models/admin.rb +0 -0
  251. data/spec/dummy/app/models/application_record.rb +0 -0
  252. data/spec/dummy/app/models/assignment.rb +0 -0
  253. data/spec/dummy/app/models/assignment_group.rb +0 -0
  254. data/spec/dummy/app/models/content_migration.rb +0 -0
  255. data/spec/dummy/app/models/context_module.rb +0 -0
  256. data/spec/dummy/app/models/context_module_item.rb +0 -0
  257. data/spec/dummy/app/models/course.rb +0 -0
  258. data/spec/dummy/app/models/course_nickname.rb +0 -0
  259. data/spec/dummy/app/models/course_progress.rb +8 -0
  260. data/spec/dummy/app/models/enrollment.rb +0 -0
  261. data/spec/dummy/app/models/grading_period.rb +0 -0
  262. data/spec/dummy/app/models/grading_period_group.rb +0 -0
  263. data/spec/dummy/app/models/group.rb +0 -0
  264. data/spec/dummy/app/models/group_membership.rb +0 -0
  265. data/spec/dummy/app/models/learning_outcome.rb +0 -0
  266. data/spec/dummy/app/models/learning_outcome_result.rb +0 -0
  267. data/spec/dummy/app/models/pseudonym.rb +0 -0
  268. data/spec/dummy/app/models/role.rb +0 -0
  269. data/spec/dummy/app/models/rubric.rb +0 -0
  270. data/spec/dummy/app/models/rubric_assessment.rb +0 -0
  271. data/spec/dummy/app/models/rubric_association.rb +0 -0
  272. data/spec/dummy/app/models/section.rb +0 -0
  273. data/spec/dummy/app/models/submission.rb +0 -0
  274. data/spec/dummy/app/models/term.rb +0 -0
  275. data/spec/dummy/app/models/user.rb +0 -0
  276. data/spec/dummy/app/models/user_observer.rb +0 -0
  277. data/spec/dummy/app/services/live_events/assignment_created_event.rb +0 -0
  278. data/spec/dummy/app/services/live_events/assignment_event.rb +0 -0
  279. data/spec/dummy/app/services/live_events/assignment_updated_event.rb +0 -0
  280. data/spec/dummy/app/services/live_events/base_event.rb +0 -0
  281. data/spec/dummy/app/services/live_events/course_created_event.rb +0 -0
  282. data/spec/dummy/app/services/live_events/course_event.rb +0 -0
  283. data/spec/dummy/app/services/live_events/course_section_created_event.rb +0 -0
  284. data/spec/dummy/app/services/live_events/course_section_event.rb +0 -0
  285. data/spec/dummy/app/services/live_events/course_section_updated_event.rb +0 -0
  286. data/spec/dummy/app/services/live_events/course_updated_event.rb +0 -0
  287. data/spec/dummy/app/services/live_events/enrollment_created_event.rb +0 -0
  288. data/spec/dummy/app/services/live_events/enrollment_event.rb +0 -0
  289. data/spec/dummy/app/services/live_events/enrollment_updated_event.rb +0 -0
  290. data/spec/dummy/app/services/live_events/grade_changed_event.rb +0 -0
  291. data/spec/dummy/app/services/live_events/grade_event.rb +0 -0
  292. data/spec/dummy/app/services/live_events/module_created_event.rb +0 -0
  293. data/spec/dummy/app/services/live_events/module_event.rb +0 -0
  294. data/spec/dummy/app/services/live_events/module_item_created_event.rb +0 -0
  295. data/spec/dummy/app/services/live_events/module_item_event.rb +0 -0
  296. data/spec/dummy/app/services/live_events/module_item_updated_event.rb +0 -0
  297. data/spec/dummy/app/services/live_events/module_updated_event.rb +0 -0
  298. data/spec/dummy/app/services/live_events/submission_created_event.rb +0 -0
  299. data/spec/dummy/app/services/live_events/submission_event.rb +0 -0
  300. data/spec/dummy/app/services/live_events/submission_updated_event.rb +0 -0
  301. data/spec/dummy/app/services/live_events/syllabus_event.rb +0 -0
  302. data/spec/dummy/app/services/live_events/syllabus_updated_event.rb +0 -0
  303. data/spec/dummy/app/services/live_events/user_created_event.rb +0 -0
  304. data/spec/dummy/app/services/live_events/user_event.rb +0 -0
  305. data/spec/dummy/app/services/live_events/user_updated_event.rb +0 -0
  306. data/spec/dummy/config/application.rb +0 -0
  307. data/spec/dummy/config/boot.rb +0 -0
  308. data/spec/dummy/config/database.yml +0 -0
  309. data/spec/dummy/config/environment.rb +0 -0
  310. data/spec/dummy/config/environments/development.rb +0 -0
  311. data/spec/dummy/config/environments/test.rb +0 -0
  312. data/spec/dummy/config/initializers/assets.rb +0 -0
  313. data/spec/dummy/config/initializers/session_store.rb +0 -0
  314. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -0
  315. data/spec/dummy/config/routes.rb +0 -0
  316. data/spec/dummy/config/secrets.yml +0 -0
  317. data/spec/dummy/config.ru +0 -0
  318. data/spec/dummy/db/migrate/20190702203621_create_courses.rb +0 -0
  319. data/spec/dummy/db/migrate/20190702203622_create_accounts.rb +0 -0
  320. data/spec/dummy/db/migrate/20190702203623_create_terms.rb +0 -0
  321. data/spec/dummy/db/migrate/20190702203624_create_enrollments.rb +0 -0
  322. data/spec/dummy/db/migrate/20190702203625_create_sections.rb +0 -0
  323. data/spec/dummy/db/migrate/20190702203626_create_assignments.rb +0 -0
  324. data/spec/dummy/db/migrate/20190702203627_create_submissions.rb +0 -0
  325. data/spec/dummy/db/migrate/20190702203630_create_assignment_groups.rb +0 -0
  326. data/spec/dummy/db/migrate/20190702203631_create_context_modules.rb +0 -0
  327. data/spec/dummy/db/migrate/20190702203632_create_context_module_items.rb +0 -0
  328. data/spec/dummy/db/migrate/20190927204545_create_roles.rb +0 -0
  329. data/spec/dummy/db/migrate/20190927204546_create_admins.rb +0 -0
  330. data/spec/dummy/db/migrate/20200415171620_create_groups.rb +0 -0
  331. data/spec/dummy/db/migrate/20200416214248_create_group_memberships.rb +0 -0
  332. data/spec/dummy/db/migrate/20201016181346_create_pseudonyms.rb +0 -0
  333. data/spec/dummy/db/migrate/20210907233329_create_user_observers.rb +0 -0
  334. data/spec/dummy/db/migrate/20210907233330_create_grading_periods.rb +0 -0
  335. data/spec/dummy/db/migrate/20211001184920_create_grading_period_groups.rb +0 -0
  336. data/spec/dummy/db/migrate/20220308072643_create_content_migrations.rb +0 -0
  337. data/spec/dummy/db/migrate/20220712210559_create_learning_outcomes.rb +0 -0
  338. data/spec/dummy/db/migrate/20220926221926_create_users.rb +0 -0
  339. data/spec/dummy/db/migrate/20240408223326_create_course_nicknames.rb +0 -0
  340. data/spec/dummy/db/migrate/20240509105100_create_rubrics.rb +0 -0
  341. data/spec/dummy/db/migrate/20240510094100_create_rubric_associations.rb +0 -0
  342. data/spec/dummy/db/migrate/20240510101100_create_rubric_assessments.rb +0 -0
  343. data/spec/dummy/db/migrate/20240523101010_create_learning_outcome_results.rb +0 -0
  344. data/spec/dummy/db/migrate/20240828161300_create_course_progresses.rb +0 -0
  345. data/spec/dummy/db/schema.rb +0 -0
  346. data/spec/factories/account_factory.rb +0 -0
  347. data/spec/factories/admin_factory.rb +0 -0
  348. data/spec/factories/assignment_factory.rb +0 -0
  349. data/spec/factories/assignment_group_factory.rb +0 -0
  350. data/spec/factories/context_module_factory.rb +0 -0
  351. data/spec/factories/context_module_item_factory.rb +0 -0
  352. data/spec/factories/course_factory.rb +0 -0
  353. data/spec/factories/enrollment_factory.rb +0 -0
  354. data/spec/factories/group_factory.rb +0 -0
  355. data/spec/factories/group_membership_factory.rb +0 -0
  356. data/spec/factories/role_factory.rb +0 -0
  357. data/spec/factories/section_factory.rb +0 -0
  358. data/spec/factories/submission_factory.rb +0 -0
  359. data/spec/factories/term_factory.rb +0 -0
  360. data/spec/factories/user_factory.rb +0 -0
  361. data/spec/job_batching/batch_spec.rb +0 -0
  362. data/spec/job_batching/callback_spec.rb +0 -0
  363. data/spec/job_batching/compat/active_job_spec.rb +0 -0
  364. data/spec/job_batching/compat/sidekiq_spec.rb +0 -0
  365. data/spec/job_batching/context_hash_spec.rb +0 -0
  366. data/spec/job_batching/flow_spec.rb +0 -0
  367. data/spec/job_batching/integration/fail_then_succeed.rb +0 -0
  368. data/spec/job_batching/integration/integration.rb +0 -0
  369. data/spec/job_batching/integration/nested.rb +0 -0
  370. data/spec/job_batching/integration/simple.rb +0 -0
  371. data/spec/job_batching/integration/workflow.rb +0 -0
  372. data/spec/job_batching/integration_helper.rb +0 -0
  373. data/spec/job_batching/pool_spec.rb +0 -0
  374. data/spec/job_batching/status_spec.rb +0 -0
  375. data/spec/job_batching/support/base_job.rb +0 -0
  376. data/spec/job_batching/support/sample_callback.rb +0 -0
  377. data/spec/job_uniqueness/compat/active_job_spec.rb +0 -0
  378. data/spec/job_uniqueness/compat/sidekiq_spec.rb +0 -0
  379. data/spec/job_uniqueness/lock_context_spec.rb +11 -0
  380. data/spec/job_uniqueness/on_conflict/log_spec.rb +0 -0
  381. data/spec/job_uniqueness/on_conflict/raise_spec.rb +0 -0
  382. data/spec/job_uniqueness/on_conflict/reschedule_spec.rb +0 -0
  383. data/spec/job_uniqueness/on_conflict_spec.rb +0 -0
  384. data/spec/job_uniqueness/spec_helper.rb +0 -0
  385. data/spec/job_uniqueness/strategy/base_spec.rb +0 -0
  386. data/spec/job_uniqueness/strategy/until_and_while_executing_spec.rb +0 -0
  387. data/spec/job_uniqueness/strategy/until_executed_spec.rb +0 -0
  388. data/spec/job_uniqueness/strategy/until_executing_spec.rb +0 -0
  389. data/spec/job_uniqueness/strategy/until_expired_spec.rb +0 -0
  390. data/spec/job_uniqueness/strategy/while_executing_spec.rb +0 -0
  391. data/spec/job_uniqueness/support/lock_strategy.rb +0 -0
  392. data/spec/job_uniqueness/support/on_conflict.rb +0 -0
  393. data/spec/job_uniqueness/support/test_worker.rb +0 -0
  394. data/spec/job_uniqueness/unique_job_common_spec.rb +0 -0
  395. data/spec/spec_helper.rb +0 -0
  396. data/spec/support/fake_canvas.rb +0 -0
  397. data/spec/support/fixtures/canvas_responses/admins.json +0 -0
  398. data/spec/support/fixtures/canvas_responses/module.json +0 -0
  399. data/spec/support/fixtures/canvas_responses/module_item.json +0 -0
  400. data/spec/support/fixtures/canvas_responses/roles.json +0 -0
  401. data/spec/support/fixtures/canvas_responses/terms.json +0 -0
  402. data/spec/support/fixtures/reports/assignment_groups.csv +0 -0
  403. data/spec/support/fixtures/reports/assignments.csv +0 -0
  404. data/spec/support/fixtures/reports/content_migrations.csv +0 -0
  405. data/spec/support/fixtures/reports/context_module_items.csv +0 -0
  406. data/spec/support/fixtures/reports/context_modules.csv +0 -0
  407. data/spec/support/fixtures/reports/course_nicknames.csv +0 -0
  408. data/spec/support/fixtures/reports/course_progresses.csv +0 -0
  409. data/spec/support/fixtures/reports/course_progresses_conflict.csv +0 -0
  410. data/spec/support/fixtures/reports/courses.csv +0 -0
  411. data/spec/support/fixtures/reports/enrollments.csv +0 -0
  412. data/spec/support/fixtures/reports/grading_period_groups.csv +0 -0
  413. data/spec/support/fixtures/reports/grading_periods.csv +0 -0
  414. data/spec/support/fixtures/reports/group_memberships.csv +0 -0
  415. data/spec/support/fixtures/reports/groups.csv +0 -0
  416. data/spec/support/fixtures/reports/learning_outcome_results.csv +0 -0
  417. data/spec/support/fixtures/reports/learning_outcomes.csv +0 -0
  418. data/spec/support/fixtures/reports/provisioning_csv +0 -0
  419. data/spec/support/fixtures/reports/provisioning_csv_unzipped/courses.csv +0 -0
  420. data/spec/support/fixtures/reports/provisioning_csv_unzipped/users.csv +0 -0
  421. data/spec/support/fixtures/reports/rubric_assessments.csv +0 -0
  422. data/spec/support/fixtures/reports/rubric_associations.csv +0 -0
  423. data/spec/support/fixtures/reports/rubrics.csv +0 -0
  424. data/spec/support/fixtures/reports/sections.csv +0 -0
  425. data/spec/support/fixtures/reports/submissions.csv +0 -0
  426. data/spec/support/fixtures/reports/user_observers.csv +0 -0
  427. data/spec/support/fixtures/reports/users.csv +0 -0
  428. data/spec/support/fixtures/reports/xlist.csv +0 -0
  429. metadata +193 -192
@@ -6,8 +6,6 @@ module CanvasSync::JobUniqueness
6
6
  context_class.new(data, **kwargs)
7
7
  end
8
8
 
9
- attr_reader :lock_id
10
-
11
9
  # { job_clazz, jid, queue, args?, kwargs?, base_key? }
12
10
  def initialize(data, job_instance: nil, config: nil)
13
11
  @base_key = data[:base_key]
@@ -16,7 +14,9 @@ module CanvasSync::JobUniqueness
16
14
  @config = config || @context_data[:config]
17
15
 
18
16
  # TODO Consider (somewhere) updating the lock_id to the BID of the wrapping Batch (when applicable)
19
- @lock_id ||= data[:lid] || Thread.current[:unique_jobs_previous_context]&.lock_id || job_id
17
+ @lock_id ||= data[:lid] || Thread.current[:unique_jobs_previous_context]&.lock_id
18
+ @lock_id_locked = @lock_id.present?
19
+ @lock_id ||= job_id
20
20
  end
21
21
 
22
22
  # This is primarily for rehydrating in a Batch Callback, so it is unlikely that args and kwargs are needed.
@@ -84,6 +84,18 @@ module CanvasSync::JobUniqueness
84
84
  end
85
85
  end
86
86
 
87
+ def lock_id
88
+ @lock_id_locked = true
89
+ @lock_id
90
+ end
91
+
92
+ def lock_id=(new_id)
93
+ raise "Lock ID already set" if @lock_id_locked
94
+ return unless new_id.present?
95
+ @lock_id = new_id
96
+ @lock_id_locked = true
97
+ end
98
+
87
99
  def job_id
88
100
  @context_data[:jid]
89
101
  end
@@ -122,14 +134,27 @@ module CanvasSync::JobUniqueness
122
134
 
123
135
  args = @context_data[:args] || []
124
136
  kwargs = @context_data[:kwargs] || {}
137
+ hash = config[:hash]
125
138
  if config[:hash].is_a?(Proc)
126
- base_key << config[:hash].call(*args, **kwargs)
139
+ hash = config[:hash].call(*args, **kwargs)
127
140
  elsif config[:hash].nil?
128
- base_key << OpenSSL::Digest::MD5.hexdigest(JSON.dump([ args, kwargs.sort]))
129
- else
130
- base_key << config[:hash]
141
+ hash = [*args, kwargs]
142
+ end
143
+
144
+ hash = ":#{hash}" if hash.is_a?(Symbol)
145
+
146
+ if hash && !hash.is_a?(String)
147
+ hash = Array(hash)
148
+
149
+ # Normalize the hash to ensure that the order of any Hash keys don't matter
150
+ hash = normalize_hash_chunk(hash)
151
+
152
+ normalized = ActiveJob::Arguments.serialize(hash)
153
+ hash = OpenSSL::Digest::MD5.hexdigest(JSON.dump(normalized))
131
154
  end
132
155
 
156
+ base_key << hash if hash
157
+
133
158
  base_key.join(":")
134
159
  end
135
160
  end
@@ -173,5 +198,14 @@ module CanvasSync::JobUniqueness
173
198
 
174
199
  private
175
200
 
201
+ def normalize_hash_chunk(chunk)
202
+ if chunk.is_a?(Hash)
203
+ chunk.map { |k, v| [k, normalize_hash_chunk(v)] }.sort.to_h
204
+ elsif chunk.is_a?(Array)
205
+ chunk.map { |c| normalize_hash_chunk(c) }
206
+ else
207
+ chunk
208
+ end
209
+ end
176
210
  end
177
211
  end
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -12,14 +12,17 @@ module CanvasSync
12
12
  # Override the delta-syncing date if:
13
13
  # 1. the Term hasn't been synced before or
14
14
  # 2. the Term underwent a period of not syncing
15
- term_last_sync = CanvasSync.redis.get(self.class.last_sync_key(term_id))
16
15
  if batch_context[:updated_after]
16
+ term_last_sync = CanvasSync.redis.get(self.class.last_sync_key(term_id))
17
17
  if !term_last_sync.present? || batch_context[:updated_after] > term_last_sync
18
18
  local_context[:updated_after] = term_last_sync.presence
19
19
  end
20
20
  end
21
21
 
22
22
  JobBatches::ManagedBatchJob.make_batch(jobs, ordered: false, concurrency: true) do |b|
23
+ # TODO If we do a Chain UI, this will need to checkin somehow to indicate that the chain forked
24
+ # Or chain steps just show a summary - eg "Started", "X Jobs Running", "Done" or "X Jobs Running, Y Jobs Done" - and not individual forks
25
+ # For a step to be considered done, all previous sibling-level steps must be done and no batches pending
23
26
  b.description = "TermBatchJob(#{term_id}) Root"
24
27
  b.context = local_context
25
28
  b.on(:success, "#{self.class.to_s}.batch_finished") unless options[:mark_synced] == false
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -1,3 +1,3 @@
1
1
  module CanvasSync
2
- VERSION = "0.22.4".freeze
2
+ VERSION = "0.22.6".freeze
3
3
  end
data/lib/canvas_sync.rb CHANGED
File without changes
@@ -2,18 +2,6 @@ require 'spec_helper'
2
2
 
3
3
  RSpec.describe CanvasSync do
4
4
  describe '.provisioning_sync' do
5
- it 'invokes the first job in the queue and passes on the rest of the job chain' do
6
- expected_job_chain = CanvasSync.default_provisioning_report_chain(['courses'], term_scope: nil).normalize![:args][0]
7
-
8
- expect(CanvasSync::Jobs::BeginSyncChainJob).to receive(:perform_later)
9
- .with(
10
- expected_job_chain,
11
- anything
12
- )
13
-
14
- CanvasSync.provisioning_sync(['courses'])
15
- end
16
-
17
5
  context 'an invalid model is passed in' do
18
6
  it 'raises a helpful exception' do
19
7
  expect {
@@ -30,22 +18,25 @@ RSpec.describe CanvasSync do
30
18
  provisioning: { c: 3 },
31
19
  global: { d: 4 },
32
20
  })
33
- expect(chain.normalize!).to eq({
21
+ expect(chain.normalize!).to match({
34
22
  :job => "CanvasSync::Jobs::BeginSyncChainJob",
23
+ :chain_link=>String,
35
24
  :args => [
36
25
  [
37
26
  {
38
27
  :job=>"CanvasSync::JobBatches::ConcurrentBatchJob",
28
+ :chain_link=>String,
39
29
  :args=>[
40
30
  [
41
- {:job=>"CanvasSync::Jobs::SyncProvisioningReportJob", :options=>{:models=>["users"], :b=>2}},
31
+ {:job=>"CanvasSync::Jobs::SyncProvisioningReportJob", :chain_link=>String, :options=>{:models=>["users"], :b=>2}},
42
32
  {
43
33
  :job=>"CanvasSync::Jobs::SyncTermsJob",
34
+ :chain_link=>String,
44
35
  :args=>[],
45
36
  :kwargs=>{
46
37
  :term_scope=>"active",
47
38
  :sub_jobs=>[
48
- {:job=>"CanvasSync::Jobs::SyncProvisioningReportJob", :options=>{:models=>["courses"], :c=>3}},
39
+ {:job=>"CanvasSync::Jobs::SyncProvisioningReportJob", :chain_link=>String, :options=>{:models=>["courses"], :c=>3}},
49
40
  ],
50
41
  },
51
42
  },
@@ -62,20 +53,23 @@ RSpec.describe CanvasSync do
62
53
  context 'we are syncing users with a term scope' do
63
54
  it 'syncs the users in a separate job that runs first' do
64
55
  chain = CanvasSync.default_provisioning_report_chain(['users', 'courses'], term_scope: :active)
65
- expect(chain.normalize!).to eq({
56
+ expect(chain.normalize!).to match({
66
57
  :job => "CanvasSync::Jobs::BeginSyncChainJob",
58
+ :chain_link=>String,
67
59
  :args => [[
68
60
  {
69
61
  :job=>"CanvasSync::JobBatches::ConcurrentBatchJob",
62
+ :chain_link=>String,
70
63
  :args=>[
71
64
  [
72
- {:job=>"CanvasSync::Jobs::SyncProvisioningReportJob", :options=>{:models=>["users"]}},
65
+ {:job=>"CanvasSync::Jobs::SyncProvisioningReportJob", :chain_link=>String, :options=>{:models=>["users"]}},
73
66
  {
74
67
  :job=>"CanvasSync::Jobs::SyncTermsJob",
68
+ :chain_link=>String,
75
69
  :args=>[],
76
70
  :kwargs=>{
77
71
  :sub_jobs=>[
78
- {:job=>"CanvasSync::Jobs::SyncProvisioningReportJob", :options=>{:models=>["courses"]}}
72
+ {:job=>"CanvasSync::Jobs::SyncProvisioningReportJob", :chain_link=>String, :options=>{:models=>["courses"]}}
79
73
  ],
80
74
  :term_scope=>"active",
81
75
  }
@@ -93,17 +87,20 @@ RSpec.describe CanvasSync do
93
87
  context 'we are syncing users without a term scope' do
94
88
  it 'syncs users along with the rest of the provisioning report' do
95
89
  chain = CanvasSync.default_provisioning_report_chain(['users', 'courses'])
96
- expect(chain.normalize!).to eq({
90
+ expect(chain.normalize!).to match({
97
91
  :job => "CanvasSync::Jobs::BeginSyncChainJob",
92
+ :chain_link=>String,
98
93
  :args => [[
99
94
  {
100
95
  :job=>"CanvasSync::JobBatches::ConcurrentBatchJob",
96
+ :chain_link=>String,
101
97
  :args=>[[
102
98
  {
103
99
  :job=>"CanvasSync::Jobs::SyncTermsJob",
100
+ :chain_link=>String,
104
101
  :args=>[],
105
102
  :kwargs=>{
106
- :sub_jobs=>[{:job=>"CanvasSync::Jobs::SyncProvisioningReportJob", :options=>{:models=>["users", "courses"]}}],
103
+ :sub_jobs=>[{:job=>"CanvasSync::Jobs::SyncProvisioningReportJob", :chain_link=>String, :options=>{:models=>["users", "courses"]}}],
107
104
  :term_scope=>nil,
108
105
  }
109
106
  }
@@ -119,18 +116,21 @@ RSpec.describe CanvasSync do
119
116
  context 'we are syncing roles with a term scope' do
120
117
  it 'syncs the roles in a separate job that runs first' do
121
118
  chain = CanvasSync.default_provisioning_report_chain(['roles', 'courses'], term_scope: :active)
122
- expect(chain.normalize!).to eq({
119
+ expect(chain.normalize!).to match({
123
120
  :job => "CanvasSync::Jobs::BeginSyncChainJob",
121
+ :chain_link=>String,
124
122
  :args => [[
125
123
  {
126
124
  :job=>"CanvasSync::JobBatches::ConcurrentBatchJob",
125
+ :chain_link=>String,
127
126
  :args=>[[
128
- {:job=>"CanvasSync::Jobs::SyncRolesJob", :options=>{}},
127
+ {:job=>"CanvasSync::Jobs::SyncRolesJob", :chain_link=>String, :options=>{}},
129
128
  {
130
129
  :job=>"CanvasSync::Jobs::SyncTermsJob",
130
+ :chain_link=>String,
131
131
  :args=>[],
132
132
  :kwargs=>{
133
- :sub_jobs=>[{:job=>"CanvasSync::Jobs::SyncProvisioningReportJob", :options=>{:models=>["courses"]}}],
133
+ :sub_jobs=>[{:job=>"CanvasSync::Jobs::SyncProvisioningReportJob", :chain_link=>String, :options=>{:models=>["courses"]}}],
134
134
  :term_scope=>"active",
135
135
  }
136
136
  },
@@ -146,18 +146,21 @@ RSpec.describe CanvasSync do
146
146
  context 'we are syncing roles without a term scope' do
147
147
  it 'syncs roles separately even with no term scope' do
148
148
  chain = CanvasSync.default_provisioning_report_chain(['roles', 'courses'])
149
- expect(chain.normalize!).to eq({
149
+ expect(chain.normalize!).to match({
150
150
  :job => "CanvasSync::Jobs::BeginSyncChainJob",
151
+ :chain_link=>String,
151
152
  :args => [[
152
153
  {
153
154
  :job=>"CanvasSync::JobBatches::ConcurrentBatchJob",
155
+ :chain_link=>String,
154
156
  :args=>[[
155
- {:job=>"CanvasSync::Jobs::SyncRolesJob", :options=>{}},
157
+ {:job=>"CanvasSync::Jobs::SyncRolesJob", :chain_link=>String, :options=>{}},
156
158
  {
157
159
  :job=>"CanvasSync::Jobs::SyncTermsJob",
160
+ :chain_link=>String,
158
161
  :args=>[],
159
162
  :kwargs=>{
160
- :sub_jobs=>[{:job=>"CanvasSync::Jobs::SyncProvisioningReportJob", :options=>{:models=>["courses"]}}],
163
+ :sub_jobs=>[{:job=>"CanvasSync::Jobs::SyncProvisioningReportJob", :chain_link=>String, :options=>{:models=>["courses"]}}],
161
164
  :term_scope=>nil,
162
165
  }
163
166
  }
@@ -173,18 +176,21 @@ RSpec.describe CanvasSync do
173
176
  context 'we are syncing admins with a term scope' do
174
177
  it 'syncs the admins in a separate job that runs first' do
175
178
  chain = CanvasSync.default_provisioning_report_chain(['admins', 'courses'], term_scope: :active)
176
- expect(chain.normalize!).to eq({
179
+ expect(chain.normalize!).to match({
177
180
  :job => "CanvasSync::Jobs::BeginSyncChainJob",
181
+ :chain_link=>String,
178
182
  :args => [[
179
183
  {
180
184
  :job=>"CanvasSync::JobBatches::ConcurrentBatchJob",
185
+ :chain_link=>String,
181
186
  :args=>[[
182
- {:job=>"CanvasSync::Jobs::SyncAdminsJob", :options=>{}},
187
+ {:job=>"CanvasSync::Jobs::SyncAdminsJob", :chain_link=>String, :options=>{}},
183
188
  {
184
189
  :job=>"CanvasSync::Jobs::SyncTermsJob",
190
+ :chain_link=>String,
185
191
  :args=>[],
186
192
  :kwargs=>{
187
- :sub_jobs=>[{:job=>"CanvasSync::Jobs::SyncProvisioningReportJob", :options=>{:models=>["courses"]}}],
193
+ :sub_jobs=>[{:job=>"CanvasSync::Jobs::SyncProvisioningReportJob", :chain_link=>String, :options=>{:models=>["courses"]}}],
188
194
  :term_scope=>"active"
189
195
  }
190
196
  }
@@ -200,18 +206,21 @@ RSpec.describe CanvasSync do
200
206
  context 'we are syncing admins without a term scope' do
201
207
  it 'syncs admins separately even with no term scope' do
202
208
  chain = CanvasSync.default_provisioning_report_chain(['admins', 'courses'])
203
- expect(chain.normalize!).to eq({
209
+ expect(chain.normalize!).to match({
204
210
  :job => "CanvasSync::Jobs::BeginSyncChainJob",
211
+ :chain_link=>String,
205
212
  :args => [[
206
213
  {
207
214
  :job=>"CanvasSync::JobBatches::ConcurrentBatchJob",
215
+ :chain_link=>String,
208
216
  :args=>[[
209
- {:job=>"CanvasSync::Jobs::SyncAdminsJob", :options=>{}},
217
+ {:job=>"CanvasSync::Jobs::SyncAdminsJob", :chain_link=>String, :options=>{}},
210
218
  {
211
219
  :job=>"CanvasSync::Jobs::SyncTermsJob",
220
+ :chain_link=>String,
212
221
  :args=>[],
213
222
  :kwargs=>{
214
- :sub_jobs=>[{:job=>"CanvasSync::Jobs::SyncProvisioningReportJob", :options=>{:models=>["courses"]}}],
223
+ :sub_jobs=>[{:job=>"CanvasSync::Jobs::SyncProvisioningReportJob", :chain_link=>String, :options=>{:models=>["courses"]}}],
215
224
  :term_scope=>nil
216
225
  }
217
226
  }
@@ -228,19 +237,22 @@ RSpec.describe CanvasSync do
228
237
  it "appends the SyncAssignmentsJob" do
229
238
  chain = CanvasSync.default_provisioning_report_chain(%w[users enrollments assignments])
230
239
 
231
- expect(chain.normalize!).to eq({
240
+ expect(chain.normalize!).to match({
232
241
  :job => "CanvasSync::Jobs::BeginSyncChainJob",
242
+ :chain_link=>String,
233
243
  :args => [[
234
244
  {
235
245
  :job=>"CanvasSync::JobBatches::ConcurrentBatchJob",
246
+ :chain_link=>String,
236
247
  :args=>[[
237
248
  {
238
249
  :job=>"CanvasSync::Jobs::SyncTermsJob",
250
+ :chain_link=>String,
239
251
  :args=>[],
240
252
  :kwargs=>{
241
253
  :sub_jobs=>[
242
- {:job=>"CanvasSync::Jobs::SyncAssignmentsJob", :options=>{}},
243
- {:job=>"CanvasSync::Jobs::SyncProvisioningReportJob", :options=>{:models=>["users", "enrollments"]}}
254
+ {:job=>"CanvasSync::Jobs::SyncAssignmentsJob", :chain_link=>String, :options=>{}},
255
+ {:job=>"CanvasSync::Jobs::SyncProvisioningReportJob", :chain_link=>String, :options=>{:models=>["users", "enrollments"]}}
244
256
  ],
245
257
  :term_scope=>nil
246
258
  }
@@ -258,19 +270,22 @@ RSpec.describe CanvasSync do
258
270
  it "appends the SyncSubmissionsJob" do
259
271
  chain = CanvasSync.default_provisioning_report_chain(%w[users enrollments submissions])
260
272
 
261
- expect(chain.normalize!).to eq({
273
+ expect(chain.normalize!).to match({
262
274
  :job => "CanvasSync::Jobs::BeginSyncChainJob",
275
+ :chain_link=>String,
263
276
  :args => [[
264
277
  {
265
278
  :job=>"CanvasSync::JobBatches::ConcurrentBatchJob",
279
+ :chain_link=>String,
266
280
  :args=>[[
267
281
  {
268
282
  :job=>"CanvasSync::Jobs::SyncTermsJob",
283
+ :chain_link=>String,
269
284
  :args=>[],
270
285
  :kwargs=>{
271
286
  :sub_jobs=>[
272
- {:job=>"CanvasSync::Jobs::SyncSubmissionsJob", :options=>{}},
273
- {:job=>"CanvasSync::Jobs::SyncProvisioningReportJob", :options=>{:models=>["users", "enrollments"]}}
287
+ {:job=>"CanvasSync::Jobs::SyncSubmissionsJob", :chain_link=>String, :options=>{}},
288
+ {:job=>"CanvasSync::Jobs::SyncProvisioningReportJob", :chain_link=>String, :options=>{:models=>["users", "enrollments"]}}
274
289
  ],
275
290
  :term_scope=>nil
276
291
  }
@@ -288,19 +303,22 @@ RSpec.describe CanvasSync do
288
303
  it "appends the SyncAssignmentGroupsJob" do
289
304
  chain = CanvasSync.default_provisioning_report_chain(%w[users enrollments assignment_groups])
290
305
 
291
- expect(chain.normalize!).to eq({
306
+ expect(chain.normalize!).to match({
292
307
  :job => "CanvasSync::Jobs::BeginSyncChainJob",
308
+ :chain_link=>String,
293
309
  :args => [[
294
310
  {
295
311
  :job=>"CanvasSync::JobBatches::ConcurrentBatchJob",
312
+ :chain_link=>String,
296
313
  :args=>[[
297
314
  {
298
315
  :job=>"CanvasSync::Jobs::SyncTermsJob",
316
+ :chain_link=>String,
299
317
  :args=>[],
300
318
  :kwargs=>{
301
319
  :sub_jobs=>[
302
- {:job=>"CanvasSync::Jobs::SyncAssignmentGroupsJob", :options=>{}},
303
- {:job=>"CanvasSync::Jobs::SyncProvisioningReportJob", :options=>{:models=>["users", "enrollments"]}}
320
+ {:job=>"CanvasSync::Jobs::SyncAssignmentGroupsJob", :chain_link=>String, :options=>{}},
321
+ {:job=>"CanvasSync::Jobs::SyncProvisioningReportJob", :chain_link=>String, :options=>{:models=>["users", "enrollments"]}}
304
322
  ],
305
323
  :term_scope=>nil
306
324
  }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes