acidic_job 0.8.5 → 1.0.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/main.yml +2 -3
  3. data/.gitignore +1 -1
  4. data/Gemfile.lock +10 -4
  5. data/README.md +122 -122
  6. data/acidic_job.gemspec +2 -0
  7. data/bin/sandbox +1958 -0
  8. data/gemfiles/{rails_6.1_sidekiq_6.4.gemfile → rails_6.1.gemfile} +0 -2
  9. data/gemfiles/{rails_7.0_sidekiq_6.5.gemfile → rails_7.0.gemfile} +0 -2
  10. data/lib/acidic_job/active_kiq.rb +9 -38
  11. data/lib/acidic_job/errors.rb +0 -1
  12. data/lib/acidic_job/mixin.rb +19 -30
  13. data/lib/acidic_job/perform_wrapper.rb +5 -5
  14. data/lib/acidic_job/processor.rb +9 -8
  15. data/lib/acidic_job/run.rb +2 -6
  16. data/lib/acidic_job/serializer.rb +2 -2
  17. data/lib/acidic_job/serializers/exception_serializer.rb +1 -1
  18. data/lib/acidic_job/serializers/job_serializer.rb +14 -6
  19. data/lib/acidic_job/serializers/worker_serializer.rb +6 -4
  20. data/lib/acidic_job/version.rb +1 -1
  21. data/lib/acidic_job/workflow.rb +8 -0
  22. data/lib/acidic_job.rb +10 -9
  23. metadata +35 -19
  24. data/.github/FUNDING.yml +0 -13
  25. data/gemfiles/rails_6.1_sidekiq_6.5.gemfile +0 -10
  26. data/gemfiles/rails_7.0_sidekiq_6.4.gemfile +0 -10
  27. data/gemfiles/rails_7.1_sidekiq_6.4.gemfile +0 -10
  28. data/gemfiles/rails_7.1_sidekiq_6.5.gemfile +0 -10
  29. data/lib/acidic_job/configured_job.rb +0 -11
  30. data/lib/acidic_job/extensions/action_mailer.rb +0 -19
  31. data/lib/acidic_job/extensions/noticed.rb +0 -46
  32. data/lib/acidic_job/perform_acidicly.rb +0 -23
  33. data/lib/acidic_job/rails.rb +0 -43
  34. data/lib/acidic_job/serializers/active_kiq_serializer.rb +0 -25
  35. data/lib/acidic_job/test_case.rb +0 -9
  36. data/lib/acidic_job/testing.rb +0 -73
@@ -5,6 +5,4 @@ source "https://rubygems.org"
5
5
  gem "activemodel", "~> 6.1.0"
6
6
  gem "railties", "~> 6.1.0"
7
7
 
8
- gem "sidekiq", "~> 6.4.0"
9
-
10
8
  gemspec path: "../"
@@ -5,6 +5,4 @@ source "https://rubygems.org"
5
5
  gem "activemodel", "~> 7.0.0"
6
6
  gem "railties", "~> 7.0.0"
7
7
 
8
- gem "sidekiq", "~> 6.5.0"
9
-
10
8
  gemspec path: "../"
@@ -13,29 +13,11 @@ module AcidicJob
13
13
  define_callbacks :perform
14
14
  include Mixin
15
15
 
16
- concerning :Configuring do
17
- # Configures the job with the given options.
18
- def set(options = {}) # :nodoc:
19
- self.scheduled_at = options[:wait].seconds.from_now.to_f if options[:wait]
20
- self.scheduled_at = options[:wait_until].to_f if options[:wait_until]
21
- self.queue_name = self.class.queue_name_from_part(options[:queue]) if options[:queue]
22
-
23
- self
24
- end
25
- end
26
-
27
16
  concerning :Initializing do
28
- class_methods do
29
- def job_or_instantiate(*args)
30
- args.first.is_a?(self) ? args.first : new(*args)
31
- end
32
- end
33
-
34
17
  included do
35
18
  attr_accessor :arguments
36
19
  attr_accessor :job_id
37
20
  attr_accessor :queue_name
38
- attr_accessor :scheduled_at
39
21
  attr_accessor :sidekiq_options
40
22
  end
41
23
  ##
@@ -43,9 +25,9 @@ module AcidicJob
43
25
  # +args+ are the arguments, if any, that will be passed to the perform method
44
26
  # +opts+ are any options to configure the job
45
27
  def initialize(*arguments)
46
- @arguments = arguments
47
- @job_id = ::SecureRandom.uuid
48
- @sidekiq_options = sidekiq_options_hash || ::Sidekiq.default_job_options
28
+ @arguments = arguments
29
+ @job_id = SecureRandom.uuid
30
+ @sidekiq_options = sidekiq_options_hash || Sidekiq.default_job_options
49
31
  @queue_name = @sidekiq_options["queue"]
50
32
  end
51
33
 
@@ -61,33 +43,22 @@ module AcidicJob
61
43
 
62
44
  concerning :Performing do
63
45
  class_methods do
64
- def perform_later(*args)
65
- perform_async(*args)
66
- end
67
-
68
- def perform_now(*args)
69
- perform_inline(*args)
46
+ def perform_now(*args, **kwargs)
47
+ new.perform(*args, **kwargs)
70
48
  end
71
49
  end
72
50
 
73
- def perform_later(*args)
74
- Setter.new(self.class, {}).perform_async(*args)
75
- end
76
-
77
- def perform_now(*args)
78
- Setter.new(self.class, {}).perform_inline(*args)
51
+ def perform_now(*args, **kwargs)
52
+ perform(*args, **kwargs)
79
53
  end
80
54
 
81
55
  def enqueue
82
- item = {
56
+ ::Sidekiq::Client.push(
83
57
  "class" => self.class,
84
58
  "args" => @arguments,
85
59
  "jid" => @job_id,
86
60
  "queue" => @queue_name
87
- }
88
- item["at"] = @scheduled_at if @scheduled_at
89
-
90
- ::Sidekiq::Client.push(item)
61
+ )
91
62
  end
92
63
  end
93
64
 
@@ -15,5 +15,4 @@ module AcidicJob
15
15
  class UnserializableValue < Error; end
16
16
  class LockedIdempotencyKey < Error; end
17
17
  class MismatchedIdempotencyKeyAndJobArguments < Error; end
18
- class MissingBlockArgument < Error; end
19
18
  end
@@ -7,11 +7,12 @@ module AcidicJob
7
7
  extend ActiveSupport::Concern
8
8
 
9
9
  def self.wire_up(other)
10
+ raise UnknownJobAdapter unless (defined?(::ActiveJob::Base) && other < ::ActiveJob::Base) ||
11
+ (defined?(::Sidekiq::Worker) && other.include?(::Sidekiq::Worker))
12
+
10
13
  # Ensure our `perform` method always runs first to gather parameters
11
14
  # and run perform callbacks for Sidekiq workers
12
15
  other.prepend PerformWrapper
13
- # Ensure both configured and base jobs can be performed acidicly
14
- other.include PerformAcidicly
15
16
 
16
17
  # By default, we unique job runs by the `job_id`
17
18
  other.instance_variable_set(:@acidic_identifier, :job_id)
@@ -20,7 +21,7 @@ module AcidicJob
20
21
  # You could unique job runs by the arguments passed to the job (e.g. memoization)
21
22
  other.define_singleton_method(:acidic_by_job_arguments) { @acidic_identifier = :job_arguments }
22
23
  # Or, you could unique jobs run by any logic you'd like using a block
23
- other.define_singleton_method(:acidic_by) { |proc = nil, &block| @acidic_identifier = proc || block }
24
+ other.define_singleton_method(:acidic_by) { |&block| @acidic_identifier = block }
24
25
 
25
26
  # We add a callback to ensure that staged, non-workflow jobs are "finished" after they are "performed".
26
27
  # This allows us to ensure that we can always inspect whether a run is finished and get correct data
@@ -42,6 +43,15 @@ module AcidicJob
42
43
  super
43
44
  end
44
45
 
46
+ # `perform_now` runs a job synchronously and immediately
47
+ # `perform_later` runs a job asynchronously and queues it immediately
48
+ # `perform_acidicly` run a job asynchronously and queues it after a successful database commit
49
+ def perform_acidicly(*args)
50
+ job = new(*args)
51
+
52
+ Run.stage!(job)
53
+ end
54
+
45
55
  # Instantiate an instance of a job ready for serialization
46
56
  def with(...)
47
57
  # New delegation syntax (...) was introduced in Ruby 2.7.
@@ -51,26 +61,12 @@ module AcidicJob
51
61
  job.queue_name
52
62
  job
53
63
  end
54
-
55
- def set(options = {})
56
- ::AcidicJob::ConfiguredJob.new(self, options)
57
- end
58
64
  end
59
65
 
60
66
  def idempotency_key
61
67
  IdempotencyKey.new(self).value(acidic_by: acidic_identifier)
62
68
  end
63
69
 
64
- # Configures the job with the given options.
65
- def set(options = {}) # :nodoc:
66
- self.scheduled_at = options[:wait].seconds.from_now.to_f if options[:wait]
67
- self.scheduled_at = options[:wait_until].to_f if options[:wait_until]
68
- self.queue_name = self.class.queue_name_from_part(options[:queue]) if options[:queue]
69
- self.priority = options[:priority].to_i if options[:priority]
70
-
71
- self
72
- end
73
-
74
70
  protected
75
71
 
76
72
  # Short circuits execution by sending execution right to 'finished'.
@@ -80,16 +76,17 @@ module AcidicJob
80
76
  end
81
77
 
82
78
  def with_acidic_workflow(persisting: {}, &block)
83
- raise UnknownJobAdapter unless known_job_adapter?
84
-
85
79
  raise RedefiningWorkflow if defined? @workflow_builder
86
80
 
87
81
  @workflow_builder = WorkflowBuilder.new
88
82
 
89
83
  raise MissingWorkflowBlock, "A block must be passed to `with_acidic_workflow`" unless block_given?
90
- raise MissingBlockArgument, "An argument must be passed to the `with_acidic_workflow` block" if block.arity.zero?
91
84
 
92
- block.call @workflow_builder
85
+ if block.arity.zero?
86
+ @workflow_builder.instance_exec(&block)
87
+ else
88
+ yield @workflow_builder
89
+ end
93
90
 
94
91
  raise NoDefinedSteps if @workflow_builder.steps.empty?
95
92
 
@@ -233,7 +230,7 @@ module AcidicJob
233
230
 
234
231
  # "STG__#{idempotency_key}__#{encoded_global_id}"
235
232
  _prefix, _idempotency_key, encoded_global_id = job_id.split("__")
236
- staged_job_gid = "gid://#{::Base64.urlsafe_decode64(encoded_global_id)}"
233
+ staged_job_gid = "gid://#{::Base64.decode64(encoded_global_id)}"
237
234
 
238
235
  @staged_job_run = ::GlobalID::Locator.locate(staged_job_gid)
239
236
  end
@@ -252,13 +249,5 @@ module AcidicJob
252
249
  :serializable
253
250
  end
254
251
  end
255
-
256
- def known_job_adapter?
257
- return true if defined?(::AcidicJob::Base) && self.class < ::AcidicJob::Base
258
- return true if defined?(::AcidicJob::ActiveKiq) && self.class < ::AcidicJob::ActiveKiq
259
- return true if defined?(::ActiveJob) && self.class < ::ActiveJob::Base
260
-
261
- false
262
- end
263
252
  end
264
253
  end
@@ -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, **kwargs)
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
- if defined?(::ActiveJob) && self.class < ::ActiveJob::Base
12
- super(*args)
13
- elsif defined?(::Sidekiq) && self.class.include?(::Sidekiq::Worker)
11
+ if defined?(ActiveJob) && self.class < ActiveJob::Base
12
+ super(*args, **kwargs)
13
+ elsif defined?(Sidekiq) && self.class.include?(Sidekiq::Worker)
14
14
  run_callbacks :perform do
15
- super(*args)
15
+ super(*args, **kwargs)
16
16
  end
17
17
  else
18
18
  raise UnknownJobAdapter
@@ -19,7 +19,7 @@ module AcidicJob
19
19
  if !@run.known_recovery_point?
20
20
  raise UnknownRecoveryPoint,
21
21
  "Defined workflow does not reference this step: #{@run.current_step_name.inspect}"
22
- elsif (awaited_jobs = jobs_from(@run.current_step_awaits)).any?
22
+ elsif !Array(awaited_jobs = @run.current_step_hash.fetch("awaits", [])).compact.empty?
23
23
  # We only execute the current step, without progressing to the next step.
24
24
  # This ensures that any failures in parallel jobs will have this step retried in the main workflow
25
25
  step_result = @workflow.execute_current_step
@@ -47,12 +47,14 @@ module AcidicJob
47
47
 
48
48
  private
49
49
 
50
- def enqueue_awaited_jobs(awaited_jobs, step_result)
50
+ def enqueue_awaited_jobs(jobs_or_jobs_getter, step_result)
51
+ awaited_jobs = jobs_from(jobs_or_jobs_getter)
52
+
51
53
  AcidicJob.logger.log_run_event("Enqueuing #{awaited_jobs.count} awaited jobs...", @job, @run)
52
54
  # All jobs created in the block are pushed atomically at the end of the block.
53
55
  AcidicJob::Run.transaction do
54
56
  awaited_jobs.each do |awaited_job|
55
- worker_class, args = job_and_args(awaited_job)
57
+ worker_class, args = job_args_and_kwargs(awaited_job)
56
58
 
57
59
  job = worker_class.new(*args)
58
60
 
@@ -65,11 +67,10 @@ module AcidicJob
65
67
  def jobs_from(jobs_or_jobs_getter)
66
68
  case jobs_or_jobs_getter
67
69
  when Array
68
- jobs_or_jobs_getter.compact
70
+ jobs_or_jobs_getter
69
71
  when Symbol, String
70
- if @job.respond_to?(jobs_or_jobs_getter, _include_private = true)
71
- jobs = @job.method(jobs_or_jobs_getter).call
72
- Array(jobs).compact
72
+ if @job.respond_to?(jobs_or_jobs_getter)
73
+ @job.method(jobs_or_jobs_getter).call
73
74
  else
74
75
  raise UnknownAwaitedJob,
75
76
  "Invalid `awaits`; unknown method `#{jobs_or_jobs_getter}` for this job"
@@ -80,7 +81,7 @@ module AcidicJob
80
81
  end
81
82
  end
82
83
 
83
- def job_and_args(job)
84
+ def job_args_and_kwargs(job)
84
85
  case job
85
86
  when Class
86
87
  [job, []]
@@ -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.try(:idempotency_key) || job.job_id
120
+ idempotency_key: job.idempotency_key
121
121
  )
122
122
  end
123
123
  end
@@ -130,7 +130,7 @@ module AcidicJob
130
130
  # encode the identifier for this record in the job ID
131
131
  global_id = to_global_id.to_s.remove("gid://")
132
132
  # base64 encoding for minimal security
133
- encoded_global_id = Base64.urlsafe_encode64(global_id, padding: false)
133
+ encoded_global_id = Base64.encode64(global_id).strip
134
134
 
135
135
  [
136
136
  STAGED_JOB_ID_PREFIX,
@@ -173,10 +173,6 @@ module AcidicJob
173
173
  current_step_hash.fetch("then")
174
174
  end
175
175
 
176
- def current_step_awaits
177
- current_step_hash["awaits"]
178
- end
179
-
180
176
  def next_step_finishes?
181
177
  next_step_name.to_s == FINISHED_RECOVERY_POINT
182
178
  end
@@ -10,11 +10,11 @@ module AcidicJob
10
10
  return if json.nil? || json.empty?
11
11
 
12
12
  data = JSON.parse(json)
13
- Arguments.send :deserialize_argument, data
13
+ Arguments.deserialize(data).first
14
14
  end
15
15
 
16
16
  def dump(obj)
17
- data = Arguments.send :serialize_argument, obj
17
+ data = Arguments.serialize [obj]
18
18
  data.to_json
19
19
  rescue ActiveJob::SerializationError
20
20
  raise UnserializableValue
@@ -13,7 +13,7 @@ module AcidicJob
13
13
  "backtrace" => {}
14
14
  }
15
15
 
16
- exception&.backtrace&.map do |trace|
16
+ exception.backtrace.map do |trace|
17
17
  path, _, location = trace.rpartition("/")
18
18
 
19
19
  next if hash["backtrace"].key?(path)
@@ -6,16 +6,24 @@ module AcidicJob
6
6
  module Serializers
7
7
  class JobSerializer < ::ActiveJob::Serializers::ObjectSerializer
8
8
  def serialize(job)
9
- # don't serialize the `enqueued_at` value, as ActiveRecord will check if the Run record has changed
10
- # by comparing the deserialized database value with a temporary in-memory generated value.
11
- # That temporary in-memory generated value can sometimes have an `enqueued_at` value that is 1 second off
12
- # from the original. In this case, ActiveRecord will think the record has unsaved changes and block the lock.
13
- super(job.serialize.except("enqueued_at"))
9
+ super(job.serialize)
14
10
  end
15
11
 
16
12
  def deserialize(hash)
17
- job = ::ActiveJob::Base.deserialize(hash)
13
+ job = ActiveJob::Base.deserialize(hash)
18
14
  job.send(:deserialize_arguments_if_needed)
15
+ # this is a shim to ensure we can work with Ruby 2.7 as well as 3.0+
16
+ # :nocov:
17
+ if job.arguments.last.is_a?(Hash)
18
+ *args, kwargs = job.arguments
19
+ else
20
+ args = job.arguments
21
+ kwargs = {}
22
+ end
23
+ # :nocov:
24
+ job.instance_variable_set(:@__acidic_job_args, args)
25
+ job.instance_variable_set(:@__acidic_job_kwargs, kwargs)
26
+
19
27
  job
20
28
  end
21
29
 
@@ -2,24 +2,26 @@
2
2
 
3
3
  require "active_job/serializers/object_serializer"
4
4
 
5
+ # :nocov:
5
6
  module AcidicJob
6
7
  module Serializers
7
8
  class WorkerSerializer < ::ActiveJob::Serializers::ObjectSerializer
8
9
  def serialize(worker)
9
10
  super(
10
- "job_class" => worker.class.name
11
+ "job_class" => worker.class.name,
12
+ "arguments" => worker.arguments,
11
13
  )
12
14
  end
13
15
 
14
16
  def deserialize(hash)
15
17
  worker_class = hash["job_class"].constantize
16
- worker_class.new
18
+ worker_class.new(*hash["arguments"])
17
19
  end
18
20
 
19
21
  def serialize?(argument)
20
- defined?(::Sidekiq) && argument.class.include?(::Sidekiq::Worker) &&
21
- !(defined?(::AcidicJob::ActiveKiq) && argument.class < ::AcidicJob::ActiveKiq)
22
+ defined?(::Sidekiq) && argument.class.include?(::Sidekiq::Worker)
22
23
  end
23
24
  end
24
25
  end
25
26
  end
27
+ # :nocov:
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module AcidicJob
4
- VERSION = "0.8.5"
4
+ VERSION = "1.0.0.beta.1"
5
5
  end
@@ -50,6 +50,10 @@ module AcidicJob
50
50
  wrapped_method = WorkflowStep.new(run: @run, job: @job).wrapped
51
51
  current_step = @run.current_step_name
52
52
 
53
+ # can't reproduce yet, but saw a bug in production where
54
+ # nested awaits workflows had an unsaved `workflow` attribute
55
+ @run.save! if @run.has_changes_to_save?
56
+
53
57
  AcidicJob.logger.log_run_event("Executing #{current_step}...", @job, @run)
54
58
  @run.with_lock do
55
59
  @step_result = wrapped_method.call(@run)
@@ -60,6 +64,10 @@ module AcidicJob
60
64
  def run_step_result
61
65
  next_step = @run.next_step_name
62
66
 
67
+ # can't reproduce yet, but saw a bug in production where
68
+ # nested awaits workflows had an unsaved `workflow` attribute
69
+ @run.save! if @run.has_changes_to_save?
70
+
63
71
  AcidicJob.logger.log_run_event("Progressing to #{next_step}...", @job, @run)
64
72
  @run.with_lock do
65
73
  @step_result.call(run: @run)
data/lib/acidic_job.rb CHANGED
@@ -5,7 +5,6 @@ require_relative "acidic_job/errors"
5
5
  require_relative "acidic_job/logger"
6
6
  require_relative "acidic_job/arguments"
7
7
  require_relative "acidic_job/serializer"
8
- require_relative "acidic_job/configured_job"
9
8
  require_relative "acidic_job/workflow_builder"
10
9
  require_relative "acidic_job/idempotency_key"
11
10
  require_relative "acidic_job/recovery_point"
@@ -15,23 +14,25 @@ require_relative "acidic_job/workflow_step"
15
14
  require_relative "acidic_job/workflow"
16
15
  require_relative "acidic_job/processor"
17
16
  require_relative "acidic_job/perform_wrapper"
18
- require_relative "acidic_job/perform_acidicly"
19
- require_relative "acidic_job/extensions/action_mailer"
20
- require_relative "acidic_job/extensions/noticed"
21
17
  require_relative "acidic_job/mixin"
22
18
  require_relative "acidic_job/base"
23
- # require_relative "acidic_job/active_kiq"
19
+ require_relative "acidic_job/active_kiq"
24
20
 
25
- require "active_job/serializers"
26
21
  require_relative "acidic_job/serializers/exception_serializer"
27
22
  require_relative "acidic_job/serializers/finished_point_serializer"
28
23
  require_relative "acidic_job/serializers/job_serializer"
29
24
  require_relative "acidic_job/serializers/range_serializer"
30
25
  require_relative "acidic_job/serializers/recovery_point_serializer"
31
26
  require_relative "acidic_job/serializers/worker_serializer"
32
- require_relative "acidic_job/serializers/active_kiq_serializer"
33
-
34
- require_relative "acidic_job/rails"
27
+ require "active_job/serializers"
35
28
 
36
29
  module AcidicJob
30
+ ::ActiveJob::Serializers.add_serializers(
31
+ Serializers::ExceptionSerializer,
32
+ Serializers::FinishedPointSerializer,
33
+ Serializers::JobSerializer,
34
+ Serializers::RangeSerializer,
35
+ Serializers::RecoveryPointSerializer,
36
+ Serializers::WorkerSerializer
37
+ )
37
38
  end
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: 0.8.5
4
+ version: 1.0.0.beta.1
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-31 00:00:00.000000000 Z
11
+ date: 2022-08-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activejob
@@ -108,6 +108,20 @@ 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'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: railties
113
127
  requirement: !ruby/object:Gem::Requirement
@@ -220,6 +234,20 @@ dependencies:
220
234
  - - ">="
221
235
  - !ruby/object:Gem::Version
222
236
  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'
223
251
  description: Idempotent operations for Rails apps, built on top of ActiveJob.
224
252
  email:
225
253
  - stephen.margheim@gmail.com
@@ -227,7 +255,6 @@ executables: []
227
255
  extensions: []
228
256
  extra_rdoc_files: []
229
257
  files:
230
- - ".github/FUNDING.yml"
231
258
  - ".github/workflows/main.yml"
232
259
  - ".gitignore"
233
260
  - ".rubocop.yml"
@@ -240,43 +267,32 @@ files:
240
267
  - UPGRADE_GUIDE.md
241
268
  - acidic_job.gemspec
242
269
  - bin/console
270
+ - bin/sandbox
243
271
  - bin/setup
244
272
  - blog_post.md
245
273
  - combustion/log/test.log
246
- - gemfiles/rails_6.1_sidekiq_6.4.gemfile
247
- - gemfiles/rails_6.1_sidekiq_6.5.gemfile
248
- - gemfiles/rails_7.0_sidekiq_6.4.gemfile
249
- - gemfiles/rails_7.0_sidekiq_6.5.gemfile
250
- - gemfiles/rails_7.1_sidekiq_6.4.gemfile
251
- - gemfiles/rails_7.1_sidekiq_6.5.gemfile
274
+ - gemfiles/rails_6.1.gemfile
275
+ - gemfiles/rails_7.0.gemfile
252
276
  - lib/acidic_job.rb
253
277
  - lib/acidic_job/active_kiq.rb
254
278
  - lib/acidic_job/arguments.rb
255
279
  - lib/acidic_job/base.rb
256
- - lib/acidic_job/configured_job.rb
257
280
  - lib/acidic_job/errors.rb
258
- - lib/acidic_job/extensions/action_mailer.rb
259
- - lib/acidic_job/extensions/noticed.rb
260
281
  - lib/acidic_job/finished_point.rb
261
282
  - lib/acidic_job/idempotency_key.rb
262
283
  - lib/acidic_job/logger.rb
263
284
  - lib/acidic_job/mixin.rb
264
- - lib/acidic_job/perform_acidicly.rb
265
285
  - lib/acidic_job/perform_wrapper.rb
266
286
  - lib/acidic_job/processor.rb
267
- - lib/acidic_job/rails.rb
268
287
  - lib/acidic_job/recovery_point.rb
269
288
  - lib/acidic_job/run.rb
270
289
  - lib/acidic_job/serializer.rb
271
- - lib/acidic_job/serializers/active_kiq_serializer.rb
272
290
  - lib/acidic_job/serializers/exception_serializer.rb
273
291
  - lib/acidic_job/serializers/finished_point_serializer.rb
274
292
  - lib/acidic_job/serializers/job_serializer.rb
275
293
  - lib/acidic_job/serializers/range_serializer.rb
276
294
  - lib/acidic_job/serializers/recovery_point_serializer.rb
277
295
  - lib/acidic_job/serializers/worker_serializer.rb
278
- - lib/acidic_job/test_case.rb
279
- - lib/acidic_job/testing.rb
280
296
  - lib/acidic_job/version.rb
281
297
  - lib/acidic_job/workflow.rb
282
298
  - lib/acidic_job/workflow_builder.rb
@@ -304,9 +320,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
304
320
  version: 2.7.0
305
321
  required_rubygems_version: !ruby/object:Gem::Requirement
306
322
  requirements:
307
- - - ">="
323
+ - - ">"
308
324
  - !ruby/object:Gem::Version
309
- version: '0'
325
+ version: 1.3.1
310
326
  requirements: []
311
327
  rubygems_version: 3.3.7
312
328
  signing_key:
data/.github/FUNDING.yml DELETED
@@ -1,13 +0,0 @@
1
- # These are supported funding model platforms
2
-
3
- github: fractaledmind
4
- patreon: # Replace with a single Patreon username
5
- open_collective: # Replace with a single Open Collective username
6
- ko_fi: # Replace with a single Ko-fi username
7
- tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8
- community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9
- liberapay: # Replace with a single Liberapay username
10
- issuehunt: # Replace with a single IssueHunt username
11
- otechie: # Replace with a single Otechie username
12
- lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
13
- custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "activemodel", "~> 6.1.0"
6
- gem "railties", "~> 6.1.0"
7
-
8
- gem "sidekiq", "~> 6.5.0"
9
-
10
- gemspec path: "../"
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "activemodel", "~> 7.0.0"
6
- gem "railties", "~> 7.0.0"
7
-
8
- gem "sidekiq", "~> 6.4.0"
9
-
10
- gemspec path: "../"
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "activemodel", "~> 7.1.0"
6
- gem "railties", "~> 7.1.0"
7
-
8
- gem "sidekiq", "~> 6.4.0"
9
-
10
- gemspec path: "../"
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "activemodel", "~> 7.1.0"
6
- gem "railties", "~> 7.1.0"
7
-
8
- gem "sidekiq", "~> 6.5.0"
9
-
10
- gemspec path: "../"