activejob 6.0.3.2 → 6.1.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5aa67f26abfc254d6855b0067f396a253241fdc74df407f4261d3dacb7235c48
4
- data.tar.gz: d42e8410e3aaabd94cc68fb3ca300fd30a5a0ed2806be1ffcb036f1accd62c9a
3
+ metadata.gz: 6e8ecd60ff8f673ab2711ef5b6b634ce5828160113e8ac5eec732d71bc691660
4
+ data.tar.gz: 0207aac145fea7328f0afbe4680413712bbf1f1bd7a400d0b19f178ecf21024f
5
5
  SHA512:
6
- metadata.gz: 2d9937f4a3f5c0a3b062f2f6ad4db4db30ce9893c4423f2e49c7fedcb8ecd01fa101e1ee36dcbe670d2538bc440f8bd83dc4bfb3114515bd84d3d68202211ae2
7
- data.tar.gz: 02baf8feb8d09b07c190ff90c40d40d880ad6eed7ecd672fff080910839ea5139a4f5deaeb2006b0f5269cda5d587e5cf9b7890e368e4d43f0e30b7c267516c7
6
+ metadata.gz: bf88c0a034e81a6d1a75fa95b37b790647eac95a4f3bfdef7b93bb0880d80e7e040a2eb9afe735544ed11ffdd7337eb7f5bcdf8fe2f3c38045ed5319b8bf5e02
7
+ data.tar.gz: 4fbc6a306f542ba1dbb749e1defb085bd52c691b6287c6ef3e10a8bfd527f8e85914c162b5728f47e08271f6367f182195cf30fb6a7c8ba4c2b5af211b4e2b7d
@@ -1,203 +1,130 @@
1
- ## Rails 6.0.3.2 (June 17, 2020) ##
1
+ ## Rails 6.1.0 (December 09, 2020) ##
2
2
 
3
- * No changes.
3
+ * Recover nano precision when serializing `Time`, `TimeWithZone` and `DateTime` objects.
4
4
 
5
+ *Alan Tan*
5
6
 
6
- ## Rails 6.0.3.1 (May 18, 2020) ##
7
+ * Deprecate `config.active_job.return_false_on_aborted_enqueue`.
7
8
 
8
- * No changes.
9
+ *Rafael Mendonça França*
9
10
 
11
+ * Return `false` when enqueuing a job is aborted.
10
12
 
11
- ## Rails 6.0.3 (May 06, 2020) ##
13
+ *Rafael Mendonça França*
12
14
 
13
15
  * While using `perform_enqueued_jobs` test helper enqueued jobs must be stored for the later check with
14
16
  `assert_enqueued_with`.
15
17
 
16
18
  *Dmitry Polushkin*
17
19
 
18
- * Add queue name support to Que adapter
20
+ * `ActiveJob::TestCase#perform_enqueued_jobs` without a block removes performed jobs from the queue.
19
21
 
20
- *Brad Nauta*, *Wojciech Wnętrzak*
21
-
22
-
23
- ## Rails 6.0.2.2 (March 19, 2020) ##
24
-
25
- * No changes.
26
-
27
-
28
- ## Rails 6.0.2.1 (December 18, 2019) ##
29
-
30
- * No changes.
31
-
32
-
33
- ## Rails 6.0.2 (December 13, 2019) ##
34
-
35
- * Allow Sidekiq access to the underlying job class.
36
-
37
- By having access to the Active Job class, Sidekiq can get access to any `sidekiq_options` which
38
- have been set on that Active Job type and serialize those options into Redis.
39
-
40
- https://github.com/mperham/sidekiq/blob/master/Changes.md#60
41
-
42
- *Mike Perham*
43
-
44
-
45
- ## Rails 6.0.1 (November 5, 2019) ##
46
-
47
- * No changes.
48
-
49
-
50
- ## Rails 6.0.0 (August 16, 2019) ##
51
-
52
- * `assert_enqueued_with` and `assert_performed_with` can now test jobs with relative delay.
53
-
54
- *Vlado Cingel*
55
-
56
-
57
- ## Rails 6.0.0.rc2 (July 22, 2019) ##
58
-
59
- * No changes.
60
-
61
-
62
- ## Rails 6.0.0.rc1 (April 24, 2019) ##
63
-
64
- * Use individual execution counters when calculating retry delay.
65
-
66
- *Patrik Bóna*
67
-
68
- * Make job argument assertions with `Time`, `ActiveSupport::TimeWithZone`, and `DateTime` work by dropping microseconds. Microsecond precision is lost during serialization.
69
-
70
- *Gannon McGibbon*
22
+ That way the helper can be called multiple times and not perform a job invocation multiple times.
71
23
 
24
+ ```ruby
25
+ def test_jobs
26
+ HelloJob.perform_later("rafael")
27
+ perform_enqueued_jobs # only runs with "rafael"
28
+ HelloJob.perform_later("david")
29
+ perform_enqueued_jobs # only runs with "david"
30
+ end
31
+ ```
72
32
 
73
- ## Rails 6.0.0.beta3 (March 11, 2019) ##
74
-
75
- * No changes.
76
-
77
-
78
- ## Rails 6.0.0.beta2 (February 25, 2019) ##
79
-
80
- * No changes.
33
+ *Étienne Barrié*
81
34
 
35
+ * `ActiveJob::TestCase#perform_enqueued_jobs` will no longer perform retries:
82
36
 
83
- ## Rails 6.0.0.beta1 (January 18, 2019) ##
37
+ When calling `perform_enqueued_jobs` without a block, the adapter will
38
+ now perform jobs that are **already** in the queue. Jobs that will end up in
39
+ the queue afterwards won't be performed.
84
40
 
85
- * Return false instead of the job instance when `enqueue` is aborted.
41
+ This change only affects `perform_enqueued_jobs` when no block is given.
86
42
 
87
- This will be the behavior in Rails 6.1 but it can be controlled now with
88
- `config.active_job.return_false_on_aborted_enqueue`.
43
+ *Edouard Chin*
89
44
 
90
- *Kir Shatrov*
45
+ * Add queue name support to Que adapter.
91
46
 
92
- * Keep executions for each specific declaration
47
+ *Brad Nauta*, *Wojciech Wnętrzak*
93
48
 
94
- Each `retry_on` declaration has now its own specific executions counter. Before it was
95
- shared between all executions of a job.
49
+ * Don't run `after_enqueue` and `after_perform` callbacks if the callback chain is halted.
96
50
 
97
- *Alberto Almagro*
51
+ class MyJob < ApplicationJob
52
+ before_enqueue { throw(:abort) }
53
+ after_enqueue { # won't enter here anymore }
54
+ end
98
55
 
99
- * Allow all assertion helpers that have a `only` and `except` keyword to accept
100
- Procs.
56
+ `after_enqueue` and `after_perform` callbacks will no longer run if the callback chain is halted.
57
+ This behaviour is a breaking change and won't take effect until Rails 6.2.
58
+ To enable this behaviour in your app right now, you can add in your app's configuration file
59
+ `config.active_job.skip_after_callbacks_if_terminated = true`.
101
60
 
102
61
  *Edouard Chin*
103
62
 
104
- * Restore `HashWithIndifferentAccess` support to `ActiveJob::Arguments.deserialize`.
63
+ * Fix enqueuing and performing incorrect logging message.
105
64
 
106
- *Gannon McGibbon*
65
+ Jobs will no longer always log "Enqueued MyJob" or "Performed MyJob" when they actually didn't get enqueued/performed.
107
66
 
108
- * Include deserialized arguments in job instances returned from
109
- `assert_enqueued_with` and `assert_performed_with`
67
+ ```ruby
68
+ class MyJob < ApplicationJob
69
+ before_enqueue { throw(:abort) }
70
+ end
110
71
 
111
- *Alan Wu*
72
+ MyJob.perform_later # Will no longer log "Enqueued MyJob" since job wasn't even enqueued through adapter.
73
+ ```
112
74
 
113
- * Allow `assert_enqueued_with`/`assert_performed_with` methods to accept
114
- a proc for the `args` argument. This is useful to check if only a subset of arguments
115
- matches your expectations.
75
+ A new message will be logged in case a job couldn't be enqueued, either because the callback chain was halted or
76
+ because an exception happened during enqueuing. (i.e. Redis is down when you try to enqueue your job)
116
77
 
117
78
  *Edouard Chin*
118
79
 
119
- * `ActionDispatch::IntegrationTest` includes `ActiveJob::TestHelper` module by default.
120
-
121
- *Ricardo Díaz*
122
-
123
- * Added `enqueue_retry.active_job`, `retry_stopped.active_job`, and `discard.active_job` hooks.
124
-
125
- *steves*
80
+ * Add an option to disable logging of the job arguments when enqueuing and executing the job.
126
81
 
127
- * Allow `assert_performed_with` to be called without a block.
82
+ class SensitiveJob < ApplicationJob
83
+ self.log_arguments = false
128
84
 
129
- *bogdanvlviv*
85
+ def perform(my_sensitive_argument)
86
+ end
87
+ end
130
88
 
131
- * Execution of `assert_performed_jobs`, and `assert_no_performed_jobs`
132
- without a block should respect passed `:except`, `:only`, and `:queue` options.
89
+ When dealing with sensitive arguments as password and tokens it is now possible to configure the job
90
+ to not put the sensitive argument in the logs.
133
91
 
134
- *bogdanvlviv*
92
+ *Rafael Mendonça França*
135
93
 
136
- * Allow `:queue` option to job assertions and helpers.
94
+ * Changes in `queue_name_prefix` of a job no longer affects all other jobs.
137
95
 
138
- *bogdanvlviv*
96
+ Fixes #37084.
139
97
 
140
- * Allow `perform_enqueued_jobs` to be called without a block.
98
+ *Lucas Mansur*
141
99
 
142
- Performs all of the jobs that have been enqueued up to this point in the test.
100
+ * Allow `Class` and `Module` instances to be serialized.
143
101
 
144
102
  *Kevin Deisz*
145
103
 
146
- * Move `enqueue`/`enqueue_at` notifications to an around callback.
147
-
148
- Improves timing accuracy over the old after callback by including
149
- time spent writing to the adapter's IO implementation.
150
-
151
- *Zach Kemp*
152
-
153
- * Allow call `assert_enqueued_with` with no block.
104
+ * Log potential matches in `assert_enqueued_with` and `assert_performed_with`.
154
105
 
155
- Example:
156
- ```
157
- def test_assert_enqueued_with
158
- MyJob.perform_later(1,2,3)
159
- assert_enqueued_with(job: MyJob, args: [1,2,3], queue: 'low')
160
-
161
- MyJob.set(wait_until: Date.tomorrow.noon).perform_later
162
- assert_enqueued_with(job: MyJob, at: Date.tomorrow.noon)
163
- end
164
- ```
165
-
166
- *bogdanvlviv*
167
-
168
- * Allow passing multiple exceptions to `retry_on`, and `discard_on`.
169
-
170
- *George Claghorn*
171
-
172
- * Pass the error instance as the second parameter of block executed by `discard_on`.
106
+ *Gareth du Plooy*
173
107
 
174
- Fixes #32853.
108
+ * Add `at` argument to the `perform_enqueued_jobs` test helper.
175
109
 
176
- *Yuji Yaginuma*
110
+ *John Crepezzi*, *Eileen Uchitelle*
177
111
 
178
- * Remove support for Qu gem.
179
-
180
- Reasons are that the Qu gem wasn't compatible since Rails 5.1,
181
- gem development was stopped in 2014 and maintainers have
182
- confirmed its demise. See issue #32273
183
-
184
- *Alberto Almagro*
185
-
186
- * Add support for timezones to Active Job.
187
-
188
- Record what was the current timezone in effect when the job was
189
- enqueued and then restore when the job is executed in same way
190
- that the current locale is recorded and restored.
112
+ * `assert_enqueued_with` and `assert_performed_with` can now test jobs with relative delay.
191
113
 
192
- *Andrew White*
114
+ *Vlado Cingel*
193
115
 
194
- * Rails 6 requires Ruby 2.5.0 or newer.
116
+ * Add jitter to `ActiveJob::Exceptions.retry_on`.
195
117
 
196
- *Jeremy Daer*, *Kasper Timm Hansen*
118
+ `ActiveJob::Exceptions.retry_on` now uses a random amount of jitter in order to
119
+ prevent the [thundering herd effect](https://en.wikipedia.org/wiki/Thundering_herd_problem). Defaults to
120
+ 15% (represented as 0.15) but overridable via the `:jitter` option when using `retry_on`.
121
+ Jitter is applied when an `Integer`, `ActiveSupport::Duration` or `:exponentially_longer`, is passed to the `wait` argument in `retry_on`.
197
122
 
198
- * Add support to define custom argument serializers.
123
+ ```ruby
124
+ retry_on(MyError, wait: :exponentially_longer, jitter: 0.30)
125
+ ```
199
126
 
200
- *Evgenii Pecherkin*, *Rafael Mendonça França*
127
+ *Anthony Ross*
201
128
 
202
129
 
203
- Please check [5-2-stable](https://github.com/rails/rails/blob/5-2-stable/activejob/CHANGELOG.md) for previous changes.
130
+ Please check [6-0-stable](https://github.com/rails/rails/blob/6-0-stable/activejob/CHANGELOG.md) for previous changes.
@@ -1,4 +1,4 @@
1
- Copyright (c) 2014-2019 David Heinemeier Hansson
1
+ Copyright (c) 2014-2020 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
@@ -95,9 +95,6 @@ their gem, or as a stand-alone gem. For discussion about this see the
95
95
  following PRs: [23311](https://github.com/rails/rails/issues/23311#issuecomment-176275718),
96
96
  [21406](https://github.com/rails/rails/pull/21406#issuecomment-138813484), and [#32285](https://github.com/rails/rails/pull/32285).
97
97
 
98
- ## Auxiliary gems
99
-
100
- * [activejob-stats](https://github.com/seuros/activejob-stats)
101
98
 
102
99
  ## Download and installation
103
100
 
@@ -111,6 +108,7 @@ Source code can be downloaded as part of the Rails project on GitHub:
111
108
 
112
109
  * https://github.com/rails/rails/tree/master/activejob
113
110
 
111
+
114
112
  ## License
115
113
 
116
114
  Active Job is released under the MIT license:
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #--
4
- # Copyright (c) 2014-2019 David Heinemeier Hansson
4
+ # Copyright (c) 2014-2020 David Heinemeier Hansson
5
5
  #
6
6
  # Permission is hereby granted, free of charge, to any person obtaining
7
7
  # a copy of this software and associated documentation files (the
@@ -8,7 +8,9 @@ require "active_job/enqueuing"
8
8
  require "active_job/execution"
9
9
  require "active_job/callbacks"
10
10
  require "active_job/exceptions"
11
+ require "active_job/log_subscriber"
11
12
  require "active_job/logging"
13
+ require "active_job/instrumentation"
12
14
  require "active_job/timezones"
13
15
  require "active_job/translation"
14
16
 
@@ -68,6 +70,7 @@ module ActiveJob #:nodoc:
68
70
  include Callbacks
69
71
  include Exceptions
70
72
  include Logging
73
+ include Instrumentation
71
74
  include Timezones
72
75
  include Translation
73
76
 
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "active_support/callbacks"
4
+ require "active_support/core_ext/object/with_options"
5
+ require "active_support/core_ext/module/attribute_accessors"
4
6
 
5
7
  module ActiveJob
6
8
  # = Active Job Callbacks
@@ -27,16 +29,25 @@ module ActiveJob
27
29
  end
28
30
 
29
31
  included do
30
- define_callbacks :perform
31
- define_callbacks :enqueue
32
+ class_attribute :return_false_on_aborted_enqueue, instance_accessor: false, instance_predicate: false, default: false
33
+ singleton_class.deprecate :return_false_on_aborted_enqueue, :return_false_on_aborted_enqueue=
34
+ cattr_accessor :skip_after_callbacks_if_terminated, instance_accessor: false, default: false
32
35
 
33
- class_attribute :return_false_on_aborted_enqueue, instance_accessor: false, instance_predicate: false
34
- self.return_false_on_aborted_enqueue = false
36
+ with_options(skip_after_callbacks_if_terminated: skip_after_callbacks_if_terminated) do
37
+ define_callbacks :perform
38
+ define_callbacks :enqueue
39
+ end
35
40
  end
36
41
 
37
42
  # These methods will be included into any Active Job object, adding
38
43
  # callbacks for +perform+ and +enqueue+ methods.
39
44
  module ClassMethods
45
+ def inherited(klass)
46
+ klass.get_callbacks(:enqueue).config[:skip_after_callbacks_if_terminated] = skip_after_callbacks_if_terminated
47
+ klass.get_callbacks(:perform).config[:skip_after_callbacks_if_terminated] = skip_after_callbacks_if_terminated
48
+ super
49
+ end
50
+
40
51
  # Defines a callback that will get called right before the
41
52
  # job's perform method is executed.
42
53
  #
@@ -91,6 +102,19 @@ module ActiveJob
91
102
  # end
92
103
  # end
93
104
  #
105
+ # You can access the return value of the job only if the execution wasn't halted.
106
+ #
107
+ # class VideoProcessJob < ActiveJob::Base
108
+ # around_perform do |job, block|
109
+ # value = block.call
110
+ # puts value # => "Hello World!"
111
+ # end
112
+ #
113
+ # def perform
114
+ # "Hello World!"
115
+ # end
116
+ # end
117
+ #
94
118
  def around_perform(*filters, &blk)
95
119
  set_callback(:perform, :around, *filters, &blk)
96
120
  end
@@ -154,5 +178,21 @@ module ActiveJob
154
178
  set_callback(:enqueue, :around, *filters, &blk)
155
179
  end
156
180
  end
181
+
182
+ private
183
+ def halted_callback_hook(_filter, name) # :nodoc:
184
+ return super unless %i(enqueue perform).include?(name.to_sym)
185
+ callbacks = public_send("_#{name}_callbacks")
186
+
187
+ if !self.class.skip_after_callbacks_if_terminated && callbacks.any? { |c| c.kind == :after }
188
+ ActiveSupport::Deprecation.warn(<<~EOM)
189
+ In Rails 6.2, `after_enqueue`/`after_perform` callbacks no longer run if `before_enqueue`/`before_perform` respectively halts with `throw :abort`.
190
+ To enable this behavior, uncomment the `config.active_job.skip_after_callbacks_if_terminated` config
191
+ in the new 6.1 framework defaults initializer.
192
+ EOM
193
+ end
194
+
195
+ super
196
+ end
157
197
  end
158
198
  end
@@ -85,6 +85,7 @@ module ActiveJob
85
85
  @priority = self.class.priority
86
86
  @executions = 0
87
87
  @exception_executions = {}
88
+ @timezone = Time.zone&.name
88
89
  end
89
90
  ruby2_keywords(:initialize) if respond_to?(:ruby2_keywords, true)
90
91
 
@@ -101,7 +102,7 @@ module ActiveJob
101
102
  "executions" => executions,
102
103
  "exception_executions" => exception_executions,
103
104
  "locale" => I18n.locale.to_s,
104
- "timezone" => Time.zone.try(:name),
105
+ "timezone" => timezone,
105
106
  "enqueued_at" => Time.now.utc.iso8601
106
107
  }
107
108
  end
@@ -141,7 +142,7 @@ module ActiveJob
141
142
  self.executions = job_data["executions"]
142
143
  self.exception_executions = job_data["exception_executions"]
143
144
  self.locale = job_data["locale"] || I18n.locale.to_s
144
- self.timezone = job_data["timezone"] || Time.zone.try(:name)
145
+ self.timezone = job_data["timezone"] || Time.zone&.name
145
146
  self.enqueued_at = job_data["enqueued_at"]
146
147
  end
147
148
 
@@ -54,9 +54,9 @@ module ActiveJob
54
54
 
55
55
  run_callbacks :enqueue do
56
56
  if scheduled_at
57
- self.class.queue_adapter.enqueue_at self, scheduled_at
57
+ queue_adapter.enqueue_at self, scheduled_at
58
58
  else
59
- self.class.queue_adapter.enqueue self
59
+ queue_adapter.enqueue self
60
60
  end
61
61
 
62
62
  successfully_enqueued = true
@@ -65,17 +65,7 @@ module ActiveJob
65
65
  if successfully_enqueued
66
66
  self
67
67
  else
68
- if self.class.return_false_on_aborted_enqueue
69
- false
70
- else
71
- ActiveSupport::Deprecation.warn(
72
- "Rails 6.1 will return false when the enqueuing is aborted. Make sure your code doesn't depend on it" \
73
- " returning the instance of the job and set `config.active_job.return_false_on_aborted_enqueue = true`" \
74
- " to remove the deprecations."
75
- )
76
-
77
- self
78
- end
68
+ false
79
69
  end
80
70
  end
81
71
  end