reactor 0.5.3 → 0.6.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/README.md +9 -3
- data/lib/reactor/event.rb +17 -10
- data/lib/reactor/models/concerns/subscribable.rb +14 -3
- data/lib/reactor/version.rb +1 -1
- data/spec/models/concerns/subscribable_spec.rb +17 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e0929514c03a52f0651fddbe28552d2cd2753f35
|
4
|
+
data.tar.gz: 920052c285cb492a8fb916fc4fae5b3dd8a6e30d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 023ef8cb5805b53006d9d25b95486160c3d4ffa7885f3654f99d9d8f69716c7f4818731839e74a873619ed11d925a7232bd2346ec13e0bd82df7250dbb100079
|
7
|
+
data.tar.gz: 1fa9340e7e9a3d5621058edbfa8df3281e9407dfd11805d58a8b64eca41a72acc240d8e7ed1065f0c76aae5794a5e427969edcfdd6bd0a96b1cffd3c55a37206
|
data/README.md
CHANGED
@@ -44,12 +44,18 @@ Well, this is evolving, so it's probably best to go read the specs.
|
|
44
44
|
|
45
45
|
#### Subscribable
|
46
46
|
|
47
|
-
*New in 0.3*
|
48
|
-
|
49
47
|
You can now bind any block to an event in your models like so
|
50
48
|
|
51
49
|
on_event :any_event do |event|
|
52
|
-
|
50
|
+
event.target.do_something_about_it!
|
51
|
+
end
|
52
|
+
|
53
|
+
Static subscribers like these are automatically placed into Sidekiq and executed in the background
|
54
|
+
|
55
|
+
It's also possible to run a subscriber block in memory like so
|
56
|
+
|
57
|
+
on_event :any_event, in_memory: true do |event|
|
58
|
+
event.target.do_something_about_it_and_make_the_user_wait!
|
53
59
|
end
|
54
60
|
|
55
61
|
## Contributing
|
data/lib/reactor/event.rb
CHANGED
@@ -13,16 +13,8 @@ class Reactor::Event
|
|
13
13
|
|
14
14
|
def perform(name, data)
|
15
15
|
data.merge!(fired_at: Time.current, name: name)
|
16
|
-
|
17
|
-
|
18
|
-
end
|
19
|
-
|
20
|
-
#TODO: support more matching?
|
21
|
-
Reactor::Subscriber.where(event: '*').each do |s|
|
22
|
-
Reactor::Subscriber.delay.fire s.id, data
|
23
|
-
end
|
24
|
-
|
25
|
-
((Reactor::SUBSCRIBERS[name.to_s] || []) | (Reactor::SUBSCRIBERS['*'] || [])).each {|s| s.perform_async(data) }
|
16
|
+
fire_database_driven_subscribers(data, name)
|
17
|
+
fire_block_subscribers(data, name)
|
26
18
|
end
|
27
19
|
|
28
20
|
def method_missing(method, *args)
|
@@ -91,4 +83,19 @@ class Reactor::Event
|
|
91
83
|
def initialize_polymorphic_association(method)
|
92
84
|
data["#{method}_type"].constantize.find(data["#{method}_id"])
|
93
85
|
end
|
86
|
+
|
87
|
+
def fire_database_driven_subscribers(data, name)
|
88
|
+
Reactor::Subscriber.where(event: name).each do |subscriber|
|
89
|
+
Reactor::Subscriber.delay.fire subscriber.id, data
|
90
|
+
end
|
91
|
+
|
92
|
+
#TODO: support more matching?
|
93
|
+
Reactor::Subscriber.where(event: '*').each do |s|
|
94
|
+
Reactor::Subscriber.delay.fire s.id, data
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def fire_block_subscribers(data, name)
|
99
|
+
((Reactor::SUBSCRIBERS[name.to_s] || []) | (Reactor::SUBSCRIBERS['*'] || [])).each { |s| s.perform_where_needed(data) }
|
100
|
+
end
|
94
101
|
end
|
@@ -2,8 +2,10 @@ module Reactor::Subscribable
|
|
2
2
|
extend ActiveSupport::Concern
|
3
3
|
|
4
4
|
module ClassMethods
|
5
|
-
def on_event(
|
6
|
-
|
5
|
+
def on_event(*args, &block)
|
6
|
+
options = args.extract_options!
|
7
|
+
event, method = args
|
8
|
+
(Reactor::SUBSCRIBERS[event.to_s] ||= []).push(StaticSubscriberFactory.create(event, method, {source: self}.merge(options), &block))
|
7
9
|
end
|
8
10
|
end
|
9
11
|
|
@@ -17,7 +19,7 @@ module Reactor::Subscribable
|
|
17
19
|
class #{new_class}
|
18
20
|
include Sidekiq::Worker
|
19
21
|
|
20
|
-
cattr_accessor :method, :delay, :source
|
22
|
+
cattr_accessor :method, :delay, :source, :in_memory
|
21
23
|
|
22
24
|
def perform(data)
|
23
25
|
event = Reactor::Event.new(data)
|
@@ -27,6 +29,14 @@ module Reactor::Subscribable
|
|
27
29
|
@@method.call(event)
|
28
30
|
end
|
29
31
|
end
|
32
|
+
|
33
|
+
def self.perform_where_needed(data)
|
34
|
+
if @@in_memory
|
35
|
+
new.perform(data)
|
36
|
+
else
|
37
|
+
perform_async(data)
|
38
|
+
end
|
39
|
+
end
|
30
40
|
end
|
31
41
|
}
|
32
42
|
|
@@ -34,6 +44,7 @@ module Reactor::Subscribable
|
|
34
44
|
new_class.method = method || block
|
35
45
|
new_class.delay = options[:delay] || 0
|
36
46
|
new_class.source = options[:source]
|
47
|
+
new_class.in_memory = options[:in_memory]
|
37
48
|
new_class
|
38
49
|
end
|
39
50
|
end
|
data/lib/reactor/version.rb
CHANGED
@@ -13,6 +13,10 @@ class Auction < ActiveRecord::Base
|
|
13
13
|
event.actor.more_puppies! if event.name == 'another_event'
|
14
14
|
end
|
15
15
|
|
16
|
+
on_event :cat_delivered, in_memory: true do |event|
|
17
|
+
puppies!
|
18
|
+
end
|
19
|
+
|
16
20
|
def self.ring_bell(event)
|
17
21
|
pp "ring ring! #{event}"
|
18
22
|
end
|
@@ -49,5 +53,18 @@ describe Reactor::Subscribable do
|
|
49
53
|
Auction.any_instance.should_receive(:more_puppies!)
|
50
54
|
Reactor::Event.publish(:another_event, actor: Auction.create)
|
51
55
|
end
|
56
|
+
|
57
|
+
describe 'in_memory flag' do
|
58
|
+
it 'doesnt fire perform_async when true' do
|
59
|
+
Auction.should_receive(:puppies!)
|
60
|
+
Reactor::StaticSubscribers::CatDeliveredHandler0.should_not_receive(:perform_async)
|
61
|
+
Reactor::Event.publish(:cat_delivered)
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'fires perform_async when falsey' do
|
65
|
+
Reactor::StaticSubscribers::WildcardHandler0.should_receive(:perform_async)
|
66
|
+
Reactor::Event.publish(:puppy_delivered)
|
67
|
+
end
|
68
|
+
end
|
52
69
|
end
|
53
70
|
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.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- winfred
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2014-
|
15
|
+
date: 2014-02-12 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: sidekiq
|
@@ -135,7 +135,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
135
135
|
version: '0'
|
136
136
|
requirements: []
|
137
137
|
rubyforge_project:
|
138
|
-
rubygems_version: 2.
|
138
|
+
rubygems_version: 2.0.14
|
139
139
|
signing_key:
|
140
140
|
specification_version: 4
|
141
141
|
summary: Sidekiq/ActiveRecord pubsub lib
|