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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2e2420e728e56ddaf2d1dac1b97d68e39be9da53
4
- data.tar.gz: 3a6107dd7f630ffb35ffd7b3a9974c3f571e8dee
3
+ metadata.gz: e0929514c03a52f0651fddbe28552d2cd2753f35
4
+ data.tar.gz: 920052c285cb492a8fb916fc4fae5b3dd8a6e30d
5
5
  SHA512:
6
- metadata.gz: db8d01bf51e70978395acf02baf414c6eaf44d720a8328c01c3cfd0d7f5c13836a0998b5d90419b191083be37a9ce0aa5868ccb3b48b1126e76a8cf1939c773f
7
- data.tar.gz: a9a78311e709d5361ecff086cc6e3dc1b6f7a57b713c1d1056ef3225401934f875c5e6d4890d1895d48e89cc936b94e49b1324e802ba3e1514c4d4e155d21118
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
- MyModel.find(event.target).do_something_about_it!
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
@@ -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
- Reactor::Subscriber.where(event: name).each do |subscriber|
17
- Reactor::Subscriber.delay.fire subscriber.id, data
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(event, method = nil, options = {}, &block)
6
- (Reactor::SUBSCRIBERS[event.to_s] ||= []).push(StaticSubscriberFactory.create event, method, {source: self}.merge(options), &block)
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
@@ -1,3 +1,3 @@
1
1
  module Reactor
2
- VERSION = "0.5.3"
2
+ VERSION = "0.6.0"
3
3
  end
@@ -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.5.3
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-01-23 00:00:00.000000000 Z
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.1.11
138
+ rubygems_version: 2.0.14
139
139
  signing_key:
140
140
  specification_version: 4
141
141
  summary: Sidekiq/ActiveRecord pubsub lib