delayed_job_chainable_hooks 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: a97932ee5b5fb3dc036b02556fb0f10482bf7210706f02afcda7961548e983fe
4
+ data.tar.gz: 7a8a1abc36b21c8a7672e4207c980482707489bd6971813fcaaadb476b69c6b9
5
+ SHA512:
6
+ metadata.gz: 1b3c458b2b26b7225d0fb4b2500354591ea33147e029a2c654a6711a6924008b45fcb413f16d79b390cdfc652eda7db3014169260d83988d24d0870310410a3e
7
+ data.tar.gz: ae1cd335f2df094aea099f470c14b1c37760e9c8179661a88155eee8868730efd7b31c20b3e7a1b1550ae69b891bcf94a9af426fce679dd09ac1d33df91876f4
@@ -0,0 +1,74 @@
1
+ workflows:
2
+ build:
3
+ jobs:
4
+ - lint:
5
+ ruby_version: "2.7.7"
6
+ - test:
7
+ matrix:
8
+ parameters:
9
+ ruby_version:
10
+ - "2.7.7"
11
+ - "3.0.5"
12
+ - "3.1.3"
13
+ - "3.2.0"
14
+ version: 2.1
15
+ jobs:
16
+ lint:
17
+ parameters:
18
+ ruby_version:
19
+ type: string
20
+ docker:
21
+ - image: salsify/ruby_ci:<< parameters.ruby_version >>
22
+ working_directory: ~/delayed_job_chainable_hooks
23
+ steps:
24
+ - checkout
25
+ - restore_cache:
26
+ keys:
27
+ - v1-gems-ruby-<< parameters.ruby_version >>-{{ checksum "delayed_job_chainable_hooks.gemspec" }}-{{ checksum "Gemfile" }}
28
+ - v1-gems-<< parameters.ruby_version >>-
29
+ - run:
30
+ name: Install Gems
31
+ command: |
32
+ if ! bundle check --path=vendor/bundle; then
33
+ bundle install --path=vendor/bundle --jobs=4 --retry=3
34
+ bundle clean
35
+ fi
36
+ - save_cache:
37
+ key: v1-gems-ruby-<< parameters.ruby_version >>-{{ checksum "delayed_job_chainable_hooks.gemspec" }}-{{ checksum "Gemfile" }}
38
+ paths:
39
+ - "vendor/bundle"
40
+ - run:
41
+ name: Run Rubocop
42
+ command: bundle exec rubocop --config .rubocop.yml
43
+ test:
44
+ parameters:
45
+ ruby_version:
46
+ type: string
47
+ docker:
48
+ - image: salsify/ruby_ci:<< parameters.ruby_version >>
49
+ environment:
50
+ CIRCLE_TEST_REPORTS: "test-results"
51
+ working_directory: ~/delayed_job_chainable_hooks
52
+ steps:
53
+ - checkout
54
+ - restore_cache:
55
+ keys:
56
+ - v1-gems-ruby-<< parameters.ruby_version >>-{{ checksum "delayed_job_chainable_hooks.gemspec" }}-{{ checksum "Gemfile" }}
57
+ - v1-gems-<< parameters.ruby_version >>-
58
+ - run:
59
+ name: Install Gems
60
+ command: |
61
+ if ! bundle check --path=vendor/bundle; then
62
+ bundle install --path=vendor/bundle --jobs=4 --retry=3
63
+ bundle clean
64
+ fi
65
+ - save_cache:
66
+ key: v1-gems-ruby-<< parameters.ruby_version >>-{{ checksum "delayed_job_chainable_hooks.gemspec" }}-{{ checksum "Gemfile" }}
67
+ paths:
68
+ - "vendor/bundle"
69
+ - run:
70
+ name: Run Tests
71
+ command: |
72
+ bundle exec rspec --format RspecJunitFormatter --out $CIRCLE_TEST_REPORTS/rspec/junit.xml --format progress spec
73
+ - store_test_results:
74
+ path: "test-results"
@@ -0,0 +1 @@
1
+ * @skarger @will89
data/.gitignore ADDED
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ examples.txt
11
+ /log/*
data/.overcommit.yml ADDED
@@ -0,0 +1,13 @@
1
+ PreCommit:
2
+ RuboCop:
3
+ enabled: true
4
+ required: false
5
+ on_warn: fail
6
+
7
+ HardTabs:
8
+ enabled: true
9
+ required: false
10
+
11
+ CommitMsg:
12
+ TrailingPeriod:
13
+ enabled: false
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,13 @@
1
+ inherit_gem:
2
+ salsify_rubocop: conf/rubocop.yml
3
+
4
+ AllCops:
5
+ TargetRubyVersion: 2.7
6
+ Exclude:
7
+ # IntelliJ compile target directory
8
+ - 'out/**/*'
9
+ # Others excluded by https://github.com/salsify/salsify_rubocop/blob/master/conf/rubocop_without_rspec.yml
10
+ - 'bin/**/*'
11
+ - 'coverage/**/*'
12
+ - 'log/**/*'
13
+ - 'vendor/**/*'
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ delayed_job_chainable_hooks
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.7.2
data/CHANGELOG.md ADDED
@@ -0,0 +1,18 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).
6
+
7
+ ## Unreleased
8
+
9
+ ## 3.0.0 - 2023-01-20
10
+ ### Changed
11
+ - Drop support for Ruby 2.6
12
+
13
+ ## 2.0.0 - 2021-03-31
14
+ ### Changed
15
+ - Require Ruby 2.6+
16
+
17
+ ## 1.0.0 - 2017-09-25
18
+ - Initial version. Extracted from Salsify's internal platform.
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+
6
+ # override the :github shortcut to be secure by using HTTPS
7
+ git_source(:github) { |repo_name| "https://github.com/#{repo_name}.git" }
8
+
9
+ # Specify your gem's dependencies in delayed_job_chainable_hooks.gemspec
10
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2017 Salsify, Inc
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
22
+
data/README.md ADDED
@@ -0,0 +1,171 @@
1
+ # DelayedJobChainableHooks
2
+
3
+ DelayedJob lifecyle hooks that allow multiple definitions across modules or parent/child classes.
4
+
5
+ DelayedJob has [built-in *job-level* hook methods](https://github.com/collectiveidea/delayed_job#hooks) that support defining a callback on a given Job class.
6
+ It also has a plugin system that allows adding lifecycle behavior *globally* to Delayed::Worker.
7
+
8
+ What about when you want to share hook methods across job clases but not apply them globally?
9
+
10
+ One option is to use modules or job-class inheritance. While this works it has the downside that you might overwrite a hook.
11
+ If you realize that the method has a previous definition you can call `super` but it is error prone.
12
+
13
+ This gem provides an alternative: chainable hook methods. They use different names so that you can use them alongside the existing DelayedJob hooks.
14
+
15
+ Inspired by [this blog post](https://www.salsify.com/blog/engineering/delayed-jobs-callbacks-and-hooks-in-rails).
16
+
17
+ ## Installation
18
+
19
+ Add this line to your application's Gemfile:
20
+
21
+ ```ruby
22
+ gem 'delayed_job_chainable_hooks'
23
+ ```
24
+
25
+ And then execute:
26
+
27
+ $ bundle
28
+
29
+ Or install it yourself as:
30
+
31
+ $ gem install delayed_job_chainable_hooks
32
+
33
+ ## Usage
34
+
35
+ Add the plugin to `Delayed::Worker.plugins`. In Rails you could put this line in `config/initializers/delayed_job_config.rb`:
36
+
37
+ ```
38
+ Delayed::Worker.plugins << DelayedJobChainableHooks::Plugin
39
+ ```
40
+
41
+ Currently the gem provides the following hooks:
42
+
43
+ - `before_job_attempt`
44
+ - `after_job_attempt_error`
45
+ - `after_job_failure`
46
+ - `after_job_success`
47
+ - `after_job_attempt`
48
+
49
+ Pass any of these a block in a module or job superclass. The block will be executed at the appropriate point during the job's lifecycle.
50
+ Optionally pass do the same in a second module or subclass. Both the first and second blocks will be called during the job's lifecycle.
51
+
52
+ ### Example
53
+
54
+ For a subset of our DelayedJobs we want to provide a polling endpoint. When an API client
55
+ prompts the application to enqueue one of these jobs, we should return a path that the
56
+ client can subsequently poll to check on the status of the job and adjust the UI accordingly.
57
+
58
+ First we create the module to support that behavior, `ClientVisibleJob`.
59
+ It includes `DelayedJobChainableHooks`. It maintains job status in
60
+ an ActiveRecord model named `ClientJobStatus`.
61
+
62
+ Note that we define the hooks by passing blocks to the methods provided by this gem,
63
+ unlike base DelayedJob where you implement the hook methods in the standard Ruby way using `def`.
64
+
65
+ ```
66
+ module ClientVisibleJob
67
+ extend ActiveSupport::Concern
68
+ include DelayedJobChainableHooks
69
+
70
+ included do
71
+ attr_accessor :client_status_id
72
+
73
+ after_job_success do
74
+ client_status.update!(status: :completed)
75
+ end
76
+
77
+ after_job_failure do
78
+ client_status.update!(status: :failed)
79
+ end
80
+ end
81
+
82
+ def initialize(*args)
83
+ @client_status = ClientJobStatus.create!(status: :running)
84
+ self.client_status_id = @client_status.id
85
+ super
86
+ end
87
+
88
+ def client_status
89
+ @client_status ||= ClientJobStatus.find(client_status_id)
90
+ end
91
+ end
92
+ ```
93
+
94
+ Now `ClientVisibleJob` can be included in specific job classes. Those classes
95
+ may define their own versions of the hook methods but the ones defined in
96
+ `ClientVisibleJob` will still execute.
97
+
98
+ ```
99
+ class MakeSouffleJob
100
+
101
+ include ClientVisibleJob
102
+
103
+ def perform
104
+ whip_egg_whites
105
+ mix_egg_whites_into_yokes
106
+ place_in_baking_dish
107
+ bake
108
+ end
109
+
110
+ before_job_attempt do
111
+ Delayed::Worker.logger.info("Let's make a souffle.")
112
+ end
113
+
114
+ after_job_success do
115
+ Delayed::Worker.logger.info("Souffle has risen!")
116
+ end
117
+
118
+ after_job_failure do
119
+ Delayed::Worker.logger.warn("Souffle has fallen!")
120
+ end
121
+ end
122
+ ```
123
+
124
+ Code that enqueues this job, such as a web request handler, can treat `MakeSouffleJob`
125
+ as a `ClientVisibleJob` and provide a status polling endpoint to clients.
126
+
127
+ ```
128
+ def post
129
+ job = MakeSouffleJob.new
130
+ Delayed::Job.enqueue(job)
131
+
132
+ render status: :accepted, json: { status: "/souffle-status/#{job.client_status_id}" }
133
+ end
134
+ ```
135
+
136
+ Other jobs that we want to make pollable can follow the same pattern.
137
+
138
+
139
+ ### Logging
140
+
141
+ By default this gem will use DelayedJob's built-in `Delayed::Worker.logger`. If you want this gem to log somewhere else, set it as follows in a Rails initializer or wherever works for you.
142
+
143
+ ```
144
+ DelayedJobChainableCallbacks.logger = Logger.new('my-log-file')
145
+ ```
146
+
147
+ ## Development
148
+
149
+ After checking out the repo, run `bin/setup` to install dependencies. Then,
150
+ run `rake spec` to run the tests. You can also run `bin/console` for an
151
+ interactive prompt that will allow you to experiment.
152
+
153
+ To install this gem onto your local machine, run `bundle exec rake install`.
154
+
155
+ ### Release (maintainers only)
156
+
157
+ To release a new version, update the version number in `version.rb`, and then
158
+ run `bundle exec rake release`, which will create a git tag for the version,
159
+ push git commits and tags, and push the `.gem` file to
160
+ [rubygems.org](https://rubygems.org)
161
+ .
162
+
163
+ ## Contributing
164
+
165
+ Bug reports and pull requests are welcome on GitHub at
166
+ https://github.com/salsify/delayed_job_chainable_hooks.
167
+
168
+ ## License
169
+
170
+ The gem is available as open source under the terms of the
171
+ [MIT License](http://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+
5
+
6
+ require 'rspec/core/rake_task'
7
+
8
+ RSpec::Core::RakeTask.new(:spec)
9
+
10
+ task default: :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'delayed_job_chainable_hooks'
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ #require "pry"
11
+ #Pry.start
12
+
13
+ require 'irb'
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -v
5
+
6
+ bundle update
7
+
8
+ overcommit --install
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'delayed_job_chainable_hooks/version'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'delayed_job_chainable_hooks'
9
+ spec.version = DelayedJobChainableHooks::VERSION
10
+ spec.authors = ['Salsify, Inc']
11
+ spec.email = ['engineering@salsify.com']
12
+
13
+ spec.summary = 'Implement DelayedJob hook methods in multiple modules/job classes ' \
14
+ 'without overriding previous definitions.'
15
+ spec.description = spec.summary
16
+ spec.homepage = 'https://github.com/salsify/delayed_job_chainable_hooks'
17
+
18
+ spec.license = 'MIT'
19
+
20
+
21
+ # Set 'allowed_push_post' to control where this gem can be published.
22
+ if spec.respond_to?(:metadata)
23
+ spec.metadata['allowed_push_host'] = 'https://rubygems.org'
24
+ spec.metadata['rubygems_mfa_required'] = 'true'
25
+
26
+ else
27
+ raise 'RubyGems 2.0 or newer is required to protect against public gem pushes.'
28
+ end
29
+
30
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
31
+ spec.bindir = 'bin'
32
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
33
+ spec.require_paths = ['lib']
34
+ spec.required_ruby_version = '>= 2.7'
35
+
36
+ spec.add_dependency 'activesupport', '>= 5.2'
37
+ spec.add_dependency 'delayed_job', '>= 4.1'
38
+ spec.add_dependency 'delayed_job_active_record'
39
+ spec.add_dependency 'hooks'
40
+
41
+ spec.add_development_dependency 'activerecord', '>= 5.2'
42
+ spec.add_development_dependency 'bundler', '~> 2.0'
43
+ spec.add_development_dependency 'database_cleaner'
44
+ spec.add_development_dependency 'overcommit'
45
+ spec.add_development_dependency 'rake', '~> 13.0'
46
+ spec.add_development_dependency 'rspec', '>= 3.8'
47
+ spec.add_development_dependency 'rspec_junit_formatter'
48
+ spec.add_development_dependency 'salsify_rubocop', '~> 1.43.0'
49
+ spec.add_development_dependency 'simplecov'
50
+ spec.add_development_dependency 'sqlite3'
51
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DelayedJobChainableHooks
4
+ class Plugin < Delayed::Plugin
5
+
6
+ # Set callbacks that are available via the Delayed Job lifecycle mechanism
7
+ callbacks do |lifecycle|
8
+ lifecycle.before(:perform) do |_, job|
9
+ payload = DelayedJobChainableHooks::Plugin.payload_object(job)
10
+ DelayedJobChainableHooks::Plugin.safe_run_hooks(payload, :before_job_attempt, job)
11
+ end
12
+
13
+ lifecycle.around(:invoke_job) do |job, *args, &block|
14
+ payload = DelayedJobChainableHooks::Plugin.payload_object(job)
15
+ begin
16
+ block.call(job, *args)
17
+ DelayedJobChainableHooks::Plugin.run_hooks(payload, :after_job_success)
18
+ rescue StandardError => e
19
+ DelayedJobChainableHooks::Plugin.run_hooks(payload, :after_job_attempt_error, e)
20
+ raise e
21
+ end
22
+ end
23
+
24
+ lifecycle.after(:perform) do |_, job|
25
+ payload = DelayedJobChainableHooks::Plugin.payload_object(job)
26
+ DelayedJobChainableHooks::Plugin.safe_run_hooks(payload, :after_job_attempt, job)
27
+ end
28
+
29
+ lifecycle.after(:failure) do |_, job|
30
+ payload = Plugin.payload_object(job)
31
+ DelayedJobChainableHooks::Plugin.safe_run_hooks(payload, :after_job_failure)
32
+ end
33
+ end
34
+
35
+ def self.payload_object(job)
36
+ payload = job.payload_object
37
+ if payload.is_a?(Delayed::PerformableMethod)
38
+ payload.object
39
+ else
40
+ payload
41
+ end
42
+ end
43
+
44
+ def self.safe_run_hooks(object, hook_name, *args)
45
+ run_hooks(object, hook_name, *args)
46
+ rescue StandardError => e
47
+ DelayedJobChainableHooks.logger.warn("Failed to run hook #{hook_name} on #{object.class}: #{e.message}")
48
+ end
49
+
50
+ def self.run_hooks(object, hook_name, *args)
51
+ object.run_hook(hook_name, *args) if object.is_a?(DelayedJobChainableHooks)
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DelayedJobChainableHooks
4
+ VERSION = '3.0.0'
5
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'delayed_job'
4
+ require 'delayed_job_active_record'
5
+ require 'hooks'
6
+ require 'active_support'
7
+ require 'delayed_job_chainable_hooks/version'
8
+ require 'delayed_job_chainable_hooks/plugin'
9
+
10
+ # Top-level gem module
11
+ module DelayedJobChainableHooks
12
+ extend ActiveSupport::Concern
13
+
14
+ def self.logger
15
+ @logger ||= Delayed::Worker.logger
16
+ end
17
+
18
+ def self.logger=(logger)
19
+ @logger = logger
20
+ end
21
+
22
+ included do
23
+ include Hooks
24
+
25
+ define_hooks :before_job_attempt, :after_job_attempt,
26
+ :after_job_attempt_error, :after_job_failure, :after_job_success
27
+ end
28
+ end
metadata ADDED
@@ -0,0 +1,264 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: delayed_job_chainable_hooks
3
+ version: !ruby/object:Gem::Version
4
+ version: 3.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Salsify, Inc
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-01-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '5.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '5.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: delayed_job
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '4.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '4.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: delayed_job_active_record
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: hooks
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: activerecord
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '5.2'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '5.2'
83
+ - !ruby/object:Gem::Dependency
84
+ name: bundler
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '2.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '2.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: database_cleaner
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: overcommit
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rake
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '13.0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '13.0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rspec
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '3.8'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '3.8'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rspec_junit_formatter
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: salsify_rubocop
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: 1.43.0
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: 1.43.0
181
+ - !ruby/object:Gem::Dependency
182
+ name: simplecov
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: sqlite3
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ description: Implement DelayedJob hook methods in multiple modules/job classes without
210
+ overriding previous definitions.
211
+ email:
212
+ - engineering@salsify.com
213
+ executables:
214
+ - console
215
+ - setup
216
+ extensions: []
217
+ extra_rdoc_files: []
218
+ files:
219
+ - ".circleci/config.yml"
220
+ - ".github/CODEOWNERS"
221
+ - ".gitignore"
222
+ - ".overcommit.yml"
223
+ - ".rspec"
224
+ - ".rubocop.yml"
225
+ - ".ruby-gemset"
226
+ - ".ruby-version"
227
+ - CHANGELOG.md
228
+ - Gemfile
229
+ - LICENSE.txt
230
+ - README.md
231
+ - Rakefile
232
+ - bin/console
233
+ - bin/setup
234
+ - delayed_job_chainable_hooks.gemspec
235
+ - lib/delayed_job_chainable_hooks.rb
236
+ - lib/delayed_job_chainable_hooks/plugin.rb
237
+ - lib/delayed_job_chainable_hooks/version.rb
238
+ homepage: https://github.com/salsify/delayed_job_chainable_hooks
239
+ licenses:
240
+ - MIT
241
+ metadata:
242
+ allowed_push_host: https://rubygems.org
243
+ rubygems_mfa_required: 'true'
244
+ post_install_message:
245
+ rdoc_options: []
246
+ require_paths:
247
+ - lib
248
+ required_ruby_version: !ruby/object:Gem::Requirement
249
+ requirements:
250
+ - - ">="
251
+ - !ruby/object:Gem::Version
252
+ version: '2.7'
253
+ required_rubygems_version: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - ">="
256
+ - !ruby/object:Gem::Version
257
+ version: '0'
258
+ requirements: []
259
+ rubygems_version: 3.3.26
260
+ signing_key:
261
+ specification_version: 4
262
+ summary: Implement DelayedJob hook methods in multiple modules/job classes without
263
+ overriding previous definitions.
264
+ test_files: []