wire 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -90,6 +90,8 @@ Ingoing arguments to `new`.
90
90
  - **vars** (Array) A list of arguments to the block.
91
91
  - **silent** (Boolean) The given block will not raise error if set to true. Default is false.
92
92
  - **timeout** (Integer) The maximum time to run *one* thread, default is *no limit*.
93
+ - **retries** (Integer) How many times should we retry? Default is 0.
94
+ - **delay** (Float) Time between each retry. Default is 0.
93
95
 
94
96
  ## How do install
95
97
 
@@ -9,7 +9,7 @@ class Wire < Thread
9
9
 
10
10
  def initialize(args, &block)
11
11
  args.keys.each { |name| instance_variable_set "@" + name.to_s, args[name] }
12
-
12
+
13
13
  if @max.to_i <= 0 or @wait.nil?
14
14
  warn "Both max and wait needs to be passed, where max > 0. Using default values"
15
15
  @max = 10 if @max.to_i <= 0
@@ -18,6 +18,9 @@ class Wire < Thread
18
18
 
19
19
  @block = block
20
20
  @counter = Wire.counter
21
+ @retries ||= 0
22
+ @retry = 0
23
+ @delay ||= 0
21
24
 
22
25
  @counter.synchronize do
23
26
  @counter.cond.wait_until { @counter.i < @max }
@@ -33,7 +36,10 @@ class Wire < Thread
33
36
 
34
37
  def runner
35
38
  @timeout ? Timeout::timeout(@timeout) { @block.call(*@vars) } : @block.call(*@vars)
36
- rescue => error
39
+ rescue StandardError => error
40
+ if (@retry += 1) < @retries
41
+ sleep @delay; retry
42
+ end
37
43
  report(error, "An error occurred: #{error.inspect}")
38
44
  ensure
39
45
  @counter.synchronize do
@@ -19,36 +19,36 @@ describe Wire do
19
19
  counter = Counter.new
20
20
  Wire.should_receive(:counter).any_number_of_times.and_return(counter)
21
21
  end
22
-
22
+
23
23
  context "should be able to do run within the time limit" do
24
24
  it "< max threads" do
25
25
  start = time
26
26
  runner(10, {max: 10, wait: 1}) do
27
27
  sleep 0.1
28
28
  end
29
-
29
+
30
30
  (time - start).should < 1.15
31
31
  end
32
-
32
+
33
33
  it "> max threads" do
34
34
  start = time
35
35
  runner(11, {max: 10, wait: 1}) do
36
36
  sleep 0.1
37
37
  end
38
-
38
+
39
39
  (time - start).should > 1.2
40
40
  end
41
41
  end
42
-
42
+
43
43
  it "should run using one thread" do
44
44
  start = time
45
45
  runner(1, {max: 1, wait: 1}) do
46
46
  sleep 0.1
47
47
  end
48
-
48
+
49
49
  (time - start).should < 0.2
50
50
  end
51
-
51
+
52
52
  it "should run using one thread, using a high max value" do
53
53
  start = time
54
54
  runner(1, {max: 100, wait: 1}) do
@@ -57,16 +57,16 @@ describe Wire do
57
57
 
58
58
  (time - start).should < 0.2
59
59
  end
60
-
60
+
61
61
  it "it should not wait" do
62
62
  start = time
63
63
  runner(11, {max: 10, wait: 0}) do
64
64
  sleep 0.1
65
65
  end
66
-
66
+
67
67
  (time - start).should < 0.25
68
68
  end
69
-
69
+
70
70
  context "error" do
71
71
  it "should use the default values if wrong arguments is being passed" do
72
72
  w = Wire.new(max: 0) {}.join
@@ -75,7 +75,7 @@ describe Wire do
75
75
  @wait.should == 1
76
76
  end
77
77
  end
78
-
78
+
79
79
  it "should use the default values if nothing is being passed" do
80
80
  w = Wire.new({}) {}.join
81
81
  w.instance_eval do
@@ -83,7 +83,7 @@ describe Wire do
83
83
  @wait.should == 1
84
84
  end
85
85
  end
86
-
86
+
87
87
  it "should use the default values if wrong arguments is being passed" do
88
88
  w = Wire.new(wait: 5) {}.join
89
89
  w.instance_eval do
@@ -91,7 +91,7 @@ describe Wire do
91
91
  @wait.should == 5
92
92
  end
93
93
  end
94
-
94
+
95
95
  it "should be possible to raise an error" do
96
96
  lambda do
97
97
  Wire.new(wait: 5, max: 1) do
@@ -99,7 +99,7 @@ describe Wire do
99
99
  end.join
100
100
  end.should raise_error(StandardError)
101
101
  end
102
-
102
+
103
103
  it "should be silent" do
104
104
  lambda do
105
105
  Wire.new(wait: 5, max: 1, silent: true) do
@@ -107,7 +107,7 @@ describe Wire do
107
107
  end.join
108
108
  end.should_not raise_error(StandardError)
109
109
  end
110
-
110
+
111
111
  it "should raise timeout error" do
112
112
  lambda do
113
113
  Wire.new(wait: 5, max: 1, timeout: 1) do
@@ -115,7 +115,7 @@ describe Wire do
115
115
  end.join
116
116
  end.should raise_error(Timeout::Error)
117
117
  end
118
-
118
+
119
119
  it "should not raise timeout error" do
120
120
  lambda do
121
121
  Wire.new(wait: 5, silent: true, max: 1, timeout: 1) do
@@ -123,13 +123,46 @@ describe Wire do
123
123
  end.join
124
124
  end.should_not raise_error(Timeout::Error)
125
125
  end
126
-
127
- it "should not raise timeout error" do
128
- lambda do
129
- Wire.new(wait: 5, silent: true, max: 1, timeout: 2) do
130
- sleep 1
131
- end.join
132
- end.should_not raise_error(Timeout::Error)
133
- end
126
+
127
+ it "should not raise timeout error" do
128
+ lambda do
129
+ Wire.new(wait: 5, silent: true, max: 1, timeout: 2) do
130
+ sleep 1
131
+ end.join
132
+ end.should_not raise_error(Timeout::Error)
133
+ end
134
+
135
+ it "should be able to retry - without raise an error" do
136
+ error = mock(Object.new)
137
+ error.should_receive(:new).exactly(10).times.and_return(StandardError)
138
+ lambda do
139
+ Wire.new(wait: 5, silent: true, max: 1, timeout: 2, vars: [error], retries: 10) do |e|
140
+ sleep 0.2
141
+ raise e.new
142
+ end.join
143
+ end.should_not raise_error(Timeout::Error)
144
+ end
145
+
146
+ it "should be able to retry" do
147
+ error = mock(Object.new)
148
+ error.should_receive(:new).exactly(10).times.and_return(StandardError)
149
+ lambda do
150
+ Wire.new(wait: 5, max: 1, timeout: 2, vars: [error], retries: 10) do |e|
151
+ sleep 0.2
152
+ raise e.new
153
+ end.join
154
+ end.should raise_error(StandardError)
155
+ end
156
+
157
+ it "should be able to retry with a delay" do
158
+ error = mock(Object.new)
159
+ error.should_receive(:new).exactly(10).times.and_return(StandardError)
160
+ lambda do
161
+ Wire.new(retries: 10, delay: 0.2, wait: 5, max: 1, timeout: 1, vars: [error]) do |e|
162
+ error.new
163
+ sleep 10
164
+ end.join
165
+ end.should raise_error(Timeout::Error)
166
+ end
134
167
  end
135
- end
168
+ end
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "wire"
6
- s.version = "0.1.1"
6
+ s.version = "0.1.2"
7
7
  s.platform = Gem::Platform::RUBY
8
8
  s.authors = ["Linus Oleander"]
9
9
  s.email = ["linus@oleander.nu"]
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: wire
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.1.1
5
+ version: 0.1.2
6
6
  platform: ruby
7
7
  authors:
8
8
  - Linus Oleander
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-03-29 00:00:00 +02:00
13
+ date: 2011-04-02 00:00:00 +02:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency