rbbt-util 5.34.4 → 5.34.5
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/association/database.rb +4 -0
- data/lib/rbbt/resource/rake.rb +9 -3
- data/lib/rbbt/resource/util.rb +8 -3
- data/lib/rbbt/resource.rb +1 -1
- data/lib/rbbt/tsv/change_id.rb +1 -1
- data/lib/rbbt/tsv/parser.rb +6 -4
- data/lib/rbbt/util/misc/inspect.rb +4 -2
- data/lib/rbbt/util/misc/omics.rb +1 -1
- data/lib/rbbt/util/python.rb +1 -0
- data/lib/rbbt/workflow/remote_workflow/driver/ssh.rb +5 -0
- data/lib/rbbt/workflow/remote_workflow/remote_step/ssh.rb +9 -11
- data/lib/rbbt/workflow/step/save_load_inputs.rb +16 -5
- data/lib/rbbt/workflow/step.rb +1 -1
- data/lib/rbbt/workflow/util/archive.rb +4 -0
- data/lib/rbbt/workflow/util/provenance.rb +1 -1
- data/share/Rlib/util.R +8 -2
- data/share/rbbt_commands/tsv/view +76 -0
- data/test/rbbt/test_resource.rb +14 -4
- metadata +3 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: '073587b420676db7c055e58dbabaecbf04a7b30ba9d7ea912f1c12df5a6d180d'
|
|
4
|
+
data.tar.gz: 6d263d07b85095fefb48c15692af0db66b56ef671ada83e98c66a4765d4ca416
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 945c0f4b9d6f99024f6610dc2eb0c52c6546606937fff72558281ecf5d2aaddeb2e32ce3373b9348fa764e8e7285cdcdad6916118ba259d61c24b4b3477e3317
|
|
7
|
+
data.tar.gz: a8ba069b626b1a09d6da8e73eaa901119795ade4b4af33f1891b8581cfe80ccf48ca439a6a96b67f45e6bdf687ba7e90df263b8b4caabec18af45f6008e2b5d9
|
|
@@ -162,6 +162,10 @@ module Association
|
|
|
162
162
|
|
|
163
163
|
data ||= {}
|
|
164
164
|
tsv = nil
|
|
165
|
+
if data.respond_to?(:close) && data.respond_to?(:write)
|
|
166
|
+
data.close
|
|
167
|
+
data.write
|
|
168
|
+
end
|
|
165
169
|
TmpFile.with_file do |tmpfile|
|
|
166
170
|
tmp_data = Persist.open_database(tmpfile, true, open_options[:type], "HDB")
|
|
167
171
|
|
data/lib/rbbt/resource/rake.rb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
require 'rake'
|
|
2
2
|
module Rake
|
|
3
3
|
class TaskNotFound < StandardError; end
|
|
4
|
-
def self.run(rakefile, dir, task)
|
|
4
|
+
def self.run(rakefile, dir, task, &block)
|
|
5
5
|
old_pwd = FileUtils.pwd
|
|
6
6
|
|
|
7
7
|
Rake::FileTask.module_eval do
|
|
@@ -32,9 +32,15 @@ module Rake
|
|
|
32
32
|
t = nil
|
|
33
33
|
pid = Process.fork{
|
|
34
34
|
if block_given?
|
|
35
|
-
|
|
35
|
+
TOPLEVEL_BINDING.receiver.instance_exec &block
|
|
36
36
|
else
|
|
37
|
-
|
|
37
|
+
if Misc.is_filename? rakefile
|
|
38
|
+
load rakefile
|
|
39
|
+
else
|
|
40
|
+
TmpFile.with_file(rakefile) do |tmpfile|
|
|
41
|
+
load tmpfile
|
|
42
|
+
end
|
|
43
|
+
end
|
|
38
44
|
end
|
|
39
45
|
|
|
40
46
|
raise TaskNotFound if Rake::Task[task].nil?
|
data/lib/rbbt/resource/util.rb
CHANGED
|
@@ -123,8 +123,8 @@ module Resource
|
|
|
123
123
|
|
|
124
124
|
|
|
125
125
|
def rake_for(path)
|
|
126
|
-
@rake_dirs.
|
|
127
|
-
|
|
126
|
+
@rake_dirs.select{|dir, content|
|
|
127
|
+
Misc.common_path(dir, path)
|
|
128
128
|
}.sort_by{|dir, content|
|
|
129
129
|
dir.length
|
|
130
130
|
}.last
|
|
@@ -137,12 +137,17 @@ module Resource
|
|
|
137
137
|
def run_rake(path, rakefile, rake_dir)
|
|
138
138
|
task = Misc.path_relative_to rake_dir, path
|
|
139
139
|
rakefile = rakefile.produce if rakefile.respond_to? :produce
|
|
140
|
+
rakefile = rakefile.find if rakefile.respond_to? :find
|
|
140
141
|
|
|
141
142
|
rake_dir = rake_dir.find(:user) if rake_dir.respond_to? :find
|
|
142
143
|
|
|
143
144
|
begin
|
|
144
145
|
require 'rbbt/resource/rake'
|
|
145
|
-
|
|
146
|
+
if Proc === rakefile
|
|
147
|
+
Rake.run(nil, rake_dir, task, &rakefile)
|
|
148
|
+
else
|
|
149
|
+
Rake.run(rakefile, rake_dir, task)
|
|
150
|
+
end
|
|
146
151
|
rescue Rake::TaskNotFound
|
|
147
152
|
raise $! if rake_dir.nil? or rake_dir.empty? or rake_dir == "/" or rake_dir == "./"
|
|
148
153
|
task = File.join(File.basename(rake_dir), task)
|
data/lib/rbbt/resource.rb
CHANGED
data/lib/rbbt/tsv/change_id.rb
CHANGED
data/lib/rbbt/tsv/parser.rb
CHANGED
|
@@ -8,7 +8,9 @@ module TSV
|
|
|
8
8
|
|
|
9
9
|
def all_fields
|
|
10
10
|
all = [key_field] + fields
|
|
11
|
-
|
|
11
|
+
# ToDo: What was this for?
|
|
12
|
+
#NamedArray.setup all, all
|
|
13
|
+
all
|
|
12
14
|
end
|
|
13
15
|
|
|
14
16
|
def parse_header(stream)
|
|
@@ -550,12 +552,12 @@ module TSV
|
|
|
550
552
|
line = self.rescue_first_line
|
|
551
553
|
line = stream.gets if line.nil?
|
|
552
554
|
|
|
553
|
-
if @tsv_grep
|
|
555
|
+
if @tsv_grep || grep
|
|
554
556
|
|
|
555
|
-
stream = Open.grep(stream, @tsv_grep, invert_grep, fixed_grep)
|
|
557
|
+
stream = Open.grep(stream, @tsv_grep || grep, invert_grep, fixed_grep)
|
|
556
558
|
stream.no_fail = true
|
|
557
559
|
begin
|
|
558
|
-
match = Open.grep(StringIO.new(line), @tsv_grep, invert_grep, fixed_grep).read
|
|
560
|
+
match = Open.grep(StringIO.new(line), @tsv_grep || grep, invert_grep, fixed_grep).read
|
|
559
561
|
line = stream.gets if match.empty?
|
|
560
562
|
rescue Exception
|
|
561
563
|
Log.exception $!
|
|
@@ -72,7 +72,9 @@ module Misc
|
|
|
72
72
|
when File
|
|
73
73
|
"<File:" + obj.path + ">"
|
|
74
74
|
when NamedArray
|
|
75
|
-
|
|
75
|
+
fields = obj.fields
|
|
76
|
+
fields = fields.collect if NamedArray === fields
|
|
77
|
+
"[<NamedArray: fields=#{fingerprint fields} -- values=#{fingerprint obj[0..-1]}]"
|
|
76
78
|
when Array
|
|
77
79
|
if (length = obj.length) > 10
|
|
78
80
|
"[#{length}--" << (obj.values_at(0,1, length / 2, -2, -1).collect{|e| fingerprint(e)} * ",") << "]"
|
|
@@ -299,7 +301,7 @@ module Misc
|
|
|
299
301
|
when nil
|
|
300
302
|
'nil'
|
|
301
303
|
when Numeric
|
|
302
|
-
obj.
|
|
304
|
+
Float === obj && obj % 1 == 0 ? obj.to_i.to_s : obj.to_s
|
|
303
305
|
when Symbol
|
|
304
306
|
obj.to_s
|
|
305
307
|
when TrueClass
|
data/lib/rbbt/util/misc/omics.rb
CHANGED
data/lib/rbbt/util/python.rb
CHANGED
|
@@ -148,6 +148,11 @@ job.clean
|
|
|
148
148
|
def self.upload_inputs(server, inputs, input_types, input_id)
|
|
149
149
|
TmpFile.with_file do |dir|
|
|
150
150
|
if Step.save_inputs(inputs, input_types, dir)
|
|
151
|
+
Dir.glob(File.join(dir, "*.as_step")).each do |file|
|
|
152
|
+
path = Open.read(file).strip
|
|
153
|
+
new = Step.migrate(path, :user, :target => server)
|
|
154
|
+
Open.write(file, new)
|
|
155
|
+
end
|
|
151
156
|
CMD.cmd("ssh '#{server}' mkdir -p .rbbt/tmp/tmp-ssh_job_inputs/; scp -r '#{dir}' #{server}:.rbbt/tmp/tmp-ssh_job_inputs/#{input_id}")
|
|
152
157
|
end
|
|
153
158
|
end
|
|
@@ -3,6 +3,7 @@ class RemoteStep
|
|
|
3
3
|
attr_accessor :override_dependencies
|
|
4
4
|
|
|
5
5
|
def init_job(cache_type = nil, other_params = {})
|
|
6
|
+
return self if @url
|
|
6
7
|
cache_type = :asynchronous if cache_type.nil? and not @is_exec
|
|
7
8
|
cache_type = :exec if cache_type.nil?
|
|
8
9
|
@last_info_time = nil
|
|
@@ -10,20 +11,17 @@ class RemoteStep
|
|
|
10
11
|
@server, @server_path = RemoteWorkflow::SSH.parse_url base_url
|
|
11
12
|
@input_id ||= "inputs-" << rand(100000).to_s
|
|
12
13
|
|
|
13
|
-
if override_dependencies
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
name, _sep, value = od.partition("=")
|
|
18
|
-
inputs[name] = value
|
|
19
|
-
end
|
|
14
|
+
if override_dependencies && override_dependencies.any?
|
|
15
|
+
override_dependencies.each do |od|
|
|
16
|
+
name, _sep, value = od.partition("=")
|
|
17
|
+
inputs[name] = value
|
|
20
18
|
end
|
|
21
|
-
|
|
22
|
-
RemoteWorkflow::SSH.upload_inputs(@server, inputs, @input_types, @input_id)
|
|
23
|
-
else
|
|
24
|
-
RemoteWorkflow::SSH.upload_inputs(@server, inputs, @input_types, @input_id)
|
|
25
19
|
end
|
|
26
20
|
|
|
21
|
+
inputs.select{|i| Step === i }.each{|i| i.produce }
|
|
22
|
+
|
|
23
|
+
RemoteWorkflow::SSH.upload_inputs(@server, inputs, @input_types, @input_id)
|
|
24
|
+
|
|
27
25
|
@name ||= Persist.memory("RemoteSteps", :workflow => self, :task => task, :jobname => @name, :inputs => inputs, :cache_type => cache_type) do
|
|
28
26
|
Misc.insist do
|
|
29
27
|
input_types = {}
|
|
@@ -51,8 +51,8 @@ module Workflow
|
|
|
51
51
|
when :path
|
|
52
52
|
inputs[input.to_sym] = Open.read(file).strip.split("\n").first
|
|
53
53
|
when :io
|
|
54
|
-
inputs[input.to_sym] = Open.open(Open.realpath(file))
|
|
55
|
-
when :
|
|
54
|
+
inputs[input.to_sym] = Open.open(Open.realpath(file))
|
|
55
|
+
when :io_array
|
|
56
56
|
inputs[input.to_sym] = Open.realpath(file).split("\n").collect{|f| Open.open(f)}
|
|
57
57
|
when :step_array
|
|
58
58
|
steps = Open.read(file).strip.split("\n").collect{|path| Workflow.load_step(path) }
|
|
@@ -97,6 +97,10 @@ module Workflow
|
|
|
97
97
|
inputs[input.to_sym] = TSV.open(file)
|
|
98
98
|
when :boolean
|
|
99
99
|
inputs[input.to_sym] = (file.read.strip == 'true')
|
|
100
|
+
when :integer
|
|
101
|
+
inputs[input.to_sym] = file.read.to_i
|
|
102
|
+
when :float
|
|
103
|
+
inputs[input.to_sym] = file.read.to_f
|
|
100
104
|
else
|
|
101
105
|
Log.debug "Loading #{ input } from #{file}"
|
|
102
106
|
inputs[input.to_sym] = file.read.strip
|
|
@@ -172,10 +176,17 @@ class Step
|
|
|
172
176
|
end
|
|
173
177
|
|
|
174
178
|
Log.debug "Saving job input #{name} (#{type}) into #{path}"
|
|
175
|
-
|
|
179
|
+
|
|
180
|
+
if value.respond_to? :filename
|
|
181
|
+
Open.write(path, value.filename)
|
|
182
|
+
elsif IO === value
|
|
183
|
+
Open.write(path, value)
|
|
184
|
+
else
|
|
185
|
+
Open.write(path, value.to_s)
|
|
186
|
+
end
|
|
176
187
|
end
|
|
177
188
|
|
|
178
|
-
def self.save_inputs(inputs, input_types,
|
|
189
|
+
def self.save_inputs(inputs, input_types, dir)
|
|
179
190
|
inputs.each do |name,value|
|
|
180
191
|
type = input_types[name]
|
|
181
192
|
type = type.to_s if type
|
|
@@ -220,7 +231,7 @@ class Step
|
|
|
220
231
|
input_types = IndiferentHash.setup(input_types.merge(:override_dependencies => :array))
|
|
221
232
|
end
|
|
222
233
|
|
|
223
|
-
save_inputs(inputs, input_types,
|
|
234
|
+
save_inputs(inputs, input_types, dir)
|
|
224
235
|
|
|
225
236
|
inputs.keys
|
|
226
237
|
end
|
data/lib/rbbt/workflow/step.rb
CHANGED
|
@@ -184,9 +184,13 @@ puts files * "\n"
|
|
|
184
184
|
|
|
185
185
|
target = Rbbt.migrate_target_path('var/jobs', search_path, resource, options[:target])
|
|
186
186
|
|
|
187
|
+
target_path = File.join(target, *path.split("/")[-3..-1])
|
|
188
|
+
|
|
187
189
|
subpath_files.each do |subpath, files|
|
|
188
190
|
Rbbt.migrate_files([subpath], target, options.merge(:files => files))
|
|
189
191
|
end
|
|
192
|
+
|
|
193
|
+
target_path
|
|
190
194
|
end
|
|
191
195
|
|
|
192
196
|
def self.purge(path, recursive = false, skip_overriden = true)
|
data/share/Rlib/util.R
CHANGED
|
@@ -232,20 +232,26 @@ rbbt.tsv2tibble <- function(data){
|
|
|
232
232
|
as_tibble(data, rownames=attr(data, 'key.field'))
|
|
233
233
|
}
|
|
234
234
|
|
|
235
|
-
rbbt.tsv.write <- function(filename, data, key.field = NULL, extra_headers = NULL, eol="\n", ...){
|
|
235
|
+
rbbt.tsv.write <- function(filename, data, key.field = NULL, extra_headers = NULL, eol="\n", type = 'list', names = NULL, ...){
|
|
236
236
|
|
|
237
237
|
if (is.null(key.field)){ key.field = attributes(data)$key.field;}
|
|
238
238
|
if (is.null(key.field)){ key.field = "ID";}
|
|
239
239
|
|
|
240
240
|
f = file(filename, 'wb');
|
|
241
241
|
|
|
242
|
+
if (is.null(extra_headers)){
|
|
243
|
+
extra_headers = paste(":type",type,sep="=")
|
|
244
|
+
}
|
|
245
|
+
|
|
242
246
|
if (!is.null(extra_headers)){
|
|
243
247
|
extra_headers = paste("#: ", extra_headers, "\n", sep="");
|
|
244
248
|
cat(extra_headers, file=f);
|
|
245
249
|
}
|
|
246
250
|
|
|
247
251
|
header = paste("#", key.field, sep="");
|
|
248
|
-
|
|
252
|
+
if (is.null(names)){ names = colnames(data)}
|
|
253
|
+
if (is.null(names)){ names = names(data)}
|
|
254
|
+
for (name in names){ header = paste(header, name, sep="\t");}
|
|
249
255
|
header = paste(header, "\n", sep="");
|
|
250
256
|
cat(header, file=f);
|
|
251
257
|
|
|
@@ -0,0 +1,76 @@
|
|
|
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
|
+
|
|
10
|
+
View TSV nicer
|
|
11
|
+
|
|
12
|
+
$ #{$0} [options] <filename.tsv|->
|
|
13
|
+
|
|
14
|
+
Use - to read from STDIN
|
|
15
|
+
|
|
16
|
+
-h--help Print this help
|
|
17
|
+
|
|
18
|
+
EOF
|
|
19
|
+
if options[:help]
|
|
20
|
+
if defined? rbbt_usage
|
|
21
|
+
rbbt_usage
|
|
22
|
+
else
|
|
23
|
+
puts SOPT.doc
|
|
24
|
+
end
|
|
25
|
+
exit 0
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
file = ARGV.shift
|
|
30
|
+
|
|
31
|
+
file = STDIN if file == '-'
|
|
32
|
+
|
|
33
|
+
case
|
|
34
|
+
when options[:tokyocabinet]
|
|
35
|
+
tsv = Persist.open_tokyocabinet(file, false)
|
|
36
|
+
when options[:tokyocabinet_bd]
|
|
37
|
+
tsv = Persist.open_tokyocabinet(file, false, nil, TokyoCabinet::BDB)
|
|
38
|
+
else
|
|
39
|
+
if String === file
|
|
40
|
+
file = file.dup
|
|
41
|
+
Path.setup(File.expand_path(file))
|
|
42
|
+
end
|
|
43
|
+
tsv = file
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
tsv = TSV.open(tsv) if IO === tsv
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
begin
|
|
50
|
+
Workflow.require_workflow "Genomics"
|
|
51
|
+
tsv = Genomics.job(:names, nil, :tsv => tsv).run
|
|
52
|
+
rescue
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
puts [Log.highlight(Log.color(:magenta, tsv.key_field)), Log.color(:yellow, tsv.fields * "\t")] * "\t"
|
|
56
|
+
TSV.traverse tsv do |k,values,fields|
|
|
57
|
+
fvalues = values.zip(fields).collect do |v,field|
|
|
58
|
+
if String === v
|
|
59
|
+
v = v.to_f.round(2) if v =~ /^-?\d+\.\d+$/
|
|
60
|
+
v = v.to_i if v =~ /^-?\d+$/
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
if Numeric === v
|
|
64
|
+
if field =~ /p.?value/i
|
|
65
|
+
v = v.round(4)
|
|
66
|
+
v < 0.05 ? Log.color(:cyan, v.to_s) : v
|
|
67
|
+
else
|
|
68
|
+
v = v.round(2)
|
|
69
|
+
v < 0 ? Log.color(:red, v.to_s) : Log.color(:green, v.to_s)
|
|
70
|
+
end
|
|
71
|
+
else
|
|
72
|
+
v
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
puts [Log.color(:magenta, k), fvalues] * "\t"
|
|
76
|
+
end
|
data/test/rbbt/test_resource.rb
CHANGED
|
@@ -17,9 +17,18 @@ module TestResource
|
|
|
17
17
|
file 'foo' do |t|
|
|
18
18
|
Open.write(t.name, "TEST")
|
|
19
19
|
end
|
|
20
|
+
|
|
21
|
+
rule /.*/ do |t|
|
|
22
|
+
Open.write(t.name, "bar")
|
|
23
|
+
end
|
|
20
24
|
EOF
|
|
21
25
|
|
|
22
|
-
claim tmp.test.work.footest, :rake, tmp.test.rakefiles.foo
|
|
26
|
+
claim tmp.test.work.footest, :rake, TestResource.tmp.test.rakefiles.foo
|
|
27
|
+
|
|
28
|
+
claim tmp.test.work.file_proc, :file_proc do |file,filename|
|
|
29
|
+
Open.write(filename, file)
|
|
30
|
+
nil
|
|
31
|
+
end
|
|
23
32
|
end
|
|
24
33
|
|
|
25
34
|
class TestTSV < Test::Unit::TestCase
|
|
@@ -33,11 +42,12 @@ class TestTSV < Test::Unit::TestCase
|
|
|
33
42
|
assert TSV === TestResource.tmp.test.test_tsv.tsv
|
|
34
43
|
end
|
|
35
44
|
|
|
36
|
-
def
|
|
37
|
-
TestResource.tmp.test.work.footest.foo.read
|
|
38
|
-
|
|
45
|
+
def test_rake
|
|
46
|
+
assert_equal TestResource.tmp.test.work.footest.foo.read, "TEST"
|
|
47
|
+
assert_equal TestResource.tmp.test.work.footest.bar.read, "bar"
|
|
39
48
|
end
|
|
40
49
|
|
|
50
|
+
|
|
41
51
|
def test_proc
|
|
42
52
|
assert TestResource.tmp.test.proc.read == "PROC TEST"
|
|
43
53
|
end
|
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.34.
|
|
4
|
+
version: 5.34.5
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Miguel Vazquez
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2022-07-
|
|
11
|
+
date: 2022-07-20 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rake
|
|
@@ -459,6 +459,7 @@ files:
|
|
|
459
459
|
- share/rbbt_commands/tsv/uncollapse
|
|
460
460
|
- share/rbbt_commands/tsv/unzip
|
|
461
461
|
- share/rbbt_commands/tsv/values
|
|
462
|
+
- share/rbbt_commands/tsv/view
|
|
462
463
|
- share/rbbt_commands/tsv/write_excel
|
|
463
464
|
- share/rbbt_commands/tsv/zip
|
|
464
465
|
- share/rbbt_commands/watch
|