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 +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
|
[](https://gemnasium.com/krautcomputing/tries)
|
5
5
|
[](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
|