retryable 1.2.5 → 1.3.0

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 three optional parameters --`:tries`, `:on`, `:sleep` --, and
12
+ It's configured using four optional parameters --`:tries`, `:on`, `:sleep`, `:matching`--, 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,7 +43,7 @@ end
43
43
 
44
44
  ## Defaults
45
45
 
46
- :tries => 2, :on => Exception, :sleep => 1, :matching => /.*/
46
+ :tries => 2, :on => StandardError, :sleep => 1, :matching => /.*/
47
47
 
48
48
  Sleeping
49
49
  --------
@@ -58,8 +58,9 @@ retryable(:sleep => lambda { |n| 4**n }) { } # sleep 1, 4, 16, etc. each try
58
58
  Matching error messages
59
59
  --------
60
60
  You can also retry based on the exception message:
61
+
61
62
  ```
62
- :retryable(:matching => /IO timeout/) do |retries, exception|
63
+ retryable(:matching => /IO timeout/) do |retries, exception|
63
64
  raise "yo, IO timeout!" if retries == 0
64
65
  end
65
66
  ```
@@ -67,6 +68,7 @@ end
67
68
  Block Parameters
68
69
  --------
69
70
  Your block is called with two optional parameters: the number of tries until now, and the most recent exception.
71
+
70
72
  ```
71
73
  retryable do |retries, exception|
72
74
  puts "try #{retries} failed with exception: #{exception}" if retries > 0
@@ -92,6 +94,8 @@ gem 'retryable'
92
94
 
93
95
  ## Changelog
94
96
 
97
+ * v1.3.0: StandardError is now default exception for rescuing.
98
+ * v1.2.5: became friendly to any rubygems version installed
95
99
  * v1.2.4: added :matching option + better options validation
96
100
  * v1.2.3: fixed dependencies
97
101
  * v1.2.2: added :sleep option
@@ -101,6 +105,7 @@ gem 'retryable'
101
105
 
102
106
  ## Thanks
103
107
 
104
- Many thanks to [Chu Yeow for this nifty piece of code](http://blog.codefront.net/2008/01/14/retrying-code-blocks-in-ruby-on-exceptions-whatever/). Look, I liked it
105
- enough to enhance it a little bit and build a gem from it! :)
108
+ [Chu Yeow for this nifty piece of code](http://blog.codefront.net/2008/01/14/retrying-code-blocks-in-ruby-on-exceptions-whatever/)
109
+ [Scott Bronson](https://github.com/bronson/retryable)
110
+
106
111
 
data/lib/retryable.rb CHANGED
@@ -3,22 +3,30 @@ module Kernel
3
3
  class InvalidRetryableOptions < RuntimeError; end
4
4
 
5
5
  def retryable(options = {}, &block)
6
- opts = { :tries => 2, :sleep => 1, :on => Exception, :matching => /.*/ }
6
+ opts = { :tries => 2, :sleep => 1, :on => StandardError, :matching => /.*/ }
7
7
  check_for_invalid_options(options, opts)
8
8
  opts.merge!(options)
9
9
 
10
10
  return nil if opts[:tries] == 0
11
11
 
12
- retry_exception, tries = [ opts[:on] ].flatten, opts[:tries]
12
+ on_exception, tries = [ opts[:on] ].flatten, opts[:tries]
13
13
  retries = 0
14
-
14
+ retry_exception = nil
15
+
15
16
  begin
16
- return yield retries
17
- rescue *retry_exception => exception
17
+ return yield retries, retry_exception
18
+ rescue *on_exception => exception
18
19
  raise unless exception.message =~ opts[:matching]
19
20
  raise if retries+1 >= opts[:tries]
20
- sleep opts[:sleep].respond_to?(:call) ? opts[:sleep].call(retries) : opts[:sleep]
21
+
22
+ # Interrupt Exception could be raised while sleeping
23
+ begin
24
+ sleep opts[:sleep].respond_to?(:call) ? opts[:sleep].call(retries) : opts[:sleep]
25
+ rescue *on_exception
26
+ end
27
+
21
28
  retries += 1
29
+ retry_exception = exception
22
30
  retry
23
31
  end
24
32
  end
@@ -6,6 +6,13 @@ describe 'retryable' do
6
6
  @attempt = 0
7
7
  end
8
8
 
9
+ it "should only catch StandardError by default" do
10
+ lambda do
11
+ count_retryable(:tries => 2) { |tries, ex| raise Exception if tries < 1 }
12
+ end.should raise_error Exception
13
+ @try_count.should == 1
14
+ end
15
+
9
16
  it "should retry on default exception" do
10
17
  Kernel.should_receive(:sleep).once.with(1)
11
18
 
@@ -13,6 +20,16 @@ describe 'retryable' do
13
20
  @try_count.should == 2
14
21
  end
15
22
 
23
+ it "should pass retry count and exception on retry" do
24
+ Kernel.should_receive(:sleep).once.with(1)
25
+
26
+ count_retryable(:tries => 2) do |tries, ex|
27
+ ex.class.should == StandardError if tries > 0
28
+ raise StandardError if tries < 1
29
+ end
30
+ @try_count.should == 2
31
+ end
32
+
16
33
  it "should make another try if exception is covered by :on" do
17
34
  Kernel.stub!(:sleep)
18
35
  count_retryable(:on => [StandardError, ArgumentError, RuntimeError] ) { |tries, ex| raise ArgumentError if tries < 1 }
metadata CHANGED
@@ -1,119 +1,87 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: retryable
3
- version: !ruby/object:Gem::Version
4
- hash: 21
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.3.0
5
5
  prerelease:
6
- segments:
7
- - 1
8
- - 2
9
- - 5
10
- version: 1.2.5
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Nikita Fedyashev
14
9
  - Carlo Zottmann
15
10
  - Chu Yeow
16
11
  autorequire:
17
12
  bindir: bin
18
13
  cert_chain: []
19
-
20
- date: 2011-05-17 00:00:00 Z
21
- dependencies:
22
- - !ruby/object:Gem::Dependency
14
+ date: 2011-05-17 00:00:00.000000000 Z
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
23
17
  name: rspec
24
- prerelease: false
25
- requirement: &id001 !ruby/object:Gem::Requirement
18
+ requirement: &2157041380 !ruby/object:Gem::Requirement
26
19
  none: false
27
- requirements:
20
+ requirements:
28
21
  - - ~>
29
- - !ruby/object:Gem::Version
30
- hash: 27
31
- segments:
32
- - 2
33
- - 5
34
- - 0
35
- version: 2.5.0
22
+ - !ruby/object:Gem::Version
23
+ version: 2.10.0
36
24
  type: :development
37
- version_requirements: *id001
38
- - !ruby/object:Gem::Dependency
39
- name: autotest
40
25
  prerelease: false
41
- requirement: &id002 !ruby/object:Gem::Requirement
26
+ version_requirements: *2157041380
27
+ - !ruby/object:Gem::Dependency
28
+ name: autotest
29
+ requirement: &2157040720 !ruby/object:Gem::Requirement
42
30
  none: false
43
- requirements:
31
+ requirements:
44
32
  - - ~>
45
- - !ruby/object:Gem::Version
46
- hash: 35
47
- segments:
48
- - 4
49
- - 4
50
- - 6
33
+ - !ruby/object:Gem::Version
51
34
  version: 4.4.6
52
35
  type: :development
53
- version_requirements: *id002
54
- - !ruby/object:Gem::Dependency
55
- name: bundler
56
36
  prerelease: false
57
- requirement: &id003 !ruby/object:Gem::Requirement
37
+ version_requirements: *2157040720
38
+ - !ruby/object:Gem::Dependency
39
+ name: bundler
40
+ requirement: &2157040080 !ruby/object:Gem::Requirement
58
41
  none: false
59
- requirements:
60
- - - ">="
61
- - !ruby/object:Gem::Version
62
- hash: 3
63
- segments:
64
- - 0
65
- version: "0"
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
66
46
  type: :development
67
- version_requirements: *id003
47
+ prerelease: false
48
+ version_requirements: *2157040080
68
49
  description: Kernel#retryable, allow for retrying of code blocks.
69
50
  email: loci.master@gmail.com
70
51
  executables: []
71
-
72
52
  extensions: []
73
-
74
- extra_rdoc_files:
53
+ extra_rdoc_files:
75
54
  - README.markdown
76
- files:
55
+ files:
77
56
  - lib/retryable.rb
78
57
  - README.markdown
79
58
  - spec/lib/retryable_spec.rb
80
59
  - spec/spec_helper.rb
81
60
  homepage: http://github.com/nfedyashev/retryable
82
- licenses:
61
+ licenses:
83
62
  - MIT
84
63
  post_install_message:
85
64
  rdoc_options: []
86
-
87
- require_paths:
65
+ require_paths:
88
66
  - lib
89
- required_ruby_version: !ruby/object:Gem::Requirement
67
+ required_ruby_version: !ruby/object:Gem::Requirement
90
68
  none: false
91
- requirements:
92
- - - ">="
93
- - !ruby/object:Gem::Version
94
- hash: 3
95
- segments:
96
- - 0
97
- version: "0"
98
- required_rubygems_version: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - ! '>='
71
+ - !ruby/object:Gem::Version
72
+ version: '0'
73
+ required_rubygems_version: !ruby/object:Gem::Requirement
99
74
  none: false
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- hash: 23
104
- segments:
105
- - 1
106
- - 3
107
- - 6
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
108
78
  version: 1.3.6
109
79
  requirements: []
110
-
111
80
  rubyforge_project:
112
- rubygems_version: 1.7.1
81
+ rubygems_version: 1.8.17
113
82
  signing_key:
114
83
  specification_version: 3
115
84
  summary: Kernel#retryable, allow for retrying of code blocks.
116
- test_files:
85
+ test_files:
117
86
  - spec/lib/retryable_spec.rb
118
87
  - spec/spec_helper.rb
119
- has_rdoc: