rbbt-util 5.13.6 → 5.13.7
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/bin/rbbt_Rutil.rb +3 -0
- data/lib/rbbt/tsv/attach.rb +2 -1
- data/lib/rbbt/tsv/manipulate.rb +2 -1
- data/lib/rbbt/tsv/parser.rb +2 -1
- data/lib/rbbt/util/R.rb +9 -3
- data/lib/rbbt/util/R/eval.rb +17 -0
- data/lib/rbbt/util/cmd.rb +2 -3
- data/lib/rbbt/util/concurrency/processes.rb +0 -1
- data/lib/rbbt/util/log/progress/report.rb +5 -3
- data/lib/rbbt/util/misc/pipes.rb +4 -4
- data/lib/rbbt/workflow/step/run.rb +3 -4
- data/share/rbbt_commands/tsv/sort +36 -0
- data/share/rbbt_commands/workflow/example +2 -2
- data/test/rbbt/util/R/test_eval.rb +16 -0
- data/test/rbbt/util/misc/test_pipes.rb +12 -3
- data/test/rbbt/util/test_R.rb +8 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a7fb14a033052fa9f9e469e40ab600e40dfa6f90
|
4
|
+
data.tar.gz: 38a1246aae816a12634ee5681954c11beac3c9af
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f55bd2c2fbdd1815df354e7b6bf56c6ef5ec2383acc5ead9fba128ba23048c979bf54a8a1c90392c6982c99e80beebf2a45f5c4f7fef8832aa4a3853292afacc
|
7
|
+
data.tar.gz: f515c4276f796c56826412ffffc23856b221d76be923dc8655234dc1e0cb92781028cc9b0d1e2c92b049724aaaa889b61e4eb79d7e27cca8451fd8749a521051
|
data/bin/rbbt_Rutil.rb
CHANGED
data/lib/rbbt/tsv/attach.rb
CHANGED
@@ -114,7 +114,8 @@ module TSV
|
|
114
114
|
cols2 = parts2.length
|
115
115
|
end
|
116
116
|
|
117
|
-
progress_monitor = Progress::Bar.new(size, 0, 100, "Merging fields") if monitor
|
117
|
+
#progress_monitor = Progress::Bar.new(size, 0, 100, "Merging fields") if monitor
|
118
|
+
progress_monitor = Log::ProgressBar.new(size, :desc => "Merging fields") if monitor
|
118
119
|
|
119
120
|
entry_hash = options
|
120
121
|
entry_hash.delete :sep if entry_hash[:sep] == "\t"
|
data/lib/rbbt/tsv/manipulate.rb
CHANGED
@@ -162,7 +162,8 @@ module TSV
|
|
162
162
|
desc = @monitor[:desc] if @monitor.include? :desc
|
163
163
|
step = @monitor[:step] if @monitor.include? :step
|
164
164
|
end
|
165
|
-
progress_monitor = Progress::Bar.new(size, 0, step, desc)
|
165
|
+
#progress_monitor = Progress::Bar.new(size, 0, step, desc)
|
166
|
+
progress_monitor = Log::ProgressBar.new(size, :desc => desc)
|
166
167
|
else
|
167
168
|
progress_monitor = nil
|
168
169
|
end
|
data/lib/rbbt/tsv/parser.rb
CHANGED
@@ -496,7 +496,8 @@ module TSV
|
|
496
496
|
desc = monitor[:desc] if monitor.include? :desc
|
497
497
|
step = monitor[:step] if monitor.include? :step
|
498
498
|
end
|
499
|
-
progress_monitor = Progress::Bar.new(size, 0, step, desc)
|
499
|
+
#progress_monitor = Progress::Bar.new(size, 0, step, desc)
|
500
|
+
progress_monitor = Log::ProgressBar.new(size, :desc => desc)
|
500
501
|
else
|
501
502
|
progress_monitor = nil
|
502
503
|
end
|
data/lib/rbbt/util/R.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'rbbt/util/cmd'
|
2
2
|
require 'rbbt/tsv'
|
3
|
+
require 'rbbt/util/R/eval'
|
3
4
|
|
4
5
|
module R
|
5
6
|
|
@@ -80,7 +81,7 @@ module TSV
|
|
80
81
|
def R(script, open_options = {})
|
81
82
|
TmpFile.with_file do |f|
|
82
83
|
Open.write(f, self.to_s)
|
83
|
-
|
84
|
+
io = R.run(
|
84
85
|
<<-EOF
|
85
86
|
## Loading tsv into data
|
86
87
|
data = rbbt.tsv('#{f}');
|
@@ -90,12 +91,17 @@ data = rbbt.tsv('#{f}');
|
|
90
91
|
## Resaving data
|
91
92
|
if (! is.null(data)){ rbbt.tsv.write('#{f}', data); }
|
92
93
|
EOF
|
93
|
-
)
|
94
|
+
)
|
95
|
+
|
96
|
+
Log.debug(io.read)
|
97
|
+
|
94
98
|
open_options = Misc.add_defaults open_options, :type => :list
|
95
99
|
if open_options[:raw]
|
96
100
|
Open.read(f)
|
97
101
|
else
|
98
|
-
TSV.open(f, open_options) unless open_options[:ignore_output]
|
102
|
+
tsv = TSV.open(f, open_options) unless open_options[:ignore_output]
|
103
|
+
tsv.key_field = open_options[:key] if open_options.include? :key
|
104
|
+
tsv
|
99
105
|
end
|
100
106
|
end
|
101
107
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module R
|
2
|
+
def self.instance
|
3
|
+
@@instance ||= begin
|
4
|
+
require 'rserve'
|
5
|
+
@@server_process = CMD.cmd('R CMD Rserve --vanilla', :pipe => true)
|
6
|
+
Rserve::Connection.new
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.eval(cmd)
|
11
|
+
instance.eval(cmd).payload.first
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.eval_a(cmd)
|
15
|
+
instance.eval(cmd).payload
|
16
|
+
end
|
17
|
+
end
|
data/lib/rbbt/util/cmd.rb
CHANGED
@@ -219,15 +219,14 @@ module CMD
|
|
219
219
|
Thread.exit
|
220
220
|
end
|
221
221
|
|
222
|
+
ConcurrentStream.setup sout, :pids => [pid], :autojoin => true
|
222
223
|
out = StringIO.new sout.read
|
223
224
|
sout.close unless sout.closed?
|
224
|
-
#SmartIO.tie out, pid, cmd, post, in_content, sin, serr
|
225
225
|
|
226
226
|
Process.waitpid pid
|
227
227
|
|
228
228
|
if not $?.success?
|
229
|
-
|
230
|
-
raise exception
|
229
|
+
raise ProcessFailed.new "Command [#{pid}] #{cmd} failed with error status #{$?.exitstatus}.\n#{err}"
|
231
230
|
else
|
232
231
|
Log.log err, stderr if Integer === stderr and log
|
233
232
|
end
|
@@ -2,7 +2,6 @@ require 'rbbt/util/concurrency/processes/worker'
|
|
2
2
|
require 'rbbt/util/concurrency/processes/socket'
|
3
3
|
|
4
4
|
class RbbtProcessQueue
|
5
|
-
#{{{ RbbtProcessQueue
|
6
5
|
|
7
6
|
attr_accessor :num_processes, :processes, :queue, :process_monitor, :cleanup, :join
|
8
7
|
def initialize(num_processes, cleanup = nil, join = nil)
|
@@ -34,7 +34,7 @@ module Log
|
|
34
34
|
|
35
35
|
@mean_max ||= 0
|
36
36
|
if @history.length > 3
|
37
|
-
mean = Misc.mean(@history)
|
37
|
+
mean = @mean = Misc.mean(@history)
|
38
38
|
@mean_max = mean if mean > @mean_max
|
39
39
|
end
|
40
40
|
|
@@ -60,7 +60,7 @@ module Log
|
|
60
60
|
|
61
61
|
used = time - @start
|
62
62
|
if @mean_max and @mean_max > 0
|
63
|
-
eta = (@max - @ticks) / @
|
63
|
+
eta = (@max - @ticks) / @mean
|
64
64
|
else
|
65
65
|
eta = (@max - @ticks) / (@ticks/used)
|
66
66
|
end
|
@@ -98,7 +98,9 @@ module Log
|
|
98
98
|
|
99
99
|
def done(io = STDERR)
|
100
100
|
done_msg = Log.color(:magenta, desc) << " " << Log.color(:green, "done")
|
101
|
-
|
101
|
+
ellapsed = (Time.now - @start).to_i
|
102
|
+
ellapsed = [ellapsed/3600, ellapsed/60 % 60, ellapsed % 60].map{|t| "%02i" % t }.join(':')
|
103
|
+
done_msg << " " << Log.color(:blue, (@ticks).to_s) << " in " << Log.color(:green, ellapsed)
|
102
104
|
@last_count = 0
|
103
105
|
@last_time = @start
|
104
106
|
done_msg << " (" << thr_msg << ")"
|
data/lib/rbbt/util/misc/pipes.rb
CHANGED
@@ -221,11 +221,11 @@ module Misc
|
|
221
221
|
rescue Aborted
|
222
222
|
Log.warn "Aborted sensiblewrite -- #{ Log.reset << Log.color(:blue, path) }"
|
223
223
|
content.abort if content.respond_to? :abort
|
224
|
-
Open.
|
224
|
+
Open.rm path if File.exists? path
|
225
225
|
rescue Exception
|
226
226
|
Log.warn "Exception in sensiblewrite: #{$!.message} -- #{ Log.color :blue, path }"
|
227
227
|
content.abort if content.respond_to? :abort
|
228
|
-
Open.
|
228
|
+
Open.rm path if File.exists? path
|
229
229
|
raise $!
|
230
230
|
ensure
|
231
231
|
FileUtils.rm_f tmp_path if File.exists? tmp_path
|
@@ -244,7 +244,7 @@ module Misc
|
|
244
244
|
end
|
245
245
|
end
|
246
246
|
|
247
|
-
def self.sort_stream(stream, header_hash = "#")
|
247
|
+
def self.sort_stream(stream, header_hash = "#", cmd_args = nil)
|
248
248
|
Misc.open_pipe do |sin|
|
249
249
|
begin
|
250
250
|
if defined? Step and Step === stream
|
@@ -271,7 +271,7 @@ module Misc
|
|
271
271
|
end
|
272
272
|
end
|
273
273
|
|
274
|
-
sorted = CMD.cmd("sort", :in => line_stream, :pipe => true)
|
274
|
+
sorted = CMD.cmd("sort #{cmd_args || ""}", :in => line_stream, :pipe => true)
|
275
275
|
|
276
276
|
while block = sorted.read(2048)
|
277
277
|
sin.write block
|
@@ -27,12 +27,10 @@ class Step
|
|
27
27
|
|
28
28
|
else
|
29
29
|
Log.medium "Duplicating stream #{ Misc.fingerprint(stream) }"
|
30
|
-
|
31
|
-
Log.medium str << Log.color(:green, " -> ") << "#{new.inspect}"
|
32
|
-
new
|
30
|
+
Misc.dup_stream(current)
|
33
31
|
end
|
34
32
|
end
|
35
|
-
when TSV::Dumper
|
33
|
+
when TSV::Dumper#, TSV::Parser
|
36
34
|
stream = stream.stream
|
37
35
|
return stream if stream.closed?
|
38
36
|
|
@@ -90,6 +88,7 @@ class Step
|
|
90
88
|
end
|
91
89
|
|
92
90
|
def exec(no_load=false)
|
91
|
+
dup_inputs
|
93
92
|
dependencies.each{|dependency| dependency.exec(no_load) }
|
94
93
|
@mutex.synchronize do
|
95
94
|
@result = self._exec
|
@@ -0,0 +1,36 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rbbt-util'
|
4
|
+
require 'rbbt/util/simpleopt'
|
5
|
+
|
6
|
+
$0 = "rbbt #{$previous_commands*""} #{ File.basename(__FILE__) }" if $previous_commands
|
7
|
+
|
8
|
+
options = SOPT.setup <<EOF
|
9
|
+
Sort a TSV file, mantaining headers
|
10
|
+
|
11
|
+
$ rbbt tsv sort file.tsv
|
12
|
+
|
13
|
+
Display summary information. Works with Tokyocabinet HDB and BDB as well.
|
14
|
+
|
15
|
+
-hh--header_hash* Change the character used to mark the header line (defaults to #)
|
16
|
+
-h--help Help
|
17
|
+
EOF
|
18
|
+
|
19
|
+
SOPT.usage if options[:help]
|
20
|
+
|
21
|
+
file = ARGV.shift
|
22
|
+
|
23
|
+
file = STDIN if file == '-' or file.nil?
|
24
|
+
|
25
|
+
rest = ARGV.inject(""){|acc,e| acc << " '#{e}'" }
|
26
|
+
|
27
|
+
file_io = TSV.get_stream(file)
|
28
|
+
stream = Misc.sort_stream(file_io, options[:header_hash] || "#", rest)
|
29
|
+
|
30
|
+
begin
|
31
|
+
while line = stream.gets
|
32
|
+
puts line
|
33
|
+
end
|
34
|
+
rescue Exception
|
35
|
+
exit -1
|
36
|
+
end
|
@@ -67,9 +67,9 @@ workflow = Workflow.require_workflow workflow
|
|
67
67
|
tasks = task ? [task] : workflow.libdir.examples.glob('*').collect{|file| File.basename file }
|
68
68
|
|
69
69
|
task_result = {}
|
70
|
-
TSV.traverse tasks
|
70
|
+
TSV.traverse tasks do |task|
|
71
71
|
names = name ? [name] : workflow.libdir.examples[task].glob('*').collect{|file| File.basename file }
|
72
|
-
TSV.traverse names
|
72
|
+
TSV.traverse names do |name|
|
73
73
|
success = run_task workflow, task, name
|
74
74
|
task_result[[task, name]] = success
|
75
75
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require File.join(File.expand_path(File.dirname(__FILE__)), '../../..', 'test_helper.rb')
|
2
|
+
require 'rbbt/util/R/eval'
|
3
|
+
|
4
|
+
class TestREval < Test::Unit::TestCase
|
5
|
+
def test_get
|
6
|
+
Misc.benchmark(100) do
|
7
|
+
a = R.eval <<-EOF
|
8
|
+
p = 12
|
9
|
+
a = p * 2
|
10
|
+
c(a)
|
11
|
+
EOF
|
12
|
+
assert_equal 12 * 2, a
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
@@ -5,7 +5,7 @@ require 'rbbt/util/misc'
|
|
5
5
|
|
6
6
|
class TestMiscPipes < Test::Unit::TestCase
|
7
7
|
|
8
|
-
def
|
8
|
+
def _test_collapse_stream
|
9
9
|
text=<<-EOF
|
10
10
|
row1 A B C
|
11
11
|
row1 a b c
|
@@ -19,7 +19,7 @@ row2 aa bb cc
|
|
19
19
|
assert_equal ["BB", "bb"], tsv["row2"][1]
|
20
20
|
end
|
21
21
|
|
22
|
-
def
|
22
|
+
def _test_paste_stream
|
23
23
|
text1=<<-EOF
|
24
24
|
row1 A B C
|
25
25
|
row2 AA BB CC
|
@@ -46,7 +46,7 @@ row3 ccc
|
|
46
46
|
assert_equal ["AAA", "BBB", "CCC", "", "", "ccc"], tsv["row3"]
|
47
47
|
end
|
48
48
|
|
49
|
-
def
|
49
|
+
def _test_sort_stream
|
50
50
|
text =<<-EOF
|
51
51
|
#: :sep=" "
|
52
52
|
#Row LabelA LabelB LabelC
|
@@ -69,10 +69,19 @@ row3 AAA BBB CCC
|
|
69
69
|
row1 A B C
|
70
70
|
EOF
|
71
71
|
|
72
|
+
text = text * 10000
|
72
73
|
TmpFile.with_file(text) do |tmp|
|
73
74
|
io = Open.open(tmp)
|
74
75
|
dup = Misc.dup_stream(io)
|
76
|
+
Misc.consume_stream io, true
|
75
77
|
assert_equal text, dup.read
|
78
|
+
end
|
79
|
+
|
80
|
+
|
81
|
+
TmpFile.with_file(text) do |tmp|
|
82
|
+
io = Open.open(tmp)
|
83
|
+
dup = Misc.dup_stream(io)
|
84
|
+
Misc.consume_stream dup, true
|
76
85
|
assert_equal text, io.read
|
77
86
|
end
|
78
87
|
end
|
data/test/rbbt/util/test_R.rb
CHANGED
@@ -18,5 +18,13 @@ data = data + 1
|
|
18
18
|
tsv = TSV.setup({"a" => [1], "b" => [2]}, :type => :list, :key_field => "Letter", :fields => ["Number"])
|
19
19
|
assert tsv.transpose("Field").include? "Number"
|
20
20
|
end
|
21
|
+
|
22
|
+
def test_error
|
23
|
+
assert_raise ProcessFailed do
|
24
|
+
R.run <<-EOF
|
25
|
+
fadsfasdf
|
26
|
+
EOF
|
27
|
+
end
|
28
|
+
end
|
21
29
|
end
|
22
30
|
|
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.13.
|
4
|
+
version: 5.13.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Miguel Vazquez
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-05-
|
11
|
+
date: 2014-05-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -161,6 +161,7 @@ files:
|
|
161
161
|
- lib/rbbt/tsv/stream.rb
|
162
162
|
- lib/rbbt/tsv/util.rb
|
163
163
|
- lib/rbbt/util/R.rb
|
164
|
+
- lib/rbbt/util/R/eval.rb
|
164
165
|
- lib/rbbt/util/chain_methods.rb
|
165
166
|
- lib/rbbt/util/cmd.rb
|
166
167
|
- lib/rbbt/util/color.rb
|
@@ -250,6 +251,7 @@ files:
|
|
250
251
|
- share/rbbt_commands/tsv/info
|
251
252
|
- share/rbbt_commands/tsv/json
|
252
253
|
- share/rbbt_commands/tsv/slice
|
254
|
+
- share/rbbt_commands/tsv/sort
|
253
255
|
- share/rbbt_commands/tsv/subset
|
254
256
|
- share/rbbt_commands/tsv/unzip
|
255
257
|
- share/rbbt_commands/tsv/values
|
@@ -299,6 +301,7 @@ files:
|
|
299
301
|
- test/rbbt/tsv/test_parser.rb
|
300
302
|
- test/rbbt/tsv/test_stream.rb
|
301
303
|
- test/rbbt/tsv/test_util.rb
|
304
|
+
- test/rbbt/util/R/test_eval.rb
|
302
305
|
- test/rbbt/util/concurrency/processes/test_socket.rb
|
303
306
|
- test/rbbt/util/concurrency/test_processes.rb
|
304
307
|
- test/rbbt/util/concurrency/test_threads.rb
|
@@ -374,6 +377,7 @@ test_files:
|
|
374
377
|
- test/rbbt/util/test_semaphore.rb
|
375
378
|
- test/rbbt/util/test_misc.rb
|
376
379
|
- test/rbbt/util/test_tmpfile.rb
|
380
|
+
- test/rbbt/util/R/test_eval.rb
|
377
381
|
- test/rbbt/test_association.rb
|
378
382
|
- test/rbbt/test_resource.rb
|
379
383
|
- test/rbbt/test_entity.rb
|