retryable 1.2.3 → 1.2.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.
Files changed (3) hide show
  1. data/README.markdown +26 -5
  2. data/lib/retryable.rb +14 -2
  3. metadata +22 -6
data/README.markdown CHANGED
@@ -43,7 +43,7 @@ end
43
43
 
44
44
  ## Defaults
45
45
 
46
- :tries => 2, :on => Exception, :sleep => 1
46
+ :tries => 2, :on => Exception, :sleep => 1, :matching => /.*/
47
47
 
48
48
  Sleeping
49
49
  --------
@@ -54,14 +54,33 @@ retryable(:sleep => 0) { } # don't pause at all between retries
54
54
  retryable(:sleep => 10) { } # sleep ten seconds between retries
55
55
  retryable(:sleep => lambda { |n| 4**n }) { } # sleep 1, 4, 16, etc. each try
56
56
  ```
57
-
57
+
58
+ Matching error messages
59
+ --------
60
+ You can also retry based on the exception message:
61
+ ```
62
+ :retryable(:matching => /IO timeout/) do |retries, exception|
63
+ raise "yo, IO timeout!" if retries == 0
64
+ end
65
+ ```
66
+
67
+ Block Parameters
68
+ --------
69
+ Your block is called with two optional parameters: the number of tries until now, and the most recent exception.
70
+ ```
71
+ retryable do |retries, exception|
72
+ puts "try #{retries} failed with exception: #{exception}" if retries > 0
73
+ pick_up_soap
74
+ end
75
+ ```
76
+
58
77
  Installation
59
78
  -------
60
79
 
61
80
  Install the gem:
62
81
 
63
82
  ``` bash
64
- $ gem install retryable --force
83
+ $ gem install retryable
65
84
  ```
66
85
 
67
86
  Add it to your Gemfile:
@@ -73,8 +92,10 @@ gem 'retryable'
73
92
 
74
93
  ## Changelog
75
94
 
76
- * v1.4.0: :sleep option added
77
- * v1.3: stability -- Thoroughly unit-tested
95
+ * v1.2.4: added :matching option + better options validation
96
+ * v1.2.3: fixed dependencies
97
+ * v1.2.2: added :sleep option
98
+ * v1.2.1: stability -- Thoroughly unit-tested
78
99
  * v1.2: FIX -- block would run twice when `:tries` was set to `0`. (Thanks for the heads-up to [Tuker](http://github.com/tuker).)
79
100
 
80
101
 
data/lib/retryable.rb CHANGED
@@ -1,7 +1,11 @@
1
1
 
2
2
  module Kernel
3
+ class InvalidRetryableOptions < RuntimeError; end
4
+
3
5
  def retryable(options = {}, &block)
4
- opts = { :tries => 2, :sleep => 1, :on => Exception }.merge(options)
6
+ opts = { :tries => 2, :sleep => 1, :on => Exception, :matching => /.*/ }
7
+ check_for_invalid_options(options, opts)
8
+ opts.merge!(options)
5
9
 
6
10
  return nil if opts[:tries] == 0
7
11
 
@@ -10,11 +14,19 @@ module Kernel
10
14
 
11
15
  begin
12
16
  return yield retries
13
- rescue *retry_exception
17
+ rescue *retry_exception => exception
18
+ raise unless exception.message =~ opts[:matching]
14
19
  raise if retries+1 >= opts[:tries]
15
20
  sleep opts[:sleep].respond_to?(:call) ? opts[:sleep].call(retries) : opts[:sleep]
16
21
  retries += 1
17
22
  retry
18
23
  end
19
24
  end
25
+
26
+ private
27
+
28
+ def check_for_invalid_options(custom_options, default_options)
29
+ invalid_options = default_options.merge(custom_options).keys - default_options.keys
30
+ raise InvalidRetryableOptions.new("Invalid options: #{invalid_options.join(", ")}") unless invalid_options.empty?
31
+ end
20
32
  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: 25
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
8
  - 2
9
- - 3
10
- version: 1.2.3
9
+ - 4
10
+ version: 1.2.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Nikita Fedyashev
@@ -17,7 +17,7 @@ autorequire:
17
17
  bindir: bin
18
18
  cert_chain: []
19
19
 
20
- date: 2011-05-16 00:00:00 Z
20
+ date: 2011-05-17 00:00:00 Z
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency
23
23
  name: rspec
@@ -36,9 +36,25 @@ dependencies:
36
36
  type: :development
37
37
  version_requirements: *id001
38
38
  - !ruby/object:Gem::Dependency
39
- name: bundler
39
+ name: autotest
40
40
  prerelease: false
41
41
  requirement: &id002 !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ~>
45
+ - !ruby/object:Gem::Version
46
+ hash: 35
47
+ segments:
48
+ - 4
49
+ - 4
50
+ - 6
51
+ version: 4.4.6
52
+ type: :development
53
+ version_requirements: *id002
54
+ - !ruby/object:Gem::Dependency
55
+ name: bundler
56
+ prerelease: false
57
+ requirement: &id003 !ruby/object:Gem::Requirement
42
58
  none: false
43
59
  requirements:
44
60
  - - ">="
@@ -48,7 +64,7 @@ dependencies:
48
64
  - 0
49
65
  version: "0"
50
66
  type: :development
51
- version_requirements: *id002
67
+ version_requirements: *id003
52
68
  description: Kernel#retryable, allow for retrying of code blocks.
53
69
  email: loci.master@gmail.com
54
70
  executables: []