rbbt-util 5.41.1 → 5.42.0

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: 4bd731f2fb8604116f9baf947e8e0b5f5e8bd1b252773864f5a76e9c4b52126d
4
- data.tar.gz: 82c364cc76d5921e49197c410d05a919e8b71a96d0499827b0546bf402c401ae
3
+ metadata.gz: 8b23de77e3900d1a81e8ffa349ab9f88a4283f30bb2cec62c04bff4539243170
4
+ data.tar.gz: 494b18d5e2ba4802225617a03b2f69255ec9deab173e8d18e06654a7b415325c
5
5
  SHA512:
6
- metadata.gz: 655e499e17ea4806f278ecaf83521c200aa978ace61c27f5aac0490bc99a40cac42498f323155ee3c547a2a98d23271a8fa6d3b424180c87b249b50219fb7235
7
- data.tar.gz: c3ef8cc5790db9bb5df6d0853542355b267e2f8f26c4b6bc8305729b793eff8832a33479a53339605bcaf8b450a500dc58a9bd5557e1d993f8c8b72228ab1793
6
+ metadata.gz: d57bd3bc7ff84a4e8101dd907f98ef20923dbcab95c3187523e6b84eba6774d900f269ed2457fd6e1a81821edf3e2d1f11fcbdd5863f791282d549bcf83a48a5
7
+ data.tar.gz: a4857d82292ab4234cf10fbf2fcb242b466e6400f9476cb4de4bc625ff808542a690f27fbd9dede4ff692a82644561ebfc086ccdf953102cb4f7a0020b094849
@@ -15,6 +15,7 @@ module HPC
15
15
  when 'pbs'
16
16
  HPC::PBS
17
17
  when 'auto'
18
+ $previous_commands = [] if $previous_commands.nil?
18
19
  case $previous_commands.last
19
20
  when 'slurm'
20
21
  HPC::SLURM
@@ -735,7 +736,7 @@ env > #{batch_options[:fenv]}
735
736
  end
736
737
 
737
738
  def job_queued(job)
738
- job_status(job).split(/\s+/).include?(job.to_s)
739
+ job_status(job).split(/[\s\.]+/).include?(job.to_s)
739
740
  end
740
741
 
741
742
  def wait_for_job(batch_dir, time = 1)
@@ -8,8 +8,8 @@ module TSV
8
8
 
9
9
  identifiers, persist_input = Misc.process_options options, :identifiers, :persist_input
10
10
 
11
- identifiers = Organism.identifiers(tsv.namespace) if identifiers.nil? and tsv.namespace
12
-
11
+ identifiers = Organism.identifiers(tsv.namespace) if identifiers.nil? && tsv.namespace &&
12
+ defined?(Organism) && Organism.identifiers(tsv.namespace).exists?
13
13
 
14
14
  if ! tsv.fields.include?(format)
15
15
  new = {}
@@ -58,7 +58,10 @@ 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 defined?(Organism) && identifiers.nil? && tsv.namespace && Organism.identifiers(tsv.namespace).exists?
61
+
62
+ identifiers = Organism.identifiers(tsv.namespace) if identifiers.nil? && tsv.namespace &&
63
+ defined?(Organism) && Organism.identifiers(tsv.namespace).exists?
64
+
62
65
  identifiers.namespace ||= tsv.namespace
63
66
 
64
67
  fields = (identifiers and identifiers.all_fields.include?(field))? [field] : nil
data/lib/rbbt/util/R.rb CHANGED
@@ -50,7 +50,7 @@ source('#{UTIL}');
50
50
  Log.debug "R: " << line
51
51
  end
52
52
  end
53
- nil
53
+ io.join if io.respond_to? :join
54
54
  else
55
55
  CMD.cmd('R --no-save --slave --quiet', options.merge(:in => cmd, :xvfb => options[:xvfb]))
56
56
  end
@@ -18,7 +18,7 @@ module Rbbt::Config
18
18
  Log.debug "Loading config file: #{ file }"
19
19
  TSV.traverse file, :type => :array do |line|
20
20
  next if line =~ /^#/
21
- key, value, *tokens = line.strip.split(/\s/)
21
+ key, value, *tokens = line.strip.split(/\s+/)
22
22
 
23
23
  self.add_entry(key, value, tokens) if key
24
24
  end
data/lib/rbbt/util/log.rb CHANGED
@@ -399,6 +399,10 @@ module Log
399
399
  end
400
400
  end
401
401
  end
402
+ LOG_MUTEX.synchronize do
403
+ Log::LAST.replace "log"
404
+ end
405
+ nil
402
406
  end
403
407
 
404
408
  def self.stack(stack)
@@ -203,7 +203,7 @@ module NamedArray
203
203
 
204
204
  def report
205
205
  fields.zip(self).collect do |field,value|
206
- "#{ field }: #{ Array === value ? value * "|" : value }"
206
+ "#{Log.color(:magenta, field) }: #{ Array === value ? value * "|" : value }"
207
207
  end * "\n"
208
208
  end
209
209
 
@@ -101,7 +101,6 @@ module Open
101
101
 
102
102
  CMD.cmd("wget '#{ url }'", wget_options)
103
103
  rescue
104
- STDERR.puts $!.backtrace.inspect
105
104
  raise OpenURLError, "Error reading remote url: #{ url }.\n#{$!.message}"
106
105
  end
107
106
  end
@@ -654,7 +653,12 @@ module Open
654
653
  end
655
654
 
656
655
  def self.download(url, path)
657
- Open.wget(url, "--output-document" => path, :pipe => false)
656
+ begin
657
+ Open.wget(url, "--output-document" => path, :pipe => false)
658
+ rescue Exception
659
+ Open.rm(path) if Open.exist?(path)
660
+ raise $!
661
+ end
658
662
  end
659
663
 
660
664
  def self.can_open?(file)
@@ -129,6 +129,8 @@ module Workflow
129
129
  end
130
130
  end
131
131
 
132
+ alias task_alias dep_task
133
+
132
134
  def task(name, &block)
133
135
  if Hash === name
134
136
  type = name.first.last
@@ -1,4 +1,47 @@
1
1
  module Workflow
2
+
3
+ OUTPUT_FIELDS=%w(outdir output)
4
+
5
+ def self.parse_nextflow_schema(file)
6
+ doc = Open.open(file){|f| JSON.parse(f.read) }
7
+ description = doc["description"]
8
+
9
+ properties = {}
10
+ required = []
11
+
12
+ properties[nil] = doc["properties"] if doc["properties"]
13
+ required.concat doc["required"] if doc["required"]
14
+
15
+ doc["definitions"].each do |section,section_info|
16
+ next unless section_info["properties"]
17
+ name = section_info["title"] || section
18
+ properties[name] = section_info["properties"]
19
+ required.concat section_info["required"] if section_info["required"] if section_info["required"]
20
+ end if doc["definitions"]
21
+
22
+ required = required.compact.flatten
23
+
24
+ parameters = {}
25
+ properties.each do |section,param_info|
26
+ param_info.each do |name,info|
27
+ input_options = {}
28
+ type = info["type"]
29
+ format = info["format"]
30
+ input_desc = info["description"]
31
+ input_section = info["description"]
32
+ input_required = required.include?(name)
33
+ input_options[:required] = true if input_required && ! OUTPUT_FIELDS.include?(name)
34
+ if info.include?("enum")
35
+ type = 'select'
36
+ input_options[:select_options] = info["enum"]
37
+ end
38
+ parameters[name] = {type: type, format: format, description: input_desc, options: input_options, section: section}
39
+ end
40
+ end
41
+
42
+ [description, parameters]
43
+ end
44
+
2
45
  def self.nextflow_file_params(file)
3
46
  Open.read(file).scan(/params\.\w+/).collect{|p| p.split(".").last}.uniq
4
47
  end
@@ -16,8 +59,11 @@ module Workflow
16
59
  included_file += '.nf' unless File.exist?(included_file) || ! File.exist?(included_file + '.nf')
17
60
  name_str.split(";").each do |name|
18
61
  name = name.strip
19
- include_params = nextflow_recursive_params(included_file).collect{|p| [p,name] * "-"}
20
- params += include_params
62
+ begin
63
+ include_params = nextflow_recursive_params(included_file).collect{|p| [p,name] * "-"}
64
+ params += include_params
65
+ rescue
66
+ end
21
67
  end
22
68
  params
23
69
  end
@@ -32,22 +78,31 @@ module Workflow
32
78
  result = :text
33
79
  end
34
80
 
81
+ dir = Path.setup(File.dirname(file))
82
+
83
+ nextflow_schema = dir['nextflow_schema.json']
84
+
85
+ description, params = Workflow.parse_nextflow_schema(nextflow_schema) if nextflow_schema.exists?
86
+
35
87
  file = file + '.nf' unless File.exist?(file) || ! File.exist?(file + '.nf')
36
88
  file = File.expand_path(file)
37
89
  name ||= File.basename(file).sub(/\.nf$/,'').gsub(/\s/,'_')
38
- params = Workflow.nextflow_recursive_params(file)
39
-
40
- params.each do |param|
90
+ Workflow.nextflow_recursive_params(file).each do |param|
41
91
  p,_sep, section = param.partition("-")
42
- if section.nil? || section.empty?
43
- input param, :string, "Nextflow param #{p}", nil, :nofile => true
44
- else
45
- input param, :string, "Nextflow param #{p} from import #{section}", nil, :nofile => true
92
+ if ! params.include?(p)
93
+ params[p] = {type: :string, description: "Undocumented"}
46
94
  end
47
95
  end
96
+
97
+ used_params = []
98
+ desc description
99
+ params.each do |name,info|
100
+ input name.to_sym, info[:type], info[:description], nil, info[:options].merge(:noload => true)
101
+ end
48
102
  task name => result do
49
103
  work = file('work')
50
104
  profile = config :profile, :nextflow
105
+ resume = config :resume, :nextflow
51
106
  config_file = config :config, :nextflow
52
107
 
53
108
  nextflow_inputs = {}
@@ -68,9 +123,17 @@ module Workflow
68
123
  name = f
69
124
  end
70
125
 
71
- nextflow_inputs[name] = v
126
+ case name.to_s
127
+ when 'outdir'
128
+ output = nextflow_inputs[name] = v || output || file('output')
129
+ when 'output'
130
+ output = nextflow_inputs[name] = v || output || self.tmp_path
131
+ else
132
+ nextflow_inputs[name] = v
133
+ end
72
134
  end
73
-
135
+
136
+ current_pwd = FileUtils.pwd
74
137
  Misc.in_dir file('stage') do
75
138
 
76
139
  cmd = "nextflow "
@@ -83,19 +146,26 @@ module Workflow
83
146
 
84
147
  cmd += " -profile #{profile}" if profile
85
148
 
149
+ cmd += " -resume" if resume == 'true'
150
+
151
+ Dir.glob(current_pwd + "/*").each do |file|
152
+ target = File.basename(file)
153
+ Open.ln_s file, target unless File.exist?(target)
154
+ end
86
155
 
87
156
  cmd("#{cmd} #{file}", nextflow_inputs.merge('add_option_dashes' => true))
88
157
  end
89
158
 
90
- output_file = file(output).glob.first if output
91
- output_file = work[File.join('*', '*', output)].glob.first if output && output_file.nil?
92
-
93
- if output_file.nil?
94
- work[File.join("*", "*", "*")].glob * "\n"
159
+ if output && Open.exists?(output)
160
+ if File.directory?(output)
161
+ Dir.glob(output + "/**/*") * "\n"
162
+ else
163
+ output_file = output
164
+ Open.link output, self.tmp_path
165
+ nil
166
+ end
95
167
  else
96
- Open.link output_file, self.tmp_path
97
- #Open.rm_rf file('work')
98
- nil
168
+ work[File.join("*", "*", "*")].glob * "\n"
99
169
  end
100
170
  end
101
171
  end
@@ -105,11 +175,19 @@ module Workflow
105
175
  nextflow_file main, File.basename(path), output
106
176
  end
107
177
 
178
+ def nextflow_project(project, *args)
179
+ CMD.cmd_log("nextflow pull #{project}")
180
+ directory = File.join(ENV["HOME"], '.nextflow/assets', project)
181
+ nextflow_dir directory, *args
182
+ end
183
+
108
184
  def nextflow(path, *args)
109
185
  if File.directory?(path)
110
186
  nextflow_dir path, *args
111
- else
187
+ elsif File.exist?(path)
112
188
  nextflow_file path, *args
189
+ else
190
+ nextflow_project path, *args
113
191
  end
114
192
  end
115
193
  end
@@ -136,33 +136,33 @@ STDOUT.write job.path
136
136
  Misc.ssh_run(server, script)
137
137
  end
138
138
 
139
- def self.run_slurm_job(url, input_id, jobname = nil, slurm_options = {})
139
+ def self.run_batch_job(url, input_id, jobname = nil, batch_options = {})
140
140
  server, path = parse_url(url)
141
141
 
142
142
  script = path_script(path)
143
143
  script += job_script(input_id, jobname)
144
144
  script +=<<-EOF
145
145
  require 'rbbt/hpc'
146
- HPC::BATCH_MODULE = HPC.batch_system "SLURM"
147
- slurm_options = JSON.parse(%q(#{slurm_options.to_json}))
146
+ HPC::BATCH_MODULE = HPC.batch_system
147
+ batch_options = JSON.parse(%q(#{batch_options.to_json}))
148
148
  job.clean if job.error? and job.recoverable_error?
149
- HPC::BATCH_MODULE.run_job(job, slurm_options) unless job.done? || job.error?
149
+ HPC::BATCH_MODULE.run_job(job, batch_options) unless job.done? || job.error?
150
150
  STDOUT.write job.path
151
151
  EOF
152
152
  Misc.ssh_run(server, script)
153
153
  end
154
154
 
155
- def self.orchestrate_slurm_job(url, input_id, jobname = nil, slurm_options = {})
155
+ def self.orchestrate_batch_job(url, input_id, jobname = nil, batch_options = {})
156
156
  server, path = parse_url(url)
157
157
 
158
158
  script = path_script(path)
159
159
  script += job_script(input_id, jobname)
160
160
  script +=<<-EOF
161
161
  require 'rbbt/hpc'
162
- HPC::BATCH_MODULE = HPC.batch_system "SLURM"
163
- slurm_options = JSON.parse(%q(#{slurm_options.to_json}))
162
+ HPC::BATCH_MODULE = HPC.batch_system
163
+ batch_options = JSON.parse(%q(#{batch_options.to_json}))
164
164
  job.clean if job.error? and job.recoverable_error?
165
- HPC::BATCH_MODULE.orchestrate_job(job, slurm_options) unless job.done? || job.error?
165
+ HPC::BATCH_MODULE.orchestrate_job(job, batch_options) unless job.done? || job.error?
166
166
  STDOUT.write job.path
167
167
  EOF
168
168
  Misc.ssh_run(server, script)
@@ -268,8 +268,8 @@ job.clean
268
268
  end
269
269
 
270
270
  def self.relay_job(job, server, options = {})
271
- migrate, produce, produce_dependencies, search_path, run_type, slurm_options = Misc.process_options options.dup,
272
- :migrate, :produce, :produce_dependencies, :search_path, :run_type, :slurm_options
271
+ migrate, produce, produce_dependencies, search_path, run_type, batch_options = Misc.process_options options.dup,
272
+ :migrate, :produce, :produce_dependencies, :search_path, :run_type, :batch_options
273
273
 
274
274
  search_path ||= 'user'
275
275
 
@@ -287,7 +287,7 @@ job.clean
287
287
  rjob.override_dependencies = override_dependencies
288
288
 
289
289
  rjob.run_type = run_type
290
- rjob.slurm_options = slurm_options || {}
290
+ rjob.batch_options = batch_options || {}
291
291
 
292
292
  if options[:migrate]
293
293
  rjob.produce
@@ -298,8 +298,8 @@ job.clean
298
298
  end
299
299
 
300
300
  def self.relay_job_list(job_list, server, options = {})
301
- migrate, produce, produce_dependencies, search_path, run_type, slurm_options = Misc.process_options options.dup,
302
- :migrate, :produce, :produce_dependencies, :search_path, :run_type, :slurm_options
301
+ migrate, produce, produce_dependencies, search_path, run_type, batch_options = Misc.process_options options.dup,
302
+ :migrate, :produce, :produce_dependencies, :search_path, :run_type, :batch_options
303
303
 
304
304
  search_path ||= 'user'
305
305
 
@@ -320,7 +320,7 @@ job.clean
320
320
  rjob.override_dependencies = override_dependencies
321
321
 
322
322
  rjob.run_type = run_type
323
- rjob.slurm_options = slurm_options || {}
323
+ rjob.batch_options = batch_options || {}
324
324
 
325
325
  rjob.run(true)
326
326
 
@@ -330,7 +330,6 @@ job.clean
330
330
  if options[:migrate]
331
331
  rjobs_job.each do |rjob,job|
332
332
  rjob.produce
333
- iif [:migrate, job]
334
333
  Step.migrate(Rbbt.identify(job.path), 'user', :source => server)
335
334
  end
336
335
  end
@@ -1,6 +1,6 @@
1
1
  class RemoteStep
2
2
  module SSH
3
- attr_accessor :override_dependencies, :run_type, :slurm_options, :produce_dependencies
3
+ attr_accessor :override_dependencies, :run_type, :batch_options, :produce_dependencies
4
4
 
5
5
  def init_job(cache_type = nil, other_params = {})
6
6
  return self if @url
@@ -22,7 +22,7 @@ class RemoteStep
22
22
 
23
23
  RemoteWorkflow::SSH.upload_inputs(@server, inputs, @input_types, @input_id)
24
24
 
25
- @remote_path ||= Persist.memory("RemoteSteps", :workflow => self, :task => task, :jobname => @name, :inputs => inputs, :cache_type => cache_type) do
25
+ @remote_path ||= Persist.memory("RemoteStep", :workflow => self.workflow, :task => task, :jobname => @name, :inputs => inputs, :cache_type => cache_type) do
26
26
  Misc.insist do
27
27
  input_types = {}
28
28
  RemoteWorkflow::SSH.post_job(File.join(base_url, task.to_s), @input_id, @base_name)
@@ -56,13 +56,13 @@ class RemoteStep
56
56
  RemoteWorkflow::SSH.run_job(File.join(base_url, task.to_s), @input_id, @base_name)
57
57
  end
58
58
 
59
- def _run_slurm
59
+ def _run_batch
60
60
  RemoteWorkflow::SSH.upload_dependencies(self, @server, 'user', @produce_dependencies)
61
- RemoteWorkflow::SSH.run_slurm_job(File.join(base_url, task.to_s), @input_id, @base_name, @slurm_options || {})
61
+ RemoteWorkflow::SSH.run_batch_job(File.join(base_url, task.to_s), @input_id, @base_name, @batch_options || {})
62
62
  end
63
63
 
64
- def _orchestrate_slurm
65
- RemoteWorkflow::SSH.orchestrate_slurm_job(File.join(base_url, task.to_s), @input_id, @base_name, @slurm_options || {})
64
+ def _orchestrate_batch
65
+ RemoteWorkflow::SSH.orchestrate_batch_job(File.join(base_url, task.to_s), @input_id, @base_name, @batch_options || {})
66
66
  end
67
67
 
68
68
  def issue
@@ -71,10 +71,10 @@ class RemoteStep
71
71
  @remote_path = case @run_type
72
72
  when 'run', :run, nil
73
73
  _run
74
- when 'slurm', :slurm
75
- _run_slurm
74
+ when 'batch', :batch
75
+ _run_batch
76
76
  when 'orchestrate', :orchestrate
77
- _orchestrate_slurm
77
+ _orchestrate_batch
78
78
  end
79
79
  @started = true
80
80
  end
@@ -219,7 +219,7 @@ class Step
219
219
  Step.log_progress(status, options, file(:progress), &block)
220
220
  end
221
221
 
222
- def progress_bar(msg = "Progress", options = nil)
222
+ def progress_bar(msg = "Progress", options = nil, &block)
223
223
  if Hash === msg and options.nil?
224
224
  options = msg
225
225
  msg = nil
@@ -227,7 +227,16 @@ class Step
227
227
  options = {} if options.nil?
228
228
 
229
229
  max = options[:max]
230
- Log::ProgressBar.new_bar(max, {:desc => msg, :file => (@exec ? nil : file(:progress))}.merge(options))
230
+ bar = Log::ProgressBar.new_bar(max, {:desc => msg, :file => (@exec ? nil : file(:progress))}.merge(options))
231
+
232
+ if block_given?
233
+ bar.init
234
+ res = yield bar
235
+ bar.remove
236
+ res
237
+ else
238
+ bar
239
+ end
231
240
  end
232
241
 
233
242
  def self.log(status, message, path, &block)
data/lib/rbbt/workflow.rb CHANGED
@@ -496,7 +496,7 @@ module Workflow
496
496
  end
497
497
 
498
498
  #overriden = true if dependencies.select{|d| d.overriden && d.clean_name != d.name }.any?
499
- overriden = true if dependencies.select{|d| Symbol === d.overriden }.any?
499
+ overriden = true if not_overriden && dependencies.select{|d| Symbol === d.overriden }.any?
500
500
 
501
501
  input_values = task.take_input_values(inputs)
502
502
  if real_inputs.empty? && Workflow::TAG != :inputs && ! overriden #&& ! dependencies.select{|d| d.overriden && d.clean_name != d.name }.any?
data/share/Rlib/util.R CHANGED
@@ -646,10 +646,8 @@ rbbt.pheatmap <- function(filename, data, width=800, height=800, take_log=FALSE,
646
646
  }
647
647
 
648
648
  rbbt.heatmap <- function(filename, data, width=800, height=800, take_log=FALSE, stdize=FALSE, ...){
649
+ rbbt.require('gplots')
649
650
  opar = par()
650
- png(filename=filename, width=width, height=height);
651
-
652
- #par(cex.lab=0.5, cex=0.5, ...)
653
651
 
654
652
  data = as.matrix(data)
655
653
  data[is.nan(data)] = NA
@@ -657,6 +655,22 @@ rbbt.heatmap <- function(filename, data, width=800, height=800, take_log=FALSE,
657
655
  #data = data[rowSums(!is.na(data))!=0, colSums(!is.na(data))!=0]
658
656
  data = data[rowSums(is.na(data))==0, ]
659
657
 
658
+ key.size = 150
659
+ label.size = 200
660
+ block.size = 12
661
+
662
+ if (height == 'auto'){
663
+ height = max(c(dim(data)[1], 30)) * block.size + key.size + label.size
664
+ }
665
+
666
+ if (width == 'auto'){
667
+ width = max(c(dim(data)[2], 30)) * block.size + key.size + label.size
668
+ }
669
+
670
+ png(filename=filename, width=width, height=height);
671
+
672
+ #par(cex.lab=0.5, cex=0.5, ...)
673
+
660
674
  if (take_log){
661
675
  for (study in colnames(data)){
662
676
  skip = sum(data[, study] <= 0) != 0
@@ -673,7 +687,11 @@ rbbt.heatmap <- function(filename, data, width=800, height=800, take_log=FALSE,
673
687
  data = stdize(data)
674
688
  }
675
689
 
676
- heatmap.2(data, scale='column', ...)
690
+ lwid = key.size / (width)
691
+ lhei = key.size / (height)
692
+ str(dim(data))
693
+ str(c(height, lhei, width, lwid))
694
+ heatmap.2(data, scale='column', lwid = c(lwid, 1-lwid), lhei = c(lhei, 1-lhei), ...)
677
695
 
678
696
  dev.off();
679
697
  par(opar)
data/share/config.ru CHANGED
@@ -44,7 +44,7 @@ app_eval app, Rbbt.etc['app.d/remote_workflow_tasks.rb'].find_all
44
44
  app_eval app, Rbbt.etc['app.d/base.rb'].find
45
45
 
46
46
  #{{{ SINATRA
47
- load_file Rbbt.lib['sinatra.rb'].find_all
47
+ app_eval app, Rbbt.lib['sinatra.rb'].find_all
48
48
 
49
49
  #{{{ RESOURCES
50
50
  load_file Rbbt.etc['app.d/resources.rb'].find
@@ -30,7 +30,7 @@ if options[:help]
30
30
  end
31
31
 
32
32
  resource, path = ARGV
33
- path, resource = resource, nil
33
+ path, resource = resource, nil if path.nil?
34
34
 
35
35
  raise MissingParameterException.new(:path) if path.nil?
36
36
 
@@ -221,7 +221,7 @@ The `recursive_clean` cleans all the job dependency steps recursively.
221
221
  -od--override_deps* Override deps using 'Workflow#task=<path>' array_separated
222
222
  -PERF--procpath_performance* Measure performance using procpath
223
223
  --relay* Relay job to SSH server
224
- --slurm_relay* Relay job to SSH SLURM server
224
+ --batch_relay* Relay job to SSH BATCH server (SLURM, PBS, etc.)
225
225
  -rdep--relay_dependencies* Relay dependencies instead of main job
226
226
  -pdr--produce_dependencies_for_relay Prepare dependencies previous to relay jobs
227
227
  EOF
@@ -493,9 +493,9 @@ begin
493
493
  replace_relayed_jobs(jobs_to_relay, server, produce_dependencies_for_relay, :run)
494
494
  end
495
495
 
496
- if server = options.delete(:slurm_relay)
496
+ if server = options.delete(:batch_relay)
497
497
  require 'rbbt/workflow/remote_workflow'
498
- relay_dependencies = options.delete(:relay_dependencies).split(",")
498
+ relay_dependencies = options.include?(:relay_dependencies) ? options.delete(:relay_dependencies).split(",") : nil
499
499
  produce_dependencies_for_relay = options.delete(:produce_dependencies_for_relay)
500
500
  jobs_to_relay = relay_dependencies ? match_dependencies(relay_dependencies, job.rec_dependencies) : [job]
501
501
  jobs_to_relay.reject!{|d| d.done? }
@@ -46,7 +46,6 @@ app.get '/' do
46
46
  begin
47
47
  template_render('main', params, 'main', :cache_type => :asynchronous)
48
48
  rescue TemplateMissing
49
- Log.exception $!
50
49
  redirect to(File.join('/', wf.to_s))
51
50
  end
52
51
  end
@@ -38,8 +38,8 @@ class TestTSV < Test::Unit::TestCase
38
38
  assert_equal Path.setup(File.join('doc', path)).find(:lib), path.find(:lib).doc_file
39
39
 
40
40
  assert_equal "lib/rbbt/resource.rb", path.doc_file.source_for_doc_file
41
- assert_equal path.find, path.doc_file.find(:lib).source_for_doc_file
42
- assert_equal path.find, path.doc_file.source_for_doc_file.find
41
+ assert_equal File.realpath(path.find), File.realpath(path.doc_file.find(:lib).source_for_doc_file)
42
+ assert_equal File.realpath(path.find), File.realpath(path.doc_file.source_for_doc_file.find)
43
43
 
44
44
  assert_equal "doc/lib/rbbt/resource.rb.doc", path.doc_file.set_extension('doc')
45
45
  #assert_equal "lib/rbbt/resource.rb", path.doc_file.set_extension('doc').source_for_doc_file
@@ -74,6 +74,25 @@ row2 A B Id3
74
74
  end
75
75
  end
76
76
 
77
+ def test_to_s_no_preable
78
+ content =<<-EOF
79
+ #Id ValueA ValueB OtherID
80
+ row1 a|aa|aaa b Id1|Id2
81
+ row2 A B Id3
82
+ EOF
83
+
84
+ target =<<-EOF
85
+ Id,ValueA,ValueB,OtherID
86
+ row1,a|aa|aaa,b,Id1|Id2
87
+ row2,A,B,Id3
88
+ EOF
89
+
90
+ TmpFile.with_file(content) do |filename|
91
+ tsv = TSV.open(filename, :sep => /\s+/)
92
+ assert_equal tsv.to_s(preamble: false, header_hash: '').gsub(/\t/, ','), target
93
+ end
94
+ end
95
+
77
96
  def test_entries
78
97
  content =<<-EOF
79
98
  #Id ValueA ValueB OtherID
@@ -187,5 +187,14 @@ class TestOpen < Test::Unit::TestCase
187
187
 
188
188
  end
189
189
 
190
+ def test_download_fails
191
+ TmpFile.with_file do |tmp|
192
+ assert_raise do
193
+ Open.download("http:fake-host/some_path", tmp)
194
+ end
195
+ refute Open.exists?(tmp)
196
+ end
197
+ end
198
+
190
199
  end
191
200
 
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.41.1
4
+ version: 5.42.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miguel Vazquez
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-01-12 00:00:00.000000000 Z
11
+ date: 2024-02-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake