resque-retry 1.6.0 → 1.7.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 18f7b00c3922adebe816efc0357bfba5925dddc5ae85bea9d4b69e0a05e9fb46
4
- data.tar.gz: dd4d14d570a628aa667445cd4f64929ecc0bcab22bc536b164bc9e9437574a59
3
+ metadata.gz: ab175830aa9de0d24e514a8bd054b1ebe8a2924ba134fd975013685e84828b9d
4
+ data.tar.gz: a6cb49fb45375e4a82a8811e126f428de4acda1248d7b6cc6de5df6d9b6340bf
5
5
  SHA512:
6
- metadata.gz: ffab51ba83437149d5bc39400983e436a38cd4e2d200b7562fa892f16f6facf1310a0dcf666030d8181aec5424dbcd80c146983ce25b3579f7e9a4088692dc8f
7
- data.tar.gz: dcef4495dfc111270f16bb02dafa72d1fb66caebe4302dbb0359aad2dcaf72f29c887cc7e0caa22c3ef012aba5813933fb19c1c210b597bea17b6ab4ab561ff6
6
+ metadata.gz: f4176df779bbc212e25d64190ae7680ee410beebb663d6b502f45fd73532b14fa4ed9f86dc76e74474dd757247b45b0a8503037a6154c814ffad159dec22413a
7
+ data.tar.gz: 2109a5558025ff2d7b5b8e1cd952242aad11641b11b1036332d2f68111c1d6ca5f9de402ec92376aedff37d6dff534bed0e017196e85f451b976e405168a71da
data/HISTORY.md CHANGED
@@ -1,11 +1,41 @@
1
+ # 1.7.4 (2020-10-09)
2
+
3
+ * Rework how the default `retry_limit` is calculated
4
+ * Numerous documentation updates
5
+
6
+ # 1.7.3 (2019-11-21)
7
+
8
+ * Do not crash if job class is not found on the resque-web server
9
+
10
+ # 1.7.2 (2019-11-21)
11
+
12
+ * Address part 2 of issue #158
13
+
14
+ # 1.7.1 (2019-07-10)
15
+
16
+ * Prevent `NoMethodError` when calculating `retry_delay`
17
+
18
+ # 1.7.0 (2019-06-15)
19
+
20
+ !!! [Potential] breaking changes -- details below !!!
21
+
22
+ * Remove support for `args_for_retry` -- it has been deprecated for almost 5
23
+ years
24
+ * Work w/ shallow-clone(s) of `args` in `MultipleWithRetrySuppression#save` and
25
+ `Retry.retry_args`
26
+ * Remove deprecated options from `Gem::Specification`
27
+ * Clean-up formatting in HISTORY.md
28
+
1
29
  # 1.6.0 (2019-04-21)
2
30
 
3
- * Clean-up / refactoring in preparation for a release (`ruby` deprecations, etc.)
31
+ * Clean-up / refactoring in preparation for a release (`ruby` deprecations,
32
+ etc.)
4
33
  * Loosen version requirement to allow resque v2.0 and up (@peret)
5
34
 
6
35
  # 1.5.3 (2018-11-26)
7
36
 
8
- * Monkey patch in the `requeue_queue` method onto the `Resque::Failure` backend (this _should_ be a temporary fix)
37
+ * Monkey patch in the `requeue_queue` method onto the `Resque::Failure` backend
38
+ (this _should_ be a temporary fix)
9
39
 
10
40
  # 1.5.2 (2018-07-16)
11
41
 
@@ -14,11 +44,15 @@
14
44
 
15
45
  # 1.5.1 (2018-01-07)
16
46
 
17
- * Added build support for `ruby-2.2.x`, `ruby-2.3.x`, `ruby-2.4.x` and `ruby-2.5.x`
18
- * Dropped build support for `ruby-1.9.3` and `ruby-2.0.0` (these versions are no unsupported)
47
+ * Added build support for `ruby-2.2.x`, `ruby-2.3.x`, `ruby-2.4.x` and
48
+ `ruby-2.5.x`
49
+ * Dropped build support for `ruby-1.9.3` and `ruby-2.0.0` (these versions are
50
+ no unsupported)
19
51
  * Fix some deprecation warnings in tests
20
- * Feature: If no exact exception class is present in `@retry_exceptions` hash, try to find closest superclass (@fanfilmu)
21
- * Feature: When running Resque inline, explicitly don't try to retry, don't touch Redis (@michaelglass)
52
+ * Feature: If no exact exception class is present in `@retry_exceptions` hash,
53
+ try to find closest superclass (@fanfilmu)
54
+ * Feature: When running Resque inline, explicitly don't try to retry, don't
55
+ touch Redis (@michaelglass)
22
56
 
23
57
  # 1.5.0 (2015-10-24)
24
58
 
@@ -40,25 +74,35 @@
40
74
  ## 1.3.0 (2014-07-25)
41
75
 
42
76
  * Adjust gem dependency on `resque-scheduler` to ~> 3.0
43
- * Deprecated: `args_for_retry` in favor of `retry_args` (will output deprecation warnings if your using the older method).
44
- * Feature: Allow changing the args for a given exception using `retry_args_for_exception` (@jonp)
77
+ * Deprecated: `args_for_retry` in favor of `retry_args` (will output deprecation
78
+ warnings if your using the older method).
79
+ * Feature: Allow changing the args for a given exception using
80
+ `retry_args_for_exception` (@jonp)
45
81
  * Feature: Allow setting `@expire_retry_key_after` on the fly (@orenmazor)
46
82
 
47
83
  ## 1.2.1 (2014-06-09)
48
84
 
49
- * Fixed Kernel.rand: "invalid argument - 0.0 (ArgumentError)" error with "ExponentialBackoff" (on "Rubinius") when `retry_delay_multiplicand_min` and `retry_delay_multiplicand_max` were the same value (@saizai)
85
+ * Fixed Kernel.rand: "invalid argument - 0.0 (ArgumentError)" error with
86
+ "ExponentialBackoff" (on "Rubinius") when `retry_delay_multiplicand_min` and
87
+ `retry_delay_multiplicand_max` were the same value (@saizai)
50
88
 
51
89
  ## 1.2.0 (2014-05-19)
52
90
 
53
- * Fixed scenario where job does not get retried correctly when `perform` is not called as expected.
54
- * Feature: Optional `@expire_retry_key_after` settings; expires retry counters from redis to save you cleaning up stale state.
55
- * Feature: Expose inner-workings of plugin through debug messages using `Resque.logger` (when logging level is Logger:DEBUG).
91
+ * Fixed scenario where job does not get retried correctly when `perform` is not
92
+ called as expected.
93
+ * Feature: Optional `@expire_retry_key_after` settings; expires retry counters
94
+ from redis to save you cleaning up stale state.
95
+ * Feature: Expose inner-workings of plugin through debug messages using
96
+ `Resque.logger` (when logging level is Logger:DEBUG).
56
97
 
57
98
  ## 1.1.4 (2014-03-17)
58
99
 
59
- * Fixed displaying retry information in resque web interface, caused by `Resque::Helpers` being deprecated.
60
- * Feature: Allow `@fatal_exceptions` as inverse of `@retry_exceptions`, when fatal exception is raised the job will be immediately fail.
61
- * Feature: Allow a random retry delay (within a range) when using exponential backoff strategy.
100
+ * Fixed displaying retry information in resque web interface, caused by
101
+ `Resque::Helpers` being deprecated.
102
+ * Feature: Allow `@fatal_exceptions` as inverse of `@retry_exceptions`, when
103
+ a fatal exception is raised the job will be immediately fail.
104
+ * Feature: Allow a random retry delay (within a range) when using exponential
105
+ backoff strategy.
62
106
 
63
107
  ## 1.1.1 (2014-03-12)
64
108
 
@@ -67,7 +111,8 @@
67
111
  ## 1.1.0 (2014-03-12)
68
112
 
69
113
  * Remove dependence on `Resque::Helpers`, will be removed in Resque 2.0
70
- * Use SHA1 for default `#retry_identifier` to prevents issues with long args gobbling space.
114
+ * Use SHA1 for default `#retry_identifier` to prevents issues with long args
115
+ gobbling space.
71
116
  * Minimum version of Resque is now ~> 1.25
72
117
 
73
118
  ## 1.0.0 (2012-09-07)
@@ -75,12 +120,16 @@
75
120
  ** !!! WARNING !!! INCLUDES NON-BACKWARDS COMPATIBLE CHANGES **
76
121
 
77
122
  * Fixed issues related to infinite job retries and v1.20.0 of resque.
78
- * Minimum gem dependency versions changed: resque >= 1.10.0, resque-scheduler >= 1.9.9
79
- * Feature: Setting `@retry_job_delegate` allows you to separate the original job from a the retry job. (@tanob/@jniesen)
80
- * Web interface will work without needing to `require` your job code. (n.b. less details available via web).
123
+ * Minimum gem dependency versions changed: resque >= 1.10.0, resque-scheduler
124
+ >= 1.9.9
125
+ * Feature: Setting `@retry_job_delegate` allows you to separate the original job
126
+ from a the retry job. (@tanob/@jniesen)
127
+ * Web interface will work without needing to `require` your job code. (n.b.
128
+ less details available via web).
81
129
  * IMPORTANT: `#identifier` method has been namespaced to `#retry_identifier`.
82
130
  * Bugfix: `Remove` button on retry web interface was not working.
83
- * Feature: Allow `tagging` exceptions with a module instead of an exception class. (@tils - Tilmann Singer)
131
+ * Feature: Allow `tagging` exceptions with a module instead of an exception
132
+ class. (@tils - Tilmann Singer)
84
133
 
85
134
  ## 0.2.2 (2011-12-08)
86
135
 
@@ -88,7 +137,8 @@
88
137
 
89
138
  ## 0.2.1 (2011-11-23)
90
139
 
91
- * Bugfix: Fixed error when we tried to parse a number/string as JSON on the reque-retry web interface.
140
+ * Bugfix: Fixed error when we tried to parse a number/string as JSON on the
141
+ reque-retry web interface.
92
142
 
93
143
  ## 0.2.0 (2011-11-22)
94
144
 
@@ -98,9 +148,10 @@
98
148
  PREVIOUSLY: 0 == infinite retries.
99
149
  NOW: -1 == infinite retries; 0 == means never retry.
100
150
 
101
- * Bugfix: `#redis_retry_key` incorrectly built key when custom identifier was used. (Bogdan Gusiev)
151
+ * Bugfix: `#redis_retry_key` incorrectly built key when custom identifier was
152
+ used. (Bogdan Gusiev)
102
153
  * Feature: Ability to sleep worker after re-queuing a job, may be used to bias
103
- against the same worker from picking up the job again. (Michael Keirnan)
154
+ against the same worker from picking up the job again. (Michael Keirnan)
104
155
  * Feature: Ability to remove retry jobs using resque-web. (Thiago Morello)
105
156
  * Added example demo application.
106
157
  * Added Bundler `Gemfile`.
@@ -130,7 +181,8 @@
130
181
  ## 0.0.2 (2010-05-06)
131
182
 
132
183
  * Bugfix: Were calling non-existent method to delete redis key.
133
- * Delay no-longer falls back to `sleep`. resque-scheduler is a required dependancy.
184
+ * Delay no-longer falls back to `sleep`. resque-scheduler is a required
185
+ dependancy.
134
186
  * Redis key doesn't include ending colon `:` if no args were passed to the job.
135
187
 
136
188
  ## 0.0.1 (2010-04-27)
data/README.md CHANGED
@@ -231,8 +231,8 @@ class ExampleJob
231
231
  extend Resque::Plugins::Retry
232
232
  @queue = :testing
233
233
 
234
- def self.retry_delay(exception)
235
- if exception == SocketError
234
+ def self.retry_delay(exception_class)
235
+ if exception_class == SocketError
236
236
  10
237
237
  else
238
238
  1
@@ -359,7 +359,12 @@ You may also want to specify different retry delays for different exception
359
359
  types. You may optionally set `@retry_exceptions` to a hash where the keys are
360
360
  your specific exception classes to retry on, and the values are your retry
361
361
  delays in seconds or an array of retry delays to be used similar to exponential
362
- backoff.
362
+ backoff. `resque-retry` will attempt to determine your retry strategy's
363
+ `@retry_limit` based on your specified `@retry_exceptions`. If, however, you
364
+ define `@retry_limit` explicitly, you should define `@retry_limit` such that it
365
+ allows for your retry strategies to complete. If your `@retry_limit` is less
366
+ than the number of desired retry attempts defined in `@retry_exceptions`, your
367
+ job will only retry `@retry_limit` times.
363
368
  ```ruby
364
369
  class DeliverSMS
365
370
  extend Resque::Plugins::Retry
@@ -374,9 +379,15 @@ end
374
379
  ```
375
380
 
376
381
  In the above example, Resque would retry any `DeliverSMS` jobs which throw a
377
- `NetworkError` or `SystemCallError`. If the job throws a `NetworkError` it
378
- will be retried 30 seconds later, if it throws `SystemCallError` it will first
379
- retry 120 seconds later then subsequent retry attempts 240 seconds later.
382
+ `NetworkError` or `SystemCallError`. The `@retry_limit` would be inferred to be
383
+ 2 based on the longest retry strategy defined in `@retry_exceptions`. If the job
384
+ throws a `NetworkError` it will be retried 30 seconds later with a subsequent
385
+ retry 30 seconds after that. If it throws a `SystemCallError` it will first
386
+ retry 120 seconds later then a subsequent retry attempt 240 seconds later. If
387
+ the job fails due to a `NetworkError`, Resque would retry the job in 30 seconds.
388
+ If the job fails a second time, this time due to a `SystemCallError`, the next
389
+ retry would occur 240 seconds later as specified in the `SystemCallError`
390
+ array defined in `@retry_exceptions`.
380
391
 
381
392
  ### <a name="fail_fast"></a> Fail Fast For Specific Exceptions
382
393
 
@@ -511,7 +522,7 @@ class ExampleJob
511
522
 
512
523
  def self.work(*args)
513
524
  user_id, user_mode, record_id = *args
514
-
525
+
515
526
  Resque.enqueue_to(
516
527
  target_queue_for_args(user_id, user_mode, record_id),
517
528
  self,
@@ -531,7 +542,7 @@ class ExampleJob
531
542
  user_id, user_mode, record_id = *args
532
543
 
533
544
  if user_mode
534
- 'high
545
+ 'high'
535
546
  else
536
547
  'low'
537
548
  end
@@ -585,7 +596,7 @@ end
585
596
 
586
597
  This saves you from having to run a "house cleaning" or "errand" job.
587
598
 
588
- The expiary timeout is "pushed forward" or "touched" after each failure to
599
+ The expiry timeout is "pushed forward" or "touched" after each failure to
589
600
  ensure it's not expired too soon.
590
601
 
591
602
  ### <a name="callbacks"></a> Try Again and Give Up Callbacks
@@ -66,15 +66,23 @@ module ResqueRetry
66
66
  # cancels job retry
67
67
  def cancel_retry(job)
68
68
  klass = get_class(job)
69
- retry_key = retry_key_for_job(job)
70
- Resque.remove_delayed(klass, *job['args'])
71
- Resque.redis.del("failure-#{retry_key}")
72
- Resque.redis.del(retry_key)
69
+ if klass
70
+ retry_key = retry_key_for_job(job)
71
+ Resque.remove_delayed(klass, *job['args'])
72
+ Resque.redis.del("failure-#{retry_key}")
73
+ Resque.redis.del(retry_key)
74
+ else
75
+ raise 'cannot cancel, job not found'
76
+ end
73
77
  end
74
78
 
75
79
  private
76
80
  def get_class(job)
77
- Resque::Job.new(nil, nil).constantize(job['class'])
81
+ begin
82
+ Resque::Job.new(nil, nil).constantize(job['class'])
83
+ rescue
84
+ nil
85
+ end
78
86
  end
79
87
  end
80
88
 
@@ -1,3 +1,3 @@
1
1
  module ResqueRetry
2
- VERSION = '1.6.0'
2
+ VERSION = '1.7.4'
3
3
  end
@@ -27,7 +27,9 @@ module Resque
27
27
  #
28
28
  # @api private
29
29
  def save
30
- log_message 'failure backend save', args_from(payload), exception
30
+ args = args_from(payload)
31
+
32
+ log_message 'failure backend save', args, exception
31
33
 
32
34
  retryable = retryable?
33
35
  job_being_retried = retryable && retrying?
@@ -35,7 +37,7 @@ module Resque
35
37
  if !job_being_retried
36
38
  log_message(
37
39
  "#{retryable ? '' : 'non-'}retryable job is not being retried - sending failure to superclass",
38
- args_from(payload),
40
+ args,
39
41
  exception
40
42
  )
41
43
 
@@ -44,7 +46,7 @@ module Resque
44
46
  elsif retry_delay > 0
45
47
  log_message(
46
48
  "retry_delay: #{retry_delay} > 0 - saving details in Redis",
47
- args_from(payload),
49
+ args,
48
50
  exception
49
51
  )
50
52
 
@@ -67,7 +69,7 @@ module Resque
67
69
  else
68
70
  log_message(
69
71
  "retry_delay: #{retry_delay} <= 0 - ignoring",
70
- args_from(payload),
72
+ args,
71
73
  exception
72
74
  )
73
75
  end
@@ -100,7 +102,7 @@ module Resque
100
102
  protected
101
103
 
102
104
  def args_from(payload)
103
- (payload || {})['args']
105
+ (payload || {})['args'].dup
104
106
  end
105
107
 
106
108
  def cleanup_retry_failure_log!
@@ -80,10 +80,11 @@ module Resque
80
80
 
81
81
  # Selects the delay from the backoff strategy
82
82
  #
83
+ # @param _ [Exception] unused exception argument for signature parity
83
84
  # @return [Number] seconds to delay until the next retry.
84
85
  #
85
86
  # @api private
86
- def retry_delay
87
+ def retry_delay(_ = nil)
87
88
  delay = backoff_strategy[retry_attempt] || backoff_strategy.last
88
89
  # if the values are the same don't bother generating a random number, if
89
90
  # the delta is zero, some platforms will raise an error
@@ -107,11 +107,27 @@ module Resque
107
107
  # A retry limit of 0 will *never* retry.
108
108
  # A retry limit of -1 or below will retry forever.
109
109
  #
110
+ # The default value is: `1` or in the case of where `@retry_exceptions` is
111
+ # specified, and it contains one or more `Array` values, the maximum
112
+ # length will be used (e.g. `@retry_exceptions = { NetworkError => 30, SystemCallError => [120, 240] }`
113
+ # would return `2` because `SystemCallError` _should_ be attempted at
114
+ # least twice to respect the specified configuration).
115
+ #
110
116
  # @return [Fixnum]
111
117
  #
112
118
  # @api public
113
119
  def retry_limit
114
- @retry_limit ||= 1
120
+ @retry_limit ||= begin
121
+ default_retry_limit = 1
122
+ if instance_variable_defined?(:@retry_exceptions) && @retry_exceptions.is_a?(Hash)
123
+ @retry_exceptions.values.each do |value|
124
+ if value.is_a?(Array) && value.length > default_retry_limit
125
+ default_retry_limit = value.length
126
+ end
127
+ end
128
+ end
129
+ default_retry_limit
130
+ end
115
131
  end
116
132
 
117
133
  # Number of retry attempts used to try and perform the job
@@ -135,9 +151,13 @@ module Resque
135
151
  #
136
152
  # @api public
137
153
  def retry_delay(exception_class = nil)
138
- if instance_variable_defined?(:@retry_exceptions) && @retry_exceptions.is_a?(Hash)
154
+ if \
155
+ !exception_class.nil? && \
156
+ instance_variable_defined?(:@retry_exceptions) && \
157
+ @retry_exceptions.is_a?(Hash)
139
158
  delay = @retry_exceptions[exception_class] ||= begin
140
- relevant_definitions = @retry_exceptions.select { |ex| exception_class <= ex }
159
+ relevant_definitions = \
160
+ @retry_exceptions.select { |ex| exception_class <= ex }
141
161
  relevant_definitions.any? ? relevant_definitions.sort.first[1] : 0
142
162
  end
143
163
  # allow an array of delays.
@@ -186,15 +206,7 @@ module Resque
186
206
  #
187
207
  # @api public
188
208
  def retry_args(*args)
189
- # Here for backwards compatibility. If an "args_for_retry" method exists
190
- # invoke it, but warn that it is deprecated (and will be removed in a
191
- # future revision)
192
- if respond_to?(:args_for_retry)
193
- warn "`Resque::Plugins::Retry#args_for_retry` is deprecated, please use `Resque::Plugins::Retry#retry_args` instead."
194
- args_for_retry(*args)
195
- else
196
- args
197
- end
209
+ args.dup
198
210
  end
199
211
 
200
212
  # @abstract
@@ -460,7 +472,8 @@ module Resque
460
472
  # set/update the "retry_key" expiration
461
473
  if expire_retry_key_after
462
474
  log_message "updating expiration for retry key: #{retry_key}", args
463
- Resque.redis.expire(retry_key, retry_delay + expire_retry_key_after)
475
+ exception_class = Object.const_get(args[0]) rescue nil
476
+ Resque.redis.expire(retry_key, retry_delay(exception_class) + expire_retry_key_after)
464
477
  end
465
478
  end
466
479
 
@@ -25,7 +25,6 @@ Gem::Specification.new do |s|
25
25
  s.homepage = 'http://github.com/lantins/resque-retry'
26
26
  s.license = 'MIT'
27
27
 
28
- s.has_rdoc = false
29
28
  s.files = `git ls-files`.split($/)
30
29
  s.require_paths = %w[lib]
31
30
 
@@ -128,4 +128,11 @@ class ExponentialBackoffTest < Minitest::Test
128
128
  assert_equal 4, Resque.info[:failed], 'failed jobs'
129
129
  assert_equal 0, Resque.info[:pending], 'pending jobs'
130
130
  end
131
+
132
+ def test_backoff_with_expiration
133
+ Resque.redis.expects(:expire)
134
+
135
+ Resque.enqueue(ExponentialBackoffWithExpiryJob)
136
+ perform_next_job(@worker)
137
+ end
131
138
  end
@@ -1,6 +1,6 @@
1
1
  require 'test_helper'
2
2
 
3
- class RetryExeptionDelayTest < Minitest::Test
3
+ class RetryExceptionDelayTest < Minitest::Test
4
4
  def setup
5
5
  Resque.redis.flushall
6
6
  @worker = Resque::Worker.new(:testing)
@@ -43,4 +43,12 @@ class RetryExeptionDelayTest < Minitest::Test
43
43
  assert_in_delta (start_time + 10), delayed[1], 1.00, '2nd retry delay timestamp'
44
44
  assert_in_delta (start_time + 15), delayed[2], 1.00, '3rd retry delay timestamp'
45
45
  end
46
+
47
+ def test_retry_delay_per_exception_multiple_delay_no_retry_limit_specified
48
+ # For this job-type there are 3 `Exception` types defined: `Exception`,
49
+ # `StandardError` and `Timeout::Error` -- their array-lengths are are 1, 3
50
+ # and 5 (respectively). We expect the `retry_limit` to default to the
51
+ # maximum length of the `Array` of delays or 1 (in this case: 5)
52
+ assert_equal 5, PerExceptionClassRetryCountArrayNoRetryLimitSpecifiedJob.retry_limit
53
+ end
46
54
  end
@@ -55,13 +55,6 @@ class RetryTest < Minitest::Test
55
55
  assert_equal test_args, job['args']
56
56
  end
57
57
 
58
- def test_job_args_can_be_modified_by_overriding_args_for_retry
59
- Resque.enqueue(DeprecatedRetryWithModifiedArgsJob)
60
- DeprecatedRetryWithModifiedArgsJob.expects(:warn)
61
- DeprecatedRetryWithModifiedArgsJob.expects(:args_for_retry)
62
- perform_next_job(@worker)
63
- end
64
-
65
58
  def test_job_args_can_be_modified_by_overriding_retry_args
66
59
  Resque.enqueue(RetryWithModifiedArgsJob)
67
60
  RetryWithModifiedArgsJob.expects(:retry_args)
@@ -278,6 +271,7 @@ class RetryTest < Minitest::Test
278
271
  end
279
272
 
280
273
  def test_retry_delay
274
+ assert_equal 0, NoRetryDelayJob.retry_delay
281
275
  assert_equal 3, NormalRetryCountJob.retry_delay
282
276
  assert_equal 7, PerExceptionClassRetryCountJob.retry_delay(StandardError)
283
277
  assert_equal 7, PerExceptionClassRetryCountJob.retry_delay(CustomException)
@@ -293,6 +287,12 @@ class RetryTest < Minitest::Test
293
287
  perform_next_job(@worker)
294
288
  end
295
289
 
290
+ def test_expire_key_set_with_retry_exceptions
291
+ Resque.redis.expects(:expire).once.with(ExpiringJobWithRetryExceptions.redis_retry_key(StandardError), 17)
292
+ Resque.enqueue(ExpiringJobWithRetryExceptions, StandardError)
293
+ perform_next_job(@worker)
294
+ end
295
+
296
296
  def test_expire_key_setting_on_the_fly
297
297
  retry_key = 'resque-retry:FailFiveTimesWithCustomExpiryJob'
298
298
 
@@ -7,7 +7,7 @@ class NoRetryJob
7
7
  @queue = :testing
8
8
 
9
9
  def self.perform(*args)
10
- raise "error"
10
+ raise 'error'
11
11
  end
12
12
  end
13
13
 
@@ -28,6 +28,17 @@ class ExpiringJob
28
28
  end
29
29
  end
30
30
 
31
+ class ExpiringJobWithRetryExceptions
32
+ extend Resque::Plugins::Retry
33
+
34
+ @queue = :testing
35
+ @expire_retry_key_after = 10
36
+ @retry_exceptions = { StandardError => 7 }
37
+
38
+ def self.perform(*args)
39
+ end
40
+ end
41
+
31
42
  class RetryDefaultSettingsJob
32
43
  extend Resque::Plugins::Retry
33
44
  @queue = :testing
@@ -146,14 +157,6 @@ class InheritTestWithMoreExtraJob < InheritTestWithExtraJob
146
157
  end
147
158
  end
148
159
 
149
- class DeprecatedRetryWithModifiedArgsJob < RetryDefaultsJob
150
- @queue = :testing
151
-
152
- def self.args_for_retry(*args)
153
- # NOTE: implementation is irrelevant we only care that it's invoked
154
- end
155
- end
156
-
157
160
  class RetryWithModifiedArgsJob < RetryDefaultsJob
158
161
  @queue = :testing
159
162
 
@@ -251,6 +254,12 @@ class ExponentialBackoffWithRetryDelayMultiplicandMinAndMaxJob < RetryDefaultsJo
251
254
  @retry_delay_multiplicand_max = 3.0
252
255
  end
253
256
 
257
+ class ExponentialBackoffWithExpiryJob < RetryDefaultsJob
258
+ extend Resque::Plugins::ExponentialBackoff
259
+ @queue = :testing
260
+ @expire_retry_key_after = 60 * 60
261
+ end
262
+
254
263
  class InvalidRetryDelayMaxConfigurationJob
255
264
  @queue = :testing
256
265
  @retry_delay_multiplicand_max = 0.9
@@ -534,6 +543,13 @@ class CustomRetryIdentifierFailingJob
534
543
  end
535
544
  end
536
545
 
546
+ class NoRetryDelayJob
547
+ extend Resque::Plugins::Retry
548
+
549
+ @queue = :testing
550
+ @retry_exceptions = {}
551
+ end
552
+
537
553
  class NormalRetryCountJob
538
554
  extend Resque::Plugins::Retry
539
555
 
@@ -566,6 +582,17 @@ class PerExceptionClassRetryCountArrayJob
566
582
  end
567
583
  end
568
584
 
585
+ class PerExceptionClassRetryCountArrayNoRetryLimitSpecifiedJob
586
+ extend Resque::Plugins::Retry
587
+
588
+ @queue = :testing
589
+ @retry_exceptions = { Exception => 11, RuntimeError => [5, 10, 15], Timeout::Error => [2, 4, 6, 8, 10] }
590
+
591
+ def self.perform
592
+ raise RuntimeError, 'I always fail with a RuntimeError'
593
+ end
594
+ end
595
+
569
596
  # We can't design a job to fail during connect, see perform_next_job_fail_on_reconnect
570
597
  class FailsDuringConnectJob < RetryDefaultsJob
571
598
  @queue = :testing
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: resque-retry
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.0
4
+ version: 1.7.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luke Antins
8
8
  - Ryan Carver
9
9
  - Jonathan W. Zaleski
10
- autorequire:
10
+ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2019-04-21 00:00:00.000000000 Z
13
+ date: 2020-10-09 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: resque
@@ -208,7 +208,7 @@ homepage: http://github.com/lantins/resque-retry
208
208
  licenses:
209
209
  - MIT
210
210
  metadata: {}
211
- post_install_message:
211
+ post_install_message:
212
212
  rdoc_options: []
213
213
  require_paths:
214
214
  - lib
@@ -223,8 +223,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
223
223
  - !ruby/object:Gem::Version
224
224
  version: '0'
225
225
  requirements: []
226
- rubygems_version: 3.0.3
227
- signing_key:
226
+ rubygems_version: 3.1.4
227
+ signing_key:
228
228
  specification_version: 4
229
229
  summary: A resque plugin; provides retry, delay and exponential backoff support for
230
230
  resque jobs.