reactor 0.18.0 → 0.19.0

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
  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