activejob 5.2.6 → 6.0.0.beta1

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/CHANGELOG.md +69 -73
  3. data/MIT-LICENSE +1 -1
  4. data/README.md +12 -6
  5. data/lib/active_job.rb +2 -1
  6. data/lib/active_job/arguments.rb +40 -28
  7. data/lib/active_job/base.rb +3 -1
  8. data/lib/active_job/callbacks.rb +4 -1
  9. data/lib/active_job/core.rb +33 -21
  10. data/lib/active_job/enqueuing.rb +26 -5
  11. data/lib/active_job/exceptions.rb +33 -17
  12. data/lib/active_job/execution.rb +1 -1
  13. data/lib/active_job/gem_version.rb +4 -4
  14. data/lib/active_job/logging.rb +39 -8
  15. data/lib/active_job/queue_adapter.rb +2 -0
  16. data/lib/active_job/queue_adapters.rb +5 -7
  17. data/lib/active_job/queue_adapters/async_adapter.rb +1 -1
  18. data/lib/active_job/queue_adapters/backburner_adapter.rb +2 -2
  19. data/lib/active_job/queue_adapters/inline_adapter.rb +1 -1
  20. data/lib/active_job/queue_adapters/test_adapter.rb +22 -8
  21. data/lib/active_job/queue_name.rb +1 -1
  22. data/lib/active_job/railtie.rb +16 -1
  23. data/lib/active_job/serializers.rb +63 -0
  24. data/lib/active_job/serializers/date_serializer.rb +21 -0
  25. data/lib/active_job/serializers/date_time_serializer.rb +21 -0
  26. data/lib/active_job/serializers/duration_serializer.rb +24 -0
  27. data/lib/active_job/serializers/object_serializer.rb +54 -0
  28. data/lib/active_job/serializers/symbol_serializer.rb +21 -0
  29. data/lib/active_job/serializers/time_serializer.rb +21 -0
  30. data/lib/active_job/serializers/time_with_zone_serializer.rb +21 -0
  31. data/lib/active_job/test_helper.rb +262 -56
  32. data/lib/active_job/timezones.rb +13 -0
  33. data/lib/active_job/translation.rb +1 -1
  34. data/lib/rails/generators/job/job_generator.rb +4 -0
  35. metadata +20 -12
  36. data/lib/active_job/queue_adapters/qu_adapter.rb +0 -46
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4707f341a2a8f3e0a35592ccd63d424dec39a417c57984e6594ed69cdab6df66
4
- data.tar.gz: 7133a10ee7778d160c232f7bf3907e2fe6f989d32e5a389f5cabc265265a8a3e
3
+ metadata.gz: 4efdf023b31288a45487abbafc8fc37207c470167a9f2d770a5d3364e4a7c399
4
+ data.tar.gz: e2476b972bf30c7bfb9cdce2ee2fb5018e2253d6b1bb28142dcbb169bf834c2d
5
5
  SHA512:
6
- metadata.gz: cfd7c4edaf7ec9c517069f0efa6da4b4b8abb37bf4aeaf9ea1258c88cb83e35b5f0d9b63cfa9c50e20ea773f6090eb0a28791453ea0c5a1fa93e761855baa374
7
- data.tar.gz: 917f4ff3895613de6760e74e75c5dd5fd6fbb0fab1d04c818c31cdc29cb49667dbd5cff7808743c0fde85b39a2a2e16ad13724f197d77d1d528efb23212adb45
6
+ metadata.gz: 2f5b5589be292b9df0693b61a38f8a1b5d8a8b88ecd4ec2eb22556f18fd8795fa7be9f447057626ed9f852bb543807a96eefa28989a27f16ee946a5e91550614
7
+ data.tar.gz: 694d741cfd413f0bae6165706b5924a6cb5ae7a6240d5fc6d09c3cc1b4020d1fc3006ae154b932a3734126530b3ff112c29f56839ca9b630ab7ed467dda3f38a
data/CHANGELOG.md CHANGED
@@ -1,125 +1,121 @@
1
- ## Rails 5.2.6 (May 05, 2021) ##
1
+ ## Rails 6.0.0.beta1 (January 18, 2019) ##
2
2
 
3
- * No changes.
3
+ * Return false instead of the job instance when `enqueue` is aborted.
4
4
 
5
+ This will be the behavior in Rails 6.1 but it can be controlled now with
6
+ `config.active_job.return_false_on_aborted_enqueue`.
5
7
 
6
- ## Rails 5.2.5 (March 26, 2021) ##
8
+ *Kir Shatrov*
7
9
 
8
- * No changes.
10
+ * Keep executions for each specific declaration
9
11
 
12
+ Each `retry_on` declaration has now its own specific executions counter. Before it was
13
+ shared between all executions of a job.
10
14
 
11
- ## Rails 5.2.4.6 (May 05, 2021) ##
15
+ *Alberto Almagro*
12
16
 
13
- * No changes.
17
+ * Allow all assertion helpers that have a `only` and `except` keyword to accept
18
+ Procs.
14
19
 
20
+ *Edouard Chin*
15
21
 
16
- ## Rails 5.2.4.5 (February 10, 2021) ##
22
+ * Restore HashWithIndifferentAccess support to ActiveJob::Arguments.deserialize.
17
23
 
18
- * No changes.
19
-
20
-
21
- ## Rails 5.2.4.4 (September 09, 2020) ##
22
-
23
- * No changes.
24
-
25
-
26
- ## Rails 5.2.4.3 (May 18, 2020) ##
24
+ *Gannon McGibbon*
27
25
 
28
- * No changes.
26
+ * Include deserialized arguments in job instances returned from
27
+ `assert_enqueued_with` and `assert_performed_with`
29
28
 
29
+ *Alan Wu*
30
30
 
31
- ## Rails 5.2.4.2 (March 19, 2020) ##
31
+ * Allow `assert_enqueued_with`/`assert_performed_with` methods to accept
32
+ a proc for the `args` argument. This is useful to check if only a subset of arguments
33
+ matches your expectations.
32
34
 
33
- * No changes.
35
+ *Edouard Chin*
34
36
 
37
+ * `ActionDispatch::IntegrationTest` includes `ActiveJob::TestHelper` module by default.
35
38
 
36
- ## Rails 5.2.4.1 (December 18, 2019) ##
39
+ *Ricardo Díaz*
37
40
 
38
- * No changes.
41
+ * Added `enqueue_retry.active_job`, `retry_stopped.active_job`, and `discard.active_job` hooks.
39
42
 
43
+ *steves*
40
44
 
41
- ## Rails 5.2.4 (November 27, 2019) ##
45
+ * Allow `assert_performed_with` to be called without a block.
42
46
 
43
- * No changes.
47
+ *bogdanvlviv*
44
48
 
49
+ * Execution of `assert_performed_jobs`, and `assert_no_performed_jobs`
50
+ without a block should respect passed `:except`, `:only`, and `:queue` options.
45
51
 
46
- ## Rails 5.2.3 (March 27, 2019) ##
52
+ *bogdanvlviv*
47
53
 
48
- * No changes.
54
+ * Allow `:queue` option to job assertions and helpers.
49
55
 
56
+ *bogdanvlviv*
50
57
 
51
- ## Rails 5.2.2.1 (March 11, 2019) ##
58
+ * Allow `perform_enqueued_jobs` to be called without a block.
52
59
 
53
- * No changes.
60
+ Performs all of the jobs that have been enqueued up to this point in the test.
54
61
 
62
+ *Kevin Deisz*
55
63
 
56
- ## Rails 5.2.2 (December 04, 2018) ##
64
+ * Move `enqueue`/`enqueue_at` notifications to an around callback.
57
65
 
58
- * Make sure `assert_enqueued_with()` & `assert_performed_with()` work reliably with hash arguments.
66
+ Improves timing accuracy over the old after callback by including
67
+ time spent writing to the adapter's IO implementation.
59
68
 
60
- *Sharang Dashputre*
69
+ *Zach Kemp*
61
70
 
62
- * Restore `ActionController::Parameters` support to `ActiveJob::Arguments.serialize`.
71
+ * Allow call `assert_enqueued_with` with no block.
63
72
 
64
- *Bernie Chiu*
73
+ Example:
74
+ ```
75
+ def test_assert_enqueued_with
76
+ MyJob.perform_later(1,2,3)
77
+ assert_enqueued_with(job: MyJob, args: [1,2,3], queue: 'low')
65
78
 
66
- * Restore `HashWithIndifferentAccess` support to `ActiveJob::Arguments.deserialize`.
79
+ MyJob.set(wait_until: Date.tomorrow.noon).perform_later
80
+ assert_enqueued_with(job: MyJob, at: Date.tomorrow.noon)
81
+ end
82
+ ```
67
83
 
68
- *Gannon McGibbon*
84
+ *bogdanvlviv*
69
85
 
70
- * Include deserialized arguments in job instances returned from
71
- `assert_enqueued_with` and `assert_performed_with`
86
+ * Allow passing multiple exceptions to `retry_on`, and `discard_on`.
72
87
 
73
- *Alan Wu*
88
+ *George Claghorn*
74
89
 
75
- * Increment execution count before deserialize arguments.
90
+ * Pass the error instance as the second parameter of block executed by `discard_on`.
76
91
 
77
- Currently, the execution count increments after deserializes arguments.
78
- Therefore, if an error occurs with deserialize, it retries indefinitely.
92
+ Fixes #32853.
79
93
 
80
94
  *Yuji Yaginuma*
81
95
 
96
+ * Remove support for Qu gem.
82
97
 
83
- ## Rails 5.2.1.1 (November 27, 2018) ##
84
-
85
- * Do not deserialize GlobalID objects that were not generated by Active Job.
86
-
87
- Trusting any GlobaID object when deserializing jobs can allow attackers to access
88
- information that should not be accessible to them.
89
-
90
- Fix CVE-2018-16476.
91
-
92
- *Rafael Mendonça França*
93
-
98
+ Reasons are that the Qu gem wasn't compatible since Rails 5.1,
99
+ gem development was stopped in 2014 and maintainers have
100
+ confirmed its demise. See issue #32273
94
101
 
95
- ## Rails 5.2.1 (August 07, 2018) ##
102
+ *Alberto Almagro*
96
103
 
97
- * Pass the error instance as the second parameter of block executed by `discard_on`.
98
-
99
- Fixes #32853.
104
+ * Add support for timezones to Active Job.
100
105
 
101
- *Yuji Yaginuma*
106
+ Record what was the current timezone in effect when the job was
107
+ enqueued and then restore when the job is executed in same way
108
+ that the current locale is recorded and restored.
102
109
 
103
- ## Rails 5.2.0 (April 09, 2018) ##
104
-
105
- * Allow block to be passed to `ActiveJob::Base.discard_on` to allow custom handling of discard jobs.
106
-
107
- Example:
110
+ *Andrew White*
108
111
 
109
- class RemoteServiceJob < ActiveJob::Base
110
- discard_on(CustomAppException) do |job, exception|
111
- ExceptionNotifier.caught(exception)
112
- end
112
+ * Rails 6 requires Ruby 2.5.0 or newer.
113
113
 
114
- def perform(*args)
115
- # Might raise CustomAppException for something domain specific
116
- end
117
- end
114
+ *Jeremy Daer*, *Kasper Timm Hansen*
118
115
 
119
- *Aidan Haran*
116
+ * Add support to define custom argument serializers.
120
117
 
121
- * Support redis-rb 4.0.
118
+ *Evgenii Pecherkin*, *Rafael Mendonça França*
122
119
 
123
- *Jeremy Daer*
124
120
 
125
- Please check [5-1-stable](https://github.com/rails/rails/blob/5-1-stable/activejob/CHANGELOG.md) for previous changes.
121
+ Please check [5-2-stable](https://github.com/rails/rails/blob/5-2-stable/activejob/CHANGELOG.md) for previous changes.
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2014-2018 David Heinemeier Hansson
1
+ Copyright (c) 2014-2019 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
@@ -1,7 +1,7 @@
1
1
  # Active Job -- Make work happen later
2
2
 
3
3
  Active Job is a framework for declaring jobs and making them run on a variety
4
- of queueing backends. These jobs can be everything from regularly scheduled
4
+ of queuing backends. These jobs can be everything from regularly scheduled
5
5
  clean-ups, to billing charges, to mailings. Anything that can be chopped up into
6
6
  small units of work and run in parallel, really.
7
7
 
@@ -20,7 +20,7 @@ switch between them without having to rewrite your jobs.
20
20
 
21
21
  ## Usage
22
22
 
23
- To learn how to use your preferred queueing backend see its adapter
23
+ To learn how to use your preferred queuing backend see its adapter
24
24
  documentation at
25
25
  [ActiveJob::QueueAdapters](http://api.rubyonrails.org/classes/ActiveJob/QueueAdapters.html).
26
26
 
@@ -39,7 +39,7 @@ end
39
39
  Enqueue a job like so:
40
40
 
41
41
  ```ruby
42
- MyJob.perform_later record # Enqueue a job to be performed as soon as the queueing system is free.
42
+ MyJob.perform_later record # Enqueue a job to be performed as soon as the queuing system is free.
43
43
  ```
44
44
 
45
45
  ```ruby
@@ -82,12 +82,18 @@ This works with any class that mixes in GlobalID::Identification, which
82
82
  by default has been mixed into Active Record classes.
83
83
 
84
84
 
85
- ## Supported queueing systems
85
+ ## Supported queuing systems
86
86
 
87
- Active Job has built-in adapters for multiple queueing backends (Sidekiq,
87
+ Active Job has built-in adapters for multiple queuing backends (Sidekiq,
88
88
  Resque, Delayed Job and others). To get an up-to-date list of the adapters
89
89
  see the API Documentation for [ActiveJob::QueueAdapters](http://api.rubyonrails.org/classes/ActiveJob/QueueAdapters.html).
90
90
 
91
+ **Please note:** We are not accepting pull requests for new adapters. We
92
+ encourage library authors to provide an ActiveJob adapter as part of
93
+ their gem, or as a stand-alone gem. For discussion about this see the
94
+ following PRs: [23311](https://github.com/rails/rails/issues/23311#issuecomment-176275718),
95
+ [21406](https://github.com/rails/rails/pull/21406#issuecomment-138813484), and [#32285](https://github.com/rails/rails/pull/32285).
96
+
91
97
  ## Auxiliary gems
92
98
 
93
99
  * [activejob-stats](https://github.com/seuros/activejob-stats)
@@ -102,7 +108,7 @@ The latest version of Active Job can be installed with RubyGems:
102
108
 
103
109
  Source code can be downloaded as part of the Rails project on GitHub:
104
110
 
105
- * https://github.com/rails/rails/tree/5-2-stable/activejob
111
+ * https://github.com/rails/rails/tree/master/activejob
106
112
 
107
113
  ## License
108
114
 
data/lib/active_job.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #--
4
- # Copyright (c) 2014-2018 David Heinemeier Hansson
4
+ # Copyright (c) 2014-2019 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
@@ -33,6 +33,7 @@ module ActiveJob
33
33
 
34
34
  autoload :Base
35
35
  autoload :QueueAdapters
36
+ autoload :Serializers
36
37
  autoload :ConfiguredJob
37
38
  autoload :TestCase
38
39
  autoload :TestHelper
@@ -14,29 +14,30 @@ module ActiveJob
14
14
  end
15
15
 
16
16
  # Raised when an unsupported argument type is set as a job argument. We
17
- # currently support NilClass, Integer, Fixnum, Float, String, TrueClass, FalseClass,
18
- # Bignum, BigDecimal, and objects that can be represented as GlobalIDs (ex: Active Record).
17
+ # currently support String, Integer, Float, NilClass, TrueClass, FalseClass,
18
+ # BigDecimal, Symbol, Date, Time, DateTime, ActiveSupport::TimeWithZone,
19
+ # ActiveSupport::Duration, Hash, ActiveSupport::HashWithIndifferentAccess,
20
+ # Array or GlobalID::Identification instances, although this can be extended
21
+ # by adding custom serializers.
19
22
  # Raised if you set the key for a Hash something else than a string or
20
23
  # a symbol. Also raised when trying to serialize an object which can't be
21
- # identified with a Global ID - such as an unpersisted Active Record model.
24
+ # identified with a GlobalID - such as an unpersisted Active Record model.
22
25
  class SerializationError < ArgumentError; end
23
26
 
24
27
  module Arguments
25
28
  extend self
26
- # :nodoc:
27
- TYPE_WHITELIST = [ NilClass, String, Integer, Float, BigDecimal, TrueClass, FalseClass ]
28
- TYPE_WHITELIST.push(Fixnum, Bignum) unless 1.class == Integer
29
-
30
- # Serializes a set of arguments. Whitelisted types are returned
31
- # as-is. Arrays/Hashes are serialized element by element.
32
- # All other types are serialized using GlobalID.
29
+ # Serializes a set of arguments. Intrinsic types that can safely be
30
+ # serialized without mutation are returned as-is. Arrays/Hashes are
31
+ # serialized element by element. All other types are serialized using
32
+ # GlobalID.
33
33
  def serialize(arguments)
34
34
  arguments.map { |argument| serialize_argument(argument) }
35
35
  end
36
36
 
37
- # Deserializes a set of arguments. Whitelisted types are returned
38
- # as-is. Arrays/Hashes are deserialized element by element.
39
- # All other types are deserialized using GlobalID.
37
+ # Deserializes a set of arguments. Intrinsic types that can safely be
38
+ # deserialized without mutation are returned as-is. Arrays/Hashes are
39
+ # deserialized element by element. All other types are deserialized using
40
+ # GlobalID.
40
41
  def deserialize(arguments)
41
42
  arguments.map { |argument| deserialize_argument(argument) }
42
43
  rescue
@@ -44,17 +45,30 @@ module ActiveJob
44
45
  end
45
46
 
46
47
  private
48
+
49
+ # :nodoc:
50
+ PERMITTED_TYPES = [ NilClass, String, Integer, Float, BigDecimal, TrueClass, FalseClass ]
51
+ # :nodoc:
52
+ GLOBALID_KEY = "_aj_globalid"
53
+ # :nodoc:
54
+ SYMBOL_KEYS_KEY = "_aj_symbol_keys"
47
55
  # :nodoc:
48
- GLOBALID_KEY = "_aj_globalid".freeze
56
+ WITH_INDIFFERENT_ACCESS_KEY = "_aj_hash_with_indifferent_access"
49
57
  # :nodoc:
50
- SYMBOL_KEYS_KEY = "_aj_symbol_keys".freeze
58
+ OBJECT_SERIALIZER_KEY = "_aj_serialized"
59
+
51
60
  # :nodoc:
52
- WITH_INDIFFERENT_ACCESS_KEY = "_aj_hash_with_indifferent_access".freeze
53
- private_constant :GLOBALID_KEY, :SYMBOL_KEYS_KEY, :WITH_INDIFFERENT_ACCESS_KEY
61
+ RESERVED_KEYS = [
62
+ GLOBALID_KEY, GLOBALID_KEY.to_sym,
63
+ SYMBOL_KEYS_KEY, SYMBOL_KEYS_KEY.to_sym,
64
+ OBJECT_SERIALIZER_KEY, OBJECT_SERIALIZER_KEY.to_sym,
65
+ WITH_INDIFFERENT_ACCESS_KEY, WITH_INDIFFERENT_ACCESS_KEY.to_sym,
66
+ ]
67
+ private_constant :PERMITTED_TYPES, :RESERVED_KEYS, :GLOBALID_KEY, :SYMBOL_KEYS_KEY, :WITH_INDIFFERENT_ACCESS_KEY
54
68
 
55
69
  def serialize_argument(argument)
56
70
  case argument
57
- when *TYPE_WHITELIST
71
+ when *PERMITTED_TYPES
58
72
  argument
59
73
  when GlobalID::Identification
60
74
  convert_to_global_id_hash(argument)
@@ -70,7 +84,7 @@ module ActiveJob
70
84
  when -> (arg) { arg.respond_to?(:permitted?) }
71
85
  serialize_indifferent_hash(argument.to_h)
72
86
  else
73
- raise SerializationError.new("Unsupported argument type: #{argument.class.name}")
87
+ Serializers.serialize(argument)
74
88
  end
75
89
  end
76
90
 
@@ -78,13 +92,15 @@ module ActiveJob
78
92
  case argument
79
93
  when String
80
94
  argument
81
- when *TYPE_WHITELIST
95
+ when *PERMITTED_TYPES
82
96
  argument
83
97
  when Array
84
98
  argument.map { |arg| deserialize_argument(arg) }
85
99
  when Hash
86
100
  if serialized_global_id?(argument)
87
101
  deserialize_global_id argument
102
+ elsif custom_serialized?(argument)
103
+ Serializers.deserialize(argument)
88
104
  else
89
105
  deserialize_hash(argument)
90
106
  end
@@ -101,6 +117,10 @@ module ActiveJob
101
117
  GlobalID::Locator.locate hash[GLOBALID_KEY]
102
118
  end
103
119
 
120
+ def custom_serialized?(hash)
121
+ hash.key?(OBJECT_SERIALIZER_KEY)
122
+ end
123
+
104
124
  def serialize_hash(argument)
105
125
  argument.each_with_object({}) do |(key, value), hash|
106
126
  hash[serialize_hash_key(key)] = serialize_argument(value)
@@ -117,14 +137,6 @@ module ActiveJob
117
137
  result
118
138
  end
119
139
 
120
- # :nodoc:
121
- RESERVED_KEYS = [
122
- GLOBALID_KEY, GLOBALID_KEY.to_sym,
123
- SYMBOL_KEYS_KEY, SYMBOL_KEYS_KEY.to_sym,
124
- WITH_INDIFFERENT_ACCESS_KEY, WITH_INDIFFERENT_ACCESS_KEY.to_sym,
125
- ]
126
- private_constant :RESERVED_KEYS
127
-
128
140
  def serialize_hash_key(key)
129
141
  case key
130
142
  when *RESERVED_KEYS
@@ -9,6 +9,7 @@ require "active_job/execution"
9
9
  require "active_job/callbacks"
10
10
  require "active_job/exceptions"
11
11
  require "active_job/logging"
12
+ require "active_job/timezones"
12
13
  require "active_job/translation"
13
14
 
14
15
  module ActiveJob #:nodoc:
@@ -39,7 +40,7 @@ module ActiveJob #:nodoc:
39
40
  # Records that are passed in are serialized/deserialized using Global
40
41
  # ID. More information can be found in Arguments.
41
42
  #
42
- # To enqueue a job to be performed as soon as the queueing system is free:
43
+ # To enqueue a job to be performed as soon as the queuing system is free:
43
44
  #
44
45
  # ProcessPhotoJob.perform_later(photo)
45
46
  #
@@ -67,6 +68,7 @@ module ActiveJob #:nodoc:
67
68
  include Callbacks
68
69
  include Exceptions
69
70
  include Logging
71
+ include Timezones
70
72
  include Translation
71
73
 
72
74
  ActiveSupport.run_load_hooks(:active_job, self)
@@ -29,6 +29,9 @@ module ActiveJob
29
29
  included do
30
30
  define_callbacks :perform
31
31
  define_callbacks :enqueue
32
+
33
+ class_attribute :return_false_on_aborted_enqueue, instance_accessor: false, instance_predicate: false
34
+ self.return_false_on_aborted_enqueue = false
32
35
  end
33
36
 
34
37
  # These methods will be included into any Active Job object, adding
@@ -130,7 +133,7 @@ module ActiveJob
130
133
  set_callback(:enqueue, :after, *filters, &blk)
131
134
  end
132
135
 
133
- # Defines a callback that will get called around the enqueueing
136
+ # Defines a callback that will get called around the enqueuing
134
137
  # of the job.
135
138
  #
136
139
  # class VideoProcessJob < ActiveJob::Base