delayed_job_groups_plugin 0.3.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
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