delayed_job 4.0.0.beta1 → 4.0.0.beta2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/CHANGELOG.md +7 -0
- data/README.md +44 -6
- data/contrib/delayed_job_rails_4.monitrc +14 -0
- data/contrib/delayed_job_rails_4_multiple.monitrc +34 -0
- data/delayed_job.gemspec +1 -1
- data/lib/delayed/command.rb +6 -2
- data/lib/delayed/compatibility.rb +27 -0
- data/lib/delayed/message_sending.rb +1 -13
- data/lib/delayed/psych_ext.rb +12 -5
- data/lib/delayed/tasks.rb +13 -0
- data/lib/delayed/worker.rb +14 -7
- data/lib/delayed_job.rb +1 -0
- data/lib/generators/delayed_job/delayed_job_generator.rb +4 -3
- data/spec/helper.rb +9 -9
- data/spec/worker_spec.rb +13 -0
- metadata +12 -16
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
MTQxN2VkZDVhM2YxY2RhNzE0NzRiN2ZlMDE0ZmQ3Y2I3ZjM5ODkyMA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
NjI3N2EyYTkzY2E2M2YyNmE2OWYxNTVhOWZkNWI5ZGViZWEzYjIzNQ==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MjhjOGJkN2YxNGM0NzI0ZDIxOTE0ZGVjNTk0OGZhZWQxZmY4YTkxYTczNWRk
|
10
|
+
ZWIxNTEzYWE4Mzc4OGE0Mjc2NzhhMDQ0NjdiZGVjMDc1YzEyMDUyOTFmYmRl
|
11
|
+
OTdmNzYyZDQ4YzJjZWVlOGUzNjczY2VlOTczYTc5Mjk1ZjhjZTE=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
MDcxN2FkZDMxYWVhOTI2NjBmN2FmNzgyN2I0MTZkMmM3YmNjZWM4NTk2MzVl
|
14
|
+
ZDA2ZWQ1ZWE4YTE3OGI0ZDlmMTNjMGQ0ZDgyNTllNWM1OTczNzQxNWY3ZTFk
|
15
|
+
NjFkM2ZjMGEzOGYyMTQzNjNhMjg5ODRjNGEzNTExNGM2YjJiZGE=
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
4.0.0.beta2 - 2013-05-28
|
2
|
+
========================
|
3
|
+
* Rails 4 compatibility
|
4
|
+
* Threaded startup script for faster multi-worker startup
|
5
|
+
* YAML compatibility changes
|
6
|
+
* Added jobs:check rake task
|
7
|
+
|
1
8
|
4.0.0.beta1 - 2013-03-02
|
2
9
|
========================
|
3
10
|
* Rails 4 compatibility
|
data/README.md
CHANGED
@@ -40,11 +40,15 @@ for other backends](http://wiki.github.com/collectiveidea/delayed_job/backends).
|
|
40
40
|
|
41
41
|
If you plan to use delayed_job with Active Record, add `delayed_job_active_record` to your `Gemfile`.
|
42
42
|
|
43
|
-
|
43
|
+
```ruby
|
44
|
+
gem 'delayed_job_active_record'
|
45
|
+
```
|
44
46
|
|
45
47
|
If you plan to use delayed_job with Mongoid, add `delayed_job_mongoid` to your `Gemfile`.
|
46
48
|
|
47
|
-
|
49
|
+
```ruby
|
50
|
+
gem 'delayed_job_mongoid'
|
51
|
+
```
|
48
52
|
|
49
53
|
Run `bundle install` to install the backend and delayed_job gems.
|
50
54
|
|
@@ -67,11 +71,13 @@ Queuing Jobs
|
|
67
71
|
============
|
68
72
|
Call `.delay.method(params)` on any object and it will be processed in the background.
|
69
73
|
|
70
|
-
|
71
|
-
|
74
|
+
```ruby
|
75
|
+
# without delayed_job
|
76
|
+
@user.activate!(@device)
|
72
77
|
|
73
|
-
|
74
|
-
|
78
|
+
# with delayed_job
|
79
|
+
@user.delay.activate!(@device)
|
80
|
+
```
|
75
81
|
|
76
82
|
If a method should always be run in the background, you can call
|
77
83
|
`#handle_asynchronously` after the method declaration:
|
@@ -123,6 +129,8 @@ class LongTasks
|
|
123
129
|
end
|
124
130
|
```
|
125
131
|
|
132
|
+
If you ever want to call a `handle_asynchronously`'d method without Delayed Job, for instance while debugging something at the console, just add `_without_delay` to the method name. For instance, if your original method was `foo`, then call `foo_without_delay`.
|
133
|
+
|
126
134
|
Rails 3 Mailers
|
127
135
|
===============
|
128
136
|
Due to how mailers are implemented in Rails 3, we had to do a little work around to get delayed_job to work.
|
@@ -180,6 +188,8 @@ You can then do the following:
|
|
180
188
|
# or to run in the foreground
|
181
189
|
RAILS_ENV=production script/delayed_job run --exit-on-complete
|
182
190
|
|
191
|
+
**Rails 4:** *replace script/delayed_job with bin/delayed_job*
|
192
|
+
|
183
193
|
Workers can be running on any computer, as long as they have access to the
|
184
194
|
database and their clock is in sync. Keep in mind that each worker will check
|
185
195
|
the database at least every 5 seconds.
|
@@ -193,6 +203,21 @@ Work off queues by setting the `QUEUE` or `QUEUES` environment variable.
|
|
193
203
|
|
194
204
|
QUEUE=tracking rake jobs:work
|
195
205
|
QUEUES=mailers,tasks rake jobs:work
|
206
|
+
|
207
|
+
Restarting delayed_job
|
208
|
+
======================
|
209
|
+
|
210
|
+
The following syntax will restart delayed jobs:
|
211
|
+
|
212
|
+
RAILS_ENV=production script/delayed_job restart
|
213
|
+
|
214
|
+
To restart multiple delayed_job workers:
|
215
|
+
|
216
|
+
RAILS_ENV=production script/delayed_job -n2 restart
|
217
|
+
|
218
|
+
**Rails 4:** *replace script/delayed_job with bin/delayed_job*
|
219
|
+
|
220
|
+
|
196
221
|
|
197
222
|
Custom Jobs
|
198
223
|
===========
|
@@ -207,6 +232,19 @@ end
|
|
207
232
|
|
208
233
|
Delayed::Job.enqueue NewsletterJob.new('lorem ipsum...', Customers.find(:all).collect(&:email))
|
209
234
|
```
|
235
|
+
To set a per-job max attempts that overrides the Delayed::Worker.max_attempts you can define a max_attempts method on the job
|
236
|
+
```ruby
|
237
|
+
class NewsletterJob < Struct.new(:text, :emails)
|
238
|
+
def perform
|
239
|
+
emails.each { |e| NewsletterMailer.deliver_text_to_email(text, e) }
|
240
|
+
end
|
241
|
+
|
242
|
+
def max_attempts
|
243
|
+
return 3
|
244
|
+
end
|
245
|
+
end
|
246
|
+
````
|
247
|
+
|
210
248
|
|
211
249
|
Hooks
|
212
250
|
=====
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# an example Monit configuration file for delayed_job
|
2
|
+
# See: http://stackoverflow.com/questions/1226302/how-to-monitor-delayedjob-with-monit/1285611
|
3
|
+
#
|
4
|
+
# To use:
|
5
|
+
# 1. copy to /var/www/apps/{app_name}/shared/delayed_job.monitrc
|
6
|
+
# 2. replace {app_name} as appropriate
|
7
|
+
# 3. add this to your /etc/monit/monitrc
|
8
|
+
#
|
9
|
+
# include /var/www/apps/{app_name}/shared/delayed_job.monitrc
|
10
|
+
|
11
|
+
check process delayed_job
|
12
|
+
with pidfile /var/www/apps/{app_name}/shared/pids/delayed_job.pid
|
13
|
+
start program = "/usr/bin/env RAILS_ENV=production /var/www/apps/{app_name}/current/bin/delayed_job start"
|
14
|
+
stop program = "/usr/bin/env RAILS_ENV=production /var/www/apps/{app_name}/current/bin/delayed_job stop"
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# an example Monit configuration file for delayed_job running multiple processes
|
2
|
+
#
|
3
|
+
# To use:
|
4
|
+
# 1. copy to /var/www/apps/{app_name}/shared/delayed_job.monitrc
|
5
|
+
# 2. replace {app_name} as appropriate
|
6
|
+
# you might also need to change the program strings to
|
7
|
+
# "/bin/su - {username} -c '/usr/bin/env ...'"
|
8
|
+
# to load your shell environment.
|
9
|
+
#
|
10
|
+
# 3. add this to your /etc/monit/monitrc
|
11
|
+
#
|
12
|
+
# include /var/www/apps/{app_name}/shared/delayed_job.monitrc
|
13
|
+
#
|
14
|
+
# The processes are grouped so that monit can act on them as a whole, e.g.
|
15
|
+
#
|
16
|
+
# monit -g delayed_job restart
|
17
|
+
|
18
|
+
check process delayed_job_0
|
19
|
+
with pidfile /var/www/apps/{app_name}/shared/pids/delayed_job.0.pid
|
20
|
+
start program = "/usr/bin/env RAILS_ENV=production /var/www/apps/{app_name}/current/bin/delayed_job start -i 0"
|
21
|
+
stop program = "/usr/bin/env RAILS_ENV=production /var/www/apps/{app_name}/current/bin/delayed_job stop -i 0"
|
22
|
+
group delayed_job
|
23
|
+
|
24
|
+
check process delayed_job_1
|
25
|
+
with pidfile /var/www/apps/{app_name}/shared/pids/delayed_job.1.pid
|
26
|
+
start program = "/usr/bin/env RAILS_ENV=production /var/www/apps/{app_name}/current/bin/delayed_job start -i 1"
|
27
|
+
stop program = "/usr/bin/env RAILS_ENV=production /var/www/apps/{app_name}/current/bin/delayed_job stop -i 1"
|
28
|
+
group delayed_job
|
29
|
+
|
30
|
+
check process delayed_job_2
|
31
|
+
with pidfile /var/www/apps/{app_name}/shared/pids/delayed_job.2.pid
|
32
|
+
start program = "/usr/bin/env RAILS_ENV=production /var/www/apps/{app_name}/current/bin/delayed_job start -i 2"
|
33
|
+
stop program = "/usr/bin/env RAILS_ENV=production /var/www/apps/{app_name}/current/bin/delayed_job stop -i 2"
|
34
|
+
group delayed_job
|
data/delayed_job.gemspec
CHANGED
@@ -13,5 +13,5 @@ Gem::Specification.new do |spec|
|
|
13
13
|
spec.require_paths = ['lib']
|
14
14
|
spec.summary = 'Database-backed asynchronous priority queue system -- Extracted from Shopify'
|
15
15
|
spec.test_files = Dir.glob('spec/**/*')
|
16
|
-
spec.version = '4.0.0.
|
16
|
+
spec.version = '4.0.0.beta2'
|
17
17
|
end
|
data/lib/delayed/command.rb
CHANGED
@@ -78,10 +78,14 @@ module Delayed
|
|
78
78
|
process_name = "delayed_job.#{@options[:identifier]}"
|
79
79
|
run_process(process_name, dir)
|
80
80
|
else
|
81
|
+
threads = []
|
81
82
|
worker_count.times do |worker_index|
|
82
|
-
|
83
|
-
|
83
|
+
threads << Thread.start do
|
84
|
+
process_name = worker_count == 1 ? "delayed_job" : "delayed_job.#{worker_index}"
|
85
|
+
run_process(process_name, dir)
|
86
|
+
end
|
84
87
|
end
|
88
|
+
threads.each(&:join)
|
85
89
|
end
|
86
90
|
end
|
87
91
|
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'active_support/version'
|
2
|
+
|
3
|
+
module Delayed
|
4
|
+
module Compatibility
|
5
|
+
if ActiveSupport::VERSION::MAJOR >= 4
|
6
|
+
require 'active_support/proxy_object'
|
7
|
+
|
8
|
+
def self.executable_prefix
|
9
|
+
'bin'
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.proxy_object_class
|
13
|
+
ActiveSupport::ProxyObject
|
14
|
+
end
|
15
|
+
else
|
16
|
+
require 'active_support/basic_object'
|
17
|
+
|
18
|
+
def self.executable_prefix
|
19
|
+
'script'
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.proxy_object_class
|
23
|
+
ActiveSupport::BasicObject
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -1,19 +1,7 @@
|
|
1
|
-
if ActiveSupport::VERSION::MAJOR == 4
|
2
|
-
require 'active_support/proxy_object'
|
3
|
-
else
|
4
|
-
require 'active_support/basic_object'
|
5
|
-
end
|
6
|
-
|
7
1
|
require 'active_support/core_ext/module/aliasing'
|
8
2
|
|
9
3
|
module Delayed
|
10
|
-
|
11
|
-
klass = ActiveSupport::ProxyObject
|
12
|
-
else
|
13
|
-
klass = ActiveSupport::BasicObject
|
14
|
-
end
|
15
|
-
|
16
|
-
class DelayProxy < klass
|
4
|
+
class DelayProxy < Delayed::Compatibility.proxy_object_class
|
17
5
|
def initialize(payload_class, target, options)
|
18
6
|
@payload_class = payload_class
|
19
7
|
@target = target
|
data/lib/delayed/psych_ext.rb
CHANGED
@@ -1,11 +1,18 @@
|
|
1
1
|
if defined?(ActiveRecord)
|
2
2
|
ActiveRecord::Base.class_eval do
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
if instance_methods.include?(:encode_with)
|
4
|
+
def encode_with_override(coder)
|
5
|
+
encode_with_without_override(coder)
|
6
|
+
coder.tag = "!ruby/ActiveRecord:#{self.class.name}"
|
7
|
+
end
|
8
|
+
alias_method :encode_with_without_override, :encode_with
|
9
|
+
alias_method :encode_with, :encode_with_override
|
10
|
+
else
|
11
|
+
def encode_with(coder)
|
12
|
+
coder["attributes"] = attributes
|
13
|
+
coder.tag = "!ruby/ActiveRecord:#{self.class.name}"
|
14
|
+
end
|
6
15
|
end
|
7
|
-
alias_method :encode_with_without_override, :encode_with
|
8
|
-
alias_method :encode_with, :encode_with_override
|
9
16
|
end
|
10
17
|
end
|
11
18
|
|
data/lib/delayed/tasks.rb
CHANGED
@@ -22,4 +22,17 @@ namespace :jobs do
|
|
22
22
|
:quiet => false
|
23
23
|
}
|
24
24
|
end
|
25
|
+
|
26
|
+
desc "Exit with error status if any jobs older than max_age seconds haven't been attempted yet."
|
27
|
+
task :check, [:max_age] => :environment do |_, args|
|
28
|
+
args.with_defaults(:max_age => 300)
|
29
|
+
|
30
|
+
unprocessed_jobs = Delayed::Job.where('attempts = 0 AND created_at < ?', Time.now - args[:max_age].to_i).count
|
31
|
+
|
32
|
+
if unprocessed_jobs > 0
|
33
|
+
fail "#{unprocessed_jobs} jobs older than #{args[:max_age]} seconds have not been processed yet"
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
25
38
|
end
|
data/lib/delayed/worker.rb
CHANGED
@@ -8,6 +8,7 @@ require 'benchmark'
|
|
8
8
|
|
9
9
|
module Delayed
|
10
10
|
class Worker
|
11
|
+
DEFAULT_LOG_LEVEL = Logger::INFO
|
11
12
|
DEFAULT_SLEEP_DELAY = 5
|
12
13
|
DEFAULT_MAX_ATTEMPTS = 25
|
13
14
|
DEFAULT_MAX_RUN_TIME = 4.hours
|
@@ -115,7 +116,7 @@ module Delayed
|
|
115
116
|
end
|
116
117
|
|
117
118
|
# Every worker has a unique name which by default is the pid of the process. There are some
|
118
|
-
# advantages to overriding this with something which survives worker
|
119
|
+
# advantages to overriding this with something which survives worker restarts: Workers can
|
119
120
|
# safely resume working on tasks which are locked by themselves. The worker will assume that
|
120
121
|
# it crashed before.
|
121
122
|
def name
|
@@ -162,7 +163,7 @@ module Delayed
|
|
162
163
|
sleep(self.class.sleep_delay) unless stop?
|
163
164
|
end
|
164
165
|
else
|
165
|
-
say "#{count} jobs processed at %.4f j/s, %d failed
|
166
|
+
say "#{count} jobs processed at %.4f j/s, %d failed" % [count / @realtime, @result.last]
|
166
167
|
end
|
167
168
|
|
168
169
|
break if stop?
|
@@ -199,11 +200,12 @@ module Delayed
|
|
199
200
|
end
|
200
201
|
|
201
202
|
def run(job)
|
203
|
+
job_say job, 'RUNNING'
|
202
204
|
runtime = Benchmark.realtime do
|
203
205
|
Timeout.timeout(self.class.max_run_time.to_i, WorkerTimeout) { job.invoke_job }
|
204
206
|
job.destroy
|
205
207
|
end
|
206
|
-
|
208
|
+
job_say job, 'COMPLETED after %.4f' % runtime
|
207
209
|
return true # did work
|
208
210
|
rescue DeserializationError => error
|
209
211
|
job.last_error = "#{error.message}\n#{error.backtrace.join("\n")}"
|
@@ -222,7 +224,7 @@ module Delayed
|
|
222
224
|
job.unlock
|
223
225
|
job.save!
|
224
226
|
else
|
225
|
-
|
227
|
+
job_say job, "REMOVED permanently because of #{job.attempts} consecutive failures", Logger::ERROR
|
226
228
|
failed(job)
|
227
229
|
end
|
228
230
|
end
|
@@ -234,7 +236,12 @@ module Delayed
|
|
234
236
|
end
|
235
237
|
end
|
236
238
|
|
237
|
-
def
|
239
|
+
def job_say(job, text, level = DEFAULT_LOG_LEVEL)
|
240
|
+
text = "Job #{job.name} (id=#{job.id}) #{text}"
|
241
|
+
say text, level
|
242
|
+
end
|
243
|
+
|
244
|
+
def say(text, level = DEFAULT_LOG_LEVEL)
|
238
245
|
text = "[Worker(#{name})] #{text}"
|
239
246
|
puts text unless @quiet
|
240
247
|
logger.add level, "#{Time.now.strftime('%FT%T%z')}: #{text}" if logger
|
@@ -248,7 +255,7 @@ module Delayed
|
|
248
255
|
|
249
256
|
def handle_failed_job(job, error)
|
250
257
|
job.last_error = "#{error.message}\n#{error.backtrace.join("\n")}"
|
251
|
-
|
258
|
+
job_say job, "FAILED (#{job.attempts} prior attempts) with #{error.class.name}: #{error.message}", Logger::ERROR
|
252
259
|
reschedule(job)
|
253
260
|
end
|
254
261
|
|
@@ -256,7 +263,7 @@ module Delayed
|
|
256
263
|
# If no jobs are left we return nil
|
257
264
|
def reserve_and_run_one_job
|
258
265
|
job = Delayed::Job.reserve(self)
|
259
|
-
self.class.lifecycle.run_callbacks(:perform, self, job){
|
266
|
+
self.class.lifecycle.run_callbacks(:perform, self, job){ run(job) } if job
|
260
267
|
end
|
261
268
|
end
|
262
269
|
|
data/lib/delayed_job.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
require 'rails/generators'
|
2
|
+
require 'delayed/compatibility'
|
2
3
|
|
3
4
|
class DelayedJobGenerator < Rails::Generators::Base
|
4
5
|
|
5
6
|
self.source_paths << File.join(File.dirname(__FILE__), 'templates')
|
6
7
|
|
7
|
-
def
|
8
|
-
template
|
9
|
-
chmod
|
8
|
+
def create_executable_file
|
9
|
+
template "script", "#{Delayed::Compatibility.executable_prefix}/delayed_job"
|
10
|
+
chmod "#{Delayed::Compatibility.executable_prefix}/delayed_job", 0755
|
10
11
|
end
|
11
12
|
end
|
data/spec/helper.rb
CHANGED
@@ -1,12 +1,3 @@
|
|
1
|
-
require 'simplecov'
|
2
|
-
require 'coveralls'
|
3
|
-
|
4
|
-
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
|
5
|
-
SimpleCov::Formatter::HTMLFormatter,
|
6
|
-
Coveralls::SimpleCov::Formatter
|
7
|
-
]
|
8
|
-
SimpleCov.start
|
9
|
-
|
10
1
|
require 'logger'
|
11
2
|
require 'rspec'
|
12
3
|
|
@@ -17,6 +8,15 @@ require 'active_record'
|
|
17
8
|
require 'delayed_job'
|
18
9
|
require 'delayed/backend/shared_spec'
|
19
10
|
|
11
|
+
require 'simplecov'
|
12
|
+
require 'coveralls'
|
13
|
+
|
14
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
|
15
|
+
SimpleCov::Formatter::HTMLFormatter,
|
16
|
+
Coveralls::SimpleCov::Formatter
|
17
|
+
]
|
18
|
+
SimpleCov.start
|
19
|
+
|
20
20
|
Delayed::Worker.logger = Logger.new('/tmp/dj.log')
|
21
21
|
ENV['RAILS_ENV'] = 'test'
|
22
22
|
|
data/spec/worker_spec.rb
CHANGED
@@ -21,6 +21,19 @@ describe Delayed::Worker do
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
+
describe "job_say" do
|
25
|
+
before do
|
26
|
+
@worker = Delayed::Worker.new
|
27
|
+
@job = stub('job', :id => 123, :name => 'ExampleJob')
|
28
|
+
end
|
29
|
+
|
30
|
+
it "logs with job name and id" do
|
31
|
+
@worker.should_receive(:say).
|
32
|
+
with('Job ExampleJob (id=123) message', Delayed::Worker::DEFAULT_LOG_LEVEL)
|
33
|
+
@worker.job_say(@job, 'message')
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
24
37
|
context "worker read-ahead" do
|
25
38
|
before do
|
26
39
|
@read_ahead = Delayed::Worker.read_ahead
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: delayed_job
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.0.0.
|
5
|
-
prerelease: 6
|
4
|
+
version: 4.0.0.beta2
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Brandon Keepers
|
@@ -16,12 +15,12 @@ authors:
|
|
16
15
|
autorequire:
|
17
16
|
bindir: bin
|
18
17
|
cert_chain: []
|
19
|
-
date: 2013-
|
18
|
+
date: 2013-05-28 00:00:00.000000000 Z
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
21
|
+
prerelease: false
|
22
22
|
name: activesupport
|
23
|
-
|
24
|
-
none: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
24
|
requirements:
|
26
25
|
- - ! '>='
|
27
26
|
- !ruby/object:Gem::Version
|
@@ -29,10 +28,7 @@ dependencies:
|
|
29
28
|
- - <
|
30
29
|
- !ruby/object:Gem::Version
|
31
30
|
version: '4.1'
|
32
|
-
|
33
|
-
prerelease: false
|
34
|
-
version_requirements: !ruby/object:Gem::Requirement
|
35
|
-
none: false
|
31
|
+
requirement: !ruby/object:Gem::Requirement
|
36
32
|
requirements:
|
37
33
|
- - ! '>='
|
38
34
|
- !ruby/object:Gem::Version
|
@@ -40,6 +36,7 @@ dependencies:
|
|
40
36
|
- - <
|
41
37
|
- !ruby/object:Gem::Version
|
42
38
|
version: '4.1'
|
39
|
+
type: :runtime
|
43
40
|
description: Delayed_job (or DJ) encapsulates the common pattern of asynchronously
|
44
41
|
executing longer tasks in the background. It is a direct extraction from Shopify
|
45
42
|
where the job table is responsible for a multitude of core tasks.
|
@@ -57,9 +54,12 @@ files:
|
|
57
54
|
- delayed_job.gemspec
|
58
55
|
- contrib/delayed_job.monitrc
|
59
56
|
- contrib/delayed_job_multiple.monitrc
|
57
|
+
- contrib/delayed_job_rails_4.monitrc
|
58
|
+
- contrib/delayed_job_rails_4_multiple.monitrc
|
60
59
|
- lib/delayed/backend/base.rb
|
61
60
|
- lib/delayed/backend/shared_spec.rb
|
62
61
|
- lib/delayed/command.rb
|
62
|
+
- lib/delayed/compatibility.rb
|
63
63
|
- lib/delayed/deserialization_error.rb
|
64
64
|
- lib/delayed/exceptions.rb
|
65
65
|
- lib/delayed/lifecycle.rb
|
@@ -98,30 +98,26 @@ files:
|
|
98
98
|
homepage: http://github.com/collectiveidea/delayed_job
|
99
99
|
licenses:
|
100
100
|
- MIT
|
101
|
+
metadata: {}
|
101
102
|
post_install_message:
|
102
103
|
rdoc_options: []
|
103
104
|
require_paths:
|
104
105
|
- lib
|
105
106
|
required_ruby_version: !ruby/object:Gem::Requirement
|
106
|
-
none: false
|
107
107
|
requirements:
|
108
108
|
- - ! '>='
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
|
-
segments:
|
112
|
-
- 0
|
113
|
-
hash: -646849104774513769
|
114
111
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
115
|
-
none: false
|
116
112
|
requirements:
|
117
113
|
- - ! '>'
|
118
114
|
- !ruby/object:Gem::Version
|
119
115
|
version: 1.3.1
|
120
116
|
requirements: []
|
121
117
|
rubyforge_project:
|
122
|
-
rubygems_version:
|
118
|
+
rubygems_version: 2.0.3
|
123
119
|
signing_key:
|
124
|
-
specification_version:
|
120
|
+
specification_version: 4
|
125
121
|
summary: Database-backed asynchronous priority queue system -- Extracted from Shopify
|
126
122
|
test_files:
|
127
123
|
- spec/autoloaded/clazz.rb
|