reactor 0.18.0 → 0.19.0

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: b1058e9253784011ae11ef0d90a81d6b03b6adda
4
- data.tar.gz: 5ac34c6beb094cee626a25f91f2eef3d81c31cbf
3
+ metadata.gz: 5fb837714e773b0e547099b05ed322b059310f23
4
+ data.tar.gz: 928b14c3d60d9cae2a318d2fb36fa84e2e6384da
5
5
  SHA512:
6
- metadata.gz: '0191eb26785cf2a8f269d580539ade48efd533e2add38fb07b1914b1374d35fae5316d74fa8a47cbe41f6c3bccc6935f7f39f6ff1f552ed04dcb13d995b89610'
7
- data.tar.gz: c9e3c1bd5384f357375ebcd93760fce39c5f8e4e432bf88a820fdbf219566ac286da2946da41b7be0ef34c277a92a5b45c5168c8a26e363f21bbe1204567433a
6
+ metadata.gz: 536da1fe846ac55173a110ffd7e25e1bb362e0ca765ab40dac2730f379521b6b62da64b77e8f1768733fa4ca275c872b7da9df2020389bbe729b02685fc7e52a
7
+ data.tar.gz: faf39d4f13d4a2d173284b0298947b92eb7959fc63d800a397df6db2963c22a4a421bf7c796880d22362f74db3175982412d82e08f8ccd5355873b04230cc266
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- reactor (0.18.0)
4
+ reactor (0.19.0)
5
5
  rails
6
6
  sidekiq (> 4.0)
7
7
 
@@ -55,24 +55,24 @@ GEM
55
55
  coderay (1.1.1)
56
56
  concurrent-ruby (1.0.5)
57
57
  connection_pool (2.2.1)
58
+ crass (1.0.3)
58
59
  diff-lcs (1.3)
59
60
  docile (1.1.5)
60
- erubi (1.6.1)
61
- globalid (0.4.0)
61
+ erubi (1.7.0)
62
+ globalid (0.4.1)
62
63
  activesupport (>= 4.2.0)
63
64
  i18n (0.8.6)
64
65
  json (2.1.0)
65
- loofah (2.0.3)
66
+ loofah (2.1.1)
67
+ crass (~> 1.0.2)
66
68
  nokogiri (>= 1.5.9)
67
- mail (2.6.6)
68
- mime-types (>= 1.16, < 4)
69
+ mail (2.7.0)
70
+ mini_mime (>= 0.1.1)
69
71
  method_source (0.8.2)
70
- mime-types (3.1)
71
- mime-types-data (~> 3.2015)
72
- mime-types-data (3.2016.0521)
72
+ mini_mime (1.0.0)
73
73
  mini_portile2 (2.3.0)
74
74
  minitest (5.10.2)
75
- nio4r (2.1.0)
75
+ nio4r (2.2.0)
76
76
  nokogiri (1.8.1)
77
77
  mini_portile2 (~> 2.3.0)
78
78
  pry (0.10.4)
@@ -111,7 +111,7 @@ GEM
111
111
  rake (>= 0.8.7)
112
112
  thor (>= 0.18.1, < 2.0)
113
113
  rake (12.0.0)
114
- redis (3.3.3)
114
+ redis (4.0.1)
115
115
  rspec (3.6.0)
116
116
  rspec-core (~> 3.6.0)
117
117
  rspec-expectations (~> 3.6.0)
@@ -128,11 +128,11 @@ GEM
128
128
  diff-lcs (>= 1.2.0, < 2.0)
129
129
  rspec-support (~> 3.6.0)
130
130
  rspec-support (3.6.0)
131
- sidekiq (5.0.4)
131
+ sidekiq (5.0.5)
132
132
  concurrent-ruby (~> 1.0)
133
133
  connection_pool (~> 2.2, >= 2.2.0)
134
134
  rack-protection (>= 1.5.0)
135
- redis (~> 3.3, >= 3.3.3)
135
+ redis (>= 3.3.4, < 5)
136
136
  simplecov (0.14.1)
137
137
  docile (~> 1.1.0)
138
138
  json (>= 1.8, < 3)
@@ -155,7 +155,7 @@ GEM
155
155
  thread_safe (~> 0.1)
156
156
  websocket-driver (0.6.5)
157
157
  websocket-extensions (>= 0.1.0)
158
- websocket-extensions (0.1.2)
158
+ websocket-extensions (0.1.3)
159
159
 
160
160
  PLATFORMS
161
161
  ruby
data/README.md CHANGED
@@ -28,7 +28,8 @@ Or install it yourself as:
28
28
 
29
29
  ## Usage
30
30
 
31
- Well, this is evolving, so it's probably best to go read the specs.
31
+ Well, this is evolving, so it's probably best to go read the specs as
32
+ well as below.
32
33
 
33
34
 
34
35
  ### Barebones API
@@ -37,7 +38,6 @@ Well, this is evolving, so it's probably best to go read the specs.
37
38
  Reactor::Event.publish(:event_name, any: 'data', you: 'want')
38
39
  ```
39
40
 
40
- ### ActiveModel extensions
41
41
 
42
42
  #### Publishable
43
43
 
@@ -287,6 +287,15 @@ on_event :high_frequency_event, :do_something, deprecated: true
287
287
  If no -> you can probably just delete the subscriber.
288
288
  In the worst case scenario, you get some background exceptions for a job you didn't intend to have run anyway. Pick your poison.
289
289
 
290
+ #### Managing Queues
291
+
292
+ There will likely be more queue theory here later, but for now here are the features.
293
+
294
+ Everything is done on Sidekiq `default` queue by default.
295
+
296
+ Subscribers can opt into certain queues with `on_event :whatever, sidekiq_options: { queue: 'whatever' }` argument.
297
+
298
+ You can also override _all queue choices_ with `ENV['REACTOR_QUEUE']`. You may want to do this if you wish to contain the 'cascade' of events for more expensive or risky operations.
290
299
 
291
300
  ## Contributing
292
301
 
data/lib/reactor/event.rb CHANGED
@@ -1,7 +1,13 @@
1
1
  class Reactor::Event
2
- include Reactor::OptionallySubclassable
3
2
  include Sidekiq::Worker
4
3
 
4
+ sidekiq_options queue: ENV['REACTOR_QUEUE'] || Sidekiq.default_worker_options['queue']
5
+
6
+ CONSOLE_CONFIRMATION_MESSAGE = <<-eos
7
+ It looks like you are on a production console. Only fire an event if you intend to trigger
8
+ all of its subscribers. In order to proceed, you must pass `srsly: true` in the event data.'
9
+ eos
10
+
5
11
  attr_accessor :__data__
6
12
 
7
13
  def initialize(data = {})
@@ -32,7 +38,6 @@ class Reactor::Event
32
38
 
33
39
  if need_to_fire
34
40
  data.merge!(fired_at: Time.current, name: name)
35
- fire_database_driven_subscribers(data, name)
36
41
  fire_block_subscribers(data, name)
37
42
  end
38
43
  end
@@ -55,6 +60,9 @@ class Reactor::Event
55
60
  end
56
61
 
57
62
  def publish(name, data = {})
63
+ if defined?(Rails::Console) && ENV['RACK_ENV'] == 'production' && data[:srsly].blank?
64
+ raise ArgumentError.new(CONSOLE_CONFIRMATION_MESSAGE)
65
+ end
58
66
  message = new(data.merge(event: name, uuid: SecureRandom.uuid))
59
67
 
60
68
  if message.at
@@ -115,13 +123,6 @@ class Reactor::Event
115
123
  __data__["#{method}_type"].constantize.find(__data__["#{method}_id"])
116
124
  end
117
125
 
118
- def fire_database_driven_subscribers(data, name)
119
- #TODO: support more matching?
120
- Reactor::Subscriber.where(event_name: [name, '*']).pluck(:id).each do |model_id|
121
- Reactor::Workers::DatabaseSubscriberWorker.perform_async model_id, data
122
- end
123
- end
124
-
125
126
  def fire_block_subscribers(data, name)
126
127
  ((Reactor::SUBSCRIBERS[name.to_s] || []) | (Reactor::SUBSCRIBERS['*'] || [])).each { |s| s.perform_where_needed(data) }
127
128
  end
@@ -1,5 +1,3 @@
1
1
  # FIXME - these are not properly namespaced. The directories mean nothing
2
2
  require "reactor/models/concerns/publishable"
3
3
  require "reactor/models/concerns/subscribable"
4
- require "reactor/models/concerns/optionally_subclassable"
5
- require "reactor/models/subscriber"
@@ -1,3 +1,3 @@
1
1
  module Reactor
2
- VERSION = "0.18.0"
2
+ VERSION = "0.19.0"
3
3
  end
@@ -20,14 +20,19 @@ module Reactor
20
20
  if deprecated
21
21
  return
22
22
  elsif delay > 0
23
- perform_in(delay, data)
23
+ event_queue.perform_in(delay, data)
24
24
  elsif async
25
- perform_async(data)
25
+ event_queue.perform_async(data)
26
26
  else
27
27
  new.perform(data)
28
28
  end
29
29
  source
30
30
  end
31
+
32
+ def event_queue
33
+ queue_override = ENV['REACTOR_QUEUE']
34
+ queue_override.present? ? set(queue: queue_override) : self
35
+ end
31
36
  end
32
37
 
33
38
  def configured?
@@ -5,4 +5,3 @@ end
5
5
 
6
6
  require "reactor/workers/event_worker"
7
7
  require "reactor/workers/mailer_worker"
8
- require "reactor/workers/database_subscriber_worker"
data/lib/reactor.rb CHANGED
@@ -37,6 +37,3 @@ module Reactor
37
37
  Reactor::StaticSubscribers
38
38
  end
39
39
  end
40
-
41
- ActiveRecord::Base.send(:include, Reactor::Publishable)
42
- ActiveRecord::Base.send(:include, Reactor::Subscribable)
data/spec/event_spec.rb CHANGED
@@ -8,7 +8,7 @@ module MyModule
8
8
  end
9
9
  end
10
10
 
11
- class ArbitraryModel < ActiveRecord::Base
11
+ class ArbitraryModel < ApplicationRecord
12
12
 
13
13
  on_event :barfed, handler_name: :bad do
14
14
  raise 'UNEXPECTED!'
@@ -60,39 +60,55 @@ describe Reactor::Event do
60
60
  expect(Reactor::Event).to receive(:perform_async).with(event_name, 'actor_id' => '1', 'event' => :user_did_this, 'uuid' => uuid)
61
61
  Reactor::Event.publish(:user_did_this, actor_id: '1')
62
62
  end
63
- end
64
63
 
65
- describe 'perform' do
66
- before do
67
- Reactor::Subscriber.create(event_name: :user_did_this)
68
- Reactor.enable_test_mode_subscriber(Reactor::Subscriber)
69
- end
64
+ context 'when in a production rails console' do
65
+ it 'requires a second argument srsly: true' do
66
+ stub_const('Rails::Console', Class.new)
67
+ ENV['RACK_ENV'] = 'production'
70
68
 
71
- after do
72
- Reactor::Subscriber.destroy_all
73
- Reactor.enable_test_mode_subscriber(Reactor::Subscriber)
69
+ expect {
70
+ Reactor::Event.publish(:thing)
71
+ }.to raise_exception(ArgumentError)
72
+
73
+ expect {
74
+ Reactor::Event.publish(:thing, srsly: true)
75
+ }.to_not raise_exception
76
+
77
+ ENV['RACK_ENV'] = 'development'
78
+ end
74
79
  end
80
+ end
81
+
82
+ describe 'perform' do
83
+ # before do
84
+ # allow(Reactor::Event).
85
+ # end
86
+ let(:event_name) { :barfed }
75
87
 
76
88
  it 'fires all subscribers' do
77
- expect_any_instance_of(Reactor::Subscriber).to receive(:fire).with(hash_including(actor_id: model.id.to_s))
89
+ expect(Reactor::StaticSubscribers::ArbitraryModel::BarfedHandler).
90
+ to receive(:perform_async).with(hash_including(actor_id: model.id.to_s))
91
+
78
92
  Reactor::Event.perform(event_name, actor_id: model.id.to_s, actor_type: model.class.to_s)
79
93
  end
80
94
 
81
95
  it 'sets a fired_at key in event data' do
82
- expect_any_instance_of(Reactor::Subscriber).to receive(:fire).with(hash_including(fired_at: anything))
83
- Reactor::Event.perform(event_name, actor_id: model.id.to_s, actor_type: model.class.to_s)
84
- end
96
+ expect(Reactor::StaticSubscribers::ArbitraryModel::BarfedHandler).
97
+ to receive(:perform_async).with(hash_including(fired_at: anything))
85
98
 
86
- it 'works with the legacy .process method, too' do
87
- expect_any_instance_of(Reactor::Subscriber).to receive(:fire).with(hash_including(actor_id: model.id.to_s))
88
99
  Reactor::Event.perform(event_name, actor_id: model.id.to_s, actor_type: model.class.to_s)
89
100
  end
90
101
 
91
102
  describe 'when subscriber throws exception', :sidekiq do
92
- let(:barfing_event) { Reactor::Event.perform('barfed', somethin: 'up', actor_id: model.id.to_s, actor_type: model.class.to_s) }
93
-
94
103
  it 'doesnt matter because it runs in a separate worker process' do
95
- expect { barfing_event }.to_not raise_exception
104
+ expect {
105
+ Reactor::Event.perform(
106
+ 'barfed',
107
+ somethin: 'up',
108
+ actor_id: model.id.to_s,
109
+ actor_type: model.class.to_s
110
+ )
111
+ }.to_not raise_exception
96
112
  end
97
113
  end
98
114
  end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
  require 'sidekiq/testing'
3
3
 
4
- class Publisher < ActiveRecord::Base
4
+ class Publisher < ApplicationRecord
5
5
  belongs_to :pet
6
6
 
7
7
  def ring_timeout
@@ -20,21 +20,10 @@ class Publisher < ActiveRecord::Base
20
20
  publishes :woof, actor: :pet, target: :self
21
21
  end
22
22
 
23
- class TestSubscriber < Reactor::Subscriber
24
- @@called = false
25
-
26
- on_fire do
27
- @@called = true
28
- end
29
- end
30
-
31
23
  describe Reactor::Publishable do
32
- before do
33
- TestSubscriber.destroy_all
34
- TestSubscriber.class_variable_set(:@@called, false)
35
- end
24
+ before { allow(Reactor::Event).to receive(:perform_at).and_call_original }
36
25
 
37
- describe 'publish' do
26
+ describe 'publishes' do
38
27
  let(:pet) { Pet.create! }
39
28
  let(:publisher) { Publisher.create!(pet: pet, start_at: Time.current + 1.day, we_want_it: false) }
40
29
 
@@ -92,7 +81,7 @@ describe Reactor::Publishable do
92
81
  before do
93
82
  Sidekiq::Testing.fake!
94
83
  Sidekiq::Worker.clear_all
95
- TestSubscriber.create! event_name: :conditional_event_on_publish
84
+ # TestSubscriber.create! event_name: :conditional_event_on_publish
96
85
  publisher
97
86
  job = Reactor::Event.jobs.detect do |job|
98
87
  job['class'] == 'Reactor::Event' && job['args'].first == 'conditional_event_on_publish'
@@ -153,7 +142,6 @@ describe Reactor::Publishable do
153
142
  before do
154
143
  Sidekiq::Testing.fake!
155
144
  Sidekiq::Worker.clear_all
156
- TestSubscriber.create! event_name: :conditional_event_on_save
157
145
  publisher
158
146
  job = Reactor::Event.jobs.detect do |job|
159
147
  job['class'] == 'Reactor::Event' && job['args'].first == 'conditional_event_on_save'
@@ -203,27 +191,28 @@ describe Reactor::Publishable do
203
191
 
204
192
 
205
193
  it 'supports immediate events (on create) that get fired once' do
206
- Reactor.with_subscriber_enabled(Reactor::Subscriber) do
207
- TestSubscriber.create! event_name: :bell
208
- publisher
209
- expect(TestSubscriber.class_variable_get(:@@called)).to be_truthy
210
- TestSubscriber.class_variable_set(:@@called, false)
211
- publisher.start_at = 1.day.from_now
212
- publisher.save
213
- expect(TestSubscriber.class_variable_get(:@@called)).to be_falsey
214
- end
194
+ expect(Reactor::Event).to receive(:perform_async).
195
+ with(:woof, hash_including(actor_type: 'Pet'))
196
+ expect(Reactor::Event).to receive(:perform_async).
197
+ with(:bell, hash_including(actor_type: 'Publisher'))
198
+
199
+ publisher
200
+
201
+ # and dont get fired on update
202
+ publisher.start_at = 1.day.from_now
203
+ expect(Reactor::Event).to_not receive(:perform_async).with(:bell)
204
+ expect(Reactor::Event).to_not receive(:perform_async).with(:woof)
205
+ publisher.save
206
+
215
207
  end
216
208
 
217
209
  it 'does publish an event scheduled for the future' do
218
- Reactor.enable_test_mode_subscriber Reactor::Subscriber
219
- Reactor.enable_test_mode_subscriber Publisher
220
- TestSubscriber.create! event_name: :begin
221
- Publisher.create!(pet: pet, start_at: Time.current + 1.week)
210
+ future = Time.now.utc + 1.week
222
211
 
223
- expect(TestSubscriber.class_variable_get(:@@called)).to be_truthy
212
+ expect(Reactor::Event).to receive(:perform_at).
213
+ with(future, :begin, hash_including('additional_info' => 'curtis was here'))
224
214
 
225
- Reactor.disable_test_mode_subscriber Reactor::Subscriber
226
- Reactor.disable_test_mode_subscriber Publisher
215
+ Publisher.create!(pet: pet, start_at: future)
227
216
  end
228
217
  end
229
218
  end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- class Auction < ActiveRecord::Base
3
+ class Auction < ApplicationRecord
4
4
  on_event :bid_made do |event|
5
5
  event.target.update_column :status, 'first_bid_made'
6
6
  end
@@ -68,7 +68,7 @@ class KittenMailer < ActionMailer::Base
68
68
  end
69
69
 
70
70
  Reactor.in_test_mode do
71
- class TestModeAuction < ActiveRecord::Base
71
+ class TestModeAuction < ApplicationRecord
72
72
  on_event :test_puppy_delivered, -> (event) { "success" }
73
73
  end
74
74
  end
@@ -166,6 +166,21 @@ describe Reactor::Subscribable do
166
166
  end
167
167
  end
168
168
 
169
+ describe 'overriding queue options with ENV variable to isolate cascade between processes' do
170
+ before { ENV['REACTOR_QUEUE'] = 'bulk' }
171
+ after { ENV.delete('REACTOR_QUEUE') }
172
+
173
+ specify do
174
+ expect_any_instance_of(Reactor::StaticSubscribers::Auction::WildcardHandler).
175
+ to receive(:perform)
176
+
177
+ expect(Reactor::StaticSubscribers::Auction::WildcardHandler).to receive(:set).
178
+ with(hash_including(queue: 'bulk')).and_call_original
179
+
180
+ Reactor::Event.publish(:puppy_delivered)
181
+ end
182
+ end
183
+
169
184
  describe '#perform' do
170
185
  around(:each) do |example|
171
186
  Reactor.in_test_mode { example.run }
data/spec/spec_helper.rb CHANGED
@@ -18,6 +18,18 @@ require 'reactor/testing/matchers'
18
18
 
19
19
  require 'rspec/its'
20
20
 
21
+ class ApplicationRecord < ActiveRecord::Base
22
+ self.abstract_class = true
23
+ include Reactor::Publishable
24
+ include Reactor::Subscribable
25
+ end
26
+
27
+ class Pet < ApplicationRecord
28
+ end
29
+
30
+ class ArbitraryModel < ApplicationRecord
31
+ end
32
+
21
33
  REDIS_URL = ENV["REDISTOGO_URL"] || ENV["REDIS_URL"] || "redis://localhost:6379/4"
22
34
 
23
35
  ActionMailer::Base.delivery_method = :test
@@ -24,13 +24,6 @@ ActiveRecord::Migration.create_table :publishers do |t|
24
24
  t.timestamps null: false
25
25
  end
26
26
 
27
- ActiveRecord::Migration.create_table :subscribers do |t|
28
- t.string :event_name
29
- t.string :type
30
-
31
- t.timestamps null: false
32
- end
33
-
34
27
  ActiveRecord::Migration.create_table :pets do |t|
35
28
  t.integer :awesomeness
36
29
  t.string :type
@@ -45,8 +38,3 @@ ActiveRecord::Migration.create_table :arbitrary_models do |t|
45
38
  t.timestamps null: false
46
39
  end
47
40
 
48
- class Pet < ActiveRecord::Base
49
- end
50
-
51
- class ArbitraryModel < ActiveRecord::Base
52
- end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reactor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.18.0
4
+ version: 0.19.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - winfred
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2018-01-08 00:00:00.000000000 Z
14
+ date: 2018-01-25 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: rails
@@ -218,10 +218,8 @@ files:
218
218
  - lib/reactor/errors.rb
219
219
  - lib/reactor/event.rb
220
220
  - lib/reactor/models.rb
221
- - lib/reactor/models/concerns/optionally_subclassable.rb
222
221
  - lib/reactor/models/concerns/publishable.rb
223
222
  - lib/reactor/models/concerns/subscribable.rb
224
- - lib/reactor/models/subscriber.rb
225
223
  - lib/reactor/static_subscribers.rb
226
224
  - lib/reactor/subscription.rb
227
225
  - lib/reactor/testing.rb
@@ -229,7 +227,6 @@ files:
229
227
  - lib/reactor/version.rb
230
228
  - lib/reactor/workers.rb
231
229
  - lib/reactor/workers/concerns/configuration.rb
232
- - lib/reactor/workers/database_subscriber_worker.rb
233
230
  - lib/reactor/workers/event_worker.rb
234
231
  - lib/reactor/workers/mailer_worker.rb
235
232
  - reactor.gemspec
@@ -237,13 +234,11 @@ files:
237
234
  - spec/event_spec.rb
238
235
  - spec/models/concerns/publishable_spec.rb
239
236
  - spec/models/concerns/subscribable_spec.rb
240
- - spec/models/subscriber_spec.rb
241
237
  - spec/reactor_spec.rb
242
238
  - spec/spec_helper.rb
243
239
  - spec/subscription_spec.rb
244
240
  - spec/support/active_record.rb
245
241
  - spec/support/shared_examples.rb
246
- - spec/workers/database_subscriber_worker_spec.rb
247
242
  - spec/workers/event_worker_spec.rb
248
243
  - spec/workers/mailer_worker_spec.rb
249
244
  homepage: ''
@@ -275,12 +270,10 @@ test_files:
275
270
  - spec/event_spec.rb
276
271
  - spec/models/concerns/publishable_spec.rb
277
272
  - spec/models/concerns/subscribable_spec.rb
278
- - spec/models/subscriber_spec.rb
279
273
  - spec/reactor_spec.rb
280
274
  - spec/spec_helper.rb
281
275
  - spec/subscription_spec.rb
282
276
  - spec/support/active_record.rb
283
277
  - spec/support/shared_examples.rb
284
- - spec/workers/database_subscriber_worker_spec.rb
285
278
  - spec/workers/event_worker_spec.rb
286
279
  - spec/workers/mailer_worker_spec.rb
@@ -1,13 +0,0 @@
1
- module Reactor::OptionallySubclassable
2
- extend ActiveSupport::Concern
3
-
4
- module ClassMethods
5
- def find_sti_class(type_name)
6
- begin
7
- ActiveSupport::Dependencies.constantize(type_name)
8
- rescue NameError
9
- self
10
- end
11
- end
12
- end
13
- end
@@ -1,28 +0,0 @@
1
- module Reactor
2
- class Subscriber < ActiveRecord::Base
3
- attr_accessor :event
4
-
5
- def event_name=(event)
6
- write_attribute :event_name, event.to_s
7
- end
8
-
9
- def fire(data)
10
- self.event = Reactor::Event.new(data)
11
- instance_exec &self.class.on_fire
12
- self
13
- end
14
-
15
- class << self
16
- def on_fire(&block)
17
- if block
18
- @fire_block = block
19
- end
20
- @fire_block
21
- end
22
-
23
- def fire(subscriber_id, data)
24
- Reactor::Subscriber.find(subscriber_id).fire data.with_indifferent_access
25
- end
26
- end
27
- end
28
- end
@@ -1,22 +0,0 @@
1
- module Reactor
2
- module Workers
3
- class DatabaseSubscriberWorker
4
-
5
- include Sidekiq::Worker
6
-
7
- def perform(model_id, data)
8
- return :__perform_aborted__ unless should_perform?
9
- Reactor::Subscriber.fire(model_id, data)
10
- end
11
-
12
- def should_perform?
13
- if Reactor.test_mode?
14
- Reactor.test_mode_subscriber_enabled? Reactor::Subscriber
15
- else
16
- true
17
- end
18
- end
19
-
20
- end
21
- end
22
- end
@@ -1,41 +0,0 @@
1
- require 'spec_helper'
2
-
3
- class MySubscriber < Reactor::Subscriber
4
- attr_accessor :was_called
5
-
6
- on_fire do
7
- self.was_called = true
8
- end
9
- end
10
-
11
- describe Reactor::Subscriber do
12
-
13
- describe 'fire' do
14
- subject { MySubscriber.create(event_name: :you_name_it).fire some: 'random', event: 'data' }
15
-
16
- its(:event) { is_expected.to be_a Reactor::Event }
17
- its('event.some') { is_expected.to eq('random') }
18
-
19
- it 'executes block given' do
20
- expect(subject.was_called).to be_truthy
21
- end
22
- end
23
-
24
-
25
- describe 'matcher' do
26
- before do
27
- MySubscriber.create!(event_name: '*')
28
- Reactor.enable_test_mode_subscriber Reactor::Subscriber
29
- end
30
-
31
- after do
32
- Reactor.disable_test_mode_subscriber Reactor::Subscriber
33
- MySubscriber.destroy_all
34
- end
35
-
36
- it 'can be set to star to bind to all events' do
37
- expect_any_instance_of(MySubscriber).to receive(:fire).with(hash_including('random' => 'data', 'event' => 'this_event'))
38
- Reactor::Event.publish(:this_event, {random: 'data'})
39
- end
40
- end
41
- end
@@ -1,67 +0,0 @@
1
- require 'spec_helper'
2
-
3
- class DbSubscriber < Reactor::Subscriber
4
- attr_accessor :was_called
5
-
6
- on_fire do
7
- self.was_called = true
8
- end
9
- end
10
-
11
- describe Reactor::Workers::DatabaseSubscriberWorker do
12
- let(:event_name) { :fire_db_subscriber }
13
- let(:data) { Hash[unused: :data] }
14
- let!(:db_subscriber) { DbSubscriber.create!(event_name: event_name) }
15
-
16
- let(:instance) { described_class.new }
17
-
18
- describe '#perform' do
19
-
20
- subject { instance.perform(db_subscriber.id, data) }
21
-
22
- context 'when should_perform? is false' do
23
- before { allow_any_instance_of(DbSubscriber).to receive(:should_perform?).and_return(false) }
24
-
25
- it { is_expected.to eq(:__perform_aborted__) }
26
- end
27
-
28
- context 'when should_perform? is true' do
29
- before do
30
- allow(instance).to receive(:should_perform?).and_return(true)
31
- end
32
-
33
- it 'fires subscriber' do
34
- expect(Reactor::Subscriber).to receive(:fire).with(db_subscriber.id, data)
35
- subject
36
- end
37
- end
38
-
39
- end
40
-
41
- describe '#should_perform?' do
42
- subject { instance.should_perform? }
43
-
44
- context 'in test mode' do
45
- context 'when subscriber is not enabled' do
46
- it { is_expected.to eq(false) }
47
- end
48
-
49
- context 'when subscriber is enabled' do
50
- it 'should equal true' do
51
- Reactor.with_subscriber_enabled Reactor::Subscriber do
52
- expect(subject).to eq(true)
53
- end
54
- end
55
- end
56
- end
57
-
58
- context 'outside test mode' do
59
- before do
60
- allow(Reactor).to receive(:test_mode?).and_return(false)
61
- end
62
-
63
- it { is_expected.to eq(true) }
64
- end
65
- end
66
-
67
- end