rbbt-util 5.34.27 → 5.35.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rbbt/hpc/batch.rb +3 -3
  3. data/lib/rbbt/hpc/orchestrate.rb +10 -2
  4. data/lib/rbbt/resource.rb +1 -0
  5. data/lib/rbbt/tsv/attach/util.rb +8 -4
  6. data/lib/rbbt/util/R/model.rb +1 -1
  7. data/lib/rbbt/util/R/plot.rb +2 -0
  8. data/lib/rbbt/util/R.rb +1 -1
  9. data/lib/rbbt/util/cmd.rb +5 -3
  10. data/lib/rbbt/util/misc/concurrent_stream.rb +12 -11
  11. data/lib/rbbt/util/misc/development.rb +3 -2
  12. data/lib/rbbt/util/misc/exceptions.rb +26 -3
  13. data/lib/rbbt/util/misc/inspect.rb +1 -1
  14. data/lib/rbbt/util/python/util.rb +19 -0
  15. data/lib/rbbt/util/python.rb +80 -10
  16. data/lib/rbbt/util/simpleopt/get.rb +9 -6
  17. data/lib/rbbt/workflow/integration/ansible.rb +1 -1
  18. data/lib/rbbt/workflow/remote_workflow/driver/ssh.rb +34 -9
  19. data/lib/rbbt/workflow/remote_workflow/remote_step/ssh.rb +7 -2
  20. data/lib/rbbt/workflow/remote_workflow/remote_step.rb +2 -0
  21. data/lib/rbbt/workflow/step/save_load_inputs.rb +1 -0
  22. data/lib/rbbt/workflow.rb +2 -1
  23. data/share/install/software/lib/install_helpers +3 -2
  24. data/share/rbbt_commands/ansible +0 -1
  25. data/share/rbbt_commands/hpc/orchestrate +15 -3
  26. data/share/rbbt_commands/hpc/task +13 -2
  27. data/share/rbbt_commands/lsf/orchestrate +15 -3
  28. data/share/rbbt_commands/lsf/task +13 -2
  29. data/share/rbbt_commands/slurm/orchestrate +15 -3
  30. data/share/rbbt_commands/slurm/task +13 -2
  31. data/share/rbbt_commands/workflow/task +3 -2
  32. data/test/rbbt/hpc/test_batch.rb +4 -4
  33. data/test/rbbt/util/python/test_util.rb +8 -0
  34. data/test/rbbt/util/test_python.rb +50 -0
  35. metadata +87 -87
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 40a3d86f01180255239e05fc23309b2c798eb94ee4c213ab8699f7954c1f5346
4
- data.tar.gz: 3357e23002f032213a6b4c01ef046527092c8e4bf9ebce96dfc714176c3cb239
3
+ metadata.gz: 7fc87aa89e132735c535df80f34cfd0f31fb44475d55d08fb194ee50e045f884
4
+ data.tar.gz: e1c380d68af04bd683a3a06e675b6e8744497869d95ac96620e7864f05e8aeb7
5
5
  SHA512:
6
- metadata.gz: 8454ec0e14dac9fbdb5fa00a2219248b5037c890289fb5b013d69d6dac63e869b5160620d1ac744392546bf58dc8acfb1afba5c9172f366ddae01fc6cc008810
7
- data.tar.gz: c85e5b6defde582d6af2c08281dd659bd8f71ae9867d4258d2c96c9824b3d0fe7020472fc6ccec3e66f4f70228bdc3dea425756abd510ded61a7f59420b78b98
6
+ metadata.gz: dd65fb3be5c880288fa1718d6a2327d1e799f7c9b415785cdcb5f1cd9d18d02664347e6dc16dde2a78d727ab86ab292d272fc2a608ea7a9a1eb7c0e88f213131
7
+ data.tar.gz: 603ca603814e8405dcc88ed0a499ddb92658d2831887d8c8110ba60737a83317ee7d68e00a3b51a48734a6bb90f2539d654169b07a8609a60fe02351d8426394
@@ -378,17 +378,17 @@ function batch_sync_contain_dir(){
378
378
  prepare_environment +=<<-EOF
379
379
  # Load singularity modules
380
380
  command -v singularity &> /dev/null || module load singularity
381
- mkdir -p "#{singularity_opt_dir}"
381
+ mkdir -p "#{File.expand_path singularity_opt_dir}"
382
382
  EOF
383
383
 
384
384
  if contain && options[:hardened]
385
385
 
386
386
  prepare_environment +=<<-EOF
387
387
  # Prepare container for singularity
388
- mkdir -p "#{contain}/.rbbt/etc/"
388
+ mkdir -p "#{contain}"/.rbbt/etc/
389
389
 
390
390
  for dir in .ruby_inline git home; do
391
- mkdir -p "#{contain}/$dir"
391
+ mkdir -p "#{contain}"/$dir
392
392
  done
393
393
 
394
394
  for tmpd in persist_locks produce_locks R_sockets sensiblewrite sensiblewrite_locks step_info_locks tsv_open_locks; do
@@ -36,8 +36,16 @@ module HPC
36
36
  Log.high "Prepare for exec"
37
37
  prepare_for_execution(job)
38
38
 
39
- if options[:orchestration_rules]
40
- rules = Misc.load_yaml(options[:orchestration_rules])
39
+ if orchestration_rules_file = options[:orchestration_rules]
40
+ if Open.exists?(orchestration_rules_file)
41
+ rules = Misc.load_yaml(orchestration_rules_file)
42
+ elsif Rbbt.etc.slurm(orchestration_rules_file).exists?
43
+ rules = Misc.load_yaml(Rbbt.etc.slurm(orchestration_rules_file))
44
+ elsif Rbbt.etc.slurm(orchestration_rules_file + '.yaml').exists?
45
+ rules = Misc.load_yaml(Rbbt.etc.slurm(orchestration_rules_file + '.yaml'))
46
+ else
47
+ raise "Orchestration rules file not found: #{options[:orchestration_rules]}"
48
+ end
41
49
  elsif Rbbt.etc.slurm["default.yaml"].exists?
42
50
  rules = Misc.load_yaml(Rbbt.etc.slurm["default.yaml"])
43
51
  else
data/lib/rbbt/resource.rb CHANGED
@@ -90,6 +90,7 @@ module Resource
90
90
 
91
91
  lock_filename = nil # it seems like this was locked already.
92
92
 
93
+ Log.low "Downloading #{path} from #{url} file server"
93
94
  Misc.lock lock_filename do
94
95
  begin
95
96
  uri = URI(url)
@@ -105,7 +105,7 @@ module TSV
105
105
  if other.include? source_key
106
106
  v = case other.type
107
107
  when :flat
108
- other[source_key]
108
+ other[source_key]
109
109
  when :single
110
110
  [other[source_key]]
111
111
  when :double
@@ -135,8 +135,12 @@ module TSV
135
135
  if pos == :key
136
136
  source_key
137
137
  else
138
- if other.include? source_key
139
- v = other[source_key][pos]
138
+ if other.include?(source_key)
139
+ if other.type == :single
140
+ v = other[source_key]
141
+ else
142
+ v = other[source_key][pos]
143
+ end
140
144
  Array === v ? v.first : v
141
145
  else
142
146
  nil
@@ -192,7 +196,7 @@ module TSV
192
196
  end
193
197
  end
194
198
  new_values.collect!{|v| v.nil? ? [[]] : [v]} if type == :double and not other.type == :double
195
- new_values.collect!{|v| v.nil? ? nil : (other.type == :single ? v : v.first)} if not type == :double and other.type == :double
199
+ new_values.collect!{|v| v.nil? ? nil : (other.type == :single ? v : v.first)} if not type == :double and other.type == :double
196
200
  new_values.flatten! if type == :flat
197
201
  all_new_values << new_values
198
202
  end
@@ -42,7 +42,7 @@ module R
42
42
  def colClasses(tsv)
43
43
  return nil unless TSV === tsv
44
44
  "c('character', " <<
45
- (tsv.fields.collect{|f| R.ruby2R(@options[f] ? @options[f].to_s : ":NA") } * ", ") <<
45
+ (tsv.fields.collect{|f| R.ruby2R(@options[f] ? @options[f].to_s : "NA") } * ", ") <<
46
46
  ")"
47
47
  end
48
48
 
@@ -47,6 +47,8 @@ module R
47
47
  else
48
48
  "'character'"
49
49
  end
50
+ when Time
51
+ "'Date'"
50
52
  when Symbol
51
53
  "'factor'"
52
54
  else
data/lib/rbbt/util/R.rb CHANGED
@@ -131,7 +131,7 @@ source(interactive.script.file)
131
131
  "Inf"
132
132
  when nil
133
133
  "NULL"
134
- when "NA"
134
+ when ":NA"
135
135
  "NA"
136
136
  when TSV
137
137
  "matrix(#{R.ruby2R object.values},dimnames=list(#{R.ruby2R object.keys}, #{R.ruby2R object.fields}))"
data/lib/rbbt/util/cmd.rb CHANGED
@@ -112,6 +112,7 @@ module CMD
112
112
  no_wait = options.delete(:no_wait)
113
113
  xvfb = options.delete(:xvfb)
114
114
  bar = options.delete(:progress_bar)
115
+ save_stderr = options.delete(:save_stderr)
115
116
 
116
117
  dont_close_in = options.delete(:dont_close_in)
117
118
 
@@ -154,7 +155,7 @@ module CMD
154
155
  Open3.popen3(ENV, cmd)
155
156
  rescue
156
157
  Log.warn $!.message
157
- raise ProcessFailed, cmd unless no_fail
158
+ raise ProcessFailed, nil, cmd unless no_fail
158
159
  return
159
160
  end
160
161
  pid = wait_thr.pid
@@ -198,6 +199,7 @@ module CMD
198
199
  while line = serr.gets
199
200
  bar.process(line) if bar
200
201
  sout.log = line
202
+ sout.std_err << line if save_stderr
201
203
  Log.log "STDERR [#{pid}]: " + line, stderr if log
202
204
  end
203
205
  serr.close
@@ -244,9 +246,9 @@ module CMD
244
246
  status = wait_thr.value
245
247
  if not status.success? and not no_fail
246
248
  if !err.empty?
247
- raise ProcessFailed.new "Command [#{pid}] #{cmd} failed with error status #{status.exitstatus}.\n#{err}"
249
+ raise ProcessFailed.new pid, "#{cmd} failed with error status #{status.exitstatus}.\n#{err}"
248
250
  else
249
- raise ProcessFailed.new "Command [#{pid}] #{cmd} failed with error status #{status.exitstatus}"
251
+ raise ProcessFailed.new pid, "#{cmd} failed with error status #{status.exitstatus}"
250
252
  end
251
253
  else
252
254
  Log.log err, stderr if Integer === stderr and log
@@ -7,7 +7,7 @@ module AbortedStream
7
7
  end
8
8
 
9
9
  module ConcurrentStream
10
- attr_accessor :threads, :pids, :callback, :abort_callback, :filename, :joined, :aborted, :autojoin, :lockfile, :no_fail, :pair, :thread, :stream_exception, :log
10
+ attr_accessor :threads, :pids, :callback, :abort_callback, :filename, :joined, :aborted, :autojoin, :lockfile, :no_fail, :pair, :thread, :stream_exception, :log, :std_err
11
11
 
12
12
  def self.setup(stream, options = {}, &block)
13
13
 
@@ -20,6 +20,7 @@ module ConcurrentStream
20
20
  stream.pids.concat(Array === pids ? pids : [pids]) unless pids.nil? or pids.empty?
21
21
  stream.autojoin = autojoin unless autojoin.nil?
22
22
  stream.no_fail = no_fail unless no_fail.nil?
23
+ stream.std_err = ""
23
24
 
24
25
  stream.pair = pair unless pair.nil?
25
26
 
@@ -81,12 +82,16 @@ module ConcurrentStream
81
82
  begin
82
83
  t.join
83
84
  if Process::Status === t.value
84
- if log
85
- raise ProcessFailed.new "Error joining process #{t.pid} in #{self.filename || self.inspect}. Last log line: #{log}" if ! (t.value.success? || no_fail)
86
- else
87
- raise ProcessFailed.new "Error joining process #{t.pid} in #{self.filename || self.inspect}" if ! (t.value.success? || no_fail)
85
+ if ! (t.value.success? || no_fail)
86
+
87
+ if log
88
+ msg = "Error joining #{self.filename || self.inspect}. Last log line: #{log}"
89
+ else
90
+ msg = "Error joining #{self.filename || self.inspect}"
91
+ end
92
+
93
+ raise ConcurrentStreamProcessFailed.new t.pid, msg, self
88
94
  end
89
- raise ProcessFailed.new "Error joining process #{t.pid} in #{self.filename || self.inspect}. Last log line: #{log}" if ! (t.value.success? || no_fail)
90
95
  end
91
96
  rescue Exception
92
97
  if no_fail
@@ -106,11 +111,7 @@ module ConcurrentStream
106
111
  @pids.each do |pid|
107
112
  begin
108
113
  Process.waitpid(pid, Process::WUNTRACED)
109
- if log
110
- stream_raise_exception ProcessFailed.new "Error joining process #{pid} in #{self.filename || self.inspect}. Last log line: #{log}" unless $?.success? or no_fail
111
- else
112
- stream_raise_exception ProcessFailed.new "Error joining process #{pid} in #{self.filename || self.inspect}" unless $?.success? or no_fail
113
- end
114
+ stream_raise_exception ConcurrentStreamProcessFailed.new(pid, "Error in waitpid", self) unless $?.success? or no_fail
114
115
  rescue Errno::ECHILD
115
116
  end
116
117
  end
@@ -420,7 +420,8 @@ def self.add_libdir(dir=nil)
420
420
  def self.ssh_run(server, script = nil)
421
421
  Log.debug "Run ssh script in #{server}:\n#{script}"
422
422
 
423
- CMD.cmd("ssh '#{server}' 'shopt -s expand_aliases; bash -l -c \"ruby\"' ", :in => script, :log => true).read
423
+ #CMD.cmd("ssh '#{server}' 'shopt -s expand_aliases; bash -l -c \"ruby\"' ", :in => script, :log => true).read
424
+ CMD.cmd("ssh '#{server}' ruby", :in => script, :log => true).read
424
425
  end
425
426
 
426
427
  def self.ssh_connection(server, reset = false)
@@ -437,7 +438,7 @@ def self.add_libdir(dir=nil)
437
438
  end
438
439
  end
439
440
 
440
- def self.ssh_run(server, script = nil)
441
+ def self.ssh_run_alt(server, script = nil)
441
442
  Log.debug "Run ssh script in #{server}:\n#{script}"
442
443
 
443
444
  write, master, pid = ssh_connection(server)
@@ -1,16 +1,39 @@
1
1
  class RbbtException < StandardError; end
2
2
  class ParameterException < RbbtException; end
3
3
 
4
+ class MissingParameterException < ParameterException
5
+ def initialize(parameter)
6
+ super("Missing parameter '#{parameter}'")
7
+ end
8
+ end
9
+
4
10
  class FieldNotFoundError < StandardError;end
5
11
  class ClosedStream < StandardError; end
6
12
 
7
13
  class ProcessFailed < StandardError;
8
- def initialize(pid = Process.pid)
14
+ attr_accessor :pid, :msg
15
+ def initialize(pid = Process.pid, msg = nil)
9
16
  @pid = pid
10
- @msg = "Process #{@pid} failed"
11
- super(@msg)
17
+ @msg = msg
18
+ if @pid
19
+ if @msg
20
+ message = "Process #{@pid} failed - #{@msg}"
21
+ else
22
+ message = "Process #{@pid} failed"
23
+ end
24
+ else
25
+ message = "Failed to run #{@msg}"
26
+ end
27
+ super(message)
12
28
  end
29
+ end
13
30
 
31
+ class ConcurrentStreamProcessFailed < ProcessFailed
32
+ attr_accessor :concurrent_stream
33
+ def initialize(pid = Process.pid, msg = nil, concurrent_stream = nil)
34
+ super(pid, msg)
35
+ @concurrent_stream = concurrent_stream
36
+ end
14
37
  end
15
38
 
16
39
  class Aborted < StandardError; end
@@ -276,7 +276,7 @@ module Misc
276
276
 
277
277
  def self.step_file?(path)
278
278
  return true if defined?(Step) && Step === path.resource
279
- return false unless path.include?('.files/')
279
+ return false unless path =~ /\.files(?:\/|$)/
280
280
  parts = path.split("/")
281
281
  job = parts.select{|p| p =~ /\.files$/}.first
282
282
  if job
@@ -31,4 +31,23 @@ module RbbtPython
31
31
  tsv
32
32
  end
33
33
 
34
+ def self.list2ruby(list)
35
+ return list unless PyCall::List === list
36
+ list.collect do |e|
37
+ list2ruby(e)
38
+ end
39
+ end
40
+
41
+ def self.numpy2ruby(numpy)
42
+ list2ruby(numpy.tolist)
43
+ end
44
+
45
+ def self.obj2hash(obj)
46
+ hash = {}
47
+ RbbtPython.iterate obj.keys do |k|
48
+ hash[k] = obj[k]
49
+ end
50
+ hash
51
+ end
52
+
34
53
  end
@@ -5,6 +5,16 @@ require 'rbbt/util/python/util'
5
5
  module RbbtPython
6
6
  extend PyCall::Import
7
7
 
8
+ class RbbtPythonException < StandardError; end
9
+
10
+ class Binding
11
+ include PyCall::Import
12
+
13
+ def run(*args, &block)
14
+ instance_exec(*args, &block)
15
+ end
16
+ end
17
+
8
18
  def self.script(text, options = {})
9
19
  Log.debug "Running python script:\n#{text.dup}"
10
20
  text = StringIO.new text unless IO === text
@@ -12,8 +22,13 @@ module RbbtPython
12
22
  end
13
23
 
14
24
  def self.add_path(path)
15
- self.run 'sys' do
16
- sys.path.append path
25
+ begin
26
+ self.run 'sys' do
27
+ sys.path.append path
28
+ end
29
+ rescue
30
+ raise RbbtPythonException,
31
+ "Could not add path #{Misc.fingerprint path} to python sys: " + $!.message
17
32
  end
18
33
  end
19
34
 
@@ -26,19 +41,64 @@ module RbbtPython
26
41
  end
27
42
 
28
43
  def self.init_rbbt
29
- if ! defined?(@@__init_rbbt) || ! @@__init_rbbt
44
+ if ! defined?(@@__init_rbbt_python) || ! @@__init_rbbt_python
30
45
  Log.debug "Loading python 'rbbt' module into pycall RbbtPython module"
31
46
  RbbtPython.add_paths(Rbbt.python.find_all)
32
47
  RbbtPython.pyimport("rbbt")
33
- @@__init_rbbt = true
48
+ @@__init_rbbt_python = true
34
49
  end
35
50
  end
36
51
 
52
+ def self.import_method(module_name, method_name, as = nil)
53
+ RbbtPython.pyfrom module_name, import: method_name
54
+ RbbtPython.method(method_name)
55
+ end
56
+
37
57
  def self.exec(script)
38
58
  PyCall.exec(script)
39
59
  end
40
60
 
41
- def self.iterate(iterator, options = {})
61
+ def self.iterate_index(elem, options = {})
62
+ iii :interate_index
63
+ bar = options[:bar]
64
+
65
+ len = PyCall.len(elem)
66
+ case bar
67
+ when TrueClass
68
+ bar = Log::ProgressBar.new nil, :desc => "RbbtPython iterate"
69
+ when String
70
+ bar = Log::ProgressBar.new nil, :desc => bar
71
+ end
72
+
73
+ len.times do |i|
74
+ begin
75
+ yield elem[i]
76
+ bar.tick if bar
77
+ rescue PyCall::PyError
78
+ if $!.type.to_s == "<class 'StopIteration'>"
79
+ break
80
+ else
81
+ raise $!
82
+ end
83
+ rescue
84
+ bar.error if bar
85
+ raise $!
86
+ end
87
+ end
88
+
89
+ Log::ProgressBar.remove_bar bar if bar
90
+ nil
91
+ end
92
+
93
+ def self.iterate(iterator, options = {}, &block)
94
+ if ! iterator.respond_to?(:__next__)
95
+ if iterator.respond_to?(:__iter__)
96
+ iterator = iterator.__iter__
97
+ else
98
+ return iterate_index(iterator, options, &block)
99
+ end
100
+ end
101
+
42
102
  bar = options[:bar]
43
103
 
44
104
  case bar
@@ -50,7 +110,8 @@ module RbbtPython
50
110
 
51
111
  while true
52
112
  begin
53
- yield iterator.__next__
113
+ elem = iterator.__next__
114
+ yield elem
54
115
  bar.tick if bar
55
116
  rescue PyCall::PyError
56
117
  if $!.type.to_s == "<class 'StopIteration'>"
@@ -79,12 +140,12 @@ module RbbtPython
79
140
 
80
141
  def self.run(mod = nil, imports = nil, &block)
81
142
  if mod
82
- if Array === imports
83
- pyfrom mod, :import => imports
84
- elsif Hash === imports
143
+ if Hash === imports
85
144
  pyimport mod, **imports
86
- else
145
+ elsif imports.nil?
87
146
  pyimport mod
147
+ else
148
+ pyfrom mod, :import => imports
88
149
  end
89
150
  end
90
151
 
@@ -124,4 +185,13 @@ module RbbtPython
124
185
  module_eval(&block)
125
186
  end
126
187
  end
188
+
189
+ def self.new_binding
190
+ Binding.new
191
+ end
192
+
193
+ def self.binding_run(binding = nil, *args, &block)
194
+ binding = new_binding
195
+ binding.instance_exec *args, &block
196
+ end
127
197
  end
@@ -1,8 +1,11 @@
1
1
  module SOPT
2
2
  GOT_OPTIONS= IndiferentHash.setup({})
3
+ def self.current_options=(options)
4
+ @@current_options = options
5
+ end
3
6
  def self.consume(args = ARGV)
4
7
  i = 0
5
- values = {}
8
+ @@current_options ||= {}
6
9
  while i < args.length do
7
10
  current = args[i]
8
11
  break if current == "--"
@@ -25,20 +28,20 @@ module SOPT
25
28
 
26
29
  if input_types[input] == :string
27
30
  value = args.delete_at(i) if value.nil?
28
- values[input] = value
31
+ @@current_options[input] = value
29
32
  else
30
33
  if value.nil? and %w(F false FALSE no).include?(args[i])
31
34
  Log.warn "Boolean values are best specified as #{current}=[true|false], not #{ current } [true|false]. Token '#{args[i]}' following '#{current}' automatically assigned as value"
32
35
  value = args.delete_at(i)
33
36
  end
34
- values[input] = %w(F false FALSE no).include?(value)? false : true
37
+ @@current_options[input] = %w(F false FALSE no).include?(value)? false : true
35
38
  end
36
39
  end
37
40
 
38
- IndiferentHash.setup values
39
- GOT_OPTIONS.merge! values
41
+ IndiferentHash.setup @@current_options
42
+ GOT_OPTIONS.merge! @@current_options
40
43
 
41
- values
44
+ @@current_options
42
45
  end
43
46
 
44
47
  def self.get(opt_str)
@@ -48,7 +48,7 @@ module Ansible
48
48
  end
49
49
 
50
50
  def self.playbook(file, task = nil, options = {})
51
- task = 'default' if task.nil?
51
+ task = task.to_sym if String === task
52
52
 
53
53
  workflow = Workflow === file ? file : Workflow.require_workflow(file)
54
54
  task = workflow.tasks.keys.last if workflow.tasks[task].nil?
@@ -85,7 +85,9 @@ job = wf.job(task, jobname, job_inputs)
85
85
  STDOUT.write res.to_json
86
86
  EOF
87
87
 
88
- JSON.parse(Misc.ssh_run(server, script))
88
+ json = Misc.ssh_run(server, script)
89
+ Log.debug "JSON (#{ url }): #{json}"
90
+ JSON.parse(json)
89
91
  end
90
92
 
91
93
  def self.get_raw(url, params)
@@ -118,19 +120,40 @@ STDOUT.write job.path
118
120
  script += job_script(input_id, jobname)
119
121
  script +=<<-EOF
120
122
  ENV["RBBT_UPDATE"]="#{(ENV["RBBT_UPDATE"] || false).to_s}"
121
- job.produce
123
+ job.clean if job.error? and job.recoverable_error?
124
+ job.run unless job.done? || job.error?
122
125
  STDOUT.write job.path
123
126
  EOF
124
127
  Misc.ssh_run(server, script)
125
128
  end
126
129
 
127
- def self.run_slurm_job(url, input_id, jobname = nil)
130
+ def self.run_slurm_job(url, input_id, jobname = nil, slurm_options = {})
128
131
  server, path = parse_url(url)
129
132
 
130
133
  script = path_script(path)
131
134
  script += job_script(input_id, jobname)
132
135
  script +=<<-EOF
133
- job.produce
136
+ require 'rbbt/hpc'
137
+ HPC::BATCH_MODULE = HPC.batch_system "SLURM"
138
+ slurm_options = JSON.parse(%q(#{slurm_options.to_json}))
139
+ job.clean if job.error? and job.recoverable_error?
140
+ HPC::BATCH_MODULE.run_job(job, slurm_options) unless job.done? || job.error?
141
+ STDOUT.write job.path
142
+ EOF
143
+ Misc.ssh_run(server, script)
144
+ end
145
+
146
+ def self.orchestrate_slurm_job(url, input_id, jobname = nil, slurm_options = {})
147
+ server, path = parse_url(url)
148
+
149
+ script = path_script(path)
150
+ script += job_script(input_id, jobname)
151
+ script +=<<-EOF
152
+ require 'rbbt/hpc'
153
+ HPC::BATCH_MODULE = HPC.batch_system "SLURM"
154
+ slurm_options = JSON.parse(%q(#{slurm_options.to_json}))
155
+ job.clean if job.error? and job.recoverable_error?
156
+ HPC::BATCH_MODULE.orchestrate_job(job, slurm_options) unless job.done? || job.error?
134
157
  STDOUT.write job.path
135
158
  EOF
136
159
  Misc.ssh_run(server, script)
@@ -190,18 +213,20 @@ job.clean
190
213
  produce = true if migrate
191
214
 
192
215
  workflow_name = job.workflow.to_s
193
- inputs = job.inputs.to_hash
216
+ inputs = job.recursive_inputs.to_hash
217
+
194
218
  job.dependencies.each do |dep|
195
- dep.produce if options[:produce_dependencies]
196
- next unless dep.done?
219
+ dep.produce
220
+ end if options[:produce_dependencies]
197
221
 
198
- Step.migrate(dep.path, search_path, :target => server)
222
+ job.rec_dependencies.each do |dep|
223
+ Step.migrate(dep.path, search_path, :target => server) if dep.done?
199
224
  end
200
225
 
201
226
  remote_workflow = RemoteWorkflow.new("ssh://#{server}:#{job.workflow.to_s}", "#{job.workflow.to_s}")
202
227
  rjob = remote_workflow.job(job.task_name.to_s, job.clean_name, inputs)
203
228
 
204
- override_dependencies = job.dependencies.collect{|dep| [dep.workflow.to_s, dep.task_name.to_s] * "#" << "=" << Rbbt.identify(dep.path)}
229
+ override_dependencies = job.rec_dependencies.select{|dep| dep.done? }.collect{|dep| [dep.workflow.to_s, dep.task_name.to_s] * "#" << "=" << Rbbt.identify(dep.path)}
205
230
  rjob.override_dependencies = override_dependencies
206
231
 
207
232
  if options[:migrate]
@@ -50,15 +50,20 @@ class RemoteStep
50
50
  "ssh://" + @server + ":" + ["var/jobs", self.workflow.to_s, task_name.to_s, @name] * "/"
51
51
  end
52
52
  end
53
+
54
+ def _run
55
+ RemoteWorkflow::SSH.run_job(File.join(base_url, task.to_s), @input_id, @base_name)
56
+ end
53
57
 
54
58
  def produce(*args)
55
59
  input_types = {}
56
60
  init_job
57
- @remote_path = RemoteWorkflow::SSH.run_job(File.join(base_url, task.to_s), @input_id, @base_name)
61
+ @remote_path = _run
58
62
  @started = true
59
- while ! done?
63
+ while ! (done? || error?)
60
64
  sleep 1
61
65
  end
66
+ raise self.get_exception if error?
62
67
  self
63
68
  end
64
69
 
@@ -266,6 +266,8 @@ class RemoteStep < Step
266
266
  end
267
267
  end
268
268
 
269
+ raise "Error in remote step" if self.error?
270
+
269
271
  self
270
272
  end
271
273
 
@@ -201,6 +201,7 @@ class Step
201
201
 
202
202
  def self.save_inputs(inputs, input_types, dir)
203
203
  inputs.each do |name,value|
204
+ next if value.nil?
204
205
  type = input_types[name]
205
206
  type = type.to_s if type
206
207
 
data/lib/rbbt/workflow.rb CHANGED
@@ -520,6 +520,7 @@ module Workflow
520
520
  end
521
521
 
522
522
  def job(taskname, jobname = nil, inputs = {})
523
+ inputs, jobname = jobname, nil if Hash === jobname
523
524
  begin
524
525
  _job(taskname, jobname, inputs)
525
526
  ensure
@@ -858,7 +859,7 @@ module Workflow
858
859
  end
859
860
 
860
861
  def self.load_relay_tasks(filename)
861
- remote_workflow_tasks = Misc.load_yaml(filename)
862
+ relay_workflow_tasks = Misc.load_yaml(filename)
862
863
  Workflow.process_relay_tasks(relay_workflow_tasks)
863
864
  end
864
865
  end
@@ -85,7 +85,7 @@ uncompress_pkg(){
85
85
  mkdir -p "$OPT_BUILD_DIR"
86
86
  cd "$OPT_BUILD_DIR"
87
87
 
88
- (tar xvfz $pkg || tar xvfJ $pkg || tar xvfj $pkg || unzip $pkg || (echo "Error decompressing" & cd & rmdir "$OPT_BUILD_DIR" & exit -1 ) ) 2> /dev/null
88
+ (tar xvfz $pkg || tar xvfJ $pkg || tar xvfj $pkg || unzip $pkg || (echo "Error decompressing" & cd & exit -1 ) ) 2> /dev/null
89
89
 
90
90
  cd "$old_pwd"
91
91
  }
@@ -178,7 +178,7 @@ clean_build(){
178
178
  }
179
179
 
180
180
  build_dir(){
181
- echo $OPT_BUILD_DIR/`ls $OPT_BUILD_DIR |head -n 1`
181
+ echo $OPT_BUILD_DIR/$(ls $OPT_BUILD_DIR |head -n 1)
182
182
  }
183
183
 
184
184
  compile(){
@@ -211,6 +211,7 @@ prepare_make(){
211
211
  local extra="$@"
212
212
 
213
213
  local old_pwd="`expand_path $(pwd)`"
214
+
214
215
  cd "`build_dir`"
215
216
 
216
217
  [ -f bootstrap ] && (./bootstrap || exit -1)
@@ -42,7 +42,6 @@ if ! Misc.filename?(playbook_file)
42
42
  playbook_file = Ansible.playbook recipe, task, options
43
43
  end
44
44
 
45
-
46
45
  if dry_run
47
46
  if Hash === playbook_file
48
47
  ppp playbook_file.to_yaml
@@ -3,10 +3,13 @@
3
3
  require 'rbbt/util/simpleopt'
4
4
  require 'rbbt/workflow'
5
5
  require 'rbbt/workflow/usage'
6
+ require 'rbbt/workflow/remote_workflow'
6
7
  require 'rbbt/hpc'
7
8
  require 'rbbt/hpc/orchestrate'
8
9
  require 'time'
9
10
 
11
+ rbbt_options = SOPT::GOT_OPTIONS
12
+
10
13
  $slurm_options = SOPT.get <<EOF
11
14
  -dr--dry_run Print only the template
12
15
  -cj--clean_job Clean job
@@ -46,6 +49,8 @@ EOF
46
49
  batch_system = $slurm_options.delete :batch_system
47
50
  batch_system ||= 'auto'
48
51
 
52
+ $slurm_options[:config_keys] = SOPT::GOT_OPTIONS[:config_keys]
53
+
49
54
  HPC::BATCH_MODULE = HPC.batch_system batch_system
50
55
 
51
56
  raise ParameterException.new("Could not detect batch_system: #{Misc.fingerprint batch_system}") if HPC::BATCH_MODULE.nil?
@@ -61,7 +66,6 @@ class Step
61
66
  else
62
67
  begin
63
68
  Log.debug "Issuing SLURM job for #{self.path}"
64
- #@batch_job_id, @batch_job_dir = HPC::BATCH_MODULE.orchestrate_job(self, SOPT::GOT_OPTIONS.merge($slurm_options))
65
69
  @batch_job_id, @batch_job_dir = HPC::BATCH_MODULE.orchestrate_job(self, $slurm_options)
66
70
  if no_load
67
71
  self
@@ -75,6 +79,14 @@ class Step
75
79
  end
76
80
  end
77
81
 
78
- ARGV.concat ['--detach']
79
- ARGV.concat ["-W", $slurm_options[:workflows]] if $slurm_options[:workflows]
82
+ module RemoteStep::SSH
83
+
84
+ def _run
85
+ RemoteWorkflow::SSH.orchestrate_slurm_job(File.join(base_url, task.to_s), @input_id, @base_name, $slurm_options)
86
+ end
87
+
88
+ end
89
+
90
+ SOPT.current_options = rbbt_options
91
+
80
92
  load Rbbt.share.rbbt_commands.workflow.task.find
@@ -3,9 +3,12 @@
3
3
  require 'rbbt/util/simpleopt'
4
4
  require 'rbbt/workflow'
5
5
  require 'rbbt/workflow/usage'
6
+ require 'rbbt/workflow/remote_workflow'
6
7
  require 'rbbt/hpc'
7
8
  require 'time'
8
9
 
10
+ rbbt_options = SOPT::GOT_OPTIONS
11
+
9
12
  $slurm_options = SOPT.get <<EOF
10
13
  -dr--dry_run Print only the template
11
14
  -cj--clean_job Clean job
@@ -56,12 +59,20 @@ class Step
56
59
  else
57
60
  begin
58
61
  Log.debug "Issuing SLURM job for #{self.path}"
59
- HPC::BATCH_MODULE.run_job(self, SOPT::GOT_OPTIONS.merge($slurm_options))
62
+ HPC::BATCH_MODULE.run_job(self, $slurm_options)
60
63
  rescue HPC::SBATCH
61
64
  end
62
65
  end
63
66
  end
64
67
  end
65
68
 
66
- ARGV.concat ["-W", $slurm_options[:workflows]] if $slurm_options[:workflows]
69
+ module RemoteStep::SSH
70
+
71
+ def _run
72
+ RemoteWorkflow::SSH.run_slurm_job(File.join(base_url, task.to_s), @input_id, @base_name, $slurm_options)
73
+ end
74
+
75
+ end
76
+
77
+ SOPT.current_options = rbbt_options
67
78
  load Rbbt.share.rbbt_commands.workflow.task.find
@@ -3,10 +3,13 @@
3
3
  require 'rbbt/util/simpleopt'
4
4
  require 'rbbt/workflow'
5
5
  require 'rbbt/workflow/usage'
6
+ require 'rbbt/workflow/remote_workflow'
6
7
  require 'rbbt/hpc'
7
8
  require 'rbbt/hpc/orchestrate'
8
9
  require 'time'
9
10
 
11
+ rbbt_options = SOPT::GOT_OPTIONS
12
+
10
13
  $slurm_options = SOPT.get <<EOF
11
14
  -dr--dry_run Print only the template
12
15
  -cj--clean_job Clean job
@@ -46,6 +49,8 @@ EOF
46
49
  batch_system = $slurm_options.delete :batch_system
47
50
  batch_system ||= 'auto'
48
51
 
52
+ $slurm_options[:config_keys] = SOPT::GOT_OPTIONS[:config_keys]
53
+
49
54
  HPC::BATCH_MODULE = HPC.batch_system batch_system
50
55
 
51
56
  raise ParameterException.new("Could not detect batch_system: #{Misc.fingerprint batch_system}") if HPC::BATCH_MODULE.nil?
@@ -61,7 +66,6 @@ class Step
61
66
  else
62
67
  begin
63
68
  Log.debug "Issuing SLURM job for #{self.path}"
64
- #@batch_job_id, @batch_job_dir = HPC::BATCH_MODULE.orchestrate_job(self, SOPT::GOT_OPTIONS.merge($slurm_options))
65
69
  @batch_job_id, @batch_job_dir = HPC::BATCH_MODULE.orchestrate_job(self, $slurm_options)
66
70
  if no_load
67
71
  self
@@ -75,6 +79,14 @@ class Step
75
79
  end
76
80
  end
77
81
 
78
- ARGV.concat ['--detach']
79
- ARGV.concat ["-W", $slurm_options[:workflows]] if $slurm_options[:workflows]
82
+ module RemoteStep::SSH
83
+
84
+ def _run
85
+ RemoteWorkflow::SSH.orchestrate_slurm_job(File.join(base_url, task.to_s), @input_id, @base_name, $slurm_options)
86
+ end
87
+
88
+ end
89
+
90
+ SOPT.current_options = rbbt_options
91
+
80
92
  load Rbbt.share.rbbt_commands.workflow.task.find
@@ -3,9 +3,12 @@
3
3
  require 'rbbt/util/simpleopt'
4
4
  require 'rbbt/workflow'
5
5
  require 'rbbt/workflow/usage'
6
+ require 'rbbt/workflow/remote_workflow'
6
7
  require 'rbbt/hpc'
7
8
  require 'time'
8
9
 
10
+ rbbt_options = SOPT::GOT_OPTIONS
11
+
9
12
  $slurm_options = SOPT.get <<EOF
10
13
  -dr--dry_run Print only the template
11
14
  -cj--clean_job Clean job
@@ -56,12 +59,20 @@ class Step
56
59
  else
57
60
  begin
58
61
  Log.debug "Issuing SLURM job for #{self.path}"
59
- HPC::BATCH_MODULE.run_job(self, SOPT::GOT_OPTIONS.merge($slurm_options))
62
+ HPC::BATCH_MODULE.run_job(self, $slurm_options)
60
63
  rescue HPC::SBATCH
61
64
  end
62
65
  end
63
66
  end
64
67
  end
65
68
 
66
- ARGV.concat ["-W", $slurm_options[:workflows]] if $slurm_options[:workflows]
69
+ module RemoteStep::SSH
70
+
71
+ def _run
72
+ RemoteWorkflow::SSH.run_slurm_job(File.join(base_url, task.to_s), @input_id, @base_name, $slurm_options)
73
+ end
74
+
75
+ end
76
+
77
+ SOPT.current_options = rbbt_options
67
78
  load Rbbt.share.rbbt_commands.workflow.task.find
@@ -3,10 +3,13 @@
3
3
  require 'rbbt/util/simpleopt'
4
4
  require 'rbbt/workflow'
5
5
  require 'rbbt/workflow/usage'
6
+ require 'rbbt/workflow/remote_workflow'
6
7
  require 'rbbt/hpc'
7
8
  require 'rbbt/hpc/orchestrate'
8
9
  require 'time'
9
10
 
11
+ rbbt_options = SOPT::GOT_OPTIONS
12
+
10
13
  $slurm_options = SOPT.get <<EOF
11
14
  -dr--dry_run Print only the template
12
15
  -cj--clean_job Clean job
@@ -46,6 +49,8 @@ EOF
46
49
  batch_system = $slurm_options.delete :batch_system
47
50
  batch_system ||= 'auto'
48
51
 
52
+ $slurm_options[:config_keys] = SOPT::GOT_OPTIONS[:config_keys]
53
+
49
54
  HPC::BATCH_MODULE = HPC.batch_system batch_system
50
55
 
51
56
  raise ParameterException.new("Could not detect batch_system: #{Misc.fingerprint batch_system}") if HPC::BATCH_MODULE.nil?
@@ -61,7 +66,6 @@ class Step
61
66
  else
62
67
  begin
63
68
  Log.debug "Issuing SLURM job for #{self.path}"
64
- #@batch_job_id, @batch_job_dir = HPC::BATCH_MODULE.orchestrate_job(self, SOPT::GOT_OPTIONS.merge($slurm_options))
65
69
  @batch_job_id, @batch_job_dir = HPC::BATCH_MODULE.orchestrate_job(self, $slurm_options)
66
70
  if no_load
67
71
  self
@@ -75,6 +79,14 @@ class Step
75
79
  end
76
80
  end
77
81
 
78
- ARGV.concat ['--detach']
79
- ARGV.concat ["-W", $slurm_options[:workflows]] if $slurm_options[:workflows]
82
+ module RemoteStep::SSH
83
+
84
+ def _run
85
+ RemoteWorkflow::SSH.orchestrate_slurm_job(File.join(base_url, task.to_s), @input_id, @base_name, $slurm_options)
86
+ end
87
+
88
+ end
89
+
90
+ SOPT.current_options = rbbt_options
91
+
80
92
  load Rbbt.share.rbbt_commands.workflow.task.find
@@ -3,9 +3,12 @@
3
3
  require 'rbbt/util/simpleopt'
4
4
  require 'rbbt/workflow'
5
5
  require 'rbbt/workflow/usage'
6
+ require 'rbbt/workflow/remote_workflow'
6
7
  require 'rbbt/hpc'
7
8
  require 'time'
8
9
 
10
+ rbbt_options = SOPT::GOT_OPTIONS
11
+
9
12
  $slurm_options = SOPT.get <<EOF
10
13
  -dr--dry_run Print only the template
11
14
  -cj--clean_job Clean job
@@ -56,12 +59,20 @@ class Step
56
59
  else
57
60
  begin
58
61
  Log.debug "Issuing SLURM job for #{self.path}"
59
- HPC::BATCH_MODULE.run_job(self, SOPT::GOT_OPTIONS.merge($slurm_options))
62
+ HPC::BATCH_MODULE.run_job(self, $slurm_options)
60
63
  rescue HPC::SBATCH
61
64
  end
62
65
  end
63
66
  end
64
67
  end
65
68
 
66
- ARGV.concat ["-W", $slurm_options[:workflows]] if $slurm_options[:workflows]
69
+ module RemoteStep::SSH
70
+
71
+ def _run
72
+ RemoteWorkflow::SSH.run_slurm_job(File.join(base_url, task.to_s), @input_id, @base_name, $slurm_options)
73
+ end
74
+
75
+ end
76
+
77
+ SOPT.current_options = rbbt_options
67
78
  load Rbbt.share.rbbt_commands.workflow.task.find
@@ -547,7 +547,8 @@ if job_file = options.delete(:job_file)
547
547
  end
548
548
 
549
549
  case res
550
- when (defined?(WorkflowRemoteClient) and WorkflowRemoteClient::RemoteStep)
550
+ #when (defined?(WorkflowRemoteClient) and WorkflowRemoteClient::RemoteStep)
551
+ when (defined?(RemoteStep) and RemoteStep)
551
552
  res = job.result
552
553
  if res.respond_to? :gets
553
554
  begin
@@ -598,7 +599,7 @@ when Step
598
599
  elsif detach
599
600
  exit! 0
600
601
  else
601
- res.join if res.running?
602
+ res.join if res.running?
602
603
  if %w(float integer string boolean).include?(res.result_type.to_s)
603
604
  out.puts res.load
604
605
  else
@@ -6,7 +6,7 @@ Workflow.require_workflow "Sample"
6
6
  Workflow.require_workflow "HTS"
7
7
  class TestSLURM < Test::Unit::TestCase
8
8
 
9
- def _test_batch_options
9
+ def test_batch_options
10
10
  job = Sample.job(:mutect2, "small", :reference => "hg38")
11
11
 
12
12
  TmpFile.with_file do |batch_dir|
@@ -17,7 +17,7 @@ class TestSLURM < Test::Unit::TestCase
17
17
  end
18
18
  end
19
19
 
20
- def _test_template
20
+ def test_template
21
21
  job = Sample.job(:mutect2, "small", :reference => "hg38")
22
22
 
23
23
  TmpFile.with_file do |batch_dir|
@@ -28,7 +28,7 @@ class TestSLURM < Test::Unit::TestCase
28
28
  end
29
29
  end
30
30
 
31
- def _test_template_singularity
31
+ def test_template_singularity
32
32
  job = Sample.job(:mutect2, "small", :reference => "hg38")
33
33
 
34
34
  TmpFile.with_file do |batch_dir|
@@ -39,7 +39,7 @@ class TestSLURM < Test::Unit::TestCase
39
39
  end
40
40
  end
41
41
 
42
- def _test_template_contain
42
+ def test_template_contain
43
43
  job = Sample.job(:mutect2, "small", :reference => "hg38")
44
44
 
45
45
  TmpFile.with_file do |batch_dir|
@@ -13,5 +13,13 @@ class TestPythonUtil < Test::Unit::TestCase
13
13
  assert_equal tsv, new_tsv
14
14
  end
15
15
 
16
+ def test_numpy
17
+ ra = RbbtPython.run :numpy, :as => :np do
18
+ na = np.array([[[1,2,3], [4,5,6]]])
19
+ RbbtPython.numpy2ruby na
20
+ end
21
+ assert_equal 6, ra[0][1][2]
22
+ end
23
+
16
24
  end
17
25
 
@@ -81,5 +81,55 @@ def python_print():
81
81
  end
82
82
  assert defined
83
83
  end
84
+
85
+ def test_iterate
86
+ a2, b2 = nil, nil
87
+ RbbtPython.run :numpy, as: :np do
88
+ a = np.array([1,2])
89
+ a2 = RbbtPython.collect a do |e|
90
+ e * 2
91
+ end
92
+ b = PyCall.tuple([1,2])
93
+ b2 = RbbtPython.collect b do |e|
94
+ e * 2
95
+ end
96
+ end
97
+ assert_equal [2,4], a2
98
+ assert_equal [2,4], b2
99
+ end
100
+
101
+ def test_lambda
102
+ l = PyCall.eval "lambda e: e + 2"
103
+ assert_equal 5, l.(3)
104
+ end
105
+
106
+ def test_binding
107
+ raised = false
108
+ RbbtPython.binding_run do
109
+ pyimport :torch
110
+ pyfrom :torch, import: ["nn"]
111
+ begin
112
+ torch
113
+ rescue
114
+ raised = true
115
+ end
116
+ end
117
+ assert ! raised
118
+
119
+ raised = false
120
+ RbbtPython.binding_run do
121
+ begin
122
+ torch
123
+ rescue
124
+ raised = true
125
+ end
126
+ end
127
+ assert raised
128
+ end
129
+
130
+ def test_import_method
131
+ random = RbbtPython.import_method :torch, :rand, :random
132
+ assert random.call(1).numpy.to_f > 0
133
+ end
84
134
  end
85
135
 
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.27
4
+ version: 5.35.2
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-12-15 00:00:00.000000000 Z
11
+ date: 2023-02-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -613,113 +613,113 @@ required_rubygems_version: !ruby/object:Gem::Requirement
613
613
  - !ruby/object:Gem::Version
614
614
  version: '0'
615
615
  requirements: []
616
- rubygems_version: 3.1.4
616
+ rubygems_version: 3.1.2
617
617
  signing_key:
618
618
  specification_version: 4
619
619
  summary: Utilities for the Ruby Bioinformatics Toolkit (rbbt)
620
620
  test_files:
621
+ - test/test_helper.rb
622
+ - test/rbbt/entity/test_identifiers.rb
623
+ - test/rbbt/test_resource.rb
624
+ - test/rbbt/test_association.rb
625
+ - test/rbbt/hpc/test_orchestrate.rb
626
+ - test/rbbt/hpc/test_slurm.rb
627
+ - test/rbbt/hpc/orchestrate/test_batches.rb
628
+ - test/rbbt/hpc/orchestrate/test_rules.rb
629
+ - test/rbbt/hpc/orchestrate/test_chains.rb
630
+ - test/rbbt/hpc/test_batch.rb
631
+ - test/rbbt/persist/test_tsv.rb
632
+ - test/rbbt/persist/tsv/test_kyotocabinet.rb
633
+ - test/rbbt/persist/tsv/test_lmdb.rb
634
+ - test/rbbt/persist/tsv/test_tokyocabinet.rb
635
+ - test/rbbt/persist/tsv/test_cdb.rb
636
+ - test/rbbt/persist/tsv/test_leveldb.rb
637
+ - test/rbbt/persist/tsv/test_sharder.rb
638
+ - test/rbbt/test_packed_index.rb
621
639
  - test/rbbt/test_entity.rb
640
+ - test/rbbt/test_fix_width_table.rb
622
641
  - test/rbbt/workflow/test_remote_workflow.rb
642
+ - test/rbbt/workflow/test_doc.rb
643
+ - test/rbbt/workflow/step/test_save_load_inputs.rb
644
+ - test/rbbt/workflow/step/test_dependencies.rb
645
+ - test/rbbt/workflow/test_schedule.rb
623
646
  - test/rbbt/workflow/util/test_archive.rb
624
647
  - test/rbbt/workflow/util/test_orchestrator.rb
625
648
  - test/rbbt/workflow/util/test_data.rb
626
- - test/rbbt/workflow/test_doc.rb
627
- - test/rbbt/workflow/test_schedule.rb
628
- - test/rbbt/workflow/test_step.rb
629
- - test/rbbt/workflow/step/test_dependencies.rb
630
- - test/rbbt/workflow/step/test_save_load_inputs.rb
631
649
  - test/rbbt/workflow/test_task.rb
632
- - test/rbbt/resource/test_path.rb
633
- - test/rbbt/util/test_colorize.rb
650
+ - test/rbbt/workflow/test_step.rb
651
+ - test/rbbt/test_tsv.rb
652
+ - test/rbbt/test_annotations.rb
653
+ - test/rbbt/test_knowledge_base.rb
654
+ - test/rbbt/util/test_migrate.rb
655
+ - test/rbbt/util/test_simpleDSL.rb
656
+ - test/rbbt/util/concurrency/processes/test_socket.rb
657
+ - test/rbbt/util/concurrency/test_processes.rb
658
+ - test/rbbt/util/concurrency/test_threads.rb
659
+ - test/rbbt/util/test_filecache.rb
660
+ - test/rbbt/util/simpleopt/test_get.rb
661
+ - test/rbbt/util/simpleopt/test_parse.rb
662
+ - test/rbbt/util/simpleopt/test_setup.rb
663
+ - test/rbbt/util/test_misc.rb
664
+ - test/rbbt/util/test_excel2tsv.rb
665
+ - test/rbbt/util/test_semaphore.rb
634
666
  - test/rbbt/util/test_procpath.rb
667
+ - test/rbbt/util/R/test_model.rb
668
+ - test/rbbt/util/R/test_eval.rb
669
+ - test/rbbt/util/R/test_plot.rb
670
+ - test/rbbt/util/test_open.rb
671
+ - test/rbbt/util/test_tmpfile.rb
672
+ - test/rbbt/util/test_cmd.rb
673
+ - test/rbbt/util/test_concurrency.rb
674
+ - test/rbbt/util/test_colorize.rb
675
+ - test/rbbt/util/test_config.rb
635
676
  - test/rbbt/util/python/test_util.rb
636
- - test/rbbt/util/misc/test_development.rb
677
+ - test/rbbt/util/test_log.rb
678
+ - test/rbbt/util/test_simpleopt.rb
679
+ - test/rbbt/util/test_python.rb
680
+ - test/rbbt/util/test_chain_methods.rb
637
681
  - test/rbbt/util/misc/test_omics.rb
638
- - test/rbbt/util/misc/test_pipes.rb
639
- - test/rbbt/util/misc/test_serialize.rb
640
- - test/rbbt/util/misc/test_format.rb
641
- - test/rbbt/util/misc/test_communication.rb
642
682
  - test/rbbt/util/misc/test_lock.rb
643
683
  - test/rbbt/util/misc/test_multipart_payload.rb
644
684
  - test/rbbt/util/misc/test_bgzf.rb
645
- - test/rbbt/util/test_concurrency.rb
646
- - test/rbbt/util/test_cmd.rb
647
- - test/rbbt/util/R/test_plot.rb
648
- - test/rbbt/util/R/test_eval.rb
649
- - test/rbbt/util/R/test_model.rb
650
- - test/rbbt/util/test_config.rb
651
- - test/rbbt/util/test_log.rb
652
- - test/rbbt/util/test_simpleDSL.rb
685
+ - test/rbbt/util/misc/test_development.rb
686
+ - test/rbbt/util/misc/test_serialize.rb
687
+ - test/rbbt/util/misc/test_format.rb
688
+ - test/rbbt/util/misc/test_communication.rb
689
+ - test/rbbt/util/misc/test_pipes.rb
653
690
  - test/rbbt/util/log/test_progress.rb
654
- - test/rbbt/util/test_tmpfile.rb
655
691
  - test/rbbt/util/test_R.rb
656
- - test/rbbt/util/test_excel2tsv.rb
657
- - test/rbbt/util/test_misc.rb
658
- - test/rbbt/util/test_open.rb
659
- - test/rbbt/util/test_simpleopt.rb
660
- - test/rbbt/util/simpleopt/test_parse.rb
661
- - test/rbbt/util/simpleopt/test_setup.rb
662
- - test/rbbt/util/simpleopt/test_get.rb
663
- - test/rbbt/util/test_python.rb
664
- - test/rbbt/util/test_filecache.rb
665
- - test/rbbt/util/concurrency/test_processes.rb
666
- - test/rbbt/util/concurrency/test_threads.rb
667
- - test/rbbt/util/concurrency/processes/test_socket.rb
668
- - test/rbbt/util/test_semaphore.rb
669
- - test/rbbt/util/test_chain_methods.rb
670
- - test/rbbt/util/test_migrate.rb
671
- - test/rbbt/test_resource.rb
672
- - test/rbbt/test_packed_index.rb
673
- - test/rbbt/tsv/test_change_id.rb
674
- - test/rbbt/tsv/test_attach.rb
675
- - test/rbbt/tsv/test_filter.rb
676
- - test/rbbt/tsv/test_marshal.rb
692
+ - test/rbbt/test_workflow.rb
693
+ - test/rbbt/knowledge_base/test_entity.rb
694
+ - test/rbbt/knowledge_base/test_enrichment.rb
695
+ - test/rbbt/knowledge_base/test_traverse.rb
696
+ - test/rbbt/knowledge_base/test_syndicate.rb
697
+ - test/rbbt/knowledge_base/test_registry.rb
698
+ - test/rbbt/knowledge_base/test_query.rb
699
+ - test/rbbt/association/test_item.rb
700
+ - test/rbbt/association/test_util.rb
701
+ - test/rbbt/association/test_open.rb
702
+ - test/rbbt/association/test_database.rb
703
+ - test/rbbt/association/test_index.rb
704
+ - test/rbbt/annotations/test_util.rb
705
+ - test/rbbt/test_monitor.rb
706
+ - test/rbbt/resource/test_path.rb
707
+ - test/rbbt/test_hpc.rb
708
+ - test/rbbt/test_persist.rb
677
709
  - test/rbbt/tsv/test_parser.rb
678
710
  - test/rbbt/tsv/test_csv.rb
679
- - test/rbbt/tsv/test_accessor.rb
680
- - test/rbbt/tsv/test_matrix.rb
711
+ - test/rbbt/tsv/test_manipulate.rb
681
712
  - test/rbbt/tsv/test_field_index.rb
682
713
  - test/rbbt/tsv/test_util.rb
683
- - test/rbbt/tsv/test_index.rb
714
+ - test/rbbt/tsv/test_accessor.rb
715
+ - test/rbbt/tsv/test_filter.rb
716
+ - test/rbbt/tsv/test_stream.rb
684
717
  - test/rbbt/tsv/test_parallel.rb
685
- - test/rbbt/tsv/test_manipulate.rb
718
+ - test/rbbt/tsv/test_marshal.rb
719
+ - test/rbbt/tsv/test_matrix.rb
720
+ - test/rbbt/tsv/test_attach.rb
686
721
  - test/rbbt/tsv/test_excel.rb
687
- - test/rbbt/tsv/parallel/test_through.rb
722
+ - test/rbbt/tsv/test_change_id.rb
723
+ - test/rbbt/tsv/test_index.rb
688
724
  - test/rbbt/tsv/parallel/test_traverse.rb
689
- - test/rbbt/tsv/test_stream.rb
690
- - test/rbbt/test_association.rb
691
- - test/rbbt/hpc/test_batch.rb
692
- - test/rbbt/hpc/orchestrate/test_chains.rb
693
- - test/rbbt/hpc/orchestrate/test_rules.rb
694
- - test/rbbt/hpc/orchestrate/test_batches.rb
695
- - test/rbbt/hpc/test_slurm.rb
696
- - test/rbbt/hpc/test_orchestrate.rb
697
- - test/rbbt/association/test_database.rb
698
- - test/rbbt/association/test_item.rb
699
- - test/rbbt/association/test_open.rb
700
- - test/rbbt/association/test_util.rb
701
- - test/rbbt/association/test_index.rb
702
- - test/rbbt/test_knowledge_base.rb
703
- - test/rbbt/persist/tsv/test_kyotocabinet.rb
704
- - test/rbbt/persist/tsv/test_cdb.rb
705
- - test/rbbt/persist/tsv/test_lmdb.rb
706
- - test/rbbt/persist/tsv/test_sharder.rb
707
- - test/rbbt/persist/tsv/test_leveldb.rb
708
- - test/rbbt/persist/tsv/test_tokyocabinet.rb
709
- - test/rbbt/persist/test_tsv.rb
710
- - test/rbbt/test_tsv.rb
711
- - test/rbbt/test_annotations.rb
712
- - test/rbbt/test_fix_width_table.rb
713
- - test/rbbt/test_workflow.rb
714
- - test/rbbt/entity/test_identifiers.rb
715
- - test/rbbt/annotations/test_util.rb
716
- - test/rbbt/test_hpc.rb
717
- - test/rbbt/test_monitor.rb
718
- - test/rbbt/test_persist.rb
719
- - test/rbbt/knowledge_base/test_entity.rb
720
- - test/rbbt/knowledge_base/test_registry.rb
721
- - test/rbbt/knowledge_base/test_syndicate.rb
722
- - test/rbbt/knowledge_base/test_query.rb
723
- - test/rbbt/knowledge_base/test_enrichment.rb
724
- - test/rbbt/knowledge_base/test_traverse.rb
725
- - test/test_helper.rb
725
+ - test/rbbt/tsv/parallel/test_through.rb