activejob 7.0.8 → 7.1.3.4

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.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +166 -129
  3. data/MIT-LICENSE +1 -1
  4. data/README.md +2 -2
  5. data/lib/active_job/arguments.rb +28 -31
  6. data/lib/active_job/base.rb +1 -1
  7. data/lib/active_job/callbacks.rb +3 -5
  8. data/lib/active_job/configured_job.rb +4 -0
  9. data/lib/active_job/core.rb +26 -6
  10. data/lib/active_job/deprecator.rb +7 -0
  11. data/lib/active_job/enqueuing.rb +31 -1
  12. data/lib/active_job/exceptions.rb +48 -5
  13. data/lib/active_job/execution.rb +5 -1
  14. data/lib/active_job/gem_version.rb +4 -4
  15. data/lib/active_job/instrumentation.rb +18 -10
  16. data/lib/active_job/log_subscriber.rb +80 -8
  17. data/lib/active_job/queue_adapter.rb +13 -2
  18. data/lib/active_job/queue_adapters/async_adapter.rb +2 -2
  19. data/lib/active_job/queue_adapters/backburner_adapter.rb +7 -3
  20. data/lib/active_job/queue_adapters/delayed_job_adapter.rb +1 -1
  21. data/lib/active_job/queue_adapters/inline_adapter.rb +1 -1
  22. data/lib/active_job/queue_adapters/queue_classic_adapter.rb +4 -4
  23. data/lib/active_job/queue_adapters/resque_adapter.rb +1 -1
  24. data/lib/active_job/queue_adapters/sidekiq_adapter.rb +42 -14
  25. data/lib/active_job/queue_adapters/sneakers_adapter.rb +1 -1
  26. data/lib/active_job/queue_adapters/sucker_punch_adapter.rb +3 -3
  27. data/lib/active_job/queue_adapters/test_adapter.rb +3 -3
  28. data/lib/active_job/queue_adapters.rb +8 -7
  29. data/lib/active_job/queue_priority.rb +18 -1
  30. data/lib/active_job/railtie.rb +25 -6
  31. data/lib/active_job/serializers/big_decimal_serializer.rb +22 -0
  32. data/lib/active_job/serializers/duration_serializer.rb +4 -2
  33. data/lib/active_job/serializers/time_with_zone_serializer.rb +11 -2
  34. data/lib/active_job/serializers.rb +7 -3
  35. data/lib/active_job/test_helper.rb +32 -14
  36. data/lib/active_job/version.rb +1 -1
  37. data/lib/active_job.rb +26 -4
  38. data/lib/rails/generators/job/USAGE +19 -0
  39. data/lib/rails/generators/job/job_generator.rb +6 -2
  40. data/lib/rails/generators/job/templates/job.rb.tt +1 -1
  41. metadata +11 -9
  42. data/lib/active_job/queue_adapters/que_adapter.rb +0 -61
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 235128c7d980f87db5c8868459c333bd46426236218aae248293461011c39f82
4
- data.tar.gz: d8c90ea58afcb522bb34846a4356dbc4f06063d3edd89b1486bce21d07b0272f
3
+ metadata.gz: c13b1ea6ba1e35ea17b2a2051b76b2d12912e746120f5c85170839cb43432e1f
4
+ data.tar.gz: fd72f8bf538fe535a8cc8faa22671392789459265618228cbeda8cee73cc0cf5
5
5
  SHA512:
6
- metadata.gz: de04d283bcec657df1b29faa766d084c95820ef6f0505633484a8e15e6421a8e1313cb2727a9dfc6b09c280f1e4a1533a0673ceb0489ac674834ec0fbbd65bf2
7
- data.tar.gz: 3c9bb2aa0e47b7482a3ec51e25747c0952f457f6770ddbbeaa56b7c6bac137a2046a8df778237fb4a2500b533962711b1d5e0b5efceaff49bb3d2cf725fc4f0b
6
+ metadata.gz: 0bc47ff3a65ba512ce75d6f33c9bcf59319eb3e749753f961cf4073b8785d48816f7a28d373675f4d710886b5e967474ff9f543f6ec0e697418397990f09ac92
7
+ data.tar.gz: e69b622ce5699395aab14669d9afb5116743d6186530031c30a907c52ad8a622e08c256458d417af5fbeeb5a61e6a4c6a9fd4731ba38cb836e1b159004de75ea
data/CHANGELOG.md CHANGED
@@ -1,246 +1,283 @@
1
- ## Rails 7.0.8 (September 09, 2023) ##
1
+ ## Rails 7.1.3.4 (June 04, 2024) ##
2
2
 
3
- * Fix Active Job log message to correctly report a job failed to enqueue
4
- when the adapter raises an `ActiveJob::EnqueueError`.
5
-
6
- *Ben Sheldon*
3
+ * No changes.
7
4
 
8
5
 
9
- ## Rails 7.0.7.2 (August 22, 2023) ##
6
+ ## Rails 7.1.3.3 (May 16, 2024) ##
10
7
 
11
8
  * No changes.
12
9
 
13
10
 
14
- ## Rails 7.0.7.1 (August 22, 2023) ##
11
+ ## Rails 7.1.3.2 (February 21, 2024) ##
15
12
 
16
13
  * No changes.
17
14
 
18
15
 
19
- ## Rails 7.0.7 (August 09, 2023) ##
16
+ ## Rails 7.1.3.1 (February 21, 2024) ##
20
17
 
21
18
  * No changes.
22
19
 
23
20
 
24
- ## Rails 7.0.6 (June 29, 2023) ##
21
+ ## Rails 7.1.3 (January 16, 2024) ##
25
22
 
26
- * Fix error Active Job passed class with `permitted?`.
23
+ * Do not trigger immediate loading of `ActiveJob::Base` when loading `ActiveJob::TestHelper`.
27
24
 
28
- *Alex Baldwin*
25
+ *Maxime Réty*
29
26
 
27
+ * Preserve the serialized timezone when deserializing `ActiveSupport::TimeWithZone` arguments.
30
28
 
31
- ## Rails 7.0.5.1 (June 26, 2023) ##
29
+ *Joshua Young*
32
30
 
33
- * No changes.
31
+ * Fix ActiveJob arguments serialization to correctly serialize String subclasses having custom serializers.
32
+
33
+ *fatkodima*
34
34
 
35
35
 
36
- ## Rails 7.0.5 (May 24, 2023) ##
36
+ ## Rails 7.1.2 (November 10, 2023) ##
37
37
 
38
- * Make delayed job `display_name` failsafe.
38
+ * No changes.
39
39
 
40
- *codez*
41
40
 
42
- * Don't double log the `job` when using `ActiveRecord::QueryLog`
41
+ ## Rails 7.1.1 (October 11, 2023) ##
43
42
 
44
- Previously if you set `config.active_record.query_log_tags` to an array that included
45
- `:job`, the job name would get logged twice. This bug has been fixed.
43
+ * Don't log enqueuing details when the job wasn't enqueued.
46
44
 
47
- *Alex Ghiculescu*
45
+ *Dustin Brown*
48
46
 
49
47
 
50
- ## Rails 7.0.4.3 (March 13, 2023) ##
48
+ ## Rails 7.1.0 (October 05, 2023) ##
51
49
 
52
50
  * No changes.
53
51
 
54
52
 
55
- ## Rails 7.0.4.2 (January 24, 2023) ##
53
+ ## Rails 7.1.0.rc2 (October 01, 2023) ##
56
54
 
57
- * No changes.
55
+ * Make sure `scheduled_at` is a Time object when asserting enqueued jobs.
58
56
 
57
+ *Rafael Mendonça França*
59
58
 
60
- ## Rails 7.0.4.1 (January 17, 2023) ##
61
59
 
62
- * No changes.
60
+ ## Rails 7.1.0.rc1 (September 27, 2023) ##
63
61
 
62
+ * Set `scheduled_at` attribute as a Time object instead of epoch seconds, and serialize and deserialize the value
63
+ when enqueued. Assigning a numeric/epoch value to scheduled_at= is deprecated; use a Time object instead.
64
64
 
65
- ## Rails 7.0.4 (September 09, 2022) ##
65
+ Deserializes `enqueued_at` as a Time instead of ISO8601 String.
66
66
 
67
- * Update `ActiveJob::QueueAdapters::QueAdapter` to remove deprecation warning.
67
+ *Ben Sheldon*
68
68
 
69
- Remove a deprecation warning introduced in que 1.2 to prepare for changes in
70
- que 2.0 necessary for Ruby 3 compatibility.
69
+ * Clarify the backoff strategy for the recommended `:wait` option when retrying jobs
71
70
 
72
- *Damir Zekic* and *Adis Hasovic*
71
+ `wait: :exponentially_longer` is waiting polynomially longer, so it is now recommended to use `wait: :polynomially_longer` to keep the same behavior.
73
72
 
74
- ## Rails 7.0.3.1 (July 12, 2022) ##
73
+ *Victor Mours*
75
74
 
76
- * No changes.
77
75
 
76
+ ## Rails 7.1.0.beta1 (September 13, 2023) ##
78
77
 
79
- ## Rails 7.0.3 (May 09, 2022) ##
78
+ * Fix Active Job log message to correctly report a job failed to enqueue
79
+ when the adapter raises an `ActiveJob::EnqueueError`.
80
80
 
81
- * Add missing `bigdecimal` require in `ActiveJob::Arguments`
81
+ *Ben Sheldon*
82
82
 
83
- Could cause `uninitialized constant ActiveJob::Arguments::BigDecimal (NameError)`
84
- when loading Active Job in isolation.
83
+ * Add `after_discard` method.
85
84
 
86
- *Jean Boussier*
85
+ This method lets job authors define a block which will be run when a job is about to be discarded. For example:
87
86
 
88
- ## Rails 7.0.2.4 (April 26, 2022) ##
87
+ ```ruby
88
+ class AfterDiscardJob < ActiveJob::Base
89
+ after_discard do |job, exception|
90
+ Rails.logger.info("#{job.class} raised an exception: #{exception}")
91
+ end
89
92
 
90
- * No changes.
93
+ def perform
94
+ raise StandardError
95
+ end
96
+ end
97
+ ```
91
98
 
99
+ The above job will run the block passed to `after_discard` after the job is discarded. The exception will
100
+ still be raised after the block has been run.
92
101
 
93
- ## Rails 7.0.2.3 (March 08, 2022) ##
102
+ *Rob Cardy*
94
103
 
95
- * No changes.
104
+ * Fix deserialization of ActiveSupport::Duration
96
105
 
106
+ Previously, a deserialized Duration would return an array from Duration#parts.
107
+ It will now return a hash just like a regular Duration.
97
108
 
98
- ## Rails 7.0.2.2 (February 11, 2022) ##
109
+ This also fixes an error when trying to add or subtract from a deserialized Duration
110
+ (eg `duration + 1.year`).
99
111
 
100
- * No changes.
112
+ *Jonathan del Strother*
101
113
 
114
+ * `perform_enqueued_jobs` is now compatible with all Active Job adapters
102
115
 
103
- ## Rails 7.0.2.1 (February 11, 2022) ##
116
+ This means that methods that depend on it, like Action Mailer's `assert_emails`,
117
+ will work correctly even if the test adapter is not used.
104
118
 
105
- * No changes.
119
+ *Alex Ghiculescu*
106
120
 
121
+ * Allow queue adapters to provide a custom name by implementing `queue_adapter_name`
107
122
 
108
- ## Rails 7.0.2 (February 08, 2022) ##
123
+ *Sander Verdonschot*
109
124
 
110
- * No changes.
125
+ * Log background job enqueue callers
111
126
 
127
+ Add `verbose_enqueue_logs` configuration option to display the caller
128
+ of background job enqueue in the log to help with debugging.
112
129
 
113
- ## Rails 7.0.1 (January 06, 2022) ##
130
+ Example log line:
114
131
 
115
- * Allow testing `discard_on/retry_on ActiveJob::DeserializationError`
132
+ ```
133
+ Enqueued AvatarThumbnailsJob (Job ID: ab528951-41fb-4c48-9129-3171791c27d6) to Sidekiq(default) with arguments: 1092412064
134
+ ↳ app/models/user.rb:421:in `generate_avatar_thumbnails'
135
+ ```
116
136
 
117
- Previously in `perform_enqueued_jobs`, `deserialize_arguments_if_needed`
118
- was called before calling `perform_now`. When a record no longer exists
119
- and is serialized using GlobalID this led to raising
120
- an `ActiveJob::DeserializationError` before reaching `perform_now` call.
121
- This behaviour makes difficult testing the job `discard_on/retry_on` logic.
137
+ Enabled in development only for new and upgraded applications. Not recommended for use
138
+ in the production environment since it relies on Ruby's `Kernel#caller` which is fairly slow.
122
139
 
123
- Now `deserialize_arguments_if_needed` call is postponed to when `perform_now`
124
- is called.
140
+ *fatkodima*
125
141
 
126
- Example:
142
+ * Set `provider_job_id` for Backburner jobs
127
143
 
128
- ```ruby
129
- class UpdateUserJob < ActiveJob::Base
130
- discard_on ActiveJob::DeserializationError
144
+ *Cameron Matheson*
131
145
 
132
- def perform(user)
133
- # ...
134
- end
135
- end
146
+ * Add `perform_all_later` to enqueue multiple jobs at once
136
147
 
137
- # In the test
138
- User.destroy_all
139
- assert_nothing_raised do
140
- perform_enqueued_jobs only: UpdateUserJob
141
- end
142
- ```
148
+ This adds the ability to bulk enqueue jobs, without running callbacks, by
149
+ passing multiple jobs or an array of jobs. For example:
143
150
 
144
- *Jacopo Beschi*
151
+ ```ruby
152
+ ActiveJob.perform_all_later(MyJob.new("hello", 42), MyJob.new("world", 0))
145
153
 
154
+ user_jobs = User.pluck(:id).map { |id| UserJob.new(user_id: id) }
155
+ ActiveJob.perform_all_later(user_jobs)
156
+ ```
146
157
 
147
- ## Rails 7.0.0 (December 15, 2021) ##
158
+ This can greatly reduce the number of round-trips to the queue datastore.
159
+ For queue adapters that do not implement the new `enqueue_all` method, we
160
+ fall back to enqueuing jobs individually. The Sidekiq adapter implements
161
+ `enqueue_all` with `push_bulk`.
148
162
 
149
- * No changes.
163
+ This method does not use the existing `enqueue.active_job` event, but adds a
164
+ new event `enqueue_all.active_job`.
150
165
 
166
+ *Sander Verdonschot*
151
167
 
152
- ## Rails 7.0.0.rc3 (December 14, 2021) ##
168
+ * Don't double log the `job` when using `ActiveRecord::QueryLog`
153
169
 
154
- * No changes.
170
+ Previously if you set `config.active_record.query_log_tags` to an array that included
171
+ `:job`, the job name would get logged twice. This bug has been fixed.
155
172
 
173
+ *Alex Ghiculescu*
156
174
 
157
- ## Rails 7.0.0.rc2 (December 14, 2021) ##
175
+ * Add support for Sidekiq's transaction-aware client
158
176
 
159
- * No changes.
177
+ *Jonathan del Strother*
160
178
 
161
- ## Rails 7.0.0.rc1 (December 06, 2021) ##
179
+ * Remove QueAdapter from Active Job.
162
180
 
163
- * Remove deprecated `:return_false_on_aborted_enqueue` option.
181
+ After maintaining Active Job QueAdapter by Rails and Que side
182
+ to support Ruby 3 keyword arguments and options provided as top level keywords,
183
+ it is quite difficult to maintain it this way.
164
184
 
165
- *Rafael Mendonça França*
185
+ Active Job Que adapter can be included in the future version of que gem itself.
166
186
 
167
- * Deprecated `Rails.config.active_job.skip_after_callbacks_if_terminated`.
187
+ *Yasuo Honda*
168
188
 
169
- *Rafael Mendonça França*
189
+ * Fix BigDecimal (de)serialization for adapters using JSON.
170
190
 
171
- * Removed deprecated behavior that was not halting `after_enqueue`/`after_perform` callbacks when a
172
- previous callback was halted with `throw :abort`.
191
+ Previously, BigDecimal was listed as not needing a serializer. However,
192
+ when used with an adapter storing the job arguments as JSON, it would get
193
+ serialized as a simple String, resulting in deserialization also producing
194
+ a String (instead of a BigDecimal).
173
195
 
174
- *Rafael Mendonça França*
196
+ By using a serializer, we ensure the round trip is safe.
175
197
 
176
- * Raise an `SerializationError` in `Serializer::ModuleSerializer`
177
- if the module name is not present.
198
+ To ensure applications using BigDecimal job arguments are not subject to
199
+ race conditions during deployment (where a replica running a version of
200
+ Rails without BigDecimalSerializer fails to deserialize an argument
201
+ serialized with it), `ActiveJob.use_big_decimal_serializer` is disabled by
202
+ default, and can be set to true in a following deployment..
178
203
 
179
- *Veerpal Brar*
204
+ *Sam Bostock*
180
205
 
206
+ * Preserve full-precision `enqueued_at` timestamps for serialized jobs,
207
+ allowing more accurate reporting of how long a job spent waiting in the
208
+ queue before it was performed.
181
209
 
182
- ## Rails 7.0.0.alpha2 (September 15, 2021) ##
210
+ Retains IS08601 format compatibility.
183
211
 
184
- * No changes.
212
+ *Jeremy Daer*
185
213
 
214
+ * Add `--parent` option to job generator to specify parent class of job.
186
215
 
187
- ## Rails 7.0.0.alpha1 (September 15, 2021) ##
216
+ Example:
188
217
 
189
- * Allow a job to retry indefinitely
218
+ `bin/rails g job process_payment --parent=payment_job` generates:
190
219
 
191
- The `attempts` parameter of the `retry_on` method now accepts the
192
- symbol reference `:unlimited` in addition to a specific number of retry
193
- attempts to allow a developer to specify that a job should retry
194
- forever until it succeeds.
220
+ ```ruby
221
+ class ProcessPaymentJob < PaymentJob
222
+ # ...
223
+ end
224
+ ```
195
225
 
196
- class MyJob < ActiveJob::Base
197
- retry_on(AlwaysRetryException, attempts: :unlimited)
226
+ *Gannon McGibbon*
198
227
 
199
- # the actual job code
200
- end
228
+ * Add more detailed description to job generator.
201
229
 
202
- *Daniel Morton*
230
+ *Gannon McGibbon*
203
231
 
204
- * Added possibility to check on `:priority` in test helper methods
205
- `assert_enqueued_with` and `assert_performed_with`.
232
+ * `perform.active_job` notification payloads now include `:db_runtime`, which
233
+ is the total time (in ms) taken by database queries while performing a job.
234
+ This value can be used to better understand how a job's time is spent.
206
235
 
207
- *Wojciech Wnętrzak*
236
+ *Jonathan Hefner*
208
237
 
209
- * OpenSSL constants are now used for Digest computations.
238
+ * Update `ActiveJob::QueueAdapters::QueAdapter` to remove deprecation warning.
210
239
 
211
- *Dirkjan Bussink*
240
+ Remove a deprecation warning introduced in que 1.2 to prepare for changes in
241
+ que 2.0 necessary for Ruby 3 compatibility.
212
242
 
213
- * Add a Serializer for the Range class.
243
+ *Damir Zekic* and *Adis Hasovic*
214
244
 
215
- This should allow things like `MyJob.perform_later(range: 1..100)`.
245
+ * Add missing `bigdecimal` require in `ActiveJob::Arguments`
216
246
 
217
- * Communicate enqueue failures to callers of `perform_later`.
247
+ Could cause `uninitialized constant ActiveJob::Arguments::BigDecimal (NameError)`
248
+ when loading Active Job in isolation.
218
249
 
219
- `perform_later` can now optionally take a block which will execute after
220
- the adapter attempts to enqueue the job. The block will receive the job
221
- instance as an argument even if the enqueue was not successful.
222
- Additionally, `ActiveJob` adapters now have the ability to raise an
223
- `ActiveJob::EnqueueError` which will be caught and stored in the job
224
- instance so code attempting to enqueue jobs can inspect any raised
225
- `EnqueueError` using the block.
250
+ *Jean Boussier*
226
251
 
227
- MyJob.perform_later do |job|
228
- unless job.successfully_enqueued?
229
- if job.enqueue_error&.message == "Redis was unavailable"
230
- # invoke some code that will retry the job after a delay
231
- end
232
- end
233
- end
252
+ * Allow testing `discard_on/retry_on ActiveJob::DeserializationError`
234
253
 
235
- *Daniel Morton*
254
+ Previously in `perform_enqueued_jobs`, `deserialize_arguments_if_needed`
255
+ was called before calling `perform_now`. When a record no longer exists
256
+ and is serialized using GlobalID this led to raising
257
+ an `ActiveJob::DeserializationError` before reaching `perform_now` call.
258
+ This behavior makes difficult testing the job `discard_on/retry_on` logic.
236
259
 
237
- * Don't log rescuable exceptions defined with `rescue_from`.
260
+ Now `deserialize_arguments_if_needed` call is postponed to when `perform_now`
261
+ is called.
238
262
 
239
- *Hu Hailin*
263
+ Example:
240
264
 
241
- * Allow `rescue_from` to rescue all exceptions.
265
+ ```ruby
266
+ class UpdateUserJob < ActiveJob::Base
267
+ discard_on ActiveJob::DeserializationError
242
268
 
243
- *Adrianna Chang*, *Étienne Barrié*
269
+ def perform(user)
270
+ # ...
271
+ end
272
+ end
244
273
 
274
+ # In the test
275
+ User.destroy_all
276
+ assert_nothing_raised do
277
+ perform_enqueued_jobs only: UpdateUserJob
278
+ end
279
+ ```
280
+
281
+ *Jacopo Beschi*
245
282
 
246
- Please check [6-1-stable](https://github.com/rails/rails/blob/6-1-stable/activejob/CHANGELOG.md) for previous changes.
283
+ Please check [7-0-stable](https://github.com/rails/rails/blob/7-0-stable/activejob/CHANGELOG.md) for previous changes.
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2014-2022 David Heinemeier Hansson
1
+ Copyright (c) David Heinemeier Hansson
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -10,14 +10,14 @@ that makes it easy to turn any mailing into a job for running later. That's
10
10
  one of the most common jobs in a modern web application: sending emails outside
11
11
  the request-response cycle, so the user doesn't have to wait on it.
12
12
 
13
- The main point is to ensure that all Rails apps will have a job infrastructure
13
+ The main point is to ensure that all \Rails apps will have a job infrastructure
14
14
  in place, even if it's in the form of an "immediate runner". We can then have
15
15
  framework features and other gems build on top of that, without having to worry
16
16
  about API differences between Delayed Job and Resque. Picking your queuing
17
17
  backend becomes more of an operational concern, then. And you'll be able to
18
18
  switch between them without having to rewrite your jobs.
19
19
 
20
- You can read more about Active Job in the [Active Job Basics](https://edgeguides.rubyonrails.org/active_job_basics.html) guide.
20
+ You can read more about Active Job in the [Active Job Basics](https://guides.rubyonrails.org/active_job_basics.html) guide.
21
21
 
22
22
  ## Usage
23
23
 
@@ -46,8 +46,6 @@ module ActiveJob
46
46
  end
47
47
 
48
48
  private
49
- # :nodoc:
50
- PERMITTED_TYPES = [ NilClass, String, Integer, Float, BigDecimal, TrueClass, FalseClass ]
51
49
  # :nodoc:
52
50
  GLOBALID_KEY = "_aj_globalid"
53
51
  # :nodoc:
@@ -67,35 +65,23 @@ module ActiveJob
67
65
  OBJECT_SERIALIZER_KEY, OBJECT_SERIALIZER_KEY.to_sym,
68
66
  WITH_INDIFFERENT_ACCESS_KEY, WITH_INDIFFERENT_ACCESS_KEY.to_sym,
69
67
  ]
70
- private_constant :PERMITTED_TYPES, :RESERVED_KEYS, :GLOBALID_KEY,
68
+ private_constant :RESERVED_KEYS, :GLOBALID_KEY,
71
69
  :SYMBOL_KEYS_KEY, :RUBY2_KEYWORDS_KEY, :WITH_INDIFFERENT_ACCESS_KEY
72
70
 
73
- unless Hash.respond_to?(:ruby2_keywords_hash?) && Hash.respond_to?(:ruby2_keywords_hash)
74
- using Module.new {
75
- refine Hash do
76
- class << Hash
77
- def ruby2_keywords_hash?(hash)
78
- !new(*[hash]).default.equal?(hash)
79
- end
80
-
81
- def ruby2_keywords_hash(hash)
82
- _ruby2_keywords_hash(**hash)
83
- end
84
-
85
- private
86
- def _ruby2_keywords_hash(*args)
87
- args.last
88
- end
89
- ruby2_keywords(:_ruby2_keywords_hash)
90
- end
91
- end
92
- }
93
- end
94
-
95
71
  def serialize_argument(argument)
96
72
  case argument
97
- when *PERMITTED_TYPES
73
+ when nil, true, false, Integer, Float # Types that can hardly be subclassed
98
74
  argument
75
+ when String
76
+ if argument.class == String
77
+ argument
78
+ else
79
+ begin
80
+ Serializers.serialize(argument)
81
+ rescue SerializationError
82
+ argument
83
+ end
84
+ end
99
85
  when GlobalID::Identification
100
86
  convert_to_global_id_hash(argument)
101
87
  when Array
@@ -112,18 +98,29 @@ module ActiveJob
112
98
  result = serialize_hash(argument)
113
99
  result[aj_hash_key] = symbol_keys
114
100
  result
115
- when -> (arg) { arg.respond_to?(:permitted?) && arg.respond_to?(:to_h) }
116
- serialize_indifferent_hash(argument.to_h)
117
101
  else
118
- Serializers.serialize(argument)
102
+ if argument.respond_to?(:permitted?) && argument.respond_to?(:to_h)
103
+ serialize_indifferent_hash(argument.to_h)
104
+ elsif BigDecimal === argument && !ActiveJob.use_big_decimal_serializer
105
+ ActiveJob.deprecator.warn(<<~MSG)
106
+ Primitive serialization of BigDecimal job arguments is deprecated as it may serialize via .to_s using certain queue adapters.
107
+ Enable config.active_job.use_big_decimal_serializer to use BigDecimalSerializer instead, which will be mandatory in Rails 7.2.
108
+
109
+ Note that if your application has multiple replicas, you should only enable this setting after successfully deploying your app to Rails 7.1 first.
110
+ This will ensure that during your deployment all replicas are capable of deserializing arguments serialized with BigDecimalSerializer.
111
+ MSG
112
+ argument
113
+ else
114
+ Serializers.serialize(argument)
115
+ end
119
116
  end
120
117
  end
121
118
 
122
119
  def deserialize_argument(argument)
123
120
  case argument
124
- when String
121
+ when nil, true, false, String, Integer, Float
125
122
  argument
126
- when *PERMITTED_TYPES
123
+ when BigDecimal # BigDecimal may have been legacy serialized; Remove in 7.2
127
124
  argument
128
125
  when Array
129
126
  argument.map { |arg| deserialize_argument(arg) }
@@ -15,7 +15,7 @@ require "active_job/timezones"
15
15
  require "active_job/translation"
16
16
 
17
17
  module ActiveJob # :nodoc:
18
- # = Active Job
18
+ # = Active Job \Base
19
19
  #
20
20
  # Active Job objects can be configured to work with different backend
21
21
  # queuing frameworks. To specify a queue adapter to use:
@@ -4,7 +4,7 @@ require "active_support/callbacks"
4
4
  require "active_support/core_ext/module/attribute_accessors"
5
5
 
6
6
  module ActiveJob
7
- # = Active Job Callbacks
7
+ # = Active Job \Callbacks
8
8
  #
9
9
  # Active Job provides hooks during the life cycle of a job. Callbacks allow you
10
10
  # to trigger logic during this cycle. Available callbacks are:
@@ -28,9 +28,6 @@ module ActiveJob
28
28
  end
29
29
 
30
30
  included do
31
- cattr_accessor :skip_after_callbacks_if_terminated, instance_accessor: false, default: false
32
- singleton_class.deprecate :skip_after_callbacks_if_terminated, :skip_after_callbacks_if_terminated=
33
-
34
31
  define_callbacks :perform, skip_after_callbacks_if_terminated: true
35
32
  define_callbacks :enqueue, skip_after_callbacks_if_terminated: true
36
33
  end
@@ -135,7 +132,8 @@ module ActiveJob
135
132
  # queue_as :default
136
133
  #
137
134
  # after_enqueue do |job|
138
- # $statsd.increment "enqueue-video-job.success"
135
+ # result = job.successfully_enqueued? ? "success" : "failure"
136
+ # $statsd.increment "enqueue-video-job.#{result}"
139
137
  # end
140
138
  #
141
139
  # def perform(video_id)
@@ -14,5 +14,9 @@ module ActiveJob
14
14
  def perform_later(...)
15
15
  @job_class.new(...).enqueue @options
16
16
  end
17
+
18
+ def perform_all_later(multi_args)
19
+ @job_class.perform_all_later(multi_args, options: @options)
20
+ end
17
21
  end
18
22
  end