delayed_job_active_record_threaded 0.0.3 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +5 -1
- data/CHANGELOG.md +10 -0
- data/README.md +71 -16
- data/delayed_job_active_record_threaded.gemspec +16 -17
- data/lib/delayed/home_manager.rb +13 -6
- data/lib/delayed/home_worker.rb +2 -0
- data/lib/tasks/dj.rake +9 -3
- data/test/delayed_job_active_record_threaded_test.rb +92 -9
- data/test/test_helper.rb +0 -1
- metadata +3 -35
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 56c9fe953525b72cc2c50364109a34b1ef26e445
|
4
|
+
data.tar.gz: a87b84d2c0372b7591fd1be25a9d934f97edcc6f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1348de2ee8adf7da6ef92aa7655f3db0d6765f343513b8dec9f05d5b019e58cac2f485cbc1b131de288428f99123a9e5700cf2e881cafc50fdd002b8ac6efc71
|
7
|
+
data.tar.gz: a203944b180322e06e456692e87090c14c3d5b59eaadd1299672006fd37eecc4e36fe160db27dcb224789eeb8317702a1f846bac73a38bcd08fea358683bd738
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -8,9 +8,13 @@ only:
|
|
8
8
|
rvm:
|
9
9
|
- 1.9.3
|
10
10
|
- 2.0.0
|
11
|
+
- 2.1.0
|
12
|
+
- 2.1.2
|
11
13
|
env:
|
12
14
|
matrix:
|
13
15
|
- "RAILS_VERSION=\"~> 3.0.0\""
|
14
16
|
- "RAILS_VERSION=\"~> 3.1.0\""
|
15
17
|
- "RAILS_VERSION=\"~> 3.2.0\""
|
16
|
-
- "RAILS_VERSION=\"~> 4.0.0\""
|
18
|
+
- "RAILS_VERSION=\"~> 4.0.0\""
|
19
|
+
- "RAILS_VERSION=\"~> 4.1.0\""
|
20
|
+
- "RAILS_VERSION=\"~> 4.1.1\""
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
# DelayedJobActiveRecordThreaded [![Build Status](https://travis-ci.org/zxiest/delayed_job_active_record_threaded.png)](http://travis-ci.org/zxiest/delayed_job_active_record_threaded)
|
2
2
|
|
3
|
+
<br/>
|
3
4
|
DelayedJob allows you to execute long-running jobs at a later time. For more information on how to create and delay a job, follow https://github.com/collectiveidea/delayed_job
|
4
5
|
|
5
|
-
This gem processes your delayed jobs with a single threaded process (instead of multiple processes).
|
6
|
+
This gem processes your delayed jobs with a single multi-threaded process (instead of multiple processes).
|
6
7
|
This helps avoid database deadlocks and saves computing resources.
|
7
8
|
|
9
|
+
<hr/>
|
8
10
|
## Installation
|
9
11
|
|
10
12
|
Add this line to your application's Gemfile:
|
@@ -19,9 +21,8 @@ Or install it yourself as:
|
|
19
21
|
|
20
22
|
$ gem install delayed_job_active_record_threaded
|
21
23
|
|
22
|
-
|
23
24
|
## Setup
|
24
|
-
Make sure to pick the correct setup method prior to proceeding
|
25
|
+
<b>Make sure to pick the correct setup method prior to proceeding</b>
|
25
26
|
|
26
27
|
### Fresh setup
|
27
28
|
Follow this setup method if you do have not been using delayed_job_active_record in your project and do not have a "delayed_jobs" table created:
|
@@ -30,36 +31,77 @@ Follow this setup method if you do have not been using delayed_job_active_record
|
|
30
31
|
$ rake db:migrate
|
31
32
|
|
32
33
|
### Upgrading from delayed_job_active_record
|
33
|
-
|
34
34
|
If you were previously using delayed_job_active_record, follow the steps below:
|
35
35
|
|
36
36
|
$ rails generate delayed_job:upgrade
|
37
37
|
$ rake db:migrate
|
38
38
|
|
39
|
-
|
39
|
+
The lines above will add additional columns to your delayed_jobs table.
|
40
40
|
|
41
41
|
## Usage
|
42
|
+
### Delaying work
|
43
|
+
Any object that respond_to? perform can be delayed.
|
44
|
+
|
45
|
+
class EbookProcessor
|
46
|
+
def initialize(ebook_id)
|
47
|
+
@ebook_id = ebook_id
|
48
|
+
end
|
49
|
+
|
50
|
+
def perform
|
51
|
+
ebook = Ebook.find_by_id(@ebook_id)
|
52
|
+
# run long-running process
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
In order to create a job and push it to the queue, do the following:
|
57
|
+
|
58
|
+
Delayed::Job.enqueue EbookProcessor.new(Ebook.find_by_name('The Power of Habit').id), :queue => 'ebooks_queue'
|
59
|
+
|
60
|
+
When :queue is not provided, the job will be pushed to the default queue (queue with name 'default' or nil).
|
61
|
+
Read below if you wish to process multiple queues simultaneously.
|
62
|
+
|
63
|
+
Another way of delaying work is to call the method delay on an object:
|
64
|
+
|
65
|
+
EbookProcessor.new(Ebook.find_by_name('The Power of Habit').id).delay
|
66
|
+
|
67
|
+
### Delaying mailers
|
68
|
+
|
69
|
+
Mailers work differently and can be delayed this way:
|
42
70
|
|
43
|
-
|
71
|
+
UserMailer.delay(:queue => 'mailers').welcome_user(13)
|
44
72
|
|
45
|
-
|
73
|
+
<hr/>
|
74
|
+
### WARNING
|
75
|
+
As you may have noticed in call to welcome_user above, we did not pass a user object but rather the user's id. This is a very important notion when using delayed_job.
|
76
|
+
Never pass an object to delayed job unless you are certain it can be deserialized.
|
77
|
+
Especially avoid passing ActiveRecord::Base objects. If you do, you will be wondering why your delayed_jobs are failing silently.
|
46
78
|
|
47
|
-
|
79
|
+
For instance, the following code is <b>BAD</b>:
|
80
|
+
|
81
|
+
# WARNING: NEVER DO THIS
|
82
|
+
@user = User.find(13)
|
83
|
+
UserMailer.delay(:queue => 'mailers').welcome_user(@user)
|
84
|
+
|
85
|
+
</span></p><br/>
|
86
|
+
For more information about delayed_jobs, check out https://github.com/collectiveidea/delayed_job
|
87
|
+
|
88
|
+
<hr/>
|
89
|
+
## Running Queue Processors
|
90
|
+
|
91
|
+
### Default
|
92
|
+
The commands below are equivalent and run a process that goes through the jobs in the delayed_jobs table:
|
48
93
|
|
49
94
|
$ bundle exec rake delayed_job:start
|
50
|
-
or
|
51
95
|
$ bundle exec rake dj:start
|
52
96
|
|
53
|
-
###
|
97
|
+
### Multiple Queues and Extra Options
|
98
|
+
The default task processes all the jobs in all queues. In order to allow queue separation and prioritization, you would want to categorize your jobs and push them to different queues.
|
54
99
|
|
55
|
-
|
100
|
+
Also, you can have multiple queues processed simultaneously, each with its own options. In the example below, we assume you have an "ebooks" and an "albums" queues.
|
56
101
|
|
57
|
-
|
58
|
-
In the example below, we assume you have an "ebooks" and an "albums" queues.
|
102
|
+
The commands below will process the queues ebooks and albums simultaneously:
|
59
103
|
|
60
|
-
The command below will process the queues ebooks and albums simultaneously
|
61
104
|
$ bundle exec rake "dj:start[ebooks&albums]"
|
62
|
-
|
63
105
|
$ bundle exec rake "dj:start[ebooks[workers_number]=16&ebooks[worker_timeout]=60&albums[workers_number]=32&albums[worker_timeout]=120]"
|
64
106
|
|
65
107
|
The expression "ebooks[workers_number]=16&ebooks[worker_timeout]=60" is a parsed similarly to a URL's query string and would be converted into the following hash:
|
@@ -68,7 +110,20 @@ The expression "ebooks[workers_number]=16&ebooks[worker_timeout]=60" is a parsed
|
|
68
110
|
|
69
111
|
The rake task above will start a process in the background and process two queues, "ebooks" with 16 working threads and times out after 60 seconds and "albums" with 32 working threads and times out after 120 seconds.
|
70
112
|
|
71
|
-
|
113
|
+
Note that, if you specify the name of one queue, you must specify the other queues as well if you wish them to be processed.
|
114
|
+
|
115
|
+
### Starting/Stopping on Production
|
116
|
+
In order to start and stop delayed_job on production (or any other environenment), pass along the RAILS_ENV variable.
|
117
|
+
|
118
|
+
$ RAILS_ENV=production bundle exec rake dj:start
|
119
|
+
$ RAILS_ENV=production bundle exec rake dj:stop
|
120
|
+
|
121
|
+
The pid file will be in tmp/pids/delayed_job_production.pid and the log file will be in log/delayed_job_production.log
|
122
|
+
|
123
|
+
Note that the task dj:start spawns a background process that calls dj:run and does not die when you disconnect from the terminal.
|
124
|
+
|
125
|
+
<b>Default options:</b>
|
126
|
+
|
72
127
|
workers_number: 16
|
73
128
|
worker_timeout: 60
|
74
129
|
|
@@ -3,30 +3,29 @@ lib = File.expand_path('../lib', __FILE__)
|
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
|
-
spec.name =
|
7
|
-
spec.authors = [
|
8
|
-
spec.email = [
|
6
|
+
spec.name = 'delayed_job_active_record_threaded'
|
7
|
+
spec.authors = ['Abdo Achkar']
|
8
|
+
spec.email = ['abdo.achkar@gmail.com']
|
9
9
|
spec.description = %q{Allows going through delayed job queues using threads instead of processes}
|
10
10
|
spec.summary = %q{Process the delayed job queue using threads.}
|
11
|
-
spec.homepage =
|
12
|
-
spec.license =
|
11
|
+
spec.homepage = ''
|
12
|
+
spec.license = 'MIT'
|
13
13
|
|
14
14
|
spec.files = `git ls-files`.split($/)
|
15
15
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
16
16
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
17
|
-
spec.require_paths = [
|
17
|
+
spec.require_paths = ['lib']
|
18
18
|
|
19
|
-
spec.add_development_dependency
|
20
|
-
spec.add_development_dependency
|
21
|
-
spec.add_development_dependency
|
22
|
-
spec.add_development_dependency
|
23
|
-
spec.add_development_dependency
|
24
|
-
spec.add_development_dependency
|
25
|
-
spec.add_development_dependency "rake"
|
19
|
+
spec.add_development_dependency 'bundler', '~> 1.3'
|
20
|
+
spec.add_development_dependency 'minitest', '~> 4.7.3'
|
21
|
+
spec.add_development_dependency 'minitest-rails', '~> 0.9.1'
|
22
|
+
spec.add_development_dependency 'rails', ['>= 3.0']
|
23
|
+
spec.add_development_dependency 'protected_attributes'
|
24
|
+
spec.add_development_dependency 'rake'
|
26
25
|
spec.add_development_dependency 'sqlite3-ruby', '>= 1.3.1'
|
27
|
-
spec.add_development_dependency
|
28
|
-
spec.add_dependency 'activerecord', ['>= 3.0'
|
29
|
-
spec.add_dependency 'delayed_job', ['>= 3.0'
|
26
|
+
spec.add_development_dependency 'mysql2'
|
27
|
+
spec.add_dependency 'activerecord', ['>= 3.0']
|
28
|
+
spec.add_dependency 'delayed_job', ['>= 3.0']
|
30
29
|
spec.add_dependency 'celluloid', ['>=0.14.1']
|
31
|
-
spec.version =
|
30
|
+
spec.version = '0.0.5'
|
32
31
|
end
|
data/lib/delayed/home_manager.rb
CHANGED
@@ -31,6 +31,8 @@ module Delayed
|
|
31
31
|
@workers_number ||= DEFAULT_WORKERS_NUMBER
|
32
32
|
@max_attempts ||= DEFAULT_MAX_ATTEMPTS
|
33
33
|
@worker_options ||= {}
|
34
|
+
|
35
|
+
# if @queue is nil, we'll pull from all queues
|
34
36
|
end
|
35
37
|
|
36
38
|
def start
|
@@ -49,11 +51,11 @@ module Delayed
|
|
49
51
|
@timer = every(@sleep_time) {
|
50
52
|
begin
|
51
53
|
if (!@alive)
|
52
|
-
@timer.
|
54
|
+
@timer.cancel
|
55
|
+
else
|
56
|
+
jobs = pull_next(@queue, @workers_pool.idle_size)
|
57
|
+
jobs.each { |j| @workers_pool.async.work(j) }
|
53
58
|
end
|
54
|
-
|
55
|
-
jobs = pull_next(@queue, @workers_pool.idle_size)
|
56
|
-
jobs.each { |j| @workers_pool.async.work(j) }
|
57
59
|
rescue
|
58
60
|
# logging error watch
|
59
61
|
begin
|
@@ -77,10 +79,15 @@ module Delayed
|
|
77
79
|
def pull_next(queue=nil, n=15)
|
78
80
|
ids = []
|
79
81
|
Delayed::Job.transaction do
|
80
|
-
query = Delayed::Job.where(
|
81
|
-
if (queue)
|
82
|
+
query = Delayed::Job.where('(run_at is null or run_at < ?) and locked_at is null', DateTime.now).order('priority asc, run_at asc, id asc')
|
83
|
+
if (queue && queue != 'default')
|
82
84
|
query = query.where(:queue => queue)
|
85
|
+
# if the queue is 'default' or nil, this would be the "default queue"
|
86
|
+
elsif queue == 'default'
|
87
|
+
query = query.where(:queue => ['default', nil])
|
83
88
|
end
|
89
|
+
# if no queue name is provided, the "queue" column would be ignored
|
90
|
+
# therefore returning the list of all jobs in all queues
|
84
91
|
|
85
92
|
query = query.limit(n)
|
86
93
|
ids = query.pluck(:id)
|
data/lib/delayed/home_worker.rb
CHANGED
data/lib/tasks/dj.rake
CHANGED
@@ -52,7 +52,7 @@ namespace :delayed_job do
|
|
52
52
|
workers_timeout ||= DEFAULT_WORKERS_TIMEOUT
|
53
53
|
|
54
54
|
# set to nil of queue_name is default
|
55
|
-
queue_name = nil if (queue_name ==
|
55
|
+
queue_name = nil if (queue_name == 'default')
|
56
56
|
|
57
57
|
puts "queue: #{queue_name}, workers_number: #{workers_number}, workers_timeout: #{workers_timeout}"
|
58
58
|
|
@@ -66,14 +66,20 @@ namespace :delayed_job do
|
|
66
66
|
end
|
67
67
|
|
68
68
|
def dj_pid
|
69
|
-
return
|
69
|
+
return "tmp/pids/delayed_job_#{Rails.env}.pid" if Rails.env
|
70
|
+
'tmp/pids/delayed_job.pid'
|
71
|
+
end
|
72
|
+
|
73
|
+
def delayed_job_output
|
74
|
+
return "log/delayed_job_#{Rails.env}.log" if Rails.env
|
75
|
+
'log/delayed_job.log'
|
70
76
|
end
|
71
77
|
|
72
78
|
task :start, [ :args_expr ] => :environment do |t, args|
|
73
79
|
puts "#{args[:args_expr]}"
|
74
80
|
|
75
81
|
cmd = %(if [ -f #{dj_pid} ] && [ -n `cat #{dj_pid}` ] && ps -p `cat #{dj_pid}` > /dev/null; then kill `cat #{dj_pid}`; fi
|
76
|
-
(bundle exec rake "delayed_job:run[#{args[:args_expr]}]" >>
|
82
|
+
(RAILS_ENV=#{Rails.env} bundle exec rake "delayed_job:run[#{args[:args_expr]}]" >> #{delayed_job_output} 2>&1) & (echo $! > #{dj_pid})
|
77
83
|
)
|
78
84
|
|
79
85
|
puts "executing: #{cmd}"
|
@@ -1,8 +1,8 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
1
|
+
require 'test_helper'
|
2
|
+
require 'delayed_job_active_record_threaded'
|
3
|
+
require 'rails'
|
4
|
+
require 'rails/test_help'
|
5
|
+
require 'minitest/rails'
|
6
6
|
|
7
7
|
class TestJob < Struct.new(:id)
|
8
8
|
def perform
|
@@ -12,24 +12,48 @@ class TestJob < Struct.new(:id)
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
+
class CrashingJob < TestJob
|
16
|
+
def perform
|
17
|
+
raise 'failing job'
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
15
21
|
class DelayedJobActiveRecordThreadedTest < ActiveSupport::TestCase #MiniTest::Unit::TestCase
|
16
22
|
self.use_transactional_fixtures = false
|
17
23
|
|
18
|
-
QUEUE_NAME =
|
24
|
+
QUEUE_NAME = 'StoriesQueue'
|
25
|
+
WORKING_STORIES = 100
|
26
|
+
CRASHING_STORIES = 10
|
27
|
+
STORIES_WITH_NO_QUEUE_NAME = 10
|
28
|
+
|
29
|
+
def prepare_stories_with_no_queue_name
|
30
|
+
STORIES_WITH_NO_QUEUE_NAME.times { |i|
|
31
|
+
s = Story.create!(:text => "Story #{i}")
|
32
|
+
Delayed::Job.enqueue(CrashingJob.new(s.id), :priority => i, :delayable_id => s.id, :delayable_type => s.class.name, :run_at => 10.seconds.ago)
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
def prepare_failing_stories
|
37
|
+
CRASHING_STORIES.times { |i|
|
38
|
+
s = Story.create!(:text => "Story #{i}")
|
39
|
+
Delayed::Job.enqueue(CrashingJob.new(s.id), :queue => QUEUE_NAME, :priority => i, :delayable_id => s.id, :delayable_type => s.class.name, :run_at => 10.seconds.ago)
|
40
|
+
}
|
41
|
+
end
|
19
42
|
|
20
43
|
before do
|
21
44
|
#Delayed::Job.new(:run_at => 10.seconds.ago).save
|
22
|
-
|
45
|
+
WORKING_STORIES.times { |i|
|
23
46
|
s = Story.create!(:text => "Story #{i}")
|
24
47
|
Delayed::Job.enqueue(TestJob.new(s.id), :queue => QUEUE_NAME, :priority => i, :delayable_id => s.id, :delayable_type => s.class.name, :run_at => 10.seconds.ago)
|
25
48
|
}
|
26
49
|
end
|
27
50
|
|
28
51
|
after do
|
52
|
+
Story.delete_all
|
29
53
|
end
|
30
54
|
|
31
55
|
# this is VERY dependent on the database pool size
|
32
|
-
test
|
56
|
+
test 'should process jobs without crashing' do
|
33
57
|
Celluloid.boot # fixes Celluloid issue "Thread pool is not running"
|
34
58
|
mgr = Delayed::HomeManager.new({ :sleep_time => 1, :workers_number => 25, :queue => QUEUE_NAME })
|
35
59
|
|
@@ -43,6 +67,65 @@ class DelayedJobActiveRecordThreadedTest < ActiveSupport::TestCase #MiniTest::Un
|
|
43
67
|
|
44
68
|
puts "Number of threads: #{Thread.list.count}"
|
45
69
|
|
46
|
-
assert Delayed::Job.where(
|
70
|
+
assert Delayed::Job.where('queue = ?', QUEUE_NAME).count == 0, "Expected to have an empty queue after 10 seconds. Queue size was #{Delayed::Job.count} instead"
|
71
|
+
end
|
72
|
+
|
73
|
+
test 'pool should maintain the number of workers and not crash' do
|
74
|
+
Celluloid.boot # fixes Celluloid issue "Thread pool is not running"
|
75
|
+
mgr = Delayed::HomeManager.new({ :sleep_time => 0.5, :workers_number => 50, :queue => QUEUE_NAME })
|
76
|
+
mgr.start
|
77
|
+
sleep(3)
|
78
|
+
|
79
|
+
assert mgr.workers_pool.size == 50, "Pool is expected to maintain its size, got size of #{mgr.workers_pool.size} instead"
|
80
|
+
|
81
|
+
assert mgr.alive, 'Expected Manager to be alive after completing queue'
|
82
|
+
|
83
|
+
mgr.kill
|
84
|
+
end
|
85
|
+
|
86
|
+
test 'should succeed and maintain pool size even if workers have crashing job' do
|
87
|
+
prepare_failing_stories
|
88
|
+
|
89
|
+
assert (Story.count == (CRASHING_STORIES+WORKING_STORIES)), "test expects to start with #{(CRASHING_STORIES+WORKING_STORIES)} stories, got #{Story.count} instead"
|
90
|
+
|
91
|
+
Celluloid.boot # fixes Celluloid issue "Thread pool is not running"
|
92
|
+
mgr = Delayed::HomeManager.new({ :sleep_time => 0.5, :workers_number => 50, :queue => QUEUE_NAME })
|
93
|
+
|
94
|
+
mgr.start
|
95
|
+
sleep(3)
|
96
|
+
|
97
|
+
assert mgr.workers_pool.size == 50, "Pool is expected to maintain its size, got size of #{mgr.workers_pool.size} instead"
|
98
|
+
|
99
|
+
assert mgr.alive, 'Expected Manager to be alive after completing queue'
|
100
|
+
|
101
|
+
mgr.kill
|
102
|
+
end
|
103
|
+
|
104
|
+
test 'should work if things are queued without a queue name' do
|
105
|
+
prepare_stories_with_no_queue_name
|
106
|
+
|
107
|
+
Celluloid.boot # fixes Celluloid issue "Thread pool is not running"
|
108
|
+
mgr = Delayed::HomeManager.new({ :sleep_time => 0.5, :workers_number => 50 })
|
109
|
+
|
110
|
+
mgr.start
|
111
|
+
sleep(3)
|
112
|
+
|
113
|
+
assert mgr.workers_pool.size == 50, "Pool is expected to maintain its size, got size of #{mgr.workers_pool.size} instead"
|
114
|
+
|
115
|
+
assert mgr.alive, 'Expected Manager to be alive after completing queue'
|
116
|
+
|
117
|
+
mgr.kill
|
118
|
+
end
|
119
|
+
|
120
|
+
test 'should not touch a queue that we are not processing' do
|
121
|
+
prepare_stories_with_no_queue_name
|
122
|
+
|
123
|
+
Celluloid.boot # fixes Celluloid issue "Thread pool is not running"
|
124
|
+
mgr = Delayed::HomeManager.new({ :sleep_time => 0.5, :workers_number => 50, :queue => QUEUE_NAME })
|
125
|
+
|
126
|
+
mgr.start
|
127
|
+
sleep(3)
|
128
|
+
|
129
|
+
assert Delayed::Job.where('queue is null').count == STORIES_WITH_NO_QUEUE_NAME, "Expected jobs in queue NIL to remain untouched. Instead, got only #{Delayed::Job.count} remaining"
|
47
130
|
end
|
48
131
|
end
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: delayed_job_active_record_threaded
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Abdo Achkar
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-05-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -59,9 +59,6 @@ dependencies:
|
|
59
59
|
- - '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '3.0'
|
62
|
-
- - <
|
63
|
-
- !ruby/object:Gem::Version
|
64
|
-
version: '4.1'
|
65
62
|
type: :development
|
66
63
|
prerelease: false
|
67
64
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -69,9 +66,6 @@ dependencies:
|
|
69
66
|
- - '>='
|
70
67
|
- !ruby/object:Gem::Version
|
71
68
|
version: '3.0'
|
72
|
-
- - <
|
73
|
-
- !ruby/object:Gem::Version
|
74
|
-
version: '4.1'
|
75
69
|
- !ruby/object:Gem::Dependency
|
76
70
|
name: protected_attributes
|
77
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,20 +80,6 @@ dependencies:
|
|
86
80
|
- - '>='
|
87
81
|
- !ruby/object:Gem::Version
|
88
82
|
version: '0'
|
89
|
-
- !ruby/object:Gem::Dependency
|
90
|
-
name: turn
|
91
|
-
requirement: !ruby/object:Gem::Requirement
|
92
|
-
requirements:
|
93
|
-
- - '>='
|
94
|
-
- !ruby/object:Gem::Version
|
95
|
-
version: '0'
|
96
|
-
type: :development
|
97
|
-
prerelease: false
|
98
|
-
version_requirements: !ruby/object:Gem::Requirement
|
99
|
-
requirements:
|
100
|
-
- - '>='
|
101
|
-
- !ruby/object:Gem::Version
|
102
|
-
version: '0'
|
103
83
|
- !ruby/object:Gem::Dependency
|
104
84
|
name: rake
|
105
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -149,9 +129,6 @@ dependencies:
|
|
149
129
|
- - '>='
|
150
130
|
- !ruby/object:Gem::Version
|
151
131
|
version: '3.0'
|
152
|
-
- - <
|
153
|
-
- !ruby/object:Gem::Version
|
154
|
-
version: '4.1'
|
155
132
|
type: :runtime
|
156
133
|
prerelease: false
|
157
134
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -159,9 +136,6 @@ dependencies:
|
|
159
136
|
- - '>='
|
160
137
|
- !ruby/object:Gem::Version
|
161
138
|
version: '3.0'
|
162
|
-
- - <
|
163
|
-
- !ruby/object:Gem::Version
|
164
|
-
version: '4.1'
|
165
139
|
- !ruby/object:Gem::Dependency
|
166
140
|
name: delayed_job
|
167
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -169,9 +143,6 @@ dependencies:
|
|
169
143
|
- - '>='
|
170
144
|
- !ruby/object:Gem::Version
|
171
145
|
version: '3.0'
|
172
|
-
- - <
|
173
|
-
- !ruby/object:Gem::Version
|
174
|
-
version: '4.1'
|
175
146
|
type: :runtime
|
176
147
|
prerelease: false
|
177
148
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -179,9 +150,6 @@ dependencies:
|
|
179
150
|
- - '>='
|
180
151
|
- !ruby/object:Gem::Version
|
181
152
|
version: '3.0'
|
182
|
-
- - <
|
183
|
-
- !ruby/object:Gem::Version
|
184
|
-
version: '4.1'
|
185
153
|
- !ruby/object:Gem::Dependency
|
186
154
|
name: celluloid
|
187
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -246,7 +214,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
246
214
|
version: '0'
|
247
215
|
requirements: []
|
248
216
|
rubyforge_project:
|
249
|
-
rubygems_version: 2.
|
217
|
+
rubygems_version: 2.2.2
|
250
218
|
signing_key:
|
251
219
|
specification_version: 4
|
252
220
|
summary: Process the delayed job queue using threads.
|