activejob 6.0.3 → 6.1.0.rc1

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: d067e6219079250956759d62268ce7a7712e6a89f0e2c41018e1badf29aec401
4
- data.tar.gz: 70713490b85dd83b1cd9169080e33ba067c09ccc0e8ecd7357141f0fac6181b6
3
+ metadata.gz: dc9b631f7b43e77aa14e8fb65525b51ad82f92f5b0046d15d44c2e5f2429a2aa
4
+ data.tar.gz: a2e8afb6e5295337e82c0f0c3de726cbe11dcedba0f2f34c6c4323170a74dc13
5
5
  SHA512:
6
- metadata.gz: 49990e61ce26abb7c25b37f3c324034a3f8fc216ac117d13d7bc44fc987706d4682f418d408abe2b8470823e2c5847608468b0888ecc103c69feee888c88dcdf
7
- data.tar.gz: 3dcb14d1dc5bf5d22736f46fb20fe6a1f5eeeaebbf2641320859ce5c24b65eba5cd376faa311661ece527d40a7e6b2e541e8ac7647b59fbbfadee7629f6690cc
6
+ metadata.gz: b30c316861f1ae07c363df9184ef9a306d796756429d11978166b3864263cc72ff521c6d27093e17f0e2e850b6921c3dd39702646d6f5b7a5a198221d1e68f4f
7
+ data.tar.gz: 99ed04c52a31748e94edd687fe93a48de660e44d29b5645597a278a97450405f57c28b92d69b98cf0f3ded97711952a58b700b9f90e2ad8dac5148b843920b17
@@ -1,193 +1,130 @@
1
- ## Rails 6.0.3 (May 06, 2020) ##
1
+ ## Rails 6.1.0.rc1 (November 02, 2020) ##
2
2
 
3
- * While using `perform_enqueued_jobs` test helper enqueued jobs must be stored for the later check with
4
- `assert_enqueued_with`.
5
-
6
- *Dmitry Polushkin*
7
-
8
- * Add queue name support to Que adapter
9
-
10
- *Brad Nauta*, *Wojciech Wnętrzak*
11
-
12
-
13
- ## Rails 6.0.2.2 (March 19, 2020) ##
14
-
15
- * No changes.
16
-
17
-
18
- ## Rails 6.0.2.1 (December 18, 2019) ##
19
-
20
- * No changes.
21
-
22
-
23
- ## Rails 6.0.2 (December 13, 2019) ##
24
-
25
- * Allow Sidekiq access to the underlying job class.
26
-
27
- By having access to the Active Job class, Sidekiq can get access to any `sidekiq_options` which
28
- have been set on that Active Job type and serialize those options into Redis.
29
-
30
- https://github.com/mperham/sidekiq/blob/master/Changes.md#60
31
-
32
- *Mike Perham*
33
-
34
-
35
- ## Rails 6.0.1 (November 5, 2019) ##
36
-
37
- * No changes.
38
-
39
-
40
- ## Rails 6.0.0 (August 16, 2019) ##
41
-
42
- * `assert_enqueued_with` and `assert_performed_with` can now test jobs with relative delay.
43
-
44
- *Vlado Cingel*
45
-
46
-
47
- ## Rails 6.0.0.rc2 (July 22, 2019) ##
48
-
49
- * No changes.
3
+ * Recover nano precision when serializing `Time`, `TimeWithZone` and `DateTime` objects.
50
4
 
5
+ *Alan Tan*
51
6
 
52
- ## Rails 6.0.0.rc1 (April 24, 2019) ##
7
+ * Deprecate `config.active_job.return_false_on_aborted_enqueue`.
53
8
 
54
- * Use individual execution counters when calculating retry delay.
9
+ *Rafael Mendonça França*
55
10
 
56
- *Patrik Bóna*
11
+ * Return `false` when enqueuing a job is aborted.
57
12
 
58
- * Make job argument assertions with `Time`, `ActiveSupport::TimeWithZone`, and `DateTime` work by dropping microseconds. Microsecond precision is lost during serialization.
59
-
60
- *Gannon McGibbon*
13
+ *Rafael Mendonça França*
61
14
 
15
+ * While using `perform_enqueued_jobs` test helper enqueued jobs must be stored for the later check with
16
+ `assert_enqueued_with`.
62
17
 
63
- ## Rails 6.0.0.beta3 (March 11, 2019) ##
18
+ *Dmitry Polushkin*
64
19
 
65
- * No changes.
20
+ * `ActiveJob::TestCase#perform_enqueued_jobs` without a block removes performed jobs from the queue.
66
21
 
22
+ That way the helper can be called multiple times and not perform a job invocation multiple times.
67
23
 
68
- ## Rails 6.0.0.beta2 (February 25, 2019) ##
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
+ ```
69
32
 
70
- * No changes.
33
+ *Étienne Barrié*
71
34
 
35
+ * `ActiveJob::TestCase#perform_enqueued_jobs` will no longer perform retries:
72
36
 
73
- ## 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.
74
40
 
75
- * Return false instead of the job instance when `enqueue` is aborted.
41
+ This change only affects `perform_enqueued_jobs` when no block is given.
76
42
 
77
- This will be the behavior in Rails 6.1 but it can be controlled now with
78
- `config.active_job.return_false_on_aborted_enqueue`.
43
+ *Edouard Chin*
79
44
 
80
- *Kir Shatrov*
45
+ * Add queue name support to Que adapter.
81
46
 
82
- * Keep executions for each specific declaration
47
+ *Brad Nauta*, *Wojciech Wnętrzak*
83
48
 
84
- Each `retry_on` declaration has now its own specific executions counter. Before it was
85
- shared between all executions of a job.
49
+ * Don't run `after_enqueue` and `after_perform` callbacks if the callback chain is halted.
86
50
 
87
- *Alberto Almagro*
51
+ class MyJob < ApplicationJob
52
+ before_enqueue { throw(:abort) }
53
+ after_enqueue { # won't enter here anymore }
54
+ end
88
55
 
89
- * Allow all assertion helpers that have a `only` and `except` keyword to accept
90
- 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`.
91
60
 
92
61
  *Edouard Chin*
93
62
 
94
- * Restore `HashWithIndifferentAccess` support to `ActiveJob::Arguments.deserialize`.
63
+ * Fix enqueuing and performing incorrect logging message.
95
64
 
96
- *Gannon McGibbon*
65
+ Jobs will no longer always log "Enqueued MyJob" or "Performed MyJob" when they actually didn't get enqueued/performed.
97
66
 
98
- * Include deserialized arguments in job instances returned from
99
- `assert_enqueued_with` and `assert_performed_with`
67
+ ```ruby
68
+ class MyJob < ApplicationJob
69
+ before_enqueue { throw(:abort) }
70
+ end
100
71
 
101
- *Alan Wu*
72
+ MyJob.perform_later # Will no longer log "Enqueued MyJob" since job wasn't even enqueued through adapter.
73
+ ```
102
74
 
103
- * Allow `assert_enqueued_with`/`assert_performed_with` methods to accept
104
- a proc for the `args` argument. This is useful to check if only a subset of arguments
105
- 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 enqueing. (i.e. Redis is down when you try to enqueue your job)
106
77
 
107
78
  *Edouard Chin*
108
79
 
109
- * `ActionDispatch::IntegrationTest` includes `ActiveJob::TestHelper` module by default.
110
-
111
- *Ricardo Díaz*
112
-
113
- * Added `enqueue_retry.active_job`, `retry_stopped.active_job`, and `discard.active_job` hooks.
114
-
115
- *steves*
80
+ * Add an option to disable logging of the job arguments when enqueuing and executing the job.
116
81
 
117
- * Allow `assert_performed_with` to be called without a block.
82
+ class SensitiveJob < ApplicationJob
83
+ self.log_arguments = false
118
84
 
119
- *bogdanvlviv*
85
+ def perform(my_sensitive_argument)
86
+ end
87
+ end
120
88
 
121
- * Execution of `assert_performed_jobs`, and `assert_no_performed_jobs`
122
- 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.
123
91
 
124
- *bogdanvlviv*
92
+ *Rafael Mendonça França*
125
93
 
126
- * Allow `:queue` option to job assertions and helpers.
94
+ * Changes in `queue_name_prefix` of a job no longer affects all other jobs.
127
95
 
128
- *bogdanvlviv*
96
+ Fixes #37084.
129
97
 
130
- * Allow `perform_enqueued_jobs` to be called without a block.
98
+ *Lucas Mansur*
131
99
 
132
- 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.
133
101
 
134
102
  *Kevin Deisz*
135
103
 
136
- * Move `enqueue`/`enqueue_at` notifications to an around callback.
137
-
138
- Improves timing accuracy over the old after callback by including
139
- time spent writing to the adapter's IO implementation.
140
-
141
- *Zach Kemp*
142
-
143
- * Allow call `assert_enqueued_with` with no block.
104
+ * Log potential matches in `assert_enqueued_with` and `assert_performed_with`.
144
105
 
145
- Example:
146
- ```
147
- def test_assert_enqueued_with
148
- MyJob.perform_later(1,2,3)
149
- assert_enqueued_with(job: MyJob, args: [1,2,3], queue: 'low')
150
-
151
- MyJob.set(wait_until: Date.tomorrow.noon).perform_later
152
- assert_enqueued_with(job: MyJob, at: Date.tomorrow.noon)
153
- end
154
- ```
155
-
156
- *bogdanvlviv*
157
-
158
- * Allow passing multiple exceptions to `retry_on`, and `discard_on`.
159
-
160
- *George Claghorn*
161
-
162
- * Pass the error instance as the second parameter of block executed by `discard_on`.
106
+ *Gareth du Plooy*
163
107
 
164
- Fixes #32853.
108
+ * Add `at` argument to the `perform_enqueued_jobs` test helper.
165
109
 
166
- *Yuji Yaginuma*
110
+ *John Crepezzi*, *Eileen Uchitelle*
167
111
 
168
- * Remove support for Qu gem.
169
-
170
- Reasons are that the Qu gem wasn't compatible since Rails 5.1,
171
- gem development was stopped in 2014 and maintainers have
172
- confirmed its demise. See issue #32273
173
-
174
- *Alberto Almagro*
175
-
176
- * Add support for timezones to Active Job.
177
-
178
- Record what was the current timezone in effect when the job was
179
- enqueued and then restore when the job is executed in same way
180
- that the current locale is recorded and restored.
112
+ * `assert_enqueued_with` and `assert_performed_with` can now test jobs with relative delay.
181
113
 
182
- *Andrew White*
114
+ *Vlado Cingel*
183
115
 
184
- * Rails 6 requires Ruby 2.5.0 or newer.
116
+ * Add jitter to `ActiveJob::Exceptions.retry_on`.
185
117
 
186
- *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`.
187
122
 
188
- * Add support to define custom argument serializers.
123
+ ```ruby
124
+ retry_on(MyError, wait: :exponentially_longer, jitter: 0.30)
125
+ ```
189
126
 
190
- *Evgenii Pecherkin*, *Rafael Mendonça França*
127
+ *Anthony Ross*
191
128
 
192
129
 
193
- 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