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 +4 -4
- data/Gemfile.lock +14 -14
- data/README.md +11 -2
- data/lib/reactor/event.rb +10 -9
- data/lib/reactor/models.rb +0 -2
- data/lib/reactor/version.rb +1 -1
- data/lib/reactor/workers/concerns/configuration.rb +7 -2
- data/lib/reactor/workers.rb +0 -1
- data/lib/reactor.rb +0 -3
- data/spec/event_spec.rb +35 -19
- data/spec/models/concerns/publishable_spec.rb +21 -32
- data/spec/models/concerns/subscribable_spec.rb +17 -2
- data/spec/spec_helper.rb +12 -0
- data/spec/support/active_record.rb +0 -12
- metadata +2 -9
- data/lib/reactor/models/concerns/optionally_subclassable.rb +0 -13
- data/lib/reactor/models/subscriber.rb +0 -28
- data/lib/reactor/workers/database_subscriber_worker.rb +0 -22
- data/spec/models/subscriber_spec.rb +0 -41
- data/spec/workers/database_subscriber_worker_spec.rb +0 -67
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5fb837714e773b0e547099b05ed322b059310f23
|
4
|
+
data.tar.gz: 928b14c3d60d9cae2a318d2fb36fa84e2e6384da
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
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.
|
61
|
-
globalid (0.4.
|
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.
|
66
|
+
loofah (2.1.1)
|
67
|
+
crass (~> 1.0.2)
|
66
68
|
nokogiri (>= 1.5.9)
|
67
|
-
mail (2.
|
68
|
-
|
69
|
+
mail (2.7.0)
|
70
|
+
mini_mime (>= 0.1.1)
|
69
71
|
method_source (0.8.2)
|
70
|
-
|
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.
|
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 (
|
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.
|
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 (
|
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.
|
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
|
data/lib/reactor/models.rb
CHANGED
data/lib/reactor/version.rb
CHANGED
@@ -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?
|
data/lib/reactor/workers.rb
CHANGED
data/lib/reactor.rb
CHANGED
data/spec/event_spec.rb
CHANGED
@@ -8,7 +8,7 @@ module MyModule
|
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
|
-
class ArbitraryModel <
|
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
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
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
|
-
|
72
|
-
|
73
|
-
|
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
|
-
|
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
|
-
|
83
|
-
|
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 {
|
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 <
|
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
|
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 '
|
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
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
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
|
-
|
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(
|
212
|
+
expect(Reactor::Event).to receive(:perform_at).
|
213
|
+
with(future, :begin, hash_including('additional_info' => 'curtis was here'))
|
224
214
|
|
225
|
-
|
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 <
|
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 <
|
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.
|
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-
|
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,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
|