retryable 2.0.1 → 2.0.2
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 +4 -4
- data/README.md +17 -2
- data/lib/retryable.rb +10 -3
- data/lib/retryable/configuration.rb +4 -1
- data/lib/retryable/version.rb +1 -1
- data/spec/lib/retryable_spec.rb +14 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b8f678cc21a51e9421bbef9213728686216611e1
|
4
|
+
data.tar.gz: 88c5cfb49b9b9e91db47aa937283082b20053c98
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3aa5569b58419a57c8ce537ed9fe621ced5551f1685671765092800a3b57d6d3e0327b9389dd2277f716833b432c933ff80fbc81f18195760d4ed47a701564f0
|
7
|
+
data.tar.gz: f798b44022d4bc1607d890b2b804b4f5837ae6e1b95311912d8791684bde2da4aa429f70348463321078e7f253586ab7dbde03aa3c2dc0f909574e210bd193d3
|
data/README.md
CHANGED
@@ -9,7 +9,7 @@ Description
|
|
9
9
|
Runs a code block, and retries it when an exception occurs. It's great when
|
10
10
|
working with flakey webservices (for example).
|
11
11
|
|
12
|
-
It's configured using
|
12
|
+
It's configured using five optional parameters `:tries`, `:on`, `:sleep`, `:matching`, `:ensure`, `:exception_cb`, `:not` and
|
13
13
|
runs the passed block. Should an exception occur, it'll retry for (n-1) times.
|
14
14
|
|
15
15
|
Should the number of retries be reached without success, the last exception
|
@@ -56,7 +56,7 @@ end
|
|
56
56
|
|
57
57
|
## Defaults
|
58
58
|
|
59
|
-
:tries => 2, :on => StandardError, :sleep => 1, :matching => /.*/, :ensure => Proc.new { }, :exception_cb => Proc.new { }
|
59
|
+
:tries => 2, :on => StandardError, :sleep => 1, :matching => /.*/, :ensure => Proc.new { }, :exception_cb => Proc.new { }, :not => []
|
60
60
|
|
61
61
|
Retryable also could be configured globally to change those defaults:
|
62
62
|
|
@@ -68,6 +68,7 @@ Retryable.configure do |config|
|
|
68
68
|
config.on = StandardError
|
69
69
|
config.sleep = 1
|
70
70
|
config.tries = 2
|
71
|
+
config.not = []
|
71
72
|
end
|
72
73
|
```
|
73
74
|
|
@@ -130,6 +131,20 @@ Retryable.enabled?
|
|
130
131
|
=> false
|
131
132
|
```
|
132
133
|
|
134
|
+
Specify exceptions where a retry should NOT be performed
|
135
|
+
--------
|
136
|
+
No more tries will be made if an exception listed in `:not` is raised.
|
137
|
+
Takes precedence over `:on`.
|
138
|
+
|
139
|
+
```
|
140
|
+
class MyError < StandardError; end
|
141
|
+
|
142
|
+
Retryable.retryable(:tries => 5, :on => [StandardError], :not => [MyError]) do
|
143
|
+
raise MyError "No retries!"
|
144
|
+
end
|
145
|
+
|
146
|
+
```
|
147
|
+
|
133
148
|
Supported Ruby Versions
|
134
149
|
-------
|
135
150
|
|
data/lib/retryable.rb
CHANGED
@@ -17,6 +17,7 @@ module Retryable
|
|
17
17
|
# config.on = StandardError
|
18
18
|
# config.sleep = 1
|
19
19
|
# config.tries = 2
|
20
|
+
# config.not = []
|
20
21
|
# end
|
21
22
|
def configure
|
22
23
|
yield(configuration)
|
@@ -47,7 +48,8 @@ module Retryable
|
|
47
48
|
:on => self.configuration.on,
|
48
49
|
:matching => self.configuration.matching,
|
49
50
|
:ensure => self.configuration.ensure,
|
50
|
-
:exception_cb => self.configuration.exception_cb
|
51
|
+
:exception_cb => self.configuration.exception_cb,
|
52
|
+
:not => self.configuration.not
|
51
53
|
}
|
52
54
|
|
53
55
|
check_for_invalid_options(options, opts)
|
@@ -55,12 +57,16 @@ module Retryable
|
|
55
57
|
|
56
58
|
return if opts[:tries] == 0
|
57
59
|
|
58
|
-
on_exception
|
60
|
+
on_exception = [ opts[:on] ].flatten
|
61
|
+
not_exception = [ opts[:not] ].flatten
|
62
|
+
tries = opts[:tries]
|
59
63
|
retries = 0
|
60
64
|
retry_exception = nil
|
61
65
|
|
62
66
|
begin
|
63
67
|
return yield retries, retry_exception
|
68
|
+
rescue *not_exception
|
69
|
+
raise
|
64
70
|
rescue *on_exception => exception
|
65
71
|
raise unless configuration.enabled?
|
66
72
|
raise unless exception.message =~ opts[:matching]
|
@@ -69,6 +75,8 @@ module Retryable
|
|
69
75
|
# Interrupt Exception could be raised while sleeping
|
70
76
|
begin
|
71
77
|
Kernel.sleep opts[:sleep].respond_to?(:call) ? opts[:sleep].call(retries) : opts[:sleep]
|
78
|
+
rescue *not_exception
|
79
|
+
raise
|
72
80
|
rescue *on_exception
|
73
81
|
end
|
74
82
|
|
@@ -90,4 +98,3 @@ module Retryable
|
|
90
98
|
end
|
91
99
|
end
|
92
100
|
end
|
93
|
-
|
@@ -7,7 +7,8 @@ module Retryable
|
|
7
7
|
:matching,
|
8
8
|
:on,
|
9
9
|
:sleep,
|
10
|
-
:tries
|
10
|
+
:tries,
|
11
|
+
:not
|
11
12
|
].freeze
|
12
13
|
|
13
14
|
attr_accessor :ensure
|
@@ -16,6 +17,7 @@ module Retryable
|
|
16
17
|
attr_accessor :on
|
17
18
|
attr_accessor :sleep
|
18
19
|
attr_accessor :tries
|
20
|
+
attr_accessor :not
|
19
21
|
|
20
22
|
attr_accessor :enabled
|
21
23
|
|
@@ -28,6 +30,7 @@ module Retryable
|
|
28
30
|
@on = StandardError
|
29
31
|
@sleep = 1
|
30
32
|
@tries = 2
|
33
|
+
@not = []
|
31
34
|
|
32
35
|
@enabled = true
|
33
36
|
end
|
data/lib/retryable/version.rb
CHANGED
@@ -2,7 +2,7 @@ module Retryable
|
|
2
2
|
class Version
|
3
3
|
MAJOR = 2 unless defined? Retryable::Version::MAJOR
|
4
4
|
MINOR = 0 unless defined? Retryable::Version::MINOR
|
5
|
-
PATCH =
|
5
|
+
PATCH = 2 unless defined? Retryable::Version::PATCH
|
6
6
|
|
7
7
|
class << self
|
8
8
|
|
data/spec/lib/retryable_spec.rb
CHANGED
@@ -115,4 +115,18 @@ RSpec.describe 'Retryable.retryable' do
|
|
115
115
|
|
116
116
|
expect(@raised).to eq("this is fun!")
|
117
117
|
end
|
118
|
+
|
119
|
+
it 'does not retry on :not exception' do
|
120
|
+
expect do
|
121
|
+
count_retryable(:not => RuntimeError ) { |tries, ex| raise RuntimeError if tries < 1 }
|
122
|
+
end.to raise_error RuntimeError
|
123
|
+
expect(@try_count).to eq(1)
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'gives precidence for :not over :on' do
|
127
|
+
expect do
|
128
|
+
count_retryable(:sleep => 0, :tries => 3, :on => StandardError, :not => IndexError ) { |tries, ex| raise tries >= 1 ? IndexError : StandardError }
|
129
|
+
end.to raise_error IndexError
|
130
|
+
expect(@try_count).to eq(2)
|
131
|
+
end
|
118
132
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: retryable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nikita Fedyashev
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2015-
|
13
|
+
date: 2015-08-15 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|
@@ -62,7 +62,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
62
62
|
version: 1.3.6
|
63
63
|
requirements: []
|
64
64
|
rubyforge_project:
|
65
|
-
rubygems_version: 2.4.
|
65
|
+
rubygems_version: 2.4.6
|
66
66
|
signing_key:
|
67
67
|
specification_version: 4
|
68
68
|
summary: Retryable#retryable, allow for retrying of code blocks.
|