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 +61 -23
- data/lib/tries.rb +11 -3
- data/lib/tries/version.rb +1 -1
- data/spec/tries/tries_spec.rb +22 -10
- metadata +23 -23
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
|
-
@
|
49
|
+
@error_counter = 0
|
48
50
|
|
49
51
|
def method_that_raises_exception
|
50
|
-
@
|
51
|
-
puts "Counter is #{@
|
52
|
+
@error_counter += 1
|
53
|
+
puts "Counter is #{@error_counter}"
|
52
54
|
|
53
|
-
case @
|
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
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
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
|
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
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
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
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
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 =
|
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
|
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
data/spec/tries/tries_spec.rb
CHANGED
@@ -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
|
-
|
87
|
-
when
|
88
|
-
|
89
|
-
when
|
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-
|
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
|
-
|
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:
|
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
|
-
|
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:
|
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
|
-
|
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:
|
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
|
-
|
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.
|
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.
|
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
|