reactor 0.5.3 → 0.6.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: 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