rbbt-util 5.32.12 → 5.32.17

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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rbbt/annotations/util.rb +1 -0
  3. data/lib/rbbt/entity.rb +6 -1
  4. data/lib/rbbt/hpc/batch.rb +3 -2
  5. data/lib/rbbt/hpc/orchestrate.rb +1 -0
  6. data/lib/rbbt/hpc/slurm.rb +2 -0
  7. data/lib/rbbt/resource/path.rb +6 -6
  8. data/lib/rbbt/tsv.rb +5 -0
  9. data/lib/rbbt/tsv/manipulate.rb +2 -0
  10. data/lib/rbbt/tsv/parallel/traverse.rb +9 -12
  11. data/lib/rbbt/util/R.rb +2 -2
  12. data/lib/rbbt/util/log.rb +15 -4
  13. data/lib/rbbt/util/log/progress/util.rb +2 -1
  14. data/lib/rbbt/util/misc/inspect.rb +1 -1
  15. data/lib/rbbt/util/misc/omics.rb +2 -2
  16. data/lib/rbbt/util/misc/system.rb +2 -2
  17. data/lib/rbbt/util/open.rb +1 -0
  18. data/lib/rbbt/util/python.rb +63 -3
  19. data/lib/rbbt/workflow.rb +54 -2
  20. data/lib/rbbt/workflow/accessor.rb +15 -242
  21. data/lib/rbbt/workflow/definition.rb +2 -1
  22. data/lib/rbbt/workflow/dependencies.rb +195 -0
  23. data/lib/rbbt/workflow/step.rb +10 -158
  24. data/lib/rbbt/workflow/step/accessor.rb +1 -311
  25. data/lib/rbbt/workflow/step/dependencies.rb +43 -3
  26. data/lib/rbbt/workflow/step/info.rb +294 -0
  27. data/lib/rbbt/workflow/step/status.rb +146 -0
  28. data/lib/rbbt/workflow/usage.rb +4 -2
  29. data/lib/rbbt/workflow/util/data.rb +35 -0
  30. data/lib/rbbt/workflow/util/orchestrator.rb +1 -1
  31. data/lib/rbbt/workflow/util/provenance.rb +40 -9
  32. data/python/rbbt.py +7 -0
  33. data/share/install/software/lib/install_helpers +1 -1
  34. data/share/rbbt_commands/hpc/orchestrate +4 -1
  35. data/share/rbbt_commands/hpc/task +2 -0
  36. data/share/rbbt_commands/lsf/orchestrate +4 -1
  37. data/share/rbbt_commands/lsf/task +2 -0
  38. data/share/rbbt_commands/slurm/orchestrate +4 -1
  39. data/share/rbbt_commands/slurm/task +2 -0
  40. data/share/rbbt_commands/system/clean +1 -0
  41. data/share/rbbt_commands/workflow/prov +1 -1
  42. data/test/rbbt/util/test_python.rb +3 -2
  43. data/test/rbbt/workflow/util/test_data.rb +48 -0
  44. metadata +9 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 355cf2694fc6b449600580f6c09f2a0a6055013285b5c53ada6ad2f920d7f63c
4
- data.tar.gz: 26e430d330e39371b8fb59f3508b3e1eb215bf042bf2faa5262040fd19369e24
3
+ metadata.gz: 2e7aa425415a69c6615edd3fd7f38ce4c0bba0b1a911e7f97e927bf433483401
4
+ data.tar.gz: d2e8045de7f45d961afd8671b694c4c92f629dbc41d96057c84b9e97fc8cf15c
5
5
  SHA512:
6
- metadata.gz: ecec79da1a0b8ecdbcec6e600965d6cc8a336f6d33a4dd3ada4a75e2c6ae8d98300a210bc17eec7bb16639c4d73b4a6efe7bceb043037fa0aeaf76d3da20b172
7
- data.tar.gz: 3af9d791b8423f99c67c473541fcc6b685c2cb4ca454423ff0b69d686442b40574d337df749dcf811369b81d68c648ff733dcf3c4e2e655953aba0f4569b85b1
6
+ metadata.gz: b4f577d5d647b6c9ce1226062e7f5a459e6dee13e151e782d5938494a3e061d4b3fcc41bd14a8276ea646e58b726571445a45db7f2fe03dc34f4ca28d94c2d9a
7
+ data.tar.gz: d8432ea0d5232ddd9ac89c9e9cf0880a677cf708772ea5d0a6b6e28bd2204831d676e613a218c616c950c509c381a0ab2cf1acf88b98a85e9d4f18c3480ef48c
@@ -152,6 +152,7 @@ module Annotated
152
152
  tsv = TSV.setup({}, :key_field => "List", :fields => fields, :type => :list, :unnamed => true)
153
153
 
154
154
  annot_id = annotations.id
155
+ annot_id = annot_id * "," if Array === annot_id
155
156
  tsv[annot_id] = annotations.tsv_values(*fields).dup
156
157
 
157
158
  when Array === annotations
data/lib/rbbt/entity.rb CHANGED
@@ -197,7 +197,7 @@ module Entity
197
197
  if self.instance_variable_get("@multiple_result_" + name.to_s)
198
198
  return self.instance_variable_get("@multiple_result_" + name.to_s)
199
199
  end
200
- raise MultipleEntity, "Entity #{name} runs with multiple entities"
200
+ raise MultipleEntity, "Entity property #{name} runs with multiple entities"
201
201
  end
202
202
 
203
203
  define_method name do |*args|
@@ -225,10 +225,12 @@ module Entity
225
225
  case res
226
226
  when Array
227
227
  missing.zip(res).each do |o,res|
228
+ raise "Multiple function #{name} result nil for element #{o}" if res.nil?
228
229
  o.instance_variable_set("@multiple_result_" + name.to_s, res)
229
230
  end
230
231
  when Hash
231
232
  res.each do |o,res|
233
+ raise "Multiple function #{name} result nil for element #{o}" if res.nil?
232
234
  o.instance_variable_set("@multiple_result_" + name.to_s, res)
233
235
  end
234
236
  end
@@ -254,7 +256,10 @@ module Entity
254
256
 
255
257
  orig_method_name = method_name
256
258
  multi_name = "_multiple_" + method_name.to_s
259
+ single_name = "_single_" + method_name.to_s
260
+
257
261
  method_name = multi_name if self.instance_methods.include?(multi_name.to_sym)
262
+ method_name = single_name if self.instance_methods.include?(single_name.to_sym)
258
263
 
259
264
  orig_name = UNPERSISTED_PREFIX + method_name.to_s
260
265
  alias_method orig_name, method_name unless self.instance_methods.include? orig_name.to_sym
@@ -139,7 +139,7 @@ EOF
139
139
 
140
140
  keys = [
141
141
  :batch_dir,
142
- :batch_modules,
142
+ :lua_modules,
143
143
  :batch_name,
144
144
  :contain,
145
145
  :contain_and_sync,
@@ -157,6 +157,7 @@ EOF
157
157
  :singularity_ruby_inline,
158
158
  :sync,
159
159
  :task_cpus,
160
+ :gres,
160
161
  :mem,
161
162
  :mem_per_cpu,
162
163
  :licenses,
@@ -289,7 +290,7 @@ let MAX_MEMORY="$(grep MemTotal /proc/meminfo|grep -o "[[:digit:]]*") / 1024"
289
290
  end
290
291
 
291
292
  def prepare_environment(options = {})
292
- modules = options[:batch_modules]
293
+ modules = options[:lua_modules]
293
294
 
294
295
  prepare_environment = ""
295
296
 
@@ -97,6 +97,7 @@ module HPC
97
97
  chains[job] ||= []
98
98
  chains[job] << dep
99
99
  chains[job].concat chains[dep] if chains[dep]
100
+ chains[job].uniq!
100
101
  end
101
102
 
102
103
  chains
@@ -30,6 +30,7 @@ export BATCH_SYSTEM=SLURM
30
30
  highmem = Misc.process_options options, :highmem
31
31
  licenses = Misc.process_options options, :licenses
32
32
  constraint = Misc.process_options options, :constraint
33
+ gres = Misc.process_options options, :gres
33
34
 
34
35
  mem = Misc.process_options options, :mem
35
36
  mem_per_cpu = Misc.process_options options, :mem_per_cpu
@@ -50,6 +51,7 @@ export BATCH_SYSTEM=SLURM
50
51
  "time" => time,
51
52
  "exclusive" => exclusive,
52
53
  "licenses" => licenses,
54
+ "gres" => gres,
53
55
  "mem" => mem,
54
56
  "mem-per-cpu" => mem_per_cpu,
55
57
  }
@@ -159,6 +159,12 @@ module Path
159
159
  end
160
160
 
161
161
  def find(where = nil, caller_lib = nil, paths = nil)
162
+
163
+ if located?
164
+ self.original ||= self
165
+ return self
166
+ end
167
+
162
168
  @path ||= {}
163
169
  rsearch_paths = (resource and resource.respond_to?(:search_paths)) ? resource.search_paths : nil
164
170
  key_elems = [where, caller_lib, rsearch_paths, paths]
@@ -167,12 +173,6 @@ module Path
167
173
 
168
174
  return @path[key] if @path[key]
169
175
 
170
- if located?
171
- @path[key] = self
172
- self.original ||= self
173
- return self
174
- end
175
-
176
176
  @path[key] ||= begin
177
177
  paths = [paths, rsearch_paths, self.search_paths, SEARCH_PATHS].reverse.compact.inject({}){|acc,h| acc.merge! h; acc }
178
178
  where = paths[:default] if where == :default
data/lib/rbbt/tsv.rb CHANGED
@@ -98,6 +98,11 @@ module TSV
98
98
  stream = get_stream source, options.merge(open_options)
99
99
  parse stream, data, options.merge(:tsv_grep => tsv_grep)
100
100
 
101
+ if ! open_options[:noclose]
102
+ stream.close unless stream.closed?
103
+ stream.join if stream.respond_to?(:join)
104
+ end
105
+
101
106
  data.filename = filename.to_s unless filename.nil?
102
107
 
103
108
  if data.identifiers.nil? and Path === filename and filename.identifier_file_path
@@ -174,6 +174,8 @@ module TSV
174
174
  if Hash === @monitor
175
175
  desc = @monitor[:desc] if @monitor.include? :desc
176
176
  step = @monitor[:step] if @monitor.include? :step
177
+ elsif String === @monitor
178
+ desc = @monitor
177
179
  end
178
180
  progress_monitor = Log::ProgressBar.new_bar(size, :desc => desc)
179
181
  end
@@ -97,12 +97,11 @@ module TSV
97
97
  end
98
98
  end
99
99
  rescue
100
- Log.exception $!
101
100
  error = true
102
101
  raise $!
103
102
  ensure
104
103
  join.call(error) if join
105
- Log::ProgressBar.remove_bar(bar) if bar
104
+ Log::ProgressBar.remove_bar(bar, error) if bar
106
105
  end
107
106
  end
108
107
 
@@ -138,7 +137,7 @@ module TSV
138
137
  raise $!
139
138
  ensure
140
139
  join.call(error) if join
141
- Log::ProgressBar.remove_bar(bar) if bar
140
+ Log::ProgressBar.remove_bar(bar, error) if bar
142
141
  end
143
142
  end
144
143
 
@@ -178,7 +177,7 @@ module TSV
178
177
  raise $!
179
178
  ensure
180
179
  join.call(error) if join
181
- Log::ProgressBar.remove_bar(bar) if bar
180
+ Log::ProgressBar.remove_bar(bar, error) if bar
182
181
  end
183
182
  end
184
183
 
@@ -220,7 +219,7 @@ module TSV
220
219
  raise $!
221
220
  ensure
222
221
  join.call(error) if join
223
- Log::ProgressBar.remove_bar(bar) if bar
222
+ Log::ProgressBar.remove_bar(bar, error) if bar
224
223
  end
225
224
  end
226
225
 
@@ -274,7 +273,7 @@ module TSV
274
273
  raise $!
275
274
  ensure
276
275
  join.call(error) if join
277
- Log::ProgressBar.remove_bar(bar) if bar
276
+ Log::ProgressBar.remove_bar(bar, error) if bar
278
277
  end
279
278
  end
280
279
 
@@ -319,7 +318,7 @@ module TSV
319
318
  raise $!
320
319
  ensure
321
320
  join.call(error) if join
322
- Log::ProgressBar.remove_bar(bar) if bar
321
+ Log::ProgressBar.remove_bar(bar, error) if bar
323
322
  end
324
323
  end
325
324
 
@@ -333,7 +332,7 @@ module TSV
333
332
  Log.low{"Traversing #{name} #{Log.color :green, "->"} #{stream_name(options[:into])}"}
334
333
  begin
335
334
  case obj
336
- when (defined? FastContainers and FastContainers::PriorityQueue)
335
+ when (defined? FastContainers && FastContainers::PriorityQueue === obj)
337
336
  traverse_priority_queue(obj, options, &block)
338
337
  when TSV
339
338
  traverse_tsv(obj, options, &block)
@@ -390,7 +389,7 @@ module TSV
390
389
  when Set
391
390
  traverse_array(obj.to_a, options, &block)
392
391
  when String
393
- if Open.remote? obj or Misc.is_filename? obj
392
+ if Open.remote?(obj) or Misc.is_filename?(obj)
394
393
  Open.open(obj) do |s|
395
394
  traverse_obj(s, options, &block)
396
395
  end
@@ -491,9 +490,7 @@ module TSV
491
490
  q.join
492
491
  raise $!
493
492
  ensure
494
- if bar
495
- Log::ProgressBar.remove_bar(bar, error)
496
- end
493
+ Log::ProgressBar.remove_bar(bar, error) if bar
497
494
  end
498
495
  end
499
496
 
data/lib/rbbt/util/R.rb CHANGED
@@ -41,7 +41,7 @@ source('#{UTIL}');
41
41
 
42
42
  if monitor
43
43
  #io = CMD.cmd('R --no-save --quiet', options.merge(:in => cmd, :pipe => true, :log => true))
44
- io = CMD.cmd('R --no-save --quiet', options.merge(:in => cmd, :pipe => true, :log => true, :xvfb => true))
44
+ io = CMD.cmd('R --no-save --quiet', options.merge(:in => cmd, :pipe => true, :log => true, :xvfb => options[:xvfb]))
45
45
  while line = io.gets
46
46
  case monitor
47
47
  when Proc
@@ -52,7 +52,7 @@ source('#{UTIL}');
52
52
  end
53
53
  nil
54
54
  else
55
- CMD.cmd('R --no-save --slave --quiet', options.merge(:in => cmd, :xvfb => true))
55
+ CMD.cmd('R --no-save --slave --quiet', options.merge(:in => cmd, :xvfb => options[:xvfb]))
56
56
  end
57
57
  end
58
58
 
data/lib/rbbt/util/log.rb CHANGED
@@ -322,8 +322,13 @@ module Log
322
322
 
323
323
  def self.exception(e)
324
324
  stack = caller
325
- error([e.class.to_s, e.message].compact * ": " )
326
- error("BACKTRACE [#{Process.pid}]: " << Log.last_caller(stack) << "\n" + color_stack(e.backtrace)*"\n")
325
+ if ENV["RBBT_ORIGINAL_STACK"] == 'true'
326
+ error([e.class.to_s, e.message].compact * ": " )
327
+ error("BACKTRACE [#{Process.pid}]: " << Log.last_caller(stack) << "\n" + color_stack(e.backtrace)*"\n")
328
+ else
329
+ error("BACKTRACE [#{Process.pid}]: " << Log.last_caller(stack) << "\n" + color_stack(e.backtrace.reverse)*"\n")
330
+ error([e.class.to_s, e.message].compact * ": " )
331
+ end
327
332
  end
328
333
 
329
334
  def self.deprecated(m)
@@ -370,11 +375,17 @@ module Log
370
375
 
371
376
  def self.stack(stack)
372
377
  LOG_MUTEX.synchronize do
373
-
374
- STDERR.puts Log.color :magenta, "Stack trace [#{Process.pid}]: " << Log.last_caller(caller)
378
+ if ENV["RBBT_ORIGINAL_STACK"] == 'true'
379
+ STDERR.puts Log.color :magenta, "Stack trace [#{Process.pid}]: " << Log.last_caller(caller)
375
380
  color_stack(stack).each do |line|
376
381
  STDERR.puts line
377
382
  end
383
+ else
384
+ STDERR.puts Log.color :magenta, "Stack trace [#{Process.pid}]: " << Log.last_caller(caller)
385
+ color_stack(stack.reverse).each do |line|
386
+ STDERR.puts line
387
+ end
388
+ end
378
389
  end
379
390
  end
380
391
 
@@ -80,10 +80,11 @@ module Log
80
80
 
81
81
  def self.with_bar(max, options = {})
82
82
  bar = new_bar(max, options)
83
+ res = nil
83
84
  begin
84
85
  error = false
85
- yield bar
86
86
  keep = false
87
+ yield bar
87
88
  rescue KeepBar
88
89
  keep = true
89
90
  rescue
@@ -320,7 +320,7 @@ module Misc
320
320
  end
321
321
  end
322
322
  when String
323
- if Misc.is_filename?(obj) and ! %w(. ..).include?(obj)
323
+ if Misc.is_filename?(obj, false) and ! %w(. ..).include?(obj) and ! Path === obj
324
324
  obj2str Path.setup(obj.dup)
325
325
  else
326
326
  obj = obj.chomp if String === obj
@@ -511,9 +511,9 @@ module Misc
511
511
 
512
512
  case chr_prefix.to_s.downcase
513
513
  when "remove"
514
- sort_order = sort_order.collect{|chr| "chr" + chr } unless sort_order.first.include?('chr')
515
- when "true", "add"
516
514
  sort_order = sort_order.collect{|chr| chr.sub('chr', '') } if sort_order.first.include?('chr')
515
+ when "true", "add"
516
+ sort_order = sort_order.collect{|chr| "chr" + chr } unless sort_order.first.include?('chr')
517
517
  end
518
518
 
519
519
  sort_genomic_locations_by_contig(mutations, sort_order)
@@ -112,10 +112,10 @@ end
112
112
  res
113
113
  end
114
114
 
115
- def self.is_filename?(string)
115
+ def self.is_filename?(string, need_to_exists = true)
116
116
  return true if defined? Path and Path === string
117
117
  return true if string.respond_to? :exists
118
- return true if String === string and string.length < 265 and File.exist?(string)
118
+ return true if String === string and string.length < 265 and (File.exist?(string) || ! need_to_exists)
119
119
  return false
120
120
  end
121
121
 
@@ -240,6 +240,7 @@ module Open
240
240
  end
241
241
 
242
242
  def self.find_repo_dir(file)
243
+ return nil
243
244
  self.repository_dirs.each do |dir|
244
245
  dir = dir + '/' unless dir.chars[-1] == "/"
245
246
 
@@ -3,10 +3,56 @@ require 'pycall/import'
3
3
 
4
4
  module RbbtPython
5
5
  extend PyCall::Import
6
+
7
+ def self.exec(script)
8
+ PyCall.exec(script)
9
+ end
10
+
11
+ def self.iterate(iterator, options = {})
12
+ bar = options[:bar]
13
+
14
+ case bar
15
+ when TrueClass
16
+ bar = Log::ProgressBar.new nil, :desc => "RbbtPython iterate"
17
+ when String
18
+ bar = Log::ProgressBar.new nil, :desc => bar
19
+ end
20
+
21
+ while true
22
+ begin
23
+ yield iterator.__next__
24
+ bar.tick if bar
25
+ rescue PyCall::PyError
26
+ if $!.type.to_s == "<class 'StopIteration'>"
27
+ break
28
+ else
29
+ raise $!
30
+ end
31
+ rescue
32
+ bar.error if bar
33
+ raise $!
34
+ end
35
+ end
36
+
37
+ Log::ProgressBar.remove_bar bar if bar
38
+ nil
39
+ end
40
+
41
+ def self.collect(iterator, options = {}, &block)
42
+ acc = []
43
+ self.iterate(iterator, options) do |elem|
44
+ res = block.call elem
45
+ acc << res
46
+ end
47
+ acc
48
+ end
49
+
6
50
  def self.run(mod = nil, imports = nil, &block)
7
51
  if mod
8
- if imports
52
+ if Array === imports
9
53
  pyfrom mod, :import => imports
54
+ elsif Hash === imports
55
+ pyimport mod, imports
10
56
  else
11
57
  pyimport mod
12
58
  end
@@ -17,8 +63,10 @@ module RbbtPython
17
63
 
18
64
  def self.run_log(mod = nil, imports = nil, severity = 0, severity_err = nil, &block)
19
65
  if mod
20
- if imports
66
+ if Array === imports
21
67
  pyfrom mod, :import => imports
68
+ elsif Hash === imports
69
+ pyimport mod, imports
22
70
  else
23
71
  pyimport mod
24
72
  end
@@ -31,8 +79,10 @@ module RbbtPython
31
79
 
32
80
  def self.run_log_stderr(mod = nil, imports = nil, severity = 0, &block)
33
81
  if mod
34
- if imports
82
+ if Array === imports
35
83
  pyfrom mod, :import => imports
84
+ elsif Hash === imports
85
+ pyimport mod, imports
36
86
  else
37
87
  pyimport mod
38
88
  end
@@ -49,4 +99,14 @@ module RbbtPython
49
99
  end
50
100
  end
51
101
 
102
+ def self.add_paths(paths)
103
+ self.run 'sys' do
104
+ paths.each do |path|
105
+ sys.path.append path
106
+ end
107
+ end
108
+ end
109
+
110
+ RbbtPython.add_paths Rbbt.python.find_all
111
+ RbbtPython.pyimport "rbbt"
52
112
  end