delayed_job_worker_pool 0.2.3 → 0.3.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 5362295af9ff9d234c765db50ef5dcca61860a46
4
- data.tar.gz: 2d52dedb34e37b67b6b6f657fed1486d5c947a34
2
+ SHA256:
3
+ metadata.gz: a0273d86b923b9ab445381d365eb26bce6253433bee7a8a8ad8882846ab5626f
4
+ data.tar.gz: 8b0db9639c8d1107f4eda74accc59253b9e2e55ffdcbbae167324a895d6c7bc9
5
5
  SHA512:
6
- metadata.gz: 4e6c3adc13c569361d3d7429feb906bd7541b25c3ac9bbc7c14bcfef24e6d6aa4cb113e08d9adb3b6a87f4b8ce1effb87b77d518d2266879350daec9991b3f52
7
- data.tar.gz: 2aeab7eab4986cccae2f8710230f6c4e534026dface6d77d0c307cd2a4aa57043a02e9dd03ff8caecfe84ba6e34b17802a4eed405b8a3967f565de87608cfe55
6
+ metadata.gz: ed7f9139bdaebf583aa2bae0420f253a88c759d2bda97b4cfd88c5f11f77ec08361f9ddb866ad32bc66569848d8ba41b5629531b2a02e123a60eec86fbbd3435
7
+ data.tar.gz: e0974480bd81a01d60e48ac5db9a2f4cc29d6ad62b0c8af9e426b2c4da28fc950b8e408aa9f20a948c7eb2fb9130e5d2db13a9b0a8f6c27a1e85314091f4ab83
@@ -0,0 +1,8 @@
1
+ inherit_gem:
2
+ salsify_rubocop: conf/rubocop.yml
3
+
4
+ AllCops:
5
+ TargetRubyVersion: 2.5
6
+ Exclude:
7
+ - 'vendor/**/*'
8
+ - 'gemfiles/vendor/**/*'
@@ -1,6 +1,11 @@
1
1
  language: ruby
2
+ cache: bundler
3
+ sudo: false
2
4
  rvm:
3
- - 2.2.3
4
- - 2.1.7
5
- - 2.0.0-p647
6
- before_install: gem install bundler -v 1.10.6
5
+ - 2.7.1
6
+ - 2.6.6
7
+ - 2.5.8
8
+ before_install: gem install bundler -v '~> 2.1'
9
+ script:
10
+ - bundle exec rspec
11
+ - bundle exec rubocop
@@ -1,6 +1,12 @@
1
1
  # Changelog
2
2
 
3
- ### 0.2.3 (unreleased)
3
+ ### 0.3.0
4
+ * Require Ruby 2.5 or higher.
5
+ * Support for running multiple worker pools on a single node.
6
+ See [#7](https://github.com/salsify/delayed_job_worker_pool/pull/7) for details.
7
+ Thanks to Severin Räz!
8
+
9
+ ### 0.2.3
4
10
  * Explicitly require 'fcntl' to fix uninitialized constant IO::Fcntl. Thanks to Stefan Wrobel!
5
11
 
6
12
  ### 0.2.2
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  gemspec
data/README.md CHANGED
@@ -41,9 +41,11 @@ delayed_job_worker_pool
41
41
  The config file is a Ruby DSL inspired by the [Puma](https://github.com/puma/puma) configuration DSL. Here's an example:
42
42
 
43
43
  ```ruby
44
- workers Integer(ENV['NUM_WORKERS'] || 1)
45
- queues (ENV['QUEUES'] || ENV['QUEUE'] || '').split(',')
46
- sleep_delay ENV['WORKER_SLEEP_DELAY']
44
+ worker_group do |g|
45
+ g.workers = Integer(ENV['NUM_WORKERS'] || 1)
46
+ g.queues = (ENV['QUEUES'] || ENV['QUEUE'] || '').split(',')
47
+ g.sleep_delay = ENV['WORKER_SLEEP_DELAY']
48
+ end
47
49
 
48
50
  preload_app
49
51
 
@@ -77,10 +79,26 @@ after_worker_shutdown do |worker_info|
77
79
  end
78
80
  ```
79
81
 
82
+ You can configure multiple worker groups, i.e.:
83
+
84
+ ```
85
+ worker_group(:default) do |g|
86
+ g.workers = 1
87
+ g.queues = ['default']
88
+ end
89
+
90
+ worker_group(:mails) do |g|
91
+ g.workers = 1
92
+ g.queues = ['mail]
93
+ end
94
+
95
+ ```
96
+
80
97
  Here's more information on each setting:
81
98
 
82
- * `workers` - The number of Delayed Job worker processes to fork. The master process will relaunch workers that fail.
83
- * Delayed Job worker settings (`queues`, `min_priority`, `max_priority`, `sleep_delay`, `read_ahead`) - These are passed through to the Delayed Job worker.
99
+ * `worker_group` - You need at least one worker group. Group settings can be set as illustrated above. Worker group settings:
100
+ * `workers` - The number of Delayed Job worker processes to fork. The master process will relaunch workers that fail.
101
+ * Delayed Job worker settings (`queues`, `min_priority`, `max_priority`, `sleep_delay`, `read_ahead`) - These are passed through to the Delayed Job worker.
84
102
  * `preload_app` - This forces the master process to load Rails before forking worker processes causing the memory consumed by the code to be shared between workers. **If you use this setting make sure you re-establish any necessary connections in the on_worker_boot callback.**
85
103
  * `after_preload_app` - A callback that runs in the master process after preloading the app but before forking any workers.
86
104
  * `on_worker_boot` - A callback that runs in the worker process after it has been forked.
@@ -89,11 +107,15 @@ Here's more information on each setting:
89
107
 
90
108
  All settings are optional and nil values are ignored.
91
109
 
110
+ ## Upgrading from v0.2.x
111
+
112
+ * Convert your worker settings to a single worker group (see _Usage_)
113
+ * Please note the delayed job worker names changed to include ` group: <group_name>`, e.g. if you are monitoring them by their name
114
+
92
115
  ## Contributing
93
116
 
94
117
  Bug reports and pull requests are welcome on GitHub at https://github.com/salsify/delayed_job_worker_pool.
95
118
 
96
-
97
119
  ## License
98
120
 
99
121
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bundler/gem_tasks'
2
4
  require 'rspec/core/rake_task'
3
5
 
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  unless ARGV.size == 1
4
5
  puts "usage: #{File.basename(__FILE__)} <config>"
@@ -1,5 +1,6 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require 'delayed_job_worker_pool/version'
5
6
 
@@ -17,14 +18,16 @@ Gem::Specification.new do |spec|
17
18
  spec.executables = ['delayed_job_worker_pool']
18
19
  spec.require_paths = ['lib']
19
20
 
20
- spec.required_ruby_version = '>= 2.0'
21
+ spec.required_ruby_version = '>= 2.5'
21
22
 
22
23
  spec.add_dependency 'delayed_job', ['>= 3.0', '< 4.2']
23
24
 
25
+ spec.add_development_dependency 'bundler', '~> 2.1'
24
26
  spec.add_development_dependency 'delayed_job_active_record'
25
- spec.add_development_dependency 'bundler', '~> 1.10'
27
+ spec.add_development_dependency 'rails', '>= 4.2', '< 6'
26
28
  spec.add_development_dependency 'rake', '~> 10.0'
27
29
  spec.add_development_dependency 'rspec', '>= 3.3'
30
+ spec.add_development_dependency 'salsify_rubocop', '0.85.0'
31
+ spec.add_development_dependency 'sprockets', '< 4'
28
32
  spec.add_development_dependency 'sqlite3', '>= 1.3'
29
- spec.add_development_dependency 'rails', '>= 4.2'
30
33
  end
@@ -1,6 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'delayed_job_worker_pool/application'
2
4
  require 'delayed_job_worker_pool/dsl'
5
+ require 'delayed_job_worker_pool/registry'
3
6
  require 'delayed_job_worker_pool/worker'
4
7
  require 'delayed_job_worker_pool/worker_info'
5
8
  require 'delayed_job_worker_pool/worker_pool'
9
+ require 'delayed_job_worker_pool/worker_group_options'
6
10
  require 'delayed_job_worker_pool/version'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DelayedJobWorkerPool
2
4
  module Application
3
5
  extend self
@@ -6,7 +8,7 @@ module DelayedJobWorkerPool
6
8
  require(base_application_filename)
7
9
  rescue LoadError
8
10
  raise "Could not find Rails initialization file #{full_application_filename}. " \
9
- "Make sure delayed_job_worker_pool is run from the Rails root directory."
11
+ 'Make sure delayed_job_worker_pool is run from the Rails root directory.'
10
12
  end
11
13
 
12
14
  private
@@ -1,29 +1,47 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DelayedJobWorkerPool
2
4
  class DSL
3
- SIMPLE_SETTINGS = [:workers, :queues, :min_priority, :max_priority, :sleep_delay, :read_ahead].freeze
5
+ class NoWorkerGroupsDefined < StandardError; end
6
+ class NonUniqueGroupName < StandardError; end
7
+
4
8
  CALLBACK_SETTINGS = [:after_preload_app, :on_worker_boot, :after_worker_boot, :after_worker_shutdown].freeze
9
+ DEFAULT_WORKER_GROUP_NAME = :default
5
10
 
6
11
  def self.load(path)
7
12
  options = {}
8
13
 
9
14
  dsl = new(options)
10
15
  dsl.instance_eval(File.read(path), path, 1)
16
+ dsl.assert_groups_defined!
11
17
 
12
18
  options
13
19
  end
14
20
 
15
21
  def initialize(options)
16
22
  @options = options
23
+ @options[:worker_groups] ||= {}
24
+ end
25
+
26
+ def preload_app(preload = true)
27
+ @options[:preload_app] = preload
17
28
  end
18
29
 
19
- SIMPLE_SETTINGS.each do |option_name|
20
- define_method(option_name) do |option_value|
21
- @options[option_name] = option_value unless option_value.nil?
30
+ def worker_group(name = DEFAULT_WORKER_GROUP_NAME)
31
+ name_sym = name.to_sym
32
+ if @options[:worker_groups].key?(name_sym)
33
+ raise NonUniqueGroupName.new("Worker group name #{name_sym} is already in use")
22
34
  end
35
+
36
+ group_options = WorkerGroupOptions.new
37
+ yield(group_options)
38
+ @options[:worker_groups][name_sym] = group_options
23
39
  end
24
40
 
25
- def preload_app(preload_app = true)
26
- @options[:preload_app] = preload_app
41
+ def assert_groups_defined!
42
+ return unless @options[:worker_groups].empty?
43
+
44
+ raise NoWorkerGroupsDefined.new('No worker groups defined. Define groups using `worker_group`.')
27
45
  end
28
46
 
29
47
  CALLBACK_SETTINGS.each do |option_name|
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DelayedJobWorkerPool
4
+ # Keeps track of worker groups and their workers.
5
+ class Registry
6
+ class GroupAlreadyExists < StandardError; end
7
+ class GroupDoesNotExist < StandardError; end
8
+ class GroupNotFound < StandardError; end
9
+
10
+ def initialize
11
+ @groups = {}
12
+ end
13
+
14
+ def include_worker?(pid)
15
+ worker_pids.include?(pid)
16
+ end
17
+
18
+ def workers?
19
+ !worker_pids.empty?
20
+ end
21
+
22
+ def add_group(name, options)
23
+ raise GroupAlreadyExists.new("Group #{group} already exists") if @groups.key?(name)
24
+
25
+ @groups[name] = {
26
+ options: options,
27
+ pids: []
28
+ }
29
+ end
30
+
31
+ def add_worker(group_name, pid)
32
+ group_by_name(group_name)[:pids] << pid
33
+ end
34
+
35
+ def remove_worker(pid)
36
+ @groups[group(pid)][:pids].delete(pid)
37
+ end
38
+
39
+ def options(group_name)
40
+ group_by_name(group_name)[:options]
41
+ end
42
+
43
+ def worker_pids
44
+ @groups.values.flat_map { |v| v[:pids] }
45
+ end
46
+
47
+ def group(pid)
48
+ @groups.each do |name, group|
49
+ return name if group[:pids].include?(pid)
50
+ end
51
+ raise GroupNotFound.new("No group found for PID #{pid}")
52
+ end
53
+
54
+ private
55
+
56
+ def group_by_name(name)
57
+ match = @groups[name]
58
+ return match unless match.nil?
59
+
60
+ raise GroupDoesNotExist.new("No group with name #{name.inspect} found")
61
+ end
62
+ end
63
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DelayedJobWorkerPool
2
- VERSION = '0.2.3'.freeze
4
+ VERSION = '0.3.0'
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DelayedJobWorkerPool
2
4
  module Worker
3
5
  extend self
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DelayedJobWorkerPool
4
+ class WorkerGroupOptions
5
+ DJ_SETTINGS = [:queues, :min_priority, :max_priority, :sleep_delay, :read_ahead].freeze
6
+ GROUP_SETTINGS = [:workers].freeze
7
+
8
+ attr_accessor *DJ_SETTINGS, *GROUP_SETTINGS
9
+
10
+ # @return an options hash for `Delayed::Worker`
11
+ def dj_worker_options
12
+ DJ_SETTINGS.each_with_object({}) do |setting, memo|
13
+ memo[setting] = send(setting)
14
+ end.compact
15
+ end
16
+ end
17
+ end
@@ -1,11 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DelayedJobWorkerPool
2
4
  class WorkerInfo
3
- attr_reader :process_id, :name
5
+ attr_reader :process_id, :name, :worker_group
4
6
 
5
7
  def initialize(attributes)
6
8
  @process_id = attributes.fetch(:process_id)
7
9
  @name = attributes.fetch(:name)
10
+ @worker_group = attributes.fetch(:worker_group)
8
11
  end
9
-
10
12
  end
11
13
  end
@@ -1,12 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'fcntl'
4
+ require 'socket'
2
5
 
3
6
  module DelayedJobWorkerPool
4
7
  class WorkerPool
8
+
5
9
  SIGNALS = ['TERM', 'INT'].map(&:freeze).freeze
10
+ DEFAULT_WORKER_COUNT = 1
6
11
 
7
12
  def initialize(options = {})
8
13
  @options = options
9
- @worker_pids = []
14
+ @registry = Registry.new
10
15
  @pending_signals = []
11
16
  @pending_signal_read_pipe, @pending_signal_write_pipe = create_pipe(inheritable: false)
12
17
  @master_alive_read_pipe, @master_alive_write_pipe = create_pipe(inheritable: true)
@@ -25,7 +30,7 @@ module DelayedJobWorkerPool
25
30
 
26
31
  log_uninheritable_threads
27
32
 
28
- num_workers.times { fork_worker }
33
+ fork_workers
29
34
 
30
35
  monitor_workers
31
36
 
@@ -37,7 +42,7 @@ module DelayedJobWorkerPool
37
42
 
38
43
  private
39
44
 
40
- attr_reader :options, :worker_pids, :master_alive_read_pipe, :master_alive_write_pipe,
45
+ attr_reader :options, :registry, :master_alive_read_pipe, :master_alive_write_pipe,
41
46
  :pending_signals, :pending_signal_read_pipe, :pending_signal_write_pipe
42
47
  attr_accessor :shutting_down
43
48
 
@@ -59,8 +64,10 @@ module DelayedJobWorkerPool
59
64
  def log_uninheritable_threads
60
65
  Thread.list.each do |t|
61
66
  next if t == Thread.current
67
+
62
68
  if t.respond_to?(:backtrace)
63
- log("WARNING: Thread will not be inherited by workers: #{t.inspect} - #{t.backtrace ? t.backtrace.first : ''}")
69
+ log("WARNING: Thread will not be inherited by workers: #{t.inspect} - " \
70
+ "#{t.backtrace ? t.backtrace.first : ''}")
64
71
  else
65
72
  log("WARNING: Thread will not be inherited by workers: #{t.inspect}")
66
73
  end
@@ -74,15 +81,16 @@ module DelayedJobWorkerPool
74
81
  def shutdown(signal)
75
82
  log("Shutting down master #{Process.pid} with signal #{signal}")
76
83
  self.shutting_down = true
77
- worker_pids.each do |child_pid|
78
- log("Telling worker #{child_pid} to shutdown with signal #{signal}")
84
+ registry.worker_pids.each do |child_pid|
85
+ group = registry.group(child_pid)
86
+ log("Telling worker #{child_pid} from group #{group} to shutdown with signal #{signal}")
79
87
  Process.kill(signal, child_pid)
80
88
  end
81
89
  end
82
90
 
83
91
  def monitor_workers
84
- while has_workers?
85
- if has_pending_signal?
92
+ while workers?
93
+ if pending_signal?
86
94
  shutdown(pending_signals.pop)
87
95
  elsif (wait_result = Process.wait2(-1, Process::WNOHANG))
88
96
  handle_dead_worker(wait_result.first, wait_result.last)
@@ -93,19 +101,22 @@ module DelayedJobWorkerPool
93
101
  end
94
102
 
95
103
  def handle_dead_worker(worker_pid, status)
96
- return unless worker_pids.include?(worker_pid)
104
+ return unless registry.include_worker?(worker_pid)
97
105
 
98
106
  log("Worker #{worker_pid} exited with status #{status.to_i}")
99
- worker_pids.delete(worker_pid)
100
- invoke_callback(:after_worker_shutdown, worker_info(worker_pid))
101
- fork_worker unless shutting_down
107
+
108
+ group = registry.group(worker_pid)
109
+ invoke_callback(:after_worker_shutdown, worker_info(worker_pid, group))
110
+
111
+ registry.remove_worker(worker_pid)
112
+ fork_worker(group) unless shutting_down
102
113
  end
103
114
 
104
- def has_workers?
105
- !worker_pids.empty?
115
+ def workers?
116
+ registry.workers?
106
117
  end
107
118
 
108
- def has_pending_signal?
119
+ def pending_signal?
109
120
  !pending_signals.empty?
110
121
  end
111
122
 
@@ -113,14 +124,26 @@ module DelayedJobWorkerPool
113
124
  options[callback_name].call(*args) if options[callback_name]
114
125
  end
115
126
 
116
- def fork_worker
117
- worker_pid = Kernel.fork { run_worker }
118
- worker_pids << worker_pid
119
- log("Started worker #{worker_pid}")
120
- invoke_callback(:after_worker_boot, worker_info(worker_pid))
127
+ def fork_workers
128
+ options.fetch(:worker_groups).each do |name, group|
129
+ workers = group.workers || DEFAULT_WORKER_COUNT
130
+
131
+ registry.add_group(name, group.dj_worker_options)
132
+
133
+ workers.times { fork_worker(name) }
134
+ end
121
135
  end
122
136
 
123
- def run_worker
137
+ def fork_worker(group)
138
+ worker_pid = Kernel.fork { run_worker(group) }
139
+ log("Started worker in group #{group}: #{worker_pid}")
140
+
141
+ registry.add_worker(group, worker_pid)
142
+
143
+ invoke_callback(:after_worker_boot, worker_info(worker_pid, group))
144
+ end
145
+
146
+ def run_worker(group)
124
147
  master_alive_write_pipe.close
125
148
 
126
149
  uninstall_signal_handlers
@@ -133,32 +156,32 @@ module DelayedJobWorkerPool
133
156
 
134
157
  load_app unless preload_app?
135
158
 
136
- invoke_callback(:on_worker_boot, worker_info(Process.pid))
159
+ invoke_callback(:on_worker_boot, worker_info(Process.pid, group))
137
160
 
138
- DelayedJobWorkerPool::Worker.run(worker_options(Process.pid))
139
- rescue => e
161
+ DelayedJobWorkerPool::Worker.run(worker_options(Process.pid, group))
162
+ rescue StandardError => e
140
163
  log("Worker failed with error: #{e.message}\n#{e.backtrace.join("\n")}")
141
164
  exit(1)
142
165
  end
143
166
 
144
- def worker_info(worker_pid)
145
- DelayedJobWorkerPool::WorkerInfo.new(name: worker_name(worker_pid), process_id: worker_pid)
167
+ def worker_info(worker_pid, group)
168
+ DelayedJobWorkerPool::WorkerInfo.new(
169
+ name: worker_name(worker_pid, group),
170
+ process_id: worker_pid,
171
+ worker_group: group
172
+ )
146
173
  end
147
174
 
148
- def worker_name(worker_pid)
149
- "host:#{Socket.gethostname} pid:#{worker_pid}"
150
- end
151
-
152
- def num_workers
153
- options.fetch(:workers, 1)
175
+ def worker_name(worker_pid, group)
176
+ "host:#{Socket.gethostname} pid:#{worker_pid} group:#{group}"
154
177
  end
155
178
 
156
179
  def preload_app?
157
180
  options.fetch(:preload_app, false)
158
181
  end
159
182
 
160
- def worker_options(worker_pid)
161
- options.except(:workers, :preload_app, *DelayedJobWorkerPool::DSL::CALLBACK_SETTINGS).merge(name: worker_name(worker_pid))
183
+ def worker_options(worker_pid, group)
184
+ registry.options(group).merge(name: worker_name(worker_pid, group))
162
185
  end
163
186
 
164
187
  def create_pipe(inheritable: true)
@@ -175,9 +198,7 @@ module DelayedJobWorkerPool
175
198
  end
176
199
 
177
200
  def wait_for_signal(timeout)
178
- if IO.select([pending_signal_read_pipe], [], [], timeout)
179
- drain_pipe(pending_signal_read_pipe)
180
- end
201
+ drain_pipe(pending_signal_read_pipe) if IO.select([pending_signal_read_pipe], [], [], timeout)
181
202
  end
182
203
 
183
204
  def drain_pipe(pipe)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: delayed_job_worker_pool
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joel Turkel
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-09 00:00:00.000000000 Z
11
+ date: 2020-06-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: delayed_job
@@ -30,6 +30,20 @@ dependencies:
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
32
  version: '4.2'
33
+ - !ruby/object:Gem::Dependency
34
+ name: bundler
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '2.1'
40
+ type: :development
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '2.1'
33
47
  - !ruby/object:Gem::Dependency
34
48
  name: delayed_job_active_record
35
49
  requirement: !ruby/object:Gem::Requirement
@@ -45,19 +59,25 @@ dependencies:
45
59
  - !ruby/object:Gem::Version
46
60
  version: '0'
47
61
  - !ruby/object:Gem::Dependency
48
- name: bundler
62
+ name: rails
49
63
  requirement: !ruby/object:Gem::Requirement
50
64
  requirements:
51
- - - "~>"
65
+ - - ">="
52
66
  - !ruby/object:Gem::Version
53
- version: '1.10'
67
+ version: '4.2'
68
+ - - "<"
69
+ - !ruby/object:Gem::Version
70
+ version: '6'
54
71
  type: :development
55
72
  prerelease: false
56
73
  version_requirements: !ruby/object:Gem::Requirement
57
74
  requirements:
58
- - - "~>"
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: '4.2'
78
+ - - "<"
59
79
  - !ruby/object:Gem::Version
60
- version: '1.10'
80
+ version: '6'
61
81
  - !ruby/object:Gem::Dependency
62
82
  name: rake
63
83
  requirement: !ruby/object:Gem::Requirement
@@ -87,34 +107,48 @@ dependencies:
87
107
  - !ruby/object:Gem::Version
88
108
  version: '3.3'
89
109
  - !ruby/object:Gem::Dependency
90
- name: sqlite3
110
+ name: salsify_rubocop
91
111
  requirement: !ruby/object:Gem::Requirement
92
112
  requirements:
93
- - - ">="
113
+ - - '='
94
114
  - !ruby/object:Gem::Version
95
- version: '1.3'
115
+ version: 0.85.0
96
116
  type: :development
97
117
  prerelease: false
98
118
  version_requirements: !ruby/object:Gem::Requirement
99
119
  requirements:
100
- - - ">="
120
+ - - '='
101
121
  - !ruby/object:Gem::Version
102
- version: '1.3'
122
+ version: 0.85.0
103
123
  - !ruby/object:Gem::Dependency
104
- name: rails
124
+ name: sprockets
125
+ requirement: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - "<"
128
+ - !ruby/object:Gem::Version
129
+ version: '4'
130
+ type: :development
131
+ prerelease: false
132
+ version_requirements: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - "<"
135
+ - !ruby/object:Gem::Version
136
+ version: '4'
137
+ - !ruby/object:Gem::Dependency
138
+ name: sqlite3
105
139
  requirement: !ruby/object:Gem::Requirement
106
140
  requirements:
107
141
  - - ">="
108
142
  - !ruby/object:Gem::Version
109
- version: '4.2'
143
+ version: '1.3'
110
144
  type: :development
111
145
  prerelease: false
112
146
  version_requirements: !ruby/object:Gem::Requirement
113
147
  requirements:
114
148
  - - ">="
115
149
  - !ruby/object:Gem::Version
116
- version: '4.2'
117
- description:
150
+ version: '1.3'
151
+ description:
118
152
  email:
119
153
  - jturkel@salsify.com
120
154
  executables:
@@ -123,6 +157,7 @@ extensions: []
123
157
  extra_rdoc_files: []
124
158
  files:
125
159
  - ".gitignore"
160
+ - ".rubocop.yml"
126
161
  - ".travis.yml"
127
162
  - CHANGELOG.md
128
163
  - Gemfile
@@ -134,15 +169,17 @@ files:
134
169
  - lib/delayed_job_worker_pool.rb
135
170
  - lib/delayed_job_worker_pool/application.rb
136
171
  - lib/delayed_job_worker_pool/dsl.rb
172
+ - lib/delayed_job_worker_pool/registry.rb
137
173
  - lib/delayed_job_worker_pool/version.rb
138
174
  - lib/delayed_job_worker_pool/worker.rb
175
+ - lib/delayed_job_worker_pool/worker_group_options.rb
139
176
  - lib/delayed_job_worker_pool/worker_info.rb
140
177
  - lib/delayed_job_worker_pool/worker_pool.rb
141
178
  homepage: https://github.com/salsify/delayed_job_worker_pool
142
179
  licenses:
143
180
  - MIT
144
181
  metadata: {}
145
- post_install_message:
182
+ post_install_message:
146
183
  rdoc_options: []
147
184
  require_paths:
148
185
  - lib
@@ -150,16 +187,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
150
187
  requirements:
151
188
  - - ">="
152
189
  - !ruby/object:Gem::Version
153
- version: '2.0'
190
+ version: '2.5'
154
191
  required_rubygems_version: !ruby/object:Gem::Requirement
155
192
  requirements:
156
193
  - - ">="
157
194
  - !ruby/object:Gem::Version
158
195
  version: '0'
159
196
  requirements: []
160
- rubyforge_project:
161
- rubygems_version: 2.4.7
162
- signing_key:
197
+ rubygems_version: 3.0.8
198
+ signing_key:
163
199
  specification_version: 4
164
200
  summary: Worker process pooling for Delayed Job
165
201
  test_files: []