scout-essentials 1.0.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.
Files changed (107) hide show
  1. checksums.yaml +7 -0
  2. data/.document +5 -0
  3. data/.vimproject +78 -0
  4. data/Gemfile +14 -0
  5. data/LICENSE.txt +20 -0
  6. data/README.rdoc +18 -0
  7. data/Rakefile +47 -0
  8. data/VERSION +1 -0
  9. data/lib/scout/cmd.rb +348 -0
  10. data/lib/scout/concurrent_stream.rb +284 -0
  11. data/lib/scout/config.rb +168 -0
  12. data/lib/scout/exceptions.rb +77 -0
  13. data/lib/scout/indiferent_hash/case_insensitive.rb +30 -0
  14. data/lib/scout/indiferent_hash/options.rb +115 -0
  15. data/lib/scout/indiferent_hash.rb +96 -0
  16. data/lib/scout/log/color.rb +224 -0
  17. data/lib/scout/log/color_class.rb +269 -0
  18. data/lib/scout/log/fingerprint.rb +69 -0
  19. data/lib/scout/log/progress/report.rb +244 -0
  20. data/lib/scout/log/progress/util.rb +173 -0
  21. data/lib/scout/log/progress.rb +106 -0
  22. data/lib/scout/log/trap.rb +107 -0
  23. data/lib/scout/log.rb +441 -0
  24. data/lib/scout/meta_extension.rb +100 -0
  25. data/lib/scout/misc/digest.rb +63 -0
  26. data/lib/scout/misc/filesystem.rb +25 -0
  27. data/lib/scout/misc/format.rb +255 -0
  28. data/lib/scout/misc/helper.rb +31 -0
  29. data/lib/scout/misc/insist.rb +56 -0
  30. data/lib/scout/misc/monitor.rb +66 -0
  31. data/lib/scout/misc/system.rb +73 -0
  32. data/lib/scout/misc.rb +10 -0
  33. data/lib/scout/named_array.rb +138 -0
  34. data/lib/scout/open/lock/lockfile.rb +587 -0
  35. data/lib/scout/open/lock.rb +68 -0
  36. data/lib/scout/open/remote.rb +135 -0
  37. data/lib/scout/open/stream.rb +491 -0
  38. data/lib/scout/open/util.rb +244 -0
  39. data/lib/scout/open.rb +170 -0
  40. data/lib/scout/path/find.rb +204 -0
  41. data/lib/scout/path/tmpfile.rb +8 -0
  42. data/lib/scout/path/util.rb +127 -0
  43. data/lib/scout/path.rb +51 -0
  44. data/lib/scout/persist/open.rb +17 -0
  45. data/lib/scout/persist/path.rb +15 -0
  46. data/lib/scout/persist/serialize.rb +157 -0
  47. data/lib/scout/persist.rb +104 -0
  48. data/lib/scout/resource/open.rb +8 -0
  49. data/lib/scout/resource/path.rb +80 -0
  50. data/lib/scout/resource/produce/rake.rb +69 -0
  51. data/lib/scout/resource/produce.rb +151 -0
  52. data/lib/scout/resource/scout.rb +3 -0
  53. data/lib/scout/resource/software.rb +178 -0
  54. data/lib/scout/resource/util.rb +59 -0
  55. data/lib/scout/resource.rb +40 -0
  56. data/lib/scout/simple_opt/accessor.rb +54 -0
  57. data/lib/scout/simple_opt/doc.rb +126 -0
  58. data/lib/scout/simple_opt/get.rb +57 -0
  59. data/lib/scout/simple_opt/parse.rb +67 -0
  60. data/lib/scout/simple_opt/setup.rb +26 -0
  61. data/lib/scout/simple_opt.rb +5 -0
  62. data/lib/scout/tmpfile.rb +129 -0
  63. data/lib/scout-essentials.rb +10 -0
  64. data/scout-essentials.gemspec +143 -0
  65. data/share/color/color_names +507 -0
  66. data/share/color/diverging_colors.hex +12 -0
  67. data/share/software/install_helpers +523 -0
  68. data/test/scout/indiferent_hash/test_case_insensitive.rb +16 -0
  69. data/test/scout/indiferent_hash/test_options.rb +46 -0
  70. data/test/scout/log/test_color.rb +0 -0
  71. data/test/scout/log/test_progress.rb +108 -0
  72. data/test/scout/misc/test_digest.rb +30 -0
  73. data/test/scout/misc/test_filesystem.rb +30 -0
  74. data/test/scout/misc/test_insist.rb +13 -0
  75. data/test/scout/misc/test_system.rb +21 -0
  76. data/test/scout/open/test_lock.rb +52 -0
  77. data/test/scout/open/test_remote.rb +25 -0
  78. data/test/scout/open/test_stream.rb +676 -0
  79. data/test/scout/open/test_util.rb +73 -0
  80. data/test/scout/path/test_find.rb +110 -0
  81. data/test/scout/path/test_util.rb +22 -0
  82. data/test/scout/persist/test_open.rb +37 -0
  83. data/test/scout/persist/test_path.rb +37 -0
  84. data/test/scout/persist/test_serialize.rb +114 -0
  85. data/test/scout/resource/test_path.rb +58 -0
  86. data/test/scout/resource/test_produce.rb +94 -0
  87. data/test/scout/resource/test_software.rb +24 -0
  88. data/test/scout/resource/test_util.rb +38 -0
  89. data/test/scout/simple_opt/test_doc.rb +16 -0
  90. data/test/scout/simple_opt/test_get.rb +11 -0
  91. data/test/scout/simple_opt/test_parse.rb +10 -0
  92. data/test/scout/simple_opt/test_setup.rb +77 -0
  93. data/test/scout/test_cmd.rb +85 -0
  94. data/test/scout/test_concurrent_stream.rb +29 -0
  95. data/test/scout/test_config.rb +66 -0
  96. data/test/scout/test_indiferent_hash.rb +26 -0
  97. data/test/scout/test_log.rb +32 -0
  98. data/test/scout/test_meta_extension.rb +80 -0
  99. data/test/scout/test_misc.rb +6 -0
  100. data/test/scout/test_named_array.rb +43 -0
  101. data/test/scout/test_open.rb +146 -0
  102. data/test/scout/test_path.rb +54 -0
  103. data/test/scout/test_persist.rb +186 -0
  104. data/test/scout/test_resource.rb +26 -0
  105. data/test/scout/test_tmpfile.rb +53 -0
  106. data/test/test_helper.rb +50 -0
  107. metadata +247 -0
@@ -0,0 +1,676 @@
1
+ require File.expand_path(__FILE__).sub(%r(/test/.*), '/test/test_helper.rb')
2
+ require File.expand_path(__FILE__).sub(%r(.*/test/), '').sub(/test_(.*)\.rb/,'\1')
3
+
4
+ require 'scout/path'
5
+ require 'scout/open'
6
+
7
+ class TestOpenStream < Test::Unit::TestCase
8
+ def test_stream
9
+ content =<<-EOF
10
+ 1
11
+ 2
12
+ 3
13
+ 4
14
+ EOF
15
+ TmpFile.with_file(content) do |file|
16
+ TmpFile.with_file do |target|
17
+ f = File.open(file)
18
+ Open.consume_stream(f, false, target)
19
+ assert_equal content, File.open(target).read
20
+ end
21
+ end
22
+ end
23
+
24
+ def test_sensible_write
25
+ content =<<-EOF
26
+ 1
27
+ 2
28
+ 3
29
+ 4
30
+ EOF
31
+ TmpFile.with_file(content) do |file|
32
+ TmpFile.with_file do |target|
33
+ f = File.open(file)
34
+ Open.sensible_write(target, f)
35
+ assert_equal content, File.open(target).read
36
+ end
37
+ end
38
+ end
39
+
40
+ def test_open_pipe
41
+ sout = Open.open_pipe do |sin|
42
+ 10.times do |i|
43
+ sin.puts "line #{i}"
44
+ end
45
+ end
46
+
47
+ TmpFile.with_file do |tmp|
48
+ Open.consume_stream(sout, false, tmp)
49
+ assert_equal 10, Open.read(tmp).split("\n").length
50
+ end
51
+ end
52
+
53
+ def test_open_pipe_and_close
54
+
55
+ 10000.times do
56
+ sout = Open.open_pipe do |sin|
57
+ sin.puts "hola"
58
+ end
59
+ sout.read
60
+ sout.close
61
+ end
62
+ end
63
+
64
+
65
+ def test_open_pipe_error
66
+ sout = Open.open_pipe do |sin|
67
+ 10.times do |i|
68
+ sin.puts "line #{i}"
69
+ end
70
+ raise ScoutException
71
+ end
72
+
73
+ TmpFile.with_file do |tmp|
74
+ assert_raise ScoutException do
75
+ Open.consume_stream(sout, false, tmp)
76
+ end
77
+ end
78
+ end
79
+
80
+ def test_tee_stream
81
+ num = 2000
82
+ sout = Open.open_pipe do |sin|
83
+ num.times do |i|
84
+ sin.puts "line #{i} - #{rand(100000).to_s * 100}"
85
+ end
86
+ end
87
+
88
+ TmpFile.with_file do |tmp|
89
+ Path.setup tmp
90
+
91
+ s1, s2 = Open.tee_stream_thread sout
92
+
93
+ t1 = Open.consume_stream(s1, true, tmp.file1)
94
+ t2 = Open.consume_stream(s2, true, tmp.file2)
95
+ t1.join
96
+ t2.join
97
+ assert_equal num, Open.read(tmp.file1).split("\n").length
98
+ assert_equal num, Open.read(tmp.file2).split("\n").length
99
+ end
100
+ end
101
+
102
+ def test_tee_stream_multiple
103
+ num = 2000
104
+ sout = Open.open_pipe do |sin|
105
+ num.times do |i|
106
+ sin.puts "line #{i} - #{rand(100000).to_s * 100}"
107
+ end
108
+ end
109
+
110
+ TmpFile.with_file do |tmp|
111
+ Path.setup tmp
112
+
113
+ s1, s2, s3 = Open.tee_stream_thread_multiple sout, 3
114
+
115
+ t1 = Open.consume_stream(s1, true, tmp.file1)
116
+ t2 = Open.consume_stream(s2, true, tmp.file2)
117
+ t3 = Open.consume_stream(s3, true, tmp.file3)
118
+ t1.join
119
+ t2.join
120
+ t3.join
121
+ assert_equal num, Open.read(tmp.file1).split("\n").length
122
+ assert_equal num, Open.read(tmp.file2).split("\n").length
123
+ assert_equal num, Open.read(tmp.file3).split("\n").length
124
+ end
125
+ end
126
+
127
+
128
+ def test_tee_stream_source_error
129
+ 5.times do |i|
130
+ num = 2000
131
+ sout = Open.open_pipe do |sin|
132
+ num.times do |i|
133
+ sin.puts "line #{i} - #{rand(100000).to_s * 100}"
134
+ end
135
+ raise ScoutException
136
+ end
137
+
138
+ TmpFile.with_file do |tmp|
139
+ Path.setup tmp
140
+
141
+ s1, s2 = Open.tee_stream_thread sout
142
+
143
+ t1 = Open.consume_stream(s1, true, tmp.file1)
144
+ t2 = Open.consume_stream(s2, true, tmp.file2)
145
+ assert_raise ScoutException do
146
+ begin
147
+ t1.join
148
+ t2.join
149
+ rescue
150
+ raise
151
+ ensure
152
+ [t1, t2].each do |t|
153
+ begin
154
+ t.join if t.alive?
155
+ rescue ScoutException
156
+ end
157
+ end
158
+ end
159
+ end
160
+ refute Open.exist?(tmp.file1)
161
+ refute Open.exist?(tmp.file2)
162
+ end
163
+ end
164
+ end
165
+
166
+ def test_tee_stream_source_error_multiple
167
+ 5.times do |i|
168
+ num = 2000
169
+ sout = Open.open_pipe do |sin|
170
+ num.times do |i|
171
+ sin.puts "line #{i} - #{rand(100000).to_s * 100}"
172
+ end
173
+ raise ScoutException
174
+ end
175
+
176
+ TmpFile.with_file do |tmp|
177
+ Path.setup tmp
178
+
179
+ s1, s2, s3 = Open.tee_stream_thread_multiple sout, 3
180
+
181
+ t1 = Open.consume_stream(s1, true, tmp.file1)
182
+ t2 = Open.consume_stream(s2, true, tmp.file2)
183
+ t3 = Open.consume_stream(s3, true, tmp.file3)
184
+ assert_raise ScoutException do
185
+ begin
186
+ t1.join
187
+ t2.join
188
+ t3.join
189
+ rescue
190
+ raise
191
+ ensure
192
+ [t1, t2, t2].each do |t|
193
+ begin
194
+ t.join if t.alive?
195
+ rescue ScoutException
196
+ end
197
+ end
198
+ end
199
+ end
200
+ refute Open.exist?(tmp.file1)
201
+ refute Open.exist?(tmp.file2)
202
+ refute Open.exist?(tmp.file3)
203
+ end
204
+ end
205
+ end
206
+
207
+ def test_tee_stream_save_error
208
+ Log.with_severity 6 do
209
+ 50.times do |i|
210
+ TmpFile.with_file do |tmp|
211
+ Path.setup tmp
212
+ assert_raise ScoutException do
213
+ num = 2000
214
+ begin
215
+ sout = Open.open_pipe do |sin|
216
+ num.times do |i|
217
+ sin.puts "line #{i} - #{rand(100000).to_s * 100}"
218
+ end
219
+ end
220
+
221
+ begin
222
+ s1, s2 = Open.tee_stream_thread sout
223
+
224
+ s2.abort ScoutException.new
225
+ t = Open.consume_stream(s1, true, tmp.file)
226
+
227
+ t.join
228
+ ensure
229
+ s1.close if s1.respond_to?(:close) && ! s1.closed?
230
+ s1.join if s1.respond_to?(:join) && ! s1.joined?
231
+ s2.close if s2.respond_to?(:close) && ! s2.closed?
232
+ s2.join if s2.respond_to?(:join) && ! s2.joined?
233
+ end
234
+ ensure
235
+ sout.close if sout.respond_to?(:close) && ! sout.closed?
236
+ sout.join if sout.respond_to?(:join) && ! sout.joined?
237
+ end
238
+ end
239
+ refute Open.exist?(tmp.file)
240
+ end
241
+ end
242
+ end
243
+ end
244
+
245
+ def test_tee_stream_save_error_multiple
246
+ Log.with_severity 6 do
247
+ 50.times do |i|
248
+ TmpFile.with_file do |tmp|
249
+ Path.setup tmp
250
+ assert_raise ScoutException do
251
+ num = 2000
252
+ begin
253
+ sout = Open.open_pipe do |sin|
254
+ num.times do |i|
255
+ sin.puts "line #{i} - #{rand(100000).to_s * 100}"
256
+ end
257
+ end
258
+
259
+ begin
260
+ s1, s2, s3 = Open.tee_stream_thread_multiple sout, 3
261
+
262
+ s2.abort ScoutException.new
263
+ t1 = Open.consume_stream(s1, true, tmp.file1)
264
+ t2 = Open.consume_stream(s2, true, tmp.file2)
265
+
266
+ t1.join
267
+ t2.join
268
+ ensure
269
+ s1.close if s1.respond_to?(:close) && ! s1.closed?
270
+ s1.join if s1.respond_to?(:join) && ! s1.joined?
271
+ s2.close if s2.respond_to?(:close) && ! s2.closed?
272
+ s2.join if s2.respond_to?(:join) && ! s2.joined?
273
+ s3.close if s3.respond_to?(:close) && ! s3.closed?
274
+ s3.join if s3.respond_to?(:join) && ! s3.joined?
275
+ end
276
+ ensure
277
+ sout.close if sout.respond_to?(:close) && ! sout.closed?
278
+ sout.join if sout.respond_to?(:join) && ! sout.joined?
279
+ end
280
+ end
281
+ refute Open.exist?(tmp.file1)
282
+ refute Open.exist?(tmp.file2)
283
+ end
284
+ end
285
+ end
286
+ end
287
+
288
+ def test_sort_stream
289
+ text =<<-EOF
290
+ ##
291
+ ##
292
+ ##
293
+ #Row LabelA LabelB LabelC
294
+ row2 AA BB CC
295
+ row3 AAA BBB CCC
296
+ row1 A B C
297
+ EOF
298
+ s = StringIO.new text
299
+ sorted = Open.sort_stream(s)
300
+ assert_equal %w(## ## ## #Row row2 row3 row1), text.split("\n").collect{|l| l.split(" ").first}
301
+ assert_equal %w(## ## ## #Row row1 row2 row3), sorted.read.split("\n").collect{|l| l.split(" ").first}
302
+ end
303
+
304
+ def test_sort_long_stream
305
+ text =<<-EOF
306
+ ##
307
+ ##
308
+ ##
309
+ #Row LabelA LabelB LabelC
310
+ row2 AA BB CC
311
+ row3 AAA BBB CCC
312
+ row1 A B C
313
+ EOF
314
+
315
+ s = StringIO.new text + (text.split("\n")[-3..-1] * "\n" + "\n") * 10000
316
+ sorted = Open.sort_stream(s)
317
+ assert_equal %w(## ## ## #Row row2 row3 row1), text.split("\n").collect{|l| l.split(" ").first}
318
+ assert_equal %w(## ## ## #Row row1 row2 row3), sorted.read.split("\n").collect{|l| l.split(" ").first}
319
+ end
320
+
321
+ def test_sort_stream2
322
+ text =<<-EOF
323
+ ##
324
+ ##
325
+ ##
326
+ #Row LabelA LabelB LabelC
327
+ row2 AA BB CC
328
+ row3 AAA BBB CCC
329
+ row1 A B C
330
+ EOF
331
+ s = StringIO.new text
332
+ sorted = Open.sort_stream(Open.sort_stream(s))
333
+ assert_equal %w(## ## ## #Row row2 row3 row1), text.split("\n").collect{|l| l.split(" ").first}
334
+ assert_equal %w(## ## ## #Row row1 row2 row3), sorted.read.split("\n").collect{|l| l.split(" ").first}
335
+ end
336
+
337
+ def test_collapse_stream
338
+ text=<<-EOF
339
+ row1 A B C
340
+ row1 a b c
341
+ row2 AA BB CC
342
+ row2 aa bb cc
343
+ EOF
344
+
345
+ s = StringIO.new text
346
+ stream = Open.collapse_stream(s, sep: " ")
347
+ txt = stream.read
348
+ assert_include txt, "A|a"
349
+ assert_include txt, "B|b"
350
+ assert_include txt, "C|c"
351
+ end
352
+
353
+
354
+ def test_collapse_sum
355
+ text=<<-EOF
356
+ row1 12
357
+ row1 4
358
+ row2 10
359
+ row2 6
360
+ EOF
361
+
362
+ s = StringIO.new text
363
+ stream = Open.collapse_stream(s, sep: " ") do |parts|
364
+ next nil if parts.empty?
365
+ parts.first.split("|").collect{|p| p.to_f}.inject(0){|acc,e| acc += e}.to_s
366
+ end
367
+ assert_include stream.read, "row1 16"
368
+ end
369
+
370
+
371
+ def test_collapse_stream_gap
372
+ text=<<-EOF
373
+ row2 AA BB
374
+ row2 aa bb cc
375
+ EOF
376
+
377
+ s = StringIO.new text
378
+ assert Open.collapse_stream(s, sep: " ").read =~ /\|cc$/
379
+
380
+ text=<<-EOF
381
+ row2 aa bb cc
382
+ row2 AA BB
383
+ EOF
384
+
385
+ s = StringIO.new text
386
+ assert Open.collapse_stream(s, sep: " ").read =~ /cc\|$/
387
+
388
+ text=<<-EOF
389
+ row2 AA BB
390
+ row2 aa bb cc
391
+ EOF
392
+
393
+ s = StringIO.new text
394
+ assert Open.collapse_stream(s, sep: " ").read =~ /\|cc$/
395
+ end
396
+ #
397
+ #
398
+ # def test_paste_stream
399
+ # text1=<<-EOF
400
+ #row1 A B C
401
+ #row2 AA BB CC
402
+ #row3 AAA BBB CCC
403
+ # EOF
404
+ #
405
+ # text2=<<-EOF
406
+ #row1 a b
407
+ #row2 aa bb
408
+ # EOF
409
+ #
410
+ # text3=<<-EOF
411
+ #row1 c
412
+ #row2 cc
413
+ #row3 ccc
414
+ # EOF
415
+ #
416
+ # s1 = StringIO.new text1
417
+ # s2 = StringIO.new text2
418
+ # s3 = StringIO.new text3
419
+ # tsv = TSV.open Misc.paste_streams([s1,s2,s3], nil, " "), :sep => " ", :type => :list
420
+ # assert_equal ["A", "B", "C", "a", "b", "c"], tsv["row1"]
421
+ # assert_equal ["AA", "BB", "CC", "aa", "bb", "cc"], tsv["row2"]
422
+ # assert_equal ["AAA", "BBB", "CCC", "", "", "ccc"], tsv["row3"]
423
+ # end
424
+ #
425
+ # def test_sort_stream
426
+ # text =<<-EOF
427
+ ###
428
+ ###
429
+ ###
430
+ ##Row LabelA LabelB LabelC
431
+ #row2 AA BB CC
432
+ #row3 AAA BBB CCC
433
+ #row1 A B C
434
+ # EOF
435
+ # s = StringIO.new text
436
+ # sorted = Misc.sort_stream(s)
437
+ # assert_equal %w(## ## ## #Row row2 row3 row1), text.split("\n").collect{|l| l.split(" ").first}
438
+ # assert_equal %w(## ## ## #Row row1 row2 row3), sorted.read.split("\n").collect{|l| l.split(" ").first}
439
+ # end
440
+ #
441
+ # def test_sort_long_stream
442
+ # text =<<-EOF
443
+ ###
444
+ ###
445
+ ###
446
+ ##Row LabelA LabelB LabelC
447
+ #row2 AA BB CC
448
+ #row3 AAA BBB CCC
449
+ #row1 A B C
450
+ # EOF
451
+ #
452
+ # s = StringIO.new text + (text.split("\n")[-3..-1] * "\n" + "\n") * 10000
453
+ # sorted = Misc.sort_stream(s)
454
+ # assert_equal %w(## ## ## #Row row2 row3 row1), text.split("\n").collect{|l| l.split(" ").first}
455
+ # assert_equal %w(## ## ## #Row row1 row2 row3), sorted.read.split("\n").collect{|l| l.split(" ").first}
456
+ # end
457
+ #
458
+ # def test_sort_stream2
459
+ # text =<<-EOF
460
+ ###
461
+ ###
462
+ ###
463
+ ##Row LabelA LabelB LabelC
464
+ #row2 AA BB CC
465
+ #row3 AAA BBB CCC
466
+ #row1 A B C
467
+ # EOF
468
+ # s = StringIO.new text
469
+ # sorted = Misc.sort_stream(Misc.sort_stream(s))
470
+ # assert_equal %w(## ## ## #Row row2 row3 row1), text.split("\n").collect{|l| l.split(" ").first}
471
+ # assert_equal %w(## ## ## #Row row1 row2 row3), sorted.read.split("\n").collect{|l| l.split(" ").first}
472
+ # end
473
+ #
474
+ # def test_dup_stream
475
+ # text =<<-EOF
476
+ ##: :sep=" "
477
+ ##Row LabelA LabelB LabelC
478
+ #row2 AA BB CC
479
+ #row3 AAA BBB CCC
480
+ #row1 A B C
481
+ # EOF
482
+ #
483
+ # text = text * 10000
484
+ # TmpFile.with_file(text) do |tmp|
485
+ # io = Open.open(tmp)
486
+ # dup = Misc.dup_stream(io)
487
+ # new_text = StringIO.new ""
488
+ # Misc.consume_stream dup, true, new_text
489
+ # Misc.consume_stream io, false
490
+ # new_text.rewind
491
+ # assert_equal text, new_text.read
492
+ # end
493
+ #
494
+ #
495
+ # TmpFile.with_file(text) do |tmp|
496
+ # io = Open.open(tmp)
497
+ # dup = Misc.dup_stream(io)
498
+ # Misc.consume_stream dup, true
499
+ # assert_equal text, io.read
500
+ # end
501
+ # end
502
+ #
503
+ # def test_dup_stream_multiple
504
+ # text =<<-EOF
505
+ #row2 AA BB CC
506
+ #row3 AAA BBB CCC
507
+ #row1 A B C
508
+ # EOF
509
+ #
510
+ # text = text * 10000
511
+ # num = 5
512
+ # str_io = StringIO.new
513
+ # strs = []
514
+ # num.times{ strs << StringIO.new }
515
+ # TmpFile.with_file(text) do |tmp|
516
+ # io = Open.open(tmp)
517
+ # copies = Misc.dup_stream_multiple(io, num)
518
+ #
519
+ #
520
+ # copies.each_with_index do |cio,i|
521
+ # cio.add_callback do
522
+ # str = strs[i]
523
+ # str.rewind
524
+ # assert_equal text, str.read
525
+ # end
526
+ # Misc.consume_stream cio, true, strs[i], false
527
+ # end
528
+ #
529
+ #
530
+ # Misc.consume_stream io, false, str_io, false
531
+ # str_io.rewind
532
+ # assert_equal text, str_io.read
533
+ #
534
+ # end
535
+ # end
536
+ #
537
+ # def test_remove_lines
538
+ # text1 =<<-EOF
539
+ #line1
540
+ #line2
541
+ #line3
542
+ #line4
543
+ # EOF
544
+ # text2 =<<-EOF
545
+ #line3
546
+ #line1
547
+ # EOF
548
+ #
549
+ # TmpFile.with_file(text1) do |file1|
550
+ # TmpFile.with_file(text2) do |file2|
551
+ # assert ! Misc.remove_lines(file1, file2, true).read.split("\n").include?("line1")
552
+ # assert Misc.remove_lines(file1, file2, true).read.split("\n").include?("line2")
553
+ # end
554
+ # end
555
+ # end
556
+ #
557
+ #
558
+ #
559
+ # def test_select_lines
560
+ # text1 =<<-EOF
561
+ #line1
562
+ #line2
563
+ #line3
564
+ #line4
565
+ # EOF
566
+ # text2 =<<-EOF
567
+ #line3
568
+ #line1
569
+ #line5
570
+ # EOF
571
+ #
572
+ # TmpFile.with_file(text1) do |file1|
573
+ # TmpFile.with_file(text2) do |file2|
574
+ # assert Misc.select_lines(file1, file2, true).read.split("\n").include?("line1")
575
+ # assert ! Misc.select_lines(file1, file2, true).read.split("\n").include?("line2")
576
+ # end
577
+ # end
578
+ # end
579
+ #
580
+ # def test_consume_into_string_io
581
+ # text =<<-EOF
582
+ #line1
583
+ #line2
584
+ #line3
585
+ #line4
586
+ # EOF
587
+ #
588
+ # TmpFile.with_file(text) do |file|
589
+ # out = StringIO.new
590
+ # io = Open.open(file)
591
+ # Misc.consume_stream(io, false, out, false)
592
+ # out.rewind
593
+ # assert_equal text, out.read
594
+ # end
595
+ # end
596
+ #
597
+ # def test_monitor
598
+ # text =<<-EOF
599
+ #line1
600
+ #line2
601
+ #line3
602
+ #line4
603
+ # EOF
604
+ #
605
+ # TmpFile.with_file(text) do |file|
606
+ # io = Open.open(file)
607
+ # lines = Set.new
608
+ # io2 = Misc.line_monitor_stream io do |line|
609
+ # lines << line
610
+ # end
611
+ # Misc.consume_stream(io2, false)
612
+ # assert_equal text, lines.to_a * ""
613
+ # end
614
+ # end
615
+ #
616
+ # def test_sort
617
+ # assert_raise RbbtException do
618
+ # io = Misc.open_pipe do |sin|
619
+ # sin.puts "#START"
620
+ # 20.times do
621
+ # sin.puts rand(1000).to_s
622
+ # sleep 0.1
623
+ # end
624
+ # raise RbbtException
625
+ # end
626
+ #
627
+ # sio = Misc.sort_stream(io)
628
+ # begin
629
+ # Misc.consume_stream(sio, false, STDOUT)
630
+ # rescue
631
+ # raise $!
632
+ # end
633
+ # end
634
+ # end
635
+ #
636
+ # def test_gz_pipe
637
+ # text =<<-EOF
638
+ #line1
639
+ #line2
640
+ #line3
641
+ #line4
642
+ # EOF
643
+ #
644
+ # TmpFile.with_file nil, :extension => 'txt.gz' do |file|
645
+ # sout = Misc.open_gz_pipe do |sin|
646
+ # text.split("\n").each do |line|
647
+ # sin.puts line
648
+ # end
649
+ # end
650
+ #
651
+ # Open.mkdir File.basename(file)
652
+ # thr1 = Misc.consume_stream(sout, true, file)
653
+ # thr1.join
654
+ # assert Open.gzip?(file)
655
+ # assert_equal text, Open.read(file)
656
+ # end
657
+ # end
658
+ #
659
+ # def test_open_pipe_error
660
+ # sout = Misc.open_pipe do |sin|
661
+ # 10.times do |i|
662
+ # sin.puts "line #{i}"
663
+ # end
664
+ # raise
665
+ # end
666
+ #
667
+ # TmpFile.with_file do |tmp|
668
+ # #Misc.consume_stream(sout, false, tmp)
669
+ # assert_raise do
670
+ # Open.write(tmp, sout)
671
+ # end
672
+ # end
673
+ # end
674
+ #end
675
+ end
676
+