diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 91e6ad7..4d66530 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -52,6 +52,8 @@ jobs: - good_job_2 - good_job_3 - queue_classic_4 + - que_0 + - que_1 - que_2 - rack_2 - rack_3 diff --git a/Appraisals b/Appraisals index 9f930ae..0d0f8e6 100644 --- a/Appraisals +++ b/Appraisals @@ -36,6 +36,18 @@ appraise "queue_classic_4" do gem "queue_classic", "~> 4" end +appraise "que_0" do + gem "pg" + gem "rails", "~> 7" + gem "que", "~> 0", require: false +end + +appraise "que_1" do + gem "pg" + gem "rails", "~> 7" + gem "que", "~> 1", require: false +end + appraise "que_2" do gem "pg" gem "rails", "~> 7" diff --git a/CHANGELOG.md b/CHANGELOG.md index ecbc687..976f063 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## v1.0.3 + +* Add support for `que ~> 0` and `que ~> 1`, in addition to `que ~> 2`, for both the `job_queue_size` and `job_queue_latency` macros. + ## v1.0.2 * Add support for dashes in `HireFire::Worker` names to match the Procfile process naming format. `HireFire::Worker` is implicitly used when configuring HireFire using the `HireFire::Configuration#dyno` method. diff --git a/Gemfile.lock b/Gemfile.lock index f7da5cd..2707347 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - hirefire-resource (1.0.2) + hirefire-resource (1.0.3) GEM remote: https://rubygems.org/ diff --git a/Rakefile b/Rakefile index d1d5c65..7efa67b 100644 --- a/Rakefile +++ b/Rakefile @@ -53,7 +53,7 @@ APPRAISAL_VERSIONS = { "delayed_job_mongoid" => %w[3], "queue_classic" => %w[4], "resque" => %w[2], - "que" => %w[2] + "que" => %w[0 1 2] } def matrix diff --git a/gemfiles/bunny_2.gemfile.lock b/gemfiles/bunny_2.gemfile.lock index 7657b50..a6722ed 100644 --- a/gemfiles/bunny_2.gemfile.lock +++ b/gemfiles/bunny_2.gemfile.lock @@ -1,7 +1,7 @@ PATH remote: .. specs: - hirefire-resource (1.0.2) + hirefire-resource (1.0.3) GEM remote: https://rubygems.org/ diff --git a/gemfiles/default.gemfile.lock b/gemfiles/default.gemfile.lock index 796485a..4010167 100644 --- a/gemfiles/default.gemfile.lock +++ b/gemfiles/default.gemfile.lock @@ -1,7 +1,7 @@ PATH remote: .. specs: - hirefire-resource (1.0.2) + hirefire-resource (1.0.3) GEM remote: https://rubygems.org/ diff --git a/gemfiles/delayed_job_active_record_4.gemfile.lock b/gemfiles/delayed_job_active_record_4.gemfile.lock index fcff7fb..ddfaef7 100644 --- a/gemfiles/delayed_job_active_record_4.gemfile.lock +++ b/gemfiles/delayed_job_active_record_4.gemfile.lock @@ -1,7 +1,7 @@ PATH remote: .. specs: - hirefire-resource (1.0.2) + hirefire-resource (1.0.3) GEM remote: https://rubygems.org/ diff --git a/gemfiles/delayed_job_mongoid_3.gemfile.lock b/gemfiles/delayed_job_mongoid_3.gemfile.lock index 37f7767..3501d4a 100644 --- a/gemfiles/delayed_job_mongoid_3.gemfile.lock +++ b/gemfiles/delayed_job_mongoid_3.gemfile.lock @@ -1,7 +1,7 @@ PATH remote: .. specs: - hirefire-resource (1.0.2) + hirefire-resource (1.0.3) GEM remote: https://rubygems.org/ diff --git a/gemfiles/good_job_2.gemfile.lock b/gemfiles/good_job_2.gemfile.lock index 226207b..3008801 100644 --- a/gemfiles/good_job_2.gemfile.lock +++ b/gemfiles/good_job_2.gemfile.lock @@ -1,7 +1,7 @@ PATH remote: .. specs: - hirefire-resource (1.0.2) + hirefire-resource (1.0.3) GEM remote: https://rubygems.org/ diff --git a/gemfiles/good_job_3.gemfile.lock b/gemfiles/good_job_3.gemfile.lock index 431e511..4f3ce23 100644 --- a/gemfiles/good_job_3.gemfile.lock +++ b/gemfiles/good_job_3.gemfile.lock @@ -1,7 +1,7 @@ PATH remote: .. specs: - hirefire-resource (1.0.2) + hirefire-resource (1.0.3) GEM remote: https://rubygems.org/ diff --git a/gemfiles/que_0.gemfile b/gemfiles/que_0.gemfile new file mode 100644 index 0000000..6a6b177 --- /dev/null +++ b/gemfiles/que_0.gemfile @@ -0,0 +1,20 @@ +# This file was generated by Appraisal + +source "https://rubygems.org" + +gem "debug" +gem "rake" +gem "standardrb" +gem "minitest" +gem "webmock" +gem "mocha" +gem "timecop" +gem "yard" +gem "rack" +gem "webrick" +gem "simplecov", require: false +gem "pg" +gem "rails", "~> 7" +gem "que", "~> 0", require: false + +gemspec path: "../" diff --git a/gemfiles/que_0.gemfile.lock b/gemfiles/que_0.gemfile.lock new file mode 100644 index 0000000..4b5fd05 --- /dev/null +++ b/gemfiles/que_0.gemfile.lock @@ -0,0 +1,277 @@ +PATH + remote: .. + specs: + hirefire-resource (1.0.3) + +GEM + remote: https://rubygems.org/ + specs: + actioncable (7.1.3.2) + actionpack (= 7.1.3.2) + activesupport (= 7.1.3.2) + nio4r (~> 2.0) + websocket-driver (>= 0.6.1) + zeitwerk (~> 2.6) + actionmailbox (7.1.3.2) + actionpack (= 7.1.3.2) + activejob (= 7.1.3.2) + activerecord (= 7.1.3.2) + activestorage (= 7.1.3.2) + activesupport (= 7.1.3.2) + mail (>= 2.7.1) + net-imap + net-pop + net-smtp + actionmailer (7.1.3.2) + actionpack (= 7.1.3.2) + actionview (= 7.1.3.2) + activejob (= 7.1.3.2) + activesupport (= 7.1.3.2) + mail (~> 2.5, >= 2.5.4) + net-imap + net-pop + net-smtp + rails-dom-testing (~> 2.2) + actionpack (7.1.3.2) + actionview (= 7.1.3.2) + activesupport (= 7.1.3.2) + nokogiri (>= 1.8.5) + racc + rack (>= 2.2.4) + rack-session (>= 1.0.1) + rack-test (>= 0.6.3) + rails-dom-testing (~> 2.2) + rails-html-sanitizer (~> 1.6) + actiontext (7.1.3.2) + actionpack (= 7.1.3.2) + activerecord (= 7.1.3.2) + activestorage (= 7.1.3.2) + activesupport (= 7.1.3.2) + globalid (>= 0.6.0) + nokogiri (>= 1.8.5) + actionview (7.1.3.2) + activesupport (= 7.1.3.2) + builder (~> 3.1) + erubi (~> 1.11) + rails-dom-testing (~> 2.2) + rails-html-sanitizer (~> 1.6) + activejob (7.1.3.2) + activesupport (= 7.1.3.2) + globalid (>= 0.3.6) + activemodel (7.1.3.2) + activesupport (= 7.1.3.2) + activerecord (7.1.3.2) + activemodel (= 7.1.3.2) + activesupport (= 7.1.3.2) + timeout (>= 0.4.0) + activestorage (7.1.3.2) + actionpack (= 7.1.3.2) + activejob (= 7.1.3.2) + activerecord (= 7.1.3.2) + activesupport (= 7.1.3.2) + marcel (~> 1.0) + activesupport (7.1.3.2) + base64 + bigdecimal + concurrent-ruby (~> 1.0, >= 1.0.2) + connection_pool (>= 2.2.5) + drb + i18n (>= 1.6, < 2) + minitest (>= 5.1) + mutex_m + tzinfo (~> 2.0) + addressable (2.8.6) + public_suffix (>= 2.0.2, < 6.0) + appraisal (2.5.0) + bundler + rake + thor (>= 0.14.0) + ast (2.4.2) + base64 (0.2.0) + bigdecimal (3.1.6) + builder (3.2.4) + concurrent-ruby (1.2.3) + connection_pool (2.4.1) + crack (1.0.0) + bigdecimal + rexml + crass (1.0.6) + date (3.3.4) + debug (1.9.1) + irb (~> 1.10) + reline (>= 0.3.8) + docile (1.4.0) + drb (2.2.1) + erubi (1.12.0) + globalid (1.2.1) + activesupport (>= 6.1) + hashdiff (1.1.0) + i18n (1.14.1) + concurrent-ruby (~> 1.0) + io-console (0.7.2) + irb (1.11.2) + rdoc + reline (>= 0.4.2) + json (2.7.1) + language_server-protocol (3.17.0.3) + lint_roller (1.1.0) + loofah (2.22.0) + crass (~> 1.0.2) + nokogiri (>= 1.12.0) + mail (2.8.1) + mini_mime (>= 0.1.1) + net-imap + net-pop + net-smtp + marcel (1.0.4) + mini_mime (1.1.5) + minitest (5.22.2) + mocha (2.1.0) + ruby2_keywords (>= 0.0.5) + mutex_m (0.2.0) + net-imap (0.4.10) + date + net-protocol + net-pop (0.1.2) + net-protocol + net-protocol (0.2.2) + timeout + net-smtp (0.4.0.1) + net-protocol + nio4r (2.7.0) + nokogiri (1.16.2-arm64-darwin) + racc (~> 1.4) + parallel (1.24.0) + parser (3.3.0.5) + ast (~> 2.4.1) + racc + pg (1.5.6) + psych (5.1.2) + stringio + public_suffix (5.0.4) + que (0.14.3) + racc (1.7.3) + rack (3.0.9.1) + rack-session (2.0.0) + rack (>= 3.0.0) + rack-test (2.1.0) + rack (>= 1.3) + rackup (2.1.0) + rack (>= 3) + webrick (~> 1.8) + rails (7.1.3.2) + actioncable (= 7.1.3.2) + actionmailbox (= 7.1.3.2) + actionmailer (= 7.1.3.2) + actionpack (= 7.1.3.2) + actiontext (= 7.1.3.2) + actionview (= 7.1.3.2) + activejob (= 7.1.3.2) + activemodel (= 7.1.3.2) + activerecord (= 7.1.3.2) + activestorage (= 7.1.3.2) + activesupport (= 7.1.3.2) + bundler (>= 1.15.0) + railties (= 7.1.3.2) + rails-dom-testing (2.2.0) + activesupport (>= 5.0.0) + minitest + nokogiri (>= 1.6) + rails-html-sanitizer (1.6.0) + loofah (~> 2.21) + nokogiri (~> 1.14) + railties (7.1.3.2) + actionpack (= 7.1.3.2) + activesupport (= 7.1.3.2) + irb + rackup (>= 1.0.0) + rake (>= 12.2) + thor (~> 1.0, >= 1.2.2) + zeitwerk (~> 2.6) + rainbow (3.1.1) + rake (13.1.0) + rdoc (6.6.2) + psych (>= 4.0.0) + regexp_parser (2.9.0) + reline (0.4.3) + io-console (~> 0.5) + rexml (3.2.6) + rubocop (1.61.0) + json (~> 2.3) + language_server-protocol (>= 3.17.0) + parallel (~> 1.10) + parser (>= 3.3.0.2) + rainbow (>= 2.2.2, < 4.0) + regexp_parser (>= 1.8, < 3.0) + rexml (>= 3.2.5, < 4.0) + rubocop-ast (>= 1.30.0, < 2.0) + ruby-progressbar (~> 1.7) + unicode-display_width (>= 2.4.0, < 3.0) + rubocop-ast (1.31.1) + parser (>= 3.3.0.4) + rubocop-performance (1.20.2) + rubocop (>= 1.48.1, < 2.0) + rubocop-ast (>= 1.30.0, < 2.0) + ruby-progressbar (1.13.0) + ruby2_keywords (0.0.5) + simplecov (0.22.0) + docile (~> 1.1) + simplecov-html (~> 0.11) + simplecov_json_formatter (~> 0.1) + simplecov-html (0.12.3) + simplecov_json_formatter (0.1.4) + standard (1.34.0) + language_server-protocol (~> 3.17.0.2) + lint_roller (~> 1.0) + rubocop (~> 1.60) + standard-custom (~> 1.0.0) + standard-performance (~> 1.3) + standard-custom (1.0.2) + lint_roller (~> 1.0) + rubocop (~> 1.50) + standard-performance (1.3.1) + lint_roller (~> 1.1) + rubocop-performance (~> 1.20.2) + standardrb (1.0.1) + standard + stringio (3.1.0) + thor (1.3.1) + timecop (0.9.8) + timeout (0.4.1) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + unicode-display_width (2.5.0) + webmock (3.23.0) + addressable (>= 2.8.0) + crack (>= 0.3.2) + hashdiff (>= 0.4.0, < 2.0.0) + webrick (1.8.1) + websocket-driver (0.7.6) + websocket-extensions (>= 0.1.0) + websocket-extensions (0.1.5) + yard (0.9.36) + zeitwerk (2.6.13) + +PLATFORMS + arm64-darwin-23 + +DEPENDENCIES + appraisal (~> 2) + debug + hirefire-resource! + minitest + mocha + pg + que (~> 0) + rack + rails (~> 7) + rake + simplecov + standardrb + timecop + webmock + webrick + yard + +BUNDLED WITH + 2.4.7 diff --git a/gemfiles/que_1.gemfile b/gemfiles/que_1.gemfile new file mode 100644 index 0000000..dc04330 --- /dev/null +++ b/gemfiles/que_1.gemfile @@ -0,0 +1,20 @@ +# This file was generated by Appraisal + +source "https://rubygems.org" + +gem "debug" +gem "rake" +gem "standardrb" +gem "minitest" +gem "webmock" +gem "mocha" +gem "timecop" +gem "yard" +gem "rack" +gem "webrick" +gem "simplecov", require: false +gem "pg" +gem "rails", "~> 7" +gem "que", "~> 1", require: false + +gemspec path: "../" diff --git a/gemfiles/que_1.gemfile.lock b/gemfiles/que_1.gemfile.lock new file mode 100644 index 0000000..e1669a4 --- /dev/null +++ b/gemfiles/que_1.gemfile.lock @@ -0,0 +1,277 @@ +PATH + remote: .. + specs: + hirefire-resource (1.0.3) + +GEM + remote: https://rubygems.org/ + specs: + actioncable (7.1.3.2) + actionpack (= 7.1.3.2) + activesupport (= 7.1.3.2) + nio4r (~> 2.0) + websocket-driver (>= 0.6.1) + zeitwerk (~> 2.6) + actionmailbox (7.1.3.2) + actionpack (= 7.1.3.2) + activejob (= 7.1.3.2) + activerecord (= 7.1.3.2) + activestorage (= 7.1.3.2) + activesupport (= 7.1.3.2) + mail (>= 2.7.1) + net-imap + net-pop + net-smtp + actionmailer (7.1.3.2) + actionpack (= 7.1.3.2) + actionview (= 7.1.3.2) + activejob (= 7.1.3.2) + activesupport (= 7.1.3.2) + mail (~> 2.5, >= 2.5.4) + net-imap + net-pop + net-smtp + rails-dom-testing (~> 2.2) + actionpack (7.1.3.2) + actionview (= 7.1.3.2) + activesupport (= 7.1.3.2) + nokogiri (>= 1.8.5) + racc + rack (>= 2.2.4) + rack-session (>= 1.0.1) + rack-test (>= 0.6.3) + rails-dom-testing (~> 2.2) + rails-html-sanitizer (~> 1.6) + actiontext (7.1.3.2) + actionpack (= 7.1.3.2) + activerecord (= 7.1.3.2) + activestorage (= 7.1.3.2) + activesupport (= 7.1.3.2) + globalid (>= 0.6.0) + nokogiri (>= 1.8.5) + actionview (7.1.3.2) + activesupport (= 7.1.3.2) + builder (~> 3.1) + erubi (~> 1.11) + rails-dom-testing (~> 2.2) + rails-html-sanitizer (~> 1.6) + activejob (7.1.3.2) + activesupport (= 7.1.3.2) + globalid (>= 0.3.6) + activemodel (7.1.3.2) + activesupport (= 7.1.3.2) + activerecord (7.1.3.2) + activemodel (= 7.1.3.2) + activesupport (= 7.1.3.2) + timeout (>= 0.4.0) + activestorage (7.1.3.2) + actionpack (= 7.1.3.2) + activejob (= 7.1.3.2) + activerecord (= 7.1.3.2) + activesupport (= 7.1.3.2) + marcel (~> 1.0) + activesupport (7.1.3.2) + base64 + bigdecimal + concurrent-ruby (~> 1.0, >= 1.0.2) + connection_pool (>= 2.2.5) + drb + i18n (>= 1.6, < 2) + minitest (>= 5.1) + mutex_m + tzinfo (~> 2.0) + addressable (2.8.6) + public_suffix (>= 2.0.2, < 6.0) + appraisal (2.5.0) + bundler + rake + thor (>= 0.14.0) + ast (2.4.2) + base64 (0.2.0) + bigdecimal (3.1.6) + builder (3.2.4) + concurrent-ruby (1.2.3) + connection_pool (2.4.1) + crack (1.0.0) + bigdecimal + rexml + crass (1.0.6) + date (3.3.4) + debug (1.9.1) + irb (~> 1.10) + reline (>= 0.3.8) + docile (1.4.0) + drb (2.2.1) + erubi (1.12.0) + globalid (1.2.1) + activesupport (>= 6.1) + hashdiff (1.1.0) + i18n (1.14.1) + concurrent-ruby (~> 1.0) + io-console (0.7.2) + irb (1.11.2) + rdoc + reline (>= 0.4.2) + json (2.7.1) + language_server-protocol (3.17.0.3) + lint_roller (1.1.0) + loofah (2.22.0) + crass (~> 1.0.2) + nokogiri (>= 1.12.0) + mail (2.8.1) + mini_mime (>= 0.1.1) + net-imap + net-pop + net-smtp + marcel (1.0.4) + mini_mime (1.1.5) + minitest (5.22.2) + mocha (2.1.0) + ruby2_keywords (>= 0.0.5) + mutex_m (0.2.0) + net-imap (0.4.10) + date + net-protocol + net-pop (0.1.2) + net-protocol + net-protocol (0.2.2) + timeout + net-smtp (0.4.0.1) + net-protocol + nio4r (2.7.0) + nokogiri (1.16.2-arm64-darwin) + racc (~> 1.4) + parallel (1.24.0) + parser (3.3.0.5) + ast (~> 2.4.1) + racc + pg (1.5.6) + psych (5.1.2) + stringio + public_suffix (5.0.4) + que (1.4.0) + racc (1.7.3) + rack (3.0.9.1) + rack-session (2.0.0) + rack (>= 3.0.0) + rack-test (2.1.0) + rack (>= 1.3) + rackup (2.1.0) + rack (>= 3) + webrick (~> 1.8) + rails (7.1.3.2) + actioncable (= 7.1.3.2) + actionmailbox (= 7.1.3.2) + actionmailer (= 7.1.3.2) + actionpack (= 7.1.3.2) + actiontext (= 7.1.3.2) + actionview (= 7.1.3.2) + activejob (= 7.1.3.2) + activemodel (= 7.1.3.2) + activerecord (= 7.1.3.2) + activestorage (= 7.1.3.2) + activesupport (= 7.1.3.2) + bundler (>= 1.15.0) + railties (= 7.1.3.2) + rails-dom-testing (2.2.0) + activesupport (>= 5.0.0) + minitest + nokogiri (>= 1.6) + rails-html-sanitizer (1.6.0) + loofah (~> 2.21) + nokogiri (~> 1.14) + railties (7.1.3.2) + actionpack (= 7.1.3.2) + activesupport (= 7.1.3.2) + irb + rackup (>= 1.0.0) + rake (>= 12.2) + thor (~> 1.0, >= 1.2.2) + zeitwerk (~> 2.6) + rainbow (3.1.1) + rake (13.1.0) + rdoc (6.6.2) + psych (>= 4.0.0) + regexp_parser (2.9.0) + reline (0.4.3) + io-console (~> 0.5) + rexml (3.2.6) + rubocop (1.61.0) + json (~> 2.3) + language_server-protocol (>= 3.17.0) + parallel (~> 1.10) + parser (>= 3.3.0.2) + rainbow (>= 2.2.2, < 4.0) + regexp_parser (>= 1.8, < 3.0) + rexml (>= 3.2.5, < 4.0) + rubocop-ast (>= 1.30.0, < 2.0) + ruby-progressbar (~> 1.7) + unicode-display_width (>= 2.4.0, < 3.0) + rubocop-ast (1.31.1) + parser (>= 3.3.0.4) + rubocop-performance (1.20.2) + rubocop (>= 1.48.1, < 2.0) + rubocop-ast (>= 1.30.0, < 2.0) + ruby-progressbar (1.13.0) + ruby2_keywords (0.0.5) + simplecov (0.22.0) + docile (~> 1.1) + simplecov-html (~> 0.11) + simplecov_json_formatter (~> 0.1) + simplecov-html (0.12.3) + simplecov_json_formatter (0.1.4) + standard (1.34.0) + language_server-protocol (~> 3.17.0.2) + lint_roller (~> 1.0) + rubocop (~> 1.60) + standard-custom (~> 1.0.0) + standard-performance (~> 1.3) + standard-custom (1.0.2) + lint_roller (~> 1.0) + rubocop (~> 1.50) + standard-performance (1.3.1) + lint_roller (~> 1.1) + rubocop-performance (~> 1.20.2) + standardrb (1.0.1) + standard + stringio (3.1.0) + thor (1.3.1) + timecop (0.9.8) + timeout (0.4.1) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + unicode-display_width (2.5.0) + webmock (3.23.0) + addressable (>= 2.8.0) + crack (>= 0.3.2) + hashdiff (>= 0.4.0, < 2.0.0) + webrick (1.8.1) + websocket-driver (0.7.6) + websocket-extensions (>= 0.1.0) + websocket-extensions (0.1.5) + yard (0.9.36) + zeitwerk (2.6.13) + +PLATFORMS + arm64-darwin-23 + +DEPENDENCIES + appraisal (~> 2) + debug + hirefire-resource! + minitest + mocha + pg + que (~> 1) + rack + rails (~> 7) + rake + simplecov + standardrb + timecop + webmock + webrick + yard + +BUNDLED WITH + 2.4.7 diff --git a/gemfiles/que_2.gemfile.lock b/gemfiles/que_2.gemfile.lock index c9818d3..fa53e55 100644 --- a/gemfiles/que_2.gemfile.lock +++ b/gemfiles/que_2.gemfile.lock @@ -1,7 +1,7 @@ PATH remote: .. specs: - hirefire-resource (1.0.2) + hirefire-resource (1.0.3) GEM remote: https://rubygems.org/ diff --git a/gemfiles/queue_classic_4.gemfile.lock b/gemfiles/queue_classic_4.gemfile.lock index a24185f..cd66f44 100644 --- a/gemfiles/queue_classic_4.gemfile.lock +++ b/gemfiles/queue_classic_4.gemfile.lock @@ -1,7 +1,7 @@ PATH remote: .. specs: - hirefire-resource (1.0.2) + hirefire-resource (1.0.3) GEM remote: https://rubygems.org/ diff --git a/gemfiles/rack_2.gemfile.lock b/gemfiles/rack_2.gemfile.lock index 4e0025d..415d5ab 100644 --- a/gemfiles/rack_2.gemfile.lock +++ b/gemfiles/rack_2.gemfile.lock @@ -1,7 +1,7 @@ PATH remote: .. specs: - hirefire-resource (1.0.2) + hirefire-resource (1.0.3) GEM remote: https://rubygems.org/ diff --git a/gemfiles/rack_3.gemfile.lock b/gemfiles/rack_3.gemfile.lock index 8aeb9c7..f01f383 100644 --- a/gemfiles/rack_3.gemfile.lock +++ b/gemfiles/rack_3.gemfile.lock @@ -1,7 +1,7 @@ PATH remote: .. specs: - hirefire-resource (1.0.2) + hirefire-resource (1.0.3) GEM remote: https://rubygems.org/ diff --git a/gemfiles/resque_2.gemfile.lock b/gemfiles/resque_2.gemfile.lock index a68302e..5dbd0f3 100644 --- a/gemfiles/resque_2.gemfile.lock +++ b/gemfiles/resque_2.gemfile.lock @@ -1,7 +1,7 @@ PATH remote: .. specs: - hirefire-resource (1.0.2) + hirefire-resource (1.0.3) GEM remote: https://rubygems.org/ diff --git a/gemfiles/sidekiq_6.gemfile.lock b/gemfiles/sidekiq_6.gemfile.lock index 205c708..a7fb52a 100644 --- a/gemfiles/sidekiq_6.gemfile.lock +++ b/gemfiles/sidekiq_6.gemfile.lock @@ -1,7 +1,7 @@ PATH remote: .. specs: - hirefire-resource (1.0.2) + hirefire-resource (1.0.3) GEM remote: https://rubygems.org/ diff --git a/gemfiles/sidekiq_7.gemfile.lock b/gemfiles/sidekiq_7.gemfile.lock index 54d3ec0..58ece3e 100644 --- a/gemfiles/sidekiq_7.gemfile.lock +++ b/gemfiles/sidekiq_7.gemfile.lock @@ -1,7 +1,7 @@ PATH remote: .. specs: - hirefire-resource (1.0.2) + hirefire-resource (1.0.3) GEM remote: https://rubygems.org/ diff --git a/gemfiles/solid_queue_0.gemfile.lock b/gemfiles/solid_queue_0.gemfile.lock index e1bd8d1..0b7274a 100644 --- a/gemfiles/solid_queue_0.gemfile.lock +++ b/gemfiles/solid_queue_0.gemfile.lock @@ -1,7 +1,7 @@ PATH remote: .. specs: - hirefire-resource (1.0.2) + hirefire-resource (1.0.3) GEM remote: https://rubygems.org/ diff --git a/lib/hirefire/macro/que.rb b/lib/hirefire/macro/que.rb index 54a2a7b..0209f4e 100644 --- a/lib/hirefire/macro/que.rb +++ b/lib/hirefire/macro/que.rb @@ -9,6 +9,8 @@ module Que extend HireFire::Utility extend self + VERSION_1_0_0 = Gem::Version.new("1.0.0") + # Calculates the maximum job queue latency using Que. If no queues are specified, it # measures latency across all available queues. # @@ -22,17 +24,11 @@ module Que # @example Calculate latency across "default" and "mailer" queues # HireFire::Macro::Que.job_queue_latency(:default, :mailer) def job_queue_latency(*queues) - query = <<~SQL - SELECT run_at FROM que_jobs - WHERE run_at <= NOW() - AND finished_at IS NULL - AND expired_at IS NULL - #{filter_by_queues_if_any(queues)} - ORDER BY run_at ASC LIMIT 1 - SQL - - result = ::Que.execute(query).first - result ? (Time.now - result[:run_at].to_time) : 0.0 + if version < VERSION_1_0_0 + job_queue_latency_v0(*queues) + else + job_queue_latency_v1_v2(*queues) + end end # Calculates the total job queue size using Que. If no queues are specified, it @@ -48,18 +44,75 @@ def job_queue_latency(*queues) # @example Calculate size across "default" and "mailer" queues # HireFire::Macro::Que.job_queue_size(:default, :mailer) def job_queue_size(*queues) + if version < VERSION_1_0_0 + job_queue_size_v0(*queues) + else + job_queue_size_v1_v2(*queues) + end + end + + private + + def job_queue_latency_v0(*queues) query = <<~SQL - SELECT COUNT(*) AS total FROM que_jobs + SELECT run_at + FROM que_jobs + WHERE run_at <= NOW() + #{filter_by_queues_if_any(queues)} + ORDER BY run_at ASC + LIMIT 1 + SQL + + query_job_queue_latency(query) + end + + def job_queue_latency_v1_v2(*queues) + query = <<~SQL + SELECT run_at + FROM que_jobs WHERE run_at <= NOW() AND finished_at IS NULL AND expired_at IS NULL #{filter_by_queues_if_any(queues)} + ORDER BY run_at ASC + LIMIT 1 SQL - ::Que.execute(query).first.fetch(:total).to_i + query_job_queue_latency(query) end - private + def job_queue_size_v0(*queues) + query = <<~SQL + SELECT COUNT(*) AS job_queue_size + FROM que_jobs + WHERE run_at <= NOW() + #{filter_by_queues_if_any(queues)} + SQL + + query_job_queue_size(query) + end + + def job_queue_size_v1_v2(*queues) + query = <<~SQL + SELECT COUNT(*) AS job_queue_size + FROM que_jobs + WHERE run_at <= NOW() + AND finished_at IS NULL + AND expired_at IS NULL + #{filter_by_queues_if_any(queues)} + SQL + + query_job_queue_size(query) + end + + def query_job_queue_latency(query) + result = ::Que.execute(query).first + result ? (Time.now - result[:run_at].to_time) : 0.0 + end + + def query_job_queue_size(query) + ::Que.execute(query).first.fetch(:job_queue_size).to_i + end def filter_by_queues_if_any(queues) queues = normalize_queues(queues, allow_empty: true) @@ -70,6 +123,10 @@ def filter_by_queues_if_any(queues) def sanitize_sql(value) "'" + value.to_s.gsub(/['"\\]/, '\\\\\\&') + "'" end + + def version + Gem::Version.new(defined?(::Que::Version) ? ::Que::Version : ::Que::VERSION) + end end end end diff --git a/lib/hirefire/version.rb b/lib/hirefire/version.rb index 947327b..8459776 100644 --- a/lib/hirefire/version.rb +++ b/lib/hirefire/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module HireFire - VERSION = "1.0.2" + VERSION = "1.0.3" end diff --git a/test/env/rails_que_0/.gitignore b/test/env/rails_que_0/.gitignore new file mode 100644 index 0000000..cad2309 --- /dev/null +++ b/test/env/rails_que_0/.gitignore @@ -0,0 +1 @@ +/tmp \ No newline at end of file diff --git a/test/env/rails_que_0/Rakefile b/test/env/rails_que_0/Rakefile new file mode 100644 index 0000000..d1baef0 --- /dev/null +++ b/test/env/rails_que_0/Rakefile @@ -0,0 +1,3 @@ +require_relative "config/application" + +Rails.application.load_tasks diff --git a/test/env/rails_que_0/app/jobs/basic_job.rb b/test/env/rails_que_0/app/jobs/basic_job.rb new file mode 100644 index 0000000..3750d61 --- /dev/null +++ b/test/env/rails_que_0/app/jobs/basic_job.rb @@ -0,0 +1,4 @@ +class BasicJob < Que::Job + def run + end +end diff --git a/test/env/rails_que_0/bin/rails b/test/env/rails_que_0/bin/rails new file mode 100755 index 0000000..efc0377 --- /dev/null +++ b/test/env/rails_que_0/bin/rails @@ -0,0 +1,4 @@ +#!/usr/bin/env ruby +APP_PATH = File.expand_path("../config/application", __dir__) +require_relative "../config/boot" +require "rails/commands" diff --git a/test/env/rails_que_0/config.ru b/test/env/rails_que_0/config.ru new file mode 100644 index 0000000..cb0bc69 --- /dev/null +++ b/test/env/rails_que_0/config.ru @@ -0,0 +1,2 @@ +require_relative "config/environment" +run Rails.application diff --git a/test/env/rails_que_0/config/application.rb b/test/env/rails_que_0/config/application.rb new file mode 100644 index 0000000..353e42f --- /dev/null +++ b/test/env/rails_que_0/config/application.rb @@ -0,0 +1,11 @@ +require_relative "boot" + +require "active_record/railtie" +require "que" + +class RailsQue2Application < Rails::Application + config.load_defaults 7.0 + config.root = File.expand_path("../..", __FILE__) + config.active_record.schema_format = :sql + config.eager_load = false +end diff --git a/test/env/rails_que_0/config/boot.rb b/test/env/rails_que_0/config/boot.rb new file mode 100644 index 0000000..b6b8f16 --- /dev/null +++ b/test/env/rails_que_0/config/boot.rb @@ -0,0 +1,3 @@ +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../../../gemfiles/que_0.gemfile", __dir__) + +require "bundler/setup" diff --git a/test/env/rails_que_0/config/database.yml b/test/env/rails_que_0/config/database.yml new file mode 100644 index 0000000..f43a0c4 --- /dev/null +++ b/test/env/rails_que_0/config/database.yml @@ -0,0 +1,6 @@ +test: + adapter: postgresql + host: localhost + database: rails_que_0_test_database + username: <%= ENV["POSTGRES_USER"] %> + password: <%= ENV["POSTGRES_PASSWORD"] %> diff --git a/test/env/rails_que_0/config/environment.rb b/test/env/rails_que_0/config/environment.rb new file mode 100644 index 0000000..40c19d2 --- /dev/null +++ b/test/env/rails_que_0/config/environment.rb @@ -0,0 +1,2 @@ +require_relative "application" +Rails.application.initialize! diff --git a/test/env/rails_que_0/db/migrate/20231022174908_create_que_schema.rb b/test/env/rails_que_0/db/migrate/20231022174908_create_que_schema.rb new file mode 100644 index 0000000..b82c51b --- /dev/null +++ b/test/env/rails_que_0/db/migrate/20231022174908_create_que_schema.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +class CreateQueSchema < ActiveRecord::Migration[4.2] + def up + Que.migrate!(version: 3) + end + + def down + Que.migrate!(version: 0) + end +end diff --git a/test/env/rails_que_1/.gitignore b/test/env/rails_que_1/.gitignore new file mode 100644 index 0000000..cad2309 --- /dev/null +++ b/test/env/rails_que_1/.gitignore @@ -0,0 +1 @@ +/tmp \ No newline at end of file diff --git a/test/env/rails_que_1/Rakefile b/test/env/rails_que_1/Rakefile new file mode 100644 index 0000000..d1baef0 --- /dev/null +++ b/test/env/rails_que_1/Rakefile @@ -0,0 +1,3 @@ +require_relative "config/application" + +Rails.application.load_tasks diff --git a/test/env/rails_que_1/app/jobs/basic_job.rb b/test/env/rails_que_1/app/jobs/basic_job.rb new file mode 100644 index 0000000..3750d61 --- /dev/null +++ b/test/env/rails_que_1/app/jobs/basic_job.rb @@ -0,0 +1,4 @@ +class BasicJob < Que::Job + def run + end +end diff --git a/test/env/rails_que_1/bin/rails b/test/env/rails_que_1/bin/rails new file mode 100755 index 0000000..efc0377 --- /dev/null +++ b/test/env/rails_que_1/bin/rails @@ -0,0 +1,4 @@ +#!/usr/bin/env ruby +APP_PATH = File.expand_path("../config/application", __dir__) +require_relative "../config/boot" +require "rails/commands" diff --git a/test/env/rails_que_1/config.ru b/test/env/rails_que_1/config.ru new file mode 100644 index 0000000..cb0bc69 --- /dev/null +++ b/test/env/rails_que_1/config.ru @@ -0,0 +1,2 @@ +require_relative "config/environment" +run Rails.application diff --git a/test/env/rails_que_1/config/application.rb b/test/env/rails_que_1/config/application.rb new file mode 100644 index 0000000..353e42f --- /dev/null +++ b/test/env/rails_que_1/config/application.rb @@ -0,0 +1,11 @@ +require_relative "boot" + +require "active_record/railtie" +require "que" + +class RailsQue2Application < Rails::Application + config.load_defaults 7.0 + config.root = File.expand_path("../..", __FILE__) + config.active_record.schema_format = :sql + config.eager_load = false +end diff --git a/test/env/rails_que_1/config/boot.rb b/test/env/rails_que_1/config/boot.rb new file mode 100644 index 0000000..f8ed4a3 --- /dev/null +++ b/test/env/rails_que_1/config/boot.rb @@ -0,0 +1,3 @@ +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../../../gemfiles/que_1.gemfile", __dir__) + +require "bundler/setup" diff --git a/test/env/rails_que_1/config/database.yml b/test/env/rails_que_1/config/database.yml new file mode 100644 index 0000000..416b631 --- /dev/null +++ b/test/env/rails_que_1/config/database.yml @@ -0,0 +1,6 @@ +test: + adapter: postgresql + host: localhost + database: rails_que_1_test_database + username: <%= ENV["POSTGRES_USER"] %> + password: <%= ENV["POSTGRES_PASSWORD"] %> diff --git a/test/env/rails_que_1/config/environment.rb b/test/env/rails_que_1/config/environment.rb new file mode 100644 index 0000000..40c19d2 --- /dev/null +++ b/test/env/rails_que_1/config/environment.rb @@ -0,0 +1,2 @@ +require_relative "application" +Rails.application.initialize! diff --git a/test/env/rails_que_1/db/migrate/20231022174908_create_que_schema.rb b/test/env/rails_que_1/db/migrate/20231022174908_create_que_schema.rb new file mode 100644 index 0000000..740c94a --- /dev/null +++ b/test/env/rails_que_1/db/migrate/20231022174908_create_que_schema.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +class CreateQueSchema < ActiveRecord::Migration[5.0] + def up + Que.migrate!(version: 5) + end + + def down + Que.migrate!(version: 0) + end +end diff --git a/test/hirefire/macro/test_que.rb b/test/hirefire/macro/test_que.rb index 18560c0..5cdd8a0 100644 --- a/test/hirefire/macro/test_que.rb +++ b/test/hirefire/macro/test_que.rb @@ -1,12 +1,30 @@ # frozen_string_literal: true require "test_helper" - -require_relative "../../env/rails_que_2/config/environment" +require "que" class HireFire::Macro::QueTest < Minitest::Test + VERSION_QUE = Gem::Version.new(defined?(Que::Version) ? Que::Version : Que::VERSION) + VERSION_1_0_0 = Gem::Version.new("1.0.0") + VERSION_2_0_0 = Gem::Version.new("2.0.0") LATENCY_DELTA = 2 + if VERSION_QUE < VERSION_1_0_0 + require_relative "../../env/rails_que_0/config/environment" + + Que::Adapters::Base::CAST_PROCS[1184] = lambda do |value| + case value + when Time then value + when String then Time.parse(value) + else raise "Unexpected time class: #{value.class} (#{value.inspect})" + end + end + elsif VERSION_QUE < VERSION_2_0_0 + require_relative "../../env/rails_que_1/config/environment" + else + require_relative "../../env/rails_que_2/config/environment" + end + def setup prepare_database end @@ -16,28 +34,30 @@ def test_job_queue_latency_without_jobs end def test_job_queue_latency_with_jobs - Que.enqueue(job_options: {job_class: "BasicJob", queue: "default", run_at: Time.now - 60}) - Que.enqueue(job_options: {job_class: "BasicJob", queue: "default"}) - Que.enqueue(job_options: {job_class: "BasicJob", queue: "mailer", run_at: Time.now - 120}) + enqueue(job_options: {job_class: "BasicJob", queue: "default", run_at: Time.now - 60}) + enqueue(job_options: {job_class: "BasicJob", queue: "default", run_at: Time.now}) + enqueue(job_options: {job_class: "BasicJob", queue: "mailer", run_at: Time.now - 120}) assert_in_delta 120, HireFire::Macro::Que.job_queue_latency, LATENCY_DELTA assert_in_delta 60, HireFire::Macro::Que.job_queue_latency(:default), LATENCY_DELTA assert_in_delta 120, HireFire::Macro::Que.job_queue_latency(:default, :mailer), LATENCY_DELTA end def test_job_queue_latency_with_scheduled_jobs - Que.enqueue(job_options: {job_class: "BasicJob", run_at: Time.now - 60}) - Que.enqueue(job_options: {job_class: "BasicJob", run_at: Time.now + 90}) + enqueue(job_options: {job_class: "BasicJob", run_at: Time.now - 60}) + enqueue(job_options: {job_class: "BasicJob", run_at: Time.now + 90}) assert_in_delta 60, HireFire::Macro::Que.job_queue_latency, LATENCY_DELTA end def test_job_queue_latency_skip_finished_jobs - job = Que.enqueue(job_options: {job_class: "BasicJob", run_at: Time.now - 60}) + return if VERSION_QUE < VERSION_1_0_0 + job = enqueue(job_options: {job_class: "BasicJob", run_at: Time.now - 60}) Que.execute("UPDATE que_jobs SET finished_at = NOW() WHERE id = #{job.que_attrs[:id]};") assert_equal 0, HireFire::Macro::Que.job_queue_latency end def test_job_queue_latency_skip_expired_jobs - job = Que.enqueue(job_options: {job_class: "BasicJob", run_at: Time.now - 60}) + return if VERSION_QUE < VERSION_1_0_0 + job = enqueue(job_options: {job_class: "BasicJob", run_at: Time.now - 60}) Que.execute("UPDATE que_jobs SET expired_at = NOW() WHERE id = #{job.que_attrs[:id]};") assert_equal 0, HireFire::Macro::Que.job_queue_latency end @@ -47,38 +67,51 @@ def test_job_queue_size_without_jobs end def test_job_queue_size_with_jobs - Que.enqueue(job_options: {job_class: "BasicJob", queue: "default"}) - Que.enqueue(job_options: {job_class: "BasicJob", queue: "mailer"}) + enqueue(job_options: {job_class: "BasicJob", queue: "default", run_at: Time.now}) + enqueue(job_options: {job_class: "BasicJob", queue: "mailer", run_at: Time.now}) assert_equal 2, HireFire::Macro::Que.job_queue_size assert_equal 1, HireFire::Macro::Que.job_queue_size(:default) assert_equal 2, HireFire::Macro::Que.job_queue_size(:default, :mailer) end def test_job_queue_size_with_scheduled_jobs - Que.enqueue(job_options: {job_class: "BasicJob", run_at: Time.now - 100}) - Que.enqueue(job_options: {job_class: "BasicJob", run_at: Time.now + 100}) + enqueue(job_options: {job_class: "BasicJob", run_at: Time.now - 100}) + enqueue(job_options: {job_class: "BasicJob", run_at: Time.now + 100}) assert_equal 1, HireFire::Macro::Que.job_queue_size end def test_job_queue_size_skip_finished_jobs - job = Que.enqueue(job_options: {job_class: "BasicJob"}) + return if VERSION_QUE < VERSION_1_0_0 + job = enqueue(job_options: {job_class: "BasicJob", run_at: Time.now}) Que.execute("UPDATE que_jobs SET finished_at = NOW() WHERE id = #{job.que_attrs[:id]};") assert_equal 0, HireFire::Macro::Que.job_queue_size end def test_job_queue_size_skip_expired_jobs - job = Que.enqueue(job_options: {job_class: "BasicJob"}) + return if VERSION_QUE < VERSION_1_0_0 + job = enqueue(job_options: {job_class: "BasicJob", run_at: Time.now}) Que.execute("UPDATE que_jobs SET expired_at = NOW() WHERE id = #{job.que_attrs[:id]};") assert_equal 0, HireFire::Macro::Que.job_queue_size end def test_deprecated_queue_method - Que.enqueue(job_options: {job_class: "BasicJob", queue: "default"}) + enqueue(job_options: {job_class: "BasicJob", queue: "default", run_at: Time.now}) assert_equal 1, HireFire::Macro::Que.queue(:default) end private + def enqueue(*args, job_options: {}, **options) + options = + if VERSION_QUE < VERSION_1_0_0 + options.merge(job_options) + else + options.merge(job_options: job_options) + end + + Que.enqueue(*args, **options) + end + def prepare_database db_config = Rails.configuration.database_configuration[Rails.env] @@ -91,6 +124,8 @@ def prepare_database ActiveRecord::Base.establish_connection(db_config) end + Que.connection = ::ActiveRecord + ActiveRecord::Migration.verbose = false ActiveRecord::MigrationContext.new(Rails.root.join("db/migrate").to_s).migrate