canvas_sync 0.22.3 → 0.22.5

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 +0 -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 +2 -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 +20 -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 +36 -2
  64. data/lib/canvas_sync/generators/templates/models/context_module_item.rb +11 -3
  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 +14 -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 +3 -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 +0 -0
  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 +15 -3
  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 +21 -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 +20 -0
  185. data/lib/canvas_sync/processors/model_mappings.yml +27 -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 +4 -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 +14 -0
  238. data/spec/canvas_sync/processors/course_completion_report_processor_spec.rb +47 -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 +36 -2
  256. data/spec/dummy/app/models/context_module_item.rb +11 -3
  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 +20 -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 +2 -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 +26 -0
  345. data/spec/dummy/db/schema.rb +15 -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 +0 -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 +3 -3
  407. data/spec/support/fixtures/reports/course_nicknames.csv +0 -0
  408. data/spec/support/fixtures/reports/course_progresses.csv +3 -0
  409. data/spec/support/fixtures/reports/course_progresses_conflict.csv +2 -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 +202 -188
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cc62b25843e2b3e57b83e1ca41b4a0e546666ce6e824a8a799f534ee90fb28c5
4
- data.tar.gz: 1fb1747c3882282894b0aa4e6fef9d7240977a453da6415e3a31460c55833306
3
+ metadata.gz: 6fbc16dd889dae43881098a80d91c68ec64412b1ce872b51f176f89a0d2ce8fe
4
+ data.tar.gz: f202ff4cae0337f6a34872654b55371b5fdfabdccd1358fc7fceb14397549425
5
5
  SHA512:
6
- metadata.gz: 3ac70536bc476c02ee262487ff7074493e99c05d585cec78a32cddb5569feb9e5ca6407a7104cf7538ed9030e4cb2401be823171de5f5e261de5bd2aeafbc11f
7
- data.tar.gz: 31178103ff1168d6a54b622c612260857c4f5841dff32c637a95877a1df3f7c4467221e05c19e7688f1ebf3284d79cc8cf5113208f89ac4299983dcaa2ccf51d
6
+ metadata.gz: 35c21c3717c63c372fd840b511b2b51161f1114b4e9f8a8140d38ee0d4ca6393950d842b9619ded9731ae32b0abda8ef147ceaacba76f8bcc77d5b6966898b9f
7
+ data.tar.gz: a1b9a4f2129f9f441786237ed2bc69ff58009343d67d74f5724376f2fc77c0797fd3f932ea404d6b993d26ba210beeeafc1a9b0ad1025ad11169ebf7767f84af
data/README.md CHANGED
@@ -242,6 +242,11 @@ class User < ApplicationRecord
242
242
  # If the column name on the report and in the DB are the same, a shorthand can be used:
243
243
  link_column :omit_from_final_grade, type: :datetime
244
244
 
245
+ # You can specify a block to pre-transform the value
246
+ link_column :column_in_report => :column_in_database do |value, row|
247
+ YAML.parse(value)
248
+ end
249
+
245
250
  # If the defaults define a column you don't want synced, you can remove it from the mapping:
246
251
  unlink_column :column_in_database
247
252
  end
data/Rakefile CHANGED
File without changes
@@ -3,7 +3,11 @@ module CanvasSync
3
3
  #
4
4
  # Use this model to track failures, job run times, and metadata about a job.
5
5
  class JobLog < ApplicationRecord
6
- serialize :job_arguments, Array
6
+ if Rails.version > '7.0'
7
+ serialize :job_arguments, type: Array
8
+ else
9
+ serialize :job_arguments, Array
10
+ end
7
11
 
8
12
  ERROR_STATUS = "error".freeze
9
13
  SUCCESS_STATUS = "success".freeze
@@ -1,5 +1,4 @@
1
1
  module CanvasSync
2
2
  class SyncBatch < ApplicationRecord
3
- serialize :job_arguments, Array
4
3
  end
5
4
  end
File without changes
data/config/routes.rb CHANGED
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
@@ -11,6 +11,8 @@ class CreateContextModules < ActiveRecord::Migration[5.1]
11
11
  t.string :workflow_state
12
12
  t.datetime :deleted_at
13
13
  t.datetime :unlock_at
14
+ t.text :completion_requirements
15
+ t.text :prerequisites
14
16
  t.timestamps
15
17
  end
16
18
 
@@ -0,0 +1,20 @@
1
+ # <%= autogenerated_migration_warning %>
2
+
3
+ class CreateCourseProgresses < ActiveRecord::Migration[5.1]
4
+ def change
5
+ create_table :course_progresses do |t|
6
+ t.bigint :canvas_course_id, null: false
7
+ t.bigint :canvas_user_id, null: false
8
+ t.integer :requirement_count
9
+ t.integer :requirement_completed_count
10
+ t.datetime :completion_date
11
+
12
+ t.timestamps
13
+ end
14
+
15
+ add_index :course_progresses, :canvas_user_id
16
+ add_index :course_progresses, :canvas_course_id
17
+ add_index :course_progresses, [:canvas_user_id, :canvas_course_id], unique: true
18
+ end
19
+ end
20
+
File without changes
@@ -14,8 +14,42 @@ class ContextModule < ApplicationRecord
14
14
  has_many :context_module_items, primary_key: :canvas_id, foreign_key: :canvas_context_module_id
15
15
  has_many :assignments, through: :context_module_items
16
16
 
17
+ serialize :completion_requirements
18
+ serialize :prerequisites
19
+
17
20
  api_syncable({
18
- # TODO If your tool Syncs ContextModules, please complete this and merge it into CanvasSync
19
- }, -> (api) { api.course_module(canvas_context_id, canvas_id) })
21
+ canvas_id: :id,
22
+ canvas_context_id: :context_id,
23
+ canvas_context_type: :context_type,
24
+ position: :position,
25
+ name: :name,
26
+ workflow_state: :workflow_state,
27
+ unlock_at: :unlock_at,
28
+ completion_requirements: :completion_requirements,
29
+ prerequisites: :prerequisites,
30
+ requirement_count: :requirement_count
31
+ }, lambda { |api|
32
+ course_modules = api.course_modules(canvas_context_id, { include: ['items'] }) # avoids having 2 API calls for modules as we reuse this data
33
+ context_module = course_modules&.detect { |course_module| course_module['id'] == canvas_id }
34
+
35
+ if context_module.nil? # no context_module here means it is deleted in Canvas
36
+ self.workflow_state = :deleted
37
+ return self
38
+ end
39
+
40
+ # The ContextModule model in Canvas has the 'completion_requirements' and 'prerequisites' fields that are not returned directly from the API
41
+ # We need to compute them here based on data that we receive from course_modules in the API
42
+ context_module['prerequisites'] = course_modules.map do |course_module|
43
+ next unless context_module['prerequisite_module_ids']&.include?(course_module['id'])
44
+
45
+ {
46
+ id: course_module['id'],
47
+ name: course_module['name'],
48
+ type: 'context_module'
49
+ }.with_indifferent_access
50
+ end.compact
20
51
 
52
+ context_module['completion_requirements'] = context_module['items']&.map { |item| item['completion_requirement'] }&.compact
53
+ context_module
54
+ })
21
55
  end
@@ -12,7 +12,15 @@ class ContextModuleItem < ApplicationRecord
12
12
  belongs_to :assignment, foreign_key: :canvas_assignment_id, primary_key: :canvas_id
13
13
 
14
14
  api_syncable({
15
- # TODO If your tool Syncs ContextModuleItems, please complete this and merge it into CanvasSync
16
- }, -> (api) { api.module_item(context_module.context.canvas_id, context_module.canvas_id, canvas_id) })
17
-
15
+ canvas_id: :id,
16
+ canvas_context_module_id: :module_id,
17
+ position: :position,
18
+ canvas_content_type: :type,
19
+ canvas_content_id: :content_id,
20
+ canvas_assignment_id: :assignment_id
21
+ }, lambda { |api|
22
+ module_item = api.module_item(context_module.context.canvas_id, context_module.canvas_id, canvas_id)
23
+ module_item['assignment_id'] = api.assignment(context_module.context.canvas_id, module_item['content_id'])['id'] if module_item['type'] == 'Assignment'
24
+ module_item
25
+ })
18
26
  end
@@ -0,0 +1,14 @@
1
+ # <%= autogenerated_model_warning %>
2
+
3
+ # CourseProgress is not a Canvas model. It is a table built from the Custom Report
4
+ class CourseProgress < ApplicationRecord
5
+ include CanvasSync::Record
6
+
7
+ canvas_sync_features :defaults
8
+
9
+ belongs_to :user, primary_key: :canvas_id, foreign_key: :canvas_user_id, optional: true
10
+ belongs_to :course, primary_key: :canvas_id, foreign_key: :canvas_course_id, optional: true
11
+
12
+ validates_presence_of :canvas_user_id, :canvas_course_id
13
+ validates_uniqueness_of :canvas_user_id, scope: :canvas_course_id
14
+ end
File without changes
File without changes
File without changes
File without changes
@@ -53,6 +53,9 @@ module CanvasSync
53
53
  # TODO: add some timezone config to the mapping.
54
54
  # In cases where the timestamp or date doesn't include a timezone, you should be able to specify one
55
55
  value = DateTime.parse(value).utc rescue nil # rubocop:disable Style/RescueModifier
56
+ elsif col_def[:type].to_sym == :yaml
57
+ # CSV parse from reading the report escapes the new lines and YAML throws an error with double backslashes
58
+ value = YAML.load(value.gsub("\\n", "\n")) rescue nil # rubocop:disable Style/RescueModifier
56
59
  end
57
60
  end
58
61
 
File without changes
File without changes
File without changes
File without changes
@@ -4,7 +4,9 @@ module CanvasSync::JobBatches
4
4
 
5
5
  attr_reader :base_job
6
6
 
7
- def initialize(base_type = SerialBatchJob)
7
+ def initialize(base_type = SerialBatchJob, chain_id: nil)
8
+ @chain_id = chain_id || SecureRandom.urlsafe_base64(10)
9
+
8
10
  if base_type.is_a?(Hash)
9
11
  @base_job = base_type
10
12
  @base_job[:args] ||= @base_job[:parameters] || []
@@ -109,7 +111,7 @@ module CanvasSync::JobBatches
109
111
  return nil if matching_jobs.count == 0
110
112
 
111
113
  job = matching_jobs[0][0]
112
- job = self.class.new(job) unless job.is_a?(ChainBuilder)
114
+ job = self.class.new(job, chain_id: @chain_id) unless job.is_a?(ChainBuilder)
113
115
  job
114
116
  end
115
117
 
@@ -118,6 +120,7 @@ module CanvasSync::JobBatches
118
120
  job_def.normalize!
119
121
  else
120
122
  job_def[:job] = job_def[:job].to_s
123
+ job_def[:chain_link] ||= "#{@chain_id}-#{SecureRandom.urlsafe_base64(10)}"
121
124
  if (chain = self.class.get_chain_parameter(job_def, raise_error: false)).present?
122
125
  chain.map! { |sub_job| normalize!(sub_job) }
123
126
  end
@@ -138,7 +141,7 @@ module CanvasSync::JobBatches
138
141
  args: args,
139
142
  kwargs: kwargs,
140
143
  }
141
- self.class.new(hsh).apply_block(&blk) if blk.present?
144
+ self.class.new(hsh, chain_id: @chain_id).apply_block(&blk) if blk.present?
142
145
  hsh
143
146
  end
144
147
 
@@ -239,6 +242,24 @@ module CanvasSync::JobBatches
239
242
  job_class.perform_later(*job_args, **job_kwargs)
240
243
  end
241
244
  end
245
+
246
+ def link_to_batch!(chain_link, batch)
247
+ # Or make chains a separate entity - Chains show batches, but batches don't show chain?
248
+ # Or "Annotate" a Batch with chain data - could extract chain id from any job entry
249
+ end
250
+
251
+ def annotate_batch!(batch, chain)
252
+
253
+ end
254
+
255
+ def handle_step_complete(status, opts)
256
+ chain_link = opts[:chain_link]
257
+ chain_id, chain_step_id = chain_link.split('-')
258
+
259
+ CanvasSync::JobBatches::Batch.redis.multi do |r|
260
+ r.hset("CHAIN-#{chain_id}-steps", chain_step_id, "complete")
261
+ end
262
+ end
242
263
  end
243
264
  end
244
265
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -144,6 +144,10 @@ module CanvasSync::JobBatches
144
144
  if next_job[:chain_link].present?
145
145
  # Annotate Batch with chain-step info
146
146
  batch.context["csb:chain_link"] = next_job[:chain_link]
147
+ # TODO Add Fiber Batch to chain-link
148
+ # With the exception of the top of the Chain, all nested ManagedBatch Roots should be within a Fiber,
149
+ # so we shouldn't really need to make the Root checkin with the chain
150
+ # ...except to cleanup the chain
147
151
  batch.on(:complete, "#{ChainBuilder.to_s}.chain_step_complete", chain_link: next_job[:chain_link])
148
152
  end
149
153
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -49,6 +49,7 @@ module CanvasSync::JobBatches
49
49
  end
50
50
 
51
51
  def success?
52
+ # TODO (Race Condition) This might not be valid if checked from a :complete callback
52
53
  'true' == Batch.redis { |r| r.hget("BID-#{bid}", 'success') }
53
54
  end
54
55
 
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -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
File without changes
File without changes
File without changes