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 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