io_unblock 0.1.0 → 0.1.1
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/.travis.yml +6 -0
- data/Gemfile +2 -2
- data/lib/io_unblock/stream.rb +8 -0
- data/lib/io_unblock/version.rb +1 -1
- data/spec/io_unblock/stream_spec.rb +28 -13
- data/spec/spec_helper.rb +5 -2
- metadata +7 -6
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/lib/io_unblock/stream.rb
CHANGED
@@ -24,6 +24,7 @@ module IoUnblock
|
|
24
24
|
# - started: called when the IO processing has started
|
25
25
|
# - stopped: called when the IO processing has stopped
|
26
26
|
# - looped: called when each time the IO processing loops
|
27
|
+
# - callback_failed: called when an exception is raised within a callback
|
27
28
|
def initialize io, callbacks=nil
|
28
29
|
@io = io
|
29
30
|
@io_selector = [@io]
|
@@ -73,6 +74,13 @@ private
|
|
73
74
|
def trigger_callbacks named, *args, &other
|
74
75
|
other && other.call(*args)
|
75
76
|
@callbacks.key?(named) && @callbacks[named].call(*args)
|
77
|
+
rescue Exception => ex
|
78
|
+
if named == :callback_failed
|
79
|
+
warn "Exception raised in callback_failed handler: #{ex}"
|
80
|
+
ex.backtrace.each { |b| warn b }
|
81
|
+
else
|
82
|
+
trigger_callbacks :callback_failed, ex, named
|
83
|
+
end
|
76
84
|
end
|
77
85
|
|
78
86
|
def flush_and_close
|
data/lib/io_unblock/version.rb
CHANGED
@@ -1,8 +1,4 @@
|
|
1
1
|
require File.expand_path("../../spec_helper.rb", __FILE__)
|
2
|
-
require 'stringio'
|
3
|
-
require 'logger'
|
4
|
-
|
5
|
-
$log = Logger.new $stdout
|
6
2
|
|
7
3
|
describe IoUnblock::Stream do
|
8
4
|
def dummy_io; @dummy_io ||= DummyIO.new; end
|
@@ -101,21 +97,21 @@ describe IoUnblock::Stream do
|
|
101
97
|
end
|
102
98
|
|
103
99
|
it "triggers started when starting" do
|
104
|
-
cb_stream = callback_stream(started
|
100
|
+
cb_stream = callback_stream(:started => callback)
|
105
101
|
cb_stream.start
|
106
102
|
cb_stream.stop
|
107
103
|
called_with.must_equal [ [:start] ]
|
108
104
|
end
|
109
105
|
|
110
106
|
it "triggers stopped when stopping" do
|
111
|
-
cb_stream = callback_stream(stopped
|
107
|
+
cb_stream = callback_stream(:stopped => callback)
|
112
108
|
cb_stream.start
|
113
109
|
cb_stream.stop
|
114
110
|
called_with.must_equal [ [:stop] ]
|
115
111
|
end
|
116
112
|
|
117
113
|
it "triggers looped after each read/write cycle" do
|
118
|
-
cb_stream = callback_stream(looped
|
114
|
+
cb_stream = callback_stream(:looped => callback)
|
119
115
|
cb_stream.start
|
120
116
|
Thread.pass while called_with.empty?
|
121
117
|
cb_stream.stop
|
@@ -124,7 +120,7 @@ describe IoUnblock::Stream do
|
|
124
120
|
|
125
121
|
it "triggers wrote when writing" do
|
126
122
|
dummy_io.max_write = 3
|
127
|
-
cb_stream = callback_stream(wrote
|
123
|
+
cb_stream = callback_stream(:wrote => callback)
|
128
124
|
cb_stream.start
|
129
125
|
cb_stream.write "hello"
|
130
126
|
cb_stream.stop
|
@@ -134,7 +130,7 @@ describe IoUnblock::Stream do
|
|
134
130
|
it "triggers read when reading" do
|
135
131
|
dummy_io.max_read = 3
|
136
132
|
dummy_io.r_stream.string = 'hello'
|
137
|
-
cb_stream = callback_stream(read
|
133
|
+
cb_stream = callback_stream(:read => callback)
|
138
134
|
cb_stream.start
|
139
135
|
Thread.pass until dummy_io.r_stream.eof?
|
140
136
|
cb_stream.stop
|
@@ -142,7 +138,7 @@ describe IoUnblock::Stream do
|
|
142
138
|
end
|
143
139
|
|
144
140
|
it "triggers closed when closing" do
|
145
|
-
cb_stream = callback_stream(closed
|
141
|
+
cb_stream = callback_stream(:closed => callback)
|
146
142
|
cb_stream.start
|
147
143
|
cb_stream.stop
|
148
144
|
called_with.must_equal [ [] ]
|
@@ -150,7 +146,7 @@ describe IoUnblock::Stream do
|
|
150
146
|
|
151
147
|
it "triggers failed when reading raises an error" do
|
152
148
|
err = RuntimeError.new "fail"
|
153
|
-
cb_stream = callback_stream(failed
|
149
|
+
cb_stream = callback_stream(:failed => callback)
|
154
150
|
dummy_io.raise_read = err
|
155
151
|
cb_stream.start
|
156
152
|
Thread.pass until cb_stream.running?
|
@@ -161,7 +157,7 @@ describe IoUnblock::Stream do
|
|
161
157
|
|
162
158
|
it "triggers failed when writing raises an error" do
|
163
159
|
err = RuntimeError.new "fail"
|
164
|
-
cb_stream = callback_stream(failed
|
160
|
+
cb_stream = callback_stream(:failed => callback)
|
165
161
|
dummy_io.raise_write = err
|
166
162
|
cb_stream.start
|
167
163
|
cb_stream.write "hello"
|
@@ -186,7 +182,7 @@ describe IoUnblock::Stream do
|
|
186
182
|
it "is not connected when failed is triggered" do
|
187
183
|
is_connected = true
|
188
184
|
cb_stream = callback_stream(
|
189
|
-
failed
|
185
|
+
:failed => lambda { |ex| is_connected = cb_stream.connected? }
|
190
186
|
)
|
191
187
|
err = RuntimeError.new "fail"
|
192
188
|
dummy_io.raise_write = err
|
@@ -195,5 +191,24 @@ describe IoUnblock::Stream do
|
|
195
191
|
cb_stream.stop
|
196
192
|
is_connected.must_equal false
|
197
193
|
end
|
194
|
+
|
195
|
+
it "triggers callback_failed when a callback raises an exception" do
|
196
|
+
cb_err = RuntimeError.new 'failback!'
|
197
|
+
cb_stream = callback_stream(:callback_failed => callback)
|
198
|
+
cb_stream.start
|
199
|
+
cb_stream.write('a test') { raise cb_err }
|
200
|
+
cb_stream.stop
|
201
|
+
called_with.must_equal [ [cb_err, :wrote] ]
|
202
|
+
end
|
203
|
+
|
204
|
+
it "warns when triggering callback_failed raises an exception" do
|
205
|
+
cb_err = RuntimeError.new 'failback!'
|
206
|
+
cb_stream = callback_stream(
|
207
|
+
:callback_failed => lambda { |*_| raise cb_err }
|
208
|
+
)
|
209
|
+
cb_stream.start
|
210
|
+
cb_stream.write('another test') { raise cb_err }
|
211
|
+
cb_stream.stop
|
212
|
+
end
|
198
213
|
end
|
199
214
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: io_unblock
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-03-
|
12
|
+
date: 2012-03-13 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: minitest
|
16
|
-
requirement: &
|
16
|
+
requirement: &2161186640 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *2161186640
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rake
|
27
|
-
requirement: &
|
27
|
+
requirement: &2161185800 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *2161185800
|
36
36
|
description: Non-blocking IO reads/writes wrapped in a thread
|
37
37
|
email:
|
38
38
|
- ian.eccles@gmail.com
|
@@ -42,6 +42,7 @@ extra_rdoc_files: []
|
|
42
42
|
files:
|
43
43
|
- .autotest
|
44
44
|
- .gitignore
|
45
|
+
- .travis.yml
|
45
46
|
- Gemfile
|
46
47
|
- README.md
|
47
48
|
- Rakefile
|