queue-bus 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. data/.gitignore +5 -0
  2. data/.rbenv-version +1 -0
  3. data/.rspec +1 -0
  4. data/.rvmrc +2 -0
  5. data/Gemfile +6 -0
  6. data/MIT-LICENSE +20 -0
  7. data/README.mdown +264 -0
  8. data/Rakefile +1 -0
  9. data/lib/queue-bus.rb +62 -0
  10. data/lib/queue_bus/adapters/base.rb +41 -0
  11. data/lib/queue_bus/adapters/data.rb +65 -0
  12. data/lib/queue_bus/application.rb +121 -0
  13. data/lib/queue_bus/config.rb +98 -0
  14. data/lib/queue_bus/dispatch.rb +61 -0
  15. data/lib/queue_bus/dispatchers.rb +26 -0
  16. data/lib/queue_bus/driver.rb +31 -0
  17. data/lib/queue_bus/heartbeat.rb +109 -0
  18. data/lib/queue_bus/local.rb +38 -0
  19. data/lib/queue_bus/matcher.rb +81 -0
  20. data/lib/queue_bus/publisher.rb +23 -0
  21. data/lib/queue_bus/publishing.rb +80 -0
  22. data/lib/queue_bus/rider.rb +28 -0
  23. data/lib/queue_bus/subscriber.rb +65 -0
  24. data/lib/queue_bus/subscription.rb +55 -0
  25. data/lib/queue_bus/subscription_list.rb +53 -0
  26. data/lib/queue_bus/task_manager.rb +52 -0
  27. data/lib/queue_bus/util.rb +87 -0
  28. data/lib/queue_bus/version.rb +3 -0
  29. data/lib/queue_bus/worker.rb +14 -0
  30. data/lib/tasks/resquebus.rake +2 -0
  31. data/queue-bus.gemspec +32 -0
  32. data/spec/adapter/publish_at_spec.rb +48 -0
  33. data/spec/adapter/support.rb +15 -0
  34. data/spec/adapter_spec.rb +14 -0
  35. data/spec/application_spec.rb +152 -0
  36. data/spec/config_spec.rb +83 -0
  37. data/spec/dispatch_spec.rb +76 -0
  38. data/spec/driver_spec.rb +100 -0
  39. data/spec/heartbeat_spec.rb +44 -0
  40. data/spec/integration_spec.rb +53 -0
  41. data/spec/matcher_spec.rb +143 -0
  42. data/spec/publish_spec.rb +95 -0
  43. data/spec/publisher_spec.rb +7 -0
  44. data/spec/rider_spec.rb +39 -0
  45. data/spec/spec_helper.rb +69 -0
  46. data/spec/subscriber_spec.rb +268 -0
  47. data/spec/subscription_list_spec.rb +43 -0
  48. data/spec/subscription_spec.rb +53 -0
  49. metadata +192 -0
@@ -0,0 +1,268 @@
1
+ require 'spec_helper'
2
+
3
+ describe QueueBus::Subscriber do
4
+ let(:attributes) { {"x" => "y"} }
5
+ let(:bus_attrs) { {"bus_driven_at" => Time.now.to_i} }
6
+
7
+ before(:each) do
8
+ class SubscriberTest1
9
+ include QueueBus::Subscriber
10
+ @queue = "myqueue"
11
+
12
+ application :my_thing
13
+ subscribe :thing_filter, :x => "y"
14
+ subscribe :event_sub
15
+
16
+ def event_sub(attributes)
17
+ QueueBus::Runner1.run(attributes)
18
+ end
19
+
20
+ def thing_filter(attributes)
21
+ QueueBus::Runner2.run(attributes)
22
+ end
23
+ end
24
+
25
+ class SubscriberTest2
26
+ include QueueBus::Subscriber
27
+ application :test2
28
+ subscribe :test2, "value" => :present
29
+ transform :make_an_int
30
+
31
+ def self.make_an_int(attributes)
32
+ attributes["value"].to_s.length
33
+ end
34
+
35
+ def test2(int)
36
+ QueueBus::Runner1.run("transformed"=>int)
37
+ end
38
+ end
39
+
40
+ module SubModule
41
+ class SubscriberTest3
42
+ include QueueBus::Subscriber
43
+
44
+ subscribe_queue :sub_queue1, :test3, :bus_event_type => "the_event"
45
+ subscribe_queue :sub_queue2, :the_event
46
+ subscribe :other, :bus_event_type => "other_event"
47
+
48
+ def test3(attributes)
49
+ QueueBus::Runner1.run(attributes)
50
+ end
51
+
52
+ def the_event(attributes)
53
+ QueueBus::Runner2.run(attributes)
54
+ end
55
+ end
56
+
57
+ class SubscriberTest4
58
+ include QueueBus::Subscriber
59
+
60
+ subscribe_queue :sub_queue1, :test4
61
+ end
62
+ end
63
+
64
+ Timecop.freeze
65
+ QueueBus::TaskManager.new(false).subscribe!
66
+ end
67
+
68
+ after(:each) do
69
+ Timecop.return
70
+ end
71
+
72
+ it "should have the application" do
73
+ SubscriberTest1.app_key.should == "my_thing"
74
+ SubModule::SubscriberTest3.app_key.should == "sub_module"
75
+ SubModule::SubscriberTest4.app_key.should == "sub_module"
76
+ end
77
+
78
+ it "should be able to transform the attributes" do
79
+ dispatcher = QueueBus.dispatcher_by_key("test2")
80
+ all = dispatcher.subscriptions.all
81
+ all.size.should == 1
82
+
83
+ sub = all.first
84
+ sub.queue_name.should == "test2_default"
85
+ sub.class_name.should == "SubscriberTest2"
86
+ sub.key.should == "SubscriberTest2.test2"
87
+ sub.matcher.filters.should == {"value"=>"bus_special_value_present"}
88
+
89
+ QueueBus::Driver.perform(attributes.merge("bus_event_type" => "something2", "value"=>"nice"))
90
+
91
+ hash = JSON.parse(QueueBus.redis { |redis| redis.lpop("queue:test2_default") })
92
+ hash["class"].should == "SubscriberTest2"
93
+ hash["args"].should eq [ {"bus_rider_app_key"=>"test2", "bus_rider_sub_key"=>"SubscriberTest2.test2", "bus_rider_queue" => "test2_default", "bus_rider_class_name"=>"SubscriberTest2",
94
+ "bus_event_type" => "something2", "value"=>"nice", "x"=>"y"}.merge(bus_attrs) ]
95
+
96
+ QueueBus::Runner1.value.should == 0
97
+ QueueBus::Runner2.value.should == 0
98
+ QueueBus::Util.constantize(hash["class"]).perform(*hash["args"])
99
+ QueueBus::Runner1.value.should == 1
100
+ QueueBus::Runner2.value.should == 0
101
+
102
+ QueueBus::Runner1.attributes.should == {"transformed" => 4}
103
+
104
+
105
+ QueueBus::Driver.perform(attributes.merge("bus_event_type" => "something2", "value"=>"12"))
106
+
107
+ hash = JSON.parse(QueueBus.redis { |redis| redis.lpop("queue:test2_default") })
108
+ hash["class"].should == "SubscriberTest2"
109
+ hash["args"].should == [ {"bus_rider_app_key"=>"test2", "bus_rider_sub_key"=>"SubscriberTest2.test2", "bus_rider_queue" => "test2_default", "bus_rider_class_name"=>"SubscriberTest2",
110
+ "bus_event_type" => "something2", "value"=>"12", "x"=>"y"}.merge(bus_attrs) ]
111
+
112
+ QueueBus::Runner1.value.should == 1
113
+ QueueBus::Runner2.value.should == 0
114
+ QueueBus::Util.constantize(hash["class"]).perform(*hash["args"])
115
+ QueueBus::Runner1.value.should == 2
116
+ QueueBus::Runner2.value.should == 0
117
+
118
+ QueueBus::Runner1.attributes.should == {"transformed" => 2}
119
+ end
120
+
121
+
122
+ it "should put in a different queue" do
123
+ dispatcher = QueueBus.dispatcher_by_key("sub_module")
124
+ all = dispatcher.subscriptions.all
125
+ all.size.should == 4
126
+
127
+ sub = all.select{ |s| s.key == "SubModule::SubscriberTest3.test3"}.first
128
+ sub.queue_name.should == "sub_queue1"
129
+ sub.class_name.should == "SubModule::SubscriberTest3"
130
+ sub.key.should == "SubModule::SubscriberTest3.test3"
131
+ sub.matcher.filters.should == {"bus_event_type"=>"the_event"}
132
+
133
+ sub = all.select{ |s| s.key == "SubModule::SubscriberTest3.the_event"}.first
134
+ sub.queue_name.should == "sub_queue2"
135
+ sub.class_name.should == "SubModule::SubscriberTest3"
136
+ sub.key.should == "SubModule::SubscriberTest3.the_event"
137
+ sub.matcher.filters.should == {"bus_event_type"=>"the_event"}
138
+
139
+ sub = all.select{ |s| s.key == "SubModule::SubscriberTest3.other"}.first
140
+ sub.queue_name.should == "sub_module_default"
141
+ sub.class_name.should == "SubModule::SubscriberTest3"
142
+ sub.key.should == "SubModule::SubscriberTest3.other"
143
+ sub.matcher.filters.should == {"bus_event_type"=>"other_event"}
144
+
145
+ sub = all.select{ |s| s.key == "SubModule::SubscriberTest4.test4"}.first
146
+ sub.queue_name.should == "sub_queue1"
147
+ sub.class_name.should == "SubModule::SubscriberTest4"
148
+ sub.key.should == "SubModule::SubscriberTest4.test4"
149
+ sub.matcher.filters.should == {"bus_event_type"=>"test4"}
150
+
151
+ QueueBus::Driver.perform(attributes.merge("bus_event_type" => "the_event"))
152
+
153
+ hash = JSON.parse(QueueBus.redis { |redis| redis.lpop("queue:sub_queue1") })
154
+ hash["class"].should == "SubModule::SubscriberTest3"
155
+ hash["args"].should == [ {"bus_rider_app_key"=>"sub_module", "bus_rider_sub_key"=>"SubModule::SubscriberTest3.test3", "bus_rider_queue" => "sub_queue1", "bus_rider_class_name"=>"SubModule::SubscriberTest3",
156
+ "bus_event_type" => "the_event", "x" => "y"}.merge(bus_attrs) ]
157
+
158
+ QueueBus::Runner1.value.should == 0
159
+ QueueBus::Runner2.value.should == 0
160
+ QueueBus::Util.constantize(hash["class"]).perform(*hash["args"])
161
+ QueueBus::Runner1.value.should == 1
162
+ QueueBus::Runner2.value.should == 0
163
+
164
+ hash = JSON.parse(QueueBus.redis { |redis| redis.lpop("queue:sub_queue2") })
165
+ hash["class"].should == "SubModule::SubscriberTest3"
166
+ hash["args"].should == [ {"bus_rider_app_key"=>"sub_module", "bus_rider_sub_key"=>"SubModule::SubscriberTest3.the_event", "bus_rider_queue" => "sub_queue2", "bus_rider_class_name"=>"SubModule::SubscriberTest3",
167
+ "bus_event_type" => "the_event", "x" => "y"}.merge(bus_attrs) ]
168
+
169
+ QueueBus::Runner1.value.should == 1
170
+ QueueBus::Runner2.value.should == 0
171
+ QueueBus::Util.constantize(hash["class"]).perform(*hash["args"])
172
+ QueueBus::Runner1.value.should == 1
173
+ QueueBus::Runner2.value.should == 1
174
+ end
175
+
176
+ it "should subscribe to default and attributes" do
177
+ dispatcher = QueueBus.dispatcher_by_key("my_thing")
178
+ all = dispatcher.subscriptions.all
179
+
180
+ sub = all.select{ |s| s.key == "SubscriberTest1.event_sub"}.first
181
+ sub.queue_name.should == "myqueue"
182
+ sub.class_name.should == "SubscriberTest1"
183
+ sub.key.should == "SubscriberTest1.event_sub"
184
+ sub.matcher.filters.should == {"bus_event_type"=>"event_sub"}
185
+
186
+ sub = all.select{ |s| s.key == "SubscriberTest1.thing_filter"}.first
187
+ sub.queue_name.should == "myqueue"
188
+ sub.class_name.should == "SubscriberTest1"
189
+ sub.key.should == "SubscriberTest1.thing_filter"
190
+ sub.matcher.filters.should == {"x"=>"y"}
191
+
192
+ QueueBus::Driver.perform(attributes.merge("bus_event_type" => "event_sub"))
193
+ QueueBus.redis { |redis| redis.smembers("queues") }.should =~ ["myqueue"]
194
+
195
+ pop1 = JSON.parse(QueueBus.redis { |redis| redis.lpop("queue:myqueue") })
196
+ pop2 = JSON.parse(QueueBus.redis { |redis| redis.lpop("queue:myqueue") })
197
+
198
+ if pop1["args"].first["bus_rider_sub_key"] == "SubscriberTest1.thing_filter"
199
+ hash1 = pop1
200
+ hash2 = pop2
201
+ else
202
+ hash1 = pop2
203
+ hash2 = pop1
204
+ end
205
+
206
+ hash1["class"].should == "SubscriberTest1"
207
+ hash1["args"].first.should eq({"bus_rider_app_key"=>"my_thing", "bus_rider_sub_key"=>"SubscriberTest1.thing_filter", "bus_rider_queue" => "myqueue", "bus_rider_class_name"=>"SubscriberTest1",
208
+ "bus_event_type" => "event_sub", "x" => "y"}.merge(bus_attrs))
209
+
210
+ QueueBus::Runner1.value.should == 0
211
+ QueueBus::Runner2.value.should == 0
212
+ QueueBus::Util.constantize(hash1["class"]).perform(*hash1["args"])
213
+ QueueBus::Runner1.value.should == 0
214
+ QueueBus::Runner2.value.should == 1
215
+
216
+ hash2["class"].should == "SubscriberTest1"
217
+ hash2["args"].should == [ {"bus_rider_app_key"=>"my_thing", "bus_rider_sub_key"=>"SubscriberTest1.event_sub", "bus_rider_queue" => "myqueue", "bus_rider_class_name"=>"SubscriberTest1",
218
+ "bus_event_type" => "event_sub", "x" => "y"}.merge(bus_attrs) ]
219
+
220
+ QueueBus::Runner1.value.should == 0
221
+ QueueBus::Runner2.value.should == 1
222
+ QueueBus::Util.constantize(hash2["class"]).perform(*hash2["args"])
223
+ QueueBus::Runner1.value.should == 1
224
+ QueueBus::Runner2.value.should == 1
225
+
226
+ QueueBus::Driver.perform(attributes.merge("bus_event_type" => "event_sub_other"))
227
+ QueueBus.redis { |redis| redis.smembers("queues") }.should =~ ["myqueue"]
228
+
229
+ hash = JSON.parse(QueueBus.redis { |redis| redis.lpop("queue:myqueue") })
230
+ hash["class"].should == "SubscriberTest1"
231
+ hash["args"].should == [ {"bus_rider_app_key"=>"my_thing", "bus_rider_sub_key"=>"SubscriberTest1.thing_filter", "bus_rider_queue" => "myqueue", "bus_rider_class_name"=>"SubscriberTest1",
232
+ "bus_event_type" => "event_sub_other", "x" => "y"}.merge(bus_attrs) ]
233
+
234
+ QueueBus::Runner1.value.should == 1
235
+ QueueBus::Runner2.value.should == 1
236
+ QueueBus::Util.constantize(hash["class"]).perform(*hash["args"])
237
+ QueueBus::Runner1.value.should == 1
238
+ QueueBus::Runner2.value.should == 2
239
+
240
+ QueueBus::Driver.perform({"x"=>"z"}.merge("bus_event_type" => "event_sub_other"))
241
+ QueueBus.redis { |redis| redis.smembers("queues") }.should =~ ["myqueue"]
242
+
243
+ QueueBus.redis { |redis| redis.lpop("queue:myqueue") }.should be_nil
244
+ end
245
+
246
+ it "should have gotten the perform method from the ::Worker" do
247
+ SubscriberTest1.instance_methods.should include(:perform)
248
+ end
249
+
250
+ describe ".perform" do
251
+ let(:attributes) { {"bus_rider_sub_key"=>"SubscriberTest1.event_sub", "bus_locale" => "en", "bus_timezone" => "PST"} }
252
+ it "should call the method based on key" do
253
+ SubscriberTest1.any_instance.should_receive(:event_sub)
254
+ SubscriberTest1.perform(attributes)
255
+ end
256
+ it "should set the timezone and locale if present" do
257
+ defined?(I18n).should be_nil
258
+ Time.respond_to?(:zone).should eq(false)
259
+
260
+ stub_const("I18n", Class.new)
261
+ I18n.should_receive(:locale=).with("en")
262
+ Time.should_receive(:zone=).with("PST")
263
+
264
+ SubscriberTest1.any_instance.should_receive(:event_sub)
265
+ SubscriberTest1.perform(attributes)
266
+ end
267
+ end
268
+ end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ module QueueBus
4
+ describe SubscriptionList do
5
+ describe ".from_redis" do
6
+ it "should return from attributes" do
7
+ mult = {"event_one" => {"class" => "MyClass", "queue_name" => "default", "key" => "event_one", "matcher" => {"bus_event_type" => "event_one"}},
8
+ "event_two" => {"class" => "MyClass", "queue_name" => "else", "key" => "event_two", "matcher" => {"bus_event_type" => "event_two"}}}
9
+
10
+ list = SubscriptionList.from_redis(mult)
11
+ list.size.should == 2
12
+ one = list.key("event_one")
13
+ two = list.key("event_two")
14
+
15
+ one.key.should == "event_one"
16
+ one.key.should == "event_one"
17
+ one.queue_name.should == "default"
18
+ one.class_name.should == "MyClass"
19
+ one.matcher.filters.should == {"bus_event_type" => "event_one"}
20
+
21
+ two.key.should == "event_two"
22
+ two.key.should == "event_two"
23
+ two.queue_name.should == "else"
24
+ two.class_name.should == "MyClass"
25
+ two.matcher.filters.should == {"bus_event_type" => "event_two"}
26
+ end
27
+ end
28
+
29
+ describe "#to_redis" do
30
+ it "should generate what to store" do
31
+ list = SubscriptionList.new
32
+ list.add(Subscription.new("default", "key1", "MyClass", {"bus_event_type" => "event_one"}))
33
+ list.add(Subscription.new("else_ok", "key2", "MyClass", {"bus_event_type" => "event_two"}))
34
+
35
+ hash = list.to_redis
36
+ hash.should == { "key1" => {"queue_name" => "default", "key" => "key1", "class" => "MyClass", "matcher" => {"bus_event_type" => "event_one"}},
37
+ "key2" => {"queue_name" => "else_ok", "key" => "key2", "class" => "MyClass", "matcher" => {"bus_event_type" => "event_two"}}
38
+ }
39
+
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ module QueueBus
4
+ describe Subscription do
5
+ it "should normalize the queue name" do
6
+ Subscription.new("test", "my_event", "MyClass", {}, nil).queue_name.should == "test"
7
+ Subscription.new("tes t", "my_event", "MyClass", {}, nil).queue_name.should == "tes_t"
8
+ Subscription.new("t%s", "my_event", "MyClass", {}, nil).queue_name.should == "t_s"
9
+ end
10
+
11
+ describe ".register" do
12
+ it "should take in args from dispatcher" do
13
+ executor = Proc.new { |attributes| }
14
+ sub = Subscription.register("queue_name", "mykey", "MyClass", {"bus_event_type" => "my_event"}, executor)
15
+ sub.send(:executor).should == executor
16
+ sub.matcher.filters.should == {"bus_event_type" => "my_event"}
17
+ sub.queue_name.should == "queue_name"
18
+ sub.key.should == "mykey"
19
+ sub.class_name.should == "MyClass"
20
+ end
21
+ end
22
+
23
+ describe "#execute!" do
24
+ it "should call the executor with the attributes" do
25
+ exec = Object.new
26
+ exec.should_receive(:call)
27
+
28
+ sub = Subscription.new("x", "y", "ClassName", {}, exec)
29
+ sub.execute!({"ok" => true})
30
+ end
31
+ end
32
+
33
+ describe "#to_redis" do
34
+ it "should return what to store for this subscription" do
35
+ sub = Subscription.new("queue_one", "xyz", "ClassName", {"bus_event_type" => "my_event"}, nil)
36
+ sub.to_redis.should == {"queue_name" => "queue_one", "key" => "xyz", "class" => "ClassName", "matcher" => {"bus_event_type" => "my_event"}}
37
+ end
38
+ end
39
+
40
+ describe "#matches?" do
41
+ it "should do pattern stuff" do
42
+ Subscription.new("x", "id", "ClassName", {"bus_event_type" => "one"}).matches?("bus_event_type" => "one").should == true
43
+ Subscription.new("x", "id", "ClassName", {"bus_event_type" => "one"}).matches?("bus_event_type" => "onex").should == false
44
+ Subscription.new("x", "id", "ClassName", {"bus_event_type" => "^one.*$"}).matches?("bus_event_type" => "onex").should == true
45
+ Subscription.new("x", "id", "ClassName", {"bus_event_type" => "one.*"}).matches?("bus_event_type" => "onex").should == true
46
+ Subscription.new("x", "id", "ClassName", {"bus_event_type" => "one.?"}).matches?("bus_event_type" => "onex").should == true
47
+ Subscription.new("x", "id", "ClassName", {"bus_event_type" => "one.?"}).matches?("bus_event_type" => "one").should == true
48
+ Subscription.new("x", "id", "ClassName", {"bus_event_type" => "\\"}).matches?("bus_event_type" => "one").should == false
49
+ end
50
+ end
51
+
52
+ end
53
+ end
metadata ADDED
@@ -0,0 +1,192 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: queue-bus
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Brian Leonard
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2015-01-17 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: multi_json
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: redis
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rspec
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: timecop
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: json_pure
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ description: A simple event bus on top of common background queues. Publish and subscribe
95
+ to events as they occur using what you already have.
96
+ email:
97
+ - brian@bleonard.com
98
+ executables: []
99
+ extensions: []
100
+ extra_rdoc_files: []
101
+ files:
102
+ - .gitignore
103
+ - .rbenv-version
104
+ - .rspec
105
+ - .rvmrc
106
+ - Gemfile
107
+ - MIT-LICENSE
108
+ - README.mdown
109
+ - Rakefile
110
+ - lib/queue-bus.rb
111
+ - lib/queue_bus/adapters/base.rb
112
+ - lib/queue_bus/adapters/data.rb
113
+ - lib/queue_bus/application.rb
114
+ - lib/queue_bus/config.rb
115
+ - lib/queue_bus/dispatch.rb
116
+ - lib/queue_bus/dispatchers.rb
117
+ - lib/queue_bus/driver.rb
118
+ - lib/queue_bus/heartbeat.rb
119
+ - lib/queue_bus/local.rb
120
+ - lib/queue_bus/matcher.rb
121
+ - lib/queue_bus/publisher.rb
122
+ - lib/queue_bus/publishing.rb
123
+ - lib/queue_bus/rider.rb
124
+ - lib/queue_bus/subscriber.rb
125
+ - lib/queue_bus/subscription.rb
126
+ - lib/queue_bus/subscription_list.rb
127
+ - lib/queue_bus/task_manager.rb
128
+ - lib/queue_bus/util.rb
129
+ - lib/queue_bus/version.rb
130
+ - lib/queue_bus/worker.rb
131
+ - lib/tasks/resquebus.rake
132
+ - queue-bus.gemspec
133
+ - spec/adapter/publish_at_spec.rb
134
+ - spec/adapter/support.rb
135
+ - spec/adapter_spec.rb
136
+ - spec/application_spec.rb
137
+ - spec/config_spec.rb
138
+ - spec/dispatch_spec.rb
139
+ - spec/driver_spec.rb
140
+ - spec/heartbeat_spec.rb
141
+ - spec/integration_spec.rb
142
+ - spec/matcher_spec.rb
143
+ - spec/publish_spec.rb
144
+ - spec/publisher_spec.rb
145
+ - spec/rider_spec.rb
146
+ - spec/spec_helper.rb
147
+ - spec/subscriber_spec.rb
148
+ - spec/subscription_list_spec.rb
149
+ - spec/subscription_spec.rb
150
+ homepage: ''
151
+ licenses: []
152
+ post_install_message:
153
+ rdoc_options: []
154
+ require_paths:
155
+ - lib
156
+ required_ruby_version: !ruby/object:Gem::Requirement
157
+ none: false
158
+ requirements:
159
+ - - ! '>='
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ required_rubygems_version: !ruby/object:Gem::Requirement
163
+ none: false
164
+ requirements:
165
+ - - ! '>='
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
168
+ requirements: []
169
+ rubyforge_project: queue-bus
170
+ rubygems_version: 1.8.23
171
+ signing_key:
172
+ specification_version: 3
173
+ summary: A simple event bus on top of background queues
174
+ test_files:
175
+ - spec/adapter/publish_at_spec.rb
176
+ - spec/adapter/support.rb
177
+ - spec/adapter_spec.rb
178
+ - spec/application_spec.rb
179
+ - spec/config_spec.rb
180
+ - spec/dispatch_spec.rb
181
+ - spec/driver_spec.rb
182
+ - spec/heartbeat_spec.rb
183
+ - spec/integration_spec.rb
184
+ - spec/matcher_spec.rb
185
+ - spec/publish_spec.rb
186
+ - spec/publisher_spec.rb
187
+ - spec/rider_spec.rb
188
+ - spec/spec_helper.rb
189
+ - spec/subscriber_spec.rb
190
+ - spec/subscription_list_spec.rb
191
+ - spec/subscription_spec.rb
192
+ has_rdoc: