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.
@@ -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
@@ -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, **kwargs)
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, **kwargs)
12
+ super(*args)
13
13
  elsif defined?(Sidekiq) && self.class.include?(Sidekiq::Worker)
14
14
  run_callbacks :perform do
15
- super(*args, **kwargs)
15
+ super(*args)
16
16
  end
17
17
  else
18
18
  raise UnknownJobAdapter
@@ -117,7 +117,7 @@ module AcidicJob
117
117
  staged: true,
118
118
  job_class: job.class.name,
119
119
  serialized_job: job.serialize,
120
- idempotency_key: job.idempotency_key
120
+ idempotency_key: job.try(:idempotency_key) || job.job_id
121
121
  )
122
122
  end
123
123
  end
@@ -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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module AcidicJob
4
- VERSION = "1.0.0.beta.1"
4
+ VERSION = "1.0.0.beta.2"
5
5
  end
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.1
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-07 00:00:00.000000000 Z
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.1.gemfile
275
- - gemfiles/rails_7.0.gemfile
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