retryable 1.2.2 → 1.2.3
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/README.markdown +14 -4
- data/lib/retryable.rb +14 -13
- metadata +21 -89
- data/.travis.yml +0 -4
- data/Gemfile +0 -4
- data/Rakefile +0 -44
- data/VERSION +0 -1
- data/retryable.gemspec +0 -62
- data/spec/lib/retryable_spec.rb +0 -53
- data/spec/spec_helper.rb +0 -9
data/README.markdown
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 three optional parameters --`:tries`, `:on`, `:sleep` --, 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
|
@@ -43,8 +43,17 @@ end
|
|
43
43
|
|
44
44
|
## Defaults
|
45
45
|
|
46
|
-
:tries =>
|
47
|
-
|
46
|
+
:tries => 2, :on => Exception, :sleep => 1
|
47
|
+
|
48
|
+
Sleeping
|
49
|
+
--------
|
50
|
+
By default Retryable waits for one second between retries. You can change this and even provide your own exponential backoff scheme.
|
51
|
+
|
52
|
+
```
|
53
|
+
retryable(:sleep => 0) { } # don't pause at all between retries
|
54
|
+
retryable(:sleep => 10) { } # sleep ten seconds between retries
|
55
|
+
retryable(:sleep => lambda { |n| 4**n }) { } # sleep 1, 4, 16, etc. each try
|
56
|
+
```
|
48
57
|
|
49
58
|
Installation
|
50
59
|
-------
|
@@ -52,7 +61,7 @@ Installation
|
|
52
61
|
Install the gem:
|
53
62
|
|
54
63
|
``` bash
|
55
|
-
$ gem install retryable
|
64
|
+
$ gem install retryable --force
|
56
65
|
```
|
57
66
|
|
58
67
|
Add it to your Gemfile:
|
@@ -64,6 +73,7 @@ gem 'retryable'
|
|
64
73
|
|
65
74
|
## Changelog
|
66
75
|
|
76
|
+
* v1.4.0: :sleep option added
|
67
77
|
* v1.3: stability -- Thoroughly unit-tested
|
68
78
|
* v1.2: FIX -- block would run twice when `:tries` was set to `0`. (Thanks for the heads-up to [Tuker](http://github.com/tuker).)
|
69
79
|
|
data/lib/retryable.rb
CHANGED
@@ -1,19 +1,20 @@
|
|
1
|
-
# Code originally by Chu Yeow, see
|
2
|
-
# http://blog.codefront.net/2008/01/14/retrying-code-blocks-in-ruby-on-exceptions-whatever/
|
3
|
-
# Slightly rewritten to allow for passing of more than just type of exception.
|
4
1
|
|
5
|
-
|
6
|
-
|
2
|
+
module Kernel
|
3
|
+
def retryable(options = {}, &block)
|
4
|
+
opts = { :tries => 2, :sleep => 1, :on => Exception }.merge(options)
|
7
5
|
|
8
|
-
|
6
|
+
return nil if opts[:tries] == 0
|
9
7
|
|
10
|
-
|
8
|
+
retry_exception, tries = [ opts[:on] ].flatten, opts[:tries]
|
9
|
+
retries = 0
|
11
10
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
begin
|
12
|
+
return yield retries
|
13
|
+
rescue *retry_exception
|
14
|
+
raise if retries+1 >= opts[:tries]
|
15
|
+
sleep opts[:sleep].respond_to?(:call) ? opts[:sleep].call(retries) : opts[:sleep]
|
16
|
+
retries += 1
|
17
|
+
retry
|
18
|
+
end
|
16
19
|
end
|
17
|
-
|
18
|
-
yield
|
19
20
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: retryable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 1.2.
|
9
|
+
- 3
|
10
|
+
version: 1.2.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Nikita Fedyashev
|
@@ -17,57 +17,12 @@ autorequire:
|
|
17
17
|
bindir: bin
|
18
18
|
cert_chain: []
|
19
19
|
|
20
|
-
date: 2011-05-
|
20
|
+
date: 2011-05-16 00:00:00 Z
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
23
|
-
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
|
-
requirements:
|
27
|
-
- - ">="
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
hash: 3
|
30
|
-
segments:
|
31
|
-
- 0
|
32
|
-
version: "0"
|
33
|
-
version_requirements: *id001
|
34
|
-
name: retryable
|
35
|
-
prerelease: false
|
36
|
-
- !ruby/object:Gem::Dependency
|
37
|
-
type: :development
|
38
|
-
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
-
none: false
|
40
|
-
requirements:
|
41
|
-
- - ~>
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
hash: 15
|
44
|
-
segments:
|
45
|
-
- 1
|
46
|
-
- 6
|
47
|
-
- 0
|
48
|
-
version: 1.6.0
|
49
|
-
version_requirements: *id002
|
50
|
-
name: jeweler
|
51
|
-
prerelease: false
|
52
|
-
- !ruby/object:Gem::Dependency
|
53
|
-
type: :development
|
54
|
-
requirement: &id003 !ruby/object:Gem::Requirement
|
55
|
-
none: false
|
56
|
-
requirements:
|
57
|
-
- - ">="
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
hash: 23
|
60
|
-
segments:
|
61
|
-
- 1
|
62
|
-
- 0
|
63
|
-
- 0
|
64
|
-
version: 1.0.0
|
65
|
-
version_requirements: *id003
|
66
|
-
name: bundler
|
23
|
+
name: rspec
|
67
24
|
prerelease: false
|
68
|
-
|
69
|
-
type: :development
|
70
|
-
requirement: &id004 !ruby/object:Gem::Requirement
|
25
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
71
26
|
none: false
|
72
27
|
requirements:
|
73
28
|
- - ~>
|
@@ -78,41 +33,22 @@ dependencies:
|
|
78
33
|
- 5
|
79
34
|
- 0
|
80
35
|
version: 2.5.0
|
81
|
-
version_requirements: *id004
|
82
|
-
name: rspec
|
83
|
-
prerelease: false
|
84
|
-
- !ruby/object:Gem::Dependency
|
85
36
|
type: :development
|
86
|
-
|
87
|
-
|
88
|
-
requirements:
|
89
|
-
- - ">="
|
90
|
-
- !ruby/object:Gem::Version
|
91
|
-
hash: 23
|
92
|
-
segments:
|
93
|
-
- 1
|
94
|
-
- 0
|
95
|
-
- 0
|
96
|
-
version: 1.0.0
|
97
|
-
version_requirements: *id005
|
37
|
+
version_requirements: *id001
|
38
|
+
- !ruby/object:Gem::Dependency
|
98
39
|
name: bundler
|
99
40
|
prerelease: false
|
100
|
-
|
101
|
-
type: :development
|
102
|
-
requirement: &id006 !ruby/object:Gem::Requirement
|
41
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
103
42
|
none: false
|
104
43
|
requirements:
|
105
|
-
- -
|
44
|
+
- - ">="
|
106
45
|
- !ruby/object:Gem::Version
|
107
|
-
hash:
|
46
|
+
hash: 3
|
108
47
|
segments:
|
109
|
-
- 2
|
110
|
-
- 5
|
111
48
|
- 0
|
112
|
-
version:
|
113
|
-
|
114
|
-
|
115
|
-
prerelease: false
|
49
|
+
version: "0"
|
50
|
+
type: :development
|
51
|
+
version_requirements: *id002
|
116
52
|
description: Kernel#retryable, allow for retrying of code blocks.
|
117
53
|
email: loci.master@gmail.com
|
118
54
|
executables: []
|
@@ -122,15 +58,8 @@ extensions: []
|
|
122
58
|
extra_rdoc_files:
|
123
59
|
- README.markdown
|
124
60
|
files:
|
125
|
-
- .travis.yml
|
126
|
-
- Gemfile
|
127
|
-
- README.markdown
|
128
|
-
- Rakefile
|
129
|
-
- VERSION
|
130
61
|
- lib/retryable.rb
|
131
|
-
-
|
132
|
-
- spec/lib/retryable_spec.rb
|
133
|
-
- spec/spec_helper.rb
|
62
|
+
- README.markdown
|
134
63
|
homepage: http://github.com/nfedyashev/retryable
|
135
64
|
licenses:
|
136
65
|
- MIT
|
@@ -153,10 +82,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
153
82
|
requirements:
|
154
83
|
- - ">="
|
155
84
|
- !ruby/object:Gem::Version
|
156
|
-
hash:
|
85
|
+
hash: 23
|
157
86
|
segments:
|
158
|
-
-
|
159
|
-
|
87
|
+
- 1
|
88
|
+
- 3
|
89
|
+
- 6
|
90
|
+
version: 1.3.6
|
160
91
|
requirements: []
|
161
92
|
|
162
93
|
rubyforge_project:
|
@@ -166,3 +97,4 @@ specification_version: 3
|
|
166
97
|
summary: Kernel#retryable, allow for retrying of code blocks.
|
167
98
|
test_files: []
|
168
99
|
|
100
|
+
has_rdoc:
|
data/.travis.yml
DELETED
data/Gemfile
DELETED
data/Rakefile
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'rubygems'
|
4
|
-
require 'bundler'
|
5
|
-
begin
|
6
|
-
Bundler.setup(:default, :development)
|
7
|
-
rescue Bundler::BundlerError => e
|
8
|
-
$stderr.puts e.message
|
9
|
-
$stderr.puts "Run `bundle install` to install missing gems"
|
10
|
-
exit e.status_code
|
11
|
-
end
|
12
|
-
require 'rake'
|
13
|
-
|
14
|
-
require 'jeweler'
|
15
|
-
Jeweler::Tasks.new do |gem|
|
16
|
-
gem.name = "retryable"
|
17
|
-
gem.homepage = "http://github.com/nfedyashev/retryable"
|
18
|
-
gem.license = "MIT"
|
19
|
-
gem.summary = %Q{Kernel#retryable, allow for retrying of code blocks.}
|
20
|
-
gem.description = %Q{Kernel#retryable, allow for retrying of code blocks.}
|
21
|
-
gem.email = "loci.master@gmail.com"
|
22
|
-
gem.authors = ["Nikita Fedyashev", "Carlo Zottmann", "Chu Yeow"]
|
23
|
-
|
24
|
-
gem.add_development_dependency 'bundler', ['>= 1.0.0']
|
25
|
-
gem.add_development_dependency 'rspec', '~> 2.5.0'
|
26
|
-
|
27
|
-
end
|
28
|
-
Jeweler::RubygemsDotOrgTasks.new
|
29
|
-
|
30
|
-
require 'rspec/core'
|
31
|
-
require 'rspec/core/rake_task'
|
32
|
-
RSpec::Core::RakeTask.new(:spec)
|
33
|
-
|
34
|
-
task :default => :spec
|
35
|
-
|
36
|
-
require 'rake/rdoctask'
|
37
|
-
Rake::RDocTask.new do |rdoc|
|
38
|
-
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
39
|
-
|
40
|
-
rdoc.rdoc_dir = 'rdoc'
|
41
|
-
rdoc.title = "retryable #{version}"
|
42
|
-
rdoc.rdoc_files.include('README*')
|
43
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
44
|
-
end
|
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
1.2.2
|
data/retryable.gemspec
DELETED
@@ -1,62 +0,0 @@
|
|
1
|
-
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
-
# -*- encoding: utf-8 -*-
|
5
|
-
|
6
|
-
Gem::Specification.new do |s|
|
7
|
-
s.name = %q{retryable}
|
8
|
-
s.version = "1.2.2"
|
9
|
-
|
10
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = ["Nikita Fedyashev", "Carlo Zottmann", "Chu Yeow"]
|
12
|
-
s.date = %q{2011-05-10}
|
13
|
-
s.description = %q{Kernel#retryable, allow for retrying of code blocks.}
|
14
|
-
s.email = %q{loci.master@gmail.com}
|
15
|
-
s.extra_rdoc_files = [
|
16
|
-
"README.markdown"
|
17
|
-
]
|
18
|
-
s.files = [
|
19
|
-
".travis.yml",
|
20
|
-
"Gemfile",
|
21
|
-
"README.markdown",
|
22
|
-
"Rakefile",
|
23
|
-
"VERSION",
|
24
|
-
"lib/retryable.rb",
|
25
|
-
"retryable.gemspec",
|
26
|
-
"spec/lib/retryable_spec.rb",
|
27
|
-
"spec/spec_helper.rb"
|
28
|
-
]
|
29
|
-
s.homepage = %q{http://github.com/nfedyashev/retryable}
|
30
|
-
s.licenses = ["MIT"]
|
31
|
-
s.require_paths = ["lib"]
|
32
|
-
s.rubygems_version = %q{1.7.1}
|
33
|
-
s.summary = %q{Kernel#retryable, allow for retrying of code blocks.}
|
34
|
-
|
35
|
-
if s.respond_to? :specification_version then
|
36
|
-
s.specification_version = 3
|
37
|
-
|
38
|
-
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
39
|
-
s.add_runtime_dependency(%q<retryable>, [">= 0"])
|
40
|
-
s.add_development_dependency(%q<jeweler>, ["~> 1.6.0"])
|
41
|
-
s.add_development_dependency(%q<bundler>, [">= 1.0.0"])
|
42
|
-
s.add_development_dependency(%q<rspec>, ["~> 2.5.0"])
|
43
|
-
s.add_development_dependency(%q<bundler>, [">= 1.0.0"])
|
44
|
-
s.add_development_dependency(%q<rspec>, ["~> 2.5.0"])
|
45
|
-
else
|
46
|
-
s.add_dependency(%q<retryable>, [">= 0"])
|
47
|
-
s.add_dependency(%q<jeweler>, ["~> 1.6.0"])
|
48
|
-
s.add_dependency(%q<bundler>, [">= 1.0.0"])
|
49
|
-
s.add_dependency(%q<rspec>, ["~> 2.5.0"])
|
50
|
-
s.add_dependency(%q<bundler>, [">= 1.0.0"])
|
51
|
-
s.add_dependency(%q<rspec>, ["~> 2.5.0"])
|
52
|
-
end
|
53
|
-
else
|
54
|
-
s.add_dependency(%q<retryable>, [">= 0"])
|
55
|
-
s.add_dependency(%q<jeweler>, ["~> 1.6.0"])
|
56
|
-
s.add_dependency(%q<bundler>, [">= 1.0.0"])
|
57
|
-
s.add_dependency(%q<rspec>, ["~> 2.5.0"])
|
58
|
-
s.add_dependency(%q<bundler>, [">= 1.0.0"])
|
59
|
-
s.add_dependency(%q<rspec>, ["~> 2.5.0"])
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
data/spec/lib/retryable_spec.rb
DELETED
@@ -1,53 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe 'retryable' do
|
4
|
-
|
5
|
-
before(:each) do
|
6
|
-
@attempt = 0
|
7
|
-
end
|
8
|
-
|
9
|
-
it "should make another try on exception" do
|
10
|
-
retryable(:tries => 1, :on => RuntimeError) do
|
11
|
-
@attempt = @attempt + 1
|
12
|
-
raise RuntimeError unless @attempt == 2
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
it "should make another try if exception is in whitelist" do
|
17
|
-
retryable(:tries => 1, :on => [StandardError, ArgumentError, RuntimeError]) do
|
18
|
-
@attempt = @attempt + 1
|
19
|
-
raise ArgumentError unless @attempt == 2
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
it "should not try on unexpected exception" do
|
24
|
-
lambda do
|
25
|
-
retryable(:tries => 1, :on => RuntimeError) do
|
26
|
-
@attempt = @attempt + 1
|
27
|
-
raise StandardError unless @attempt == 2
|
28
|
-
end
|
29
|
-
end.should raise_error StandardError
|
30
|
-
end
|
31
|
-
|
32
|
-
it "should make always retry on default exception" do
|
33
|
-
retryable(:tries => 1) do
|
34
|
-
@attempt = @attempt + 1
|
35
|
-
raise StandardError unless @attempt == 2
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
it "should retry once unless :tries explicitly set" do
|
40
|
-
retryable do
|
41
|
-
@attempt = @attempt + 1
|
42
|
-
raise StandardError unless @attempt == 2
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
it "should retry twice" do
|
47
|
-
retryable(:tries => 2, :on => RuntimeError) do
|
48
|
-
@attempt = @attempt + 1
|
49
|
-
raise RuntimeError unless @attempt == 3
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
end
|
data/spec/spec_helper.rb
DELETED