workhorse 1.2.1 → 1.2.5

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: e3c7e4fe252910423baf366bed04b4dab80fc529860d95aa4f858954d9735f14
4
- data.tar.gz: 4aa288f74516cc5b097c79a6a492d15433bd7e5c0d4e90e5818818714ecf37d9
3
+ metadata.gz: c8b46dee93b4c068a0448cede864128197aea8393c592527402bd42a2d7d5412
4
+ data.tar.gz: e808736be9666ff28aa8e16db00894a2668d23fec91b29aa6a4af6d5aaf45cdf
5
5
  SHA512:
6
- metadata.gz: 9aa54bffce19e617fc34ba1d900e30dbae109fcda66163c47e3a1bc1a1bb7b3c8ba17c15582577a5b72c24ddccaac55ca92528dd2c7f18f90c7756eedfd72153
7
- data.tar.gz: 58af82fc7c8dff5375aeb31fa71084c7718998bf242736e056ae6b20787f591d4d4e26484153874b16badbffb1aa846ca73d76ea5efbd4f21a049367537704e7
6
+ metadata.gz: 5b80105eae609607dc11fc044d62e764222c110e735600ae1eae432ff36916e7a554c63b964d95a08d6730f4c78ba0b509aab37ae6860b76f60250adda6c495d
7
+ data.tar.gz: 957e7f435fb08673307907689fcd0d0c46ab434362ec629a6f5ff7ba5cf50dd138f6042530ce44f289ee900fa5359b787884f5405a935a312e6da38155d7fd24
@@ -0,0 +1,36 @@
1
+ name: Build
2
+
3
+ on:
4
+ push:
5
+ branches: [ master ]
6
+ pull_request:
7
+ branches: [ master ]
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ fail-fast: false
14
+ matrix:
15
+ ruby-version: ['2.5.1', '2.6.2', '2.7.1', '3.0.1']
16
+ env:
17
+ DB_DATABASE: workhorse
18
+ DB_USER: root
19
+ DB_PASSWORD: 'root'
20
+ DB_HOST: localhost
21
+
22
+ 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
+ run: bundle exec rake test TESTOPTS='--verbose'
35
+ - name: Run rubocop
36
+ run: bundle exec rubocop
data/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # Workhorse Changelog
2
2
 
3
+ ## 1.2.5 - 2021-11-01
4
+
5
+ * Add config settings for configuring {Workhorse::Jobs::DetectStaleJobsJob}:
6
+
7
+ * `config.stale_detection_locked_to_started_threshold`
8
+ * `config.stale_detection_run_time_threshold`
9
+
10
+ ## 1.2.4 - 2021-06-08
11
+
12
+ * Add `workhorse_db_job` load hook
13
+
14
+ ## 1.2.3 - 2021-02-09
15
+
16
+ * Fix warning with ruby 2.7
17
+
18
+ ## 1.2.2 - 2021-01-27
19
+
20
+ * Remove unused gem dependency to `schemacop`
21
+
3
22
  ## 1.2.1 - 2021-01-27
4
23
 
5
24
  * Log job description (if given) when performing job
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2020 Sitrox
3
+ Copyright (c) 2020 - 2021 Sitrox
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- [![Build Status](https://travis-ci.org/sitrox/workhorse.svg?branch=master)](https://travis-ci.org/sitrox/workhorse)
1
+ [![Build](https://github.com/sitrox/workhorse/actions/workflows/ruby.yml/badge.svg)](https://github.com/sitrox/workhorse/actions/workflows/ruby.yml)
2
2
  [![Gem Version](https://badge.fury.io/rb/workhorse.svg)](https://badge.fury.io/rb/workhorse)
3
3
 
4
4
  # Workhorse
@@ -107,10 +107,15 @@ method `Workhorse.enqueue_op`:
107
107
  Workhorse.enqueue_op Operations::Jobs::CleanUpDatabase, { queue: :maintenance, priority: 2 }, quiet: true
108
108
  ```
109
109
 
110
- Params passed using the second argument will be used for operation instantiation
111
- at job execution.
110
+ The first argument of the method is the Operation you want to run. Params passed in
111
+ using the second argument will be used by Workhorse and params passed using the
112
+ third argument will be used for operation instantiation at job execution, i.e.:
112
113
 
113
- If you do not want to pass any params to the operation, just omit the second hash:
114
+ ```ruby
115
+ Workhorse.enqueue_op <Operation Class Name>, { <Workhorse Options> }, { <RailsOps Options> }
116
+ ```
117
+
118
+ If you do not want to pass any params to the operation, just omit the third hash:
114
119
 
115
120
  ```ruby
116
121
  Workhorse.enqueue_op Operations::Jobs::CleanUpDatabase, queue: :maintenance, priority: 2
@@ -384,6 +389,21 @@ jobs database on a regular interval. Workhorse provides the job
384
389
  `Workhorse::Jobs::CleanupSucceededJobs` for this purpose that cleans up all
385
390
  succeeded jobs. You can run this using your scheduler in a specific interval.
386
391
 
392
+ ## Load hooks
393
+
394
+ Using the load hook `:workhorse_db_job`, you can inject custom code into the
395
+ Gem-internal model class `Workhorse::DbJob`, for example:
396
+
397
+ ```ruby
398
+ # config/initializers/workhorse.rb
399
+
400
+ ActiveSupport.on_load :workhorse_db_job do
401
+ # Code within this block will be run inside of the model class
402
+ # Workhorse::DbJob.
403
+ belongs_to :user
404
+ end
405
+ ```
406
+
387
407
  ## Caveats
388
408
 
389
409
  ### Errors during polling / crashed workers
data/Rakefile CHANGED
@@ -22,7 +22,6 @@ task :gemspec do
22
22
  spec.add_development_dependency 'pry'
23
23
  spec.add_dependency 'activesupport'
24
24
  spec.add_dependency 'activerecord'
25
- spec.add_dependency 'schemacop', '~> 2.0'
26
25
  spec.add_dependency 'concurrent-ruby'
27
26
  end
28
27
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.2.1
1
+ 1.2.5
@@ -120,4 +120,6 @@ module Workhorse
120
120
  end
121
121
  end
122
122
  end
123
+
124
+ ActiveSupport.run_load_hooks(:workhorse_db_job, DbJob)
123
125
  end
@@ -42,7 +42,7 @@ module Workhorse
42
42
  end
43
43
 
44
44
  job = Workhorse::Jobs::RunRailsOp.new(cls, op_args)
45
- enqueue job, workhorse_args
45
+ enqueue job, **workhorse_args
46
46
  end
47
47
  end
48
48
  end
@@ -1,18 +1,22 @@
1
1
  module Workhorse::Jobs
2
+ # This job picks up jobs that remained `locked` or `started` (running) for
3
+ # more than a certain amount of time. If any of these jobs are found, an
4
+ # exception is thrown (which may cause a notification if you configured
5
+ # `on_exception` accordingly).
6
+ #
7
+ # The thresholds are obtained from the configuration options
8
+ # {Workhorse.stale_detection_locked_to_started_threshold
9
+ # config.stale_detection_locked_to_started_threshold} and
10
+ # {Workhorse.stale_detection_run_time_threshold
11
+ # config.stale_detection_run_time_threshold}.
2
12
  class DetectStaleJobsJob
3
- # Instantiates a new stale detection job.
4
- #
5
- # @param locked_to_started_threshold [Integer] The maximum number of seconds
6
- # a job is allowed to stay 'locked' before this job throws an exception.
7
- # Set this to 0 to skip this check.
8
- # @param run_time_threshold [Integer] The maximum number of seconds
9
- # a job is allowed to run before this job throws an exception. Set this to
10
- # 0 to skip this check.
11
- def initialize(locked_to_started_threshold: 3 * 60, run_time_threshold: 12 * 60)
12
- @locked_to_started_threshold = locked_to_started_threshold
13
- @run_time_threshold = run_time_threshold
13
+ # @private
14
+ def initialize
15
+ @locked_to_started_threshold = Workhorse.stale_detection_locked_to_started_threshold
16
+ @run_time_threshold = Workhorse.stale_detection_run_time_threshold
14
17
  end
15
18
 
19
+ # @private
16
20
  def perform
17
21
  messages = []
18
22
 
data/lib/workhorse.rb CHANGED
@@ -45,6 +45,18 @@ module Workhorse
45
45
  mattr_accessor :perform_jobs_in_tx
46
46
  self.perform_jobs_in_tx = true
47
47
 
48
+ # This setting is for {Workhorse::Jobs::DetectStaleJobsJob} and specifies the
49
+ # maximum number of seconds a job is allowed to stay 'locked' before this job
50
+ # throws an exception. Set this to 0 to skip this check.
51
+ mattr_accessor :stale_detection_locked_to_started_threshold
52
+ self.stale_detection_locked_to_started_threshold = 3 * 60
53
+
54
+ # This setting is for {Workhorse::Jobs::DetectStaleJobsJob} and specifies the
55
+ # maximum number of seconds a job is allowed to run before this job throws an
56
+ # exception. Set this to 0 to skip this check.
57
+ mattr_accessor :stale_detection_run_time_threshold
58
+ self.stale_detection_run_time_threshold = 12 * 60
59
+
48
60
  def self.setup
49
61
  yield self
50
62
  end
@@ -32,7 +32,7 @@ class WorkhorseTest < ActiveSupport::TestCase
32
32
  end
33
33
 
34
34
  def with_worker(options = {})
35
- w = Workhorse::Worker.new(options)
35
+ w = Workhorse::Worker.new(**options)
36
36
  w.start
37
37
  begin
38
38
  yield(w)
data/workhorse.gemspec CHANGED
@@ -1,15 +1,15 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: workhorse 1.2.1 ruby lib
2
+ # stub: workhorse 1.2.5 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "workhorse".freeze
6
- s.version = "1.2.1"
6
+ s.version = "1.2.5"
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 = "2021-01-27"
12
- s.files = [".gitignore".freeze, ".releaser_config".freeze, ".rubocop.yml".freeze, ".travis.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/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 = "2021-11-01"
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/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]
13
13
  s.rubygems_version = "3.0.3".freeze
14
14
  s.summary = "Multi-threaded job backend with database queuing for ruby.".freeze
15
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]
@@ -29,7 +29,6 @@ Gem::Specification.new do |s|
29
29
  s.add_development_dependency(%q<pry>.freeze, [">= 0"])
30
30
  s.add_runtime_dependency(%q<activesupport>.freeze, [">= 0"])
31
31
  s.add_runtime_dependency(%q<activerecord>.freeze, [">= 0"])
32
- s.add_runtime_dependency(%q<schemacop>.freeze, ["~> 2.0"])
33
32
  s.add_runtime_dependency(%q<concurrent-ruby>.freeze, [">= 0"])
34
33
  else
35
34
  s.add_dependency(%q<bundler>.freeze, [">= 0"])
@@ -43,7 +42,6 @@ Gem::Specification.new do |s|
43
42
  s.add_dependency(%q<pry>.freeze, [">= 0"])
44
43
  s.add_dependency(%q<activesupport>.freeze, [">= 0"])
45
44
  s.add_dependency(%q<activerecord>.freeze, [">= 0"])
46
- s.add_dependency(%q<schemacop>.freeze, ["~> 2.0"])
47
45
  s.add_dependency(%q<concurrent-ruby>.freeze, [">= 0"])
48
46
  end
49
47
  else
@@ -58,7 +56,6 @@ Gem::Specification.new do |s|
58
56
  s.add_dependency(%q<pry>.freeze, [">= 0"])
59
57
  s.add_dependency(%q<activesupport>.freeze, [">= 0"])
60
58
  s.add_dependency(%q<activerecord>.freeze, [">= 0"])
61
- s.add_dependency(%q<schemacop>.freeze, ["~> 2.0"])
62
59
  s.add_dependency(%q<concurrent-ruby>.freeze, [">= 0"])
63
60
  end
64
61
  end
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.1
4
+ version: 1.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sitrox
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-01-27 00:00:00.000000000 Z
11
+ date: 2021-11-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -164,20 +164,6 @@ dependencies:
164
164
  - - ">="
165
165
  - !ruby/object:Gem::Version
166
166
  version: '0'
167
- - !ruby/object:Gem::Dependency
168
- name: schemacop
169
- requirement: !ruby/object:Gem::Requirement
170
- requirements:
171
- - - "~>"
172
- - !ruby/object:Gem::Version
173
- version: '2.0'
174
- type: :runtime
175
- prerelease: false
176
- version_requirements: !ruby/object:Gem::Requirement
177
- requirements:
178
- - - "~>"
179
- - !ruby/object:Gem::Version
180
- version: '2.0'
181
167
  - !ruby/object:Gem::Dependency
182
168
  name: concurrent-ruby
183
169
  requirement: !ruby/object:Gem::Requirement
@@ -198,10 +184,10 @@ executables: []
198
184
  extensions: []
199
185
  extra_rdoc_files: []
200
186
  files:
187
+ - ".github/workflows/ruby.yml"
201
188
  - ".gitignore"
202
189
  - ".releaser_config"
203
190
  - ".rubocop.yml"
204
- - ".travis.yml"
205
191
  - CHANGELOG.md
206
192
  - FAQ.md
207
193
  - Gemfile
@@ -259,7 +245,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
259
245
  - !ruby/object:Gem::Version
260
246
  version: '0'
261
247
  requirements: []
262
- rubygems_version: 3.1.4
248
+ rubygems_version: 3.2.22
263
249
  signing_key:
264
250
  specification_version: 4
265
251
  summary: Multi-threaded job backend with database queuing for ruby.
data/.travis.yml DELETED
@@ -1,12 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 2.5.0
4
- - 2.6.0
5
- services:
6
- - mysql
7
- before_install:
8
- - mysql -e 'CREATE DATABASE workhorse;'
9
- script:
10
- - bundle install
11
- - bundle exec rake test TESTOPTS='--verbose'
12
- - bundle exec rubocop