tries 0.1.0 → 0.2.0

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