workhorse 1.5.1 → 1.5.2

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: 5b370f18088a986d133800af502b072749a8ae3b1b56585abc7cd6e086a40f7f
4
- data.tar.gz: 7554e03f2927f9915013993d0da0401772bf201a993ae56b54e3631d295faa0b
3
+ metadata.gz: 9ffbb2c24919d7b745fd87bd6a8675fdae5448a6c0e11c3af486d34baf5a9343
4
+ data.tar.gz: 9cf2270f0c3a65d244d679baf56367033e314e4a8b7ed11cc17f4d07e4a6fe63
5
5
  SHA512:
6
- metadata.gz: d75f21bb4784267b96dd047cf04f652458265b335a9020f3ae101d5aa85e18078ef37ed16d67c3bb2b6a4f47f696f4b9286817b3138b902644ef7ee799614140
7
- data.tar.gz: 67aaa64b06d6523e3d4bfa90dfa1053134e79f877208e0077e3adaa6b61fb8a5c6ae10c0c61e6d1f4254131e0106e9cc3ca32546db3bbafd41d6dbff7af938a6
6
+ metadata.gz: 22b02451a64ae383b75616b9556cc05927f479f47db7d7993347df0f520d36ebfda8c7f3f4de49574c84499dfd603285bab83295df72c6100b0f6f438730d576
7
+ data.tar.gz: '0549ab8a2e2683dd13b60bc85a5d2d85a260dee938a13714c45fe1233af217a433af2e71f899a7056c3afd8f503f6f94e1a5b9cee5e97bbf5fb93fed9ae75a03'
@@ -16,11 +16,15 @@ jobs:
16
16
  - '3.0.1'
17
17
  - '3.1.2'
18
18
  - '3.2.1'
19
+ db-adapter:
20
+ - 'mysql2'
21
+ - 'trilogy'
19
22
  env:
20
23
  DB_DATABASE: workhorse
21
24
  DB_USER: root
22
25
  DB_PASSWORD: 'root'
23
26
  DB_HOST: localhost
27
+ DB_ADAPTER: ${{ matrix.db-adapter }}
24
28
 
25
29
  steps:
26
30
  - uses: actions/checkout@v2
data/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # Workhorse Changelog
2
2
 
3
+ ## 1.5.2 - 2026-08-04
4
+
5
+ * Fix `Poller#valid_queues` raising `NoMethodError` on the Oracle adapter. The
6
+ `activerecord-oracle_enhanced-adapter` returns `true` from `#execute` instead
7
+ of a result set, so the subsequent `.to_a` call failed with
8
+ `undefined method 'to_a' for true`. Switched to `#select_values`, which is
9
+ implemented in terms of `#exec_query` and therefore returns the queue names on
10
+ the `mysql2`, `trilogy` and `oracle_enhanced` adapters alike (the latter both
11
+ before and after version 7.0.0).
12
+
13
+ Sitrox reference: #152178.
14
+
15
+ * Run the test suite against both the `mysql2` and the `trilogy` adapter. The
16
+ adapter can be selected using the `DB_ADAPTER` environment variable and
17
+ defaults to `mysql2`.
18
+
3
19
  ## 1.5.1 - 2026-07-22
4
20
 
5
21
  * Add per-worker heartbeat files. On every successful poll, each worker touches
data/Gemfile CHANGED
@@ -12,3 +12,4 @@ gem 'mysql2'
12
12
  gem 'pry'
13
13
  gem 'rake'
14
14
  gem 'rubocop', '~> 1.60'
15
+ gem 'trilogy'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.5.1
1
+ 1.5.2
@@ -452,7 +452,12 @@ module Workhorse
452
452
  select.projections = []
453
453
  queues = select.project(:queue)
454
454
 
455
- return Workhorse::DbJob.connection.execute(queues.distinct.to_sql).to_a.flatten
455
+ # Note that `select_values` is used here on purpose: `execute` does not
456
+ # return a result set on every adapter (the Oracle enhanced adapter, for
457
+ # instance, returns `true` for queries), while `select_values` is
458
+ # implemented in terms of `exec_query` and thus behaves the same on the
459
+ # mysql2, trilogy and Oracle enhanced adapters.
460
+ return Workhorse::DbJob.connection.select_values(queues.distinct.to_sql)
456
461
  end
457
462
  end
458
463
  end
@@ -2,11 +2,23 @@ require 'minitest/autorun'
2
2
  require 'active_record'
3
3
  require 'active_job'
4
4
  require 'pry'
5
- require 'mysql2'
6
5
  require 'benchmark'
7
6
  require 'concurrent'
8
7
  require 'jobs'
9
8
 
9
+ # The adapter to run the test suite against. Both MySQL / MariaDB adapters are
10
+ # supported, as workhorse has to work with either of them.
11
+ DB_ADAPTER = ENV.fetch('DB_ADAPTER', 'mysql2')
12
+
13
+ case DB_ADAPTER
14
+ when 'mysql2'
15
+ require 'mysql2'
16
+ when 'trilogy'
17
+ require 'trilogy'
18
+ else
19
+ fail "Unsupported DB_ADAPTER #{DB_ADAPTER.inspect}, use 'mysql2' or 'trilogy'."
20
+ end
21
+
10
22
  class MockRailsEnv < String
11
23
  def production?
12
24
  self == 'production'
@@ -43,10 +55,25 @@ class WorkhorseTest < ActiveSupport::TestCase
43
55
 
44
56
  attr_reader :daemon
45
57
 
58
+ # Temporarily replaces the method `method` on `object` with one that always
59
+ # returns `value`, for the duration of the given block.
60
+ #
61
+ # This is implemented by hand rather than using minitest's `stub`, as
62
+ # `minitest/mock` is not available in every minitest version this gem is
63
+ # tested against.
64
+ def with_return_value(object, method, value)
65
+ object.define_singleton_method(method) { |*, **| value }
66
+ yield
67
+ ensure
68
+ object.singleton_class.send(:remove_method, method)
69
+ end
70
+
46
71
  def clear_locks_and_db_threads!
47
72
  Workhorse::DbJob.connection.execute('SELECT RELEASE_ALL_LOCKS()')
48
73
 
49
- pids = Workhorse::DbJob.connection.execute(<<~SQL.squish).to_a.flatten
74
+ # Use `select_values` rather than `execute`, as the latter does not return a
75
+ # result set on every adapter.
76
+ pids = Workhorse::DbJob.connection.select_values(<<~SQL.squish)
50
77
  SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID != CONNECTION_ID()
51
78
  SQL
52
79
 
@@ -179,7 +206,7 @@ class WorkhorseTest < ActiveSupport::TestCase
179
206
  end
180
207
 
181
208
  ActiveRecord::Base.establish_connection(
182
- adapter: 'mysql2',
209
+ adapter: DB_ADAPTER,
183
210
  database: ENV.fetch('DB_NAME', nil) || 'workhorse',
184
211
  username: ENV.fetch('DB_USERNAME', nil) || 'root',
185
212
  password: ENV.fetch('DB_PASSWORD', nil) || '',
@@ -71,6 +71,21 @@ class Workhorse::PollerTest < WorkhorseTest
71
71
  assert_equal [], w.poller.send(:valid_queues)
72
72
  end
73
73
 
74
+ # Not every adapter returns a result set from `execute`: the Oracle enhanced
75
+ # adapter, for instance, returns `true` for queries, both before and after
76
+ # version 7.0.0. Querying the valid queues must therefore not rely on the
77
+ # return value of `execute`.
78
+ def test_valid_queues_without_usable_execute
79
+ w = Workhorse::Worker.new(polling_interval: 60)
80
+
81
+ Workhorse.enqueue BasicJob.new(sleep_time: 2), queue: nil
82
+ Workhorse.enqueue BasicJob.new(sleep_time: 2), queue: :a
83
+
84
+ with_return_value(Workhorse::DbJob.connection, :execute, true) do
85
+ assert_equal [nil, 'a'], w.poller.send(:valid_queues)
86
+ end
87
+ end
88
+
74
89
  def test_nil_queues
75
90
  w = Workhorse::Worker.new(pool_size: 2, polling_interval: 60)
76
91
 
data/workhorse.gemspec CHANGED
@@ -1,14 +1,14 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: workhorse 1.5.1 ruby lib
2
+ # stub: workhorse 1.5.2 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "workhorse".freeze
6
- s.version = "1.5.1".freeze
6
+ s.version = "1.5.2".freeze
7
7
 
8
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 = "2026-07-22"
11
+ s.date = "2026-08-04"
12
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, "test/workhorse/yjit_test.rb".freeze, "workhorse.gemspec".freeze]
13
13
  s.homepage = "https://github.com/sitrox/workhorse".freeze
14
14
  s.licenses = ["MIT".freeze]
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: workhorse
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.1
4
+ version: 1.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sitrox
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2026-07-22 00:00:00.000000000 Z
10
+ date: 2026-08-04 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: activesupport