try-until 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/lib/try-until.rb +1 -0
- data/lib/try_until.rb +4 -0
- data/lib/try_until/probe.rb +23 -0
- data/lib/try_until/repeatedly.rb +73 -0
- data/lib/try_until/version.rb +3 -0
- metadata +93 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
OTgyNWMzYmMwZjI0MWQ1OGJkZjRlYjJmNjVhMmM4NjViZjNmZTI3Mw==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
YzliYTUyOGIwOTExNmUwNjZiZGVlMTMwNmRmZjY1NDc0Y2Y5ZGMxMQ==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
ZjRkOWU5NWI5M2I3OWI4OTJlMzNlNDc3ZTM3Y2I4ZmExNDNkNjU4ZGYyN2U0
|
10
|
+
MjUxNzY0NDhiOWY1YmQxZGEyMTQ4MDFkODFkODI5ZGUwZmRmZDk5YzE2NTlh
|
11
|
+
ZjcyNjZlZGQ0NTRiYzJjNzQ5YTlmZmEzODQ0YmNiYjZhMGNmNmU=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
ODY3MDVhMzAxNjlkZWRhMDE2NGFlNWE0ZDJhNDk4YzlmZjYxMWNkNTdmNDNi
|
14
|
+
MjgxZGI2NzU2ZjAwY2VlZTJmZTQ2Yzk4NDMxNTk0Y2YxYjRlMjdlMmYzODQ4
|
15
|
+
YWQ3MTRjNzUyZjIyMmRiYTgxOWY1ZWFjZGYyMGIwN2Y2ZWRiNGM=
|
data/lib/try-until.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/try_until'
|
data/lib/try_until.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
module TryUntil
|
2
|
+
# This PORO holds information about a target object against which
|
3
|
+
# to call a specified method with specified arguments
|
4
|
+
class Probe
|
5
|
+
|
6
|
+
# Example: Probe.new(SomeClass.new, :some_method, [arg1, arg2, ...])
|
7
|
+
def initialize(target, method, args = [])
|
8
|
+
@target = target
|
9
|
+
@method = method
|
10
|
+
@args = args
|
11
|
+
end
|
12
|
+
|
13
|
+
def sample
|
14
|
+
@target.send(@method, *@args)
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_s
|
18
|
+
"Probe: #{@target.class}##{@method}(#{@args})"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
|
@@ -0,0 +1,73 @@
|
|
1
|
+
module TryUntil
|
2
|
+
# External interface
|
3
|
+
# Example:
|
4
|
+
# include TryUntil
|
5
|
+
# result = Repeatedly.new(Probe.new(Object.new, :to_s))
|
6
|
+
# .attempts(5)
|
7
|
+
# .interval(10)
|
8
|
+
# .rescues([ ArgumentError, IOError ])
|
9
|
+
# .stop_when(lambda { |response| JSON.parse(response.body)['id'] == 'some_id' })
|
10
|
+
# .execute
|
11
|
+
#
|
12
|
+
# Not all of the above settings are required. These are the default values:
|
13
|
+
# attempt = 3
|
14
|
+
# interval = 0
|
15
|
+
# rescues = []
|
16
|
+
# stop_when = lambda { |response| false }
|
17
|
+
#
|
18
|
+
class Repeatedly
|
19
|
+
|
20
|
+
def initialize(probe)
|
21
|
+
@probe = probe
|
22
|
+
end
|
23
|
+
|
24
|
+
def attempts(int_num)
|
25
|
+
@attempts = int_num
|
26
|
+
self
|
27
|
+
end
|
28
|
+
|
29
|
+
def interval(seconds)
|
30
|
+
@interval = seconds
|
31
|
+
self
|
32
|
+
end
|
33
|
+
|
34
|
+
def rescues(errors)
|
35
|
+
@rescues = errors
|
36
|
+
self
|
37
|
+
end
|
38
|
+
|
39
|
+
def stop_when(callable)
|
40
|
+
@stop_when = callable
|
41
|
+
self
|
42
|
+
end
|
43
|
+
|
44
|
+
# The heart of this gem: This method will repeatedly call '#sample' on the
|
45
|
+
# subject and evaluate if the expectated result is returned.
|
46
|
+
# In case of errors it will rescue those and continue, provided the type
|
47
|
+
# of error is among the ones defined in @rescues.
|
48
|
+
def execute
|
49
|
+
@attempts = 3 unless @attempts
|
50
|
+
@interval = 0 unless @interval
|
51
|
+
@stop_when = lambda { |response| false } unless @stop_when
|
52
|
+
@rescues = [] unless @rescues
|
53
|
+
count = 0
|
54
|
+
while count < @attempts
|
55
|
+
begin
|
56
|
+
result = @probe.sample
|
57
|
+
return result if @stop_when.call(result)
|
58
|
+
rescue *@rescues => exception
|
59
|
+
raise exception, "During final attempt (#{@attempts} configured) target returned #{exception}" if count + 1 == @attempts
|
60
|
+
ensure
|
61
|
+
count += 1
|
62
|
+
Kernel.sleep @interval if @interval > 0
|
63
|
+
end
|
64
|
+
end
|
65
|
+
raise "After #{@attempts} attempts, the expected result was not returned!"
|
66
|
+
end
|
67
|
+
|
68
|
+
def configuration
|
69
|
+
{ :probe => @probe.to_s, :attempts => @attempts, :interval => @interval,
|
70
|
+
:rescues => @rescues, :stop_when => @stop_when }
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
metadata
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: try-until
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Markus Krogemann
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-09-10 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.14.1
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.14.1
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: simplecov
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.7.1
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.7.1
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: metric_fu
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 4.4.1
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 4.4.1
|
55
|
+
description: The try-until library supports repeatedly calling code that may fail
|
56
|
+
or respond with values other than expected. Matchers, realized as lambdas, can be
|
57
|
+
used to specify expected result.
|
58
|
+
email:
|
59
|
+
- markus@krogemann.de
|
60
|
+
executables: []
|
61
|
+
extensions: []
|
62
|
+
extra_rdoc_files: []
|
63
|
+
files:
|
64
|
+
- lib/try-until.rb
|
65
|
+
- lib/try_until/probe.rb
|
66
|
+
- lib/try_until/repeatedly.rb
|
67
|
+
- lib/try_until/version.rb
|
68
|
+
- lib/try_until.rb
|
69
|
+
homepage: https://github.com/mkrogemann/try-until
|
70
|
+
licenses:
|
71
|
+
- MIT
|
72
|
+
metadata: {}
|
73
|
+
post_install_message:
|
74
|
+
rdoc_options: []
|
75
|
+
require_paths:
|
76
|
+
- lib
|
77
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ! '>='
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
82
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
requirements: []
|
88
|
+
rubyforge_project:
|
89
|
+
rubygems_version: 2.0.3
|
90
|
+
signing_key:
|
91
|
+
specification_version: 4
|
92
|
+
summary: Retry and matching logic
|
93
|
+
test_files: []
|