acidic_job 0.7.7 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +13 -0
  3. data/.github/workflows/main.yml +36 -12
  4. data/.gitignore +6 -0
  5. data/.rubocop.yml +21 -0
  6. data/.tool-versions +1 -0
  7. data/Gemfile +0 -25
  8. data/Gemfile.lock +176 -74
  9. data/README.md +299 -46
  10. data/UPGRADE_GUIDE.md +81 -0
  11. data/acidic_job.gemspec +15 -2
  12. data/bin/console +5 -2
  13. data/combustion/log/test.log +0 -0
  14. data/gemfiles/rails_6.1_sidekiq_6.4.gemfile +10 -0
  15. data/gemfiles/rails_6.1_sidekiq_6.5.gemfile +10 -0
  16. data/gemfiles/rails_7.0_sidekiq_6.4.gemfile +10 -0
  17. data/gemfiles/rails_7.0_sidekiq_6.5.gemfile +10 -0
  18. data/gemfiles/rails_7.1_sidekiq_6.4.gemfile +10 -0
  19. data/gemfiles/rails_7.1_sidekiq_6.5.gemfile +10 -0
  20. data/lib/acidic_job/active_kiq.rb +114 -0
  21. data/lib/acidic_job/arguments.rb +22 -0
  22. data/lib/acidic_job/base.rb +11 -0
  23. data/lib/acidic_job/errors.rb +11 -17
  24. data/lib/acidic_job/extensions/action_mailer.rb +19 -0
  25. data/lib/acidic_job/extensions/noticed.rb +46 -0
  26. data/lib/acidic_job/{response.rb → finished_point.rb} +5 -7
  27. data/lib/acidic_job/idempotency_key.rb +27 -0
  28. data/lib/acidic_job/logger.rb +31 -0
  29. data/lib/acidic_job/mixin.rb +250 -0
  30. data/lib/acidic_job/perform_wrapper.rb +14 -27
  31. data/lib/acidic_job/processor.rb +95 -0
  32. data/lib/acidic_job/rails.rb +40 -0
  33. data/lib/acidic_job/recovery_point.rb +4 -5
  34. data/lib/acidic_job/run.rb +303 -0
  35. data/lib/acidic_job/serializer.rb +24 -0
  36. data/lib/acidic_job/serializers/exception_serializer.rb +41 -0
  37. data/lib/acidic_job/serializers/finished_point_serializer.rb +24 -0
  38. data/lib/acidic_job/serializers/job_serializer.rb +27 -0
  39. data/lib/acidic_job/serializers/range_serializer.rb +28 -0
  40. data/lib/acidic_job/serializers/recovery_point_serializer.rb +25 -0
  41. data/lib/acidic_job/serializers/worker_serializer.rb +27 -0
  42. data/lib/acidic_job/test_case.rb +9 -0
  43. data/lib/acidic_job/testing.rb +73 -0
  44. data/lib/acidic_job/version.rb +1 -1
  45. data/lib/acidic_job/workflow.rb +70 -0
  46. data/lib/acidic_job/workflow_builder.rb +35 -0
  47. data/lib/acidic_job/workflow_step.rb +103 -0
  48. data/lib/acidic_job.rb +25 -334
  49. data/lib/generators/acidic_job/drop_tables_generator.rb +26 -0
  50. data/lib/generators/acidic_job/install_generator.rb +27 -0
  51. data/lib/generators/acidic_job/templates/create_acidic_job_runs_migration.rb.erb +19 -0
  52. data/lib/generators/{templates/create_acidic_job_keys_migration.rb.erb → acidic_job/templates/drop_acidic_job_keys_migration.rb.erb} +10 -3
  53. metadata +214 -18
  54. data/.ruby_version +0 -1
  55. data/lib/acidic_job/deliver_transactionally_extension.rb +0 -26
  56. data/lib/acidic_job/key.rb +0 -33
  57. data/lib/acidic_job/no_op.rb +0 -11
  58. data/lib/acidic_job/perform_transactionally_extension.rb +0 -33
  59. data/lib/acidic_job/sidekiq_callbacks.rb +0 -45
  60. data/lib/acidic_job/staged.rb +0 -50
  61. data/lib/generators/acidic_job_generator.rb +0 -44
  62. data/lib/generators/templates/create_staged_acidic_jobs_migration.rb.erb +0 -10
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/generators/active_record"
4
+
5
+ module AcidicJob
6
+ module Generators
7
+ class InstallGenerator < ::Rails::Generators::Base
8
+ include ActiveRecord::Generators::Migration
9
+ source_root File.expand_path("templates", __dir__)
10
+
11
+ desc "Generates a migration for the AcidicJob::Run table."
12
+
13
+ # Copies the migration template to db/migrate.
14
+ def copy_acidic_job_runs_migration_files
15
+ migration_template "create_acidic_job_runs_migration.rb.erb",
16
+ "db/migrate/create_acidic_job_runs.rb",
17
+ migration_version: migration_version
18
+ end
19
+
20
+ protected
21
+
22
+ def migration_version
23
+ "[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]"
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,19 @@
1
+ class <%= migration_class_name %> < ActiveRecord::Migration<%= migration_version %>
2
+ def change
3
+ create_table :acidic_job_runs do |t|
4
+ t.boolean :staged, null: false, default: -> { false }
5
+ t.string :idempotency_key, null: false, index: { unique: true }
6
+ t.text :serialized_job, null: false
7
+ t.string :job_class, null: false
8
+ t.datetime :last_run_at, null: true, default: -> { "CURRENT_TIMESTAMP" }
9
+ t.datetime :locked_at, null: true
10
+ t.string :recovery_point, null: true
11
+ t.text :error_object, null: true
12
+ t.text :attr_accessors, null: true
13
+ t.text :workflow, null: true
14
+ t.references :awaited_by, null: true, index: true
15
+ t.text :returning_to, null: true
16
+ t.timestamps
17
+ end
18
+ end
19
+ end
@@ -1,6 +1,6 @@
1
- class CreateAcidicJobKeys < <%= migration_class %>
1
+ class <%= migration_class_name %> < ActiveRecord::Migration<%= migration_version %>
2
2
  def change
3
- create_table :acidic_job_keys do |t|
3
+ drop_table :acidic_job_keys do |t|
4
4
  t.string :idempotency_key, null: false
5
5
  t.string :job_name, null: false
6
6
  t.text :job_args, null: true
@@ -11,10 +11,17 @@ class CreateAcidicJobKeys < <%= migration_class %>
11
11
  t.text :attr_accessors
12
12
  t.text :workflow
13
13
  t.timestamps
14
-
14
+
15
15
  t.index %i[idempotency_key job_name job_args],
16
16
  unique: true,
17
17
  name: "idx_acidic_job_keys_on_idempotency_key_n_job_name_n_job_args"
18
18
  end
19
+
20
+ drop_table :staged_acidic_jobs do |t|
21
+ t.string :adapter, null: false
22
+ t.string :job_name, null: false
23
+ t.text :job_args, null: true
24
+ t.timestamps
25
+ end
19
26
  end
20
27
  end
metadata CHANGED
@@ -1,29 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: acidic_job
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.7
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - fractaledmind
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-11-19 00:00:00.000000000 Z
11
+ date: 2022-08-16 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activejob
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: activerecord
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
31
  - - ">="
18
32
  - !ruby/object:Gem::Version
19
- version: 4.0.0
33
+ version: '0'
20
34
  type: :runtime
21
35
  prerelease: false
22
36
  version_requirements: !ruby/object:Gem::Requirement
23
37
  requirements:
24
38
  - - ">="
25
39
  - !ruby/object:Gem::Version
26
- version: 4.0.0
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: activesupport
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -38,20 +52,174 @@ dependencies:
38
52
  - - ">="
39
53
  - !ruby/object:Gem::Version
40
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: combustion
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
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: minitest
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: net-smtp
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: noticed
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'
41
111
  - !ruby/object:Gem::Dependency
42
112
  name: railties
43
113
  requirement: !ruby/object:Gem::Requirement
44
114
  requirements:
45
115
  - - ">="
46
116
  - !ruby/object:Gem::Version
47
- version: '4.0'
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: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rubocop
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rubocop-minitest
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: rubocop-rake
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
48
174
  type: :development
49
175
  prerelease: false
50
176
  version_requirements: !ruby/object:Gem::Requirement
51
177
  requirements:
52
178
  - - ">="
53
179
  - !ruby/object:Gem::Version
54
- version: '4.0'
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: sidekiq
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: simplecov
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
+ - !ruby/object:Gem::Dependency
210
+ name: sqlite3
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ version: '0'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
55
223
  description: Idempotent operations for Rails apps, built on top of ActiveJob.
56
224
  email:
57
225
  - stephen.margheim@gmail.com
@@ -59,34 +227,61 @@ executables: []
59
227
  extensions: []
60
228
  extra_rdoc_files: []
61
229
  files:
230
+ - ".github/FUNDING.yml"
62
231
  - ".github/workflows/main.yml"
63
232
  - ".gitignore"
64
233
  - ".rubocop.yml"
65
- - ".ruby_version"
234
+ - ".tool-versions"
66
235
  - Gemfile
67
236
  - Gemfile.lock
68
237
  - LICENSE
69
238
  - README.md
70
239
  - Rakefile
240
+ - UPGRADE_GUIDE.md
71
241
  - acidic_job.gemspec
72
242
  - bin/console
73
243
  - bin/setup
74
244
  - blog_post.md
245
+ - 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
75
252
  - lib/acidic_job.rb
76
- - lib/acidic_job/deliver_transactionally_extension.rb
253
+ - lib/acidic_job/active_kiq.rb
254
+ - lib/acidic_job/arguments.rb
255
+ - lib/acidic_job/base.rb
77
256
  - lib/acidic_job/errors.rb
78
- - lib/acidic_job/key.rb
79
- - lib/acidic_job/no_op.rb
80
- - lib/acidic_job/perform_transactionally_extension.rb
257
+ - lib/acidic_job/extensions/action_mailer.rb
258
+ - lib/acidic_job/extensions/noticed.rb
259
+ - lib/acidic_job/finished_point.rb
260
+ - lib/acidic_job/idempotency_key.rb
261
+ - lib/acidic_job/logger.rb
262
+ - lib/acidic_job/mixin.rb
81
263
  - lib/acidic_job/perform_wrapper.rb
264
+ - lib/acidic_job/processor.rb
265
+ - lib/acidic_job/rails.rb
82
266
  - lib/acidic_job/recovery_point.rb
83
- - lib/acidic_job/response.rb
84
- - lib/acidic_job/sidekiq_callbacks.rb
85
- - lib/acidic_job/staged.rb
267
+ - lib/acidic_job/run.rb
268
+ - lib/acidic_job/serializer.rb
269
+ - lib/acidic_job/serializers/exception_serializer.rb
270
+ - lib/acidic_job/serializers/finished_point_serializer.rb
271
+ - lib/acidic_job/serializers/job_serializer.rb
272
+ - lib/acidic_job/serializers/range_serializer.rb
273
+ - lib/acidic_job/serializers/recovery_point_serializer.rb
274
+ - lib/acidic_job/serializers/worker_serializer.rb
275
+ - lib/acidic_job/test_case.rb
276
+ - lib/acidic_job/testing.rb
86
277
  - lib/acidic_job/version.rb
87
- - lib/generators/acidic_job_generator.rb
88
- - lib/generators/templates/create_acidic_job_keys_migration.rb.erb
89
- - lib/generators/templates/create_staged_acidic_jobs_migration.rb.erb
278
+ - lib/acidic_job/workflow.rb
279
+ - lib/acidic_job/workflow_builder.rb
280
+ - lib/acidic_job/workflow_step.rb
281
+ - lib/generators/acidic_job/drop_tables_generator.rb
282
+ - lib/generators/acidic_job/install_generator.rb
283
+ - lib/generators/acidic_job/templates/create_acidic_job_runs_migration.rb.erb
284
+ - lib/generators/acidic_job/templates/drop_acidic_job_keys_migration.rb.erb
90
285
  homepage: https://github.com/fractaledmind/acidic_job
91
286
  licenses:
92
287
  - MIT
@@ -94,6 +289,7 @@ metadata:
94
289
  homepage_uri: https://github.com/fractaledmind/acidic_job
95
290
  source_code_uri: https://github.com/fractaledmind/acidic_job
96
291
  changelog_uri: https://github.com/fractaledmind/acidic_job/CHANGELOG.md
292
+ rubygems_mfa_required: 'true'
97
293
  post_install_message:
98
294
  rdoc_options: []
99
295
  require_paths:
@@ -109,7 +305,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
109
305
  - !ruby/object:Gem::Version
110
306
  version: '0'
111
307
  requirements: []
112
- rubygems_version: 3.2.22
308
+ rubygems_version: 3.3.7
113
309
  signing_key:
114
310
  specification_version: 4
115
311
  summary: Idempotent operations for Rails apps, built on top of ActiveJob.
data/.ruby_version DELETED
@@ -1 +0,0 @@
1
- 2.7.1
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module AcidicJob
4
- module DeliverTransactionallyExtension
5
- # rubocop:disable Metrics/MethodLength
6
- def deliver_transactionally(_options = {})
7
- job = delivery_job_class
8
-
9
- attributes = {
10
- adapter: "activejob",
11
- job_name: job.name
12
- }
13
-
14
- job_args = if job <= ActionMailer::Parameterized::MailDeliveryJob
15
- [@mailer_class.name, @action.to_s, "deliver_now", { params: @params, args: @args }]
16
- else
17
- [@mailer_class.name, @action.to_s, "deliver_now", @params, *@args]
18
- end
19
-
20
- attributes[:job_args] = job.new(job_args).serialize
21
-
22
- AcidicJob::Staged.create!(attributes)
23
- end
24
- # rubocop:enable Metrics/MethodLength
25
- end
26
- end
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "active_record"
4
-
5
- module AcidicJob
6
- class Key < ActiveRecord::Base
7
- RECOVERY_POINT_FINISHED = "FINISHED"
8
-
9
- self.table_name = "acidic_job_keys"
10
-
11
- serialize :error_object
12
- serialize :job_args
13
- serialize :workflow
14
- store :attr_accessors
15
-
16
- validates :idempotency_key, presence: true, uniqueness: { scope: %i[job_name job_args] }
17
- validates :job_name, presence: true
18
- validates :last_run_at, presence: true
19
- validates :recovery_point, presence: true
20
-
21
- def finished?
22
- recovery_point == RECOVERY_POINT_FINISHED
23
- end
24
-
25
- def succeeded?
26
- finished? && !failed?
27
- end
28
-
29
- def failed?
30
- error_object.present?
31
- end
32
- end
33
- end
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Represents an action to perform a no-op. One possible option for a return
4
- # from an #atomic_phase block.
5
- module AcidicJob
6
- class NoOp
7
- def call(_key)
8
- # no-op
9
- end
10
- end
11
- end
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "active_support/concern"
4
-
5
- module AcidicJob
6
- module PerformTransactionallyExtension
7
- extend ActiveSupport::Concern
8
-
9
- class_methods do
10
- # rubocop:disable Metrics/MethodLength
11
- def perform_transactionally(*args)
12
- attributes = if defined?(ActiveJob) && self < ActiveJob::Base
13
- {
14
- adapter: "activejob",
15
- job_name: name,
16
- job_args: job_or_instantiate(*args).serialize
17
- }
18
- elsif defined?(Sidekiq) && include?(Sidekiq::Worker)
19
- {
20
- adapter: "sidekiq",
21
- job_name: name,
22
- job_args: args
23
- }
24
- else
25
- raise UnknownJobAdapter
26
- end
27
-
28
- AcidicJob::Staged.create!(attributes)
29
- end
30
- # rubocop:enable Metrics/MethodLength
31
- end
32
- end
33
- end
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "active_support/callbacks"
4
-
5
- # Following approach used by ActiveJob
6
- # https://github.com/rails/rails/blob/93c9534c9871d4adad4bc33b5edc355672b59c61/activejob/lib/active_job/callbacks.rb
7
- module SidekiqCallbacks
8
- extend ActiveSupport::Concern
9
-
10
- def self.prepended(base)
11
- base.include(ActiveSupport::Callbacks)
12
-
13
- # Check to see if we already have any callbacks for :perform
14
- # Prevents overwriting callbacks if we already included this module (and defined callbacks)
15
- base.define_callbacks :perform unless base.respond_to?(:_perform_callbacks) && base._perform_callbacks.present?
16
-
17
- class << base
18
- prepend ClassMethods
19
- end
20
- end
21
-
22
- def perform(*args)
23
- if respond_to?(:run_callbacks)
24
- run_callbacks :perform do
25
- super(*args)
26
- end
27
- else
28
- super(*args)
29
- end
30
- end
31
-
32
- module ClassMethods
33
- def around_perform(*filters, &blk)
34
- set_callback(:perform, :around, *filters, &blk)
35
- end
36
-
37
- def before_perform(*filters, &blk)
38
- set_callback(:perform, :before, *filters, &blk)
39
- end
40
-
41
- def after_perform(*filters, &blk)
42
- set_callback(:perform, :after, *filters, &blk)
43
- end
44
- end
45
- end
@@ -1,50 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "active_record"
4
- require "global_id"
5
-
6
- module AcidicJob
7
- class Staged < ActiveRecord::Base
8
- self.table_name = "staged_acidic_jobs"
9
-
10
- include GlobalID::Identification
11
-
12
- validates :adapter, presence: true
13
- validates :job_name, presence: true
14
- validates :job_args, presence: true
15
-
16
- serialize :job_args
17
-
18
- after_create_commit :enqueue_job
19
-
20
- private
21
-
22
- # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
23
- def enqueue_job
24
- gid = { "staged_job_gid" => to_global_id.to_s }
25
-
26
- if job_args.is_a?(Hash) && job_args.key?("arguments")
27
- job_args["arguments"].concat([gid])
28
- else
29
- job_args.concat([gid])
30
- end
31
-
32
- case adapter
33
- when "activejob"
34
- job = ActiveJob::Base.deserialize(job_args)
35
- job.enqueue
36
- when "sidekiq"
37
- Sidekiq::Client.push(
38
- "class" => job_name,
39
- "args" => job_args
40
- )
41
- else
42
- raise UnknownJobAdapter.new(adapter: adapter)
43
- end
44
-
45
- # NOTE: record will be deleted after the job has successfully been performed
46
- true
47
- end
48
- # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
49
- end
50
- end
@@ -1,44 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "rails/generators"
4
- require "rails/generators/active_record"
5
-
6
- class AcidicJobGenerator < ActiveRecord::Generators::Base
7
- # ActiveRecord::Generators::Base inherits from Rails::Generators::NamedBase
8
- # which requires a NAME parameter for the new table name.
9
- # Our generator always uses "acidic_job_keys", so we just set a random name here.
10
- argument :name, type: :string, default: "random_name"
11
-
12
- source_root File.expand_path("templates", __dir__)
13
-
14
- def self.next_migration_number(_path)
15
- if instance_variable_defined?("@prev_migration_nr")
16
- @prev_migration_nr += 1
17
- else
18
- @prev_migration_nr = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i
19
- end
20
-
21
- @prev_migration_nr.to_s
22
- end
23
-
24
- # Copies the migration template to db/migrate.
25
- def copy_acidic_job_keys_migration_files
26
- migration_template "create_acidic_job_keys_migration.rb.erb",
27
- "db/migrate/create_acidic_job_keys.rb"
28
- end
29
-
30
- def copy_staged_acidic_jobs_migration_files
31
- migration_template "create_staged_acidic_jobs_migration.rb.erb",
32
- "db/migrate/create_staged_acidic_jobs.rb"
33
- end
34
-
35
- protected
36
-
37
- def migration_class
38
- if ActiveRecord::VERSION::MAJOR >= 5
39
- ActiveRecord::Migration["#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}"]
40
- else
41
- ActiveRecord::Migration
42
- end
43
- end
44
- end
@@ -1,10 +0,0 @@
1
- class CreateStagedAcidicJobs < <%= migration_class %>
2
- def change
3
- create_table :staged_acidic_jobs do |t|
4
- t.string :adapter, null: false
5
- t.string :job_name, null: false
6
- t.text :job_args, null: true
7
- t.timestamps
8
- end
9
- end
10
- end