acidic_job 1.0.0.beta.1 → 1.0.0.beta.2

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