tries 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -4,7 +4,9 @@
4
4
  [![Dependency Status](https://gemnasium.com/krautcomputing/tries.png)](https://gemnasium.com/krautcomputing/tries)
5
5
  [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/krautcomputing/tries)
6
6
 
7
- Solidify your code and retry on petty exceptions
7
+ Solidify your code and retry on petty exceptions.
8
+
9
+ Read the accompanying [blog post](http://www.krautcomputing.com/blog/2012/12/19/new-gem-tries/).
8
10
 
9
11
  ## Requirements
10
12
 
@@ -44,13 +46,13 @@ end
44
46
  FooError = Class.new(StandardError)
45
47
  BarError = Class.new(StandardError)
46
48
 
47
- @counter = 0
49
+ @error_counter = 0
48
50
 
49
51
  def method_that_raises_exception
50
- @counter += 1
51
- puts "Counter is #{@counter}"
52
+ @error_counter += 1
53
+ puts "Counter is #{@error_counter}"
52
54
 
53
- case @counter
55
+ case @error_counter
54
56
  when 1 then raise FooError
55
57
  when 2 then raise FooError
56
58
  when 3 then raise BarError
@@ -63,40 +65,76 @@ end
63
65
 
64
66
  ```ruby
65
67
  # Rescue all errors
66
-
67
68
  4.tries do
68
69
  method_that_raises_exception
69
70
  end
70
71
 
71
- > Counter is 1
72
- > Counter is 2
73
- > Counter is 3
74
- > Counter is 4
75
- > Counter is 5
76
- > You made it through!
72
+ => Counter is 1
73
+ => Counter is 2
74
+ => Counter is 3
75
+ => Counter is 4
76
+ => Counter is 5
77
+ => You made it through!
77
78
  ```
78
79
 
79
80
  ```ruby
80
- # Rescue only certain errors
81
-
81
+ # Rescue a specific error
82
82
  3.tries on: FooError do
83
83
  method_that_raises_exception
84
84
  end
85
85
 
86
- > Counter is 1
87
- > Counter is 2
88
- > Counter is 3
89
- > BarError: BarError
86
+ => Counter is 1
87
+ => Counter is 2
88
+ => Counter is 3
89
+ => BarError: BarError
90
+ ```
90
91
 
92
+ ```ruby
93
+ # Rescue multiple errors
91
94
  3.tries on: [FooError, BarError] do
92
95
  method_that_raises_exception
93
96
  end
94
97
 
95
- > Counter is 1
96
- > Counter is 2
97
- > Counter is 3
98
- > Counter is 4
99
- > StandardError: StandardError
98
+ => Counter is 1
99
+ => Counter is 2
100
+ => Counter is 3
101
+ => Counter is 4
102
+ => StandardError: StandardError
103
+ ```
104
+
105
+ ```ruby
106
+ # Delay execution after error
107
+ # "delay" parameter is in seconds, fractions are possible
108
+ 4.tries delay: 1.5 do
109
+ method_that_raises_exception
110
+ end
111
+
112
+ => Counter is 1
113
+ waits 1.5 seconds...
114
+ => Counter is 2
115
+ waits 1.5 seconds...
116
+ => Counter is 3
117
+ waits 1.5 seconds...
118
+ => Counter is 4
119
+ waits 1.5 seconds...
120
+ => Counter is 5
121
+ => You made it through!
122
+
123
+ # you can also have an incremental "delay"
124
+ 4.tries delay: 1.5, incremental: true do
125
+ method_that_raises_exception
126
+ end
127
+
128
+ => Counter is 1
129
+ waits 1.5 seconds...
130
+ => Counter is 2
131
+ waits 3 seconds...
132
+ => Counter is 3
133
+ waits 4.5 seconds...
134
+ => Counter is 4
135
+ waits 6 seconds...
136
+ => Counter is 5
137
+ => You made it through!
100
138
  ```
101
139
 
102
140
  ## Contributing
data/lib/tries.rb CHANGED
@@ -2,17 +2,25 @@ require 'tries/version'
2
2
 
3
3
  class Integer
4
4
  def tries(options = {}, &block)
5
- attempts = self
5
+ attempts = 1
6
6
  exception_classes = Array(options[:on] || StandardError)
7
7
  delay = options[:delay]
8
+ incremental = options[:incremental]
8
9
 
9
10
  begin
10
11
  return yield
11
12
  rescue *exception_classes
12
- Kernel.sleep delay if delay
13
- retry if (attempts -= 1) > 0
13
+ Kernel.sleep calculate_delay(delay, attempts, incremental) if delay
14
+ retry if (attempts += 1) <= self
14
15
  end
15
16
 
16
17
  yield
17
18
  end
19
+
20
+ private
21
+ def calculate_delay(delay, attempts, incremental)
22
+ return delay unless incremental
23
+
24
+ delay * attempts
25
+ end
18
26
  end
data/lib/tries/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Tries
2
- VERSION = '0.1.0'
2
+ VERSION = '0.2.0'
3
3
  end
@@ -72,6 +72,23 @@ describe Tries do
72
72
  rescue StandardError
73
73
  end
74
74
  end
75
+
76
+ context 'when setting incremental as true' do
77
+ let(:delay) { 1 }
78
+
79
+ it 'sleeps incrementally' do
80
+ Kernel.should_receive(:sleep).with(1).ordered
81
+ Kernel.should_receive(:sleep).with(2).ordered
82
+ Kernel.should_receive(:sleep).with(3).ordered
83
+
84
+ begin
85
+ 3.tries on: [FooError, BarError], delay: delay, incremental: true do
86
+ raise_foo_foo_bar_bar_standard
87
+ end
88
+ rescue StandardError
89
+ end
90
+ end
91
+ end
75
92
  end
76
93
  end
77
94
 
@@ -82,15 +99,10 @@ def raise_foo_foo_bar_bar_standard
82
99
  @error_counter += 1
83
100
 
84
101
  case @error_counter
85
- when 1
86
- raise FooError
87
- when 2
88
- raise FooError
89
- when 3
90
- raise BarError
91
- when 4
92
- raise BarError
93
- when 5
94
- raise StandardError
102
+ when 1 then raise FooError
103
+ when 2 then raise FooError
104
+ when 3 then raise BarError
105
+ when 4 then raise BarError
106
+ when 5 then raise StandardError
95
107
  end
96
108
  end
metadata CHANGED
@@ -1,17 +1,25 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tries
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
5
4
  prerelease:
5
+ version: 0.2.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Manuel Meurer
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-10 00:00:00.000000000 Z
12
+ date: 2012-12-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
+ prerelease: false
16
+ type: :development
17
+ version_requirements: !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ~>
21
+ - !ruby/object:Gem::Version
22
+ version: 2.12.0
15
23
  name: rspec
16
24
  requirement: !ruby/object:Gem::Requirement
17
25
  none: false
@@ -19,15 +27,15 @@ dependencies:
19
27
  - - ~>
20
28
  - !ruby/object:Gem::Version
21
29
  version: 2.12.0
22
- type: :development
30
+ - !ruby/object:Gem::Dependency
23
31
  prerelease: false
32
+ type: :development
24
33
  version_requirements: !ruby/object:Gem::Requirement
25
34
  none: false
26
35
  requirements:
27
36
  - - ~>
28
37
  - !ruby/object:Gem::Version
29
- version: 2.12.0
30
- - !ruby/object:Gem::Dependency
38
+ version: 10.0.1
31
39
  name: rake
32
40
  requirement: !ruby/object:Gem::Requirement
33
41
  none: false
@@ -35,15 +43,15 @@ dependencies:
35
43
  - - ~>
36
44
  - !ruby/object:Gem::Version
37
45
  version: 10.0.1
38
- type: :development
46
+ - !ruby/object:Gem::Dependency
39
47
  prerelease: false
48
+ type: :development
40
49
  version_requirements: !ruby/object:Gem::Requirement
41
50
  none: false
42
51
  requirements:
43
52
  - - ~>
44
53
  - !ruby/object:Gem::Version
45
- version: 10.0.1
46
- - !ruby/object:Gem::Dependency
54
+ version: 0.9.2
47
55
  name: rb-fsevent
48
56
  requirement: !ruby/object:Gem::Requirement
49
57
  none: false
@@ -51,15 +59,15 @@ dependencies:
51
59
  - - ~>
52
60
  - !ruby/object:Gem::Version
53
61
  version: 0.9.2
54
- type: :development
62
+ - !ruby/object:Gem::Dependency
55
63
  prerelease: false
64
+ type: :development
56
65
  version_requirements: !ruby/object:Gem::Requirement
57
66
  none: false
58
67
  requirements:
59
68
  - - ~>
60
69
  - !ruby/object:Gem::Version
61
- version: 0.9.2
62
- - !ruby/object:Gem::Dependency
70
+ version: 1.5.2
63
71
  name: guard
64
72
  requirement: !ruby/object:Gem::Requirement
65
73
  none: false
@@ -67,15 +75,15 @@ dependencies:
67
75
  - - ~>
68
76
  - !ruby/object:Gem::Version
69
77
  version: 1.5.2
70
- type: :development
78
+ - !ruby/object:Gem::Dependency
71
79
  prerelease: false
80
+ type: :development
72
81
  version_requirements: !ruby/object:Gem::Requirement
73
82
  none: false
74
83
  requirements:
75
84
  - - ~>
76
85
  - !ruby/object:Gem::Version
77
- version: 1.5.2
78
- - !ruby/object:Gem::Dependency
86
+ version: 2.1.2
79
87
  name: guard-rspec
80
88
  requirement: !ruby/object:Gem::Requirement
81
89
  none: false
@@ -83,14 +91,6 @@ dependencies:
83
91
  - - ~>
84
92
  - !ruby/object:Gem::Version
85
93
  version: 2.1.2
86
- type: :development
87
- prerelease: false
88
- version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
- requirements:
91
- - - ~>
92
- - !ruby/object:Gem::Version
93
- version: 2.1.2
94
94
  description: Solidify your code and retry on petty exceptions
95
95
  email: manuel.meurer@gmail.com
96
96
  executables: []
@@ -129,7 +129,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
129
129
  version: '0'
130
130
  requirements: []
131
131
  rubyforge_project:
132
- rubygems_version: 1.8.23
132
+ rubygems_version: 1.8.24
133
133
  signing_key:
134
134
  specification_version: 3
135
135
  summary: Solidify your code and retry on petty exceptions