rbbt-util 5.28.2 → 5.28.8
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/hpc.rb +5 -2
- data/lib/rbbt/persist.rb +1 -0
- data/lib/rbbt/resource/path.rb +3 -1
- data/lib/rbbt/tsv/accessor.rb +10 -2
- data/lib/rbbt/tsv/change_id.rb +2 -2
- data/lib/rbbt/tsv/dumper.rb +10 -2
- data/lib/rbbt/tsv/parallel/traverse.rb +3 -0
- data/lib/rbbt/tsv/util.rb +25 -13
- data/lib/rbbt/util/config.rb +2 -1
- data/lib/rbbt/util/misc/inspect.rb +1 -1
- data/lib/rbbt/util/misc/system.rb +1 -1
- data/lib/rbbt/util/open.rb +1 -1
- data/lib/rbbt/workflow.rb +1 -0
- data/lib/rbbt/workflow/accessor.rb +94 -93
- data/lib/rbbt/workflow/definition.rb +6 -3
- data/lib/rbbt/workflow/integration/cromwell.rb +10 -3
- data/lib/rbbt/workflow/remote_workflow/driver/rest.rb +5 -1
- data/lib/rbbt/workflow/step.rb +17 -5
- data/lib/rbbt/workflow/step/accessor.rb +9 -6
- data/lib/rbbt/workflow/usage.rb +1 -1
- data/lib/rbbt/workflow/util/archive.rb +1 -0
- data/lib/rbbt/workflow/util/orchestrator.rb +190 -0
- data/lib/rbbt/workflow/util/trace.rb +182 -0
- data/share/rbbt_commands/app/start +2 -2
- data/share/rbbt_commands/purge_job +2 -4
- data/share/rbbt_commands/system/status +1 -1
- data/share/rbbt_commands/workflow/forget_deps +1 -3
- data/share/rbbt_commands/workflow/server +2 -0
- data/test/rbbt/tsv/parallel/test_traverse.rb +14 -0
- data/test/rbbt/tsv/test_manipulate.rb +20 -0
- data/test/rbbt/workflow/test_schedule.rb +0 -0
- data/test/rbbt/workflow/util/test_orchestrator.rb +136 -0
- metadata +8 -3
- data/lib/rbbt/workflow/schedule.rb +0 -238
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 4d77757da0912cd41138ff33b99e19b7ffa1449be515fb7a8742f9d69c134ffd
|
|
4
|
+
data.tar.gz: 1edb139f92881591bbac18692dc6a0a739be9dfe0a820a4db2cffd30079fc328
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2219bd7152eda55f2c3c9b1e5d10d9593dd29232e7e77fe0707496031030455663983256930f35c2bcabd8b80e15c05d99f3bcdc9644135ee4a75d0267334c33
|
|
7
|
+
data.tar.gz: e4021aab6574fc10e960eec29f630075c8e95b27d6648ba47e1f76ecbf1a12b84a5859ad7b61ffde8591466ddcfec8ee5cfd27f6f82997648d712225ac099e1b
|
data/lib/rbbt/hpc.rb
CHANGED
|
@@ -451,12 +451,15 @@ EOF
|
|
|
451
451
|
out = CMD.cmd("tail -f '#{fout}'", :pipe => true) if File.exists?(fout) and not tail == :STDERR
|
|
452
452
|
err = CMD.cmd("tail -f '#{ferr}'", :pipe => true) if File.exists?(ferr)
|
|
453
453
|
|
|
454
|
-
Misc.consume_stream(err, true, STDERR) if err
|
|
455
|
-
Misc.consume_stream(out, true, STDOUT) if out
|
|
454
|
+
terr = Misc.consume_stream(err, true, STDERR) if err
|
|
455
|
+
tout = Misc.consume_stream(out, true, STDOUT) if out
|
|
456
456
|
|
|
457
457
|
sleep 3 while CMD.cmd("squeue --job #{job}").read.include? job.to_s
|
|
458
|
+
rescue Aborted
|
|
458
459
|
ensure
|
|
459
460
|
begin
|
|
461
|
+
terr.exit if terr
|
|
462
|
+
tout.exit if tout
|
|
460
463
|
err.close if err
|
|
461
464
|
err.join if err
|
|
462
465
|
rescue Exception
|
data/lib/rbbt/persist.rb
CHANGED
data/lib/rbbt/resource/path.rb
CHANGED
|
@@ -412,7 +412,9 @@ module Path
|
|
|
412
412
|
end
|
|
413
413
|
|
|
414
414
|
def replace_extension(new_extension = nil, multiple = false)
|
|
415
|
-
if multiple
|
|
415
|
+
if String === multiple
|
|
416
|
+
new_path = self.sub(/(\.[^\.\/]{1,5})(.#{multiple})?$/,'')
|
|
417
|
+
elsif multiple
|
|
416
418
|
new_path = self.sub(/(\.[^\.\/]{1,5})+$/,'')
|
|
417
419
|
else
|
|
418
420
|
new_path = self.sub(/\.[^\.\/]{1,5}$/,'')
|
data/lib/rbbt/tsv/accessor.rb
CHANGED
|
@@ -550,9 +550,17 @@ module TSV
|
|
|
550
550
|
"\t" << ([""] * fields.length) * "\t" << "\n"
|
|
551
551
|
end
|
|
552
552
|
when Array
|
|
553
|
-
|
|
553
|
+
if fields.nil? or fields.empty?
|
|
554
|
+
"\n"
|
|
555
|
+
else
|
|
556
|
+
"\t" << values.collect{|v| Array === v ? v * "|" : v} * "\t" << "\n"
|
|
557
|
+
end
|
|
554
558
|
else
|
|
555
|
-
|
|
559
|
+
if fields.nil? or fields.empty?
|
|
560
|
+
"\n"
|
|
561
|
+
else
|
|
562
|
+
"\t" << values.to_s << "\n"
|
|
563
|
+
end
|
|
556
564
|
end
|
|
557
565
|
end
|
|
558
566
|
|
data/lib/rbbt/tsv/change_id.rb
CHANGED
|
@@ -58,13 +58,13 @@ module TSV
|
|
|
58
58
|
|
|
59
59
|
identifiers, persist_input, compact = Misc.process_options options, :identifiers, :persist, :compact
|
|
60
60
|
identifiers = tsv.identifier_files.first if identifiers.nil?
|
|
61
|
-
identifiers = Organism.identifiers(tsv.namespace) if identifiers.nil?
|
|
61
|
+
identifiers = Organism.identifiers(tsv.namespace) if defined?(Organism) && identifiers.nil? && tsv.namespace && Organism.identifiers(tsv.namespace).exists?
|
|
62
62
|
identifiers.namespace ||= tsv.namespace
|
|
63
63
|
|
|
64
64
|
fields = (identifiers and identifiers.all_fields.include?(field))? [field] : nil
|
|
65
65
|
#index = identifiers.index :target => format, :fields => fields, :persist => persist_input, :order => true
|
|
66
66
|
|
|
67
|
-
grep = Organism.blacklist_genes(tsv.namespace).list if identifiers.namespace
|
|
67
|
+
grep = Organism.blacklist_genes(tsv.namespace).list if defined?(Organism) && identifiers.namespace && Organism.blacklist_genes(tsv.namespace).exists?
|
|
68
68
|
if fields.nil?
|
|
69
69
|
index = identifiers.index(:data_tsv_grep => grep, :data_invert_grep => true, :target => format, :persist => true, :order => true, :unnamed => true, :data_persist => true)
|
|
70
70
|
else
|
data/lib/rbbt/tsv/dumper.rb
CHANGED
|
@@ -32,9 +32,17 @@ module TSV
|
|
|
32
32
|
sep + ([""] * fields.length) * sep << "\n"
|
|
33
33
|
end
|
|
34
34
|
when Array
|
|
35
|
-
|
|
35
|
+
if fields.nil? or fields.empty?
|
|
36
|
+
"\n"
|
|
37
|
+
else
|
|
38
|
+
sep + (values.collect{|v| Array === v ? v * "|" : v} * sep) << "\n"
|
|
39
|
+
end
|
|
36
40
|
else
|
|
37
|
-
|
|
41
|
+
if fields.nil? or fields.empty?
|
|
42
|
+
"\n"
|
|
43
|
+
else
|
|
44
|
+
sep + values.to_s << "\n"
|
|
45
|
+
end
|
|
38
46
|
end
|
|
39
47
|
end
|
|
40
48
|
|
|
@@ -377,6 +377,7 @@ module TSV
|
|
|
377
377
|
obj.run(true) unless obj.done? || obj.started? || obj.result
|
|
378
378
|
|
|
379
379
|
stream = obj.get_stream
|
|
380
|
+
options = {:type => :array}.merge(options) if obj.result_type == :array
|
|
380
381
|
|
|
381
382
|
if stream
|
|
382
383
|
traverse_obj(stream, options, &block)
|
|
@@ -623,6 +624,8 @@ module TSV
|
|
|
623
624
|
def self.traverse(obj, options = {}, &block)
|
|
624
625
|
into = options[:into]
|
|
625
626
|
|
|
627
|
+
into = options[:into] = Open.open(into, :mode => "w") if Misc.is_filename?(into)
|
|
628
|
+
|
|
626
629
|
case into
|
|
627
630
|
when :stream
|
|
628
631
|
sout = Misc.open_pipe false, false do |sin|
|
data/lib/rbbt/tsv/util.rb
CHANGED
|
@@ -184,7 +184,11 @@ module TSV
|
|
|
184
184
|
str = ""
|
|
185
185
|
str << preamble.strip << "\n" if preamble and not preamble.empty?
|
|
186
186
|
if fields
|
|
187
|
-
|
|
187
|
+
if fields.empty?
|
|
188
|
+
str << header_hash << (key_field || "ID").to_s << "\n"
|
|
189
|
+
else
|
|
190
|
+
str << header_hash << (key_field || "ID").to_s << sep << (fields * sep) << "\n"
|
|
191
|
+
end
|
|
188
192
|
end
|
|
189
193
|
|
|
190
194
|
str
|
|
@@ -316,22 +320,30 @@ module TSV
|
|
|
316
320
|
|
|
317
321
|
def to_single
|
|
318
322
|
new = {}
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
through do |k,v|
|
|
322
|
-
new[k] = v.first.first
|
|
323
|
-
end
|
|
324
|
-
when :flat
|
|
323
|
+
|
|
324
|
+
if block_given?
|
|
325
325
|
through do |k,v|
|
|
326
|
-
new[k] = v
|
|
326
|
+
new[k] = yield v
|
|
327
327
|
end
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
328
|
+
else
|
|
329
|
+
case type
|
|
330
|
+
when :double
|
|
331
|
+
through do |k,v|
|
|
332
|
+
new[k] = v.first.first
|
|
333
|
+
end
|
|
334
|
+
when :flat
|
|
335
|
+
through do |k,v|
|
|
336
|
+
new[k] = v.first
|
|
337
|
+
end
|
|
338
|
+
when :single
|
|
339
|
+
return self
|
|
340
|
+
when :list
|
|
341
|
+
through do |k,v|
|
|
342
|
+
new[k] = v.first
|
|
343
|
+
end
|
|
333
344
|
end
|
|
334
345
|
end
|
|
346
|
+
|
|
335
347
|
self.annotate(new)
|
|
336
348
|
new.type = :single
|
|
337
349
|
new.fields = [new.fields.first] if new.fields.length > 1
|
data/lib/rbbt/util/config.rb
CHANGED
|
@@ -15,7 +15,7 @@ module Rbbt::Config
|
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
def self.load_file(file)
|
|
18
|
-
Log.debug "Loading file: #{ file }"
|
|
18
|
+
Log.debug "Loading config file: #{ file }"
|
|
19
19
|
TSV.traverse file, :type => :array do |line|
|
|
20
20
|
next if line =~ /^#/
|
|
21
21
|
key, value, *tokens = line.strip.split(/\s/)
|
|
@@ -85,6 +85,7 @@ module Rbbt::Config
|
|
|
85
85
|
priorities
|
|
86
86
|
end
|
|
87
87
|
|
|
88
|
+
# For equal priorities the matching prioritizes tokens ealier in the list
|
|
88
89
|
def self.get(key, *tokens)
|
|
89
90
|
options = tokens.pop if Hash === tokens.last
|
|
90
91
|
default = options.nil? ? nil : options[:default]
|
|
@@ -113,7 +113,7 @@ end
|
|
|
113
113
|
end
|
|
114
114
|
|
|
115
115
|
def self.is_filename?(string)
|
|
116
|
-
return true if defined?
|
|
116
|
+
return true if defined? Path and Path === string
|
|
117
117
|
return true if string.respond_to? :exists
|
|
118
118
|
return true if String === string and string.length < 265 and File.exist?(string)
|
|
119
119
|
return false
|
data/lib/rbbt/util/open.rb
CHANGED
|
@@ -397,7 +397,7 @@ module Open
|
|
|
397
397
|
if dir_sub_path_source.nil? and dir_sub_path_target.nil?
|
|
398
398
|
FileUtils.mkdir_p File.dirname(target) unless File.exist? File.dirname(target)
|
|
399
399
|
tmp_target = File.join(File.dirname(target), '.tmp_mv.' + File.basename(target))
|
|
400
|
-
FileUtils.
|
|
400
|
+
FileUtils.cp_r source, tmp_target
|
|
401
401
|
FileUtils.mv tmp_target, target
|
|
402
402
|
return
|
|
403
403
|
end
|
data/lib/rbbt/workflow.rb
CHANGED
|
@@ -364,6 +364,7 @@ module Workflow
|
|
|
364
364
|
raise ParameterException, "Inputs #{Misc.humanize_list(missing_inputs)} are required but were not provided or are nil"
|
|
365
365
|
end
|
|
366
366
|
|
|
367
|
+
# jobname => true sets the value of the input to the name of the job
|
|
367
368
|
if task.input_options
|
|
368
369
|
jobname_input = task.input_options.select{|i,o| o[:jobname]}.collect{|i,o| i }.first
|
|
369
370
|
else
|
|
@@ -26,105 +26,106 @@ module Workflow
|
|
|
26
26
|
raise "No '#{name}' task in '#{self.to_s}' Workflow" if task.nil?
|
|
27
27
|
id = File.join(self.to_s, name.to_s)
|
|
28
28
|
@task_info ||= {}
|
|
29
|
-
@task_info[id] ||= begin
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
29
|
+
@task_info[id] ||= begin
|
|
30
|
+
description = task.description
|
|
31
|
+
result_description = task.result_description
|
|
32
|
+
result_type = task.result_type
|
|
33
|
+
inputs = rec_inputs(name).uniq
|
|
34
|
+
input_types = rec_input_types(name)
|
|
35
|
+
input_descriptions = rec_input_descriptions(name)
|
|
36
|
+
input_use = rec_input_use(name)
|
|
37
|
+
input_defaults = rec_input_defaults(name)
|
|
38
|
+
input_options = rec_input_options(name)
|
|
39
|
+
extension = task.extension
|
|
40
|
+
export = case
|
|
41
|
+
when (synchronous_exports.include?(name.to_sym) or synchronous_exports.include?(name.to_s))
|
|
42
|
+
:synchronous
|
|
43
|
+
when (asynchronous_exports.include?(name.to_sym) or asynchronous_exports.include?(name.to_s))
|
|
44
|
+
:asynchronous
|
|
45
|
+
when (exec_exports.include?(name.to_sym) or exec_exports.include?(name.to_s))
|
|
46
|
+
:exec
|
|
47
|
+
when (stream_exports.include?(name.to_sym) or stream_exports.include?(name.to_s))
|
|
48
|
+
:stream
|
|
49
|
+
else
|
|
50
|
+
:none
|
|
51
|
+
end
|
|
51
52
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
53
|
+
dependencies = task_dependencies[name].select{|dep| String === dep or Symbol === dep}
|
|
54
|
+
{ :id => id,
|
|
55
|
+
:description => description,
|
|
56
|
+
:export => export,
|
|
57
|
+
:inputs => inputs,
|
|
58
|
+
:input_types => input_types,
|
|
59
|
+
:input_descriptions => input_descriptions,
|
|
60
|
+
:input_defaults => input_defaults,
|
|
61
|
+
:input_options => input_options,
|
|
62
|
+
:input_use => input_use,
|
|
63
|
+
:result_type => result_type,
|
|
64
|
+
:result_description => result_description,
|
|
65
|
+
:dependencies => dependencies,
|
|
66
|
+
:extension => extension
|
|
67
|
+
}
|
|
68
|
+
end
|
|
68
69
|
end
|
|
69
70
|
|
|
70
71
|
def rec_dependencies(taskname)
|
|
71
72
|
@rec_dependencies ||= {}
|
|
72
73
|
@rec_dependencies[taskname] ||= begin
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
74
|
+
if task_dependencies.include? taskname
|
|
75
|
+
|
|
76
|
+
deps = task_dependencies[taskname]
|
|
77
|
+
|
|
78
|
+
#all_deps = deps.select{|dep| String === dep or Symbol === dep or Array === dep}
|
|
79
|
+
|
|
80
|
+
all_deps = []
|
|
81
|
+
deps.each do |dep|
|
|
82
|
+
if DependencyBlock === dep
|
|
83
|
+
all_deps << dep.dependency if dep.dependency
|
|
84
|
+
else
|
|
85
|
+
all_deps << dep unless Proc === dep
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
begin
|
|
89
|
+
case dep
|
|
90
|
+
when Array
|
|
91
|
+
wf, t, o = dep
|
|
92
|
+
|
|
93
|
+
wf.rec_dependencies(t.to_sym).each do |d|
|
|
94
|
+
if Array === d
|
|
95
|
+
new = d.dup
|
|
96
|
+
else
|
|
97
|
+
new = [dep.first, d]
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
if Hash === o and not o.empty?
|
|
101
|
+
if Hash === new.last
|
|
102
|
+
hash = new.last.dup
|
|
103
|
+
o.each{|k,v| hash[k] ||= v}
|
|
104
|
+
new[new.length-1] = hash
|
|
105
|
+
else
|
|
106
|
+
new.push o.dup
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
all_deps << new
|
|
111
|
+
end if wf && t
|
|
112
|
+
|
|
113
|
+
when String, Symbol
|
|
114
|
+
rec_deps = rec_dependencies(dep.to_sym)
|
|
115
|
+
all_deps.concat rec_deps
|
|
116
|
+
when DependencyBlock
|
|
117
|
+
dep = dep.dependency
|
|
118
|
+
raise TryAgain
|
|
119
|
+
end
|
|
120
|
+
rescue TryAgain
|
|
121
|
+
retry
|
|
122
|
+
end
|
|
106
123
|
end
|
|
124
|
+
all_deps.uniq
|
|
125
|
+
else
|
|
126
|
+
[]
|
|
107
127
|
end
|
|
108
|
-
|
|
109
|
-
all_deps << new
|
|
110
|
-
end if wf && t
|
|
111
|
-
|
|
112
|
-
when String, Symbol
|
|
113
|
-
rec_deps = rec_dependencies(dep.to_sym)
|
|
114
|
-
all_deps.concat rec_deps
|
|
115
|
-
when DependencyBlock
|
|
116
|
-
dep = dep.dependency
|
|
117
|
-
raise TryAgain
|
|
118
|
-
end
|
|
119
|
-
rescue TryAgain
|
|
120
|
-
retry
|
|
121
|
-
end
|
|
122
|
-
end
|
|
123
|
-
all_deps.uniq
|
|
124
|
-
else
|
|
125
|
-
[]
|
|
126
|
-
end
|
|
127
|
-
end
|
|
128
|
+
end
|
|
128
129
|
end
|
|
129
130
|
|
|
130
131
|
def task_from_dep(dep)
|
|
@@ -182,7 +183,7 @@ module Workflow
|
|
|
182
183
|
acc
|
|
183
184
|
}.tap{|h| IndiferentHash.setup(h)}
|
|
184
185
|
end
|
|
185
|
-
|
|
186
|
+
|
|
186
187
|
def rec_input_use(taskname)
|
|
187
188
|
task = task_from_dep(taskname)
|
|
188
189
|
deps = rec_dependencies(taskname)
|
|
@@ -474,7 +475,7 @@ module Workflow
|
|
|
474
475
|
else
|
|
475
476
|
workdir_find = workdir
|
|
476
477
|
end
|
|
477
|
-
|
|
478
|
+
|
|
478
479
|
workdir_find = File.expand_path(workdir_find)
|
|
479
480
|
path = File.expand_path(path)
|
|
480
481
|
dir = File.dirname(path)
|