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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 981142e7ce0bc0a93febb2fd65d0b9d6154a19f0
4
- data.tar.gz: 8d8fb58d77e0cb70776512c82ad293565816def5
3
+ metadata.gz: 56c9fe953525b72cc2c50364109a34b1ef26e445
4
+ data.tar.gz: a87b84d2c0372b7591fd1be25a9d934f97edcc6f
5
5
  SHA512:
6
- metadata.gz: 0c6a4748e4f00dfce80ae4c83bf17ceb9a59feb6a8315987adafcab9dbc8e8573fe79b34ba97bd3d3b936105ed7ad630ecf9cf18ebbfc2c4d2161484ec5b38d9
7
- data.tar.gz: 6634d85d67102b7097c73213dce1e42607f8dd7b04592d67c2a843e22765a77aa3af9ded22e82800a790388ea6d7d835ccd75100dbb86c7e19648619245f01cc
6
+ metadata.gz: 1348de2ee8adf7da6ef92aa7655f3db0d6765f343513b8dec9f05d5b019e58cac2f485cbc1b131de288428f99123a9e5700cf2e881cafc50fdd002b8ac6efc71
7
+ data.tar.gz: a203944b180322e06e456692e87090c14c3d5b59eaadd1299672006fd37eecc4e36fe160db27dcb224789eeb8317702a1f846bac73a38bcd08fea358683bd738
data/.gitignore CHANGED
@@ -17,3 +17,4 @@ test/version_tmp
17
17
  tmp
18
18
  .idea/workspace.xml
19
19
  .idea/
20
+ .DS_Store
@@ -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\""
@@ -1,3 +1,13 @@
1
+ ## v0.0.5
2
+ * enabled for rails 4.1+
3
+
4
+ ## v0.0.4
5
+
6
+ * added tests
7
+ * fixed issues with default queue
8
+ * fixed little bugs on HomeManager exit
9
+ * enhanced documentation
10
+
1
11
  ## v0.0.3
2
12
 
3
13
  * fixed tests and travis related stuff
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
- This will add columns to your delayed_jobs table.
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
- For information on how to create delayed_jobs and enqueue them, follow https://github.com/collectiveidea/delayed_job
71
+ UserMailer.delay(:queue => 'mailers').welcome_user(13)
44
72
 
45
- In order to start the threaded process this gem provides, use the following:
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
- ### Defaults
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
- ### With Options
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
- The default task processes items belonging to all the queues. This is, most of times, not desirable as tasks with higher priority in a given queue take precedence over tasks in another queue.
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
- You can have multiple queues processed simultaneously, each with its own options.
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
- Default options:
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 = "delayed_job_active_record_threaded"
7
- spec.authors = ["Abdo Achkar"]
8
- spec.email = ["abdo.achkar@gmail.com"]
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 = "MIT"
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 = ["lib"]
17
+ spec.require_paths = ['lib']
18
18
 
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', '< 4.1']
23
- spec.add_development_dependency "protected_attributes"
24
- spec.add_development_dependency "turn"
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 "mysql2"
28
- spec.add_dependency 'activerecord', ['>= 3.0', '< 4.1']
29
- spec.add_dependency 'delayed_job', ['>= 3.0', '< 4.1']
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 = "0.0.3"
30
+ spec.version = '0.0.5'
32
31
  end
@@ -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.stop
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("(run_at is null or run_at < ?) and locked_at is null", DateTime.now).order("priority asc, run_at asc, id asc")
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)
@@ -37,6 +37,8 @@ module Delayed
37
37
  job.attempts += 1
38
38
  job.run_at = (job.attempts ** 4 + 5).seconds.from_now
39
39
  job.save
40
+ else
41
+ job.delete
40
42
  end
41
43
  end
42
44
 
@@ -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 == "default")
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 'tmp/pids/delayed_job.pid'
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]}]" >> log/delayed_job.log 2>&1) & (echo $! > #{dj_pid})
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 "test_helper"
2
- require "delayed_job_active_record_threaded"
3
- require "rails"
4
- require "rails/test_help"
5
- require "minitest/rails"
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 = "StoriesQueue"
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
- 100.times { |i|
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 "should process jobs without crashing" do
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("queue = ?", QUEUE_NAME).count == 0, "Expected to have an empty queue after 10 seconds. Queue size was #{Delayed::Job.count} instead"
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
@@ -1,6 +1,5 @@
1
1
  require 'minitest/unit'
2
2
  require 'minitest/autorun'
3
- require 'turn'
4
3
 
5
4
 
6
5
  require 'yaml'
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.3
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: 2013-09-18 00:00:00.000000000 Z
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.0.3
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.