workhorse 1.0.1 → 1.2.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: 6b381576f799a0b69cf90e0df551cae0f967b1462bb744383933ca3e82be785d
4
- data.tar.gz: c298d93548baee24c30a739b8ff3ea60ce61e91fcaf4c40cead630b29bb024d9
3
+ metadata.gz: 6b800130ba7bb86469ae68e005113eec61b3dee92b546d1a74872d6f6b850901
4
+ data.tar.gz: 63decc2511cc7bcf6d216fe3e98bea5081e6b5a8a8069ac9a5501e0b8332871a
5
5
  SHA512:
6
- metadata.gz: cc45be8c2c2ee319867798427b6994d5eba4ad6623419f54c13ed500f2a722b90acc8c5dffbd5d0e92ec6a82b4de9484559eed6798e845159210eaaf00fb324a
7
- data.tar.gz: 8d7926b6c830b94aad5e1e77f4951ebd68c6d0cfd4baccd4d004d63fa9aa4701673114b97371f72f05806a2616bc5fcf633e747441e860aff13fd4b90bf4d158
6
+ metadata.gz: f5e01457fccbe2e08db47413f6b9682a4048722f19877e6a54f7e1bcf73b21e59d92fe3575ada90405b0f287c0deb917b72b0259b988faceed0faf31a6e49ba1
7
+ data.tar.gz: 3edcb2482bc77266a934faf729314389561ff7c8d24aadc8ff25c2785248efdaa03aa705803ad86aeecf0c24bf7ac4ee4a6e8a2a112c0679b4a5bc181bdaea2e
@@ -1,5 +1,48 @@
1
1
  # Workhorse Changelog
2
2
 
3
+ ## 1.2.2 - 2021-01-27
4
+
5
+ * Remove unused gem dependency to `schemacop`
6
+
7
+ ## 1.2.1 - 2021-01-27
8
+
9
+ * Log job description (if given) when performing job
10
+
11
+ ## 1.2.0 - 2021-01-27
12
+
13
+ * `Workhorse.enqueue_active_job`
14
+ * Change `perform_at` to a keyword arument
15
+ * Allow passing `:description` and `:queue`
16
+
17
+ Note that when upgrading, change:
18
+
19
+ ```ruby
20
+ # From
21
+ Workhorse.enqueue_active_job MyJob, 5.minutes.from_now
22
+
23
+ # To
24
+ Workhorse.enqueue_active_job MyJob, perform_at: 5.minutes.from_now
25
+ ```
26
+
27
+ ## 1.1.1 - 2021-01-19
28
+
29
+ * Remove deprecation warnings with Ruby 2.7
30
+
31
+ ## 1.1.0 - 2020-12-24
32
+
33
+ * Add `description` column to `DbJob`.
34
+
35
+ If you're upgrading from a previous version, add the `description` column
36
+ to your `DbJob` table, e.g. with such a migration:
37
+
38
+ ```ruby
39
+ class AddDescriptionToWorkhorseDbJobs < ActiveRecord::Migration[6.0]
40
+ def change
41
+ add_column :jobs, :description, :string, after: :perform_at, null: true
42
+ end
43
+ end
44
+ ```
45
+
3
46
  ## 1.0.1 - 2020-12-15
4
47
 
5
48
  * Fix handling of empty pid files
data/README.md CHANGED
@@ -81,7 +81,7 @@ GRANT execute ON DBMS_LOCK TO <schema-name>;
81
81
 
82
82
  Workhorse can handle any jobs that support the `perform` method and are
83
83
  serializable. To queue a basic job, use the static method `Workhorse.enqueue`.
84
- You can optionally pass a queue name and a priority.
84
+ You can optionally pass a queue name, a priority and a description (as a string).
85
85
 
86
86
  ```ruby
87
87
  class MyJob
@@ -94,7 +94,7 @@ class MyJob
94
94
  end
95
95
  end
96
96
 
97
- Workhorse.enqueue MyJob.new('John'), queue: :test, priority: 2
97
+ Workhorse.enqueue MyJob.new('John'), queue: :test, priority: 2, description: 'Basic Job'
98
98
  ```
99
99
 
100
100
  ### RailsOps operations
@@ -381,7 +381,7 @@ configuration or else using `self.queue_adapter` in a job class inheriting from
381
381
  Per default, jobs remain in the database, no matter in which state. This can
382
382
  eventually lead to a very large jobs database. You are advised to clean your
383
383
  jobs database on a regular interval. Workhorse provides the job
384
- `Workhose::Jobs::CleanupSucceededJobs` for this purpose that cleans up all
384
+ `Workhorse::Jobs::CleanupSucceededJobs` for this purpose that cleans up all
385
385
  succeeded jobs. You can run this using your scheduler in a specific interval.
386
386
 
387
387
  ## Caveats
@@ -421,4 +421,4 @@ Please consult the [FAQ](FAQ.md).
421
421
 
422
422
  ## Copyright
423
423
 
424
- Copyright © 2020 Sitrox. See `LICENSE` for further details.
424
+ Copyright © 2021 Sitrox. See `LICENSE` for further details.
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.0.1
1
+ 1.2.2
@@ -14,8 +14,8 @@ module ActiveJob
14
14
  Workhorse.enqueue_active_job(job)
15
15
  end
16
16
 
17
- def enqueue_at(job, timestamp) #:nodoc:
18
- Workhorse.enqueue_active_job(job, timestamp)
17
+ def enqueue_at(job, timestamp = Time.now) #:nodoc:
18
+ Workhorse.enqueue_active_job(job, perform_at: timestamp)
19
19
  end
20
20
  end
21
21
  end
@@ -17,6 +17,8 @@ class CreateTableJobs < ActiveRecord::Migration
17
17
  t.integer :priority, null: false
18
18
  t.datetime :perform_at, null: true
19
19
 
20
+ t.string :description, null: true
21
+
20
22
  t.timestamps null: false
21
23
  end
22
24
 
@@ -1,6 +1,6 @@
1
1
  module Workhorse
2
2
  class Daemon::ShellHandler
3
- def self.run(options = {}, &block)
3
+ def self.run(**options, &block)
4
4
  unless ARGV.count == 1
5
5
  usage
6
6
  exit 99
@@ -10,7 +10,7 @@ module Workhorse
10
10
  lockfile = File.open(lockfile_path, 'a')
11
11
  lockfile.flock(File::LOCK_EX || File::LOCK_NB)
12
12
 
13
- daemon = Workhorse::Daemon.new(options, &block)
13
+ daemon = Workhorse::Daemon.new(**options, &block)
14
14
 
15
15
  begin
16
16
  case ARGV.first
@@ -7,7 +7,7 @@ module Workhorse
7
7
  STATE_FAILED = :failed
8
8
 
9
9
  if respond_to?(:attr_accessible)
10
- attr_accessible :queue, :priority, :perform_at, :handler
10
+ attr_accessible :queue, :priority, :perform_at, :handler, :description
11
11
  end
12
12
 
13
13
  self.table_name = 'jobs'
@@ -1,20 +1,27 @@
1
1
  module Workhorse
2
2
  module Enqueuer
3
3
  # Enqueue any object that is serializable and has a `perform` method
4
- def enqueue(job, queue: nil, priority: 0, perform_at: Time.now)
4
+ def enqueue(job, queue: nil, priority: 0, perform_at: Time.now, description: nil)
5
5
  return DbJob.create!(
6
6
  queue: queue,
7
7
  priority: priority,
8
8
  perform_at: perform_at,
9
+ description: description,
9
10
  handler: Marshal.dump(job)
10
11
  )
11
12
  end
12
13
 
13
14
  # Enqueue an ActiveJob job
14
- def enqueue_active_job(job, perform_at = Time.now)
15
+ def enqueue_active_job(job, perform_at: Time.now, queue: nil, description: nil)
15
16
  wrapper_job = Jobs::RunActiveJob.new(job.serialize)
16
- queue = job.queue_name.blank? ? nil : job.queue_name
17
- db_job = enqueue(wrapper_job, queue: queue, priority: job.priority || 0, perform_at: Time.at(perform_at))
17
+ queue ||= job.queue_name if job.queue_name.present?
18
+ db_job = enqueue(
19
+ wrapper_job,
20
+ queue: queue,
21
+ priority: job.priority || 0,
22
+ perform_at: Time.at(perform_at),
23
+ description: description
24
+ )
18
25
  job.provider_job_id = db_job.id
19
26
  return db_job
20
27
  end
@@ -59,6 +59,7 @@ module Workhorse
59
59
  # Deserialize and perform job
60
60
  # ---------------------------------------------------------------
61
61
  log 'Performing', :info
62
+ log "Description: #{@db_job.description}", :info unless @db_job.description.blank?
62
63
 
63
64
  if Workhorse.perform_jobs_in_tx
64
65
  Workhorse.tx_callback.call do
@@ -13,8 +13,8 @@ module Workhorse
13
13
 
14
14
  # Instantiates and starts a new worker with the given arguments and then
15
15
  # waits for its completion (i.e. an interrupt).
16
- def self.start_and_wait(*args)
17
- worker = new(*args)
16
+ def self.start_and_wait(**args)
17
+ worker = new(**args)
18
18
  worker.start
19
19
  worker.wait
20
20
  end
@@ -18,6 +18,8 @@ ActiveRecord::Schema.define do
18
18
  t.integer :priority, null: false
19
19
  t.datetime :perform_at, null: true
20
20
 
21
+ t.string :description, null: true
22
+
21
23
  t.timestamps null: false
22
24
  end
23
25
 
@@ -33,6 +33,15 @@ class Workhorse::EnqueuerTest < WorkhorseTest
33
33
  assert_equal 1, Workhorse::DbJob.first.priority
34
34
  end
35
35
 
36
+ def test_with_description
37
+ assert_equal 0, Workhorse::DbJob.all.count
38
+ Workhorse.enqueue BasicJob.new, description: 'Lorem ipsum'
39
+ assert_equal 1, Workhorse::DbJob.all.count
40
+
41
+ db_job = Workhorse::DbJob.first
42
+ assert_equal 'Lorem ipsum', db_job.description
43
+ end
44
+
36
45
  def test_op
37
46
  Workhorse.enqueue_op DummyRailsOpsOp, { queue: :q1 }, foo: :bar
38
47
 
@@ -1,14 +1,14 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: workhorse 1.0.1 ruby lib
2
+ # stub: workhorse 1.2.2 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "workhorse".freeze
6
- s.version = "1.0.1"
6
+ s.version = "1.2.2"
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 = "2020-12-15"
11
+ s.date = "2021-01-27"
12
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]
13
13
  s.rubygems_version = "3.0.3".freeze
14
14
  s.summary = "Multi-threaded job backend with database queuing for ruby.".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.0.1
4
+ version: 1.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sitrox
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-15 00:00:00.000000000 Z
11
+ date: 2021-01-27 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