delayed_job_celluloid 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- YmNjODUyMWU4YjE2ZWE2ZDBjNjk5OTIxM2U0ZTNmNWU2YTcyODczOA==
5
- data.tar.gz: !binary |-
6
- ZGZjMTFhZmE4ZjhhNTQ5ZjU5YjFiYjM0ZWM0MjA3YTE3N2UzZWU4MQ==
7
- !binary "U0hBNTEy":
8
- metadata.gz: !binary |-
9
- MjJkYjY2OWFlYmVjZjQ1Zjc0MGI3ODYxYWM5M2UxYmUwNzFkMWQzYWQ0OTlm
10
- MjFiYzhhZDU0ZDExNWNjNjY4NGNhMmQ5NGIyNWJiZjA3NmI2YzAwYmQzYzBk
11
- YjI0MDZkOGY1YmQ1YzIwMzQ1OGQ1ODhmMGMxODIyMDI0OGUxMGM=
12
- data.tar.gz: !binary |-
13
- NjAzMDMyNjNlNWQ5Njg1NjA2NzhkMjUxNzRlOTNhMGMwNmI4MzBkYzFlZWRi
14
- ZDVhNjg5NmE5ZWM2ZDlkYWEwNGMzZjQxNTQ5NjE5OTRlZGEyOGRmYWJkMWNh
15
- MTUxYzRkYjBlMTQ1ZjM1MWRiMmU5Y2JhN2IzMDI3NWMwZjUwZTM=
2
+ SHA1:
3
+ metadata.gz: 13f46b03b4a215168b557850cf06ff0722e4dc6b
4
+ data.tar.gz: d5e2e5876c613d67497f6ea7dda79fd79c6bae99
5
+ SHA512:
6
+ metadata.gz: 1fd4632b88ea294c93b012de18da796d977ba8618c42131930449794c6c01f39c6cb05de110a98fa7587fad15be637bc4ce9c1761ee4190bb5d3e1821a2a8e11
7
+ data.tar.gz: 1dac98c0b4c006d422d03052811196514bb05718971f00c0775d6fb12a8261c060cc492079eef75cb34891a12d5cd2084b91c100241a6d33d041f3689ced79a7
data/README.md CHANGED
@@ -6,7 +6,7 @@ Based on awesome gems like Sidekiq and Suckerpunch, DelayedJobCelluloid allows d
6
6
 
7
7
  Add delayed_job_celluloid to your gem file
8
8
 
9
- gem 'delayed_job_celluloid
9
+ gem 'delayed_job_celluloid'
10
10
 
11
11
  Run bundle install
12
12
 
@@ -36,7 +36,20 @@ One important thing to bear in mind with this is that you should have a database
36
36
  host: localhost
37
37
  pool: 5
38
38
 
39
- Currently the gem does not support daemonization of the main process because I haven't needed it as I am using it in conjuction with Unicorn on Heroku. If you are running your app on Heroku, this gem will allow you to run multiple workers in a single Unicorn process. An example unicorn config is as follows:
39
+ The gem also does not work particularly well with Sqlite since Sqlite does not handle concurrent reads/writes. You will see locking errors, although delayed job handles these gracefully by retrying the job later.
40
+
41
+ ## Daemonization
42
+
43
+ script/delayed_job_celluloid -d start
44
+ script/delayed_job_celluloid -d stop
45
+
46
+ You can also start the daemon with a monitor process that will restart the daemon if it crashes
47
+
48
+ script/delayed_job_celluloid -d -m start
49
+
50
+ ##Heroku
51
+
52
+ If you are running your app on Heroku, this gem will allow you to run multiple workers in a single Unicorn process. An example unicorn config is as follows:
40
53
 
41
54
  # config/unicorn.rb
42
55
  worker_processes Integer(ENV["WEB_CONCURRENCY"] || 2)
@@ -67,8 +80,6 @@ Currently the gem does not support daemonization of the main process because I h
67
80
  ActiveRecord::Base.establish_connection
68
81
  end
69
82
 
70
- If you are interested in adding daemonization to the gem itself, feel free to fork it and submit a pull request.
71
-
72
83
  ## Contributing
73
84
 
74
85
  1. Fork it
data/Rakefile CHANGED
@@ -1,11 +1,30 @@
1
1
  require "bundler/gem_tasks"
2
2
  require 'rake/testtask'
3
3
 
4
- Rake::TestTask.new(:test) do |test|
4
+ Rake::TestTask.new(:test_launcher) do |test|
5
5
  test.libs << 'test'
6
6
  #SO MUCH NOISE
7
7
  #test.warning = true
8
- test.pattern = 'spec/**/*_spec.rb'
8
+ test.pattern = 'spec/launcher_spec.rb'
9
9
  end
10
10
 
11
- task :default => :test
11
+ Rake::TestTask.new(:test_manager) do |test|
12
+ test.libs << 'test'
13
+ #SO MUCH NOISE
14
+ #test.warning = true
15
+ test.pattern = 'spec/manager_spec.rb'
16
+ end
17
+
18
+ Rake::TestTask.new(:test_worker) do |test|
19
+ test.libs << 'test'
20
+ #SO MUCH NOISE
21
+ #test.warning = true
22
+ test.pattern = 'spec/worker_spec.rb'
23
+ end
24
+
25
+ Rake::TestTask.new(:test_command) do |test|
26
+ test.libs << 'test'
27
+ #SO MUCH NOISE
28
+ #test.warning = true
29
+ test.pattern = 'spec/command_spec.rb'
30
+ end
@@ -13,16 +13,18 @@ Gem::Specification.new do |s|
13
13
  s.homepage = ""
14
14
  s.license = "MIT"
15
15
 
16
- s.files = `git ls-files`.split($/)
16
+ s.files = `git ls-files | grep -Ev '^(testapp)'`.split("\n")
17
17
  s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
18
  s.test_files = s.files.grep(%r{^(test|spec|features)/})
19
19
  s.require_paths = ["lib"]
20
20
 
21
- s.add_dependency 'delayed_job'
22
- s.add_dependency 'celluloid'
21
+ s.add_dependency 'delayed_job', ">= 4.0.0"
22
+ s.add_dependency 'celluloid', ">= 0.16.0"
23
23
 
24
24
  s.add_development_dependency "bundler", "~> 1.3"
25
25
  s.add_development_dependency "rake"
26
26
  s.add_development_dependency "sqlite3"
27
- s.add_development_dependency "delayed_job_active_record"
27
+ s.add_development_dependency "delayed_job_active_record", ">= 4.0.0"
28
+ s.add_development_dependency "rails", "~> 4.1.0"
29
+ s.add_development_dependency "minitest", "~> 5.5.0"
28
30
  end
@@ -1,7 +1,7 @@
1
1
  $stdout.sync = true
2
2
 
3
3
  require 'optparse'
4
- require 'celluloid/autostart'
4
+ require 'celluloid'
5
5
 
6
6
  module DelayedJobCelluloid
7
7
 
@@ -11,32 +11,114 @@ module DelayedJobCelluloid
11
11
 
12
12
  attr_accessor :worker_count
13
13
 
14
+ def logger
15
+ DelayedJobCelluloid.logger
16
+ end
17
+
14
18
  def initialize(args)
15
19
  parse_options(args)
16
20
  end
17
-
21
+
22
+ def daemonize
23
+ begin
24
+ require 'daemons'
25
+ dir = @options[:pid_dir]
26
+ Dir.mkdir(dir) unless File.exist?(dir)
27
+
28
+ before_fork
29
+ Daemons.run_proc('delayed_job_celluloid', :dir => @options[:pid_dir], :dir_mode => :normal, :monitor => @monitor, :ARGV => @args) do |*_args|
30
+ Celluloid.register_shutdown
31
+ Celluloid.start
32
+ launch_celluloid(false)
33
+ end
34
+
35
+ rescue LoadError
36
+ raise "You need to add gem 'daemons' to your Gemfile if you wish to daemonize delayed_job_celluloid."
37
+ end
38
+ end
39
+
40
+ def before_fork
41
+ @files_to_reopen = []
42
+ ObjectSpace.each_object(File) do |file|
43
+ @files_to_reopen << file unless file.closed?
44
+ end
45
+ end
46
+
47
+ def after_fork
48
+ @files_to_reopen.each do |file|
49
+ begin
50
+ file.reopen file.path, "a+"
51
+ file.sync = true
52
+ rescue ::Exception
53
+ end
54
+ end
55
+ end
56
+
57
+ # Run Celluloid in the foreground
18
58
  def run
19
- self_read, self_write = IO.pipe
59
+
60
+ # Run in the background if daemonizing
61
+ (daemonize; return) if @options[:daemonize]
62
+
63
+ # Otherwise, run in the foreground
64
+ launch_celluloid(true)
65
+ end
66
+
67
+ def launch_celluloid(in_foreground = true)
20
68
 
21
- %w(INT TERM).each do |sig|
22
- trap sig do
23
- self_write.puts(sig)
69
+ if in_foreground
70
+ Celluloid.start
71
+ self_read, self_write = IO.pipe
72
+ %w(INT TERM).each do |sig|
73
+ trap sig do
74
+ self_write.puts(sig)
75
+ end
24
76
  end
25
77
  end
26
-
78
+
27
79
  require 'delayed_job_celluloid/launcher'
28
80
  @launcher = Launcher.new(@options, @worker_count)
29
-
81
+
82
+ unless in_foreground
83
+ after_fork
84
+ log_file = @options[:log_file] ||= 'delayed_job_celluloid.log'
85
+ DelayedJobCelluloid.logger = Logger.new(File.join(Rails.root, 'log', log_file))
86
+ DelayedJobCelluloid.logger.formatter = proc do |severity, datetime, progname, msg|
87
+ "#{datetime}: #{msg}\n"
88
+ end
89
+ Delayed::Worker.logger ||= Logger.new(File.join(Rails.root, 'log', 'delayed_job.log'))
90
+ DelayedJobCelluloid.logger.info 'delayed_job_celluloid daemon started'
91
+
92
+ # Daemonized - wait to receive a signal
93
+ %w(INT TERM).each do |sig|
94
+ trap sig do
95
+ handle_signal(sig)
96
+ end
97
+ end
98
+ end
99
+
30
100
  begin
31
101
  @launcher.run
32
-
33
- while readable_io = IO.select([self_read])
34
- signal = readable_io.first[0].gets.strip
35
- handle_signal(signal)
102
+
103
+ if in_foreground
104
+ while readable_io = IO.select([self_read])
105
+ signal = readable_io.first[0].gets.strip
106
+ handle_signal(signal)
107
+ end
108
+ else
109
+ # Sleep for a bit
110
+ while true
111
+ sleep 60
112
+ end
36
113
  end
37
114
  rescue Interrupt
115
+ logger.info 'Shutting down delayed_job_celluloid'
38
116
  @launcher.stop
39
117
  exit(0)
118
+
119
+ rescue => e
120
+ DelayedJobCelluloid.logger.error "Exception: #{e.message}"
121
+ DelayedJobCelluloid.logger.info Kernel.caller
40
122
  end
41
123
  end
42
124
 
@@ -45,16 +127,17 @@ module DelayedJobCelluloid
45
127
  when 'INT','TERM'
46
128
  raise Interrupt
47
129
  end
48
-
49
130
  end
50
131
 
51
132
  def parse_options(args)
52
133
  @options = {
53
134
  :quiet => true,
54
- :timeout => 8
135
+ :timeout => 8,
136
+ :pid_dir => "#{Rails.root}/tmp/pids"
55
137
  }
56
138
 
57
139
  @worker_count = 2
140
+ @monitor = false
58
141
 
59
142
  opts = OptionParser.new do |opts|
60
143
  opts.banner = "Usage: #{File.basename($0)} [options] start|stop|restart|run"
@@ -90,12 +173,27 @@ module DelayedJobCelluloid
90
173
  opts.on('--queue=queue', "Specify which queue DJ must look up for jobs") do |queue|
91
174
  @options[:queues] = queue.split(',')
92
175
  end
176
+ opts.on('--pool=queue1[,queue2][:worker_count]', 'Specify queues and number of workers for a worker pool') do |pool|
177
+ parse_worker_pool(pool)
178
+ end
93
179
  opts.on('--exit-on-complete', "Exit when no more jobs are available to run. This will exit if all jobs are scheduled to run in the future.") do
94
180
  @options[:exit_on_complete] = true
95
181
  end
96
182
  opts.on('-t', '--timeout NUM', "Shutdown timeout") do |prefix|
97
183
  @options[:timeout] = Integer(arg)
98
184
  end
185
+ opts.on('-d', '--daemonize', "Daemonize process") do
186
+ @options[:daemonize] = true
187
+ end
188
+ opts.on('-L', '--log FILE', "Name of log file") do |log_file|
189
+ @options[:log_file] = log_file
190
+ end
191
+ opts.on('-m', '--monitor', 'Start monitor process.') do
192
+ @monitor = true
193
+ end
194
+ opts.on('--pid-dir=DIR', 'Specifies an alternate directory in which to store the process ids.') do |dir|
195
+ @options[:pid_dir] = dir
196
+ end
99
197
  end
100
198
  @args = opts.parse!(args)
101
199
  end
@@ -9,6 +9,7 @@ module DelayedJobCelluloid
9
9
  end
10
10
 
11
11
  def run
12
+ DelayedJobCelluloid.logger.info 'Launching delayed_job_celluloid'
12
13
  manager.async.start
13
14
  end
14
15
 
@@ -29,6 +29,7 @@ module DelayedJobCelluloid
29
29
  def start
30
30
  @ready.each_with_index do |worker, index|
31
31
  worker.name = "delayed_job.#{index}"
32
+ DelayedJobCelluloid.logger.info "Starting worker #{worker.name}"
32
33
  worker.async.start
33
34
  end
34
35
  end
@@ -90,14 +91,6 @@ module DelayedJobCelluloid
90
91
  # They must die but their messages shall live on.
91
92
  info "Still waiting for #{@busy.size} busy workers"
92
93
 
93
- # Re-enqueue terminated jobs
94
- # NOTE: You may notice that we may push a job back to redis before
95
- # the worker thread is terminated. This is ok because Sidekiq's
96
- # contract says that jobs are run AT LEAST once. Process termination
97
- # is delayed until we're certain the jobs are back in Redis because
98
- # it is worse to lose a job than to run it twice.
99
- #Sidekiq::Fetcher.strategy.bulk_requeue(@in_progress.values)
100
-
101
94
  debug "Terminating #{@busy.size} busy worker threads"
102
95
  @busy.each do |worker|
103
96
  if worker.alive? && t = @threads.delete(worker.object_id)
@@ -1,3 +1,3 @@
1
1
  module DelayedJobCelluloid
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -1,5 +1,4 @@
1
1
  require 'delayed_job'
2
- require 'delayed/performable_mailer'
3
2
 
4
3
  module DelayedJobCelluloid
5
4
  class Worker < Delayed::Worker
@@ -1,9 +1,9 @@
1
1
  require_relative 'spec_helper'
2
2
  require_relative 'test_job'
3
3
 
4
- class CommandSpec < Minitest::Unit::TestCase
4
+ class CommandSpec < Minitest::Test
5
5
  describe 'command' do
6
-
6
+
7
7
  it "starts workers" do
8
8
  i = 0
9
9
  while i < 10 do
data/spec/database.yml CHANGED
@@ -1,3 +1,4 @@
1
1
  test:
2
2
  adapter: sqlite3
3
- database: "spec/db/test.sqlite3"
3
+ database: "spec/db/test.sqlite3"
4
+ pool: 10
@@ -1,7 +1,7 @@
1
1
  require_relative 'spec_helper'
2
2
  require_relative 'test_job'
3
3
 
4
- class LauncherSpec < Minitest::Unit::TestCase
4
+ class LauncherSpec < Minitest::Test
5
5
  describe 'launcher' do
6
6
 
7
7
  it "starts working jobs" do
data/spec/manager_spec.rb CHANGED
@@ -1,8 +1,12 @@
1
1
  require_relative 'spec_helper'
2
2
 
3
- class ManagerSpec < Minitest::Unit::TestCase
3
+ class ManagerSpec < Minitest::Test
4
4
  describe 'manager' do
5
5
 
6
+ before :all do
7
+ DelayedJobCelluloid::Worker.exit_on_complete = true
8
+ end
9
+
6
10
  it "creates N worker instances" do
7
11
  mgr = DelayedJobCelluloid::Manager.new({}, 3)
8
12
  assert_equal mgr.ready.size, 3
@@ -79,8 +83,9 @@ class ManagerSpec < Minitest::Unit::TestCase
79
83
 
80
84
  mgr.worker_died(worker, "test")
81
85
 
82
- assert_equal 0, mgr.ready.size
83
- assert_equal 1, mgr.busy.size
86
+ assert_equal false, mgr.stopped?
87
+ assert_equal 1, mgr.ready.size
88
+ assert_equal 0, mgr.busy.size
84
89
  worker.verify
85
90
  end
86
91
 
data/spec/spec_helper.rb CHANGED
@@ -4,11 +4,11 @@ require 'delayed_job_active_record'
4
4
  require 'minitest/autorun'
5
5
  require 'minitest/spec'
6
6
  require 'minitest/pride'
7
- require 'rails'
8
7
  require 'active_record'
9
8
  require 'sqlite3'
10
9
  require 'logger'
11
10
  require 'celluloid/autostart'
11
+ require 'rails'
12
12
 
13
13
  ROOT = File.join(File.dirname(__FILE__), '..')
14
14
  RAILS_ROOT = ROOT
data/spec/worker_spec.rb CHANGED
@@ -3,8 +3,8 @@ require_relative 'test_job'
3
3
 
4
4
  DelayedJobCelluloid::Worker.backend = :active_record
5
5
 
6
- class WorkerSpec < Minitest::Unit::TestCase
7
-
6
+ class WorkerSpec < Minitest::Test
7
+
8
8
  describe "Worker" do
9
9
 
10
10
  before :all do
@@ -12,27 +12,27 @@ class WorkerSpec < Minitest::Unit::TestCase
12
12
  end
13
13
 
14
14
  it "runs jobs" do
15
-
15
+
16
16
  manager = Minitest::Mock.new
17
17
  async = Minitest::Mock.new
18
- 100.times {async.expect(:work, nil, [Celluloid::ActorProxy])}
19
- 100.times {async.expect(:worker_done, nil, [Celluloid::ActorProxy])}
18
+ 100.times {async.expect(:work, nil, [DelayedJobCelluloid::Worker])}
19
+ 100.times {async.expect(:worker_done, nil, [DelayedJobCelluloid::Worker])}
20
20
  async.expect(:real_thread, async, [nil, Thread])
21
21
  100.times {manager.expect(:async, async, [])}
22
-
23
-
22
+
23
+
24
24
  worker = DelayedJobCelluloid::Worker.new({},manager)
25
25
  test = TestJob.new
26
26
  test.delay.test_this
27
-
27
+
28
28
  assert_equal 1, Delayed::Job.count
29
-
29
+
30
30
  worker.start
31
31
 
32
32
  assert_equal 0, Delayed::Job.count
33
33
  manager.verify
34
34
  async.verify
35
35
  end
36
-
36
+
37
37
  end
38
38
  end
metadata CHANGED
@@ -1,43 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: delayed_job_celluloid
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom Mooney
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-01 00:00:00.000000000 Z
11
+ date: 2014-12-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: delayed_job
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ! '>='
17
+ - - '>='
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: 4.0.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ! '>='
24
+ - - '>='
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: 4.0.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: celluloid
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ! '>='
31
+ - - '>='
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: 0.16.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ! '>='
38
+ - - '>='
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: 0.16.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -56,44 +56,72 @@ dependencies:
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ! '>='
59
+ - - '>='
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ! '>='
66
+ - - '>='
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: sqlite3
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ! '>='
73
+ - - '>='
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ! '>='
80
+ - - '>='
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: delayed_job_active_record
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ! '>='
87
+ - - '>='
88
88
  - !ruby/object:Gem::Version
89
- version: '0'
89
+ version: 4.0.0
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ! '>='
94
+ - - '>='
95
95
  - !ruby/object:Gem::Version
96
- version: '0'
96
+ version: 4.0.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: rails
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: 4.1.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: 4.1.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: minitest
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: 5.5.0
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ~>
123
+ - !ruby/object:Gem::Version
124
+ version: 5.5.0
97
125
  description: run delayed_job workers in multiple threads within a single process
98
126
  email:
99
127
  - tmooney3979@gmail.com
@@ -115,7 +143,7 @@ files:
115
143
  - lib/delayed_job_celluloid/worker.rb
116
144
  - lib/generators/delayed_job_celluloid/delayed_job_celluloid_generator.rb
117
145
  - lib/generators/delayed_job_celluloid/templates/script
118
- - spec/command_test.rb
146
+ - spec/command_spec.rb
119
147
  - spec/database.yml
120
148
  - spec/launcher_spec.rb
121
149
  - spec/manager_spec.rb
@@ -132,22 +160,22 @@ require_paths:
132
160
  - lib
133
161
  required_ruby_version: !ruby/object:Gem::Requirement
134
162
  requirements:
135
- - - ! '>='
163
+ - - '>='
136
164
  - !ruby/object:Gem::Version
137
165
  version: '0'
138
166
  required_rubygems_version: !ruby/object:Gem::Requirement
139
167
  requirements:
140
- - - ! '>='
168
+ - - '>='
141
169
  - !ruby/object:Gem::Version
142
170
  version: '0'
143
171
  requirements: []
144
172
  rubyforge_project:
145
- rubygems_version: 2.0.7
173
+ rubygems_version: 2.1.11
146
174
  signing_key:
147
175
  specification_version: 4
148
176
  summary: multi-threaded delayed_job workers!
149
177
  test_files:
150
- - spec/command_test.rb
178
+ - spec/command_spec.rb
151
179
  - spec/database.yml
152
180
  - spec/launcher_spec.rb
153
181
  - spec/manager_spec.rb