retryable 1.2.2 → 1.2.3

Sign up to get free protection for your applications and to get access to all the features.
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 two optional parameters --`:tries` and `:on`--, and
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 => 1, :on => Exception
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
- def retryable(options = {}, &block)
6
- opts = { :tries => 1, :on => Exception }.merge(options)
2
+ module Kernel
3
+ def retryable(options = {}, &block)
4
+ opts = { :tries => 2, :sleep => 1, :on => Exception }.merge(options)
7
5
 
8
- return nil if opts[:tries] == 0
6
+ return nil if opts[:tries] == 0
9
7
 
10
- retry_exception, tries = [ opts[:on] ].flatten, opts[:tries]
8
+ retry_exception, tries = [ opts[:on] ].flatten, opts[:tries]
9
+ retries = 0
11
10
 
12
- begin
13
- return yield
14
- rescue *retry_exception
15
- retry if (tries -= 1) > 0
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: 27
4
+ hash: 25
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
8
  - 2
9
- - 2
10
- version: 1.2.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-10 00:00:00 Z
20
+ date: 2011-05-16 00:00:00 Z
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency
23
- type: :runtime
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
- - !ruby/object:Gem::Dependency
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
- requirement: &id005 !ruby/object:Gem::Requirement
87
- none: false
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
- - !ruby/object:Gem::Dependency
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: 27
46
+ hash: 3
108
47
  segments:
109
- - 2
110
- - 5
111
48
  - 0
112
- version: 2.5.0
113
- version_requirements: *id006
114
- name: rspec
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
- - retryable.gemspec
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: 3
85
+ hash: 23
157
86
  segments:
158
- - 0
159
- version: "0"
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
@@ -1,4 +0,0 @@
1
- rvm:
2
- - 1.8.7
3
- - 1.9.2
4
- - ree
data/Gemfile DELETED
@@ -1,4 +0,0 @@
1
- source "http://rubygems.org"
2
-
3
- gemspec
4
-
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
-
@@ -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
@@ -1,9 +0,0 @@
1
-
2
- require File.dirname(__FILE__) + '/../lib/retryable'
3
- require 'rspec'
4
-
5
- RSpec.configure do |config|
6
- # Remove this line if you don't want RSpec's should and should_not
7
- # methods or matchers
8
- require 'rspec/expectations'
9
- end