rbbt-util 5.26.139 → 5.26.140

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b6c406389324efc13d24ce50fdc67600bbe0b15925817134768b8f1d3b92dabc
4
- data.tar.gz: 5a4bdab5412cfef2257dd9bc07906277c7071cd88a1560f3e8922b7c14a59abf
3
+ metadata.gz: 17c32c77d5d49d16533f6b7454312698a17b58f46c3b6c0fab860da939ecbacc
4
+ data.tar.gz: fa257ea2c8605343387cc7ac8c114cec37a5d65083886fb681d004a12c407975
5
5
  SHA512:
6
- metadata.gz: 7f5159e1708f31695bc032469e9c5eec0ae15511ac7cb12f2d1976e15ecb13abf799f6c2ee43c70b1ed6a024abbe4d1196c9ec3c17006bd8e25ddaf83ca7ac8c
7
- data.tar.gz: 9ffdb6cfd45cb919c8aaad99cd4f56c675dbedb8eae9371ef74bbd61598e5023468fc10460c6bf125d2ef47dacf41e8bae76b9bd7bf197da8182d3d7c8c189d1
6
+ metadata.gz: a4af9fec39133714dad6c3ebcb604d80e02984ba6bb3e2ced53e898e9a0624001161c8f2e7192d4ac0219994f86fcface0a934c0758368029edc0178111a2b8f
7
+ data.tar.gz: c27f66921cc667ae476ed3ed2b68a6914d76177258178075af8effb03fb390f6a3102742cf34aad9c0b4c89cbe64792f9ce29ad016500f7901699b9aa6fa7c67
data/lib/rbbt/hpc.rb CHANGED
@@ -221,13 +221,13 @@ EOF
221
221
  if contain
222
222
  singularity_exec << %( -C -H "$CONTAINER_DIR" \
223
223
  -B /scratch/tmp \
224
+ #{ group != user_group ? "-B /gpfs/projects/#{user_group}" : "" } \
225
+ -B #{scratch_group_dir} \
226
+ -B #{projects_group_dir} \
224
227
  -B "$SINGULARITY_RUBY_INLINE":"$CONTAINER_DIR/.ruby_inline":rw \
225
228
  -B ~/git:"$CONTAINER_DIR/git":ro \
226
229
  #{Open.exists?('~/.rbbt/software/opt/')? '-B ~/.rbbt/software/opt/:"/opt/":ro' : '' } \
227
230
  -B ~/.rbbt:"$CONTAINER_DIR/home/":ro \
228
- #{ group != user_group ? "-B /gpfs/projects/#{user_group}" : "" } \
229
- -B #{scratch_group_dir} \
230
- -B #{projects_group_dir} \
231
231
  "$SINGULARITY_IMG")
232
232
  exec_cmd << ' TMPDIR="$CONTAINER_DIR/.rbbt/tmp" '
233
233
  else
@@ -341,13 +341,21 @@ EOF
341
341
 
342
342
  # Write exit status to file
343
343
  echo $exit_status > #{fexit}
344
- if [ $sync_es == '0' ]; then
344
+ EOF
345
+ if sync
346
+ coda +=<<-EOF
347
+ if [ "$sync_es" == '0' ]; then
345
348
  unset sync_es
346
349
  exit $exit_status
347
350
  else
348
351
  exit $sync_es
349
352
  fi
350
353
  EOF
354
+ else
355
+ coda +=<<-EOF
356
+ exit $exit_status
357
+ EOF
358
+ end
351
359
 
352
360
  template = [header, env, prep, run, coda] * "\n"
353
361
 
@@ -15,6 +15,8 @@ module R
15
15
  sources = [:plot, :svg, options[:source]].flatten.compact
16
16
  options.delete :source
17
17
 
18
+ field_classes = options[:field_classes]
19
+
18
20
  fast = options[:fast]
19
21
 
20
22
  if fast
@@ -31,6 +33,7 @@ module R
31
33
  break
32
34
  end
33
35
  values = [values] unless Array === values
36
+
34
37
  field_classes = values.collect do |v|
35
38
  v = v.first if Array === v
36
39
  case v
@@ -49,7 +52,8 @@ module R
49
52
  else
50
53
  ":NA"
51
54
  end
52
- end
55
+ end if field_classes.nil?
56
+
53
57
  if field_classes.any?
54
58
  options[:R_open] ||= "colClasses=c('character'," + field_classes * ", " + ')'
55
59
  else
data/lib/rbbt/util/log.rb CHANGED
@@ -24,6 +24,15 @@ module Log
24
24
  names
25
25
  end
26
26
 
27
+ def self.terminal_width
28
+ 80
29
+ end
30
+
31
+ def self.compact
32
+ true
33
+ end
34
+
35
+
27
36
  def self.last_caller(stack)
28
37
  line = nil
29
38
  pos ||= 0
@@ -27,6 +27,7 @@ module Misc
27
27
 
28
28
  def self.format_paragraph(text, size = 80, indent = 0, offset = 0)
29
29
  i = 0
30
+ size = size + offset + indent
30
31
  re = /((?:\n\s*\n\s*)|(?:\n\s*(?=\*)))/
31
32
  text.split(re).collect do |paragraph|
32
33
  i += 1
@@ -23,12 +23,11 @@ module SOPT
23
23
  end
24
24
  end
25
25
 
26
- while shortcuts.include?(short) and not shortcuts[short] == long
27
- while shortcuts[short].index current * ""
28
- next_letter = chars.shift
29
- return nil if next_letter.nil?
30
- current << next_letter
31
- end
26
+ while shortcuts.include?(short) && shortcuts[short] != long
27
+ next_letter = chars.shift
28
+ next_letter = chars.shift while %w(. - _).include?(next_letter)
29
+ return nil if next_letter.nil?
30
+ current << next_letter
32
31
  short = current * ""
33
32
  end
34
33
 
@@ -0,0 +1,71 @@
1
+ module Workflow
2
+
3
+ Rbbt.claim Rbbt.software.opt.jar["cromwell.jar"], :url, "https://github.com/broadinstitute/cromwell/releases/download/48/cromwell-48.jar"
4
+ Rbbt.claim Rbbt.software.opt.jar["wdltool.jar"], :url, "https://github.com/broadinstitute/wdltool/releases/download/0.14/wdltool-0.14.jar"
5
+
6
+ def run_cromwell(file, work_dir, options = {})
7
+ jar = Rbbt.software.opt.jar["cromwell.jar"].produce.find
8
+ CMD.cmd_log("java -jar '#{jar}' run '#{file}' --workflow-root='#{work_dir}'", options.merge("add_option_dashes" => true))
9
+ end
10
+
11
+ def load_cromwell(file)
12
+ jar = Rbbt.software.opt.jar["wdltool.jar"].produce.find
13
+ inputs = JSON.load(CMD.cmd("java -jar '#{jar}' inputs '#{file}'"))
14
+
15
+ workflow_inputs = {}
16
+ inputs.each do |input,input_type|
17
+ workflow, task, input_name = input.split(".")
18
+ workflow_inputs[workflow] ||= {}
19
+
20
+ if input_name.nil?
21
+ input_name = task
22
+ else
23
+ input_name = [task, input_name] * "."
24
+ end
25
+
26
+ workflow_inputs[workflow][input_name] = input_type
27
+ end
28
+
29
+ workflow_inputs.each do |workflow,input_list|
30
+ input_list.each do |input_name,input_type|
31
+
32
+ input_type = input_type.split(" ").last.sub('?','')
33
+ input_type_fixed = case input_type
34
+ when "File", "file"
35
+ :file
36
+ when "Int"
37
+ :integer
38
+ when /Array/
39
+ :array
40
+ else
41
+ input_type.downcase.to_sym
42
+ end
43
+
44
+ desc = [workflow, input_name] * "."
45
+ default = nil
46
+ input input_name, input_type_fixed, desc, default, :nofile => true
47
+ end
48
+
49
+ task workflow => :string do |*args|
50
+ cromwell = file
51
+ options = {}
52
+ Misc.in_dir(self.files_dir) do
53
+ options["metadata-output"] = file('metadata.json')
54
+ options["inputs"] = file('inputs')
55
+
56
+ cromwell_inputs = {}
57
+ self.inputs.to_hash.each do |input, value|
58
+ next if value.nil?
59
+ key = [workflow.to_s, input] * "."
60
+ cromwell_inputs[key] = value
61
+ end
62
+
63
+ Open.write(file('inputs'), cromwell_inputs.to_json )
64
+ Cromwell.run_cromwell(cromwell, self.files_dir, options)
65
+ end
66
+ Open.read(Dir.glob(File.join(files_dir, "/cromwell-executions/#{workflow}/*/call-*/execution/stdout")).first)
67
+ end
68
+
69
+ end
70
+ end
71
+ end
@@ -673,7 +673,7 @@ class Step
673
673
  end
674
674
 
675
675
  def grace
676
- until done? or result or error? or aborted? or streaming? or waiting?
676
+ until done? || result || error? || aborted? || streaming? || waiting?
677
677
  sleep 1
678
678
  end
679
679
  self
@@ -43,28 +43,100 @@ module Task
43
43
  else
44
44
  puts " #{Log.color :yellow, task.name.to_s}:"
45
45
  end
46
- puts
46
+ puts unless Log.compact
47
47
  puts SOPT.input_doc(new_inputs, task.input_types, task.input_descriptions, task.input_defaults, true)
48
- puts
48
+ puts unless Log.compact
49
49
  end
50
+ puts
50
51
  end
51
52
 
52
53
  puts Log.color(:magenta, "Returns: ") << Log.color(:blue, result_type.to_s) << "\n"
53
54
  puts
54
-
55
+
55
56
  if selects.any?
56
57
  puts Log.color(:magenta, "Input select options")
57
58
  puts
58
59
  selects.collect{|p| p}.uniq.each do |input,options|
59
60
  puts Log.color(:blue, input.to_s + ": ") << Misc.format_paragraph(options.collect{|o| o.to_s} * ", ") << "\n"
60
- puts
61
+ puts unless Log.compact
61
62
  end
63
+ puts
62
64
  end
63
65
  end
64
66
  end
65
67
 
66
68
  module Workflow
67
- def doc(task = nil)
69
+
70
+ def dep_tree(name)
71
+ @dep_tree ||= {}
72
+ @dep_tree[name] ||= begin
73
+ dep_tree = {}
74
+ self.rec_dependencies(name).each do |dep|
75
+ dep = dep.first if Array === dep && dep.length == 1
76
+
77
+ workflow, task = case dep
78
+ when Array
79
+ dep.values_at 0, 1
80
+ when Symbol, String
81
+ [self, dep]
82
+ else
83
+ next
84
+ end
85
+
86
+
87
+ key = [workflow, task]
88
+
89
+ dep_tree[key] = workflow.dep_tree(task)
90
+ end
91
+ dep_tree
92
+ end
93
+ end
94
+
95
+ def prov_string(tree)
96
+ description = ""
97
+
98
+ last = nil
99
+ seen = Set.new
100
+ tree.collect.to_a.flatten.select{|e| Symbol === e }.each do |task_name|
101
+
102
+ child = last && last.include?(task_name)
103
+ first = last.nil?
104
+ last = dep_tree(task_name).collect.to_a.flatten.select{|e| Symbol === e}
105
+
106
+ next if seen.include?(task_name)
107
+
108
+ if child
109
+ description << "->" << task_name.to_s
110
+ elsif first
111
+ description << "" << task_name.to_s
112
+ else
113
+ description << ";" << task_name.to_s
114
+ end
115
+ end
116
+ description
117
+ end
118
+
119
+ def prov_tree(tree, offset = 0, seen = [])
120
+
121
+ return "" if tree.empty?
122
+
123
+ lines = []
124
+
125
+ offset_str = " " * offset
126
+
127
+ lines << offset_str
128
+
129
+ tree.each do |p,dtree|
130
+ next if seen.include?(p)
131
+ seen.push(p)
132
+ workflow, task = p
133
+ lines << offset_str + [workflow.to_s, task.to_s] * "#" + "\n" + workflow.prov_tree(dtree, offset + 1, seen)
134
+ end
135
+
136
+ lines * "\n"
137
+ end
138
+
139
+ def doc(task = nil, abridge = false)
68
140
 
69
141
  if task.nil?
70
142
  puts Log.color :magenta, self.to_s
@@ -88,10 +160,27 @@ module Workflow
88
160
  end
89
161
  puts
90
162
 
163
+ final = Set.new
164
+ not_final = Set.new
165
+ tasks.each do |name,task|
166
+ tree = dep_tree(name)
167
+ not_final += tree.keys
168
+ final << name unless not_final.include?(name)
169
+ end
170
+
171
+ not_final.each do |p|
172
+ final -= [p.last]
173
+ end
174
+
91
175
  tasks.each do |name,task|
92
176
  description = task.description || ""
93
177
  description = description.split("\n\n").first
94
- puts Misc.format_definition_list_item(name.to_s, description, 80, 30, :yellow)
178
+
179
+ next if abridge and ! final.include?(name)
180
+ puts Misc.format_definition_list_item(name.to_s, description, Log.terminal_width, 20, :yellow)
181
+
182
+ prov_string = prov_string(dep_tree(name))
183
+ puts Log.color :blue, " ->" + prov_string if prov_string && ! prov_string.empty?
95
184
  end
96
185
 
97
186
  else
@@ -106,29 +195,46 @@ module Workflow
106
195
  #dependencies = self.rec_dependencies(task_name).collect{|dep_name| Array === dep_name ? dep_name.first.tasks[dep_name[1].to_sym] : self.tasks[dep_name.to_sym]}
107
196
  task.doc(self, self.rec_dependencies(task_name))
108
197
 
198
+ prov_tree = prov_tree(dep_tree(task_name))
199
+ if prov_tree && ! prov_tree.empty?
200
+
201
+ puts Log.color :magenta, "## DEPENDENCY GRAPH (abridged)"
202
+ puts
203
+ prov_tree.split("\n").each do |line|
204
+ next if line.strip.empty?
205
+ if m = line.match(/^( *)(\w+?)#(\w*)/i)
206
+ offset, workflow, task_name = m.values_at 1, 2, 3
207
+ puts [offset, Log.color(:magenta, workflow), "#", Log.color(:yellow, task_name)] * ""
208
+ else
209
+ puts Log.color :blue, line
210
+ end
211
+ end
212
+ puts
213
+ end
214
+
109
215
  if self.examples.include? task_name
110
- self.examples[task_name].each do |example|
111
-
112
- puts Log.color(:magenta, "Example ") << Log.color(:green, example) + " -- " + Log.color(:blue, example_dir[task_name][example])
113
-
114
- inputs = self.example(task_name, example)
115
-
116
- inputs.each do |input, type, file|
117
- case type
118
- when :tsv, :array, :text
119
- lines = file.read.split("\n")
120
- head = lines[0..5].compact * "\n\n"
121
- head = head[0..500]
122
- puts Misc.format_definition_list_item(input, head, 1000, -1, :blue).gsub(/\n\s*\n/,"\n")
123
- puts '...' if lines.length > 6
124
- else
125
- puts Misc.format_definition_list_item(input, file.read, 80, 20, :blue)
126
- end
216
+ self.examples[task_name].each do |example|
217
+
218
+ puts Log.color(:magenta, "Example ") << Log.color(:green, example) + " -- " + Log.color(:blue, example_dir[task_name][example])
219
+
220
+ inputs = self.example(task_name, example)
221
+
222
+ inputs.each do |input, type, file|
223
+ case type
224
+ when :tsv, :array, :text
225
+ lines = file.read.split("\n")
226
+ head = lines[0..5].compact * "\n\n"
227
+ head = head[0..500]
228
+ puts Misc.format_definition_list_item(input, head, 1000, -1, :blue).gsub(/\n\s*\n/,"\n")
229
+ puts '...' if lines.length > 6
230
+ else
231
+ puts Misc.format_definition_list_item(input, file.read, Log.terminal_width, 20, :blue)
127
232
  end
128
- puts
129
233
  end
234
+ puts
130
235
  end
131
236
  end
237
+ end
132
238
  end
133
239
 
134
240
  def SOPT_str(task)
@@ -51,8 +51,8 @@ end
51
51
 
52
52
  prev = []
53
53
 
54
- $previous_commands << 'cmd'
55
- $previous_commands << workflow
54
+ $previous_commands << ' cmd'
55
+ $previous_commands << ' ' << workflow
56
56
 
57
57
  begin
58
58
  while ARGV.any?
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rbbt-util'
4
+ require 'rbbt/util/simpleopt'
5
+ require 'rbbt/workflow'
6
+
7
+ $0 = "rbbt #{$previous_commands*" "} #{ File.basename(__FILE__) }" if $previous_commands
8
+
9
+ options = SOPT.setup <<EOF
10
+
11
+ Make a job forget all its dependencies and archive their meta-data
12
+
13
+ $ #{$0} [options] <job_path>
14
+
15
+ -h--help Print this help
16
+
17
+ EOF
18
+ if options[:help]
19
+ if defined? rbbt_usage
20
+ rbbt_usage
21
+ else
22
+ puts SOPT.doc
23
+ end
24
+ exit 0
25
+ end
26
+
27
+ path = ARGV[0]
28
+
29
+ raise ParameterException, "No path given" if path.nil?
30
+ step = Workflow.load_step path
31
+
32
+
33
+ iif step.rec_dependencies
34
+
35
+ step.archive_deps
36
+ step.set_info :dependencies, []
@@ -15,7 +15,7 @@ def report_options(options)
15
15
  end
16
16
  end
17
17
 
18
- def usage(workflow = nil, task = nil, exception=nil)
18
+ def usage(workflow = nil, task = nil, exception=nil, abridge = false)
19
19
  puts SOPT.doc
20
20
  puts
21
21
  if workflow.nil?
@@ -25,7 +25,7 @@ def usage(workflow = nil, task = nil, exception=nil)
25
25
 
26
26
  if task.nil?
27
27
  workflow.load_tasks if workflow.respond_to? :load_tasks
28
- workflow.doc
28
+ workflow.doc nil, abridge
29
29
  puts
30
30
  puts "E.g. rbbt workflow task #{workflow.to_s} #{workflow.tasks.keys.first.to_s} -h"
31
31
  else
@@ -40,7 +40,7 @@ def usage(workflow = nil, task = nil, exception=nil)
40
40
  puts Misc.format_paragraph workflow.documentation[:description]
41
41
  end
42
42
  puts
43
- workflow.doc(task)
43
+ workflow.doc(task, abridge)
44
44
  end
45
45
 
46
46
  print_error(exception.message, exception.backtrace) if exception
@@ -171,6 +171,7 @@ can redo it using the `clean` parameter, this cleans the last step of the task.
171
171
  The `recursive_clean` cleans all the job dependency steps recursively.
172
172
 
173
173
  -h--help Show this help
174
+ -ha--abridge Abridge help
174
175
  -wd--workdir* Change the working directory of the workflow
175
176
  -wda--workdir_all* Change the working directory of ALL workflow
176
177
  -as--array_separator* Change the character that separates elements of Arrays, ',', '|', or '\\n' by default
@@ -265,14 +266,14 @@ namespace = nil, nil
265
266
 
266
267
  case
267
268
  when task.nil?
268
- usage workflow and exit 0
269
+ usage workflow, nil, nil, options[:abridge] and exit 0
269
270
  else
270
271
  task_name = task.to_sym
271
272
  begin
272
273
  task = workflow.tasks[task_name]
273
274
  raise Workflow::TaskNotFoundException.new workflow, task_name if task.nil?
274
275
  rescue Workflow::TaskNotFoundException
275
- usage workflow
276
+ usage workflow, nil, nil, options[:abridge]
276
277
 
277
278
  puts
278
279
  puts Log.color :magenta, "## Error"
@@ -284,7 +285,7 @@ else
284
285
  end
285
286
  end
286
287
 
287
- usage workflow, task and exit 0 if help
288
+ usage workflow, task, nil, options[:abridge] and exit 0 if help
288
289
 
289
290
  name = options.delete(:jobname)
290
291
 
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.26.139
4
+ version: 5.26.140
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miguel Vazquez
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-07 00:00:00.000000000 Z
11
+ date: 2020-02-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -322,6 +322,7 @@ files:
322
322
  - lib/rbbt/workflow/definition.rb
323
323
  - lib/rbbt/workflow/doc.rb
324
324
  - lib/rbbt/workflow/examples.rb
325
+ - lib/rbbt/workflow/integration/cromwell.rb
325
326
  - lib/rbbt/workflow/integration/nextflow.rb
326
327
  - lib/rbbt/workflow/remote/client.rb
327
328
  - lib/rbbt/workflow/remote/remote_step.rb
@@ -414,6 +415,7 @@ files:
414
415
  - share/rbbt_commands/workflow/archive_all
415
416
  - share/rbbt_commands/workflow/cmd
416
417
  - share/rbbt_commands/workflow/example
418
+ - share/rbbt_commands/workflow/forget_deps
417
419
  - share/rbbt_commands/workflow/info
418
420
  - share/rbbt_commands/workflow/init
419
421
  - share/rbbt_commands/workflow/install