ionian 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 81979c2c40c6fa759df1c49a2d5226edfb46ba18
4
- data.tar.gz: 76e21b58efbdce773066a8f20c23f1a422df43e5
3
+ metadata.gz: 8ed4a0765c97eff06e5318477989af9dcc436cfb
4
+ data.tar.gz: c5a76f349eb8ed7e1ecc4f62ac1133fff87a494b
5
5
  SHA512:
6
- metadata.gz: 239b709e5a1f3f112f238d01054d8e31d0b5f983ae4ef0093025f92573038f689ef1aa7f8425546afb7e53d8a8aac7e6d6d259a31bd38e023e3b78d433a06500
7
- data.tar.gz: d8b5ab66d8ae1d31f0aa5d6046198eb34404e15af7711abce4ec09f43b1cecfcf16a0e0c71f31dee609ea8978081ad5369c1bd94787146f23de644f91c0bd5d9
6
+ metadata.gz: 3fa5c34137d8718f792bf26fabcea6ca786c325136291cce5aecb6350a711849615f39fb1cb81d5463b4334248b47f3c58ccf597707a81d8792319aed3f195ef
7
+ data.tar.gz: 7d3a636e3260627fa07f90f61c6a7dfc855dff2a57325c5932eea2ac17a0d824ba8c5da399e566c841b361ee13977af16a9f7aa20c8c6cd58c205b5df5a8d3b8
@@ -412,7 +412,7 @@ automatically.</p>
412
412
 
413
413
  <div class="method-heading">
414
414
  <span class="method-name">read_match</span><span
415
- class="method-args">(**kvargs) { |$~| ... }</span>
415
+ class="method-args">(**kwargs) { |$~| ... }</span>
416
416
 
417
417
  <span class="method-click-advice">click to toggle source</span>
418
418
 
@@ -438,7 +438,7 @@ last match with match.post_match. This data remains in the buffer for the
438
438
  next <a href="IO.html#method-i-read_match">read_match</a> cycle. This is
439
439
  helpful for protocols like RS232 that do not have packet boundries.</p>
440
440
 
441
- <p>kvargs:</p>
441
+ <p>kwargs:</p>
442
442
 
443
443
  <pre>timeout: Timeout in seconds IO::select will block.
444
444
  skip_select: Skip over the IO::select statement. Use if you
@@ -451,10 +451,10 @@ build_methods: Build method accessors from named captures.
451
451
 
452
452
  <div class="method-source-code" id="read_match-source">
453
453
  <pre><span class="ruby-comment"># File lib/ionian/extension/io.rb, line 77</span>
454
- <span class="ruby-keyword">def</span> <span class="ruby-identifier">read_match</span>(<span class="ruby-operator">**</span><span class="ruby-identifier">kvargs</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>)
455
- <span class="ruby-identifier">timeout</span> = <span class="ruby-identifier">kvargs</span>.<span class="ruby-identifier">fetch</span> <span class="ruby-value">:timeout</span>, <span class="ruby-ivar">@ionian_timeout</span>
456
- <span class="ruby-identifier">skip_select</span> = <span class="ruby-identifier">kvargs</span>.<span class="ruby-identifier">fetch</span> <span class="ruby-value">:skip_select</span>, <span class="ruby-ivar">@ionian_skip_select</span>
457
- <span class="ruby-identifier">build_methods</span> = <span class="ruby-identifier">kvargs</span>.<span class="ruby-identifier">fetch</span> <span class="ruby-value">:build_methods</span>, <span class="ruby-ivar">@ionian_build_methods</span>
454
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">read_match</span>(<span class="ruby-operator">**</span><span class="ruby-identifier">kwargs</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>)
455
+ <span class="ruby-identifier">timeout</span> = <span class="ruby-identifier">kwargs</span>.<span class="ruby-identifier">fetch</span> <span class="ruby-value">:timeout</span>, <span class="ruby-ivar">@ionian_timeout</span>
456
+ <span class="ruby-identifier">skip_select</span> = <span class="ruby-identifier">kwargs</span>.<span class="ruby-identifier">fetch</span> <span class="ruby-value">:skip_select</span>, <span class="ruby-ivar">@ionian_skip_select</span>
457
+ <span class="ruby-identifier">build_methods</span> = <span class="ruby-identifier">kwargs</span>.<span class="ruby-identifier">fetch</span> <span class="ruby-value">:build_methods</span>, <span class="ruby-ivar">@ionian_build_methods</span>
458
458
 
459
459
  <span class="ruby-keyword">unless</span> <span class="ruby-identifier">skip_select</span>
460
460
  <span class="ruby-keyword">return</span> <span class="ruby-keyword">nil</span> <span class="ruby-keyword">unless</span> <span class="ruby-operator">::</span><span class="ruby-constant">IO</span>.<span class="ruby-identifier">select</span> [<span class="ruby-keyword">self</span>], <span class="ruby-keyword">nil</span>, <span class="ruby-keyword">nil</span>, <span class="ruby-identifier">timeout</span>
@@ -543,7 +543,7 @@ ionian_socket.register_observer {…}</p>
543
543
 
544
544
  <div class="method-heading">
545
545
  <span class="method-name">run_match</span><span
546
- class="method-args">(**kvargs)</span>
546
+ class="method-args">(**kwargs)</span>
547
547
 
548
548
  <span class="method-click-advice">click to toggle source</span>
549
549
 
@@ -553,7 +553,7 @@ ionian_socket.register_observer {…}</p>
553
553
  <div class="method-description">
554
554
 
555
555
  <p>Start a thread that checks for data and notifies listeners (do |match,
556
- socket|). Passes kvargs to <a
556
+ socket|). Passes kwargs to <a
557
557
  href="IO.html#method-i-read_match">read_match</a>. This method SHOULD NOT
558
558
  be used if <a href="IO.html#method-i-read_match">read_match</a> is used.</p>
559
559
 
@@ -562,11 +562,11 @@ be used if <a href="IO.html#method-i-read_match">read_match</a> is used.</p>
562
562
 
563
563
  <div class="method-source-code" id="run_match-source">
564
564
  <pre><span class="ruby-comment"># File lib/ionian/extension/io.rb, line 118</span>
565
- <span class="ruby-keyword">def</span> <span class="ruby-identifier">run_match</span>(<span class="ruby-operator">**</span><span class="ruby-identifier">kvargs</span>)
565
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">run_match</span>(<span class="ruby-operator">**</span><span class="ruby-identifier">kwargs</span>)
566
566
  <span class="ruby-ivar">@match_listener</span> <span class="ruby-operator">||=</span> <span class="ruby-constant">Thread</span>.<span class="ruby-identifier">new</span> <span class="ruby-keyword">do</span>
567
567
  <span class="ruby-keyword">begin</span>
568
568
  <span class="ruby-keyword">while</span> <span class="ruby-keyword">not</span> <span class="ruby-identifier">closed?</span> <span class="ruby-keyword">do</span>
569
- <span class="ruby-identifier">matches</span> = <span class="ruby-identifier">read_match</span> <span class="ruby-identifier">kvargs</span>
569
+ <span class="ruby-identifier">matches</span> = <span class="ruby-identifier">read_match</span> <span class="ruby-identifier">kwargs</span>
570
570
  <span class="ruby-identifier">matches</span>.<span class="ruby-identifier">each</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">match</span><span class="ruby-operator">|</span>
571
571
  <span class="ruby-ivar">@ionian_listeners</span>.<span class="ruby-identifier">each</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">listener</span><span class="ruby-operator">|</span> <span class="ruby-identifier">listener</span>.<span class="ruby-identifier">call</span> <span class="ruby-identifier">match</span>, <span class="ruby-keyword">self</span>}
572
572
  } <span class="ruby-keyword">if</span> <span class="ruby-identifier">matches</span>
@@ -183,13 +183,15 @@ my_socket.extend <a href="../Socket.html">Ionian::Socket</a></p>
183
183
 
184
184
  <div class="method-description">
185
185
 
186
-
186
+ <p>Initialize the <a href="../../Ionian.html">Ionian</a> <a
187
+ href="Socket.html">Socket</a> variables. This is called automatically if
188
+ extend is called on an object.</p>
187
189
 
188
190
 
189
191
 
190
192
 
191
193
  <div class="method-source-code" id="initialize_ionian_socket-source">
192
- <pre><span class="ruby-comment"># File lib/ionian/extension/socket.rb, line 21</span>
194
+ <pre><span class="ruby-comment"># File lib/ionian/extension/socket.rb, line 23</span>
193
195
  <span class="ruby-keyword">def</span> <span class="ruby-identifier">initialize_ionian_socket</span>
194
196
  <span class="ruby-keyword">end</span></pre>
195
197
  </div>
@@ -222,7 +224,7 @@ false.</p>
222
224
 
223
225
 
224
226
  <div class="method-source-code" id="no_delay-source">
225
- <pre><span class="ruby-comment"># File lib/ionian/extension/socket.rb, line 26</span>
227
+ <pre><span class="ruby-comment"># File lib/ionian/extension/socket.rb, line 28</span>
226
228
  <span class="ruby-keyword">def</span> <span class="ruby-identifier">no_delay</span>
227
229
  <span class="ruby-identifier">nagle_disabled</span> = <span class="ruby-keyword">self</span>.<span class="ruby-identifier">getsockopt</span>(<span class="ruby-operator">::</span><span class="ruby-constant">Socket</span><span class="ruby-operator">::</span><span class="ruby-constant">IPPROTO_TCP</span>, <span class="ruby-operator">::</span><span class="ruby-constant">Socket</span><span class="ruby-operator">::</span><span class="ruby-constant">TCP_NODELAY</span>).<span class="ruby-identifier">data</span>.<span class="ruby-identifier">ord</span>
228
230
  <span class="ruby-identifier">nagle_disabled</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span> <span class="ruby-operator">?</span> <span class="ruby-keyword">true</span> <span class="ruby-operator">:</span> <span class="ruby-keyword">false</span>
@@ -257,7 +259,7 @@ false disables the flag (enables Nagle).</p>
257
259
 
258
260
 
259
261
  <div class="method-source-code" id="no_delay-3D-source">
260
- <pre><span class="ruby-comment"># File lib/ionian/extension/socket.rb, line 33</span>
262
+ <pre><span class="ruby-comment"># File lib/ionian/extension/socket.rb, line 35</span>
261
263
  <span class="ruby-keyword">def</span> <span class="ruby-identifier">no_delay=</span>(<span class="ruby-identifier">value</span>)
262
264
  <span class="ruby-identifier">disable_nagle</span> = <span class="ruby-identifier">value</span> <span class="ruby-operator">?</span> <span class="ruby-value">1</span> <span class="ruby-operator">:</span> <span class="ruby-value">0</span>
263
265
  <span class="ruby-keyword">self</span>.<span class="ruby-identifier">setsockopt</span> <span class="ruby-operator">::</span><span class="ruby-constant">Socket</span><span class="ruby-operator">::</span><span class="ruby-constant">IPPROTO_TCP</span>, <span class="ruby-operator">::</span><span class="ruby-constant">Socket</span><span class="ruby-operator">::</span><span class="ruby-constant">TCP_NODELAY</span>, <span class="ruby-identifier">disable_nagle</span>
@@ -72,6 +72,8 @@
72
72
 
73
73
  <section class="description">
74
74
 
75
+ <p>A collection of mixins.</p>
76
+
75
77
  </section>
76
78
 
77
79
 
@@ -118,6 +118,8 @@
118
118
 
119
119
  <section class="description">
120
120
 
121
+ <p>A convenient wrapper for TCP, UDP, and Unix sockets.</p>
122
+
121
123
  </section>
122
124
 
123
125
 
@@ -143,7 +145,7 @@
143
145
 
144
146
  <div class="method-heading">
145
147
  <span class="method-name">new</span><span
146
- class="method-args">(**kvargs)</span>
148
+ class="method-args">(**kwargs)</span>
147
149
 
148
150
  <span class="method-click-advice">click to toggle source</span>
149
151
 
@@ -152,26 +154,29 @@
152
154
 
153
155
  <div class="method-description">
154
156
 
155
- <p>TODO NOTES</p>
157
+ <p>Args:</p>
156
158
 
157
- <p>Always lazily instiantiate @socket, even when persistent? May not work with
158
- forwarding method calls. Oh! Unless the forwarded methods check for @socket
159
- to exist. Will persistent methods have to check for the socket not to be
160
- closed as well?</p>
159
+ <pre>host: IP or hostname to connect to.
160
+ port: Connection&#39;s port number. Default is 23. Unused by :unix protocol.
161
+ protocol: Type of socket to create. :tcp, :udp, :unix. Default is :tcp.
162
+ persistent: The socket remains open after data is sent if this is true.
163
+ The socket closes after data is sent and a packet is received
164
+ if this is false. Default is true.
165
+ expression: Overrides the #read_match regular expression for received data.</pre>
161
166
 
162
167
 
163
168
 
164
169
 
165
170
  <div class="method-source-code" id="new-source">
166
- <pre><span class="ruby-comment"># File lib/ionian/socket.rb, line 15</span>
167
- <span class="ruby-keyword">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-operator">**</span><span class="ruby-identifier">kvargs</span>)
171
+ <pre><span class="ruby-comment"># File lib/ionian/socket.rb, line 16</span>
172
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-operator">**</span><span class="ruby-identifier">kwargs</span>)
168
173
  <span class="ruby-ivar">@socket</span> = <span class="ruby-keyword">nil</span>
169
174
 
170
- <span class="ruby-ivar">@host</span> = <span class="ruby-identifier">kvargs</span>.<span class="ruby-identifier">fetch</span> <span class="ruby-value">:host</span>
171
- <span class="ruby-ivar">@port</span> = <span class="ruby-identifier">kvargs</span>.<span class="ruby-identifier">fetch</span> <span class="ruby-value">:port</span>, <span class="ruby-value">23</span>
172
- <span class="ruby-ivar">@expression</span> = <span class="ruby-identifier">kvargs</span>.<span class="ruby-identifier">fetch</span> <span class="ruby-value">:expression</span>, <span class="ruby-keyword">nil</span>
173
- <span class="ruby-ivar">@protocol</span> = <span class="ruby-identifier">kvargs</span>.<span class="ruby-identifier">fetch</span> <span class="ruby-value">:protocol</span>, <span class="ruby-value">:tcp</span>
174
- <span class="ruby-ivar">@persistent</span> = <span class="ruby-identifier">kvargs</span>.<span class="ruby-identifier">fetch</span> <span class="ruby-value">:persistent</span>, <span class="ruby-keyword">true</span>
175
+ <span class="ruby-ivar">@host</span> = <span class="ruby-identifier">kwargs</span>.<span class="ruby-identifier">fetch</span> <span class="ruby-value">:host</span>
176
+ <span class="ruby-ivar">@port</span> = <span class="ruby-identifier">kwargs</span>.<span class="ruby-identifier">fetch</span> <span class="ruby-value">:port</span>, <span class="ruby-value">23</span>
177
+ <span class="ruby-ivar">@protocol</span> = <span class="ruby-identifier">kwargs</span>.<span class="ruby-identifier">fetch</span> <span class="ruby-value">:protocol</span>, <span class="ruby-value">:tcp</span>
178
+ <span class="ruby-ivar">@persistent</span> = <span class="ruby-identifier">kwargs</span>.<span class="ruby-identifier">fetch</span> <span class="ruby-value">:persistent</span>, <span class="ruby-keyword">true</span>
179
+ <span class="ruby-ivar">@expression</span> = <span class="ruby-identifier">kwargs</span>.<span class="ruby-identifier">fetch</span> <span class="ruby-value">:expression</span>, <span class="ruby-keyword">nil</span>
175
180
 
176
181
  <span class="ruby-identifier">create_socket</span> <span class="ruby-keyword">if</span> <span class="ruby-ivar">@persistent</span>
177
182
  <span class="ruby-keyword">end</span></pre>
@@ -240,7 +245,7 @@ closed as well?</p>
240
245
 
241
246
 
242
247
  <div class="method-source-code" id="closed-3F-source">
243
- <pre><span class="ruby-comment"># File lib/ionian/socket.rb, line 65</span>
248
+ <pre><span class="ruby-comment"># File lib/ionian/socket.rb, line 73</span>
244
249
  <span class="ruby-keyword">def</span> <span class="ruby-identifier">closed?</span>
245
250
  <span class="ruby-keyword">return</span> <span class="ruby-keyword">true</span> <span class="ruby-keyword">unless</span> <span class="ruby-ivar">@socket</span>
246
251
  <span class="ruby-ivar">@socket</span>.<span class="ruby-identifier">closed?</span>
@@ -259,7 +264,7 @@ closed as well?</p>
259
264
 
260
265
  <div class="method-heading">
261
266
  <span class="method-name">cmd</span><span
262
- class="method-args">(string, **kvargs) { |match| ... }</span>
267
+ class="method-args">(string, **kwargs) { |match| ... }</span>
263
268
 
264
269
  <span class="method-click-advice">click to toggle source</span>
265
270
 
@@ -268,21 +273,27 @@ closed as well?</p>
268
273
 
269
274
  <div class="method-description">
270
275
 
271
- <p>Send a command (data) to the socket. Returns received matches. Block yields
272
- received match. See <a
273
- href="Extension/IO.html#method-i-read_match">Ionian::Extension::IO#read_match</a></p>
276
+ <p>Send a command (data) to the socket. Returns an array of received matches.
277
+ Block yields received match. See <a
278
+ href="Extension/IO.html#method-i-read_match">Ionian::Extension::IO#read_match</a>.</p>
274
279
 
275
280
 
276
281
 
277
282
 
278
283
  <div class="method-source-code" id="cmd-source">
279
- <pre><span class="ruby-comment"># File lib/ionian/socket.rb, line 41</span>
280
- <span class="ruby-keyword">def</span> <span class="ruby-identifier">cmd</span>(<span class="ruby-identifier">string</span>, <span class="ruby-operator">**</span><span class="ruby-identifier">kvargs</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>)
284
+ <pre><span class="ruby-comment"># File lib/ionian/socket.rb, line 43</span>
285
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">cmd</span>(<span class="ruby-identifier">string</span>, <span class="ruby-operator">**</span><span class="ruby-identifier">kwargs</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>)
281
286
  <span class="ruby-identifier">create_socket</span> <span class="ruby-keyword">unless</span> <span class="ruby-ivar">@persistent</span>
282
- <span class="ruby-ivar">@socket</span>.<span class="ruby-identifier">write</span> <span class="ruby-identifier">string</span>
287
+
288
+ <span class="ruby-keyword">if</span> <span class="ruby-ivar">@protocol</span> <span class="ruby-operator">==</span> <span class="ruby-value">:udp</span>
289
+ <span class="ruby-ivar">@socket</span>.<span class="ruby-identifier">send</span> <span class="ruby-identifier">string</span>, <span class="ruby-value">0</span>
290
+ <span class="ruby-keyword">else</span>
291
+ <span class="ruby-ivar">@socket</span>.<span class="ruby-identifier">write</span> <span class="ruby-identifier">string</span>
292
+ <span class="ruby-keyword">end</span>
293
+
283
294
  <span class="ruby-ivar">@socket</span>.<span class="ruby-identifier">flush</span>
284
295
 
285
- <span class="ruby-identifier">matches</span> = <span class="ruby-ivar">@socket</span>.<span class="ruby-identifier">read_match</span>(<span class="ruby-identifier">kvargs</span>) {<span class="ruby-operator">|</span><span class="ruby-identifier">match</span><span class="ruby-operator">|</span> <span class="ruby-keyword">yield</span> <span class="ruby-identifier">match</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">block_given?</span>}
296
+ <span class="ruby-identifier">matches</span> = <span class="ruby-ivar">@socket</span>.<span class="ruby-identifier">read_match</span>(<span class="ruby-identifier">kwargs</span>) {<span class="ruby-operator">|</span><span class="ruby-identifier">match</span><span class="ruby-operator">|</span> <span class="ruby-keyword">yield</span> <span class="ruby-identifier">match</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">block_given?</span>}
286
297
  <span class="ruby-ivar">@socket</span>.<span class="ruby-identifier">close</span> <span class="ruby-keyword">unless</span> <span class="ruby-ivar">@persistent</span>
287
298
 
288
299
  <span class="ruby-identifier">matches</span>
@@ -317,7 +328,7 @@ non-persistent sockets.</p>
317
328
 
318
329
 
319
330
  <div class="method-source-code" id="flush-source">
320
- <pre><span class="ruby-comment"># File lib/ionian/socket.rb, line 72</span>
331
+ <pre><span class="ruby-comment"># File lib/ionian/socket.rb, line 80</span>
321
332
  <span class="ruby-keyword">def</span> <span class="ruby-identifier">flush</span>
322
333
  <span class="ruby-ivar">@socket</span>.<span class="ruby-identifier">flush</span> <span class="ruby-keyword">if</span> <span class="ruby-ivar">@persistent</span>
323
334
  <span class="ruby-keyword">end</span></pre>
@@ -335,7 +346,7 @@ non-persistent sockets.</p>
335
346
 
336
347
  <div class="method-heading">
337
348
  <span class="method-name">has_data?</span><span
338
- class="method-args">(**kvargs)</span>
349
+ class="method-args">(**kwargs)</span>
339
350
 
340
351
  <span class="method-click-advice">click to toggle source</span>
341
352
 
@@ -353,10 +364,10 @@ non-persistent sockets.</p>
353
364
 
354
365
 
355
366
  <div class="method-source-code" id="has_data-3F-source">
356
- <pre><span class="ruby-comment"># File lib/ionian/socket.rb, line 59</span>
357
- <span class="ruby-keyword">def</span> <span class="ruby-identifier">has_data?</span>(<span class="ruby-operator">**</span><span class="ruby-identifier">kvargs</span>)
367
+ <pre><span class="ruby-comment"># File lib/ionian/socket.rb, line 67</span>
368
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">has_data?</span>(<span class="ruby-operator">**</span><span class="ruby-identifier">kwargs</span>)
358
369
  <span class="ruby-keyword">return</span> <span class="ruby-keyword">false</span> <span class="ruby-keyword">unless</span> <span class="ruby-ivar">@socket</span>
359
- <span class="ruby-ivar">@socket</span>.<span class="ruby-identifier">has_data?</span> <span class="ruby-identifier">kvargs</span>
370
+ <span class="ruby-ivar">@socket</span>.<span class="ruby-identifier">has_data?</span> <span class="ruby-identifier">kwargs</span>
360
371
  <span class="ruby-keyword">end</span></pre>
361
372
  </div>
362
373
 
@@ -387,7 +398,7 @@ non-persistent sockets.</p>
387
398
 
388
399
 
389
400
  <div class="method-source-code" id="persistent-3F-source">
390
- <pre><span class="ruby-comment"># File lib/ionian/socket.rb, line 34</span>
401
+ <pre><span class="ruby-comment"># File lib/ionian/socket.rb, line 35</span>
391
402
  <span class="ruby-keyword">def</span> <span class="ruby-identifier">persistent?</span>
392
403
  <span class="ruby-ivar">@persistent</span> <span class="ruby-operator">==</span> <span class="ruby-keyword">false</span> <span class="ruby-operator">||</span> <span class="ruby-ivar">@persistent</span> <span class="ruby-operator">==</span> <span class="ruby-keyword">nil</span> <span class="ruby-operator">?</span> <span class="ruby-keyword">false</span> <span class="ruby-operator">:</span> <span class="ruby-keyword">true</span>
393
404
  <span class="ruby-keyword">end</span></pre>
@@ -421,7 +432,7 @@ non-persistent sockets.</p>
421
432
 
422
433
 
423
434
  <div class="method-source-code" id="protocol-3F-source">
424
- <pre><span class="ruby-comment"># File lib/ionian/socket.rb, line 29</span>
435
+ <pre><span class="ruby-comment"># File lib/ionian/socket.rb, line 30</span>
425
436
  <span class="ruby-keyword">def</span> <span class="ruby-identifier">protocol?</span>
426
437
  <span class="ruby-ivar">@protocol</span>
427
438
  <span class="ruby-keyword">end</span></pre>
@@ -455,7 +466,7 @@ any string not already ending with one.</p>
455
466
 
456
467
 
457
468
  <div class="method-source-code" id="puts-source">
458
- <pre><span class="ruby-comment"># File lib/ionian/socket.rb, line 78</span>
469
+ <pre><span class="ruby-comment"># File lib/ionian/socket.rb, line 86</span>
459
470
  <span class="ruby-keyword">def</span> <span class="ruby-identifier">puts</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">string</span>)
460
471
  <span class="ruby-keyword">self</span>.<span class="ruby-identifier">write</span> <span class="ruby-identifier">string</span>.<span class="ruby-identifier">map</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">s</span><span class="ruby-operator">|</span> <span class="ruby-identifier">s</span>.<span class="ruby-identifier">chomp</span>}.<span class="ruby-identifier">join</span>(<span class="ruby-string">&quot;\n&quot;</span>) <span class="ruby-operator">+</span> <span class="ruby-string">&quot;\n&quot;</span>
461
472
  <span class="ruby-keyword">end</span></pre>
@@ -488,10 +499,17 @@ any string not already ending with one.</p>
488
499
 
489
500
 
490
501
  <div class="method-source-code" id="write-source">
491
- <pre><span class="ruby-comment"># File lib/ionian/socket.rb, line 84</span>
502
+ <pre><span class="ruby-comment"># File lib/ionian/socket.rb, line 92</span>
492
503
  <span class="ruby-keyword">def</span> <span class="ruby-identifier">write</span>(<span class="ruby-identifier">string</span>)
493
504
  <span class="ruby-identifier">create_socket</span> <span class="ruby-keyword">unless</span> <span class="ruby-ivar">@persistent</span>
494
- <span class="ruby-identifier">num_bytes</span> = <span class="ruby-ivar">@socket</span>.<span class="ruby-identifier">write</span> <span class="ruby-identifier">string</span>
505
+
506
+ <span class="ruby-identifier">num_bytes</span> = <span class="ruby-value">0</span>
507
+
508
+ <span class="ruby-keyword">if</span> <span class="ruby-ivar">@protocol</span> <span class="ruby-operator">==</span> <span class="ruby-value">:udp</span>
509
+ <span class="ruby-identifier">num_bytes</span> = <span class="ruby-ivar">@socket</span>.<span class="ruby-identifier">send</span> <span class="ruby-identifier">string</span>, <span class="ruby-value">0</span>
510
+ <span class="ruby-keyword">else</span>
511
+ <span class="ruby-identifier">num_bytes</span> = <span class="ruby-ivar">@socket</span>.<span class="ruby-identifier">write</span> <span class="ruby-identifier">string</span>
512
+ <span class="ruby-keyword">end</span>
495
513
 
496
514
  <span class="ruby-keyword">unless</span> <span class="ruby-ivar">@persistent</span>
497
515
  <span class="ruby-comment"># Read in data to prevent RST packets.</span>
data/doc/created.rid CHANGED
@@ -1,5 +1,5 @@
1
- Sun, 01 Dec 2013 18:46:48 -0800
2
- lib/ionian.rb Sun, 01 Dec 2013 18:46:44 -0800
3
- lib/ionian/extension/io.rb Sun, 01 Dec 2013 18:46:44 -0800
4
- lib/ionian/extension/socket.rb Sun, 01 Dec 2013 18:46:44 -0800
5
- lib/ionian/socket.rb Sun, 01 Dec 2013 18:46:44 -0800
1
+ Tue, 03 Dec 2013 19:30:58 -0800
2
+ lib/ionian.rb Tue, 03 Dec 2013 19:30:50 -0800
3
+ lib/ionian/extension/io.rb Tue, 03 Dec 2013 19:28:00 -0800
4
+ lib/ionian/extension/socket.rb Tue, 03 Dec 2013 19:28:50 -0800
5
+ lib/ionian/socket.rb Tue, 03 Dec 2013 19:29:44 -0800
@@ -1 +1 @@
1
- var search_data = {"index":{"searchIndex":["ionian","extension","io","socket","socket","<<()","closed?()","cmd()","expression()","expression=()","extended()","extended()","flush()","has_data?()","has_data?()","initialize_ionian()","initialize_ionian_socket()","new()","no_delay()","no_delay=()","on_match()","persistent?()","protocol?()","purge()","puts()","read_match()","register_observer()","run_match()","unregister_observer()","write()"],"longSearchIndex":["ionian","ionian::extension","ionian::extension::io","ionian::extension::socket","ionian::socket","ionian::socket#<<()","ionian::socket#closed?()","ionian::socket#cmd()","ionian::extension::io#expression()","ionian::extension::io#expression=()","ionian::extension::io::extended()","ionian::extension::socket::extended()","ionian::socket#flush()","ionian::extension::io#has_data?()","ionian::socket#has_data?()","ionian::extension::io#initialize_ionian()","ionian::extension::socket#initialize_ionian_socket()","ionian::socket::new()","ionian::extension::socket#no_delay()","ionian::extension::socket#no_delay=()","ionian::extension::io#on_match()","ionian::socket#persistent?()","ionian::socket#protocol?()","ionian::extension::io#purge()","ionian::socket#puts()","ionian::extension::io#read_match()","ionian::extension::io#register_observer()","ionian::extension::io#run_match()","ionian::extension::io#unregister_observer()","ionian::socket#write()"],"info":[["Ionian","","Ionian.html","","<p>A library to simplify interaction with IO streams. This includes network\nsockets, file sockets, and serial …\n"],["Ionian::Extension","","Ionian/Extension.html","",""],["Ionian::Extension::IO","","Ionian/Extension/IO.html","","<p>A mixin for IO objects that allows regular expression matching and\nconvenient notification of received …\n"],["Ionian::Extension::Socket","","Ionian/Extension/Socket.html","","<p>A mixin for Socket objects.\n<p>This module was designed to be extended by instantiated objects that\nimplement …\n"],["Ionian::Socket","","Ionian/Socket.html","",""],["<<","Ionian::Socket","Ionian/Socket.html#method-i-3C-3C","(string)",""],["closed?","Ionian::Socket","Ionian/Socket.html#method-i-closed-3F","()","<p>Returns true if the socket is closed.\n"],["cmd","Ionian::Socket","Ionian/Socket.html#method-i-cmd","(string, **kvargs, &block)","<p>Send a command (data) to the socket. Returns received matches. Block yields\nreceived match. See Ionian::Extension::IO#read_match …\n"],["expression","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-expression","()","<p>Returns the regular expression used for #read_match.\n"],["expression=","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-expression-3D","(exp)","<p>Set the expression to match against the read buffer. Can be a regular\nexpression specifying capture groups, …\n"],["extended","Ionian::Extension::IO","Ionian/Extension/IO.html#method-c-extended","(obj)","<p>Called automaticallly when the object is extended with #extend.\n"],["extended","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-c-extended","(obj)","<p>Called automaticallly when the object is extended with #extend.\n"],["flush","Ionian::Socket","Ionian/Socket.html#method-i-flush","()","<p>Flushes buffered data to the operating system. This method has no effect on\nnon-persistent sockets.\n"],["has_data?","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-has_data-3F","(timeout: 0)","<p>Returns true if there is data in the receive buffer. Args:\n\n<pre>Timeout: Number of seconds to wait for data ...</pre>\n"],["has_data?","Ionian::Socket","Ionian/Socket.html#method-i-has_data-3F","(**kvargs)","<p>Returns true if there is data in the receive buffer. Args:\n\n<pre>Timeout: Number of seconds to wait for data ...</pre>\n"],["initialize_ionian","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-initialize_ionian","()","<p>Initialize the Ionian instance variables. This is called automatically if\n#extend is called on an object. …\n"],["initialize_ionian_socket","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-initialize_ionian_socket","()",""],["new","Ionian::Socket","Ionian/Socket.html#method-c-new","(**kvargs)","<p>TODO NOTES\n<p>Always lazily instiantiate @socket, even when persistent? May not work with\nforwarding method …\n"],["no_delay","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-no_delay","()","<p>Returns true if the TCP_NODELAY flag is enabled (Nagle disabled). Otherwise\nfalse.\n"],["no_delay=","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-no_delay-3D","(value)","<p>Setting to true enables the TCP_NODELAY flag (disables Nagle). Setting to\nfalse disables the flag (enables …\n"],["on_match","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-on_match","(&block)",""],["persistent?","Ionian::Socket","Ionian/Socket.html#method-i-persistent-3F","()","<p>Returns true if the socket remains open after writing data.\n"],["protocol?","Ionian::Socket","Ionian/Socket.html#method-i-protocol-3F","()","<p>Returns a symbol of the type of protocol this socket uses: :tcp, :udp,\n:unix\n"],["purge","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-purge","()","<p>Erase the data in the IO and Ionian buffers. This is typically handled\nautomatically.\n"],["puts","Ionian::Socket","Ionian/Socket.html#method-i-puts","(*string)","<p>Writes the given string(s) to the socket and appends a newline character to\nany string not already ending …\n"],["read_match","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-read_match","(**kvargs, &block)","<p>Read matched data from the buffer. This method SHOULD NOT be used if\n#run_match is used.\n<p>Passes matches …\n"],["register_observer","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-register_observer","(&block)","<p>Register a block to be called when #run_match receives matched data. Method\ncallbacks can be registered …\n"],["run_match","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-run_match","(**kvargs)","<p>Start a thread that checks for data and notifies listeners (do |match,\nsocket|). Passes kvargs to #read_match …\n"],["unregister_observer","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-unregister_observer","(&block)","<p>Unregister a block from being called when matched data is received.\n"],["write","Ionian::Socket","Ionian/Socket.html#method-i-write","(string)","<p>Writes the given string to the socket. Returns the number of bytes written.\n"]]}}
1
+ var search_data = {"index":{"searchIndex":["ionian","extension","io","socket","socket","<<()","closed?()","cmd()","expression()","expression=()","extended()","extended()","flush()","has_data?()","has_data?()","initialize_ionian()","initialize_ionian_socket()","new()","no_delay()","no_delay=()","on_match()","persistent?()","protocol?()","purge()","puts()","read_match()","register_observer()","run_match()","unregister_observer()","write()"],"longSearchIndex":["ionian","ionian::extension","ionian::extension::io","ionian::extension::socket","ionian::socket","ionian::socket#<<()","ionian::socket#closed?()","ionian::socket#cmd()","ionian::extension::io#expression()","ionian::extension::io#expression=()","ionian::extension::io::extended()","ionian::extension::socket::extended()","ionian::socket#flush()","ionian::extension::io#has_data?()","ionian::socket#has_data?()","ionian::extension::io#initialize_ionian()","ionian::extension::socket#initialize_ionian_socket()","ionian::socket::new()","ionian::extension::socket#no_delay()","ionian::extension::socket#no_delay=()","ionian::extension::io#on_match()","ionian::socket#persistent?()","ionian::socket#protocol?()","ionian::extension::io#purge()","ionian::socket#puts()","ionian::extension::io#read_match()","ionian::extension::io#register_observer()","ionian::extension::io#run_match()","ionian::extension::io#unregister_observer()","ionian::socket#write()"],"info":[["Ionian","","Ionian.html","","<p>A library to simplify interaction with IO streams. This includes network\nsockets, file sockets, and serial …\n"],["Ionian::Extension","","Ionian/Extension.html","","<p>A collection of mixins.\n"],["Ionian::Extension::IO","","Ionian/Extension/IO.html","","<p>A mixin for IO objects that allows regular expression matching and\nconvenient notification of received …\n"],["Ionian::Extension::Socket","","Ionian/Extension/Socket.html","","<p>A mixin for Socket objects.\n<p>This module was designed to be extended by instantiated objects that\nimplement …\n"],["Ionian::Socket","","Ionian/Socket.html","","<p>A convenient wrapper for TCP, UDP, and Unix sockets.\n"],["<<","Ionian::Socket","Ionian/Socket.html#method-i-3C-3C","(string)",""],["closed?","Ionian::Socket","Ionian/Socket.html#method-i-closed-3F","()","<p>Returns true if the socket is closed.\n"],["cmd","Ionian::Socket","Ionian/Socket.html#method-i-cmd","(string, **kwargs, &block)","<p>Send a command (data) to the socket. Returns an array of received matches.\nBlock yields received match. …\n"],["expression","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-expression","()","<p>Returns the regular expression used for #read_match.\n"],["expression=","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-expression-3D","(exp)","<p>Set the expression to match against the read buffer. Can be a regular\nexpression specifying capture groups, …\n"],["extended","Ionian::Extension::IO","Ionian/Extension/IO.html#method-c-extended","(obj)","<p>Called automaticallly when the object is extended with #extend.\n"],["extended","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-c-extended","(obj)","<p>Called automaticallly when the object is extended with #extend.\n"],["flush","Ionian::Socket","Ionian/Socket.html#method-i-flush","()","<p>Flushes buffered data to the operating system. This method has no effect on\nnon-persistent sockets.\n"],["has_data?","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-has_data-3F","(timeout: 0)","<p>Returns true if there is data in the receive buffer. Args:\n\n<pre>Timeout: Number of seconds to wait for data ...</pre>\n"],["has_data?","Ionian::Socket","Ionian/Socket.html#method-i-has_data-3F","(**kwargs)","<p>Returns true if there is data in the receive buffer. Args:\n\n<pre>Timeout: Number of seconds to wait for data ...</pre>\n"],["initialize_ionian","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-initialize_ionian","()","<p>Initialize the Ionian instance variables. This is called automatically if\n#extend is called on an object. …\n"],["initialize_ionian_socket","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-initialize_ionian_socket","()","<p>Initialize the Ionian Socket variables. This is called automatically if\n#extend is called on an object. …\n"],["new","Ionian::Socket","Ionian/Socket.html#method-c-new","(**kwargs)","<p>Args:\n\n<pre>host: IP or hostname to connect to.\nport: Connection&#39;s port number. Default is 23. Unused by :unix ...</pre>\n"],["no_delay","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-no_delay","()","<p>Returns true if the TCP_NODELAY flag is enabled (Nagle disabled). Otherwise\nfalse.\n"],["no_delay=","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-no_delay-3D","(value)","<p>Setting to true enables the TCP_NODELAY flag (disables Nagle). Setting to\nfalse disables the flag (enables …\n"],["on_match","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-on_match","(&block)",""],["persistent?","Ionian::Socket","Ionian/Socket.html#method-i-persistent-3F","()","<p>Returns true if the socket remains open after writing data.\n"],["protocol?","Ionian::Socket","Ionian/Socket.html#method-i-protocol-3F","()","<p>Returns a symbol of the type of protocol this socket uses: :tcp, :udp,\n:unix\n"],["purge","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-purge","()","<p>Erase the data in the IO and Ionian buffers. This is typically handled\nautomatically.\n"],["puts","Ionian::Socket","Ionian/Socket.html#method-i-puts","(*string)","<p>Writes the given string(s) to the socket and appends a newline character to\nany string not already ending …\n"],["read_match","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-read_match","(**kwargs, &block)","<p>Read matched data from the buffer. This method SHOULD NOT be used if\n#run_match is used.\n<p>Passes matches …\n"],["register_observer","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-register_observer","(&block)","<p>Register a block to be called when #run_match receives matched data. Method\ncallbacks can be registered …\n"],["run_match","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-run_match","(**kwargs)","<p>Start a thread that checks for data and notifies listeners (do |match,\nsocket|). Passes kwargs to #read_match …\n"],["unregister_observer","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-unregister_observer","(&block)","<p>Unregister a block from being called when matched data is received.\n"],["write","Ionian::Socket","Ionian/Socket.html#method-i-write","(string)","<p>Writes the given string to the socket. Returns the number of bytes written.\n"]]}}
@@ -68,16 +68,16 @@ module Ionian
68
68
  # buffer for the next #read_match cycle. This is helpful for protocols
69
69
  # like RS232 that do not have packet boundries.
70
70
  #
71
- # kvargs:
71
+ # kwargs:
72
72
  # timeout: Timeout in seconds IO::select will block.
73
73
  # skip_select: Skip over the IO::select statement. Use if you
74
74
  # are calling IO::select ahead of this method.
75
75
  # build_methods: Build method accessors from named captures.
76
76
  # Enabled by default.
77
- def read_match(**kvargs, &block)
78
- timeout = kvargs.fetch :timeout, @ionian_timeout
79
- skip_select = kvargs.fetch :skip_select, @ionian_skip_select
80
- build_methods = kvargs.fetch :build_methods, @ionian_build_methods
77
+ def read_match(**kwargs, &block)
78
+ timeout = kwargs.fetch :timeout, @ionian_timeout
79
+ skip_select = kwargs.fetch :skip_select, @ionian_skip_select
80
+ build_methods = kwargs.fetch :build_methods, @ionian_build_methods
81
81
 
82
82
  unless skip_select
83
83
  return nil unless ::IO.select [self], nil, nil, timeout
@@ -113,13 +113,13 @@ module Ionian
113
113
  end
114
114
 
115
115
  # Start a thread that checks for data and notifies listeners (do |match, socket|).
116
- # Passes kvargs to #read_match.
116
+ # Passes kwargs to #read_match.
117
117
  # This method SHOULD NOT be used if #read_match is used.
118
- def run_match(**kvargs)
118
+ def run_match(**kwargs)
119
119
  @match_listener ||= Thread.new do
120
120
  begin
121
121
  while not closed? do
122
- matches = read_match kvargs
122
+ matches = read_match kwargs
123
123
  matches.each {|match|
124
124
  @ionian_listeners.each {|listener| listener.call match, self}
125
125
  } if matches
@@ -18,6 +18,8 @@ module Ionian
18
18
  obj.initialize_ionian_socket
19
19
  end
20
20
 
21
+ # Initialize the Ionian Socket variables.
22
+ # This is called automatically if #extend is called on an object.
21
23
  def initialize_ionian_socket
22
24
  end
23
25
 
data/lib/ionian/socket.rb CHANGED
@@ -1,25 +1,26 @@
1
1
  require 'ionian/extension/socket'
2
2
 
3
3
  module Ionian
4
+
5
+ # A convenient wrapper for TCP, UDP, and Unix sockets.
4
6
  class Socket
5
7
 
6
- ############
7
- # TODO NOTES
8
- ############
9
- # Always lazily instiantiate @socket, even when persistent?
10
- # May not work with forwarding method calls.
11
- # Oh! Unless the forwarded methods check for @socket to exist.
12
- # Will persistent methods have to check for the socket not to be
13
- # closed as well?
14
-
15
- def initialize(**kvargs)
8
+ # Args:
9
+ # host: IP or hostname to connect to.
10
+ # port: Connection's port number. Default is 23. Unused by :unix protocol.
11
+ # protocol: Type of socket to create. :tcp, :udp, :unix. Default is :tcp.
12
+ # persistent: The socket remains open after data is sent if this is true.
13
+ # The socket closes after data is sent and a packet is received
14
+ # if this is false. Default is true.
15
+ # expression: Overrides the #read_match regular expression for received data.
16
+ def initialize(**kwargs)
16
17
  @socket = nil
17
18
 
18
- @host = kvargs.fetch :host
19
- @port = kvargs.fetch :port, 23
20
- @expression = kvargs.fetch :expression, nil
21
- @protocol = kvargs.fetch :protocol, :tcp
22
- @persistent = kvargs.fetch :persistent, true
19
+ @host = kwargs.fetch :host
20
+ @port = kwargs.fetch :port, 23
21
+ @protocol = kwargs.fetch :protocol, :tcp
22
+ @persistent = kwargs.fetch :persistent, true
23
+ @expression = kwargs.fetch :expression, nil
23
24
 
24
25
  create_socket if @persistent
25
26
  end
@@ -35,15 +36,22 @@ module Ionian
35
36
  @persistent == false || @persistent == nil ? false : true
36
37
  end
37
38
 
38
- # Send a command (data) to the socket. Returns received matches.
39
+ # Send a command (data) to the socket.
40
+ # Returns an array of received matches.
39
41
  # Block yields received match.
40
- # See Ionian::Extension::IO#read_match
41
- def cmd(string, **kvargs, &block)
42
+ # See Ionian::Extension::IO#read_match.
43
+ def cmd(string, **kwargs, &block)
42
44
  create_socket unless @persistent
43
- @socket.write string
45
+
46
+ if @protocol == :udp
47
+ @socket.send string, 0
48
+ else
49
+ @socket.write string
50
+ end
51
+
44
52
  @socket.flush
45
53
 
46
- matches = @socket.read_match(kvargs) {|match| yield match if block_given?}
54
+ matches = @socket.read_match(kwargs) {|match| yield match if block_given?}
47
55
  @socket.close unless @persistent
48
56
 
49
57
  matches
@@ -56,9 +64,9 @@ module Ionian
56
64
  # Args:
57
65
  # Timeout: Number of seconds to wait for data until
58
66
  # giving up. Set to nil for blocking.
59
- def has_data?(**kvargs)
67
+ def has_data?(**kwargs)
60
68
  return false unless @socket
61
- @socket.has_data? kvargs
69
+ @socket.has_data? kwargs
62
70
  end
63
71
 
64
72
  # Returns true if the socket is closed.
@@ -83,7 +91,14 @@ module Ionian
83
91
  # bytes written.
84
92
  def write(string)
85
93
  create_socket unless @persistent
86
- num_bytes = @socket.write string
94
+
95
+ num_bytes = 0
96
+
97
+ if @protocol == :udp
98
+ num_bytes = @socket.send string, 0
99
+ else
100
+ num_bytes = @socket.write string
101
+ end
87
102
 
88
103
  unless @persistent
89
104
  # Read in data to prevent RST packets.
@@ -101,6 +116,7 @@ module Ionian
101
116
 
102
117
  private
103
118
 
119
+ # Initialize or reinitialize @socket.
104
120
  def create_socket
105
121
  @socket.close if @socket and not @socket.closed?
106
122
 
@@ -109,6 +125,7 @@ module Ionian
109
125
  @socket = ::TCPSocket.new @host, @port
110
126
  when :udp
111
127
  @socket = ::UDPSocket.new
128
+ @socket.bind '', @port
112
129
  @socket.connect @host, @port
113
130
  when :unix
114
131
  @socket = ::UNIXSocket.new @host
data/lib/ionian.rb CHANGED
@@ -7,4 +7,9 @@ require 'ionian/socket'
7
7
  # serial streams like the console and RS232. Features
8
8
  # regular expression matching and notification of
9
9
  # received data.
10
- module Ionian; end
10
+ module Ionian
11
+
12
+ # A collection of mixins.
13
+ module Extension; end
14
+
15
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ionian
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex McLain
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-01 00:00:00.000000000 Z
11
+ date: 2013-12-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: fivemat
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  description: A library to simplify interaction with IO streams. This includes network
70
84
  sockets, file sockets, and serial streams like the console and RS232. Features regular
71
85
  expression matching and notification of received data.
@@ -117,7 +131,6 @@ files:
117
131
  - doc/Ionian.html
118
132
  - doc/fonts.css
119
133
  - doc/Ionian/Extension.html
120
- - doc/Ionian/IO.html
121
134
  - doc/Ionian/Socket.html
122
135
  - doc/Ionian/Extension/IO.html
123
136
  - doc/Ionian/Extension/Socket.html
data/doc/Ionian/IO.html DELETED
@@ -1,598 +0,0 @@
1
- <!DOCTYPE html>
2
-
3
- <html>
4
- <head>
5
- <meta charset="UTF-8">
6
-
7
- <title>module Ionian::IO - RDoc Documentation</title>
8
-
9
- <link href="../fonts.css" rel="stylesheet">
10
- <link href="../rdoc.css" rel="stylesheet">
11
-
12
- <script type="text/javascript">
13
- var rdoc_rel_prefix = "../";
14
- </script>
15
-
16
- <script src="../js/jquery.js"></script>
17
- <script src="../js/navigation.js"></script>
18
- <script src="../js/search_index.js"></script>
19
- <script src="../js/search.js"></script>
20
- <script src="../js/searcher.js"></script>
21
- <script src="../js/darkfish.js"></script>
22
-
23
-
24
- <body id="top" role="document" class="module">
25
- <nav role="navigation">
26
- <div id="project-navigation">
27
- <div id="home-section" role="banner" class="nav-section">
28
- <h2>
29
- <a href="../index.html" rel="home">Home</a>
30
- </h2>
31
-
32
- <h3>
33
- <a href="../table_of_contents.html#pages">Pages</a>
34
- <a href="../table_of_contents.html#classes">Classes</a>
35
- <a href="../table_of_contents.html#methods">Methods</a>
36
- </h3>
37
- </div>
38
-
39
- <div id="search-section" role="search" class="project-section initially-hidden">
40
- <form action="#" method="get" accept-charset="utf-8">
41
- <div id="search-field-wrapper">
42
- <input id="search-field" role="combobox" aria-label="Search"
43
- aria-autocomplete="list" aria-controls="search-results"
44
- type="text" name="search" placeholder="Search"
45
- title="Type to search, Up and Down to navigate, Enter to load">
46
- </div>
47
-
48
- <ul id="search-results" aria-label="Search Results"
49
- aria-busy="false" aria-expanded="false"
50
- aria-atomic="false" aria-live="polite"
51
- aria-relevant="all" class="initially-hidden"></ul>
52
- </form>
53
- </div>
54
-
55
- </div>
56
-
57
-
58
-
59
- <div id="class-metadata">
60
-
61
-
62
-
63
-
64
- <!-- Method Quickref -->
65
- <div id="method-list-section" class="nav-section">
66
- <h3>Methods</h3>
67
-
68
- <ul class="link-list" role="directory">
69
-
70
- <li ><a href="#method-c-extended">::extended</a>
71
-
72
- <li ><a href="#method-i-expression">#expression</a>
73
-
74
- <li ><a href="#method-i-expression-3D">#expression=</a>
75
-
76
- <li ><a href="#method-i-initialize_ionian">#initialize_ionian</a>
77
-
78
- <li ><a href="#method-i-on_match">#on_match</a>
79
-
80
- <li ><a href="#method-i-purge">#purge</a>
81
-
82
- <li ><a href="#method-i-read_match">#read_match</a>
83
-
84
- <li ><a href="#method-i-register_observer">#register_observer</a>
85
-
86
- <li ><a href="#method-i-run_match">#run_match</a>
87
-
88
- <li ><a href="#method-i-unregister_observer">#unregister_observer</a>
89
-
90
- </ul>
91
- </div>
92
-
93
- </div>
94
- </nav>
95
-
96
- <main role="main" aria-labelledby="module-Ionian::IO">
97
- <h1 id="module-Ionian::IO" class="module">
98
- module Ionian::IO
99
- </h1>
100
-
101
- <section class="description">
102
-
103
- <p>A mixin for <a href="IO.html">IO</a> objects that allows regular expression
104
- matching and convenient notification of received data.</p>
105
-
106
- <p>This module was designed to be extended by instantiated objects that
107
- implement the standard library <a href="IO.html">IO</a> class.
108
- my_socket.extend <a href="IO.html">Ionian::IO</a></p>
109
-
110
- </section>
111
-
112
-
113
-
114
-
115
- <section id="5Buntitled-5D" class="documentation-section">
116
-
117
-
118
-
119
-
120
-
121
-
122
-
123
- <section class="attribute-method-details" class="method-section">
124
- <header>
125
- <h3>Attributes</h3>
126
- </header>
127
-
128
-
129
- <div id="attribute-i-ionian_timeout" class="method-detail">
130
- <div class="method-heading attribute-method-heading">
131
- <span class="method-name">ionian_timeout</span><span
132
- class="attribute-access-type">[RW]</span>
133
- </div>
134
-
135
- <div class="method-description">
136
-
137
- <p>Number of seconds to attempt an <a href="IO.html">IO</a> operation before
138
- timing out. See standard library IO::select.</p>
139
-
140
- </div>
141
- </div>
142
-
143
- </section>
144
-
145
-
146
-
147
- <section id="public-class-5Buntitled-5D-method-details" class="method-section">
148
- <header>
149
- <h3>Public Class Methods</h3>
150
- </header>
151
-
152
-
153
- <div id="method-c-extended" class="method-detail ">
154
-
155
- <div class="method-heading">
156
- <span class="method-name">extended</span><span
157
- class="method-args">(obj)</span>
158
-
159
- <span class="method-click-advice">click to toggle source</span>
160
-
161
- </div>
162
-
163
-
164
- <div class="method-description">
165
-
166
- <p>Called automaticallly when the object is extended with extend.</p>
167
-
168
-
169
-
170
-
171
- <div class="method-source-code" id="extended-source">
172
- <pre><span class="ruby-comment"># File lib/ionian/io.rb, line 14</span>
173
- <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">extended</span>(<span class="ruby-identifier">obj</span>)
174
- <span class="ruby-identifier">obj</span>.<span class="ruby-identifier">initialize_ionian</span>
175
- <span class="ruby-keyword">end</span></pre>
176
- </div>
177
-
178
- </div>
179
-
180
-
181
-
182
-
183
- </div>
184
-
185
-
186
- </section>
187
-
188
- <section id="public-instance-5Buntitled-5D-method-details" class="method-section">
189
- <header>
190
- <h3>Public Instance Methods</h3>
191
- </header>
192
-
193
-
194
- <div id="method-i-expression" class="method-detail ">
195
-
196
- <div class="method-heading">
197
- <span class="method-name">expression</span><span
198
- class="method-args">()</span>
199
-
200
- <span class="method-click-advice">click to toggle source</span>
201
-
202
- </div>
203
-
204
-
205
- <div class="method-description">
206
-
207
- <p>Returns the regular expression used for <a
208
- href="IO.html#method-i-read_match">read_match</a>.</p>
209
-
210
-
211
-
212
-
213
- <div class="method-source-code" id="expression-source">
214
- <pre><span class="ruby-comment"># File lib/ionian/io.rb, line 30</span>
215
- <span class="ruby-keyword">def</span> <span class="ruby-identifier">expression</span>
216
- <span class="ruby-ivar">@ionian_expression</span>
217
- <span class="ruby-keyword">end</span></pre>
218
- </div>
219
-
220
- </div>
221
-
222
-
223
-
224
-
225
- </div>
226
-
227
-
228
- <div id="method-i-expression-3D" class="method-detail ">
229
-
230
- <div class="method-heading">
231
- <span class="method-name">expression=</span><span
232
- class="method-args">(exp)</span>
233
-
234
- <span class="method-click-advice">click to toggle source</span>
235
-
236
- </div>
237
-
238
-
239
- <div class="method-description">
240
-
241
- <p>Set the expression to match against the read buffer. Can be a regular
242
- expression specifying capture groups, or a string specifying the separator
243
- or line terminator sequence. It is possible to use named captures in a
244
- regex, which allows for convienient accessors like <a
245
- href=":parameter">match</a>.</p>
246
-
247
-
248
-
249
-
250
- <div class="method-source-code" id="expression-3D-source">
251
- <pre><span class="ruby-comment"># File lib/ionian/io.rb, line 40</span>
252
- <span class="ruby-keyword">def</span> <span class="ruby-identifier">expression=</span>(<span class="ruby-identifier">exp</span>)
253
- <span class="ruby-ivar">@ionian_expression</span> = <span class="ruby-identifier">exp</span>
254
- <span class="ruby-ivar">@ionian_expression</span> = <span class="ruby-constant">Regexp</span>.<span class="ruby-identifier">new</span> <span class="ruby-node">&quot;(.*?)#{expression}&quot;</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">exp</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">String</span>
255
- <span class="ruby-keyword">end</span></pre>
256
- </div>
257
-
258
- </div>
259
-
260
-
261
-
262
-
263
- </div>
264
-
265
-
266
- <div id="method-i-initialize_ionian" class="method-detail ">
267
-
268
- <div class="method-heading">
269
- <span class="method-name">initialize_ionian</span><span
270
- class="method-args">()</span>
271
-
272
- <span class="method-click-advice">click to toggle source</span>
273
-
274
- </div>
275
-
276
-
277
- <div class="method-description">
278
-
279
- <p>Initialize the <a href="../Ionian.html">Ionian</a> instance variables. This
280
- is called automatically if extend is called on an object.</p>
281
-
282
-
283
-
284
-
285
- <div class="method-source-code" id="initialize_ionian-source">
286
- <pre><span class="ruby-comment"># File lib/ionian/io.rb, line 20</span>
287
- <span class="ruby-keyword">def</span> <span class="ruby-identifier">initialize_ionian</span>
288
- <span class="ruby-ivar">@ionian_listeners</span> = []
289
- <span class="ruby-ivar">@ionian_buf</span> = <span class="ruby-string">&#39;&#39;</span>
290
- <span class="ruby-ivar">@ionian_expression</span> = <span class="ruby-regexp">/(.*?)\n/</span>
291
- <span class="ruby-ivar">@ionian_timeout</span> = <span class="ruby-keyword">nil</span>
292
- <span class="ruby-ivar">@ionian_skip_select</span> = <span class="ruby-keyword">false</span>
293
- <span class="ruby-ivar">@ionian_build_methods</span> = <span class="ruby-keyword">true</span>
294
- <span class="ruby-keyword">end</span></pre>
295
- </div>
296
-
297
- </div>
298
-
299
-
300
-
301
-
302
- </div>
303
-
304
-
305
- <div id="method-i-on_match" class="method-detail method-alias">
306
-
307
- <div class="method-heading">
308
- <span class="method-name">on_match</span><span
309
- class="method-args">(&block)</span>
310
-
311
- </div>
312
-
313
-
314
- <div class="method-description">
315
-
316
-
317
-
318
-
319
-
320
-
321
- </div>
322
-
323
-
324
-
325
-
326
- <div class="aliases">
327
- Alias for: <a href="IO.html#method-i-register_observer">register_observer</a>
328
- </div>
329
-
330
- </div>
331
-
332
-
333
- <div id="method-i-purge" class="method-detail ">
334
-
335
- <div class="method-heading">
336
- <span class="method-name">purge</span><span
337
- class="method-args">()</span>
338
-
339
- <span class="method-click-advice">click to toggle source</span>
340
-
341
- </div>
342
-
343
-
344
- <div class="method-description">
345
-
346
- <p>Erase the data in the <a href="IO.html">IO</a> and <a
347
- href="../Ionian.html">Ionian</a> buffers. This is typically handled
348
- automatically.</p>
349
-
350
-
351
-
352
-
353
- <div class="method-source-code" id="purge-source">
354
- <pre><span class="ruby-comment"># File lib/ionian/io.rb, line 128</span>
355
- <span class="ruby-keyword">def</span> <span class="ruby-identifier">purge</span>
356
- <span class="ruby-comment"># Erase IO buffer.</span>
357
- <span class="ruby-keyword">while</span> <span class="ruby-operator">::</span><span class="ruby-constant">IO</span>.<span class="ruby-identifier">select</span> [<span class="ruby-keyword">self</span>], <span class="ruby-keyword">nil</span>, <span class="ruby-keyword">nil</span>, <span class="ruby-value">0</span>
358
- <span class="ruby-identifier">readpartial</span>(<span class="ruby-value">0xFFFF</span>)
359
- <span class="ruby-keyword">end</span>
360
-
361
- <span class="ruby-ivar">@ionian_buf</span> = <span class="ruby-string">&#39;&#39;</span>
362
- <span class="ruby-keyword">end</span></pre>
363
- </div>
364
-
365
- </div>
366
-
367
-
368
-
369
-
370
- </div>
371
-
372
-
373
- <div id="method-i-read_match" class="method-detail ">
374
-
375
- <div class="method-heading">
376
- <span class="method-name">read_match</span><span
377
- class="method-args">(**kvargs) { |$~| ... }</span>
378
-
379
- <span class="method-click-advice">click to toggle source</span>
380
-
381
- </div>
382
-
383
-
384
- <div class="method-description">
385
-
386
- <p>Read matched data from the buffer. This method SHOULD NOT be used if <a
387
- href="IO.html#method-i-run_match">run_match</a> is used.</p>
388
-
389
- <p>Passes matches to the block (do |match|). If there are multiple matches,
390
- the block is called multiple times.</p>
391
-
392
- <p>Returns an array of matches. Returns nil if no data was received within the
393
- timeout period.</p>
394
-
395
- <p>Junk data that could exist before a match in the buffer can be accessed
396
- with match.pre_match.</p>
397
-
398
- <p>Data at the end of the buffer that is not matched can be accessed in the
399
- last match with match.post_match. This data remains in the buffer for the
400
- next <a href="IO.html#method-i-read_match">read_match</a> cycle. This is
401
- helpful for protocols like RS232 that do not have packet boundries.</p>
402
-
403
- <p>kvargs:</p>
404
-
405
- <pre>timeout: Timeout in seconds IO::select will block.
406
- skip_select: Skip over the IO::select statement. Use if you
407
- are calling IO::select ahead of this method.
408
- build_methods: Build method accessors from named captures.
409
- Enabled by default.</pre>
410
-
411
-
412
-
413
-
414
- <div class="method-source-code" id="read_match-source">
415
- <pre><span class="ruby-comment"># File lib/ionian/io.rb, line 68</span>
416
- <span class="ruby-keyword">def</span> <span class="ruby-identifier">read_match</span>(<span class="ruby-operator">**</span><span class="ruby-identifier">kvargs</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>)
417
- <span class="ruby-identifier">timeout</span> = <span class="ruby-identifier">kvargs</span>.<span class="ruby-identifier">fetch</span> <span class="ruby-value">:timeout</span>, <span class="ruby-ivar">@ionian_timeout</span>
418
- <span class="ruby-identifier">skip_select</span> = <span class="ruby-identifier">kvargs</span>.<span class="ruby-identifier">fetch</span> <span class="ruby-value">:skip_select</span>, <span class="ruby-ivar">@ionian_skip_select</span>
419
- <span class="ruby-identifier">build_methods</span> = <span class="ruby-identifier">kvargs</span>.<span class="ruby-identifier">fetch</span> <span class="ruby-value">:build_methods</span>, <span class="ruby-ivar">@ionian_build_methods</span>
420
-
421
- <span class="ruby-keyword">unless</span> <span class="ruby-identifier">skip_select</span>
422
- <span class="ruby-keyword">return</span> <span class="ruby-keyword">nil</span> <span class="ruby-keyword">unless</span> <span class="ruby-operator">::</span><span class="ruby-constant">IO</span>.<span class="ruby-identifier">select</span> [<span class="ruby-keyword">self</span>], <span class="ruby-keyword">nil</span>, <span class="ruby-keyword">nil</span>, <span class="ruby-identifier">timeout</span>
423
- <span class="ruby-keyword">end</span>
424
-
425
- <span class="ruby-comment"># Read data from the IO buffer until it&#39;s empty.</span>
426
- <span class="ruby-identifier">loop</span> <span class="ruby-keyword">do</span>
427
- <span class="ruby-ivar">@ionian_buf</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">readpartial</span>(<span class="ruby-value">0xFFFF</span>)
428
- <span class="ruby-keyword">break</span> <span class="ruby-keyword">unless</span> <span class="ruby-operator">::</span><span class="ruby-constant">IO</span>.<span class="ruby-identifier">select</span> [<span class="ruby-keyword">self</span>], <span class="ruby-keyword">nil</span>, <span class="ruby-keyword">nil</span>, <span class="ruby-value">0</span>
429
- <span class="ruby-keyword">end</span>
430
-
431
- <span class="ruby-ivar">@matches</span> = []
432
-
433
- <span class="ruby-keyword">while</span> <span class="ruby-ivar">@ionian_buf</span> <span class="ruby-operator">=~</span> <span class="ruby-ivar">@ionian_expression</span>
434
- <span class="ruby-ivar">@matches</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">$~</span> <span class="ruby-comment"># Match data.</span>
435
- <span class="ruby-keyword">yield</span> <span class="ruby-identifier">$~</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">block_given?</span>
436
- <span class="ruby-ivar">@ionian_buf</span> = <span class="ruby-node">$&#39;</span> <span class="ruby-comment"># Leave post match data in the buffer.</span>
437
- <span class="ruby-keyword">end</span>
438
-
439
- <span class="ruby-comment"># Convert named captures to methods.</span>
440
- <span class="ruby-keyword">if</span> <span class="ruby-identifier">build_methods</span>
441
- <span class="ruby-ivar">@matches</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">match</span><span class="ruby-operator">|</span>
442
- <span class="ruby-identifier">match</span>.<span class="ruby-identifier">names</span>
443
- .<span class="ruby-identifier">map</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">name</span><span class="ruby-operator">|</span> <span class="ruby-identifier">name</span>.<span class="ruby-identifier">to_sym</span>}
444
- .<span class="ruby-identifier">each</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">symbol</span><span class="ruby-operator">|</span> <span class="ruby-identifier">match</span>.<span class="ruby-identifier">singleton_class</span>
445
- .<span class="ruby-identifier">send</span>(<span class="ruby-value">:define_method</span>, <span class="ruby-identifier">symbol</span>) { <span class="ruby-identifier">match</span>[<span class="ruby-identifier">symbol</span>] } <span class="ruby-keyword">unless</span> <span class="ruby-identifier">match</span>.<span class="ruby-identifier">respond_to?</span> <span class="ruby-identifier">symbol</span>
446
- }
447
- <span class="ruby-keyword">end</span>
448
- <span class="ruby-keyword">end</span>
449
-
450
- <span class="ruby-ivar">@matches</span>
451
- <span class="ruby-keyword">end</span></pre>
452
- </div>
453
-
454
- </div>
455
-
456
-
457
-
458
-
459
- </div>
460
-
461
-
462
- <div id="method-i-register_observer" class="method-detail ">
463
-
464
- <div class="method-heading">
465
- <span class="method-name">register_observer</span><span
466
- class="method-args">(&block)</span>
467
-
468
- <span class="method-click-advice">click to toggle source</span>
469
-
470
- </div>
471
-
472
-
473
- <div class="method-description">
474
-
475
- <p>Register a block to be called when <a
476
- href="IO.html#method-i-run_match">run_match</a> receives matched data.
477
- Method callbacks can be registered with &amp;object.method(:method).
478
- Returns a reference to the given block. block =
479
- ionian_socket.register_observer {…}</p>
480
-
481
-
482
-
483
-
484
- <div class="method-source-code" id="register_observer-source">
485
- <pre><span class="ruby-comment"># File lib/ionian/io.rb, line 141</span>
486
- <span class="ruby-keyword">def</span> <span class="ruby-identifier">register_observer</span>(<span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>)
487
- <span class="ruby-ivar">@ionian_listeners</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">block</span> <span class="ruby-keyword">unless</span> <span class="ruby-ivar">@ionian_listeners</span>.<span class="ruby-identifier">include?</span> <span class="ruby-identifier">block</span>
488
- <span class="ruby-identifier">block</span>
489
- <span class="ruby-keyword">end</span></pre>
490
- </div>
491
-
492
- </div>
493
-
494
-
495
- <div class="aliases">
496
- Also aliased as: <a href="IO.html#method-i-on_match">on_match</a>
497
- </div>
498
-
499
-
500
-
501
- </div>
502
-
503
-
504
- <div id="method-i-run_match" class="method-detail ">
505
-
506
- <div class="method-heading">
507
- <span class="method-name">run_match</span><span
508
- class="method-args">(**kvargs)</span>
509
-
510
- <span class="method-click-advice">click to toggle source</span>
511
-
512
- </div>
513
-
514
-
515
- <div class="method-description">
516
-
517
- <p>Start a thread that checks for data and notifies listeners (do |match,
518
- socket|). Passes kvargs to <a
519
- href="IO.html#method-i-read_match">read_match</a>. This method SHOULD NOT
520
- be used if <a href="IO.html#method-i-read_match">read_match</a> is used.</p>
521
-
522
-
523
-
524
-
525
- <div class="method-source-code" id="run_match-source">
526
- <pre><span class="ruby-comment"># File lib/ionian/io.rb, line 109</span>
527
- <span class="ruby-keyword">def</span> <span class="ruby-identifier">run_match</span>(<span class="ruby-operator">**</span><span class="ruby-identifier">kvargs</span>)
528
- <span class="ruby-ivar">@match_listener</span> <span class="ruby-operator">||=</span> <span class="ruby-constant">Thread</span>.<span class="ruby-identifier">new</span> <span class="ruby-keyword">do</span>
529
- <span class="ruby-keyword">begin</span>
530
- <span class="ruby-keyword">while</span> <span class="ruby-keyword">not</span> <span class="ruby-identifier">closed?</span> <span class="ruby-keyword">do</span>
531
- <span class="ruby-identifier">matches</span> = <span class="ruby-identifier">read_match</span> <span class="ruby-identifier">kvargs</span>
532
- <span class="ruby-identifier">matches</span>.<span class="ruby-identifier">each</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">match</span><span class="ruby-operator">|</span>
533
- <span class="ruby-ivar">@ionian_listeners</span>.<span class="ruby-identifier">each</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">listener</span><span class="ruby-operator">|</span> <span class="ruby-identifier">listener</span>.<span class="ruby-identifier">call</span> <span class="ruby-identifier">match</span>, <span class="ruby-keyword">self</span>}
534
- } <span class="ruby-keyword">if</span> <span class="ruby-identifier">matches</span>
535
- <span class="ruby-keyword">end</span>
536
- <span class="ruby-keyword">rescue</span> <span class="ruby-constant">EOFError</span>
537
- <span class="ruby-keyword">rescue</span> <span class="ruby-constant">IOError</span>
538
- <span class="ruby-keyword">end</span>
539
-
540
- <span class="ruby-ivar">@match_listener</span> = <span class="ruby-keyword">nil</span>
541
- <span class="ruby-keyword">end</span>
542
- <span class="ruby-keyword">end</span></pre>
543
- </div>
544
-
545
- </div>
546
-
547
-
548
-
549
-
550
- </div>
551
-
552
-
553
- <div id="method-i-unregister_observer" class="method-detail ">
554
-
555
- <div class="method-heading">
556
- <span class="method-name">unregister_observer</span><span
557
- class="method-args">(&block)</span>
558
-
559
- <span class="method-click-advice">click to toggle source</span>
560
-
561
- </div>
562
-
563
-
564
- <div class="method-description">
565
-
566
- <p>Unregister a block from being called when matched data is received.</p>
567
-
568
-
569
-
570
-
571
- <div class="method-source-code" id="unregister_observer-source">
572
- <pre><span class="ruby-comment"># File lib/ionian/io.rb, line 149</span>
573
- <span class="ruby-keyword">def</span> <span class="ruby-identifier">unregister_observer</span>(<span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>)
574
- <span class="ruby-ivar">@ionian_listeners</span>.<span class="ruby-identifier">delete_if</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">o</span><span class="ruby-operator">|</span> <span class="ruby-identifier">o</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">block</span>}
575
- <span class="ruby-identifier">block</span>
576
- <span class="ruby-keyword">end</span></pre>
577
- </div>
578
-
579
- </div>
580
-
581
-
582
-
583
-
584
- </div>
585
-
586
-
587
- </section>
588
-
589
- </section>
590
- </main>
591
-
592
-
593
- <footer id="validator-badges" role="contentinfo">
594
- <p><a href="http://validator.w3.org/check/referer">Validate</a>
595
- <p>Generated by <a href="http://rdoc.rubyforge.org">RDoc</a> 4.1.0.preview.1.
596
- <p>Based on <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish</a> by <a href="http://deveiate.org">Michael Granger</a>.
597
- </footer>
598
-