delayed_job 2.0.7 → 2.0.8

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.
data/README.textile CHANGED
@@ -41,6 +41,10 @@ script/plugin install git://github.com/collectiveidea/delayed_job.git -r v2.0
41
41
 
42
42
  After delayed_job is installed, you will need to setup the backend.
43
43
 
44
+ h3. Dependencies
45
+
46
+ delayed_job depends upon version 1.0.10 of the daemons gem. delayed_job is incompatible with the newest (1.1.0) daemons gem.
47
+
44
48
  h2. Backends
45
49
 
46
50
  delayed_job supports multiple backends for storing the job queue. There are currently implementations for Active Record, MongoMapper, and DataMapper.
@@ -1,8 +1,5 @@
1
1
  module Delayed
2
2
  module Backend
3
- class DeserializationError < StandardError
4
- end
5
-
6
3
  module Base
7
4
  def self.included(base)
8
5
  base.extend ClassMethods
@@ -107,7 +104,7 @@ module Delayed
107
104
 
108
105
  raise DeserializationError,
109
106
  'Job failed to load: Unknown handler. Try to manually require the appropriate file.'
110
- rescue TypeError, LoadError, NameError => e
107
+ rescue TypeError, LoadError, NameError, ArgumentError => e
111
108
  raise DeserializationError,
112
109
  "Job failed to load: #{e.message}. Try to manually require the required file."
113
110
  end
@@ -47,6 +47,9 @@ module Delayed
47
47
  opts.on('--sleep-delay N', "Amount of time to sleep when no jobs are found") do |n|
48
48
  @options[:sleep_delay] = n
49
49
  end
50
+ opts.on('-p', '--prefix NAME', "String to be prefixed to worker process names") do |prefix|
51
+ @options[:prefix] = prefix
52
+ end
50
53
  end
51
54
  @args = opts.parse!(args)
52
55
  end
@@ -76,6 +79,7 @@ module Delayed
76
79
 
77
80
  def run_process(process_name, dir)
78
81
  Daemons.run_proc(process_name, :dir => dir, :dir_mode => :normal, :monitor => @monitor, :ARGV => @args) do |*args|
82
+ $0 = File.join @options[:prefix], process_name if @options[:prefix]
79
83
  run process_name
80
84
  end
81
85
  end
@@ -0,0 +1,4 @@
1
+ module Delayed
2
+ class DeserializationError < StandardError
3
+ end
4
+ end
@@ -124,8 +124,11 @@ module Delayed
124
124
  end
125
125
  say "#{job.name} completed after %.4f" % runtime
126
126
  return true # did work
127
- rescue Exception => e
128
- handle_failed_job(job, e)
127
+ rescue DeserializationError => error
128
+ job.last_error = "{#{error.message}\n#{error.backtrace.join('\n')}"
129
+ failed(job)
130
+ rescue Exception => error
131
+ handle_failed_job(job, error)
129
132
  return false # work failed
130
133
  end
131
134
 
@@ -138,14 +141,21 @@ module Delayed
138
141
  job.save!
139
142
  else
140
143
  say "PERMANENTLY removing #{job.name} because of #{job.attempts} consecutive failures.", Logger::INFO
144
+ failed(job)
145
+ end
146
+ end
141
147
 
148
+ def failed(job)
149
+ begin
142
150
  if job.payload_object.respond_to? :on_permanent_failure
143
- say "Running on_permanent_failure hook"
144
- job.payload_object.on_permanent_failure
151
+ say "Running on_permanent_failure hook"
152
+ job.payload_object.on_permanent_failure
145
153
  end
146
-
147
- self.class.destroy_failed_jobs ? job.destroy : job.update_attributes(:failed_at => Delayed::Job.db_time_now)
154
+ rescue DeserializationError
155
+ # do nothing
148
156
  end
157
+
158
+ self.class.destroy_failed_jobs ? job.destroy : job.update_attributes(:failed_at => Delayed::Job.db_time_now)
149
159
  end
150
160
 
151
161
  def say(text, level = Logger::INFO)
data/lib/delayed_job.rb CHANGED
@@ -4,6 +4,7 @@ require File.dirname(__FILE__) + '/delayed/message_sending'
4
4
  require File.dirname(__FILE__) + '/delayed/performable_method'
5
5
  require File.dirname(__FILE__) + '/delayed/backend/base'
6
6
  require File.dirname(__FILE__) + '/delayed/worker'
7
+ require File.dirname(__FILE__) + '/delayed/deserialization_error'
7
8
  require File.dirname(__FILE__) + '/delayed/railtie' if defined?(::Rails::Railtie)
8
9
 
9
10
  Object.send(:include, Delayed::MessageSending)
@@ -52,31 +52,36 @@ shared_examples_for 'a backend' do
52
52
 
53
53
  it "should raise an DeserializationError when the job class is totally unknown" do
54
54
  job = @backend.new :handler => "--- !ruby/object:JobThatDoesNotExist {}"
55
- lambda { job.payload_object.perform }.should raise_error(Delayed::Backend::DeserializationError)
55
+ lambda { job.payload_object.perform }.should raise_error(Delayed::DeserializationError)
56
+ end
57
+
58
+ it "should raise an DeserializationError when the job is badly encoded" do
59
+ job = @backend.new :handler => "--- !ruby/object:SimpleJob {"
60
+ lambda { job.payload_object.perform }.should raise_error(Delayed::DeserializationError)
56
61
  end
57
62
 
58
63
  it "should try to load the class when it is unknown at the time of the deserialization" do
59
64
  job = @backend.new :handler => "--- !ruby/object:JobThatDoesNotExist {}"
60
65
  job.should_receive(:attempt_to_load).with('JobThatDoesNotExist').and_return(true)
61
- lambda { job.payload_object.perform }.should raise_error(Delayed::Backend::DeserializationError)
66
+ lambda { job.payload_object.perform }.should raise_error(Delayed::DeserializationError)
62
67
  end
63
68
 
64
69
  it "should try include the namespace when loading unknown objects" do
65
70
  job = @backend.new :handler => "--- !ruby/object:Delayed::JobThatDoesNotExist {}"
66
71
  job.should_receive(:attempt_to_load).with('Delayed::JobThatDoesNotExist').and_return(true)
67
- lambda { job.payload_object.perform }.should raise_error(Delayed::Backend::DeserializationError)
72
+ lambda { job.payload_object.perform }.should raise_error(Delayed::DeserializationError)
68
73
  end
69
74
 
70
75
  it "should also try to load structs when they are unknown (raises TypeError)" do
71
76
  job = @backend.new :handler => "--- !ruby/struct:JobThatDoesNotExist {}"
72
77
  job.should_receive(:attempt_to_load).with('JobThatDoesNotExist').and_return(true)
73
- lambda { job.payload_object.perform }.should raise_error(Delayed::Backend::DeserializationError)
78
+ lambda { job.payload_object.perform }.should raise_error(Delayed::DeserializationError)
74
79
  end
75
80
 
76
81
  it "should try include the namespace when loading unknown structs" do
77
82
  job = @backend.new :handler => "--- !ruby/struct:Delayed::JobThatDoesNotExist {}"
78
83
  job.should_receive(:attempt_to_load).with('Delayed::JobThatDoesNotExist').and_return(true)
79
- lambda { job.payload_object.perform }.should raise_error(Delayed::Backend::DeserializationError)
84
+ lambda { job.payload_object.perform }.should raise_error(Delayed::DeserializationError)
80
85
  end
81
86
 
82
87
  describe "find_available" do
@@ -314,4 +319,23 @@ shared_examples_for 'a backend' do
314
319
  @job.max_attempts.should == 99
315
320
  end
316
321
  end
322
+
323
+ describe "worker integration" do
324
+ before do
325
+ @worker = Delayed::Worker.new(:max_priority => nil, :min_priority => nil, :quiet => true)
326
+ end
327
+
328
+ describe "running a job" do
329
+
330
+ context "when the job raises a deserialization error" do
331
+ it "should mark the job as failed" do
332
+ Delayed::Worker.destroy_failed_jobs = false
333
+ job = described_class.create! :handler => "--- !ruby/object:JobThatDoesNotExist {}"
334
+ @worker.work_off
335
+ job.reload
336
+ job.failed_at.should_not be_nil
337
+ end
338
+ end
339
+ end
340
+ end
317
341
  end
metadata CHANGED
@@ -1,242 +1,256 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: delayed_job
3
- version: !ruby/object:Gem::Version
4
- hash: 1
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.8
5
5
  prerelease:
6
- segments:
7
- - 2
8
- - 0
9
- - 7
10
- version: 2.0.7
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Chris Gaffney
14
9
  - Brandon Keepers
15
- - "Tobias L\xC3\xBCtke"
10
+ - Tobias Lütke
16
11
  autorequire:
17
12
  bindir: bin
18
13
  cert_chain: []
19
-
20
- date: 2011-02-10 00:00:00 -05:00
21
- default_executable:
22
- dependencies:
23
- - !ruby/object:Gem::Dependency
24
- prerelease: false
25
- type: :runtime
14
+ date: 2013-05-28 00:00:00.000000000 Z
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
26
17
  name: daemons
27
- version_requirements: &id001 !ruby/object:Gem::Requirement
18
+ requirement: !ruby/object:Gem::Requirement
28
19
  none: false
29
- requirements:
30
- - - "="
31
- - !ruby/object:Gem::Version
32
- hash: 3
33
- segments:
34
- - 1
35
- - 0
36
- - 10
20
+ requirements:
21
+ - - '='
22
+ - !ruby/object:Gem::Version
37
23
  version: 1.0.10
38
- requirement: *id001
39
- - !ruby/object:Gem::Dependency
40
- prerelease: false
41
24
  type: :runtime
25
+ prerelease: false
26
+ version_requirements: !ruby/object:Gem::Requirement
27
+ none: false
28
+ requirements:
29
+ - - '='
30
+ - !ruby/object:Gem::Version
31
+ version: 1.0.10
32
+ - !ruby/object:Gem::Dependency
42
33
  name: activesupport
43
- version_requirements: &id002 !ruby/object:Gem::Requirement
34
+ requirement: !ruby/object:Gem::Requirement
44
35
  none: false
45
- requirements:
36
+ requirements:
46
37
  - - ~>
47
- - !ruby/object:Gem::Version
48
- hash: 3
49
- segments:
50
- - 2
51
- - 0
52
- version: "2.0"
53
- requirement: *id002
54
- - !ruby/object:Gem::Dependency
38
+ - !ruby/object:Gem::Version
39
+ version: '2.0'
40
+ type: :runtime
55
41
  prerelease: false
56
- type: :development
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '2.0'
48
+ - !ruby/object:Gem::Dependency
57
49
  name: rspec
58
- version_requirements: &id003 !ruby/object:Gem::Requirement
50
+ requirement: !ruby/object:Gem::Requirement
59
51
  none: false
60
- requirements:
52
+ requirements:
61
53
  - - ~>
62
- - !ruby/object:Gem::Version
63
- hash: 15
64
- segments:
65
- - 1
66
- - 0
67
- version: "1.0"
68
- requirement: *id003
69
- - !ruby/object:Gem::Dependency
70
- prerelease: false
54
+ - !ruby/object:Gem::Version
55
+ version: '1.0'
71
56
  type: :development
57
+ prerelease: false
58
+ version_requirements: !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ~>
62
+ - !ruby/object:Gem::Version
63
+ version: '1.0'
64
+ - !ruby/object:Gem::Dependency
72
65
  name: rake
73
- version_requirements: &id004 !ruby/object:Gem::Requirement
66
+ requirement: !ruby/object:Gem::Requirement
74
67
  none: false
75
- requirements:
76
- - - ">="
77
- - !ruby/object:Gem::Version
78
- hash: 3
79
- segments:
80
- - 0
81
- version: "0"
82
- requirement: *id004
83
- - !ruby/object:Gem::Dependency
84
- prerelease: false
68
+ requirements:
69
+ - - '='
70
+ - !ruby/object:Gem::Version
71
+ version: 0.8.7
85
72
  type: :development
73
+ prerelease: false
74
+ version_requirements: !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - '='
78
+ - !ruby/object:Gem::Version
79
+ version: 0.8.7
80
+ - !ruby/object:Gem::Dependency
86
81
  name: rails
87
- version_requirements: &id005 !ruby/object:Gem::Requirement
82
+ requirement: !ruby/object:Gem::Requirement
88
83
  none: false
89
- requirements:
84
+ requirements:
90
85
  - - ~>
91
- - !ruby/object:Gem::Version
92
- hash: 5
93
- segments:
94
- - 2
95
- - 3
96
- version: "2.3"
97
- requirement: *id005
98
- - !ruby/object:Gem::Dependency
99
- prerelease: false
86
+ - !ruby/object:Gem::Version
87
+ version: '2.3'
100
88
  type: :development
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ none: false
92
+ requirements:
93
+ - - ~>
94
+ - !ruby/object:Gem::Version
95
+ version: '2.3'
96
+ - !ruby/object:Gem::Dependency
101
97
  name: sqlite3
102
- version_requirements: &id006 !ruby/object:Gem::Requirement
98
+ requirement: !ruby/object:Gem::Requirement
103
99
  none: false
104
- requirements:
105
- - - ">="
106
- - !ruby/object:Gem::Version
107
- hash: 3
108
- segments:
109
- - 0
110
- version: "0"
111
- requirement: *id006
112
- - !ruby/object:Gem::Dependency
113
- prerelease: false
100
+ requirements:
101
+ - - ! '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
114
104
  type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ none: false
108
+ requirements:
109
+ - - ! '>='
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ - !ruby/object:Gem::Dependency
115
113
  name: mysql
116
- version_requirements: &id007 !ruby/object:Gem::Requirement
114
+ requirement: !ruby/object:Gem::Requirement
117
115
  none: false
118
- requirements:
119
- - - ">="
120
- - !ruby/object:Gem::Version
121
- hash: 3
122
- segments:
123
- - 0
124
- version: "0"
125
- requirement: *id007
126
- - !ruby/object:Gem::Dependency
127
- prerelease: false
116
+ requirements:
117
+ - - ! '>='
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
128
120
  type: :development
121
+ prerelease: false
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ none: false
124
+ requirements:
125
+ - - ! '>='
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
128
+ - !ruby/object:Gem::Dependency
129
129
  name: mongo_mapper
130
- version_requirements: &id008 !ruby/object:Gem::Requirement
130
+ requirement: !ruby/object:Gem::Requirement
131
131
  none: false
132
- requirements:
132
+ requirements:
133
133
  - - ~>
134
- - !ruby/object:Gem::Version
135
- hash: 63
136
- segments:
137
- - 0
138
- - 8
139
- - 0
134
+ - !ruby/object:Gem::Version
140
135
  version: 0.8.0
141
- requirement: *id008
142
- - !ruby/object:Gem::Dependency
143
- prerelease: false
144
136
  type: :development
137
+ prerelease: false
138
+ version_requirements: !ruby/object:Gem::Requirement
139
+ none: false
140
+ requirements:
141
+ - - ~>
142
+ - !ruby/object:Gem::Version
143
+ version: 0.8.0
144
+ - !ruby/object:Gem::Dependency
145
145
  name: dm-core
146
- version_requirements: &id009 !ruby/object:Gem::Requirement
146
+ requirement: !ruby/object:Gem::Requirement
147
147
  none: false
148
- requirements:
149
- - - ">="
150
- - !ruby/object:Gem::Version
151
- hash: 3
152
- segments:
153
- - 0
154
- version: "0"
155
- requirement: *id009
156
- - !ruby/object:Gem::Dependency
157
- prerelease: false
148
+ requirements:
149
+ - - ! '>='
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
158
152
  type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ none: false
156
+ requirements:
157
+ - - ! '>='
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ - !ruby/object:Gem::Dependency
159
161
  name: dm-observer
160
- version_requirements: &id010 !ruby/object:Gem::Requirement
162
+ requirement: !ruby/object:Gem::Requirement
161
163
  none: false
162
- requirements:
163
- - - ">="
164
- - !ruby/object:Gem::Version
165
- hash: 3
166
- segments:
167
- - 0
168
- version: "0"
169
- requirement: *id010
170
- - !ruby/object:Gem::Dependency
171
- prerelease: false
164
+ requirements:
165
+ - - ! '>='
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
172
168
  type: :development
169
+ prerelease: false
170
+ version_requirements: !ruby/object:Gem::Requirement
171
+ none: false
172
+ requirements:
173
+ - - ! '>='
174
+ - !ruby/object:Gem::Version
175
+ version: '0'
176
+ - !ruby/object:Gem::Dependency
173
177
  name: dm-aggregates
174
- version_requirements: &id011 !ruby/object:Gem::Requirement
178
+ requirement: !ruby/object:Gem::Requirement
175
179
  none: false
176
- requirements:
177
- - - ">="
178
- - !ruby/object:Gem::Version
179
- hash: 3
180
- segments:
181
- - 0
182
- version: "0"
183
- requirement: *id011
184
- - !ruby/object:Gem::Dependency
185
- prerelease: false
180
+ requirements:
181
+ - - ! '>='
182
+ - !ruby/object:Gem::Version
183
+ version: '0'
186
184
  type: :development
185
+ prerelease: false
186
+ version_requirements: !ruby/object:Gem::Requirement
187
+ none: false
188
+ requirements:
189
+ - - ! '>='
190
+ - !ruby/object:Gem::Version
191
+ version: '0'
192
+ - !ruby/object:Gem::Dependency
187
193
  name: dm-validations
188
- version_requirements: &id012 !ruby/object:Gem::Requirement
194
+ requirement: !ruby/object:Gem::Requirement
189
195
  none: false
190
- requirements:
191
- - - ">="
192
- - !ruby/object:Gem::Version
193
- hash: 3
194
- segments:
195
- - 0
196
- version: "0"
197
- requirement: *id012
198
- - !ruby/object:Gem::Dependency
199
- prerelease: false
196
+ requirements:
197
+ - - ! '>='
198
+ - !ruby/object:Gem::Version
199
+ version: '0'
200
200
  type: :development
201
+ prerelease: false
202
+ version_requirements: !ruby/object:Gem::Requirement
203
+ none: false
204
+ requirements:
205
+ - - ! '>='
206
+ - !ruby/object:Gem::Version
207
+ version: '0'
208
+ - !ruby/object:Gem::Dependency
201
209
  name: do_sqlite3
202
- version_requirements: &id013 !ruby/object:Gem::Requirement
210
+ requirement: !ruby/object:Gem::Requirement
203
211
  none: false
204
- requirements:
205
- - - ">="
206
- - !ruby/object:Gem::Version
207
- hash: 3
208
- segments:
209
- - 0
210
- version: "0"
211
- requirement: *id013
212
- - !ruby/object:Gem::Dependency
213
- prerelease: false
212
+ requirements:
213
+ - - ! '>='
214
+ - !ruby/object:Gem::Version
215
+ version: '0'
214
216
  type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ none: false
220
+ requirements:
221
+ - - ! '>='
222
+ - !ruby/object:Gem::Version
223
+ version: '0'
224
+ - !ruby/object:Gem::Dependency
215
225
  name: database_cleaner
216
- version_requirements: &id014 !ruby/object:Gem::Requirement
226
+ requirement: !ruby/object:Gem::Requirement
227
+ none: false
228
+ requirements:
229
+ - - ! '>='
230
+ - !ruby/object:Gem::Version
231
+ version: '0'
232
+ type: :development
233
+ prerelease: false
234
+ version_requirements: !ruby/object:Gem::Requirement
217
235
  none: false
218
- requirements:
219
- - - ">="
220
- - !ruby/object:Gem::Version
221
- hash: 3
222
- segments:
223
- - 0
224
- version: "0"
225
- requirement: *id014
226
- description: |-
227
- Delayed_job (or DJ) encapsulates the common pattern of asynchronously executing longer tasks in the background. It is a direct extraction from Shopify where the job table is responsible for a multitude of core tasks.
228
-
229
- This gem is collectiveidea's fork (http://github.com/collectiveidea/delayed_job).
230
- email:
236
+ requirements:
237
+ - - ! '>='
238
+ - !ruby/object:Gem::Version
239
+ version: '0'
240
+ description: ! 'Delayed_job (or DJ) encapsulates the common pattern of asynchronously
241
+ executing longer tasks in the background. It is a direct extraction from Shopify
242
+ where the job table is responsible for a multitude of core tasks.
243
+
244
+
245
+ This gem is collectiveidea''s fork (http://github.com/collectiveidea/delayed_job).'
246
+ email:
231
247
  - chris@collectiveidea.com
232
248
  - brandon@opensoul.org
233
249
  executables: []
234
-
235
250
  extensions: []
236
-
237
- extra_rdoc_files:
251
+ extra_rdoc_files:
238
252
  - README.textile
239
- files:
253
+ files:
240
254
  - contrib/delayed_job.monitrc
241
255
  - contrib/delayed_job_multiple.monitrc
242
256
  - lib/delayed/backend/active_record.rb
@@ -244,6 +258,7 @@ files:
244
258
  - lib/delayed/backend/data_mapper.rb
245
259
  - lib/delayed/backend/mongo_mapper.rb
246
260
  - lib/delayed/command.rb
261
+ - lib/delayed/deserialization_error.rb
247
262
  - lib/delayed/message_sending.rb
248
263
  - lib/delayed/performable_method.rb
249
264
  - lib/delayed/railtie.rb
@@ -273,44 +288,41 @@ files:
273
288
  - tasks/jobs.rake
274
289
  - MIT-LICENSE
275
290
  - README.textile
276
- has_rdoc: true
277
291
  homepage: http://github.com/collectiveidea/delayed_job
278
292
  licenses: []
279
-
280
293
  post_install_message:
281
- rdoc_options:
294
+ rdoc_options:
282
295
  - --main
283
296
  - README.textile
284
297
  - --inline-source
285
298
  - --line-numbers
286
- require_paths:
299
+ require_paths:
287
300
  - lib
288
- required_ruby_version: !ruby/object:Gem::Requirement
301
+ required_ruby_version: !ruby/object:Gem::Requirement
289
302
  none: false
290
- requirements:
291
- - - ">="
292
- - !ruby/object:Gem::Version
293
- hash: 3
294
- segments:
303
+ requirements:
304
+ - - ! '>='
305
+ - !ruby/object:Gem::Version
306
+ version: '0'
307
+ segments:
295
308
  - 0
296
- version: "0"
297
- required_rubygems_version: !ruby/object:Gem::Requirement
309
+ hash: -534603219747213173
310
+ required_rubygems_version: !ruby/object:Gem::Requirement
298
311
  none: false
299
- requirements:
300
- - - ">="
301
- - !ruby/object:Gem::Version
302
- hash: 3
303
- segments:
312
+ requirements:
313
+ - - ! '>='
314
+ - !ruby/object:Gem::Version
315
+ version: '0'
316
+ segments:
304
317
  - 0
305
- version: "0"
318
+ hash: -534603219747213173
306
319
  requirements: []
307
-
308
320
  rubyforge_project:
309
- rubygems_version: 1.5.0
321
+ rubygems_version: 1.8.23
310
322
  signing_key:
311
323
  specification_version: 3
312
324
  summary: Database-backed asynchronous priority queue system -- Extracted from Shopify
313
- test_files:
325
+ test_files:
314
326
  - spec/backend/active_record_job_spec.rb
315
327
  - spec/backend/data_mapper_job_spec.rb
316
328
  - spec/backend/mongo_mapper_job_spec.rb