def_retry 0.1.0 → 0.2.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 +4 -4
- data/README.md +20 -4
- data/def_retry.gemspec +2 -2
- data/lib/def_retry/retrier.rb +8 -6
- data/lib/def_retry/version.rb +1 -1
- data/spec/retrier_spec.rb +42 -28
- metadata +9 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cc55787b57b63d7d02f818fcc08844d0ff435568
|
4
|
+
data.tar.gz: 81dac9e37930cb37d7de3cfe35da89f97b7e99d1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 487af13048562ddb668f83b5e57e7465368efd4135c05a10d89c487cb82ecdce4d8626011d04606af7fd533127c35fa26019ecbdcba3e53833a1852e1e200ce2
|
7
|
+
data.tar.gz: 4199234a1a2d4ef18302619a48844fadaebb098d9f22b9cf908caa12f83a14f21952fcb99e535b0a3c22b40c0c286b0183ba75e97d612f308ad7fa9571578b8b
|
data/README.md
CHANGED
@@ -82,14 +82,30 @@ DefRetry.retry on: ApiError do
|
|
82
82
|
end
|
83
83
|
```
|
84
84
|
|
85
|
+
### Create a Retrier with default options
|
86
|
+
|
87
|
+
```ruby
|
88
|
+
require 'def_retry'
|
89
|
+
|
90
|
+
Retrier = DefRetry::Retrier.new({
|
91
|
+
on: [ApiError, Timeout],
|
92
|
+
tries: 7,
|
93
|
+
on_retry: ->(exception, try_count) { log exception },
|
94
|
+
on_ensure: ->(value, try_count) { log value, try_count },
|
95
|
+
sleep: :exponential,
|
96
|
+
|
97
|
+
})
|
98
|
+
```
|
99
|
+
|
85
100
|
### Options
|
86
101
|
|
87
|
-
These apply to
|
88
|
-
- `:on`: A single class or an array of exception classes to be rescued
|
89
|
-
- `:tries`: Integer number of maximum retries to run. DefRetry will stop retrying if the retry count reaches this number
|
90
|
-
- `:sleep`: Either a Proc that receives the current try count as its only argument or a Symbol naming one of these sleep strategies: constant, linear, exponential (see: `DefRetry::Retrier::SLEEP_STRATEGIES`)
|
102
|
+
These apply to `.def_retry`, `#retryable`, and `DefRetry.retry`:
|
103
|
+
- `:on`: A single class or an array of exception classes to be rescued.
|
104
|
+
- `:tries`: Integer number of maximum retries to run. DefRetry will stop retrying if the retry count reaches this number.
|
105
|
+
- `:sleep`: Either an Integer to pass to `sleep`, a Proc that receives the current try count as its only argument or a Symbol naming one of these sleep strategies: constant, linear, exponential (see: `DefRetry::Retrier::SLEEP_STRATEGIES`).
|
91
106
|
- `:on_retry`: A callback to run every time a retry happens i.e. the specified exception(s) are rescued. It will receive the exception that was rescued and the current try count as arguments, respectively.
|
92
107
|
- `:on_ensure`: A callback to run at the end before returning the block's value. It will receive the block's return value and the current try count as arguments, respectively.
|
108
|
+
- `:re_raise`: (default true) re raise the exception after done retrying.
|
93
109
|
|
94
110
|
## Contributing
|
95
111
|
|
data/def_retry.gemspec
CHANGED
@@ -19,6 +19,6 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.6"
|
22
|
-
spec.add_development_dependency "rake"
|
23
|
-
spec.add_development_dependency "rspec"
|
22
|
+
spec.add_development_dependency "rake", "~> 10.3"
|
23
|
+
spec.add_development_dependency "rspec", "~> 2.14"
|
24
24
|
end
|
data/lib/def_retry/retrier.rb
CHANGED
@@ -35,18 +35,20 @@ module DefRetry
|
|
35
35
|
@return = block.call
|
36
36
|
rescue *@exceptions => e
|
37
37
|
@try_count += 1
|
38
|
-
|
38
|
+
run_sleep_strategy if @sleep
|
39
39
|
@on_retry.call e, @try_count
|
40
40
|
|
41
|
-
|
42
|
-
retry
|
43
|
-
elsif @re_raise
|
44
|
-
raise e
|
45
|
-
end
|
41
|
+
@try_count < @tries ? retry : (@re_raise and raise)
|
46
42
|
ensure
|
47
43
|
@on_ensure.call @return, @try_count
|
48
44
|
@return
|
49
45
|
end
|
50
46
|
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def run_sleep_strategy
|
51
|
+
sleep @sleep.is_a?(Fixnum) ? @sleep : @sleep.call(@try_count)
|
52
|
+
end
|
51
53
|
end
|
52
54
|
end
|
data/lib/def_retry/version.rb
CHANGED
data/spec/retrier_spec.rb
CHANGED
@@ -22,7 +22,7 @@ describe DefRetry::Retrier do
|
|
22
22
|
DefRetry::Retrier.new({
|
23
23
|
on: Exception,
|
24
24
|
sleep: :invalid
|
25
|
-
}
|
25
|
+
})
|
26
26
|
}.to raise_error ArgumentError
|
27
27
|
end
|
28
28
|
end
|
@@ -32,36 +32,46 @@ describe DefRetry::Retrier do
|
|
32
32
|
the_block = -> { :ran }
|
33
33
|
retrier = DefRetry::Retrier.new({
|
34
34
|
on: Exception
|
35
|
-
}
|
35
|
+
})
|
36
36
|
|
37
|
-
expect(retrier.run).to be :ran
|
37
|
+
expect(retrier.run(&the_block)).to be :ran
|
38
38
|
end
|
39
39
|
|
40
|
-
it 'retries on exception :
|
40
|
+
it 'retries on exception :tries times' do
|
41
41
|
retrier = DefRetry::Retrier.new({
|
42
42
|
on: Exception,
|
43
|
-
tries: 2
|
44
|
-
|
43
|
+
tries: 2,
|
44
|
+
re_raise: false
|
45
|
+
})
|
45
46
|
|
46
|
-
retrier.run
|
47
|
+
retrier.run &block_exception
|
47
48
|
expect(@retries).to be 2
|
48
49
|
end
|
49
50
|
|
51
|
+
it 'reraises the exception by default after done retrying' do
|
52
|
+
retrier = DefRetry::Retrier.new({
|
53
|
+
on: Exception
|
54
|
+
})
|
55
|
+
|
56
|
+
expect { retrier.run &block_exception }.to raise_error Exception
|
57
|
+
end
|
58
|
+
|
50
59
|
it 'raises unspecified exceptions' do
|
51
60
|
retrier = DefRetry::Retrier.new({
|
52
61
|
on: ArgumentError
|
53
|
-
}
|
62
|
+
})
|
54
63
|
|
55
|
-
expect { retrier.run }.to raise_error Exception
|
64
|
+
expect { retrier.run &block_exception }.to raise_error Exception
|
56
65
|
end
|
57
66
|
|
58
67
|
it 'runs an on_retry callback' do
|
59
68
|
retrier = DefRetry::Retrier.new({
|
60
69
|
on: Exception,
|
61
|
-
on_retry: ->(e, n) { @did_retry = :yes }
|
62
|
-
|
70
|
+
on_retry: ->(e, n) { @did_retry = :yes },
|
71
|
+
re_raise: false
|
72
|
+
})
|
63
73
|
|
64
|
-
retrier.run
|
74
|
+
retrier.run &block_exception
|
65
75
|
expect(@did_retry).to be :yes
|
66
76
|
end
|
67
77
|
|
@@ -69,9 +79,9 @@ describe DefRetry::Retrier do
|
|
69
79
|
retrier = DefRetry::Retrier.new({
|
70
80
|
on: Exception,
|
71
81
|
on_ensure: ->(r, n) { @did_ensure = :yes }
|
72
|
-
}
|
82
|
+
})
|
73
83
|
|
74
|
-
retrier.run
|
84
|
+
retrier.run {}
|
75
85
|
expect(@did_ensure).to be :yes
|
76
86
|
end
|
77
87
|
|
@@ -81,10 +91,11 @@ describe DefRetry::Retrier do
|
|
81
91
|
on_retry: ->(e, r) {
|
82
92
|
@exception = e
|
83
93
|
@retry_count = r
|
84
|
-
}
|
85
|
-
|
94
|
+
},
|
95
|
+
re_raise: false
|
96
|
+
})
|
86
97
|
|
87
|
-
retrier.run
|
98
|
+
retrier.run &block_exception
|
88
99
|
expect(@exception).to be_kind_of Exception
|
89
100
|
expect(@retry_count).to be 3 # default limit
|
90
101
|
end
|
@@ -96,9 +107,9 @@ describe DefRetry::Retrier do
|
|
96
107
|
@value = v
|
97
108
|
@retry_count = r
|
98
109
|
}
|
99
|
-
}
|
110
|
+
})
|
100
111
|
|
101
|
-
retrier.run
|
112
|
+
retrier.run { :ran }
|
102
113
|
expect(@value).to be :ran
|
103
114
|
expect(@retry_count).to be 0 # default limit
|
104
115
|
end
|
@@ -111,11 +122,12 @@ describe DefRetry::Retrier do
|
|
111
122
|
sleep: :constant,
|
112
123
|
# the 1st retry will sleep for 1 second
|
113
124
|
# the 2nd retry will sleep for 1 second
|
114
|
-
tries: 2
|
115
|
-
|
125
|
+
tries: 2,
|
126
|
+
re_raise: false
|
127
|
+
})
|
116
128
|
|
117
129
|
start_time = Time.now.to_i
|
118
|
-
retrier.run
|
130
|
+
retrier.run &block_exception
|
119
131
|
end_time = Time.now.to_i
|
120
132
|
|
121
133
|
expect(end_time - start_time).to be 2
|
@@ -129,11 +141,12 @@ describe DefRetry::Retrier do
|
|
129
141
|
sleep: :linear,
|
130
142
|
# the 1st retry will sleep for 1 second
|
131
143
|
# the 2nd retry will sleep for 2 seconds, and so on
|
132
|
-
tries: 2
|
133
|
-
|
144
|
+
tries: 2,
|
145
|
+
re_raise: false
|
146
|
+
})
|
134
147
|
|
135
148
|
start_time = Time.now.to_i
|
136
|
-
retrier.run
|
149
|
+
retrier.run &block_exception
|
137
150
|
end_time = Time.now.to_i
|
138
151
|
|
139
152
|
expect(end_time - start_time).to be 3
|
@@ -147,11 +160,12 @@ describe DefRetry::Retrier do
|
|
147
160
|
sleep: :exponential,
|
148
161
|
# the 1st retry will sleep for 1**2 == 1 second
|
149
162
|
# the 2nd retry will sleep for 2**2 == 4 seconds
|
150
|
-
tries: 2
|
151
|
-
|
163
|
+
tries: 2,
|
164
|
+
re_raise: false
|
165
|
+
})
|
152
166
|
|
153
167
|
start_time = Time.now.to_i
|
154
|
-
retrier.run
|
168
|
+
retrier.run &block_exception
|
155
169
|
end_time = Time.now.to_i
|
156
170
|
|
157
171
|
expect(end_time - start_time).to be 5
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: def_retry
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Diego Salazar
|
@@ -28,30 +28,30 @@ dependencies:
|
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '10.3'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '10.3'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '2.14'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '2.14'
|
55
55
|
description: Allows you to define methods that will retry on exception or declare
|
56
56
|
blocks of code with retry.
|
57
57
|
email:
|