em_retry 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/lib/em_retry.rb ADDED
@@ -0,0 +1,32 @@
1
+ require 'eventmachine'
2
+
3
+ # Tries to evaluate the given block with the given timers
4
+ # until it's not nil or false.
5
+ #
6
+ # EM.with_retries(1,2,3){false}
7
+ #
8
+ # is executed immediatelly, after 1 second,
9
+ # after another 2 secondes and after another 3 seconds.
10
+ #
11
+ module EventMachine
12
+ def self.with_retries(*timers, &block)
13
+ block.call || !timers.empty? && EM.add_timer(timers.shift) do
14
+ with_retries *timers, &block
15
+ end
16
+ end
17
+ end
18
+
19
+ # A convenience wrapper for existing methods to indicate they should be
20
+ # executed in a EM.with_retries block.
21
+ #
22
+ module EMRetryMethod
23
+ def retry_method(meth, *timers)
24
+ orig_method = instance_method(meth)
25
+
26
+ define_method meth do |*args, &block|
27
+ EM.with_retries *timers do
28
+ orig_method.bind(self).call *args, &block
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,3 @@
1
+ module EmRetry
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,51 @@
1
+ $LOAD_PATH << File.join(File.expand_path(File.dirname(__FILE__)), '../lib')
2
+
3
+ require 'em_retry'
4
+
5
+ describe EventMachine do
6
+ describe ".with_retries" do
7
+ it "should retry the block" do
8
+ EM.run do
9
+ EM.add_timer(0.8){EM.stop}
10
+
11
+ Kernel.should_receive(:puts).with("trial 1")
12
+ Kernel.should_receive(:puts).with("trial 2")
13
+ Kernel.should_receive(:puts).with("trial 3")
14
+ Kernel.should_receive(:puts).with("trial 4")
15
+
16
+ i = 0
17
+ EM.with_retries 0.01, 0.02, 0.03 do
18
+ Kernel.puts "trial #{i+=1}"
19
+ end
20
+ end
21
+ end
22
+ it "should use the given timers" do
23
+ EM.run do
24
+ EM.add_timer(0.1){EM.stop}
25
+
26
+ EM.should_receive(:add_timer).with(0.01)
27
+ EM.with_retries 0.01 do
28
+ Kernel.puts "trial"
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ class A
36
+ extend EMRetryMethod
37
+ def foo; end
38
+ retry_method :foo, 1,2,3
39
+ end
40
+
41
+ describe EMRetryMethod do
42
+ describe "#retry_method" do
43
+ before(:each) do
44
+ @a = A.new
45
+ end
46
+ it "should description" do
47
+ EM.should_receive(:with_retries).with(1,2,3)
48
+ @a.foo
49
+ end
50
+ end
51
+ end
metadata ADDED
@@ -0,0 +1,91 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: em_retry
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 1
9
+ version: 0.0.1
10
+ platform: ruby
11
+ authors:
12
+ - Niko Dittmann
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-11-21 00:00:00 +01:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: eventmachine
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 0
30
+ version: "0"
31
+ type: :runtime
32
+ version_requirements: *id001
33
+ - !ruby/object:Gem::Dependency
34
+ name: rspec
35
+ prerelease: false
36
+ requirement: &id002 !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ segments:
42
+ - 0
43
+ version: "0"
44
+ type: :development
45
+ version_requirements: *id002
46
+ description: ""
47
+ email: mail+git@niko-dittmann.com
48
+ executables: []
49
+
50
+ extensions: []
51
+
52
+ extra_rdoc_files: []
53
+
54
+ files:
55
+ - lib/em_retry/version.rb
56
+ - lib/em_retry.rb
57
+ - spec/em_retry_spec.rb
58
+ has_rdoc: true
59
+ homepage: http://github.com/niko/em_retry
60
+ licenses: []
61
+
62
+ post_install_message:
63
+ rdoc_options: []
64
+
65
+ require_paths:
66
+ - lib
67
+ required_ruby_version: !ruby/object:Gem::Requirement
68
+ none: false
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ segments:
73
+ - 0
74
+ version: "0"
75
+ required_rubygems_version: !ruby/object:Gem::Requirement
76
+ none: false
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ segments:
81
+ - 0
82
+ version: "0"
83
+ requirements: []
84
+
85
+ rubyforge_project: "[none]"
86
+ rubygems_version: 1.3.7
87
+ signing_key:
88
+ specification_version: 3
89
+ summary: A retry-method for Eventmachine and a convenience wrapper.
90
+ test_files:
91
+ - spec/em_retry_spec.rb