retryable 2.0.3 → 2.0.4
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.
- data/CHANGELOG.md +6 -0
- data/README.md +22 -2
- data/lib/retryable.rb +5 -3
- data/lib/retryable/configuration.rb +4 -2
- data/lib/retryable/version.rb +1 -1
- data/retryable.gemspec +1 -1
- data/spec/lib/retryable_spec.rb +19 -0
- data/spec/spec_helper.rb +1 -0
- metadata +59 -36
- checksums.yaml +0 -7
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
## Retryable 2.0.4 ##
|
2
|
+
|
3
|
+
* :infinite value is now available as :tries paramater. Use it for retrying your blocks infinitely until it stops failing.
|
4
|
+
* :sleep_method parameter has been added. This can be very useful when you are working with Celluloid which implements its own version of the method sleep.
|
5
|
+
Use `:sleep_method => Celluloid.method(:sleep)` in such cases.
|
6
|
+
|
1
7
|
## Retryable 2.0.3 ##
|
2
8
|
|
3
9
|
* gemspec contains explicit licence option from now on(MIT)
|
data/README.md
CHANGED
@@ -2,6 +2,7 @@ retryable gem
|
|
2
2
|
=====
|
3
3
|
|
4
4
|
[](https://travis-ci.org/nfedyashev/retryable)
|
5
|
+
[](https://www.versioneye.com/ruby/retryable)
|
5
6
|
|
6
7
|
Description
|
7
8
|
--------
|
@@ -9,7 +10,7 @@ Description
|
|
9
10
|
Runs a code block, and retries it when an exception occurs. It's great when
|
10
11
|
working with flakey webservices (for example).
|
11
12
|
|
12
|
-
It's configured using
|
13
|
+
It's configured using several optional parameters `:tries`, `:on`, `:sleep`, `:matching`, `:ensure`, `:exception_cb`, `:not`, `:sleep_method` and
|
13
14
|
runs the passed block. Should an exception occur, it'll retry for (n-1) times.
|
14
15
|
|
15
16
|
Should the number of retries be reached without success, the last exception
|
@@ -29,6 +30,13 @@ Retryable.retryable(:tries => 3, :on => OpenURI::HTTPError) do
|
|
29
30
|
end
|
30
31
|
```
|
31
32
|
|
33
|
+
Try the block forever.
|
34
|
+
```ruby
|
35
|
+
Retryable.retryable(:tries => :infinite) do
|
36
|
+
# some code
|
37
|
+
end
|
38
|
+
```
|
39
|
+
|
32
40
|
Do _something_, retry up to four times for either `ArgumentError` or
|
33
41
|
`TimeoutError` exceptions.
|
34
42
|
|
@@ -56,7 +64,7 @@ end
|
|
56
64
|
|
57
65
|
## Defaults
|
58
66
|
|
59
|
-
:tries => 2, :on => StandardError, :sleep => 1, :matching => /.*/, :ensure => Proc.new { }, :exception_cb => Proc.new { }, :not => []
|
67
|
+
:tries => 2, :on => StandardError, :sleep => 1, :matching => /.*/, :ensure => Proc.new { }, :exception_cb => Proc.new { }, :not => [], :sleep_method => lambda { |n| Kernel.sleep(n) }
|
60
68
|
|
61
69
|
Retryable also could be configured globally to change those defaults:
|
62
70
|
|
@@ -69,6 +77,7 @@ Retryable.configure do |config|
|
|
69
77
|
config.sleep = 1
|
70
78
|
config.tries = 2
|
71
79
|
config.not = []
|
80
|
+
config.sleep_method = Celluloid.method(:sleep)
|
72
81
|
end
|
73
82
|
```
|
74
83
|
|
@@ -145,6 +154,17 @@ end
|
|
145
154
|
|
146
155
|
```
|
147
156
|
|
157
|
+
Specify the sleep method to use
|
158
|
+
--------
|
159
|
+
This can be very useful when you are working with [Celluloid](https://github.com/celluloid/celluloid)
|
160
|
+
which implements its own version of the method sleep.
|
161
|
+
|
162
|
+
```
|
163
|
+
Retryable.retryable(:sleep_method => Celluloid.method(:sleep)) do
|
164
|
+
retrieve_url
|
165
|
+
end
|
166
|
+
```
|
167
|
+
|
148
168
|
Supported Ruby Versions
|
149
169
|
-------
|
150
170
|
|
data/lib/retryable.rb
CHANGED
@@ -49,7 +49,8 @@ module Retryable
|
|
49
49
|
:matching => self.configuration.matching,
|
50
50
|
:ensure => self.configuration.ensure,
|
51
51
|
:exception_cb => self.configuration.exception_cb,
|
52
|
-
:not => self.configuration.not
|
52
|
+
:not => self.configuration.not,
|
53
|
+
:sleep_method => self.configuration.sleep_method
|
53
54
|
}
|
54
55
|
|
55
56
|
check_for_invalid_options(options, opts)
|
@@ -70,11 +71,12 @@ module Retryable
|
|
70
71
|
rescue *on_exception => exception
|
71
72
|
raise unless configuration.enabled?
|
72
73
|
raise unless exception.message =~ opts[:matching]
|
73
|
-
raise if retries+1 >= tries
|
74
|
+
raise if tries != :infinite && retries+1 >= tries
|
74
75
|
|
75
76
|
# Interrupt Exception could be raised while sleeping
|
76
77
|
begin
|
77
|
-
|
78
|
+
seconds = opts[:sleep].respond_to?(:call) ? opts[:sleep].call(retries) : opts[:sleep]
|
79
|
+
opts[:sleep_method].call(seconds)
|
78
80
|
rescue *not_exception
|
79
81
|
raise
|
80
82
|
rescue *on_exception
|
@@ -8,7 +8,8 @@ module Retryable
|
|
8
8
|
:on,
|
9
9
|
:sleep,
|
10
10
|
:tries,
|
11
|
-
:not
|
11
|
+
:not,
|
12
|
+
:sleep_method
|
12
13
|
].freeze
|
13
14
|
|
14
15
|
attr_accessor :ensure
|
@@ -18,6 +19,7 @@ module Retryable
|
|
18
19
|
attr_accessor :sleep
|
19
20
|
attr_accessor :tries
|
20
21
|
attr_accessor :not
|
22
|
+
attr_accessor :sleep_method
|
21
23
|
|
22
24
|
attr_accessor :enabled
|
23
25
|
|
@@ -31,7 +33,7 @@ module Retryable
|
|
31
33
|
@sleep = 1
|
32
34
|
@tries = 2
|
33
35
|
@not = []
|
34
|
-
|
36
|
+
@sleep_method = lambda do |seconds| Kernel.sleep(seconds) end
|
35
37
|
@enabled = true
|
36
38
|
end
|
37
39
|
|
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 = 4 unless defined? Retryable::Version::PATCH
|
6
6
|
|
7
7
|
class << self
|
8
8
|
|
data/retryable.gemspec
CHANGED
@@ -5,7 +5,7 @@ Gem::Specification.new do |gem|
|
|
5
5
|
gem.add_development_dependency 'bundler', '~> 1.0'
|
6
6
|
gem.authors = ["Nikita Fedyashev", "Carlo Zottmann", "Chu Yeow"]
|
7
7
|
gem.description = %q{Retryable#retryable, allow for retrying of code blocks.}
|
8
|
-
gem.email = %q{
|
8
|
+
gem.email = %q{nfedyashev@gmail.com}
|
9
9
|
gem.files = %w(CHANGELOG.md LICENSE.md README.md Rakefile retryable.gemspec)
|
10
10
|
gem.files += Dir.glob("lib/**/*.rb")
|
11
11
|
gem.files += Dir.glob("spec/**/*")
|
data/spec/lib/retryable_spec.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'timeout'
|
2
3
|
|
3
4
|
RSpec.describe 'Retryable.retryable' do
|
4
5
|
before(:each) do
|
@@ -67,6 +68,16 @@ RSpec.describe 'Retryable.retryable' do
|
|
67
68
|
expect(@try_count).to eq(3)
|
68
69
|
end
|
69
70
|
|
71
|
+
it 'retries infinitely' do
|
72
|
+
expect do
|
73
|
+
Timeout::timeout(3) do
|
74
|
+
count_retryable(:tries => :infinite, :sleep => 0.1) { |tries, ex| raise StandardError }
|
75
|
+
end
|
76
|
+
end.to raise_error Timeout::Error
|
77
|
+
|
78
|
+
expect(@try_count).to be > 10
|
79
|
+
end
|
80
|
+
|
70
81
|
it 'retries on default exception' do
|
71
82
|
expect(Kernel).to receive(:sleep).once.with(1)
|
72
83
|
|
@@ -81,6 +92,14 @@ RSpec.describe 'Retryable.retryable' do
|
|
81
92
|
end.to raise_error RangeError
|
82
93
|
end
|
83
94
|
|
95
|
+
it 'calls :sleep_method option' do
|
96
|
+
sleep_method = double
|
97
|
+
expect(sleep_method).to receive(:call).twice
|
98
|
+
expect do
|
99
|
+
Retryable.retryable(:tries => 3, :sleep_method => sleep_method) { |tries, ex| raise RangeError if tries < 9}
|
100
|
+
end.to raise_error RangeError
|
101
|
+
end
|
102
|
+
|
84
103
|
it 'does not retry any exception if :on is empty list' do
|
85
104
|
expect do
|
86
105
|
count_retryable(:on => []) { raise }
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,74 +1,97 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: retryable
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 7
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 2
|
8
|
+
- 0
|
9
|
+
- 4
|
10
|
+
version: 2.0.4
|
5
11
|
platform: ruby
|
6
|
-
authors:
|
12
|
+
authors:
|
7
13
|
- Nikita Fedyashev
|
8
14
|
- Carlo Zottmann
|
9
15
|
- Chu Yeow
|
10
16
|
autorequire:
|
11
17
|
bindir: bin
|
12
18
|
cert_chain: []
|
13
|
-
|
14
|
-
|
15
|
-
|
19
|
+
|
20
|
+
date: 2016-07-14 00:00:00 +03:00
|
21
|
+
default_executable:
|
22
|
+
dependencies:
|
23
|
+
- !ruby/object:Gem::Dependency
|
16
24
|
name: bundler
|
17
|
-
requirement: !ruby/object:Gem::Requirement
|
18
|
-
requirements:
|
19
|
-
- - "~>"
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: '1.0'
|
22
|
-
type: :development
|
23
25
|
prerelease: false
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
26
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
27
|
+
none: false
|
28
|
+
requirements:
|
29
|
+
- - ~>
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
hash: 15
|
32
|
+
segments:
|
33
|
+
- 1
|
34
|
+
- 0
|
35
|
+
version: "1.0"
|
36
|
+
type: :development
|
37
|
+
version_requirements: *id001
|
29
38
|
description: Retryable#retryable, allow for retrying of code blocks.
|
30
|
-
email:
|
39
|
+
email: nfedyashev@gmail.com
|
31
40
|
executables: []
|
41
|
+
|
32
42
|
extensions: []
|
43
|
+
|
33
44
|
extra_rdoc_files: []
|
34
|
-
|
45
|
+
|
46
|
+
files:
|
35
47
|
- CHANGELOG.md
|
36
48
|
- LICENSE.md
|
37
49
|
- README.md
|
38
50
|
- Rakefile
|
39
|
-
-
|
51
|
+
- retryable.gemspec
|
40
52
|
- lib/retryable/configuration.rb
|
41
53
|
- lib/retryable/version.rb
|
42
|
-
- retryable.
|
54
|
+
- lib/retryable.rb
|
43
55
|
- spec/lib/configuration_spec.rb
|
44
56
|
- spec/lib/retryable_spec.rb
|
45
57
|
- spec/spec_helper.rb
|
58
|
+
has_rdoc: true
|
46
59
|
homepage: http://github.com/nfedyashev/retryable
|
47
|
-
licenses:
|
60
|
+
licenses:
|
48
61
|
- MIT
|
49
|
-
metadata: {}
|
50
62
|
post_install_message:
|
51
63
|
rdoc_options: []
|
52
|
-
|
64
|
+
|
65
|
+
require_paths:
|
53
66
|
- lib
|
54
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
55
|
-
|
67
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
68
|
+
none: false
|
69
|
+
requirements:
|
56
70
|
- - ">="
|
57
|
-
- !ruby/object:Gem::Version
|
58
|
-
|
59
|
-
|
60
|
-
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
hash: 3
|
73
|
+
segments:
|
74
|
+
- 0
|
75
|
+
version: "0"
|
76
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
77
|
+
none: false
|
78
|
+
requirements:
|
61
79
|
- - ">="
|
62
|
-
- !ruby/object:Gem::Version
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
hash: 23
|
82
|
+
segments:
|
83
|
+
- 1
|
84
|
+
- 3
|
85
|
+
- 6
|
63
86
|
version: 1.3.6
|
64
87
|
requirements: []
|
88
|
+
|
65
89
|
rubyforge_project:
|
66
|
-
rubygems_version:
|
90
|
+
rubygems_version: 1.6.2
|
67
91
|
signing_key:
|
68
|
-
specification_version:
|
92
|
+
specification_version: 3
|
69
93
|
summary: Retryable#retryable, allow for retrying of code blocks.
|
70
|
-
test_files:
|
94
|
+
test_files:
|
71
95
|
- spec/lib/configuration_spec.rb
|
72
96
|
- spec/lib/retryable_spec.rb
|
73
97
|
- spec/spec_helper.rb
|
74
|
-
has_rdoc:
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: 86143d2b49dbb2f7d5c38fd48eb82ff3e43dd79e
|
4
|
-
data.tar.gz: 740cf211de57aa3579c4ad26ef6f360a23b8b257
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: 8efc21fece286e757cb446010f94aab27ca50beeb7336f3daf00b14f6021285357f0cc5a2cc50df2f62772fa0e39768f0b9a001b822aa7024084a511fa7d41ae
|
7
|
-
data.tar.gz: 1c1d0912ec01b1fc7319e9e8ea7d903c14baf4117f33e1b1edcefd11811344b4a23ead38d9dabdbc50dc332acfa64483f35651a224569f00432111d0a881ceaf
|