workhorse 1.2.17.rc1 → 1.2.17

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
2
  SHA256:
3
- metadata.gz: 2bcfdbfa710579ee64f436236ed5c4214404a82211ae7471513ba141e7e03eaf
4
- data.tar.gz: 680b91c6bbdbc8473fdc454175bdf6a2f4b14a0831162ab02e92208914f69f7a
3
+ metadata.gz: 7c3223be9f4d677fa59d215519c9b96e933e5ab37f3ad96e904cd6dc91b59488
4
+ data.tar.gz: c30eaa0c15cd8785caf0aab8800de9c8838ff62d9192e1d8d9e8a386659322e1
5
5
  SHA512:
6
- metadata.gz: 29fe50d7eb989a0d51cdcbd23adb7d42ce56fccf553448c7baf112bae2dd678a81613d593637fe6f168ff3620d9b31048abcdd0f8674b4db2244a59a82865779
7
- data.tar.gz: '094cb3bb85f2be4bd2575f6441e2abc6ef17d522796c586dca69f864031fde2b0095bc8ce2c3d8bee6507ab799297fd8e79c86fbbadd28467495a39cc7031694'
6
+ metadata.gz: 9d79e67c853bf5b258ccc2d334de5c746c046b6fca063907cdc3e0a8693e641d12cbefb3ce408f69f697dd1b8f7b0ee4e6ccfcd98ed4b86210786ee53bf23e01
7
+ data.tar.gz: eca0f05a85ed9a9afaeb0d146b8243b02c3d8bd5cf1229488eacae4437494df1554ce7c2f0cf2f97118b8024d2698d6d054aef3039ab19a253497e4a6caab54f
@@ -12,7 +12,13 @@ jobs:
12
12
  strategy:
13
13
  fail-fast: false
14
14
  matrix:
15
- ruby-version: ['2.5.1', '2.6.2', '2.7.1', '3.0.1']
15
+ ruby-version:
16
+ - '2.5.1'
17
+ - '2.6.2'
18
+ - '2.7.1'
19
+ - '3.0.1'
20
+ - '3.1.2'
21
+ - '3.2.1'
16
22
  env:
17
23
  DB_DATABASE: workhorse
18
24
  DB_USER: root
@@ -20,22 +26,32 @@ jobs:
20
26
  DB_HOST: localhost
21
27
 
22
28
  steps:
23
- - uses: actions/checkout@v2
24
- - name: Set up Ruby
25
- uses: ruby/setup-ruby@v1
26
- with:
27
- ruby-version: ${{ matrix.ruby-version }}
28
- bundler-cache: true
29
- - name: Startup database
30
- run: |
31
- sudo /etc/init.d/mysql start
32
- mysql -u${{ env.DB_USER }} -p${{ env.DB_PASSWORD }} -e 'CREATE DATABASE ${{ env.DB_DATABASE }};'
33
- - name: Run rake tests
34
- uses: nick-fields/retry@v2
35
- with:
36
- timeout_seconds: 120
37
- retry_on: error
38
- max_attempts: 3
39
- command: bundle exec rake test TESTOPTS='--verbose'
40
- - name: Run rubocop
41
- run: bundle exec rubocop
29
+ - uses: actions/checkout@v2
30
+ - name: Set up Ruby
31
+ uses: ruby/setup-ruby@v1
32
+ with:
33
+ ruby-version: ${{ matrix.ruby-version }}
34
+ bundler-cache: true
35
+ - name: Startup database
36
+ run: |
37
+ sudo /etc/init.d/mysql start
38
+ mysql -u${{ env.DB_USER }} -p${{ env.DB_PASSWORD }} -e 'CREATE DATABASE ${{ env.DB_DATABASE }};'
39
+ - name: Run rake tests
40
+ uses: nick-fields/retry@v2
41
+ with:
42
+ timeout_seconds: 120
43
+ retry_on: error
44
+ max_attempts: 3
45
+ command: bundle exec rake test TESTOPTS='--verbose'
46
+
47
+ linters:
48
+ runs-on: ubuntu-latest
49
+ steps:
50
+ - uses: actions/checkout@v2
51
+ - name: Set up Ruby
52
+ uses: ruby/setup-ruby@v1
53
+ with:
54
+ ruby-version: 2.5.1
55
+ bundler-cache: true
56
+ - name: Run rubocop
57
+ run: bundle exec rubocop
data/CHANGELOG.md CHANGED
@@ -1,6 +1,18 @@
1
1
  # Workhorse Changelog
2
2
 
3
- ## 1.2.17.rc1 - 2024-02-05
3
+ ## 1.2.17 - 2024-02-21
4
+
5
+ * Stable release based on previous RC releases.
6
+
7
+ ## 1.2.17.rc2 - 2024-02-08
8
+
9
+ * Remove unnecessary output from `watch` command in certain cases.
10
+
11
+ Sitrox reference: #121312.
12
+
13
+ * Fix, improve and extend automated tests.
14
+
15
+ ## 1.2.17.rc1 - 2024-02-08
4
16
 
5
17
  * Revamp memory handling:
6
18
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.2.17.rc1
1
+ 1.2.17
@@ -45,11 +45,14 @@ module Workhorse
45
45
  def start(quiet: false)
46
46
  code = 0
47
47
 
48
+ # Holds messages in format [[<message>, <severity>]]
49
+ messages = []
50
+
48
51
  for_each_worker do |worker|
49
52
  pid_file, pid, active = read_pid(worker)
50
53
 
51
54
  if pid_file && pid && active
52
- warn "Worker ##{worker.id} (#{worker.name}): Already started (PID #{pid})" unless quiet
55
+ messages << ["Worker ##{worker.id} (#{worker.name}): Already started (PID #{pid})", 2] unless quiet
53
56
  code = 2
54
57
  elsif pid_file
55
58
  File.delete pid_file
@@ -57,32 +60,41 @@ module Workhorse
57
60
  shutdown_file = pid ? Workhorse::Worker.shutdown_file_for(pid) : nil
58
61
  shutdown_file = nil if shutdown_file && !File.exist?(shutdown_file)
59
62
 
60
- puts "Worker ##{worker.id} (#{worker.name}): Starting (stale pid file)" unless quiet || shutdown_file
63
+ messages << ["Worker ##{worker.id} (#{worker.name}): Starting (stale pid file)", 1] unless quiet || shutdown_file
61
64
  start_worker worker
62
65
  FileUtils.rm(shutdown_file) if shutdown_file
63
66
  else
64
- warn "Worker ##{worker.id} (#{worker.name}): Starting" unless quiet
67
+ messages << ["Worker ##{worker.id} (#{worker.name}): Starting", 1] unless quiet
65
68
  start_worker worker
66
69
  end
67
70
  end
68
71
 
72
+ if messages.any?
73
+ min = messages.min_by(&:last)[1]
74
+
75
+ # Only print messages if there is at least one message with severity 1
76
+ if min == 1
77
+ messages.each { |(message, _severity)| warn message }
78
+ end
79
+ end
80
+
69
81
  return code
70
82
  end
71
83
 
72
- def stop(kill = false)
84
+ def stop(kill = false, quiet: false)
73
85
  code = 0
74
86
 
75
87
  for_each_worker do |worker|
76
88
  pid_file, pid, active = read_pid(worker)
77
89
 
78
90
  if pid_file && pid && active
79
- puts "Worker (#{worker.name}) ##{worker.id}: Stopping"
91
+ puts "Worker (#{worker.name}) ##{worker.id}: Stopping" unless quiet
80
92
  stop_worker pid_file, pid, kill: kill
81
93
  elsif pid_file
82
94
  File.delete pid_file
83
- puts "Worker (#{worker.name}) ##{worker.id}: Already stopped (stale PID file)"
95
+ puts "Worker (#{worker.name}) ##{worker.id}: Already stopped (stale PID file)" unless quiet
84
96
  else
85
- warn "Worker (#{worker.name}) ##{worker.id}: Already stopped"
97
+ warn "Worker (#{worker.name}) ##{worker.id}: Already stopped" unless quiet
86
98
  code = 2
87
99
  end
88
100
  end
@@ -34,11 +34,35 @@ end
34
34
 
35
35
  class WorkhorseTest < ActiveSupport::TestCase
36
36
  def setup
37
+ remove_pids!
38
+ Workhorse.silence_watcher = true
37
39
  Workhorse::DbJob.delete_all
38
40
  end
39
41
 
40
42
  protected
41
43
 
44
+ attr_reader :daemon
45
+
46
+ def remove_pids!
47
+ Dir[Rails.root.join('tmp', 'pids', '*')].each do |file|
48
+ FileUtils.rm file
49
+ end
50
+ end
51
+
52
+ def kill(pid)
53
+ signals = %w[TERM INT]
54
+
55
+ loop do
56
+ begin
57
+ signals.each { |signal| Process.kill(signal, pid) }
58
+ rescue Errno::ESRCH
59
+ break
60
+ end
61
+
62
+ sleep 0.5
63
+ end
64
+ end
65
+
42
66
  def capture_log(level: :debug)
43
67
  io = StringIO.new
44
68
  logger = Logger.new(io, level: level)
@@ -74,17 +98,43 @@ class WorkhorseTest < ActiveSupport::TestCase
74
98
  end
75
99
  end
76
100
 
101
+ def with_daemon(workers = 1, &_block)
102
+ @daemon = Workhorse::Daemon.new(pidfile: 'tmp/pids/test%s.pid') do |d|
103
+ workers.times do |i|
104
+ d.worker "Test Worker #{i}" do
105
+ Workhorse::Worker.start_and_wait(
106
+ pool_size: 1,
107
+ polling_interval: 0.1
108
+ )
109
+ end
110
+ end
111
+ end
112
+ daemon.start(quiet: true)
113
+ yield @daemon
114
+ ensure
115
+ daemon.stop(quiet: true)
116
+ end
117
+
77
118
  def with_retries(max = 50, interval: 0.1, &_block)
78
119
  runs = 0
79
120
 
80
121
  loop do
81
122
  return yield
82
- rescue Minitest::Assertion => e
123
+ rescue Minitest::Assertion
83
124
  fail if runs > max
84
125
  sleep interval
85
126
  runs += 1
86
127
  end
87
128
  end
129
+
130
+ def capture_stderr
131
+ old = $stderr
132
+ $stderr = StringIO.new
133
+ yield
134
+ $stderr.string
135
+ ensure
136
+ $stderr = old
137
+ end
88
138
  end
89
139
 
90
140
  ActiveRecord::Base.establish_connection(
@@ -0,0 +1,95 @@
1
+ require 'test_helper'
2
+
3
+ class Workhorse::DaemonTest < WorkhorseTest
4
+ def setup
5
+ remove_pids!
6
+ end
7
+
8
+ def test_watch_all_ok
9
+ with_daemon 2 do
10
+ assert_watch_output
11
+ end
12
+ end
13
+
14
+ def test_watch_starting_stale_pid
15
+ with_daemon 2 do
16
+ # Kill first worker
17
+ Process.kill 'KILL', daemon.workers.first.pid
18
+
19
+ # Short sleep to let the `KILL` propagate
20
+ sleep 0.2
21
+
22
+ # Watch
23
+ assert_watch_output(
24
+ 'Worker #1 (Test Worker 0): Starting (stale pid file)',
25
+ "Worker #2 (Test Worker 1): Already started (PID #{daemon.workers.second.pid})"
26
+ )
27
+ end
28
+ end
29
+
30
+ def test_watch_starting_missing_pid
31
+ with_daemon 2 do
32
+ # Kill first worker
33
+ kill daemon.workers.first.pid
34
+ FileUtils.rm 'tmp/pids/test1.pid'
35
+
36
+ # Watch
37
+ assert_watch_output(
38
+ 'Worker #1 (Test Worker 0): Starting',
39
+ "Worker #2 (Test Worker 1): Already started (PID #{daemon.workers.second.pid})"
40
+ )
41
+ end
42
+ end
43
+
44
+ def test_watch_controlled_shutdown
45
+ with_daemon 2 do
46
+ # Kill first worker
47
+ kill daemon.workers.first.pid
48
+ FileUtils.touch "tmp/pids/workhorse.#{daemon.workers.first.pid}.shutdown"
49
+
50
+ # Watch
51
+ assert_watch_output
52
+ end
53
+
54
+ assert_not File.exist?("tmp/pids/workhorse.#{daemon.workers.first.pid}.shutdown")
55
+ end
56
+
57
+ def test_watch_mixed
58
+ # Worker 0: Kill, remove PID
59
+ # Worker 1: Kill, keep PID
60
+ # Worker 2: Keep
61
+ # Worker 3: Controlled shutdown
62
+ with_daemon 4 do
63
+ # Worker 0: Kill, remove PID
64
+ kill daemon.workers[0].pid
65
+ FileUtils.rm 'tmp/pids/test1.pid'
66
+
67
+ # Worker 1: Kill, keep PID
68
+ kill daemon.workers[1].pid
69
+
70
+ # Worker 3: Controlled shutdown
71
+ kill daemon.workers[3].pid
72
+ FileUtils.touch "tmp/pids/workhorse.#{daemon.workers.first.pid}.shutdown"
73
+
74
+ # Watch
75
+ assert_watch_output(
76
+ 'Worker #1 (Test Worker 0): Starting',
77
+ 'Worker #2 (Test Worker 1): Starting (stale pid file)',
78
+ "Worker #3 (Test Worker 2): Already started (PID #{daemon.workers[2].pid})",
79
+ 'Worker #4 (Test Worker 3): Starting (stale pid file)'
80
+ )
81
+ end
82
+
83
+ assert_not File.exist?("tmp/pids/workhorse.#{daemon.workers.first.pid}.shutdown")
84
+ end
85
+
86
+ private
87
+
88
+ def assert_watch_output(*expected_lines)
89
+ silence_watcher_was = Workhorse.silence_watcher
90
+ Workhorse.silence_watcher = false
91
+ assert_equal expected_lines, capture_stderr { daemon.watch }.lines.map(&:chomp)
92
+ ensure
93
+ Workhorse.silence_watcher = silence_watcher_was
94
+ end
95
+ end
@@ -182,31 +182,32 @@ class Workhorse::PollerTest < WorkhorseTest
182
182
  Workhorse::DbJob.delete_all
183
183
 
184
184
  Workhorse.clean_stuck_jobs = clean
185
- start_deamon
186
- Workhorse.enqueue BasicJob.new(sleep_time: 5)
187
- sleep 0.2
188
- kill_deamon_workers
189
-
190
- assert_equal 1, Workhorse::DbJob.count
191
-
192
- Workhorse::DbJob.first.update(
193
- state: 'locked',
194
- started_at: nil
195
- )
196
-
197
- Workhorse::Worker.new.poller.send(:clean_stuck_jobs!) if clean
198
-
199
- assert_equal 1, Workhorse::DbJob.count
200
-
201
- Workhorse::DbJob.first.tap do |job|
202
- if clean
203
- assert_equal 'waiting', job.state
204
- assert_nil job.locked_at
205
- assert_nil job.locked_by
206
- assert_nil job.started_at
207
- assert_nil job.last_error
208
- else
209
- assert_equal 'locked', job.state
185
+ with_daemon do
186
+ Workhorse.enqueue BasicJob.new(sleep_time: 5)
187
+ sleep 0.2
188
+ kill_deamon_workers
189
+
190
+ assert_equal 1, Workhorse::DbJob.count
191
+
192
+ Workhorse::DbJob.first.update(
193
+ state: 'locked',
194
+ started_at: nil
195
+ )
196
+
197
+ Workhorse::Worker.new.poller.send(:clean_stuck_jobs!) if clean
198
+
199
+ assert_equal 1, Workhorse::DbJob.count
200
+
201
+ Workhorse::DbJob.first.tap do |job|
202
+ if clean
203
+ assert_equal 'waiting', job.state
204
+ assert_nil job.locked_at
205
+ assert_nil job.locked_by
206
+ assert_nil job.started_at
207
+ assert_nil job.last_error
208
+ else
209
+ assert_equal 'locked', job.state
210
+ end
210
211
  end
211
212
  end
212
213
  ensure
@@ -219,25 +220,26 @@ class Workhorse::PollerTest < WorkhorseTest
219
220
  Workhorse::DbJob.delete_all
220
221
 
221
222
  Workhorse.clean_stuck_jobs = true
222
- start_deamon
223
- Workhorse.enqueue BasicJob.new(sleep_time: 5)
224
- sleep 0.2
225
- kill_deamon_workers
226
-
227
- assert_equal 1, Workhorse::DbJob.count
228
- assert_equal 'started', Workhorse::DbJob.first.state
229
-
230
- work 0.1 if clean
231
-
232
- assert_equal 1, Workhorse::DbJob.count
233
-
234
- Workhorse::DbJob.first.tap do |job|
235
- if clean
236
- assert_equal 'failed', job.state
237
- assert_match(/started by PID #{@daemon.workers.first.pid}/, job.last_error)
238
- assert_match(/on host #{Socket.gethostname}/, job.last_error)
239
- else
240
- assert_equal 'started', job.state
223
+ with_daemon do
224
+ Workhorse.enqueue BasicJob.new(sleep_time: 5)
225
+ sleep 0.2
226
+ kill_deamon_workers
227
+
228
+ assert_equal 1, Workhorse::DbJob.count
229
+ assert_equal 'started', Workhorse::DbJob.first.state
230
+
231
+ work 0.1 if clean
232
+
233
+ assert_equal 1, Workhorse::DbJob.count
234
+
235
+ Workhorse::DbJob.first.tap do |job|
236
+ if clean
237
+ assert_equal 'failed', job.state
238
+ assert_match(/started by PID #{daemon.workers.first.pid}/, job.last_error)
239
+ assert_match(/on host #{Socket.gethostname}/, job.last_error)
240
+ else
241
+ assert_equal 'started', job.state
242
+ end
241
243
  end
242
244
  end
243
245
  ensure
@@ -248,23 +250,11 @@ class Workhorse::PollerTest < WorkhorseTest
248
250
  private
249
251
 
250
252
  def kill_deamon_workers
251
- @daemon.workers.each do |worker|
253
+ daemon.workers.each do |worker|
252
254
  Process.kill 'KILL', worker.pid
253
255
  end
254
256
  end
255
257
 
256
- def start_deamon
257
- @daemon = Workhorse::Daemon.new(pidfile: 'tmp/pids/test%s.pid') do |d|
258
- d.worker 'Test Worker' do
259
- Workhorse::Worker.start_and_wait(
260
- pool_size: 1,
261
- polling_interval: 0.1
262
- )
263
- end
264
- end
265
- @daemon.start
266
- end
267
-
268
258
  def setup
269
259
  Workhorse::DbJob.delete_all
270
260
  end
@@ -181,70 +181,44 @@ class Workhorse::WorkerTest < WorkhorseTest
181
181
  end
182
182
 
183
183
  def test_controlled_shutdown
184
- remove_pids!
185
-
186
- Workhorse.max_worker_memory_mb = 50
184
+ Workhorse.max_worker_memory_mb = 100
185
+ with_daemon do
186
+ pid = with_retries do
187
+ pid = daemon.workers.first.pid
188
+ assert_process(pid)
189
+ pid
190
+ end
187
191
 
188
- daemon = start_daemon
192
+ 10.times do
193
+ Workhorse.enqueue BasicJob.new(sleep_time: 0.1)
189
194
 
190
- pid = with_retries do
191
- pid = daemon.workers.first.pid
192
- assert_process(pid)
193
- pid
194
- end
195
+ with_retries do
196
+ assert_equal 'succeeded', Workhorse::DbJob.first.state
197
+ Workhorse::DbJob.delete_all
198
+ end
199
+ end
195
200
 
196
- 10.times do
197
- Workhorse.enqueue BasicJob.new(sleep_time: 0.1)
201
+ Workhorse.enqueue MemHungryJob.new
198
202
 
199
203
  with_retries do
200
204
  assert_equal 'succeeded', Workhorse::DbJob.first.state
201
- Workhorse::DbJob.delete_all
202
- end
203
- end
204
-
205
- Workhorse.enqueue MemHungryJob.new
206
205
 
207
- with_retries do
208
- assert_equal 'succeeded', Workhorse::DbJob.first.state
209
-
210
- assert File.exist?("tmp/pids/workhorse.#{pid}.shutdown")
211
- assert_not_process pid
212
- end
206
+ assert File.exist?("tmp/pids/workhorse.#{pid}.shutdown")
207
+ assert_not_process pid
208
+ end
213
209
 
214
- daemon.watch
210
+ capture_stderr { daemon.watch }
215
211
 
216
- with_retries do
217
- assert_not File.exist?("tmp/pids/workhorse.#{pid}.shutdown")
212
+ with_retries do
213
+ assert_not File.exist?("tmp/pids/workhorse.#{pid}.shutdown")
214
+ end
218
215
  end
219
216
  ensure
220
- daemon.stop
221
217
  Workhorse.max_worker_memory_mb = 0
222
218
  end
223
219
 
224
220
  private
225
221
 
226
- def remove_pids!
227
- Dir[Rails.root.join('tmp', 'pids', '*')].each do |file|
228
- FileUtils.rm file
229
- end
230
- end
231
-
232
- def start_daemon
233
- daemon = Workhorse::Daemon.new(pidfile: 'tmp/pids/test%s.pid') do |d|
234
- d.worker 'Test Worker' do
235
- begin
236
- Workhorse::Worker.start_and_wait(
237
- pool_size: 1,
238
- polling_interval: 0.1,
239
- logger: ActiveSupport::Logger.new('tmp/log.log')
240
- )
241
- end
242
- end
243
- end
244
- daemon.start
245
- return daemon
246
- end
247
-
248
222
  def assert_process(pid)
249
223
  assert process?(pid), "Process #{pid} expected to be running"
250
224
  end
data/workhorse.gemspec CHANGED
@@ -1,18 +1,18 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: workhorse 1.2.17.rc1 ruby lib
2
+ # stub: workhorse 1.2.17 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "workhorse".freeze
6
- s.version = "1.2.17.rc1"
6
+ s.version = "1.2.17"
7
7
 
8
- s.required_rubygems_version = Gem::Requirement.new("> 1.3.1".freeze) if s.respond_to? :required_rubygems_version=
8
+ s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
9
9
  s.require_paths = ["lib".freeze]
10
10
  s.authors = ["Sitrox".freeze]
11
- s.date = "2024-02-08"
12
- s.files = [".github/workflows/ruby.yml".freeze, ".gitignore".freeze, ".releaser_config".freeze, ".rubocop.yml".freeze, "CHANGELOG.md".freeze, "FAQ.md".freeze, "Gemfile".freeze, "LICENSE".freeze, "README.md".freeze, "RUBY_VERSION".freeze, "Rakefile".freeze, "VERSION".freeze, "bin/rubocop".freeze, "lib/active_job/queue_adapters/workhorse_adapter.rb".freeze, "lib/generators/workhorse/install_generator.rb".freeze, "lib/generators/workhorse/templates/bin/workhorse.rb".freeze, "lib/generators/workhorse/templates/config/initializers/workhorse.rb".freeze, "lib/generators/workhorse/templates/create_table_jobs.rb".freeze, "lib/workhorse.rb".freeze, "lib/workhorse/active_job_extension.rb".freeze, "lib/workhorse/daemon.rb".freeze, "lib/workhorse/daemon/shell_handler.rb".freeze, "lib/workhorse/db_job.rb".freeze, "lib/workhorse/enqueuer.rb".freeze, "lib/workhorse/jobs/cleanup_succeeded_jobs.rb".freeze, "lib/workhorse/jobs/detect_stale_jobs_job.rb".freeze, "lib/workhorse/jobs/run_active_job.rb".freeze, "lib/workhorse/jobs/run_rails_op.rb".freeze, "lib/workhorse/performer.rb".freeze, "lib/workhorse/poller.rb".freeze, "lib/workhorse/pool.rb".freeze, "lib/workhorse/scoped_env.rb".freeze, "lib/workhorse/worker.rb".freeze, "test/active_job/queue_adapters/workhorse_adapter_test.rb".freeze, "test/lib/db_schema.rb".freeze, "test/lib/jobs.rb".freeze, "test/lib/test_helper.rb".freeze, "test/workhorse/db_job_test.rb".freeze, "test/workhorse/enqueuer_test.rb".freeze, "test/workhorse/performer_test.rb".freeze, "test/workhorse/poller_test.rb".freeze, "test/workhorse/pool_test.rb".freeze, "test/workhorse/worker_test.rb".freeze, "workhorse.gemspec".freeze]
11
+ s.date = "2024-02-21"
12
+ s.files = [".github/workflows/ruby.yml".freeze, ".gitignore".freeze, ".releaser_config".freeze, ".rubocop.yml".freeze, "CHANGELOG.md".freeze, "FAQ.md".freeze, "Gemfile".freeze, "LICENSE".freeze, "README.md".freeze, "RUBY_VERSION".freeze, "Rakefile".freeze, "VERSION".freeze, "bin/rubocop".freeze, "lib/active_job/queue_adapters/workhorse_adapter.rb".freeze, "lib/generators/workhorse/install_generator.rb".freeze, "lib/generators/workhorse/templates/bin/workhorse.rb".freeze, "lib/generators/workhorse/templates/config/initializers/workhorse.rb".freeze, "lib/generators/workhorse/templates/create_table_jobs.rb".freeze, "lib/workhorse.rb".freeze, "lib/workhorse/active_job_extension.rb".freeze, "lib/workhorse/daemon.rb".freeze, "lib/workhorse/daemon/shell_handler.rb".freeze, "lib/workhorse/db_job.rb".freeze, "lib/workhorse/enqueuer.rb".freeze, "lib/workhorse/jobs/cleanup_succeeded_jobs.rb".freeze, "lib/workhorse/jobs/detect_stale_jobs_job.rb".freeze, "lib/workhorse/jobs/run_active_job.rb".freeze, "lib/workhorse/jobs/run_rails_op.rb".freeze, "lib/workhorse/performer.rb".freeze, "lib/workhorse/poller.rb".freeze, "lib/workhorse/pool.rb".freeze, "lib/workhorse/scoped_env.rb".freeze, "lib/workhorse/worker.rb".freeze, "test/active_job/queue_adapters/workhorse_adapter_test.rb".freeze, "test/lib/db_schema.rb".freeze, "test/lib/jobs.rb".freeze, "test/lib/test_helper.rb".freeze, "test/workhorse/daemon_test.rb".freeze, "test/workhorse/db_job_test.rb".freeze, "test/workhorse/enqueuer_test.rb".freeze, "test/workhorse/performer_test.rb".freeze, "test/workhorse/poller_test.rb".freeze, "test/workhorse/pool_test.rb".freeze, "test/workhorse/worker_test.rb".freeze, "workhorse.gemspec".freeze]
13
13
  s.rubygems_version = "3.4.6".freeze
14
14
  s.summary = "Multi-threaded job backend with database queuing for ruby.".freeze
15
- s.test_files = ["test/active_job/queue_adapters/workhorse_adapter_test.rb".freeze, "test/lib/db_schema.rb".freeze, "test/lib/jobs.rb".freeze, "test/lib/test_helper.rb".freeze, "test/workhorse/db_job_test.rb".freeze, "test/workhorse/enqueuer_test.rb".freeze, "test/workhorse/performer_test.rb".freeze, "test/workhorse/poller_test.rb".freeze, "test/workhorse/pool_test.rb".freeze, "test/workhorse/worker_test.rb".freeze]
15
+ s.test_files = ["test/active_job/queue_adapters/workhorse_adapter_test.rb".freeze, "test/lib/db_schema.rb".freeze, "test/lib/jobs.rb".freeze, "test/lib/test_helper.rb".freeze, "test/workhorse/daemon_test.rb".freeze, "test/workhorse/db_job_test.rb".freeze, "test/workhorse/enqueuer_test.rb".freeze, "test/workhorse/performer_test.rb".freeze, "test/workhorse/poller_test.rb".freeze, "test/workhorse/pool_test.rb".freeze, "test/workhorse/worker_test.rb".freeze]
16
16
 
17
17
  s.specification_version = 4
18
18
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: workhorse
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.17.rc1
4
+ version: 1.2.17
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sitrox
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-02-08 00:00:00.000000000 Z
11
+ date: 2024-02-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -178,8 +178,8 @@ dependencies:
178
178
  - - ">="
179
179
  - !ruby/object:Gem::Version
180
180
  version: '0'
181
- description:
182
- email:
181
+ description:
182
+ email:
183
183
  executables: []
184
184
  extensions: []
185
185
  extra_rdoc_files: []
@@ -221,6 +221,7 @@ files:
221
221
  - test/lib/db_schema.rb
222
222
  - test/lib/jobs.rb
223
223
  - test/lib/test_helper.rb
224
+ - test/workhorse/daemon_test.rb
224
225
  - test/workhorse/db_job_test.rb
225
226
  - test/workhorse/enqueuer_test.rb
226
227
  - test/workhorse/performer_test.rb
@@ -228,10 +229,10 @@ files:
228
229
  - test/workhorse/pool_test.rb
229
230
  - test/workhorse/worker_test.rb
230
231
  - workhorse.gemspec
231
- homepage:
232
+ homepage:
232
233
  licenses: []
233
234
  metadata: {}
234
- post_install_message:
235
+ post_install_message:
235
236
  rdoc_options: []
236
237
  require_paths:
237
238
  - lib
@@ -242,12 +243,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
242
243
  version: '0'
243
244
  required_rubygems_version: !ruby/object:Gem::Requirement
244
245
  requirements:
245
- - - ">"
246
+ - - ">="
246
247
  - !ruby/object:Gem::Version
247
- version: 1.3.1
248
+ version: '0'
248
249
  requirements: []
249
- rubygems_version: 3.4.10
250
- signing_key:
250
+ rubygems_version: 3.4.6
251
+ signing_key:
251
252
  specification_version: 4
252
253
  summary: Multi-threaded job backend with database queuing for ruby.
253
254
  test_files:
@@ -255,6 +256,7 @@ test_files:
255
256
  - test/lib/db_schema.rb
256
257
  - test/lib/jobs.rb
257
258
  - test/lib/test_helper.rb
259
+ - test/workhorse/daemon_test.rb
258
260
  - test/workhorse/db_job_test.rb
259
261
  - test/workhorse/enqueuer_test.rb
260
262
  - test/workhorse/performer_test.rb