queue-bus 0.5.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.
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: