delayed_job_groups_plugin 0.3.0 → 0.6.0

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
- SHA1:
3
- metadata.gz: d1a906f965ab26f60407c3a5b10a9e1405b39e3c
4
- data.tar.gz: 7cf5b5a7b17135b3de0788de8da05b6852101fc3
2
+ SHA256:
3
+ metadata.gz: '08082884f93f3a0b28ca97d8d212b5ad59defaf7ecc08987654e81433ee2f3ab'
4
+ data.tar.gz: 6e1287e9ddced955fa2be1e29d4444c53051321908ba8e4b863bd41f44f2c6a9
5
5
  SHA512:
6
- metadata.gz: ac0d877eeac021a5da0d2bf48185fa5507c35e89d8791fd0ccf6de52181cc961c3fde975eee83be4b8dacbb252743f566d35362072c779a59e71c4a515fb497e
7
- data.tar.gz: ded7fd3760219acbf979050767a58147c12c2f7aea7ba74523672ea41a21c413399ab64c416adeef7715047fda953aafdb0203cee7955d7e759d79248b7931dd
6
+ metadata.gz: f1e613c4575fba5d4c15a140ecb0968fe308d7f46bc229c87fd38b547d14fbd5aa80118b8bd73218a8024a0a342387cc06b566c88f36f91ab40215765db1e6e9
7
+ data.tar.gz: a1684af456260bbe492af11d894837cfa5e4fb0c27cbc799e5df65b1aa08d51b1cdb869e99ec97a3de4f388449174243ddda99a64222c880f24b38377d0008f9
@@ -0,0 +1,72 @@
1
+ version: 2.1
2
+ jobs:
3
+ lint:
4
+ docker:
5
+ - image: salsify/ruby_ci:2.5.8
6
+ working_directory: ~/delayed_job_groups
7
+ steps:
8
+ - checkout
9
+ - restore_cache:
10
+ keys:
11
+ - v1-gems-ruby-2.5.8-{{ checksum "delayed_job_groups.gemspec" }}-{{ checksum "Gemfile" }}
12
+ - v1-gems-ruby-2.5.8-
13
+ - run:
14
+ name: Install Gems
15
+ command: |
16
+ if ! bundle check --path=vendor/bundle; then
17
+ bundle install --path=vendor/bundle --jobs=4 --retry=3
18
+ bundle clean
19
+ fi
20
+ - save_cache:
21
+ key: v1-gems-ruby-2.5.8-{{ checksum "delayed_job_groups.gemspec" }}-{{ checksum "Gemfile" }}
22
+ paths:
23
+ - "vendor/bundle"
24
+ - "gemfiles/vendor/bundle"
25
+ - run:
26
+ name: Run Rubocop
27
+ command: bundle exec rubocop
28
+ test:
29
+ parameters:
30
+ gemfile:
31
+ type: string
32
+ docker:
33
+ - image: salsify/ruby_ci:2.5.8
34
+ environment:
35
+ CIRCLE_TEST_REPORTS: "test-results"
36
+ BUNDLE_GEMFILE: << parameters.gemfile >>
37
+ working_directory: ~/delayed_job_groups
38
+ steps:
39
+ - checkout
40
+ - restore_cache:
41
+ keys:
42
+ - v1-gems-ruby-2.5.8-{{ checksum "delayed_job_groups.gemspec" }}-{{ checksum "<< parameters.gemfile >>" }}
43
+ - v1-gems-ruby-2.5.8-
44
+ - run:
45
+ name: Install Gems
46
+ command: |
47
+ if ! bundle check --path=vendor/bundle; then
48
+ bundle install --path=vendor/bundle --jobs=4 --retry=3
49
+ bundle clean
50
+ fi
51
+ - save_cache:
52
+ key: v1-gems-ruby-2.5.8-{{ checksum "delayed_job_groups.gemspec" }}-{{ checksum "<< parameters.gemfile >>" }}
53
+ paths:
54
+ - "vendor/bundle"
55
+ - "gemfiles/vendor/bundle"
56
+ - run:
57
+ name: Run Tests
58
+ command: |
59
+ bundle exec rspec --format RspecJunitFormatter --out $CIRCLE_TEST_REPORTS/rspec/junit.xml --format progress spec
60
+ - store_test_results:
61
+ path: "test-results"
62
+ workflows:
63
+ build:
64
+ jobs:
65
+ - lint
66
+ - test:
67
+ matrix:
68
+ parameters:
69
+ gemfile:
70
+ - "gemfiles/rails_5.2.gemfile"
71
+ - "gemfiles/rails_6.0.gemfile"
72
+ - "gemfiles/rails_6.1.gemfile"
data/.gitignore CHANGED
@@ -18,3 +18,4 @@ spec/reports
18
18
  test/tmp
19
19
  test/version_tmp
20
20
  tmp
21
+ *.gemfile.lock
data/.rspec CHANGED
@@ -1,2 +1,3 @@
1
1
  --color
2
2
  --format progress
3
+ --require spec_helper
@@ -0,0 +1,11 @@
1
+ inherit_gem:
2
+ salsify_rubocop: conf/rubocop.yml
3
+
4
+ AllCops:
5
+ TargetRubyVersion: 2.5
6
+ Exclude:
7
+ - 'vendor/**/*'
8
+ - 'gemfiles/vendor/**/*'
9
+
10
+ Style/FrozenStringLiteralComment:
11
+ Enabled: true
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ appraise 'rails-5.2' do
4
+ gem 'sqlite3', '~> 1.3.6'
5
+ gem 'activerecord', '5.2.1'
6
+ gem 'activesupport', '5.2.1'
7
+ end
8
+
9
+ appraise 'rails-6.0' do
10
+ gem 'activerecord', '6.0.3'
11
+ gem 'activesupport', '6.0.3'
12
+ end
13
+
14
+ appraise 'rails-6.1' do
15
+ gem 'activerecord', '6.1.0'
16
+ gem 'activesupport', '6.1.0'
17
+ end
@@ -1,6 +1,29 @@
1
1
  # Changelog
2
2
 
3
- ### 0.3.0 (unreleased)
3
+ ### 0.6.0
4
+ * A support for Rails 6.1.
5
+
6
+ ### 0.5.0
7
+ * Drop support for Ruby 2.3 and 2.4.
8
+ * Drop support for Rails < 5.2.
9
+ * Bugfix for rails version in generated migration files
10
+
11
+ ### 0.4.3
12
+ * Bugfix for `on_completion_job` when `failure_cancels_group` is set to false.
13
+
14
+ ### 0.4.2
15
+ * Add support for Rails 6.0.
16
+
17
+ ### 0.4.1
18
+ * Bugfix for `on_completion_job` and `on_cancellation_job` YAML serialization
19
+
20
+ ### 0.4.0
21
+ * Drop support for Ruby 2.0, 2.1 and 2.2.
22
+ * Add support for Ruby 2.5.
23
+ * Drop support for Rails < 4.2.
24
+ * Add support for Rails 5.2
25
+
26
+ ### 0.3.0
4
27
  * Drop support for Ruby 1.9 and 2.0.
5
28
 
6
29
  ### 0.2.0
@@ -13,5 +36,5 @@
13
36
  ### 0.1.2
14
37
  * Add configuration option to allow failed jobs not to cancel a group.
15
38
 
16
- ### 0.1.1
39
+ ### 0.1.1
17
40
  * Update the run_at for all jobs in a JobGroup when it's unblocked.
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  gemspec
data/README.md CHANGED
@@ -100,15 +100,16 @@ job_group.cancel
100
100
 
101
101
  Configuration to allow failed jobs not to cancel the group
102
102
  ```ruby
103
- # We can optionally pass options that will allow jobs to fail without cancelling the group
103
+ # We can optionally pass options that will allow jobs to fail without cancelling the group.
104
+ # This also allows the on_completion job to fire once all jobs have either succeeded or failed.
104
105
  job_group = Delayed::JobGroups::JobGroup.create!(failure_cancels_group: false)
105
106
  ```
106
107
 
107
108
  ## Supported Platforms
108
109
 
109
110
  * Only the Delayed Job Active Record backend is supported.
110
- * Tested with Rails 3.2 and 4.0.
111
- * Tested with MRI 1.9.3, 2.0.0, 2.1.0 and JRuby in 1.9 mode.
111
+ * Tested with Rails 4.2 through 5.2.
112
+ * Tested with MRI 2.3 through 2.5.
112
113
 
113
114
  ## Contributing
114
115
 
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bundler/setup'
2
4
  Bundler::GemHelper.install_tasks
3
5
 
@@ -1,4 +1,6 @@
1
- # encoding: UTF-8
1
+
2
+ # frozen_string_literal: true
3
+
2
4
  lib = File.expand_path('../lib', __FILE__)
3
5
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
6
  require 'delayed/job_groups/version'
@@ -8,37 +10,33 @@ Gem::Specification.new do |spec|
8
10
  spec.version = Delayed::JobGroups::VERSION
9
11
  spec.authors = ['Joel Turkel', 'Randy Burkes']
10
12
  spec.email = ['jturkel@salsify.com', 'rlburkes@gmail.com']
11
- spec.description = %q{Aggregates Delayed::Job jobs into groups with group level management and lifecycle callbacks}
12
- spec.summary = %q{Delayed::Job job groups plugin}
13
+ spec.description = 'Aggregates Delayed::Job jobs into groups with group level management and lifecycle callbacks'
14
+ spec.summary = 'Delayed::Job job groups plugin'
13
15
  spec.homepage = 'https://github.com/salsify/delayed_job_groups_plugin'
14
16
  spec.license = 'MIT'
15
17
 
16
- spec.files = `git ls-files`.split($/)
18
+ spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
17
19
  spec.test_files = Dir.glob('spec/**/*')
18
20
  spec.require_paths = ['lib']
19
21
 
20
- spec.required_ruby_version = '>= 2.1'
22
+ spec.required_ruby_version = '>= 2.5'
21
23
 
22
24
  spec.add_dependency 'delayed_job', '>= 4.1'
23
- spec.add_dependency 'delayed_job_active_record', '>= 0.4'
25
+ spec.add_dependency 'delayed_job_active_record', '>= 4.1'
24
26
 
25
27
  spec.post_install_message = 'See https://github.com/salsify/delayed_job_groups_plugin#installation for upgrade/installation notes.'
26
28
 
27
- spec.add_development_dependency 'activerecord', ENV.fetch('RAILS_VERSION', ['>= 3.2', '< 5.2'])
28
- spec.add_development_dependency 'coveralls'
29
+ spec.add_development_dependency 'appraisal'
30
+ spec.add_dependency 'activerecord', '>= 5.2', '< 7'
31
+ spec.add_development_dependency 'coveralls_reborn', '>= 0.18.0'
29
32
  spec.add_development_dependency 'database_cleaner', '>= 1.2'
30
- # rspec < 3.5 requires rake < 11.0
31
- spec.add_development_dependency 'rake', '< 11.0'
32
- spec.add_development_dependency 'rspec', '>= 2.14', '< 2.99'
33
- spec.add_development_dependency 'simplecov', '~> 0.7.1'
33
+ spec.add_development_dependency 'mime-types'
34
+ spec.add_development_dependency 'rake'
35
+ spec.add_development_dependency 'rspec', '~> 3'
36
+ spec.add_development_dependency 'rspec-its'
37
+ spec.add_development_dependency 'rspec_junit_formatter'
38
+ spec.add_development_dependency 'salsify_rubocop', '0.52.1.1'
39
+ spec.add_development_dependency 'simplecov'
40
+ spec.add_development_dependency 'sqlite3'
34
41
  spec.add_development_dependency 'timecop'
35
- spec.add_development_dependency 'mime-types', '~> 2'
36
-
37
- if RUBY_PLATFORM == 'java'
38
- spec.add_development_dependency 'jdbc-sqlite3'
39
- spec.add_development_dependency 'activerecord-jdbcsqlite3-adapter'
40
- else
41
- spec.add_development_dependency 'sqlite3'
42
- end
43
-
44
42
  end
@@ -0,0 +1,9 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "sqlite3", "~> 1.3.6"
6
+ gem "activerecord", "5.2.1"
7
+ gem "activesupport", "5.2.1"
8
+
9
+ gemspec path: "../"
@@ -0,0 +1,8 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activerecord", "6.0.3"
6
+ gem "activesupport", "6.0.3"
7
+
8
+ gemspec path: "../"
@@ -0,0 +1,8 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activerecord", "6.1.0"
6
+ gem "activesupport", "6.1.0"
7
+
8
+ gemspec path: "../"
@@ -1,4 +1,4 @@
1
- # encoding: UTF-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  require 'active_support/version'
4
4
  require 'active_record/version'
@@ -8,7 +8,7 @@ module Delayed
8
8
  module Compatibility
9
9
 
10
10
  def self.mass_assignment_security_enabled?
11
- ::ActiveRecord::VERSION::MAJOR < 4 || defined?(::ActiveRecord::MassAssignmentSecurity)
11
+ defined?(::ActiveRecord::MassAssignmentSecurity)
12
12
  end
13
13
 
14
14
  end
@@ -1,4 +1,4 @@
1
- # encoding: UTF-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Delayed
4
4
  module JobGroups
@@ -1,4 +1,6 @@
1
- # encoding: UTF-8
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'yaml_loader'
2
4
 
3
5
  module Delayed
4
6
  module JobGroups
@@ -11,29 +13,19 @@ module Delayed
11
13
  :on_cancellation_job_options, :failure_cancels_group
12
14
  end
13
15
 
14
- serialize :on_completion_job
16
+ serialize :on_completion_job, Delayed::JobGroups::YamlLoader
15
17
  serialize :on_completion_job_options, Hash
16
- serialize :on_cancellation_job
18
+ serialize :on_cancellation_job, Delayed::JobGroups::YamlLoader
17
19
  serialize :on_cancellation_job_options, Hash
18
20
 
19
21
  validates :queueing_complete, :blocked, :failure_cancels_group, inclusion: [true, false]
20
22
 
21
- if ActiveRecord::VERSION::MAJOR >= 4
22
- has_many :active_jobs, -> { where(failed_at: nil) }, class_name: '::Delayed::Job'
23
- else
24
- has_many :active_jobs, class_name: Job, conditions: {failed_at: nil}
25
- end
26
-
23
+ has_many :active_jobs, -> { where(failed_at: nil) }, class_name: '::Delayed::Job'
27
24
 
28
25
  # Only delete dependent jobs that are unlocked so we can determine if there are in-flight jobs
29
26
  # for canceled job groups
30
- if ActiveRecord::VERSION::MAJOR >= 4
31
- has_many :queued_jobs, -> { where(failed_at: nil, locked_by: nil) }, class_name: '::Delayed::Job',
32
- dependent: :delete_all
33
- else
34
- has_many :queued_jobs, class_name: Job, conditions: {failed_at: nil, locked_by: nil},
35
- dependent: :delete_all
36
- end
27
+ has_many :queued_jobs, -> { where(failed_at: nil, locked_by: nil) }, class_name: '::Delayed::Job',
28
+ dependent: :delete_all
37
29
 
38
30
  def mark_queueing_complete
39
31
  with_lock do
@@ -78,7 +70,7 @@ module Delayed
78
70
  end
79
71
  end
80
72
 
81
- def self.has_pending_jobs?(job_group_ids)
73
+ def self.has_pending_jobs?(job_group_ids) # rubocop:disable Naming/PredicateName
82
74
  job_group_ids = Array(job_group_ids)
83
75
  return false if job_group_ids.empty?
84
76
  Delayed::Job.where(job_group_id: job_group_ids, failed_at: nil).exists?
@@ -1,4 +1,4 @@
1
- # encoding: UTF-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  require 'delayed_job'
4
4
  require 'set'
@@ -8,7 +8,7 @@ module Delayed
8
8
  class Plugin < Delayed::Plugin
9
9
 
10
10
  callbacks do |lifecycle|
11
- lifecycle.before(:error) do |worker, job|
11
+ lifecycle.before(:error) do |_worker, job|
12
12
  # If the job group has been cancelled then don't let the job be retried
13
13
  if job.in_job_group? && job_group_cancelled?(job.job_group_id)
14
14
  def job.max_attempts
@@ -17,7 +17,7 @@ module Delayed
17
17
  end
18
18
  end
19
19
 
20
- lifecycle.before(:failure) do |worker, job|
20
+ lifecycle.before(:failure) do |_worker, job|
21
21
  # If a job in the job group fails, then cancel the whole job group.
22
22
  # Need to check that the job group is present since another
23
23
  # job may have concurrently cancelled it.
@@ -26,17 +26,16 @@ module Delayed
26
26
  end
27
27
  end
28
28
 
29
- lifecycle.after(:perform) do |worker, job|
29
+ lifecycle.after(:perform) do |_worker, job|
30
30
  # Make sure we only check to see if the job group is complete
31
- # if the job succeeded
32
- if job.in_job_group? && job_completed?(job)
31
+ # if the job succeeded or the job has failed (maxed out retries) with failure_cancels_group
32
+ # set to false
33
+ if job.in_job_group? && (job_completed?(job) || job_acceptably_failed?(job))
33
34
  JobGroup.check_for_completion(job.job_group_id)
34
35
  end
35
36
  end
36
37
  end
37
38
 
38
- private
39
-
40
39
  def self.job_group_cancelled?(job_group_id)
41
40
  !JobGroup.exists?(job_group_id)
42
41
  end
@@ -46,7 +45,12 @@ module Delayed
46
45
  # if it has completed
47
46
  job.destroyed?
48
47
  end
48
+
49
+ def self.job_acceptably_failed?(job)
50
+ # Job has set failed_at (retries have maxed out) and failure_cancels_group is false signaling
51
+ # that the group should complete despite failures.
52
+ job.failed_at.present? && job.job_group.present? && !job.job_group.failure_cancels_group?
53
+ end
49
54
  end
50
55
  end
51
56
  end
52
-
@@ -1,7 +1,7 @@
1
- # encoding: UTF-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Delayed
4
4
  module JobGroups
5
- VERSION = '0.3.0'
5
+ VERSION = '0.6.0'
6
6
  end
7
7
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Delayed
4
+ module JobGroups
5
+ module YamlLoader
6
+ def self.load(yaml)
7
+ return yaml unless yaml.is_a?(String) && /^---/.match(yaml)
8
+ YAML.load_dj(yaml)
9
+ end
10
+
11
+ def self.dump(object)
12
+ return if object.nil?
13
+ YAML.dump(object)
14
+ end
15
+ end
16
+ end
17
+ end