rbbt-util 5.34.4 → 5.34.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|