workhorse 1.2.17.rc1 → 1.2.17.rc2

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
  SHA256:
3
- metadata.gz: 2bcfdbfa710579ee64f436236ed5c4214404a82211ae7471513ba141e7e03eaf
4
- data.tar.gz: 680b91c6bbdbc8473fdc454175bdf6a2f4b14a0831162ab02e92208914f69f7a
3
+ metadata.gz: ce2281ae514ba5f269328c38dd0a2e9bf0f76e2c26be09f4be467b1f818f5dec
4
+ data.tar.gz: 3315c9047af3bf707d23d5309b65a602474342f6c0081f329cd0582d18b7720f
5
5
  SHA512:
6
- metadata.gz: 29fe50d7eb989a0d51cdcbd23adb7d42ce56fccf553448c7baf112bae2dd678a81613d593637fe6f168ff3620d9b31048abcdd0f8674b4db2244a59a82865779
7
- data.tar.gz: '094cb3bb85f2be4bd2575f6441e2abc6ef17d522796c586dca69f864031fde2b0095bc8ce2c3d8bee6507ab799297fd8e79c86fbbadd28467495a39cc7031694'
6
+ metadata.gz: 2047809f4fe65fca5f5eaee641b5868846098e381a18d5d1d07a4a9fe3e0d94a709185b13e7cf79c3094eaed5f908aac7399abcb4488a13b288379f414a8fdf7
7
+ data.tar.gz: fdca924627efb8ab50938b43ac76873d5bc0a5e794484a8a1e1b7fa4afba4fe86aa4003c2ccba6ff63b9a977503f9a63f818e536bc07bc34c987be52b3580793
data/CHANGELOG.md CHANGED
@@ -1,6 +1,14 @@
1
1
  # Workhorse Changelog
2
2
 
3
- ## 1.2.17.rc1 - 2024-02-05
3
+ ## 1.2.17.rc2 - 2024-02-08
4
+
5
+ * Remove unnecessary output from `watch` command in certain cases.
6
+
7
+ Sitrox reference: #121312.
8
+
9
+ * Fix, improve and extend automated tests.
10
+
11
+ ## 1.2.17.rc1 - 2024-02-08
4
12
 
5
13
  * Revamp memory handling:
6
14
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.2.17.rc1
1
+ 1.2.17.rc2
@@ -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,44 @@ 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
+ begin
106
+ Workhorse::Worker.start_and_wait(
107
+ pool_size: 1,
108
+ polling_interval: 0.1
109
+ )
110
+ end
111
+ end
112
+ end
113
+ end
114
+ daemon.start(quiet: true)
115
+ yield @daemon
116
+ ensure
117
+ daemon.stop(quiet: true)
118
+ end
119
+
77
120
  def with_retries(max = 50, interval: 0.1, &_block)
78
121
  runs = 0
79
122
 
80
123
  loop do
81
124
  return yield
82
- rescue Minitest::Assertion => e
125
+ rescue Minitest::Assertion
83
126
  fail if runs > max
84
127
  sleep interval
85
128
  runs += 1
86
129
  end
87
130
  end
131
+
132
+ def capture_stderr
133
+ old, $stderr = $stderr, StringIO.new
134
+ yield
135
+ $stderr.string
136
+ ensure
137
+ $stderr = old
138
+ end
88
139
  end
89
140
 
90
141
  ActiveRecord::Base.establish_connection(
@@ -0,0 +1,92 @@
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
+ # Watch
20
+ assert_watch_output(
21
+ 'Worker #1 (Test Worker 0): Starting (stale pid file)',
22
+ "Worker #2 (Test Worker 1): Already started (PID #{daemon.workers.second.pid})"
23
+ )
24
+ end
25
+ end
26
+
27
+ def test_watch_starting_missing_pid
28
+ with_daemon 2 do
29
+ # Kill first worker
30
+ kill daemon.workers.first.pid
31
+ FileUtils.rm "tmp/pids/test1.pid"
32
+
33
+ # Watch
34
+ assert_watch_output(
35
+ 'Worker #1 (Test Worker 0): Starting',
36
+ "Worker #2 (Test Worker 1): Already started (PID #{daemon.workers.second.pid})"
37
+ )
38
+ end
39
+ end
40
+
41
+ def test_watch_controlled_shutdown
42
+ with_daemon 2 do
43
+ # Kill first worker
44
+ kill daemon.workers.first.pid
45
+ FileUtils.touch "tmp/pids/workhorse.#{daemon.workers.first.pid}.shutdown"
46
+
47
+ # Watch
48
+ assert_watch_output
49
+ end
50
+
51
+ assert_not File.exist?("tmp/pids/workhorse.#{daemon.workers.first.pid}.shutdown")
52
+ end
53
+
54
+ def test_watch_mixed
55
+ # Worker 0: Kill, remove PID
56
+ # Worker 1: Kill, keep PID
57
+ # Worker 2: Keep
58
+ # Worker 3: Controlled shutdown
59
+ with_daemon 4 do
60
+ # Worker 0: Kill, remove PID
61
+ kill daemon.workers[0].pid
62
+ FileUtils.rm "tmp/pids/test1.pid"
63
+
64
+ # Worker 1: Kill, keep PID
65
+ kill daemon.workers[1].pid
66
+
67
+ # Worker 3: Controlled shutdown
68
+ kill daemon.workers[3].pid
69
+ FileUtils.touch "tmp/pids/workhorse.#{daemon.workers.first.pid}.shutdown"
70
+
71
+ # Watch
72
+ assert_watch_output(
73
+ 'Worker #1 (Test Worker 0): Starting',
74
+ 'Worker #2 (Test Worker 1): Starting (stale pid file)',
75
+ "Worker #3 (Test Worker 2): Already started (PID #{daemon.workers[2].pid})",
76
+ 'Worker #4 (Test Worker 3): Starting (stale pid file)'
77
+ )
78
+ end
79
+
80
+ assert_not File.exist?("tmp/pids/workhorse.#{daemon.workers.first.pid}.shutdown")
81
+ end
82
+
83
+ private
84
+
85
+ def assert_watch_output(*expected_lines)
86
+ silence_watcher_was = Workhorse.silence_watcher
87
+ Workhorse.silence_watcher = false
88
+ assert_equal expected_lines, capture_stderr { daemon.watch }.lines.map(&:chomp)
89
+ ensure
90
+ Workhorse.silence_watcher = silence_watcher_was
91
+ end
92
+ 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
184
  Workhorse.max_worker_memory_mb = 50
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.rc2 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.rc2"
7
7
 
8
8
  s.required_rubygems_version = Gem::Requirement.new("> 1.3.1".freeze) if s.respond_to? :required_rubygems_version=
9
9
  s.require_paths = ["lib".freeze]
10
10
  s.authors = ["Sitrox".freeze]
11
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]
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,7 +1,7 @@
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.rc2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sitrox
@@ -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
@@ -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