acidic_job 1.0.0.beta.1 → 1.0.0.beta.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 +4 -4
- data/.github/workflows/main.yml +3 -2
- data/.gitignore +1 -1
- data/Gemfile.lock +4 -10
- data/README.md +101 -102
- data/acidic_job.gemspec +0 -2
- data/gemfiles/{rails_6.1.gemfile → rails_6.1_sidekiq_6.4.gemfile} +2 -0
- data/gemfiles/rails_6.1_sidekiq_6.5.gemfile +10 -0
- data/gemfiles/{rails_7.0.gemfile → rails_7.0_sidekiq_6.4.gemfile} +2 -0
- data/gemfiles/rails_7.0_sidekiq_6.5.gemfile +10 -0
- data/gemfiles/rails_7.1_sidekiq_6.4.gemfile +10 -0
- data/gemfiles/rails_7.1_sidekiq_6.5.gemfile +10 -0
- data/lib/acidic_job/active_kiq.rb +2 -2
- data/lib/acidic_job/extensions/action_mailer.rb +19 -0
- data/lib/acidic_job/extensions/noticed.rb +46 -0
- data/lib/acidic_job/mixin.rb +6 -0
- data/lib/acidic_job/perform_wrapper.rb +3 -3
- data/lib/acidic_job/run.rb +1 -1
- data/lib/acidic_job/testing.rb +73 -0
- data/lib/acidic_job/version.rb +1 -1
- data/lib/acidic_job.rb +2 -0
- metadata +11 -33
- data/bin/sandbox +0 -1958
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module AcidicJob
|
4
|
+
module Extensions
|
5
|
+
module Noticed
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
class_methods do
|
9
|
+
def deliver_acidicly(recipients)
|
10
|
+
new.deliver_acidicly(recipients)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# THIS IS A HACK THAT COPIES AND PASTES KEY PARTS OF THE `Noticed::Base` CODE
|
15
|
+
# IN ORDER TO ALLOW US TO TRANSACTIONALLY DELIVER NOTIFICATIONS
|
16
|
+
# THIS IS THUS LIABLE TO BREAK WHENEVER THAT GEM IS UPDATED
|
17
|
+
def deliver_acidicly(recipients)
|
18
|
+
delivery_methods = self.class.delivery_methods.dup
|
19
|
+
|
20
|
+
Array.wrap(recipients).uniq.each do |recipient|
|
21
|
+
if (index = delivery_methods.find_index { |m| m[:name] == :database })
|
22
|
+
database_delivery_method = delivery_methods.delete_at(index)
|
23
|
+
self.record = run_delivery_method(database_delivery_method,
|
24
|
+
recipient: recipient,
|
25
|
+
enqueue: false,
|
26
|
+
record: nil)
|
27
|
+
end
|
28
|
+
|
29
|
+
delivery_methods.map do |delivery_method|
|
30
|
+
job_class = delivery_method_for(delivery_method[:name], delivery_method[:options])
|
31
|
+
args = {
|
32
|
+
notification_class: self.class.name,
|
33
|
+
options: delivery_method[:options],
|
34
|
+
params: params,
|
35
|
+
recipient: recipient,
|
36
|
+
record: record
|
37
|
+
}
|
38
|
+
job = job_class.new(args)
|
39
|
+
|
40
|
+
AcidicJob::Run.stage!(job)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/acidic_job/mixin.rb
CHANGED
@@ -14,6 +14,12 @@ module AcidicJob
|
|
14
14
|
# and run perform callbacks for Sidekiq workers
|
15
15
|
other.prepend PerformWrapper
|
16
16
|
|
17
|
+
# Add `deliver_acidicly` to ActionMailer
|
18
|
+
::ActionMailer::Parameterized::MessageDelivery.include(Extensions::ActionMailer) if defined?(::ActionMailer)
|
19
|
+
::ActionMailer::MessageDelivery.include(Extensions::ActionMailer) if defined?(::ActionMailer)
|
20
|
+
# Add `deliver_acidicly` to Noticed
|
21
|
+
::Noticed::Base.include(Extensions::Noticed) if defined?(::Noticed)
|
22
|
+
|
17
23
|
# By default, we unique job runs by the `job_id`
|
18
24
|
other.instance_variable_set(:@acidic_identifier, :job_id)
|
19
25
|
# However, you can customize this behavior on a per job class level
|
@@ -4,15 +4,15 @@ module AcidicJob
|
|
4
4
|
# NOTE: it is essential that this be a bare module and not an ActiveSupport::Concern
|
5
5
|
# WHY?
|
6
6
|
module PerformWrapper
|
7
|
-
def perform(*args
|
7
|
+
def perform(*args)
|
8
8
|
@arguments = args
|
9
9
|
|
10
10
|
# we don't want to run the `perform` callbacks twice, since ActiveJob already handles that for us
|
11
11
|
if defined?(ActiveJob) && self.class < ActiveJob::Base
|
12
|
-
super(*args
|
12
|
+
super(*args)
|
13
13
|
elsif defined?(Sidekiq) && self.class.include?(Sidekiq::Worker)
|
14
14
|
run_callbacks :perform do
|
15
|
-
super(*args
|
15
|
+
super(*args)
|
16
16
|
end
|
17
17
|
else
|
18
18
|
raise UnknownJobAdapter
|
data/lib/acidic_job/run.rb
CHANGED
@@ -0,0 +1,73 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "database_cleaner"
|
4
|
+
|
5
|
+
module AcidicJob
|
6
|
+
module Testing
|
7
|
+
def self.included(mod)
|
8
|
+
mod.class_eval "self.use_transactional_tests = false if respond_to?(:use_transactional_tests)", __FILE__, __LINE__
|
9
|
+
end
|
10
|
+
|
11
|
+
def before_setup
|
12
|
+
@connection = ::ActiveRecord::Base.connection
|
13
|
+
@original_cleaners = ::DatabaseCleaner.cleaners
|
14
|
+
::DatabaseCleaner.cleaners = transaction_free_cleaners_for(@original_cleaners)
|
15
|
+
super
|
16
|
+
::DatabaseCleaner.start
|
17
|
+
end
|
18
|
+
|
19
|
+
def after_teardown
|
20
|
+
::DatabaseCleaner.clean
|
21
|
+
super
|
22
|
+
::DatabaseCleaner.cleaners = @original_cleaners
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
# Ensure that the system's original DatabaseCleaner configuration is maintained, options included,
|
28
|
+
# except that any `transaction` strategies for any ORMs are replaced with a `deletion` strategy.
|
29
|
+
def transaction_free_cleaners_for(original_cleaners)
|
30
|
+
non_transaction_cleaners = original_cleaners.dup.to_h do |(orm, opts), cleaner|
|
31
|
+
[[orm, opts], ensure_no_transaction_strategies_for(cleaner)]
|
32
|
+
end
|
33
|
+
::DatabaseCleaner::Cleaners.new(non_transaction_cleaners)
|
34
|
+
end
|
35
|
+
|
36
|
+
def ensure_no_transaction_strategies_for(cleaner)
|
37
|
+
return cleaner unless strategy_name_for(cleaner) == "transaction"
|
38
|
+
|
39
|
+
cleaner.strategy = deletion_strategy_for(cleaner)
|
40
|
+
cleaner
|
41
|
+
end
|
42
|
+
|
43
|
+
def strategy_name_for(cleaner)
|
44
|
+
cleaner # <DatabaseCleaner::Cleaner>
|
45
|
+
.strategy # <DatabaseCleaner::ActiveRecord::Truncation>
|
46
|
+
.class # DatabaseCleaner::ActiveRecord::Truncation
|
47
|
+
.name # "DatabaseCleaner::ActiveRecord::Truncation"
|
48
|
+
.rpartition("::") # ["DatabaseCleaner::ActiveRecord", "::", "Truncation"]
|
49
|
+
.last # "Truncation"
|
50
|
+
.downcase # "truncation"
|
51
|
+
end
|
52
|
+
|
53
|
+
def deletion_strategy_for(cleaner)
|
54
|
+
strategy = cleaner.strategy
|
55
|
+
strategy_namespace = strategy # <DatabaseCleaner::ActiveRecord::Truncation>
|
56
|
+
.class # DatabaseCleaner::ActiveRecord::Truncation
|
57
|
+
.name # "DatabaseCleaner::ActiveRecord::Truncation"
|
58
|
+
.rpartition("::") # ["DatabaseCleaner::ActiveRecord", "::", "Truncation"]
|
59
|
+
.first # "DatabaseCleaner::ActiveRecord"
|
60
|
+
deletion_strategy_class_name = [strategy_namespace, "::", "Deletion"].join
|
61
|
+
deletion_strategy_class = deletion_strategy_class_name.constantize
|
62
|
+
instance_variable_hash = strategy.instance_variables.to_h do |var|
|
63
|
+
[
|
64
|
+
var.to_s.remove("@"),
|
65
|
+
strategy.instance_variable_get(var)
|
66
|
+
]
|
67
|
+
end
|
68
|
+
options = instance_variable_hash.except("db", "connection_class")
|
69
|
+
|
70
|
+
deletion_strategy_class.new(**options)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
data/lib/acidic_job/version.rb
CHANGED
data/lib/acidic_job.rb
CHANGED
@@ -17,6 +17,8 @@ require_relative "acidic_job/perform_wrapper"
|
|
17
17
|
require_relative "acidic_job/mixin"
|
18
18
|
require_relative "acidic_job/base"
|
19
19
|
require_relative "acidic_job/active_kiq"
|
20
|
+
require_relative "acidic_job/extensions/action_mailer"
|
21
|
+
require_relative "acidic_job/extensions/noticed"
|
20
22
|
|
21
23
|
require_relative "acidic_job/serializers/exception_serializer"
|
22
24
|
require_relative "acidic_job/serializers/finished_point_serializer"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: acidic_job
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.beta.
|
4
|
+
version: 1.0.0.beta.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- fractaledmind
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-08-
|
11
|
+
date: 2022-08-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activejob
|
@@ -108,20 +108,6 @@ dependencies:
|
|
108
108
|
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: psych
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - ">"
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '4.0'
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - ">"
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: '4.0'
|
125
111
|
- !ruby/object:Gem::Dependency
|
126
112
|
name: railties
|
127
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -234,20 +220,6 @@ dependencies:
|
|
234
220
|
- - ">="
|
235
221
|
- !ruby/object:Gem::Version
|
236
222
|
version: '0'
|
237
|
-
- !ruby/object:Gem::Dependency
|
238
|
-
name: warning
|
239
|
-
requirement: !ruby/object:Gem::Requirement
|
240
|
-
requirements:
|
241
|
-
- - ">="
|
242
|
-
- !ruby/object:Gem::Version
|
243
|
-
version: '0'
|
244
|
-
type: :development
|
245
|
-
prerelease: false
|
246
|
-
version_requirements: !ruby/object:Gem::Requirement
|
247
|
-
requirements:
|
248
|
-
- - ">="
|
249
|
-
- !ruby/object:Gem::Version
|
250
|
-
version: '0'
|
251
223
|
description: Idempotent operations for Rails apps, built on top of ActiveJob.
|
252
224
|
email:
|
253
225
|
- stephen.margheim@gmail.com
|
@@ -267,17 +239,22 @@ files:
|
|
267
239
|
- UPGRADE_GUIDE.md
|
268
240
|
- acidic_job.gemspec
|
269
241
|
- bin/console
|
270
|
-
- bin/sandbox
|
271
242
|
- bin/setup
|
272
243
|
- blog_post.md
|
273
244
|
- combustion/log/test.log
|
274
|
-
- gemfiles/rails_6.
|
275
|
-
- gemfiles/
|
245
|
+
- gemfiles/rails_6.1_sidekiq_6.4.gemfile
|
246
|
+
- gemfiles/rails_6.1_sidekiq_6.5.gemfile
|
247
|
+
- gemfiles/rails_7.0_sidekiq_6.4.gemfile
|
248
|
+
- gemfiles/rails_7.0_sidekiq_6.5.gemfile
|
249
|
+
- gemfiles/rails_7.1_sidekiq_6.4.gemfile
|
250
|
+
- gemfiles/rails_7.1_sidekiq_6.5.gemfile
|
276
251
|
- lib/acidic_job.rb
|
277
252
|
- lib/acidic_job/active_kiq.rb
|
278
253
|
- lib/acidic_job/arguments.rb
|
279
254
|
- lib/acidic_job/base.rb
|
280
255
|
- lib/acidic_job/errors.rb
|
256
|
+
- lib/acidic_job/extensions/action_mailer.rb
|
257
|
+
- lib/acidic_job/extensions/noticed.rb
|
281
258
|
- lib/acidic_job/finished_point.rb
|
282
259
|
- lib/acidic_job/idempotency_key.rb
|
283
260
|
- lib/acidic_job/logger.rb
|
@@ -293,6 +270,7 @@ files:
|
|
293
270
|
- lib/acidic_job/serializers/range_serializer.rb
|
294
271
|
- lib/acidic_job/serializers/recovery_point_serializer.rb
|
295
272
|
- lib/acidic_job/serializers/worker_serializer.rb
|
273
|
+
- lib/acidic_job/testing.rb
|
296
274
|
- lib/acidic_job/version.rb
|
297
275
|
- lib/acidic_job/workflow.rb
|
298
276
|
- lib/acidic_job/workflow_builder.rb
|