rcelery 1.0.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 (47) hide show
  1. data/Gemfile +3 -0
  2. data/LICENSE +27 -0
  3. data/Rakefile +34 -0
  4. data/bin/rceleryd +7 -0
  5. data/lib/rcelery/async_result.rb +23 -0
  6. data/lib/rcelery/configuration.rb +25 -0
  7. data/lib/rcelery/daemon.rb +82 -0
  8. data/lib/rcelery/eager_result.rb +10 -0
  9. data/lib/rcelery/events.rb +103 -0
  10. data/lib/rcelery/pool.rb +59 -0
  11. data/lib/rcelery/rails.rb +29 -0
  12. data/lib/rcelery/railtie.rb +11 -0
  13. data/lib/rcelery/task/context.rb +25 -0
  14. data/lib/rcelery/task/runner.rb +73 -0
  15. data/lib/rcelery/task.rb +118 -0
  16. data/lib/rcelery/task_support.rb +56 -0
  17. data/lib/rcelery/version.rb +6 -0
  18. data/lib/rcelery/worker.rb +76 -0
  19. data/lib/rcelery.rb +86 -0
  20. data/rails/init.rb +4 -0
  21. data/rcelery.gemspec +28 -0
  22. data/spec/bin/ci +81 -0
  23. data/spec/integration/Procfile +4 -0
  24. data/spec/integration/bin/celeryd +4 -0
  25. data/spec/integration/bin/rabbitmq-server +4 -0
  26. data/spec/integration/bin/rceleryd +4 -0
  27. data/spec/integration/python_components/celery_client.py +5 -0
  28. data/spec/integration/python_components/celery_deferred_client.py +10 -0
  29. data/spec/integration/python_components/celeryconfig.py +26 -0
  30. data/spec/integration/python_components/requirements.txt +9 -0
  31. data/spec/integration/python_components/tasks.py +13 -0
  32. data/spec/integration/ruby_client_python_worker_spec.rb +17 -0
  33. data/spec/integration/ruby_worker_spec.rb +115 -0
  34. data/spec/integration/spec_helper.rb +43 -0
  35. data/spec/integration/tasks.rb +37 -0
  36. data/spec/spec_helper.rb +34 -0
  37. data/spec/unit/configuration_spec.rb +91 -0
  38. data/spec/unit/daemon_spec.rb +21 -0
  39. data/spec/unit/eager_spec.rb +46 -0
  40. data/spec/unit/events_spec.rb +149 -0
  41. data/spec/unit/pool_spec.rb +124 -0
  42. data/spec/unit/rails_spec.rb +0 -0
  43. data/spec/unit/rcelery_spec.rb +154 -0
  44. data/spec/unit/task_spec.rb +192 -0
  45. data/spec/unit/task_support_spec.rb +94 -0
  46. data/spec/unit/worker_spec.rb +63 -0
  47. metadata +290 -0
@@ -0,0 +1,192 @@
1
+ require 'spec_helper'
2
+
3
+ describe RCelery::Task do
4
+ module Tasks
5
+ include RCelery::TaskSupport
6
+
7
+ task(:name => 'different_name', :ignore_result => false, :routing_key => 'different_route')
8
+ def add(a,b, options = {})
9
+ noop(a + b + (options['c'] || 0))
10
+ end
11
+
12
+ task()
13
+ def ignore
14
+ 'ignore_me'
15
+ end
16
+
17
+ def noop(val)
18
+ val
19
+ end
20
+ end
21
+
22
+ before :each do
23
+ @task = RCelery::Task.all_tasks['different_name']
24
+ end
25
+
26
+ describe '.all_tasks' do
27
+ it 'returns a hash of all tasks by name' do
28
+ RCelery::Task.all_tasks.each do |name, task|
29
+ task.name.should == name
30
+ end
31
+ end
32
+ end
33
+
34
+ describe '.result_queue' do
35
+ it 'returns the result_queue for the task_id' do
36
+ result_queue = Object.new
37
+ mock(result_queue).bind('result_exchange', hash_including(:routing_key => 'someuuid')) { result_queue }
38
+
39
+ channel = Object.new
40
+ mock(channel).queue('someuuid', hash_including(:durable => true, :auto_delete => true,
41
+ :arguments => { 'x-expires' => 3600000 })) { result_queue }
42
+
43
+ stub(RCelery).channel { channel }
44
+ stub(RCelery).exchanges { {:result => 'result_exchange'} }
45
+
46
+ RCelery::Task.result_queue('some-uuid').should == result_queue
47
+ end
48
+ end
49
+
50
+ describe '.execute' do
51
+ it 'establishes the result queue' do
52
+ any_instance_of(RCelery::Task::Runner) do |t|
53
+ stub(t).publish_result
54
+ end
55
+
56
+ result_queue = Object.new
57
+ mock(result_queue).bind('result_exchange', hash_including(:routing_key => 'guid')) { result_queue }
58
+
59
+ channel = Object.new
60
+ mock(channel).queue('guid', hash_including(:durable => true, :auto_delete => true,
61
+ :arguments => { 'x-expires' => 3600000 })) { result_queue }
62
+
63
+ stub(RCelery).channel { channel }
64
+ stub(RCelery).exchanges { {:result => 'result_exchange'} }
65
+
66
+ task = {'task' => 'different_name', 'args' => [1,2], 'kwargs' => {'c' => 3}, 'id' => 'guid'}
67
+
68
+ RCelery::Task.execute(task)
69
+ end
70
+
71
+ it 'takes a message, determines what task class generated it and passes the args/kwargs returning an instnace of a task runner' do
72
+ stub(RCelery::Task).result_queue
73
+ any_instance_of(RCelery::Task::Runner) do |t|
74
+ stub(t).publish_result
75
+ end
76
+
77
+ task = {'task' => 'different_name', 'args' => [1,2], 'kwargs' => {'c' => 3}, 'id' => 'guid'}
78
+
79
+ runner = nil
80
+ lambda {
81
+ runner = RCelery::Task.execute(task)
82
+ }.should_not raise_error
83
+
84
+ runner.should be_a(RCelery::Task::Runner)
85
+ end
86
+
87
+ it 'publishes the successful result to the result queue when ignore_result is false' do
88
+ stub(RCelery::Task).result_queue
89
+ mock(results = Object.new).publish({ :result => 6, :status => 'SUCCESS',
90
+ :task_id => 'guid', :traceback => [] }.to_json, hash_including(:persistent => true))
91
+ channel, queue = stub_amqp
92
+
93
+ stub(channel).direct('celeryresults', anything) { results }
94
+
95
+ RCelery.start
96
+
97
+ task = {'task' => 'different_name', 'args' => [1,2], 'kwargs' => {'c' => 3}, 'id' => 'guid'}
98
+
99
+ RCelery::Task.execute(task)
100
+ RCelery.stop
101
+ end
102
+
103
+ it 'publishes the failed result to the result queue when ignore_result is false' do
104
+ stub(RCelery::Task).result_queue
105
+ task = {'task' => 'tasks.error', 'id' => 'guid'}
106
+
107
+ raised = Exception.new
108
+ begin
109
+ raise raised
110
+ rescue Exception
111
+ end
112
+
113
+ Tasks.task(:ignore_result => false)
114
+ Tasks.send(:define_method, :error) do
115
+ raise raised
116
+ end
117
+
118
+ results = mock!.publish({ :result => raised, :status => 'FAILURE',
119
+ :task_id => 'guid', :traceback => raised.backtrace }.to_json, hash_including(:persistent => true)).subject
120
+ channel, queue = stub_amqp
121
+
122
+ stub(channel).direct('celeryresults', anything) { results }
123
+
124
+ RCelery.start
125
+
126
+ RCelery::Task.execute(task)
127
+
128
+ RCelery.stop
129
+ end
130
+ end
131
+
132
+ describe '#initialize' do
133
+ it 'sets the name' do
134
+ task = RCelery::Task.new(:name => 'some_name')
135
+ task.name.should == 'some_name'
136
+ end
137
+
138
+ it 'sets the method' do
139
+ task = RCelery::Task.new(:method => 'some_method')
140
+ task.method.should == 'some_method'
141
+ end
142
+
143
+ it 'sets the routing key' do
144
+ task = RCelery::Task.new(:routing_key => 'something')
145
+ task.instance_variable_get(:@routing_key).should == 'something'
146
+ end
147
+
148
+ it 'sets ignore_result and expects it to be a boolean' do
149
+ task = RCelery::Task.new(:ignore_result => false)
150
+ task.ignore_result?.should be_false
151
+ end
152
+
153
+ it 'defaults ignore_result to true' do
154
+ task = RCelery::Task.new
155
+ task.ignore_result?.should be_true
156
+ end
157
+ end
158
+
159
+ describe '#delay' do
160
+ it 'publishes a message to the request exchange with the correct arguments' do
161
+ stub(UUID).generate { 'some_uuid' }
162
+ request = mock!.publish({:id => 'some_uuid', :task => 'different_name',
163
+ :args => [1,2], :kwargs => {:some => 'kwarg'}}.to_json, hash_including(:persistent => true, :routing_key => 'different_route')).subject
164
+ channel, queue = stub_amqp
165
+
166
+ stub(channel).direct('celery', anything) { request }
167
+
168
+ RCelery.start
169
+
170
+ @task.delay(1,2,{:some => 'kwarg'})
171
+
172
+ RCelery.stop
173
+ end
174
+ end
175
+
176
+ describe '#apply_async' do
177
+ it 'can override routing key' do
178
+ stub(UUID).generate { 'some_uuid' }
179
+ request = mock!.publish({:id => 'some_uuid', :task => 'different_name',
180
+ :args => [1,2], :kwargs => {:some => 'kwarg'}}.to_json, hash_including(:persistent => true, :routing_key => 'the_route')).subject
181
+ channel, queue = stub_amqp
182
+
183
+ stub(channel).direct('celery', anything) { request }
184
+
185
+ RCelery.start
186
+
187
+ @task.apply_async(:args=>[1,2],:kwargs=>{:some => 'kwarg'},:routing_key=>'the_route')
188
+
189
+ RCelery.stop
190
+ end
191
+ end
192
+ end
@@ -0,0 +1,94 @@
1
+ require 'spec_helper'
2
+
3
+ describe RCelery::TaskSupport do
4
+ describe '.included' do
5
+ it 'extends the subject with TaskSupport::ClassMethods' do
6
+ mod = Module.new { include RCelery::TaskSupport }
7
+ mod.should respond_to(:task)
8
+ mod.should respond_to(:method_added)
9
+ end
10
+ end
11
+
12
+ describe '.task_name' do
13
+ it 'returns a dotted lowercase task name' do
14
+ task_name = RCelery::TaskSupport.task_name('Some::InnerMod', :Method)
15
+ task_name.should == 'some.inner_mod.method'
16
+ end
17
+ end
18
+
19
+ describe RCelery::TaskSupport::ClassMethods do
20
+ before :each do
21
+ @mod = Module.new { include RCelery::TaskSupport }
22
+ end
23
+
24
+ describe '#task' do
25
+ it 'sets the current task options for the method defined next' do
26
+ @mod.task(:some_option => true)
27
+ @mod.current_options.should == {:some_option => true}
28
+ end
29
+ end
30
+
31
+ describe '#method_added' do
32
+ after :each do
33
+ RCelery::Task.all_tasks.delete('some_method')
34
+ RCelery::Task.all_tasks.delete('another_method')
35
+ end
36
+
37
+ describe 'when the current_options are set' do
38
+ describe 'it replaces the new method with another one that'
39
+ it 'returns a RCelery::Task object when it is called with no arguments' do
40
+ mod = @mod
41
+ mod.task(:some_option => true)
42
+ mod.send(:define_method,:some_method) do
43
+ "not returned"
44
+ end
45
+
46
+ klass = Class.new { include mod }
47
+ klass.new.some_method.should be_a(RCelery::Task)
48
+ end
49
+
50
+ it 'returns normally when called with arguments and is executed with the expected binding' do
51
+ mod = @mod
52
+ mod.task(:some_option => true)
53
+ mod.send(:define_method,:some_method) do |a|
54
+ a + @b
55
+ end
56
+
57
+ klass = Class.new do
58
+ include mod
59
+
60
+ def initialize(b)
61
+ @b = b
62
+ end
63
+ end
64
+ klass.new(2).some_method(1).should == 3
65
+ end
66
+
67
+ it 'takes an argument nil for methods that have an arity of 0 and returns normally' do
68
+ mod = @mod
69
+ mod.task(:some_option => true)
70
+ mod.send(:define_method,:some_method) do
71
+ "returned"
72
+ end
73
+
74
+ klass = Class.new { include mod }
75
+ klass.new.some_method(nil).should == 'returned'
76
+ end
77
+
78
+ it 'creates an RCelery::Task that has a method with the correct binding' do
79
+ mod = @mod
80
+ mod.task(:some_option => true)
81
+ mod.send(:define_method,:some_method) do
82
+ another_method
83
+ end
84
+ mod.send(:define_method,:another_method) do
85
+ 'returned'
86
+ end
87
+
88
+ klass = Class.new { include mod }
89
+ klass.new.some_method.method.call.should == 'returned'
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+
3
+ describe RCelery::Worker do
4
+ include RR::Adapters::RRMethods
5
+
6
+ before(:each) do
7
+ @channel, @queue = stub_amqp
8
+ end
9
+
10
+ after :each do
11
+ RCelery.stop
12
+ end
13
+
14
+ describe '.start' do
15
+ it 'sends a worker online event' do
16
+ mock(RCelery::Events).worker_online('rcelery',RCelery::VERSION,RUBY_PLATFORM)
17
+ stub(RCelery::Events).worker_offline
18
+ pool = RCelery::Pool.new
19
+ worker = RCelery::Worker.new
20
+ stub(worker).subscribe
21
+ worker.start pool
22
+ worker.stop
23
+ end
24
+ end
25
+
26
+ describe '.stop' do
27
+
28
+ it 'sends a worker offline event' do
29
+ stub(RCelery::Events).worker_online
30
+ mock(RCelery::Events).worker_offline('rcelery',RCelery::VERSION,RUBY_PLATFORM)
31
+
32
+ pool = RCelery::Pool.new
33
+ worker = RCelery::Worker.new
34
+ stub(worker).subscribe
35
+ worker.start pool
36
+ worker.stop
37
+ end
38
+
39
+ it 'stops the heartbeat' do
40
+ stub(RCelery::Events).worker_online
41
+ stub(RCelery::Events).worker_offline
42
+
43
+ pool = RCelery::Pool.new
44
+ worker = RCelery::Worker.new
45
+ stub(worker).subscribe
46
+ worker.start pool
47
+ worker.instance_variable_set(:@heartbeat_timer, mock!.cancel.subject)
48
+ worker.stop
49
+ end
50
+ end
51
+
52
+ def fuzzy_hash(expected)
53
+ proc do |arg|
54
+ parsed = JSON.parse(arg)
55
+ good = true
56
+ parsed.each do |k,v|
57
+ next if v.to_s == expected[k].to_s
58
+ good = false
59
+ end
60
+ good
61
+ end
62
+ end
63
+ end
metadata ADDED
@@ -0,0 +1,290 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rcelery
3
+ version: !ruby/object:Gem::Version
4
+ hash: 23
5
+ prerelease: false
6
+ segments:
7
+ - 1
8
+ - 0
9
+ - 0
10
+ version: 1.0.0
11
+ platform: ruby
12
+ authors:
13
+ - John MacKenzie
14
+ - Kris Schultz
15
+ - Nat Williams
16
+ autorequire:
17
+ bindir: bin
18
+ cert_chain: []
19
+
20
+ date: 2011-10-19 00:00:00 -05:00
21
+ default_executable:
22
+ dependencies:
23
+ - !ruby/object:Gem::Dependency
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ hash: 5
30
+ segments:
31
+ - 0
32
+ - 7
33
+ - 3
34
+ version: 0.7.3
35
+ type: :runtime
36
+ name: amqp
37
+ prerelease: false
38
+ version_requirements: *id001
39
+ - !ruby/object:Gem::Dependency
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ hash: 3
46
+ segments:
47
+ - 2
48
+ - 0
49
+ version: "2.0"
50
+ type: :runtime
51
+ name: uuid
52
+ prerelease: false
53
+ version_requirements: *id002
54
+ - !ruby/object:Gem::Dependency
55
+ requirement: &id003 !ruby/object:Gem::Requirement
56
+ none: false
57
+ requirements:
58
+ - - ~>
59
+ - !ruby/object:Gem::Version
60
+ hash: 15
61
+ segments:
62
+ - 1
63
+ - 0
64
+ version: "1.0"
65
+ type: :runtime
66
+ name: json
67
+ prerelease: false
68
+ version_requirements: *id003
69
+ - !ruby/object:Gem::Dependency
70
+ requirement: &id004 !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ hash: 5
76
+ segments:
77
+ - 2
78
+ - 3
79
+ version: "2.3"
80
+ type: :runtime
81
+ name: configtoolkit
82
+ prerelease: false
83
+ version_requirements: *id004
84
+ - !ruby/object:Gem::Dependency
85
+ requirement: &id005 !ruby/object:Gem::Requirement
86
+ none: false
87
+ requirements:
88
+ - - ~>
89
+ - !ruby/object:Gem::Version
90
+ hash: 9
91
+ segments:
92
+ - 0
93
+ - 1
94
+ - 9
95
+ version: 0.1.9
96
+ type: :runtime
97
+ name: qusion
98
+ prerelease: false
99
+ version_requirements: *id005
100
+ - !ruby/object:Gem::Dependency
101
+ requirement: &id006 !ruby/object:Gem::Requirement
102
+ none: false
103
+ requirements:
104
+ - - ~>
105
+ - !ruby/object:Gem::Version
106
+ hash: 15
107
+ segments:
108
+ - 2
109
+ - 6
110
+ version: "2.6"
111
+ type: :development
112
+ name: rspec
113
+ prerelease: false
114
+ version_requirements: *id006
115
+ - !ruby/object:Gem::Dependency
116
+ requirement: &id007 !ruby/object:Gem::Requirement
117
+ none: false
118
+ requirements:
119
+ - - ~>
120
+ - !ruby/object:Gem::Version
121
+ hash: 63
122
+ segments:
123
+ - 0
124
+ - 9
125
+ - 2
126
+ version: 0.9.2
127
+ type: :development
128
+ name: rake
129
+ prerelease: false
130
+ version_requirements: *id007
131
+ - !ruby/object:Gem::Dependency
132
+ requirement: &id008 !ruby/object:Gem::Requirement
133
+ none: false
134
+ requirements:
135
+ - - ~>
136
+ - !ruby/object:Gem::Version
137
+ hash: 15
138
+ segments:
139
+ - 1
140
+ - 0
141
+ version: "1.0"
142
+ type: :development
143
+ name: rr
144
+ prerelease: false
145
+ version_requirements: *id008
146
+ - !ruby/object:Gem::Dependency
147
+ requirement: &id009 !ruby/object:Gem::Requirement
148
+ none: false
149
+ requirements:
150
+ - - ~>
151
+ - !ruby/object:Gem::Version
152
+ hash: 13
153
+ segments:
154
+ - 1
155
+ - 1
156
+ version: "1.1"
157
+ type: :development
158
+ name: SystemTimer
159
+ prerelease: false
160
+ version_requirements: *id009
161
+ - !ruby/object:Gem::Dependency
162
+ requirement: &id010 !ruby/object:Gem::Requirement
163
+ none: false
164
+ requirements:
165
+ - - ~>
166
+ - !ruby/object:Gem::Version
167
+ hash: 35
168
+ segments:
169
+ - 0
170
+ - 20
171
+ version: "0.20"
172
+ type: :development
173
+ name: foreman
174
+ prerelease: false
175
+ version_requirements: *id010
176
+ description:
177
+ email: oss@leapfrogdevelopment.com
178
+ executables:
179
+ - rceleryd
180
+ extensions: []
181
+
182
+ extra_rdoc_files: []
183
+
184
+ files:
185
+ - Gemfile
186
+ - LICENSE
187
+ - Rakefile
188
+ - bin/rceleryd
189
+ - lib/rcelery.rb
190
+ - lib/rcelery/async_result.rb
191
+ - lib/rcelery/configuration.rb
192
+ - lib/rcelery/daemon.rb
193
+ - lib/rcelery/eager_result.rb
194
+ - lib/rcelery/events.rb
195
+ - lib/rcelery/pool.rb
196
+ - lib/rcelery/rails.rb
197
+ - lib/rcelery/railtie.rb
198
+ - lib/rcelery/task.rb
199
+ - lib/rcelery/task/context.rb
200
+ - lib/rcelery/task/runner.rb
201
+ - lib/rcelery/task_support.rb
202
+ - lib/rcelery/version.rb
203
+ - lib/rcelery/worker.rb
204
+ - rails/init.rb
205
+ - rcelery.gemspec
206
+ - spec/bin/ci
207
+ - spec/integration/Procfile
208
+ - spec/integration/bin/celeryd
209
+ - spec/integration/bin/rabbitmq-server
210
+ - spec/integration/bin/rceleryd
211
+ - spec/integration/python_components/celery_client.py
212
+ - spec/integration/python_components/celery_deferred_client.py
213
+ - spec/integration/python_components/celeryconfig.py
214
+ - spec/integration/python_components/requirements.txt
215
+ - spec/integration/python_components/tasks.py
216
+ - spec/integration/ruby_client_python_worker_spec.rb
217
+ - spec/integration/ruby_worker_spec.rb
218
+ - spec/integration/spec_helper.rb
219
+ - spec/integration/tasks.rb
220
+ - spec/spec_helper.rb
221
+ - spec/unit/configuration_spec.rb
222
+ - spec/unit/daemon_spec.rb
223
+ - spec/unit/eager_spec.rb
224
+ - spec/unit/events_spec.rb
225
+ - spec/unit/pool_spec.rb
226
+ - spec/unit/rails_spec.rb
227
+ - spec/unit/rcelery_spec.rb
228
+ - spec/unit/task_spec.rb
229
+ - spec/unit/task_support_spec.rb
230
+ - spec/unit/worker_spec.rb
231
+ has_rdoc: true
232
+ homepage: http://github.com
233
+ licenses: []
234
+
235
+ post_install_message:
236
+ rdoc_options: []
237
+
238
+ require_paths:
239
+ - lib
240
+ required_ruby_version: !ruby/object:Gem::Requirement
241
+ none: false
242
+ requirements:
243
+ - - ">="
244
+ - !ruby/object:Gem::Version
245
+ hash: 3
246
+ segments:
247
+ - 0
248
+ version: "0"
249
+ required_rubygems_version: !ruby/object:Gem::Requirement
250
+ none: false
251
+ requirements:
252
+ - - ">="
253
+ - !ruby/object:Gem::Version
254
+ hash: 3
255
+ segments:
256
+ - 0
257
+ version: "0"
258
+ requirements: []
259
+
260
+ rubyforge_project:
261
+ rubygems_version: 1.3.7
262
+ signing_key:
263
+ specification_version: 3
264
+ summary: Ruby implementation of the Python Celery library.
265
+ test_files:
266
+ - spec/bin/ci
267
+ - spec/integration/Procfile
268
+ - spec/integration/bin/celeryd
269
+ - spec/integration/bin/rabbitmq-server
270
+ - spec/integration/bin/rceleryd
271
+ - spec/integration/python_components/celery_client.py
272
+ - spec/integration/python_components/celery_deferred_client.py
273
+ - spec/integration/python_components/celeryconfig.py
274
+ - spec/integration/python_components/requirements.txt
275
+ - spec/integration/python_components/tasks.py
276
+ - spec/integration/ruby_client_python_worker_spec.rb
277
+ - spec/integration/ruby_worker_spec.rb
278
+ - spec/integration/spec_helper.rb
279
+ - spec/integration/tasks.rb
280
+ - spec/spec_helper.rb
281
+ - spec/unit/configuration_spec.rb
282
+ - spec/unit/daemon_spec.rb
283
+ - spec/unit/eager_spec.rb
284
+ - spec/unit/events_spec.rb
285
+ - spec/unit/pool_spec.rb
286
+ - spec/unit/rails_spec.rb
287
+ - spec/unit/rcelery_spec.rb
288
+ - spec/unit/task_spec.rb
289
+ - spec/unit/task_support_spec.rb
290
+ - spec/unit/worker_spec.rb