canvas_sync 0.22.11 → 0.22.12.beta1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2bbd02c6460435a1bb3bc0c33c997d60c09c8f0fffbc8afe8292cbc855d51306
4
- data.tar.gz: 99f488b171bb99dd51b1f20b4d39963f0f94624a5decf96b9e8d270355efe5b4
3
+ metadata.gz: 76f6f3637d9ecdc189ecc30fdac1016655a43d0bd86af95e4662c000a96a8210
4
+ data.tar.gz: 573116e847a84823a69a293266f29a47c9979a9ad3207177702657a796ed5310
5
5
  SHA512:
6
- metadata.gz: eed8224aa09c93c4d95db72db479edd40e3a75faa5f548e208b99afffb43b453de8b4a00202ffe01f1c7c8b2c6a2c11b978f203e5a406760e61236a0bfa7e372
7
- data.tar.gz: 58e2541a97e2885bea180b30ad9ae8af85c074c635dc12ec309985685dd74de48ccadca81d87ec8791d0b4b5691b11eb198e47a2c9ad18e6b64c4f7fdf126320
6
+ metadata.gz: 44ae47c098f47555afee2d9bdcbba35b8ac7afbf5dadbece224c133ffefccd4efb32023d0b38a698f48e9cb24427e07ce7cc6ed34cbcc0181c80ec7bc38a430c
7
+ data.tar.gz: 05347f7d9b3f0950c05ae6af133d7ea6d0e9237b8fa4f7872faa4fc93233e5ed4aa9050955f90515744fb15fd8d8f52112a813c08151e848c918c4135741d8b3
@@ -3,27 +3,95 @@ module CanvasSync::Concerns
3
3
  module LiveEventSync
4
4
  extend ActiveSupport::Concern
5
5
 
6
+ mattr_accessor :registered_models
7
+ self.registered_models = []
8
+
9
+ def self.register_model(model)
10
+ self.registered_models << model
11
+ end
12
+
13
+ def self.lookup_event_model(event_model)
14
+ self.registered_models.each do |model|
15
+ event_prefix = model.live_events_config[:event_prefix].presence || model.name.underscore
16
+ return model if event_model == event_prefix
17
+ end
18
+ nil
19
+ end
20
+
21
+ def self.split_event_name(event_name)
22
+ model, _, subtype = event_name.rpartition('_')
23
+ [model, subtype.to_sym]
24
+ end
25
+
6
26
  included do
7
27
  define_model_callbacks :process_live_event
28
+ CanvasSync::Concerns::LiveEventSync.register_model(self)
8
29
  end
9
30
 
31
+ VALID_CONFIG_KEYS = %i[event_prefix key].freeze
32
+
10
33
  class_methods do
34
+ def live_events_config(**kwargs)
35
+ @live_events_config ||= {}
36
+ if kwargs.present?
37
+ raise ArgumentError, "Invalid keys: #{kwargs.keys - VALID_CONFIG_KEYS}" if (kwargs.keys - VALID_CONFIG_KEYS).present?
38
+ @live_events_config.merge!(kwargs)
39
+ end
40
+ @live_events_config
41
+ end
42
+
11
43
  def cs_internal_process_live_event(event)
12
44
  meta = event[:metadata]
13
45
  payload = event[:payload] || event[:body]
14
46
 
15
- model, _, subtype = meta[:event_name].rpartition('_')
16
- canvas_id = payload[:id] || payload[:"#{model}_id"] || payload[:"#{name.underscore}_id"]
17
- inst = self.find_or_initialize_by(canvas_id: canvas_id)
47
+ model, subtype = CanvasSync::Concerns::LiveEventSync.split_event_name(meta[:event_name])
48
+ cfg = self.live_events_config
49
+
50
+ Thread.current[:cs_current_live_event] = {
51
+ event: meta[:event_name],
52
+ type: model,
53
+ action: subtype,
54
+ meta: meta,
55
+ payload: payload,
56
+ }
57
+
58
+ pkey = cfg[:key]
59
+ if pkey.present?
60
+ if pkey.is_a?(Symbol)
61
+ lookup = payload[pkey]
62
+ elsif pkey.is_a?(Proc)
63
+ lookup = pkey.call(payload, meta)
64
+ end
65
+ else
66
+ lookup = payload[:id]
67
+ lookup ||= payload[:"#{cfg[:event_prefix]}_id"] if cfg[:event_prefix].present?
68
+ lookup ||= payload[:"#{model}_id"]
69
+ lookup ||= payload[:"#{name.underscore}_id"]
70
+ end
71
+
72
+ if lookup.is_a?(String) || lookup.is_a?(Numeric)
73
+ lookup = { canvas_id: lookup }
74
+ end
75
+
76
+ if lookup.is_a?(Hash)
77
+ inst = self.find_or_initialize_by(**lookup)
78
+ elsif lookup.is_a?(ActiveRecord::Base)
79
+ inst = lookup
80
+ end
18
81
 
19
82
  result = inst.run_callbacks(:process_live_event) do
20
- inst.process_live_event(subtype.to_sym, payload, meta)
83
+ inst.process_live_event(subtype, payload, meta)
21
84
  end
22
85
 
23
86
  inst.save! if result != false && inst.changed?
87
+ Thread.current[:cs_current_live_event] = nil
24
88
  end
25
89
  end
26
90
 
91
+ def current_live_event
92
+ Thread.current[:cs_current_live_event]
93
+ end
94
+
27
95
  def process_live_event(event_type, payload, metadata)
28
96
  if self.has_attribute?(:workflow_state) && payload['workflow_state'].present? && payload['workflow_state'] == 'deleted'
29
97
  # API will respond with 404, so just update the workflow_state
@@ -41,8 +109,8 @@ module CanvasSync::Concerns
41
109
 
42
110
  event_type = meta[:event_name]
43
111
 
44
- model, _, subtype = event_type.rpartition('_')
45
- mcls = model.classify.constantize rescue nil
112
+ model, subtype = split_event_name(event_type)
113
+ mcls = lookup_event_model(model)
46
114
 
47
115
  if mcls.present? && mcls < LiveEventSync
48
116
  mcls.cs_internal_process_live_event(event)
@@ -1,5 +1,5 @@
1
- import { h, Component, render } from 'https://unpkg.com/preact?module';
2
- import htm from 'https://unpkg.com/htm?module';
1
+ import { h, Component, render } from 'https://esm.sh/preact';
2
+ import htm from 'https://esm.sh/htm';
3
3
  import { root_url } from './util.js';
4
4
 
5
5
  // Initialize htm with Preact
@@ -5,9 +5,9 @@ module CanvasSync::JobBatches
5
5
  def self.make_batch(sub_jobs, **kwargs, &blk)
6
6
  ManagedBatchJob.make_batch(
7
7
  sub_jobs,
8
+ concurrency: true,
8
9
  **kwargs,
9
10
  ordered: false,
10
- concurrency: true,
11
11
  desc_prefix: 'ConcurrentBatchJob: ',
12
12
  &blk
13
13
  )
@@ -19,14 +19,14 @@ module CanvasSync
19
19
  end
20
20
  end
21
21
 
22
- JobBatches::ManagedBatchJob.make_batch(jobs, ordered: false, concurrency: true) do |b|
22
+ JobBatches::ManagedBatchJob.make_batch(jobs, ordered: false, concurrency: 8) do |b|
23
23
  b.description = "TermBatchJob(#{term_id}) Root"
24
24
  b.context = local_context
25
25
  b.on(:success, "#{self.class.to_s}.batch_finished") unless options[:mark_synced] == false
26
26
  end
27
27
  end
28
28
  else
29
- JobBatches::ConcurrentBatchJob.make_batch(jobs, context: context)
29
+ JobBatches::ConcurrentBatchJob.make_batch(jobs, context: context, concurrency: 8)
30
30
  end
31
31
  end
32
32
  end
@@ -10,7 +10,7 @@ module CanvasSync::LiveEvents
10
10
  legacy_handler.perform_later(event)
11
11
  return
12
12
  rescue LoadError, NameError => e
13
- Rails.logger.error("Error accessing legacy-style LiveEvents handler #{e}, #{event}")
13
+ # Rails.logger.error("Error accessing legacy-style LiveEvents handler #{e}, #{event}")
14
14
  end
15
15
 
16
16
  handlers = CanvasSync::LiveEvents.registered_handlers
@@ -1,3 +1,3 @@
1
1
  module CanvasSync
2
- VERSION = "0.22.11".freeze
2
+ VERSION = "0.22.12.beta1".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: canvas_sync
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.22.11
4
+ version: 0.22.12.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Instructure CustomDev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-03-19 00:00:00.000000000 Z
11
+ date: 2025-03-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails