tantot 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a1aca7d8b60134dc22beb994d5d51caabd6b98f9
4
- data.tar.gz: c561b19426b24a5650ff23b092274f0212b0e1ff
3
+ metadata.gz: 56725354395a9033cc635de74a735b73edac40b3
4
+ data.tar.gz: f5a41a93122899cb7ee27946a18a50a6b7fec825
5
5
  SHA512:
6
- metadata.gz: 382ba5b261e10b733db81f5d24c1900292666d70de3aa17cacbc6238dff566a68d7fd9caf4238f2d4609e0cfed015ac1c20f11c8e5f34af0cc73eb4ff991981e
7
- data.tar.gz: 1c2799e8e61ae8acecf7c53c38cefbf2b1104bb12e62f7dc6e7884537f732ca3bb5a83255902419ca31103a5a1193db695f5034f2111b04adf861c9c752f2d20
6
+ metadata.gz: 97e9aad665296f329b93269feb68ba1e6e3aecd099e3b91bc9fe60f3f91fc4f88dbaa4e32b9958e4ad7d4ac55950896b308d81cd6823144975b85033eeded7ce
7
+ data.tar.gz: 195da978eb98c9accd59e17b2679012a8e74bbb6bf33092e21cff06f909c3fbac9fa6fd57345ae1b613ab4c6046a664d578437ed52f835fe0080107def78f3fa
data/Gemfile CHANGED
@@ -4,3 +4,4 @@ source 'https://rubygems.org'
4
4
  gemspec
5
5
 
6
6
  gem 'sidekiq', require: false
7
+ gem 'chewy', require: false
@@ -0,0 +1,46 @@
1
+ module Tantot
2
+ module Collector
3
+ class Base
4
+ class_attribute :context_key
5
+
6
+ def self.manages?(context)
7
+ context.key?(self.context_key)
8
+ end
9
+
10
+ def register_watch(context, block)
11
+ raise NotImplementedError
12
+ end
13
+
14
+ def push(context, instance, mutations)
15
+ formatter = Tantot::Formatter.resolve(context[:options][:format] || Tantot.config.format).new
16
+ attribute_hash = get_stash(context, instance)
17
+ mutations.each do |attr, changes|
18
+ attribute_hash[attr] = formatter.push(attribute_hash[attr], context, changes)
19
+ end
20
+ end
21
+
22
+ def sweep(performer_name)
23
+ if @stash.any?
24
+ Tantot.logger.debug { "[Tantot] [Sweeping] [#{self.class.name.demodulize}] #{debug_state}" }
25
+ @stash.each do |id, changes|
26
+ context = Tantot.registry.watch_config[id][:context]
27
+ performer = Tantot::Performer.resolve(performer_name || context[:options][:performer] || Tantot.config.performer).new
28
+ Tantot.logger.debug { "[Tantot] [Performer] [#{self.class.name.demodulize}] [#{performer.class.name.demodulize}] #{debug_state(Hash[id, changes])}" }
29
+ performer.run(context, changes)
30
+ end
31
+ @stash.clear
32
+ end
33
+ end
34
+
35
+ def debug_changes_for_model(model, changes_by_id)
36
+ "#{model.name}#{changes_by_id.keys.inspect}"
37
+ end
38
+
39
+ protected
40
+
41
+ def get_stash(context, instance)
42
+ raise NotImplementedError
43
+ end
44
+ end
45
+ end
46
+ end
@@ -1,9 +1,7 @@
1
1
  module Tantot
2
2
  module Collector
3
- class Block
4
- def self.manages?(context)
5
- context.key?(:block_id)
6
- end
3
+ class Block < Base
4
+ self.context_key = :block_id
7
5
 
8
6
  def initialize
9
7
  @stash = Hash.new do |block_id_hash, block_id|
@@ -17,22 +15,6 @@ module Tantot
17
15
  Tantot.registry.watch_config[context[:block_id]] = {context: context, block: block}
18
16
  end
19
17
 
20
- def push(context, instance, mutations)
21
- options = context.fetch(:options, {})
22
- formatter = Tantot::Formatter.resolve(options[:format] || Tantot.config.default_watcher_options[:format]).new
23
- attribute_hash = @stash[context[:block_id]][instance.id]
24
- mutations.each do |attr, changes|
25
- attribute_hash[attr] = formatter.push(attribute_hash[attr], context, changes)
26
- end
27
- end
28
-
29
- def sweep(performer, context = {})
30
- @stash.each do |block_id, changes|
31
- performer.run({block_id: block_id}, changes)
32
- end
33
- @stash.clear
34
- end
35
-
36
18
  def perform(context, changes_by_id)
37
19
  watch_config = Tantot.registry.watch_config[context[:block_id]]
38
20
  watch_config[:context][:model].instance_exec(Tantot::Changes::ById.new(changes_by_id), &watch_config[:block])
@@ -60,17 +42,26 @@ module Tantot
60
42
  debug_block(block)
61
43
  end
62
44
 
63
- def debug_state(context)
64
- return false if @stash.empty?
65
- @stash.collect do |block_id, changes_by_id|
45
+ def debug_changes(watch_config, changes_by_id)
46
+ "#{debug_changes_for_model(watch_config[:context][:model], changes_by_id)} for #{debug_block(watch_config[:block])}"
47
+ end
48
+
49
+ def debug_state(stash = @stash)
50
+ stash.collect do |block_id, changes_by_id|
66
51
  watch_config = Tantot.registry.watch_config[block_id]
67
- "#{watch_config[:context][:model].name}*#{changes_by_id.size} for #{debug_block(watch_config[:block])}"
52
+ debug_changes(watch_config, changes_by_id)
68
53
  end.join(" / ")
69
54
  end
70
55
 
71
56
  def debug_perform(context, changes_by_id)
72
57
  watch_config = Tantot.registry.watch_config[context[:block_id]]
73
- "#{watch_config[:context][:model].name}*#{changes_by_id.size} for #{debug_block(watch_config[:block])}"
58
+ debug_changes(watch_config, changes_by_id)
59
+ end
60
+
61
+ protected
62
+
63
+ def get_stash(context, instance)
64
+ @stash[context[:block_id]][instance.id]
74
65
  end
75
66
 
76
67
  end
@@ -1,9 +1,7 @@
1
1
  module Tantot
2
2
  module Collector
3
- class Watcher
4
- def self.manages?(context)
5
- context.key?(:watcher)
6
- end
3
+ class Watcher < Base
4
+ self.context_key = :watcher
7
5
 
8
6
  def initialize
9
7
  @stash = Hash.new do |watcher_hash, watcher|
@@ -16,30 +14,7 @@ module Tantot
16
14
  end
17
15
 
18
16
  def register_watch(context, block)
19
- # nop
20
- end
21
-
22
- def push(context, instance, mutations)
23
- watcher = context[:watcher]
24
- model = context[:model]
25
- formatter = Tantot::Formatter.resolve(watcher.watcher_options[:format]).new
26
- attribute_hash = @stash[watcher][model][instance.id]
27
- mutations.each do |attr, changes|
28
- attribute_hash[attr] = formatter.push(attribute_hash[attr], context, changes)
29
- end
30
- end
31
-
32
- def sweep(performer, context = {})
33
- watcher = context[:watcher]
34
- filtered_stash = watcher ? @stash.select {|w, _c| w == watcher} : @stash
35
- filtered_stash.each do |w, changes_by_model|
36
- performer.run({watcher: w}, changes_by_model)
37
- end
38
- if watcher
39
- @stash.delete(watcher)
40
- else
41
- @stash.clear
42
- end
17
+ Tantot.registry.watch_config[context[:watcher]] = {context: context}
43
18
  end
44
19
 
45
20
  def perform(context, changes_by_model)
@@ -64,22 +39,27 @@ module Tantot
64
39
  end
65
40
 
66
41
  def debug_context(context)
67
- context[:watcher].name.demodulize
42
+ context[:watcher].name
68
43
  end
69
44
 
70
- def debug_state(context)
71
- return false if @stash.empty?
72
- @stash.collect do |watcher, changes_by_model|
73
- "#{watcher.name}[#{changes_by_model.collect do |model, changes_by_id|
74
- "#{model.name}*#{changes_by_id.size}"
75
- end.join("&")}]"
76
- end.flatten.join(" / ")
45
+ def debug_changes(watcher, changes_by_model)
46
+ "#{watcher.name}(#{changes_by_model.collect {|model, changes_by_id| debug_changes_for_model(model, changes_by_id)}.join(" & ")})"
47
+ end
48
+
49
+ def debug_state(stash = @stash)
50
+ stash.collect {|watcher, changes_by_model| debug_changes(watcher, changes_by_model)}.flatten.join(" / ")
77
51
  end
78
52
 
79
53
  def debug_perform(context, changes_by_model)
80
- "#{context[:watcher].name}[#{changes_by_model.collect do |model, changes_by_id|
81
- "#{model.name}*#{changes_by_id.size}"
82
- end.join("&")}]"
54
+ debug_changes(context[:watcher], changes_by_model)
55
+ end
56
+
57
+ protected
58
+
59
+ def get_stash(context, instance)
60
+ watcher = context[:watcher]
61
+ model = context[:model]
62
+ @stash[watcher][model][instance.id]
83
63
  end
84
64
 
85
65
  end
@@ -1,3 +1,4 @@
1
+ require 'tantot/collector/base'
1
2
  require 'tantot/collector/watcher'
2
3
  require 'tantot/collector/block'
3
4
 
@@ -27,24 +28,16 @@ module Tantot
27
28
  "[Tantot] [Collecting] [#{collector.class.name.demodulize}] #{mutate} on <#{instance.class.name}:#{instance.id}> for <#{collector.debug_context(context)}>"
28
29
  end
29
30
  collector.push(context, instance, mutations)
30
- sweep(context.merge(performer: :inline)) if Tantot.config.console_mode
31
+ sweep if Tantot.config.sweep_on_push
31
32
  end
32
33
 
33
- def sweep(context = {})
34
- performer = Tantot::Performer.resolve(context[:performer] || Tantot.config.performer).new
35
- specific_collector = resolve(context)
36
- collectors = specific_collector ? [specific_collector] : @collectors.values
37
- collectors.each do |collector|
38
- if Tantot.logger.debug? && (debug_state = collector.debug_state(context))
39
- Tantot.logger.debug { "[Tantot] [Sweeping] [#{collector.class.name.demodulize}] [#{performer.class.name.demodulize}] #{debug_state}" }
40
- end
41
- collector.sweep(performer, context)
42
- end
34
+ def sweep(performer_name = nil)
35
+ @collectors.values.each {|collector| collector.sweep(performer_name)}
43
36
  end
44
37
 
45
38
  def perform(context, changes)
46
39
  collector = resolve!(context)
47
- Tantot.logger.debug { "[Tantot] [Performing] [#{collector.class.name.demodulize}] #{collector.debug_perform(context, changes)}" }
40
+ Tantot.logger.debug { "[Tantot] [Run] [#{collector.class.name.demodulize}] #{collector.debug_perform(context, changes)}" }
48
41
  collector.perform(context, changes)
49
42
  end
50
43
 
data/lib/tantot/config.rb CHANGED
@@ -2,16 +2,13 @@ module Tantot
2
2
  class Config
3
3
  include Singleton
4
4
 
5
- attr_accessor :performer, :use_after_commit_callbacks, :default_watcher_options, :console_mode, :chewy_strategy
5
+ attr_accessor :performer, :format, :use_after_commit_callbacks, :sweep_on_push
6
6
 
7
7
  def initialize
8
8
  @performer = :inline
9
+ @format = :compact
9
10
  @use_after_commit_callbacks = true
10
- @default_watcher_options = {
11
- format: :compact
12
- }
13
- @console_mode = false
14
- @chewy_strategy = :atomic
11
+ @sweep_on_push = false
15
12
  end
16
13
  end
17
14
  end
@@ -26,6 +26,8 @@ module Tantot
26
26
  class ChewyWatcher
27
27
  include Tantot::Watcher
28
28
 
29
+ watcher_options performer: :chewy
30
+
29
31
  def perform(changes_by_model)
30
32
  changes_by_model.each do |model, changes_by_id|
31
33
  model_watches = model._tantot_chewy_callbacks
@@ -70,11 +72,8 @@ module Tantot
70
72
 
71
73
  # Make sure there are any backreferences
72
74
  if backreference.any?
73
- # Call update_index, will follow normal chewy strategy
74
- ::Chewy.strategy Tantot.config.chewy_strategy do
75
- Tantot.logger.debug { "[Tantot] [Chewy] [update_index] #{reference} (#{backreference.count} objects): #{backreference.inspect}" }
76
- ::Chewy.derive_type(reference).update_index(backreference, options)
77
- end
75
+ Tantot.logger.debug { "[Tantot] [Chewy] [update_index] #{reference} (#{backreference.count} objects): #{backreference.inspect}" }
76
+ ::Chewy.derive_type(reference).update_index(backreference, options)
78
77
  end
79
78
  end
80
79
 
@@ -61,7 +61,10 @@ module Tantot
61
61
  options: options
62
62
  }
63
63
 
64
- context[:watcher] = watcher if watcher
64
+ if watcher
65
+ context[:watcher] = watcher
66
+ options.reverse_merge!(watcher.watcher_options)
67
+ end
65
68
  context[:block_id] = CityHash.hash64(block.source_location.collect(&:to_s).join) if block_given?
66
69
 
67
70
  Tantot.collector.register_watch(context, block)
@@ -0,0 +1,31 @@
1
+ module Tantot
2
+ module Performer
3
+ class Chewy
4
+ class Worker
5
+ include ::Sidekiq::Worker
6
+
7
+ def perform(context, changes)
8
+ context, changes = Tantot.collector.unmarshal(context, changes)
9
+ ::Chewy.strategy(Tantot.config.chewy_strategy) do
10
+ Tantot.collector.perform(context, changes)
11
+ end
12
+ end
13
+ end
14
+
15
+ def run(context, changes)
16
+ case ::Chewy.strategy.current.name
17
+ when :atomic, :urgent
18
+ Tantot::Performer::Inline.new.run(context, changes)
19
+ when /sidekiq/
20
+ context, changes = Tantot.collector.marshal(context, changes)
21
+ Tantot::Performer::Chewy::Worker.perform_async(context, changes)
22
+ when :bypass
23
+ return
24
+ else
25
+ # No strategy defined, do an Inline run and let Chewy fail
26
+ Tantot::Performer::Inline.new.run(context, changes)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -1,6 +1,13 @@
1
1
  require 'tantot/performer/bypass'
2
2
  require 'tantot/performer/inline'
3
3
 
4
+ begin
5
+ require 'chewy'
6
+ require 'tantot/performer/chewy'
7
+ rescue LoadError
8
+ nil
9
+ end
10
+
4
11
  begin
5
12
  require 'sidekiq'
6
13
  require 'tantot/performer/sidekiq'
@@ -12,7 +12,7 @@ module Tantot
12
12
 
13
13
  console do |app|
14
14
  # Will sweep after every push (unfortunately)
15
- Tantot.config.console_mode = true
15
+ Tantot.config.sweep_on_push = true
16
16
  end
17
17
 
18
18
  initializer 'tantot.request_strategy' do |app|
@@ -1,3 +1,3 @@
1
1
  module Tantot
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
@@ -8,7 +8,7 @@ module Tantot
8
8
 
9
9
  class_methods do
10
10
  def watcher_options(opts = {})
11
- self.watcher_options_hash ||= Tantot::Config.instance.default_watcher_options
11
+ self.watcher_options_hash ||= {}
12
12
  self.watcher_options_hash = self.watcher_options_hash.merge(opts)
13
13
  end
14
14
  end
@@ -1,127 +1,140 @@
1
1
  require "spec_helper"
2
2
 
3
- describe Tantot::Extensions::Chewy do
3
+ if defined?(::Chewy)
4
4
 
5
- # Stub the Chewy namespace
6
- before do
7
- stub_const("Chewy", {})
8
- end
5
+ describe Tantot::Extensions::Chewy do
9
6
 
10
- [nil, :self, :class_method, :block].product([:some, :all]).each do |backreference_opt, attribute_opt|
11
- it "should update indexes using backreference: #{backreference_opt.inspect}, attributes: #{attribute_opt}" do
12
- chewy_type = double
7
+ [nil, :self, :class_method, :block].product([:some, :all]).each do |backreference_opt, attribute_opt|
8
+ it "should update indexes using backreference: #{backreference_opt.inspect}, attributes: #{attribute_opt}" do
9
+ chewy_type = double
13
10
 
14
- watch_index_params = ['foo']
15
- watch_index_params << :id if attribute_opt == :some
11
+ watch_index_params = ['foo']
12
+ watch_index_params << :id if attribute_opt == :some
16
13
 
17
- block_callback = proc do |changes|
18
- self.yielded_changes = changes
19
- [1, 2, 3]
20
- end
14
+ block_callback = proc do |changes|
15
+ self.yielded_changes = changes
16
+ [1, 2, 3]
17
+ end
21
18
 
22
- case backreference_opt
23
- when nil, :block
24
- when :self
25
- watch_index_params << {method: :self}
26
- when :class_method
27
- watch_index_params << {method: :class_get_ids}
28
- end
19
+ case backreference_opt
20
+ when nil, :block
21
+ when :self
22
+ watch_index_params << {method: :self}
23
+ when :class_method
24
+ watch_index_params << {method: :class_get_ids}
25
+ end
29
26
 
30
- stub_model(:city) do
31
- class_attribute :yielded_changes
27
+ stub_model(:city) do
28
+ class_attribute :yielded_changes
32
29
 
33
- if backreference_opt == :block
34
- watch_index(*watch_index_params, &block_callback)
35
- else
36
- watch_index(*watch_index_params)
37
- end
30
+ if backreference_opt == :block
31
+ watch_index(*watch_index_params, &block_callback)
32
+ else
33
+ watch_index(*watch_index_params)
34
+ end
38
35
 
39
- def self.class_get_ids(changes)
40
- self.yielded_changes = changes
41
- [1, 2, 3]
36
+ def self.class_get_ids(changes)
37
+ self.yielded_changes = changes
38
+ [1, 2, 3]
39
+ end
42
40
  end
43
- end
44
41
 
45
- city1 = city2 = nil
42
+ city1 = city2 = nil
46
43
 
47
- Tantot.collector.run do
48
- city1 = City.create!
49
- city2 = City.create!
44
+ Tantot.collector.run do
45
+ city1 = City.create!
46
+ city2 = City.create!
50
47
 
51
- # Stub the integration point between us and Chewy
52
- expect(Chewy).to receive(:strategy).with(:atomic).and_yield
53
- expect(Chewy).to receive(:derive_type).with('foo').and_return(chewy_type)
48
+ # Stub the integration point between us and Chewy
49
+ expect(Chewy).to receive(:derive_type).with('foo').and_return(chewy_type)
54
50
 
55
- # Depending on backreference
56
- case backreference_opt
57
- when nil, :self
58
- # Implicit and self reference will update with the created model id
59
- expect(chewy_type).to receive(:update_index).with([city1.id, city2.id], {})
60
- when :class_method, :block
61
- # Validate that the returned ids are updated
62
- expect(chewy_type).to receive(:update_index).with([1, 2, 3], {})
51
+ # Depending on backreference
52
+ case backreference_opt
53
+ when nil, :self
54
+ # Implicit and self reference will update with the created model id
55
+ expect(chewy_type).to receive(:update_index).with([city1.id, city2.id], {})
56
+ when :class_method, :block
57
+ # Validate that the returned ids are updated
58
+ expect(chewy_type).to receive(:update_index).with([1, 2, 3], {})
59
+ end
63
60
  end
61
+
62
+ # Make sure the callbacks received the changes
63
+ if [:class_method, :block].include?(backreference_opt)
64
+ expect(City.yielded_changes).to eq(Tantot::Changes::ById.new({city1.id => {"id" => [nil, city1.id]}, city2.id => {"id" => [nil, city2.id]}}))
65
+ end
66
+
64
67
  end
68
+ end
69
+
70
+ it "should allow registering an index watch on self (all attributes, destroy)" do
71
+ chewy_type = double
65
72
 
66
- # Make sure the callbacks received the changes
67
- if [:class_method, :block].include?(backreference_opt)
68
- expect(City.yielded_changes).to eq(Tantot::Changes::ById.new({city1.id => {"id" => [nil, city1.id]}, city2.id => {"id" => [nil, city2.id]}}))
73
+ stub_model(:city) do
74
+ watch_index 'foo'
69
75
  end
70
76
 
71
- end
72
- end
77
+ city = City.create!
78
+ Tantot.collector.sweep(:bypass)
73
79
 
74
- it "should allow registering an index watch on self (all attributes, destroy)" do
75
- chewy_type = double
80
+ Tantot.collector.run do
81
+ city.destroy
76
82
 
77
- stub_model(:city) do
78
- watch_index 'foo'
83
+ expect(Chewy).to receive(:derive_type).with('foo').and_return(chewy_type)
84
+ expect(chewy_type).to receive(:update_index).with([city.id], {})
85
+ end
79
86
  end
80
87
 
81
- city = City.create!
82
- Tantot.collector.sweep(performer: :bypass)
88
+ it "should allow registering an index watch on self (all attributes, destroy, block)" do
89
+ chewy_type = double
83
90
 
84
- Tantot.collector.run do
85
- city.destroy
91
+ stub_model(:city) do
92
+ watch_index 'foo' do |changes|
93
+ changes.ids
94
+ end
95
+ end
86
96
 
87
- expect(Chewy).to receive(:strategy).with(:atomic).and_yield
88
- expect(Chewy).to receive(:derive_type).with('foo').and_return(chewy_type)
89
- expect(chewy_type).to receive(:update_index).with([city.id], {})
90
- end
91
- end
97
+ city = City.create!
98
+ Tantot.collector.sweep(:bypass)
92
99
 
93
- it "should allow registering an index watch on self (all attributes, destroy, block)" do
94
- chewy_type = double
100
+ Tantot.collector.run do
101
+ city.destroy
95
102
 
96
- stub_model(:city) do
97
- watch_index 'foo' do |changes|
98
- changes.ids
103
+ expect(Chewy).to receive(:derive_type).with('foo').and_return(chewy_type)
104
+ expect(chewy_type).to receive(:update_index).with([city.id], {})
99
105
  end
100
106
  end
101
107
 
102
- city = City.create!
103
- Tantot.collector.sweep(performer: :bypass)
108
+ it "should allow returning nothing in a callback" do
109
+ stub_model(:city) do
110
+ watch_index('foo') { 1 if false }
111
+ watch_index('bar') { [] }
112
+ watch_index('baz') { nil }
113
+ end
104
114
 
105
- Tantot.collector.run do
106
- city.destroy
115
+ Tantot.collector.run do
116
+ City.create!
107
117
 
108
- expect(Chewy).to receive(:strategy).with(:atomic).and_yield
109
- expect(Chewy).to receive(:derive_type).with('foo').and_return(chewy_type)
110
- expect(chewy_type).to receive(:update_index).with([city.id], {})
118
+ expect(Chewy).not_to receive(:derive_type)
119
+ end
111
120
  end
112
121
  end
113
122
 
114
- it "should allow returning nothing in a callback" do
115
- stub_model(:city) do
116
- watch_index('foo') { 1 if false }
117
- watch_index('bar') { [] }
118
- watch_index('baz') { nil }
123
+ describe "Chewy.strategy" do
124
+ before do
125
+ allow(Tantot.config).to receive(:sweep_on_push).and_return(true)
119
126
  end
120
127
 
121
- Tantot.collector.run do
122
- City.create!
128
+ it "should bypass if Chewy.strategy is :bypass" do
129
+ stub_model(:city) do
130
+ watch_index('foo')
131
+ end
123
132
 
124
133
  expect(Chewy).not_to receive(:derive_type)
134
+ Chewy.strategy :bypass do
135
+ City.create!
136
+ end
125
137
  end
126
138
  end
139
+
127
140
  end
data/spec/sidekiq_spec.rb CHANGED
@@ -31,7 +31,13 @@ if defined?(::Sidekiq)
31
31
  City.create name: 'foo'
32
32
  end
33
33
  expect(Tantot::Performer::Sidekiq::Worker.jobs.size).to eq(1)
34
- expect(Tantot::Performer::Sidekiq::Worker.jobs.first["args"]).to eq([{"watcher" => "SidekiqWatcher", "collector_class" => "Tantot::Collector::Watcher"}, {"City" => {"1" => {"name" => [nil, 'foo']}}}])
34
+ expect(Tantot::Performer::Sidekiq::Worker.jobs.first["args"]).to eq([{
35
+ "model" => "City",
36
+ "attributes" => ["name"],
37
+ "options" => {},
38
+ "watcher" => "SidekiqWatcher",
39
+ "collector_class" => "Tantot::Collector::Watcher"},
40
+ {"City" => {"1" => {"name" => [nil, 'foo']}}}])
35
41
  end
36
42
 
37
43
  it "should call the watcher" do
@@ -49,7 +55,7 @@ if defined?(::Sidekiq)
49
55
  # Create a model, then sweep. It should have called perform wihtout triggering a sidekiq worker
50
56
  city = City.create name: 'foo'
51
57
  expect_any_instance_of(SidekiqWatcher).to receive(:perform).with(Tantot::Changes::ByModel.new({City => {city.id => {"name" => [nil, 'foo']}}}))
52
- Tantot.collector.sweep(performer: :inline, watcher: SidekiqWatcher)
58
+ Tantot.collector.sweep(:inline)
53
59
  expect(Tantot::Performer::Sidekiq::Worker.jobs.size).to eq(0)
54
60
 
55
61
  # Further modifications should trigger through sidekiq when exiting the strategy block
@@ -57,7 +63,13 @@ if defined?(::Sidekiq)
57
63
  city.save
58
64
  end
59
65
  expect(Tantot::Performer::Sidekiq::Worker.jobs.size).to eq(1)
60
- expect(Tantot::Performer::Sidekiq::Worker.jobs.first["args"]).to eq([{"watcher" => "SidekiqWatcher", "collector_class" => "Tantot::Collector::Watcher"}, {"City" => {"1" => {"name" => ['foo', 'bar']}}}])
66
+ expect(Tantot::Performer::Sidekiq::Worker.jobs.first["args"]).to eq([{
67
+ "model" => "City",
68
+ "attributes" => ["name"],
69
+ "options" => {},
70
+ "watcher" => "SidekiqWatcher",
71
+ "collector_class" => "Tantot::Collector::Watcher"},
72
+ {"City" => {"1" => {"name" => ['foo', 'bar']}}}])
61
73
  end
62
74
  end
63
75
  end
@@ -81,7 +93,13 @@ if defined?(::Sidekiq)
81
93
  end
82
94
  expect(Tantot::Performer::Sidekiq::Worker.jobs.size).to eq(1)
83
95
  block_id = Tantot.registry.watch_config.keys.last
84
- expect(Tantot::Performer::Sidekiq::Worker.jobs.first["args"]).to eq([{"block_id" => block_id, "collector_class" => "Tantot::Collector::Block"}, {"1" => {"name" => [nil, 'foo']}}])
96
+ expect(Tantot::Performer::Sidekiq::Worker.jobs.first["args"]).to eq([{
97
+ "model" => "City",
98
+ "attributes" => ["name"],
99
+ "options" => {},
100
+ "block_id" => block_id,
101
+ "collector_class" => "Tantot::Collector::Block"},
102
+ {"1" => {"name" => [nil, 'foo']}}])
85
103
  end
86
104
 
87
105
  it "should call the watcher" do
data/spec/tantot_spec.rb CHANGED
@@ -64,7 +64,7 @@ describe Tantot do
64
64
  it "calls back on model update" do
65
65
  city = City.create!
66
66
  city.reload
67
- Tantot.collector.sweep(performer: :bypass)
67
+ Tantot.collector.sweep(:bypass)
68
68
 
69
69
  expect(watcher_instance).to receive(:perform).with(Tantot::Changes::ByModel.new({City => {city.id => {"name" => [nil, 'foo']}}}))
70
70
  Tantot.collector.run do
@@ -76,7 +76,7 @@ describe Tantot do
76
76
  it "calls back on model destroy" do
77
77
  city = City.create!(name: 'foo')
78
78
  city.reload
79
- Tantot.collector.sweep(performer: :bypass)
79
+ Tantot.collector.sweep(:bypass)
80
80
 
81
81
  expect(watcher_instance).to receive(:perform).with(Tantot::Changes::ByModel.new({City => {city.id => {"name" => ['foo']}}}))
82
82
  Tantot.collector.run do
@@ -99,7 +99,7 @@ describe Tantot do
99
99
  Tantot.collector.run do
100
100
  city = City.create name: 'foo'
101
101
  expect(watcher_instance).to receive(:perform).with(Tantot::Changes::ByModel.new({City => {city.id => {"name" => [nil, 'foo']}}}))
102
- Tantot.collector.sweep(performer: :inline, watcher: TestWatcher)
102
+ Tantot.collector.sweep(:inline)
103
103
  city.name = 'bar'
104
104
  city.save
105
105
  expect(watcher_instance).to receive(:perform).with(Tantot::Changes::ByModel.new({City => {city.id => {"name" => ['foo', 'bar']}}}))
@@ -148,7 +148,7 @@ describe Tantot do
148
148
  city = City.create!(name: "Quebec", country_id: country.id)
149
149
  country.reload
150
150
  city.reload
151
- Tantot.collector.sweep(performer: :bypass)
151
+ Tantot.collector.sweep(:bypass)
152
152
 
153
153
  expect(watcher_instance).to receive(:perform).once.with(Tantot::Changes::ByModel.new({City => {city.id => {"name" => ['Quebec', 'foo', 'bar'], "country_id" => [country.id, nil]}}, Country => {country.id => {"country_code" => ['CDN', 'US']}}}))
154
154
  Tantot.collector.run do
@@ -191,7 +191,7 @@ describe Tantot do
191
191
  expect(watchA_instance).to receive(:perform).once.with(Tantot::Changes::ByModel.new({City => {city.id => {"name" => ['Quebec', 'foo', 'bar'], "country_id" => [country.id, nil]}}, Country => {country.id => {"country_code" => ['CDN', 'US']}}}))
192
192
  # WatchB receives the last value of rating since it has been destroyed
193
193
  expect(watchB_instance).to receive(:perform).once.with(Tantot::Changes::ByModel.new({City => {city.id => {"rating" => [12]}}}))
194
- Tantot.collector.sweep(performer: :bypass)
194
+ Tantot.collector.sweep(:bypass)
195
195
 
196
196
  Tantot.collector.run do
197
197
  city.name = "foo"
@@ -224,7 +224,7 @@ describe Tantot do
224
224
  it "should also watch on destroy, but when watching all attributes, change hash is empty" do
225
225
  city = City.create!(name: 'foo')
226
226
  city.reload
227
- Tantot.collector.sweep(performer: :bypass)
227
+ Tantot.collector.sweep(:bypass)
228
228
 
229
229
  expect(watcher_instance).to receive(:perform).with(Tantot::Changes::ByModel.new({City => {city.id => {}}}))
230
230
  Tantot.collector.run do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tantot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - François-Pierre Bouchard
@@ -159,6 +159,7 @@ files:
159
159
  - lib/tantot.rb
160
160
  - lib/tantot/changes.rb
161
161
  - lib/tantot/collector.rb
162
+ - lib/tantot/collector/base.rb
162
163
  - lib/tantot/collector/block.rb
163
164
  - lib/tantot/collector/watcher.rb
164
165
  - lib/tantot/config.rb
@@ -171,6 +172,7 @@ files:
171
172
  - lib/tantot/observe.rb
172
173
  - lib/tantot/performer.rb
173
174
  - lib/tantot/performer/bypass.rb
175
+ - lib/tantot/performer/chewy.rb
174
176
  - lib/tantot/performer/inline.rb
175
177
  - lib/tantot/performer/sidekiq.rb
176
178
  - lib/tantot/railtie.rb