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 +4 -4
- data/.github/workflows/ruby.yml +36 -20
- data/CHANGELOG.md +13 -1
- data/VERSION +1 -1
- data/lib/workhorse/daemon.rb +19 -7
- data/test/lib/test_helper.rb +51 -1
- data/test/workhorse/daemon_test.rb +95 -0
- data/test/workhorse/poller_test.rb +47 -57
- data/test/workhorse/worker_test.rb +22 -48
- data/workhorse.gemspec +6 -6
- metadata +13 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7c3223be9f4d677fa59d215519c9b96e933e5ab37f3ad96e904cd6dc91b59488
|
4
|
+
data.tar.gz: c30eaa0c15cd8785caf0aab8800de9c8838ff62d9192e1d8d9e8a386659322e1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9d79e67c853bf5b258ccc2d334de5c746c046b6fca063907cdc3e0a8693e641d12cbefb3ce408f69f697dd1b8f7b0ee4e6ccfcd98ed4b86210786ee53bf23e01
|
7
|
+
data.tar.gz: eca0f05a85ed9a9afaeb0d146b8243b02c3d8bd5cf1229488eacae4437494df1554ce7c2f0cf2f97118b8024d2698d6d054aef3039ab19a253497e4a6caab54f
|
data/.github/workflows/ruby.yml
CHANGED
@@ -12,7 +12,13 @@ jobs:
|
|
12
12
|
strategy:
|
13
13
|
fail-fast: false
|
14
14
|
matrix:
|
15
|
-
ruby-version:
|
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
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
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
|
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
|
1
|
+
1.2.17
|
data/lib/workhorse/daemon.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
|
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
|
data/test/lib/test_helper.rb
CHANGED
@@ -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
|
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
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
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
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
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
|
-
|
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
|
-
|
185
|
-
|
186
|
-
|
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
|
-
|
192
|
+
10.times do
|
193
|
+
Workhorse.enqueue BasicJob.new(sleep_time: 0.1)
|
189
194
|
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
+
with_retries do
|
196
|
+
assert_equal 'succeeded', Workhorse::DbJob.first.state
|
197
|
+
Workhorse::DbJob.delete_all
|
198
|
+
end
|
199
|
+
end
|
195
200
|
|
196
|
-
|
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
|
-
|
208
|
-
|
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
|
-
|
210
|
+
capture_stderr { daemon.watch }
|
215
211
|
|
216
|
-
|
217
|
-
|
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
|
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
|
6
|
+
s.version = "1.2.17"
|
7
7
|
|
8
|
-
s.required_rubygems_version = Gem::Requirement.new("
|
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-
|
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
|
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-
|
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:
|
248
|
+
version: '0'
|
248
249
|
requirements: []
|
249
|
-
rubygems_version: 3.4.
|
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
|