rbbt-util 5.21.38 → 5.21.39
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 +4 -4
- data/lib/rbbt/tsv/util.rb +5 -3
- data/lib/rbbt/util/cmd.rb +43 -33
- data/lib/rbbt/util/misc/pipes.rb +6 -17
- data/test/rbbt/util/misc/test_pipes.rb +17 -0
- data/test/rbbt/util/test_cmd.rb +6 -4
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 97680be71c7f39a7c72f307cf0fa154ef8fbb524
|
4
|
+
data.tar.gz: 50b7802d5af30c133c85092bef090eff33ae44bd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 41a0673225580d3bb28ab960edcdf85a5a5564ddf044ff7445e3267cf3697a7af0d0d2b0b4b10214a489f8fdf16d2055e35bf4ef17dd644744af9c857ba41716
|
7
|
+
data.tar.gz: 9b5211a011ac1fc4bf7c338a372781d41e2471679802cad0e4ca4047a7a498344922a088ad957bb606c867e8ba1f625587beea688ddc0bbfa211a907ca052107
|
data/lib/rbbt/tsv/util.rb
CHANGED
@@ -93,13 +93,15 @@ module TSV
|
|
93
93
|
file.open(open_options)
|
94
94
|
when (defined? Tempfile and Tempfile)
|
95
95
|
begin
|
96
|
-
|
97
|
-
|
96
|
+
pos = file.pos
|
97
|
+
file.rewind if file.respond_to?(:rewind) and pos != 0
|
98
|
+
rescue Exception
|
98
99
|
end
|
99
100
|
file
|
100
101
|
when IO, StringIO, File
|
101
102
|
begin
|
102
|
-
|
103
|
+
pos = file.pos
|
104
|
+
file.rewind if file.respond_to?(:rewind) and pos != 0
|
103
105
|
rescue
|
104
106
|
end
|
105
107
|
file
|
data/lib/rbbt/util/cmd.rb
CHANGED
@@ -53,28 +53,31 @@ module CMD
|
|
53
53
|
|
54
54
|
pid = fork {
|
55
55
|
begin
|
56
|
+
Misc.purge_pipes(sin.last,sout.last,serr.last)
|
57
|
+
|
56
58
|
sin.last.close
|
57
59
|
sout.first.close
|
58
60
|
serr.first.close
|
59
61
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
io.close if io.respond_to?(:close) and not io.closed?
|
64
|
-
io = nil
|
62
|
+
if IO === in_content
|
63
|
+
in_content.close if in_content.respond_to?(:close) and not in_content.closed?
|
64
|
+
in_content.join if in_content.respond_to?(:join) and not in_content.joined?
|
65
65
|
end
|
66
66
|
|
67
|
-
STDIN.reopen sin.first
|
68
|
-
sin.first.close
|
69
67
|
|
70
68
|
STDERR.reopen serr.last
|
71
69
|
serr.last.close
|
72
70
|
|
71
|
+
STDIN.reopen sin.first
|
72
|
+
sin.first.close
|
73
|
+
|
73
74
|
STDOUT.reopen sout.last
|
74
75
|
sout.last.close
|
75
76
|
|
77
|
+
|
76
78
|
STDOUT.sync = STDERR.sync = true
|
77
|
-
|
79
|
+
|
80
|
+
|
78
81
|
exec(ENV, cmd)
|
79
82
|
|
80
83
|
exit(-1)
|
@@ -89,32 +92,38 @@ module CMD
|
|
89
92
|
sout.last.close
|
90
93
|
serr.last.close
|
91
94
|
|
95
|
+
|
92
96
|
sin = sin.last
|
93
97
|
sout = sout.first
|
94
98
|
serr = serr.first
|
95
|
-
|
99
|
+
|
96
100
|
|
97
101
|
Log.debug{"CMD: [#{pid}] #{cmd}" if log}
|
98
102
|
|
99
103
|
if in_content.respond_to?(:read)
|
100
|
-
Thread.new do
|
104
|
+
in_thread = Thread.new do |parent|
|
101
105
|
begin
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
106
|
+
begin
|
107
|
+
while c = in_content.readpartial(Misc::BLOCK_SIZE)
|
108
|
+
sin << c
|
109
|
+
end
|
110
|
+
rescue EOFError
|
107
111
|
end
|
112
|
+
sin.close unless sin.closed?
|
108
113
|
|
109
|
-
|
110
|
-
|
111
|
-
|
114
|
+
unless dont_close_in
|
115
|
+
in_content.close unless in_content.closed?
|
116
|
+
in_content.join if in_content.respond_to? :join
|
117
|
+
end
|
112
118
|
rescue
|
119
|
+
parent.raise $!
|
113
120
|
Process.kill "INT", pid
|
114
|
-
|
121
|
+
ensure
|
122
|
+
sin.close unless sin.closed?
|
115
123
|
end
|
116
124
|
end
|
117
125
|
else
|
126
|
+
in_thread = nil
|
118
127
|
sin.close
|
119
128
|
end
|
120
129
|
|
@@ -124,15 +133,16 @@ module CMD
|
|
124
133
|
pids = [pid]
|
125
134
|
end
|
126
135
|
|
136
|
+
|
127
137
|
if pipe
|
128
|
-
Thread.new do
|
138
|
+
err_thread = Thread.new do
|
129
139
|
while line = serr.gets
|
130
140
|
Log.log line, stderr if Integer === stderr and log
|
131
141
|
end
|
132
142
|
serr.close
|
133
143
|
end
|
134
144
|
|
135
|
-
ConcurrentStream.setup sout, :pids => pids, :autojoin => no_wait, :no_fail => no_fail
|
145
|
+
ConcurrentStream.setup sout, :pids => pids, :threads => [in_thread, err_thread].compact, :autojoin => no_wait, :no_fail => no_fail
|
136
146
|
|
137
147
|
sout
|
138
148
|
else
|
@@ -141,23 +151,23 @@ module CMD
|
|
141
151
|
while not serr.eof?
|
142
152
|
err << serr.gets if Integer === stderr
|
143
153
|
end
|
144
|
-
|
145
|
-
|
154
|
+
serr.close
|
155
|
+
end
|
146
156
|
|
147
|
-
|
157
|
+
ConcurrentStream.setup sout, :pids => pids, :threads => [in_thread, err_thread].compact, :autojoin => no_wait, :no_fail => no_fail
|
148
158
|
|
149
|
-
|
150
|
-
|
159
|
+
out = StringIO.new sout.read
|
160
|
+
sout.close unless sout.closed?
|
151
161
|
|
152
|
-
|
162
|
+
Process.waitpid pid
|
153
163
|
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
164
|
+
if not $?.success? and not no_fail
|
165
|
+
raise ProcessFailed.new "Command [#{pid}] #{cmd} failed with error status #{$?.exitstatus}.\n#{err}"
|
166
|
+
else
|
167
|
+
Log.log err, stderr if Integer === stderr and log
|
168
|
+
end
|
159
169
|
|
160
|
-
|
170
|
+
out
|
161
171
|
end
|
162
172
|
end
|
163
173
|
end
|
data/lib/rbbt/util/misc/pipes.rb
CHANGED
@@ -260,6 +260,7 @@ module Misc
|
|
260
260
|
def self.consume_stream(io, in_thread = false, into = nil, into_close = true, &block)
|
261
261
|
return if Path === io
|
262
262
|
return unless io.respond_to? :read
|
263
|
+
|
263
264
|
if io.respond_to? :closed? and io.closed?
|
264
265
|
io.join if io.respond_to? :join
|
265
266
|
return
|
@@ -426,25 +427,13 @@ module Misc
|
|
426
427
|
end
|
427
428
|
|
428
429
|
line_stream = Misc.open_pipe do |line_stream_in|
|
429
|
-
|
430
|
-
|
431
|
-
line_stream_in.puts line
|
432
|
-
line = stream.gets
|
433
|
-
end
|
434
|
-
stream.join if stream.respond_to? :join
|
435
|
-
rescue
|
436
|
-
stream.abort if stream.respond_to? :abort
|
437
|
-
raise $!
|
438
|
-
end
|
430
|
+
line_stream_in.puts line
|
431
|
+
Misc.consume_stream(stream, false, line_stream_in)
|
439
432
|
end
|
440
433
|
|
441
434
|
sorted = CMD.cmd("env LC_ALL=C sort #{cmd_args || ""}", :in => line_stream, :pipe => true)
|
442
435
|
|
443
|
-
|
444
|
-
sin.write block
|
445
|
-
end
|
446
|
-
|
447
|
-
sorted.join if sorted.respond_to? :join
|
436
|
+
Misc.consume_stream(sorted, false, sin)
|
448
437
|
rescue
|
449
438
|
if defined? step and step
|
450
439
|
step.abort
|
@@ -626,7 +615,7 @@ module Misc
|
|
626
615
|
else
|
627
616
|
file1 = TmpFile.tmp_file
|
628
617
|
erase << file1
|
629
|
-
|
618
|
+
Misc.consume_stream(TSV.get_stream(stream1), false, file1)
|
630
619
|
end
|
631
620
|
|
632
621
|
if Path === stream2 or (String === stream2 and File.exist? stream2)
|
@@ -634,7 +623,7 @@ module Misc
|
|
634
623
|
else
|
635
624
|
file2 = TmpFile.tmp_file
|
636
625
|
erase << file2
|
637
|
-
|
626
|
+
Misc.consume_stream(TSV.get_stream(stream2), false, file2)
|
638
627
|
end
|
639
628
|
|
640
629
|
CMD.cmd("env LC_ALL=C comm #{args} '#{file1}' '#{file2}'", :pipe => true, :post => Proc.new{ erase.each{|f| FileUtils.rm f } })
|
@@ -107,6 +107,22 @@ row1 A B C
|
|
107
107
|
assert_equal %w(## ## ## #Row row1 row2 row3), sorted.read.split("\n").collect{|l| l.split(" ").first}
|
108
108
|
end
|
109
109
|
|
110
|
+
def test_sort_stream2
|
111
|
+
text =<<-EOF
|
112
|
+
##
|
113
|
+
##
|
114
|
+
##
|
115
|
+
#Row LabelA LabelB LabelC
|
116
|
+
row2 AA BB CC
|
117
|
+
row3 AAA BBB CCC
|
118
|
+
row1 A B C
|
119
|
+
EOF
|
120
|
+
s = StringIO.new text
|
121
|
+
sorted = Misc.sort_stream(Misc.sort_stream(s))
|
122
|
+
assert_equal %w(## ## ## #Row row2 row3 row1), text.split("\n").collect{|l| l.split(" ").first}
|
123
|
+
assert_equal %w(## ## ## #Row row1 row2 row3), sorted.read.split("\n").collect{|l| l.split(" ").first}
|
124
|
+
end
|
125
|
+
|
110
126
|
def test_dup_stream
|
111
127
|
text =<<-EOF
|
112
128
|
#: :sep=" "
|
@@ -201,6 +217,7 @@ line4
|
|
201
217
|
text2 =<<-EOF
|
202
218
|
line3
|
203
219
|
line1
|
220
|
+
line5
|
204
221
|
EOF
|
205
222
|
|
206
223
|
Log.severity = 0
|
data/test/rbbt/util/test_cmd.rb
CHANGED
@@ -53,11 +53,13 @@ line33
|
|
53
53
|
EOF
|
54
54
|
|
55
55
|
TmpFile.with_file(text * 100) do |file|
|
56
|
-
CMD.cmd("gzip #{ file }")
|
57
56
|
|
58
|
-
|
59
|
-
|
60
|
-
|
57
|
+
Open.open(file) do |f|
|
58
|
+
io = CMD.cmd('tail -n 10', :in => f, :pipe => true)
|
59
|
+
io2 = CMD.cmd('head -n 10', :in => io, :pipe => true)
|
60
|
+
io3 = CMD.cmd('head -n 10', :in => io2, :pipe => true)
|
61
|
+
assert_equal 10, io3.read.split(/\n/).length
|
62
|
+
end
|
61
63
|
end
|
62
64
|
end
|
63
65
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbbt-util
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.21.
|
4
|
+
version: 5.21.39
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Miguel Vazquez
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-10-
|
11
|
+
date: 2016-10-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|