retry-this 1.0 → 1.1

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/lib/retry_this.rb +7 -4
  2. data/test/retry_this_test.rb +63 -11
  3. metadata +6 -4
@@ -16,15 +16,18 @@
16
16
 
17
17
  module RetryThis
18
18
  def retry_this(options = {})
19
- number_of_retries = options[:times] || 1
19
+ max_attempts = 1 + (options[:times] || 1)
20
20
  error_types = options[:error_types] || [StandardError]
21
- (1 + number_of_retries).times do |attempt_number|
21
+ (1..max_attempts).inject(nil) do |result, attempt_number|
22
22
  begin
23
- return yield if block_given?
23
+ return yield attempt_number if block_given?
24
24
  rescue *error_types => e
25
- raise e unless attempt_number < number_of_retries
25
+ raise e if attempt_number == max_attempts
26
+ sleep options[:sleep] if options[:sleep]
26
27
  end
27
28
  end
28
29
  end
30
+
31
+ module_function :retry_this
29
32
  end
30
33
 
@@ -15,7 +15,7 @@
15
15
  =end
16
16
 
17
17
  require 'test/unit'
18
- require File.join(File.dirname(__FILE__), '../lib/retry_this')
18
+ require File.expand_path('../lib/retry_this', File.dirname(__FILE__))
19
19
 
20
20
  class RetryThisTest < Test::Unit::TestCase
21
21
  include RetryThis
@@ -23,12 +23,12 @@ class RetryThisTest < Test::Unit::TestCase
23
23
  def test_should_retry_block_for_given_number_of_times_for_given_error_types_and_raise_error_if_all_attempts_fail
24
24
  attempts = 0
25
25
  retry_this(:times => 3, :error_types => [TypeError, RuntimeError]) do
26
- attempts += 1
27
- if attempts % 2 == 0
28
- raise 'some runtime error'
29
- else
30
- 'hi' + 1 # TypeError
31
- end
26
+ attempts += 1
27
+ if attempts % 2 == 0
28
+ raise 'some runtime error'
29
+ else
30
+ 'hi' + 1 # TypeError
31
+ end
32
32
  end
33
33
  rescue => e
34
34
  assert e.kind_of?(TypeError) || e.kind_of?(RuntimeError)
@@ -38,8 +38,8 @@ class RetryThisTest < Test::Unit::TestCase
38
38
  def test_should_retry_block_for_default_1_time_for_default_standard_error_and_raise_error_if_all_attempts_fail
39
39
  attempts = 0
40
40
  retry_this do
41
- attempts += 1
42
- raise StandardError, 'some error'
41
+ attempts += 1
42
+ raise StandardError, 'some error'
43
43
  end
44
44
  rescue => e
45
45
  assert_equal('some error', e.message)
@@ -49,8 +49,8 @@ class RetryThisTest < Test::Unit::TestCase
49
49
  def test_should_pass_on_an_error_that_is_not_among_given_errors
50
50
  attempts = 0
51
51
  retry_this(:error_types => [TypeError]) do
52
- attempts += 1
53
- raise StandardError, 'some error'
52
+ attempts += 1
53
+ raise StandardError, 'some error'
54
54
  end
55
55
  rescue => e
56
56
  assert_equal('some error', e.message)
@@ -67,4 +67,56 @@ class RetryThisTest < Test::Unit::TestCase
67
67
  assert_equal('hi', value)
68
68
  assert_equal(1 + 1, attempts)
69
69
  end
70
+
71
+ def test_should_return_value_of_block_in_one_attempt_if_no_error
72
+ attempts = 0
73
+ value = retry_this(:error_types => [IOError]) do
74
+ attempts += 1
75
+ 'hi'
76
+ end
77
+ assert_equal('hi', value)
78
+ assert_equal(1, attempts)
79
+ end
80
+
81
+ def test_should_allow_block_to_return_explicity_using_return_keyword_if_invoked_from_method
82
+ klass = Class.new do
83
+ include RetryThis
84
+ attr_reader :attempts
85
+ def do_something
86
+ @attempts ||= 0
87
+ value = retry_this do
88
+ @attempts += 1
89
+ return 'hi'
90
+ end
91
+ end
92
+ end
93
+ object = klass.new
94
+ assert_equal('hi', object.do_something)
95
+ assert_equal(1, object.attempts)
96
+ end
97
+
98
+ def test_should_expose_retry_this_as_module_function
99
+ assert RetryThis.respond_to? :retry_this
100
+ end
101
+
102
+ def test_should_yield_attempt_number_to_block
103
+ attempts = []
104
+ retry_this(:times => 3) do |attempt_number|
105
+ attempts << attempt_number
106
+ raise StandardError, 'some error'
107
+ end
108
+ rescue
109
+ assert_equal([1, 2, 3, 4], attempts)
110
+ end
111
+
112
+ def test_should_sleep_for_specified_seconds_before_a_retry
113
+ sleep_durations = []
114
+ class << self; self; end.send(:define_method, :sleep) { |secs| sleep_durations << secs }
115
+
116
+ retry_this(:times => 3, :sleep => 10) do
117
+ raise StandardError, 'some error'
118
+ end
119
+ rescue
120
+ assert_equal([10, 10, 10], sleep_durations)
121
+ end
70
122
  end
metadata CHANGED
@@ -4,8 +4,8 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 1
7
- - 0
8
- version: "1.0"
7
+ - 1
8
+ version: "1.1"
9
9
  platform: ruby
10
10
  authors:
11
11
  - Aman King
@@ -13,7 +13,7 @@ autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
15
 
16
- date: 2009-04-13 00:00:00 +05:30
16
+ date: 2010-12-01 00:00:00 +05:30
17
17
  default_executable:
18
18
  dependencies: []
19
19
 
@@ -40,6 +40,7 @@ rdoc_options: []
40
40
  require_paths:
41
41
  - lib
42
42
  required_ruby_version: !ruby/object:Gem::Requirement
43
+ none: false
43
44
  requirements:
44
45
  - - ">="
45
46
  - !ruby/object:Gem::Version
@@ -47,6 +48,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
47
48
  - 0
48
49
  version: "0"
49
50
  required_rubygems_version: !ruby/object:Gem::Requirement
51
+ none: false
50
52
  requirements:
51
53
  - - ">="
52
54
  - !ruby/object:Gem::Version
@@ -56,7 +58,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
56
58
  requirements: []
57
59
 
58
60
  rubyforge_project:
59
- rubygems_version: 1.3.6
61
+ rubygems_version: 1.3.7
60
62
  signing_key:
61
63
  specification_version: 3
62
64
  summary: RetryThis provides a method that takes a block which it will invoke a given number of times before giving up for specified errors