binaryparse 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. data/binaryparse.gemspec +18 -0
  2. data/doc/classes/BinaryBlocker/BitFieldEncoder.html +328 -0
  3. data/doc/classes/BinaryBlocker/Blocker.html +168 -0
  4. data/doc/classes/BinaryBlocker/CountedArrayEncoder.html +347 -0
  5. data/doc/classes/BinaryBlocker/Encoder.html +526 -0
  6. data/doc/classes/BinaryBlocker/FixedArrayEncoder.html +278 -0
  7. data/doc/classes/BinaryBlocker/FixedStringEncoder.html +177 -0
  8. data/doc/classes/BinaryBlocker/FixedUTF16StringEncoder.html +229 -0
  9. data/doc/classes/BinaryBlocker/GroupEncoder.html +650 -0
  10. data/doc/classes/BinaryBlocker/ListOfEncoder.html +343 -0
  11. data/doc/classes/BinaryBlocker/OneOfEncoder.html +306 -0
  12. data/doc/classes/BinaryBlocker/PackedDateEncoder.html +220 -0
  13. data/doc/classes/BinaryBlocker/PackedDateTimeEncoder.html +220 -0
  14. data/doc/classes/BinaryBlocker/PackedNumberEncoder.html +231 -0
  15. data/doc/classes/BinaryBlocker/SimpleEncoder.html +284 -0
  16. data/doc/classes/BinaryBlocker.html +329 -0
  17. data/doc/classes/BufferedIO.html +324 -0
  18. data/doc/classes/TestBlocker/BBDate.html +120 -0
  19. data/doc/classes/TestBlocker/BBList.html +120 -0
  20. data/doc/classes/TestBlocker/BBPacked.html +120 -0
  21. data/doc/classes/TestBlocker/BBString.html +120 -0
  22. data/doc/classes/TestBlocker/BBSub1.html +120 -0
  23. data/doc/classes/TestBlocker/BBSub2.html +120 -0
  24. data/doc/classes/TestBlocker/BBTest1.html +120 -0
  25. data/doc/classes/TestBlocker/BBTest2.html +120 -0
  26. data/doc/classes/TestBlocker/BBTest3.html +120 -0
  27. data/doc/classes/TestBlocker/BBTest4.html +120 -0
  28. data/doc/classes/TestBlocker/BBTest5.html +120 -0
  29. data/doc/classes/TestBlocker/BBTest6.html +120 -0
  30. data/doc/classes/TestBlocker/BBTest7.html +120 -0
  31. data/doc/classes/TestBlocker/BBTime.html +120 -0
  32. data/doc/classes/TestBlocker/BBUTF16.html +120 -0
  33. data/doc/classes/TestBlocker/ItemA.html +120 -0
  34. data/doc/classes/TestBlocker/ItemB.html +120 -0
  35. data/doc/classes/TestBlocker.html +802 -0
  36. data/doc/created.rid +1 -0
  37. data/doc/dot/f_0.dot +208 -0
  38. data/doc/dot/f_0.png +0 -0
  39. data/doc/dot/f_1.dot +23 -0
  40. data/doc/dot/f_1.png +0 -0
  41. data/doc/dot/f_2.dot +32 -0
  42. data/doc/dot/f_2.png +0 -0
  43. data/doc/dot/m_0_0.dot +208 -0
  44. data/doc/dot/m_0_0.png +0 -0
  45. data/doc/files/lib/blocker_rb.html +144 -0
  46. data/doc/files/lib/buffered_io_rb.html +115 -0
  47. data/doc/files/test/test_blocker_rb.html +116 -0
  48. data/doc/fr_class_index.html +60 -0
  49. data/doc/fr_file_index.html +29 -0
  50. data/doc/fr_method_index.html +135 -0
  51. data/doc/index.html +24 -0
  52. data/doc/rdoc-style.css +208 -0
  53. data/lib/blocker.rb +736 -0
  54. data/lib/buffered_io.rb +58 -0
  55. data/test/test_blocker.rb +412 -0
  56. metadata +111 -0
@@ -0,0 +1,58 @@
1
+ # Simple class to allow for streamed (i.e. without pos support)
2
+ # IO to use the BinaryBlocker utilities, but buffering until flushed
3
+ # previously read information.
4
+ class BufferedIO
5
+ BLOCK_SIZE = 512
6
+ # Rdoc
7
+ def initialize(io)
8
+ super
9
+ @io = io
10
+ @buffer = ''
11
+ @pos = 0
12
+ @iobase = @io.pos
13
+ end
14
+
15
+ def flush
16
+ @iobase += @pos
17
+ @buffer = ''
18
+ @pos = 0
19
+ @io.flush
20
+ end
21
+
22
+ def read(size, buffer = nil)
23
+ if (@buffer.size - @pos) < size
24
+ @buffer += @io.read(BLOCK_SIZE)
25
+ end
26
+ result = @buffer[@pos,size]
27
+ @pos += result.size
28
+ buffer.replace(result) if buffer
29
+ result
30
+ end
31
+
32
+ def pos
33
+ @iobase + @pos
34
+ end
35
+
36
+ def pos=(newpos)
37
+ seek(newpos)
38
+ end
39
+
40
+ def seek(amount, whence=IO::SEEK_SET)
41
+ case whence
42
+ when IO::SEEK_CUR
43
+ raise "rewind before buffer start" if (amount < @pos)
44
+ @pos -= amount
45
+ @iobase + @pos
46
+
47
+ when IO::SEEK_END
48
+ raise "Sorry this operation is not supported"
49
+
50
+ when IO::SEEK_SET
51
+ raise "rewind before buffer start" if (amount < @iobase)
52
+ @pos = amount - @iobase
53
+ @iobase + @pos
54
+ end
55
+ end
56
+ end
57
+
58
+
@@ -0,0 +1,412 @@
1
+ require 'blocker'
2
+ require 'stringio'
3
+ #require 'test/unit' #unless defined? $ZENTEST and $ZENTEST
4
+
5
+ class TestBlocker < Test::Unit::TestCase
6
+ class BBTest1 < BinaryBlocker::Blocker
7
+ has_one :foo, :int16
8
+ has_one :bar, :int32
9
+ end
10
+
11
+ def test_usage
12
+ bb = BBTest1.new
13
+ bb.foo = 32
14
+ bb.bar = 24
15
+
16
+ assert_equal(32, bb.foo)
17
+ assert_equal(24, bb.bar)
18
+ end
19
+
20
+ class BBTest2 < BinaryBlocker::Blocker
21
+ has_one :foo, :int16, :key => 42
22
+ has_one :bar, :int32
23
+ end
24
+
25
+ def test_simple_valid
26
+ bb = BBTest2.new
27
+ bb.foo = 32
28
+ bb.bar = 24
29
+
30
+ assert_equal(32, bb.foo)
31
+ assert_equal(24, bb.bar)
32
+ assert(!bb.valid?)
33
+
34
+ bb.foo = 42
35
+ assert(bb.valid?)
36
+ end
37
+
38
+ def test_round_trip
39
+ bb = BBTest2.new
40
+ bb.foo = 42
41
+ bb.bar = 21
42
+ buf = bb.block
43
+
44
+ bb2 = BBTest2.new
45
+ bb2.deblock(StringIO.new(buf))
46
+ assert_equal(bb2.foo, 42)
47
+ assert_equal(bb2.bar, 21)
48
+
49
+ bb3 = BBTest2.new(StringIO.new(buf))
50
+ assert_equal(bb3.foo, 42)
51
+ assert_equal(bb3.bar, 21)
52
+ end
53
+
54
+ def test_failed_deblock
55
+ bb = BBTest2.new
56
+ bb.foo = 43
57
+ bb.bar = 21
58
+ buf = bb.block
59
+
60
+ bb2 = BBTest2.new
61
+ status = bb2.deblock(StringIO.new(buf))
62
+ assert(!status)
63
+
64
+ assert_raises(RuntimeError) do
65
+ BBTest2.new(StringIO.new(buf))
66
+ end
67
+
68
+ bb.foo = 42
69
+ io = StringIO.new(bb.block)
70
+ assert(bb2.deblock(io))
71
+
72
+ assert_equal(bb2.foo, 42)
73
+ assert_equal(bb2.bar, 21)
74
+ assert_equal(6, io.pos)
75
+ end
76
+
77
+ class BBSub1 < BinaryBlocker::Blocker
78
+ has_one :foo, :int16, :key => 42
79
+ end
80
+
81
+ class BBSub2 < BinaryBlocker::Blocker
82
+ has_one :bar, :int16, :key => 21
83
+ end
84
+
85
+ class BBTest3 < BinaryBlocker::Blocker
86
+ has_one_of :foo, [BBSub1, BBSub2]
87
+ end
88
+
89
+ def test_has_one_of
90
+ bs1 = BBSub1.new
91
+ bs1.foo = 42
92
+ buf = bs1.block
93
+ bb = BBTest3.new(StringIO.new(buf))
94
+ assert(bb)
95
+ assert_equal(BBSub1, bb.foo.class)
96
+ assert_equal(42, bb.foo.foo)
97
+
98
+ bs2 = BBSub2.new
99
+ bs2.bar = 21
100
+ io = StringIO.new(bs2.block)
101
+ bb = BBTest3.new(io)
102
+ assert(bb)
103
+ assert_equal(BBSub2, bb.foo.class)
104
+ assert_equal(21, bb.foo.bar)
105
+ assert_equal(2, io.pos)
106
+
107
+ bb.foo = bs1
108
+ assert_equal(BBSub1, bb.foo.class)
109
+ assert_equal(42, bb.foo.foo)
110
+
111
+ buf = bb.block
112
+ bb = BBTest3.new(buf)
113
+ assert_equal(BBSub1, bb.foo.class)
114
+ assert_equal(42, bb.foo.foo)
115
+ end
116
+
117
+ class BBTest4 < BinaryBlocker::Blocker
118
+ has_fixed_array :fooboo, 3, [BBSub1, BBSub2]
119
+ end
120
+
121
+ def test_fixed_array
122
+ bs1 = BBSub1.new
123
+ bs1.foo = 42
124
+ bs2 = BBSub2.new
125
+ bs2.bar = 21
126
+
127
+ buf = bs1.block + bs2.block + bs1.block
128
+ bb = BBTest4.new(buf)
129
+
130
+ assert(bb)
131
+ assert(bb.fooboo)
132
+ assert(bb.fooboo[0].foo)
133
+ assert_equal(42, bb.fooboo[0].foo)
134
+ assert_equal(21, bb.fooboo[1].bar)
135
+ assert_equal(42, bb.fooboo[2].foo)
136
+ end
137
+
138
+ def test_building_fixed_array
139
+ fa = BBTest4.new
140
+ assert(fa)
141
+ fa.fooboo[0] = BBSub1.new
142
+ fa.fooboo[0].foo = 42
143
+ fa.fooboo[1] = BBSub2.new
144
+ fa.fooboo[1].bar = 21
145
+ fa.fooboo[2] = BBSub1.new
146
+ fa.fooboo[2].foo = 42
147
+ assert_equal(42, fa.fooboo[0].foo)
148
+ assert_equal(21, fa.fooboo[1].bar)
149
+ assert_equal(42, fa.fooboo[2].foo)
150
+
151
+ buf = fa.block
152
+ bb = BBTest4.new(buf)
153
+ assert(bb)
154
+ assert(bb.fooboo)
155
+ assert(bb.fooboo[0].foo)
156
+ assert_equal(42, bb.fooboo[0].foo)
157
+ assert_equal(21, bb.fooboo[1].bar)
158
+ assert_equal(42, bb.fooboo[2].foo)
159
+
160
+ assert_raises(RangeError) { bb.fooboo[-1] }
161
+ assert_raises(RangeError) { bb.fooboo[3] }
162
+ end
163
+
164
+ class BBTest5 < BinaryBlocker::Blocker
165
+ has_counted_array :fooboo, :int16, [BBSub1, BBSub2]
166
+ end
167
+
168
+ def test_counted_array
169
+ bb1 = BBSub1.new
170
+ bb1.foo = 42
171
+ bb2 = BBSub2.new
172
+ bb2.bar = 21
173
+
174
+ fa = BBTest5.new
175
+ assert(fa)
176
+ assert_equal(0, fa.fooboo.size)
177
+
178
+ fa.fooboo << bb1
179
+ assert_equal(1, fa.fooboo.size)
180
+
181
+ fa.fooboo << bb1
182
+ assert_equal(2, fa.fooboo.size)
183
+
184
+ fa.fooboo << bb1
185
+ assert_equal(3, fa.fooboo.size)
186
+
187
+ fa.fooboo << bb2
188
+ assert_equal(4, fa.fooboo.size)
189
+
190
+ fa.fooboo << bb1
191
+ assert_equal(5, fa.fooboo.size)
192
+
193
+ assert_raises(RangeError) { fa.fooboo[-1] }
194
+ assert_raises(RangeError) { fa.fooboo[5] }
195
+ assert(fa.fooboo[4])
196
+ end
197
+
198
+ class BBTest6 < BinaryBlocker::Blocker
199
+ has_one :a, BBTest1
200
+ has_one :bar, :int32
201
+ end
202
+
203
+ def test_composing
204
+ bb = BBTest6.new
205
+ assert(bb)
206
+ bb.a.foo = 1
207
+ assert_equal(1, bb.a.foo)
208
+ bb.a.bar = 2
209
+ assert_equal(2, bb.a.bar)
210
+ bb.bar = 1234
211
+ assert_equal(1234, bb.bar)
212
+
213
+ buf = bb.block
214
+ assert_equal(10, buf.size)
215
+
216
+ bb2 = BBTest6.new(buf)
217
+ assert(bb2)
218
+ assert_equal(1, bb2.a.foo)
219
+ assert_equal(2, bb2.a.bar)
220
+ assert_equal(1234, bb2.bar)
221
+ end
222
+
223
+ class BBTest7 < BinaryBlocker::Blocker
224
+ has_bit_field :a, :uint32, [:fld1, 2, [:fld2, 3]]
225
+ end
226
+
227
+ def test_bitfield
228
+ bb = BBTest7.new
229
+ assert(bb)
230
+
231
+ #assert(bb.a.fld1)
232
+ bb.a.fld2 = 1
233
+ assert_equal(8, bb.a.raw_value)
234
+ bb.a.fld2 = 2
235
+ assert_equal(16, bb.a.raw_value)
236
+ bb.a.fld1 = 1
237
+ assert_equal(17, bb.a.raw_value)
238
+
239
+ buf = bb.block
240
+ bb2 = BBTest7.new(buf)
241
+ assert_equal(17, bb.a.raw_value)
242
+ assert_equal(1, bb.a.fld1)
243
+ assert_equal(2, bb.a.fld2)
244
+
245
+ assert_raises(NoMethodError) { bb.a.fld12 }
246
+ end
247
+
248
+ class BBString < BinaryBlocker::Blocker
249
+ has_one :foo, :int16
250
+ has_one :name, :string, :length => 20
251
+ has_one :bar, :int32
252
+ end
253
+
254
+ def test_fixed_string
255
+ b = BBString.new
256
+ b.foo = 1
257
+ b.name = "Patrick "
258
+ b.bar = 42
259
+
260
+ assert_equal(1, b.foo)
261
+ assert_equal("Patrick ", b.name)
262
+ assert_equal(42, b.bar)
263
+
264
+ buf = b.block
265
+ assert_equal(2 + 20 + 4, buf.size)
266
+
267
+ b2 = BBString.new(buf)
268
+ assert_equal(1, b2.foo)
269
+ assert_equal("Patrick ", b2.name)
270
+ assert_equal(42, b2.bar)
271
+ end
272
+
273
+ class BBUTF16 < BinaryBlocker::Blocker
274
+ has_one :foo, :int16
275
+ has_one :name, :utf16, :length => 20
276
+ has_one :bar, :int32
277
+ end
278
+
279
+ def test_utf16
280
+ b = BBUTF16.new
281
+ b.foo = 1
282
+ b.name = "Patrick "
283
+ b.bar = 42
284
+
285
+ assert_equal(1, b.foo)
286
+ assert_equal("Patrick ", b.name)
287
+ assert_equal(42, b.bar)
288
+
289
+ buf = b.block
290
+ assert_equal(2 + 20 * 2 + 4, buf.size)
291
+
292
+ b2 = BBUTF16.new(buf)
293
+ assert_equal(1, b2.foo)
294
+ assert_equal("Patrick ", b2.name)
295
+ assert_equal(42, b2.bar)
296
+ end
297
+
298
+ class BBPacked < BinaryBlocker::Blocker
299
+ has_one :foo, :int16
300
+ has_one :age, :packed, :length => 3
301
+ has_one :bar, :int32
302
+ end
303
+
304
+ def test_packed_numbers
305
+ b = BBPacked.new
306
+ b.foo = 7
307
+ b.age = 32
308
+ b.bar = 3
309
+
310
+ assert_equal(7, b.foo)
311
+ assert_equal(32, b.age)
312
+ assert_equal(3, b.bar)
313
+
314
+ buf = b.block
315
+ assert_equal(2 + 2 + 4, buf.size)
316
+
317
+ b2 = BBPacked.new(buf)
318
+ assert_equal(7, b2.foo)
319
+ assert_equal(32, b2.age)
320
+ assert_equal(3, b2.bar)
321
+ end
322
+
323
+ class BBDate < BinaryBlocker::Blocker
324
+ has_one :today, :date
325
+ end
326
+
327
+ def test_packed_date
328
+ bdate = Date.civil(1967, 9, 30)
329
+ b = BBDate.new
330
+ b.today = bdate
331
+
332
+ buf = b.block
333
+ assert_equal(4, buf.size)
334
+
335
+ b2 = BBDate.new(buf)
336
+ assert_equal(bdate, b2.today)
337
+ end
338
+
339
+ class BBTime < BinaryBlocker::Blocker
340
+ has_one :now, :time
341
+ end
342
+
343
+ def test_packed_datetime
344
+ now = Time.local(1985, 5, 30, 7, 6, 5)
345
+ b = BBTime.new
346
+ b.now = now
347
+
348
+ buf = b.block
349
+ assert_equal(14 / 2, buf.size)
350
+
351
+ b2 = BBTime.new(buf)
352
+ assert_equal(now, b2.now)
353
+ end
354
+
355
+ class ItemA < BinaryBlocker::Blocker
356
+ has_one :iid, :int16, :key => 1
357
+ has_one :name, :string, :length => 32
358
+ end
359
+
360
+ class ItemB < BinaryBlocker::Blocker
361
+ has_one :iid, :int16, :key => 2
362
+ has_one :name, :string, :length => 32
363
+ end
364
+
365
+ class BBList < BinaryBlocker::Blocker
366
+ has_one :header, :int16
367
+ has_list_of :items, [ItemA, ItemB]
368
+ has_one :footer, :int16
369
+ end
370
+
371
+ def test_delimited_array
372
+ b = BBList.new
373
+ b.header = 19
374
+ b.footer = 67
375
+
376
+ ia = ItemA.new
377
+ ia.iid = 1
378
+ ia.name = 'widget A'
379
+ assert_equal(1, ia.iid)
380
+
381
+ ib = ItemB.new
382
+ ib.iid = 2
383
+ ib.name = 'widget B'
384
+
385
+ b.items << ia << ib << ia << ib << ib << ib
386
+ assert_equal(6, b.items.size)
387
+
388
+ buf = b.block
389
+ assert_equal(2 + (2 + 32) * 6 + 2, buf.size)
390
+
391
+ b2 = BBList.new(buf)
392
+ assert_equal(19, b2.header)
393
+ assert_equal(67, b2.footer)
394
+
395
+ assert_equal(6, b2.items.size)
396
+
397
+ assert_equal(b2.items[0].iid, ia.iid)
398
+ assert_equal(b2.items[1].iid, ib.iid)
399
+ assert_equal(b2.items[2].iid, ia.iid)
400
+ assert_equal(b2.items[3].iid, ib.iid)
401
+ assert_equal(b2.items[4].iid, ib.iid)
402
+ assert_equal(b2.items[5].iid, ib.iid)
403
+
404
+ assert_equal(b2.items[0].name, ia.name)
405
+ assert_equal(b2.items[1].name, ib.name)
406
+ assert_equal(b2.items[2].name, ia.name)
407
+ assert_equal(b2.items[3].name, ib.name)
408
+ assert_equal(b2.items[4].name, ib.name)
409
+ assert_equal(b2.items[5].name, ib.name)
410
+ end
411
+ end
412
+
metadata ADDED
@@ -0,0 +1,111 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.9.0
3
+ specification_version: 1
4
+ name: binaryparse
5
+ version: !ruby/object:Gem::Version
6
+ version: 0.1.0
7
+ date: 2006-08-08 00:00:00 -04:00
8
+ summary: Binaryparse is a simple Ruby DSL to parse semi-complicated binary structures. This includes structures dynamic in length, which cannot be handled by DL::Struct or BitStructEx.
9
+ require_paths:
10
+ - lib
11
+ email: phurley@gmail.com
12
+ homepage: http://binaryparse.rubyforge.org/
13
+ rubyforge_project:
14
+ description:
15
+ autorequire: binaryparse
16
+ default_executable:
17
+ bindir: bin
18
+ has_rdoc: false
19
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
+ requirements:
21
+ - - ">"
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.0
24
+ version:
25
+ platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ post_install_message:
29
+ authors:
30
+ - Patrick Hurley
31
+ files:
32
+ - binaryparse.gemspec
33
+ - doc
34
+ - examples
35
+ - lib
36
+ - test
37
+ - doc/classes
38
+ - doc/created.rid
39
+ - doc/dot
40
+ - doc/files
41
+ - doc/fr_class_index.html
42
+ - doc/fr_file_index.html
43
+ - doc/fr_method_index.html
44
+ - doc/index.html
45
+ - doc/rdoc-style.css
46
+ - doc/classes/BinaryBlocker
47
+ - doc/classes/BinaryBlocker.html
48
+ - doc/classes/BufferedIO.html
49
+ - doc/classes/TestBlocker
50
+ - doc/classes/TestBlocker.html
51
+ - doc/classes/BinaryBlocker/BitFieldEncoder.html
52
+ - doc/classes/BinaryBlocker/Blocker.html
53
+ - doc/classes/BinaryBlocker/CountedArrayEncoder.html
54
+ - doc/classes/BinaryBlocker/Encoder.html
55
+ - doc/classes/BinaryBlocker/FixedArrayEncoder.html
56
+ - doc/classes/BinaryBlocker/FixedStringEncoder.html
57
+ - doc/classes/BinaryBlocker/FixedUTF16StringEncoder.html
58
+ - doc/classes/BinaryBlocker/GroupEncoder.html
59
+ - doc/classes/BinaryBlocker/ListOfEncoder.html
60
+ - doc/classes/BinaryBlocker/OneOfEncoder.html
61
+ - doc/classes/BinaryBlocker/PackedDateEncoder.html
62
+ - doc/classes/BinaryBlocker/PackedDateTimeEncoder.html
63
+ - doc/classes/BinaryBlocker/PackedNumberEncoder.html
64
+ - doc/classes/BinaryBlocker/SimpleEncoder.html
65
+ - doc/classes/TestBlocker/BBDate.html
66
+ - doc/classes/TestBlocker/BBList.html
67
+ - doc/classes/TestBlocker/BBPacked.html
68
+ - doc/classes/TestBlocker/BBString.html
69
+ - doc/classes/TestBlocker/BBSub1.html
70
+ - doc/classes/TestBlocker/BBSub2.html
71
+ - doc/classes/TestBlocker/BBTest1.html
72
+ - doc/classes/TestBlocker/BBTest2.html
73
+ - doc/classes/TestBlocker/BBTest3.html
74
+ - doc/classes/TestBlocker/BBTest4.html
75
+ - doc/classes/TestBlocker/BBTest5.html
76
+ - doc/classes/TestBlocker/BBTest6.html
77
+ - doc/classes/TestBlocker/BBTest7.html
78
+ - doc/classes/TestBlocker/BBTime.html
79
+ - doc/classes/TestBlocker/BBUTF16.html
80
+ - doc/classes/TestBlocker/ItemA.html
81
+ - doc/classes/TestBlocker/ItemB.html
82
+ - doc/dot/f_0.dot
83
+ - doc/dot/f_0.png
84
+ - doc/dot/f_1.dot
85
+ - doc/dot/f_1.png
86
+ - doc/dot/f_2.dot
87
+ - doc/dot/f_2.png
88
+ - doc/dot/m_0_0.dot
89
+ - doc/dot/m_0_0.png
90
+ - doc/files/lib
91
+ - doc/files/test
92
+ - doc/files/lib/blocker_rb.html
93
+ - doc/files/lib/buffered_io_rb.html
94
+ - doc/files/test/test_blocker_rb.html
95
+ - lib/blocker.rb
96
+ - lib/buffered_io.rb
97
+ - test/test_blocker.rb
98
+ test_files: []
99
+
100
+ rdoc_options: []
101
+
102
+ extra_rdoc_files: []
103
+
104
+ executables: []
105
+
106
+ extensions: []
107
+
108
+ requirements: []
109
+
110
+ dependencies: []
111
+