delayed_job_worker_pool 0.2.3 → 0.3.0

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
- 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: []