ionian 0.2.0 → 0.3.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 56bba77a98b933d714a09236d6d1caf7a19826e5
4
- data.tar.gz: b480aa6ceb1ff16602dcdf214cc9ca42c67f0509
3
+ metadata.gz: 6bcea8e76124f692dbb73310c5eb10545318c838
4
+ data.tar.gz: 85c23350aa38dcce18ccbb9df3ac7fd32e1d6f05
5
5
  SHA512:
6
- metadata.gz: 1ecbcd365657210fcbafbb95834320556905f2065a730baa2c0655c5a7e90f08ce0dc5c3538b94aaafb2940c92c3ba74f72ac8c2b1192fa1268b52d3cd8ce4bd
7
- data.tar.gz: bbc718243843149e4fe45b49389ebc99c9209c5b48c0c8509b634b28a0354121104027523a263fb4e57704be2d8f1196e02c5a37c707289e1d6e7206d9aaad25
6
+ metadata.gz: f1c181e45023688d2b978c396a488e1614dbecc7d5b4b7e790cfed11db794d2df1de267510a20c3fbc83922853f166c20823bdf7a6260bb5a58060d23929f1c7
7
+ data.tar.gz: 90d906bd4f2ca67bde0f4bb1dea8bdcc305ef9a6d85af1eea56bc3a5c58ff96bf87ed56e336214601facdd4b9195d057fb35b09c95a51ef59b36920e4298f3c7
@@ -0,0 +1,636 @@
1
+ <!DOCTYPE html>
2
+
3
+ <html>
4
+ <head>
5
+ <meta charset="UTF-8">
6
+
7
+ <title>module Ionian::Extension::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-has_data-3F">#has_data?</a>
77
+
78
+ <li ><a href="#method-i-initialize_ionian">#initialize_ionian</a>
79
+
80
+ <li ><a href="#method-i-on_match">#on_match</a>
81
+
82
+ <li ><a href="#method-i-purge">#purge</a>
83
+
84
+ <li ><a href="#method-i-read_match">#read_match</a>
85
+
86
+ <li ><a href="#method-i-register_observer">#register_observer</a>
87
+
88
+ <li ><a href="#method-i-run_match">#run_match</a>
89
+
90
+ <li ><a href="#method-i-unregister_observer">#unregister_observer</a>
91
+
92
+ </ul>
93
+ </div>
94
+
95
+ </div>
96
+ </nav>
97
+
98
+ <main role="main" aria-labelledby="module-Ionian::Extension::IO">
99
+ <h1 id="module-Ionian::Extension::IO" class="module">
100
+ module Ionian::Extension::IO
101
+ </h1>
102
+
103
+ <section class="description">
104
+
105
+ <p>A mixin for <a href="IO.html">IO</a> objects that allows regular expression
106
+ matching and convenient notification of received data.</p>
107
+
108
+ <p>This module was designed to be extended by instantiated objects that
109
+ implement the standard library <a href="IO.html">IO</a> class.
110
+ my_socket.extend Ionian::IO</p>
111
+
112
+ </section>
113
+
114
+
115
+
116
+
117
+ <section id="5Buntitled-5D" class="documentation-section">
118
+
119
+
120
+
121
+
122
+
123
+
124
+
125
+ <section class="attribute-method-details" class="method-section">
126
+ <header>
127
+ <h3>Attributes</h3>
128
+ </header>
129
+
130
+
131
+ <div id="attribute-i-ionian_timeout" class="method-detail">
132
+ <div class="method-heading attribute-method-heading">
133
+ <span class="method-name">ionian_timeout</span><span
134
+ class="attribute-access-type">[RW]</span>
135
+ </div>
136
+
137
+ <div class="method-description">
138
+
139
+ <p>Number of seconds to attempt an <a href="IO.html">IO</a> operation before
140
+ timing out. See standard library IO::select.</p>
141
+
142
+ </div>
143
+ </div>
144
+
145
+ </section>
146
+
147
+
148
+
149
+ <section id="public-class-5Buntitled-5D-method-details" class="method-section">
150
+ <header>
151
+ <h3>Public Class Methods</h3>
152
+ </header>
153
+
154
+
155
+ <div id="method-c-extended" class="method-detail ">
156
+
157
+ <div class="method-heading">
158
+ <span class="method-name">extended</span><span
159
+ class="method-args">(obj)</span>
160
+
161
+ <span class="method-click-advice">click to toggle source</span>
162
+
163
+ </div>
164
+
165
+
166
+ <div class="method-description">
167
+
168
+ <p>Called automaticallly when the object is extended with extend.</p>
169
+
170
+
171
+
172
+
173
+ <div class="method-source-code" id="extended-source">
174
+ <pre><span class="ruby-comment"># File lib/ionian/extension/io.rb, line 15</span>
175
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">extended</span>(<span class="ruby-identifier">obj</span>)
176
+ <span class="ruby-identifier">obj</span>.<span class="ruby-identifier">initialize_ionian</span>
177
+ <span class="ruby-keyword">end</span></pre>
178
+ </div>
179
+
180
+ </div>
181
+
182
+
183
+
184
+
185
+ </div>
186
+
187
+
188
+ </section>
189
+
190
+ <section id="public-instance-5Buntitled-5D-method-details" class="method-section">
191
+ <header>
192
+ <h3>Public Instance Methods</h3>
193
+ </header>
194
+
195
+
196
+ <div id="method-i-expression" class="method-detail ">
197
+
198
+ <div class="method-heading">
199
+ <span class="method-name">expression</span><span
200
+ class="method-args">()</span>
201
+
202
+ <span class="method-click-advice">click to toggle source</span>
203
+
204
+ </div>
205
+
206
+
207
+ <div class="method-description">
208
+
209
+ <p>Returns the regular expression used for <a
210
+ href="IO.html#method-i-read_match">read_match</a>.</p>
211
+
212
+
213
+
214
+
215
+ <div class="method-source-code" id="expression-source">
216
+ <pre><span class="ruby-comment"># File lib/ionian/extension/io.rb, line 39</span>
217
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">expression</span>
218
+ <span class="ruby-ivar">@ionian_expression</span>
219
+ <span class="ruby-keyword">end</span></pre>
220
+ </div>
221
+
222
+ </div>
223
+
224
+
225
+
226
+
227
+ </div>
228
+
229
+
230
+ <div id="method-i-expression-3D" class="method-detail ">
231
+
232
+ <div class="method-heading">
233
+ <span class="method-name">expression=</span><span
234
+ class="method-args">(exp)</span>
235
+
236
+ <span class="method-click-advice">click to toggle source</span>
237
+
238
+ </div>
239
+
240
+
241
+ <div class="method-description">
242
+
243
+ <p>Set the expression to match against the read buffer. Can be a regular
244
+ expression specifying capture groups, or a string specifying the separator
245
+ or line terminator sequence. It is possible to use named captures in a
246
+ regex, which allows for convienient accessors like <a
247
+ href=":parameter">match</a>.</p>
248
+
249
+
250
+
251
+
252
+ <div class="method-source-code" id="expression-3D-source">
253
+ <pre><span class="ruby-comment"># File lib/ionian/extension/io.rb, line 49</span>
254
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">expression=</span>(<span class="ruby-identifier">exp</span>)
255
+ <span class="ruby-ivar">@ionian_expression</span> = <span class="ruby-identifier">exp</span>
256
+ <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>
257
+ <span class="ruby-keyword">end</span></pre>
258
+ </div>
259
+
260
+ </div>
261
+
262
+
263
+
264
+
265
+ </div>
266
+
267
+
268
+ <div id="method-i-has_data-3F" class="method-detail ">
269
+
270
+ <div class="method-heading">
271
+ <span class="method-name">has_data?</span><span
272
+ class="method-args">(timeout: 0)</span>
273
+
274
+ <span class="method-click-advice">click to toggle source</span>
275
+
276
+ </div>
277
+
278
+
279
+ <div class="method-description">
280
+
281
+ <p>Returns true if there is data in the receive buffer. Args:</p>
282
+
283
+ <pre>Timeout: Number of seconds to wait for data until
284
+ giving up. Set to nil for blocking.</pre>
285
+
286
+
287
+
288
+
289
+ <div class="method-source-code" id="has_data-3F-source">
290
+ <pre><span class="ruby-comment"># File lib/ionian/extension/io.rb, line 34</span>
291
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">has_data?</span>(<span class="ruby-identifier">timeout</span><span class="ruby-operator">:</span> <span class="ruby-value">0</span>)
292
+ <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>) <span class="ruby-operator">?</span> <span class="ruby-keyword">true</span> <span class="ruby-operator">:</span> <span class="ruby-keyword">false</span>
293
+ <span class="ruby-keyword">end</span></pre>
294
+ </div>
295
+
296
+ </div>
297
+
298
+
299
+
300
+
301
+ </div>
302
+
303
+
304
+ <div id="method-i-initialize_ionian" class="method-detail ">
305
+
306
+ <div class="method-heading">
307
+ <span class="method-name">initialize_ionian</span><span
308
+ class="method-args">()</span>
309
+
310
+ <span class="method-click-advice">click to toggle source</span>
311
+
312
+ </div>
313
+
314
+
315
+ <div class="method-description">
316
+
317
+ <p>Initialize the <a href="../../Ionian.html">Ionian</a> instance variables.
318
+ This is called automatically if extend is called on an object.</p>
319
+
320
+
321
+
322
+
323
+ <div class="method-source-code" id="initialize_ionian-source">
324
+ <pre><span class="ruby-comment"># File lib/ionian/extension/io.rb, line 21</span>
325
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">initialize_ionian</span>
326
+ <span class="ruby-ivar">@ionian_listeners</span> = []
327
+ <span class="ruby-ivar">@ionian_buf</span> = <span class="ruby-string">&#39;&#39;</span>
328
+ <span class="ruby-ivar">@ionian_expression</span> = <span class="ruby-regexp">/(.*?)\n/</span>
329
+ <span class="ruby-ivar">@ionian_timeout</span> = <span class="ruby-keyword">nil</span>
330
+ <span class="ruby-ivar">@ionian_skip_select</span> = <span class="ruby-keyword">false</span>
331
+ <span class="ruby-ivar">@ionian_build_methods</span> = <span class="ruby-keyword">true</span>
332
+ <span class="ruby-keyword">end</span></pre>
333
+ </div>
334
+
335
+ </div>
336
+
337
+
338
+
339
+
340
+ </div>
341
+
342
+
343
+ <div id="method-i-on_match" class="method-detail method-alias">
344
+
345
+ <div class="method-heading">
346
+ <span class="method-name">on_match</span><span
347
+ class="method-args">(&block)</span>
348
+
349
+ </div>
350
+
351
+
352
+ <div class="method-description">
353
+
354
+
355
+
356
+
357
+
358
+
359
+ </div>
360
+
361
+
362
+
363
+
364
+ <div class="aliases">
365
+ Alias for: <a href="IO.html#method-i-register_observer">register_observer</a>
366
+ </div>
367
+
368
+ </div>
369
+
370
+
371
+ <div id="method-i-purge" class="method-detail ">
372
+
373
+ <div class="method-heading">
374
+ <span class="method-name">purge</span><span
375
+ class="method-args">()</span>
376
+
377
+ <span class="method-click-advice">click to toggle source</span>
378
+
379
+ </div>
380
+
381
+
382
+ <div class="method-description">
383
+
384
+ <p>Erase the data in the <a href="IO.html">IO</a> and <a
385
+ href="../../Ionian.html">Ionian</a> buffers. This is typically handled
386
+ automatically.</p>
387
+
388
+
389
+
390
+
391
+ <div class="method-source-code" id="purge-source">
392
+ <pre><span class="ruby-comment"># File lib/ionian/extension/io.rb, line 137</span>
393
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">purge</span>
394
+ <span class="ruby-comment"># Erase IO buffer.</span>
395
+ <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>
396
+ <span class="ruby-identifier">readpartial</span>(<span class="ruby-value">0xFFFF</span>)
397
+ <span class="ruby-keyword">end</span>
398
+
399
+ <span class="ruby-ivar">@ionian_buf</span> = <span class="ruby-string">&#39;&#39;</span>
400
+ <span class="ruby-keyword">end</span></pre>
401
+ </div>
402
+
403
+ </div>
404
+
405
+
406
+
407
+
408
+ </div>
409
+
410
+
411
+ <div id="method-i-read_match" class="method-detail ">
412
+
413
+ <div class="method-heading">
414
+ <span class="method-name">read_match</span><span
415
+ class="method-args">(**kvargs) { |$~| ... }</span>
416
+
417
+ <span class="method-click-advice">click to toggle source</span>
418
+
419
+ </div>
420
+
421
+
422
+ <div class="method-description">
423
+
424
+ <p>Read matched data from the buffer. This method SHOULD NOT be used if <a
425
+ href="IO.html#method-i-run_match">run_match</a> is used.</p>
426
+
427
+ <p>Passes matches to the block (do |match|). If there are multiple matches,
428
+ the block is called multiple times.</p>
429
+
430
+ <p>Returns an array of matches. Returns nil if no data was received within the
431
+ timeout period.</p>
432
+
433
+ <p>Junk data that could exist before a match in the buffer can be accessed
434
+ with match.pre_match.</p>
435
+
436
+ <p>Data at the end of the buffer that is not matched can be accessed in the
437
+ last match with match.post_match. This data remains in the buffer for the
438
+ next <a href="IO.html#method-i-read_match">read_match</a> cycle. This is
439
+ helpful for protocols like RS232 that do not have packet boundries.</p>
440
+
441
+ <p>kvargs:</p>
442
+
443
+ <pre>timeout: Timeout in seconds IO::select will block.
444
+ skip_select: Skip over the IO::select statement. Use if you
445
+ are calling IO::select ahead of this method.
446
+ build_methods: Build method accessors from named captures.
447
+ Enabled by default.</pre>
448
+
449
+
450
+
451
+
452
+ <div class="method-source-code" id="read_match-source">
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>
458
+
459
+ <span class="ruby-keyword">unless</span> <span class="ruby-identifier">skip_select</span>
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>
461
+ <span class="ruby-keyword">end</span>
462
+
463
+ <span class="ruby-comment"># Read data from the IO buffer until it&#39;s empty.</span>
464
+ <span class="ruby-identifier">loop</span> <span class="ruby-keyword">do</span>
465
+ <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>)
466
+ <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>
467
+ <span class="ruby-keyword">end</span>
468
+
469
+ <span class="ruby-ivar">@matches</span> = []
470
+
471
+ <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>
472
+ <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>
473
+ <span class="ruby-keyword">yield</span> <span class="ruby-identifier">$~</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">block_given?</span>
474
+ <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>
475
+ <span class="ruby-keyword">end</span>
476
+
477
+ <span class="ruby-comment"># Convert named captures to methods.</span>
478
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">build_methods</span>
479
+ <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>
480
+ <span class="ruby-identifier">match</span>.<span class="ruby-identifier">names</span>
481
+ .<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>}
482
+ .<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>
483
+ .<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>
484
+ }
485
+ <span class="ruby-keyword">end</span>
486
+ <span class="ruby-keyword">end</span>
487
+
488
+ <span class="ruby-ivar">@matches</span>
489
+ <span class="ruby-keyword">end</span></pre>
490
+ </div>
491
+
492
+ </div>
493
+
494
+
495
+
496
+
497
+ </div>
498
+
499
+
500
+ <div id="method-i-register_observer" class="method-detail ">
501
+
502
+ <div class="method-heading">
503
+ <span class="method-name">register_observer</span><span
504
+ class="method-args">(&block)</span>
505
+
506
+ <span class="method-click-advice">click to toggle source</span>
507
+
508
+ </div>
509
+
510
+
511
+ <div class="method-description">
512
+
513
+ <p>Register a block to be called when <a
514
+ href="IO.html#method-i-run_match">run_match</a> receives matched data.
515
+ Method callbacks can be registered with &amp;object.method(:method).
516
+ Returns a reference to the given block. block =
517
+ ionian_socket.register_observer {…}</p>
518
+
519
+
520
+
521
+
522
+ <div class="method-source-code" id="register_observer-source">
523
+ <pre><span class="ruby-comment"># File lib/ionian/extension/io.rb, line 150</span>
524
+ <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>)
525
+ <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>
526
+ <span class="ruby-identifier">block</span>
527
+ <span class="ruby-keyword">end</span></pre>
528
+ </div>
529
+
530
+ </div>
531
+
532
+
533
+ <div class="aliases">
534
+ Also aliased as: <a href="IO.html#method-i-on_match">on_match</a>
535
+ </div>
536
+
537
+
538
+
539
+ </div>
540
+
541
+
542
+ <div id="method-i-run_match" class="method-detail ">
543
+
544
+ <div class="method-heading">
545
+ <span class="method-name">run_match</span><span
546
+ class="method-args">(**kvargs)</span>
547
+
548
+ <span class="method-click-advice">click to toggle source</span>
549
+
550
+ </div>
551
+
552
+
553
+ <div class="method-description">
554
+
555
+ <p>Start a thread that checks for data and notifies listeners (do |match,
556
+ socket|). Passes kvargs to <a
557
+ href="IO.html#method-i-read_match">read_match</a>. This method SHOULD NOT
558
+ be used if <a href="IO.html#method-i-read_match">read_match</a> is used.</p>
559
+
560
+
561
+
562
+
563
+ <div class="method-source-code" id="run_match-source">
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>)
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
+ <span class="ruby-keyword">begin</span>
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>
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
+ <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
+ } <span class="ruby-keyword">if</span> <span class="ruby-identifier">matches</span>
573
+ <span class="ruby-keyword">end</span>
574
+ <span class="ruby-keyword">rescue</span> <span class="ruby-constant">EOFError</span>
575
+ <span class="ruby-keyword">rescue</span> <span class="ruby-constant">IOError</span>
576
+ <span class="ruby-keyword">ensure</span>
577
+ <span class="ruby-ivar">@match_listener</span> = <span class="ruby-keyword">nil</span>
578
+ <span class="ruby-keyword">end</span>
579
+ <span class="ruby-keyword">end</span>
580
+ <span class="ruby-keyword">end</span></pre>
581
+ </div>
582
+
583
+ </div>
584
+
585
+
586
+
587
+
588
+ </div>
589
+
590
+
591
+ <div id="method-i-unregister_observer" class="method-detail ">
592
+
593
+ <div class="method-heading">
594
+ <span class="method-name">unregister_observer</span><span
595
+ class="method-args">(&block)</span>
596
+
597
+ <span class="method-click-advice">click to toggle source</span>
598
+
599
+ </div>
600
+
601
+
602
+ <div class="method-description">
603
+
604
+ <p>Unregister a block from being called when matched data is received.</p>
605
+
606
+
607
+
608
+
609
+ <div class="method-source-code" id="unregister_observer-source">
610
+ <pre><span class="ruby-comment"># File lib/ionian/extension/io.rb, line 158</span>
611
+ <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>)
612
+ <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>}
613
+ <span class="ruby-identifier">block</span>
614
+ <span class="ruby-keyword">end</span></pre>
615
+ </div>
616
+
617
+ </div>
618
+
619
+
620
+
621
+
622
+ </div>
623
+
624
+
625
+ </section>
626
+
627
+ </section>
628
+ </main>
629
+
630
+
631
+ <footer id="validator-badges" role="contentinfo">
632
+ <p><a href="http://validator.w3.org/check/referer">Validate</a>
633
+ <p>Generated by <a href="http://rdoc.rubyforge.org">RDoc</a> 4.1.0.preview.1.
634
+ <p>Based on <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish</a> by <a href="http://deveiate.org">Michael Granger</a>.
635
+ </footer>
636
+