rbbt-util 5.32.10 → 5.32.11

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: 258c55a2b59d81426d1aa3980f35104ef193774068330b25c9aad29061d70e6a
4
- data.tar.gz: 8265a128c161349455f7803d5a70a259c03481bb7a441aa1ffec58626fbb0226
3
+ metadata.gz: fab4cf5fb60bb998eeed28a4e07758efd68f1103de0eff61a5b5c1d4a9fd2583
4
+ data.tar.gz: 47c9a2bdc555645ebc833c2a3b92a3452df259546c1dbf200d77dcee04b8969f
5
5
  SHA512:
6
- metadata.gz: 8eb143ab5cf5e4e55851ccd11b24eeae7d3e60948e30a71de3b5fb87f5333d7e40823b268d6ac894eea5d3d73ffa47101f7bb229378837799597df54545bb8c8
7
- data.tar.gz: 0ebddaae9d523d9dd767dfde1b351b011ba3dd65c4abd7c0bcc0e78cc3e604a6850250bf0e74dac9f5ca0172a56a067541bdc34b5037e2ffc7ba972558f2ce4c
6
+ metadata.gz: 92121d5df854b036a37413c27d2244cef0325874c018433abce1a93887c93efc650474e059c13b84c0be9a708d6fdc735daba6f861e1d05a670950fea3d32916
7
+ data.tar.gz: 0d24d99a64101fd33f2ac5774c30267f238c81d6479a754445fc02424384ba716e4c672b8a7c0d1c6f22b9f16c2ac1e1104ba9d35f7697bf4a9631e3a776bb02
data/bin/rbbt CHANGED
@@ -102,6 +102,7 @@ end
102
102
 
103
103
  if options[:config_keys]
104
104
  options[:config_keys].split(",").each do |config|
105
+ config = config.strip
105
106
  Rbbt::Config.process_config config
106
107
  end
107
108
  end
@@ -95,14 +95,15 @@ module HPC
95
95
 
96
96
  task = Symbol === job.overriden ? job.overriden : job.task_name
97
97
 
98
- if job.overriden
99
- override_deps = job.rec_dependencies.
100
- select{|dep| Symbol === dep.overriden }.
98
+ if job.overriden?
99
+ #override_deps = job.rec_dependencies.
100
+ # select{|dep| Symbol === dep.overriden }.
101
+
102
+ override_deps = job.overriden_deps.
101
103
  collect do |dep|
102
-
103
104
  name = [dep.workflow.to_s, dep.task_name] * "#"
104
105
  [name, dep.path] * "="
105
- end * ","
106
+ end.uniq * ","
106
107
 
107
108
  options[:override_deps] = override_deps unless override_deps.empty?
108
109
  end
@@ -156,10 +157,15 @@ EOF
156
157
  :singularity_ruby_inline,
157
158
  :sync,
158
159
  :task_cpus,
160
+ :mem,
161
+ :mem_per_cpu,
162
+ :licenses,
163
+ :contraints,
159
164
  :time,
160
165
  :user_group,
161
166
  :wipe_container,
162
167
  :workdir,
168
+ :purge_deps
163
169
  ]
164
170
 
165
171
  keys.each do |key|
@@ -378,9 +384,9 @@ echo "user_scratch: #{scratch_group_dir}/#{user}/{PKGDIR}/{TOPLEVEL}/{SUBPATH}"
378
384
  end
379
385
 
380
386
  def execute(options)
381
- exec_cmd, job_cmd = options.values_at :exec_cmd, :rbbt_cmd
387
+ exec_cmd, job_cmd, task_cpus = options.values_at :exec_cmd, :rbbt_cmd, :task_cpus
382
388
 
383
- <<-EOF
389
+ script=<<-EOF
384
390
  step_path=$(
385
391
  #{exec_cmd} #{job_cmd} --printpath
386
392
  )
@@ -388,7 +394,10 @@ exit_status=$?
388
394
 
389
395
  [[ -z $BATCH_JOB_ID ]] || #{exec_cmd} workflow write_info --recursive --force=false --check_pid "$step_path" batch_job $BATCH_JOB_ID
390
396
  [[ -z $BATCH_SYSTEM ]] || #{exec_cmd} workflow write_info --recursive --force=false --check_pid "$step_path" batch_system $BATCH_SYSTEM
397
+ #{exec_cmd} workflow write_info --recursive --force=false --check_pid "$step_path" batch_cpus #{task_cpus}
391
398
  EOF
399
+
400
+ script
392
401
  end
393
402
 
394
403
  def sync_environment(options = {})
@@ -409,6 +418,13 @@ fi
409
418
 
410
419
  def cleanup_environment(options = {})
411
420
  cleanup_environment = ""
421
+
422
+ cleanup_environment +=<<-EOF if options[:purge_deps]
423
+ if [ $exit_status == '0' ]; then
424
+ #{options[:exec_cmd]} workflow forget_deps --purge --recursive_purge "$step_path" 2>1 >> '#{options[:fsync]}'
425
+ fi
426
+ EOF
427
+
412
428
  if options[:sync]
413
429
  if options[:wipe_container] == 'force'
414
430
  cleanup_environment +=<<-EOF
@@ -31,6 +31,9 @@ export BATCH_SYSTEM=SLURM
31
31
  licenses = Misc.process_options options, :licenses
32
32
  constraint = Misc.process_options options, :constraint
33
33
 
34
+ mem = Misc.process_options options, :mem
35
+ mem_per_cpu = Misc.process_options options, :mem_per_cpu
36
+
34
37
  batch_dir = Misc.process_options options, :batch_dir
35
38
  batch_name = Misc.process_options options, :batch_name
36
39
 
@@ -39,22 +42,34 @@ export BATCH_SYSTEM=SLURM
39
42
 
40
43
  time = Misc.format_seconds Misc.timespan(time) unless time.include? ":"
41
44
 
45
+ sbatch_params = {"job-name" => batch_name,
46
+ "output" => fout,
47
+ "error" => ferr,
48
+ "cpus-per-task" => task_cpus,
49
+ "nodes" => nodes,
50
+ "time" => time,
51
+ "exclusive" => exclusive,
52
+ "licenses" => licenses,
53
+ "mem" => mem,
54
+ "mem-per-cpu" => mem_per_cpu,
55
+ }
56
+
42
57
  header =<<-EOF
43
58
  #!/bin/bash
44
- #SBATCH --job-name="#{batch_name}"
45
- #SBATCH --workdir="#{workdir}"
46
- #SBATCH --output="#{fout}"
47
- #SBATCH --error="#{ferr}"
48
- #SBATCH --qos="#{queue}"
49
- #SBATCH --cpus-per-task="#{task_cpus}"
50
- #SBATCH --time="#{time}"
51
- #SBATCH --nodes="#{nodes}"
52
59
  EOF
53
60
 
54
- header << "#SBATCH --exclusive" << "\n" if exclusive
55
- header << "#SBATCH --constraint=highmem" << "\n" if highmem
56
- header << "#SBATCH --licenses=#{licenses}" << "\n" if licenses
57
- header << "#SBATCH --constraint=#{constraint}" << "\n" if constraint
61
+ sbatch_params.each do |name,value|
62
+ next if value.nil? || value == ""
63
+ if TrueClass === value
64
+ header << "#SBATCH --#{name}" << "\n"
65
+ elsif Array === value
66
+ value.each do |v|
67
+ header << "#SBATCH --#{name}=\"#{v}\"" << "\n"
68
+ end
69
+ else
70
+ header << "#SBATCH --#{name}=\"#{value}\"" << "\n"
71
+ end
72
+ end
58
73
 
59
74
  header
60
75
  end
data/lib/rbbt/resource.rb CHANGED
@@ -87,65 +87,67 @@ module Resource
87
87
  lock_filename = nil # it seems like this was locked already.
88
88
 
89
89
  Misc.lock lock_filename do
90
- uri = URI(url)
91
-
92
- http = Net::HTTP.new(uri.host, uri.port)
93
-
94
- if uri.scheme == "https"
95
- http.use_ssl = true
96
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE
97
- http.instance_variable_set("@ssl_options", OpenSSL::SSL::OP_NO_SSLv2 + OpenSSL::SSL::OP_NO_SSLv3 + OpenSSL::SSL::OP_NO_COMPRESSION)
98
- end
90
+ begin
91
+ uri = URI(url)
99
92
 
100
- timeout = 60 * 10
101
- http.read_timeout = timeout
102
- http.open_timeout = timeout
103
- request = Net::HTTP::Get.new(uri.request_uri)
104
- http.request request do |response|
105
- filename = if response["Content-Disposition"]
106
- response["Content-Disposition"].split(";").select{|f| f.include? "filename"}.collect{|f| f.split("=").last.gsub('"','')}.first
107
- else
108
- nil
109
- end
93
+ http = Net::HTTP.new(uri.host, uri.port)
110
94
 
111
- if filename && filename =~ /\.b?gz$/ && final_path !~ /\.b?gz$/
112
- extension = filename.split(".").last
113
- final_path += '.' + extension
95
+ if uri.scheme == "https"
96
+ http.use_ssl = true
97
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
98
+ http.instance_variable_set("@ssl_options", OpenSSL::SSL::OP_NO_SSLv2 + OpenSSL::SSL::OP_NO_SSLv3 + OpenSSL::SSL::OP_NO_COMPRESSION)
114
99
  end
115
- case response
116
- when Net::HTTPSuccess, Net::HTTPOK
117
- Misc.sensiblewrite(final_path) do |file|
118
- response.read_body do |chunk|
119
- file.write chunk
120
- end
100
+
101
+ timeout = 60 * 10
102
+ http.read_timeout = timeout
103
+ http.open_timeout = timeout
104
+ request = Net::HTTP::Get.new(uri.request_uri)
105
+ http.request request do |response|
106
+ filename = if response["Content-Disposition"]
107
+ response["Content-Disposition"].split(";").select{|f| f.include? "filename"}.collect{|f| f.split("=").last.gsub('"','')}.first
108
+ else
109
+ nil
110
+ end
111
+
112
+ if filename && filename =~ /\.b?gz$/ && final_path !~ /\.b?gz$/
113
+ extension = filename.split(".").last
114
+ final_path += '.' + extension
121
115
  end
122
- when Net::HTTPRedirection, Net::HTTPFound
123
- location = response['location']
124
- if location.include? 'get_directory'
125
- Log.debug("Feching directory from: #{location}. Into: #{final_path}")
126
- FileUtils.mkdir_p final_path unless File.exist? final_path
127
- TmpFile.with_file do |tmp_dir|
128
- Misc.in_dir tmp_dir do
129
- CMD.cmd('tar xvfz -', :in => Open.open(location, :nocache => true))
116
+ case response
117
+ when Net::HTTPSuccess, Net::HTTPOK
118
+ Misc.sensiblewrite(final_path) do |file|
119
+ response.read_body do |chunk|
120
+ file.write chunk
130
121
  end
131
- FileUtils.mv tmp_dir, final_path
132
122
  end
123
+ when Net::HTTPRedirection, Net::HTTPFound
124
+ location = response['location']
125
+ if location.include? 'get_directory'
126
+ Log.debug("Feching directory from: #{location}. Into: #{final_path}")
127
+ FileUtils.mkdir_p final_path unless File.exist? final_path
128
+ TmpFile.with_file do |tmp_dir|
129
+ Misc.in_dir tmp_dir do
130
+ CMD.cmd('tar xvfz -', :in => Open.open(location, :nocache => true))
131
+ end
132
+ FileUtils.mv tmp_dir, final_path
133
+ end
134
+ else
135
+ url = location
136
+ raise TryAgain
137
+ #Open.open(location, :nocache => true) do |s|
138
+ # Misc.sensiblewrite(final_path, s)
139
+ #end
140
+ end
141
+ when Net::HTTPInternalServerError
142
+ @server_missing_resource_cache << url
143
+ raise "Resource Not Found"
133
144
  else
134
- url = location
135
- raise TryAgain
136
- #Open.open(location, :nocache => true) do |s|
137
- # Misc.sensiblewrite(final_path, s)
138
- #end
145
+ raise "Response not understood: #{response.inspect}"
139
146
  end
140
- when Net::HTTPInternalServerError
141
- @server_missing_resource_cache << url
142
- raise "Resource Not Found"
143
- else
144
- raise "Response not understood: #{response.inspect}"
145
147
  end
148
+ rescue TryAgain
149
+ retry
146
150
  end
147
- rescue TryAgain
148
- retry
149
151
  end
150
152
  rescue
151
153
  Log.warn "Could not retrieve (#{self.to_s}) #{ path } from #{ remote_server }"
data/lib/rbbt/tsv/csv.rb CHANGED
@@ -28,10 +28,10 @@ module TSV
28
28
  if Misc.is_filename?(obj)
29
29
  CSV.read obj, options
30
30
  else
31
- CSV.new obj, options
31
+ CSV.new obj, **options
32
32
  end
33
33
  else
34
- CSV.new obj, options
34
+ CSV.new obj, **options
35
35
  end
36
36
 
37
37
  tsv = if noheaders
data/lib/rbbt/util/cmd.rb CHANGED
@@ -192,25 +192,48 @@ module CMD
192
192
 
193
193
  ConcurrentStream.setup sout, :pids => pids, :autojoin => no_wait, :no_fail => no_fail
194
194
 
195
- err_thread = Thread.new do
196
- while line = serr.gets
197
- bar.process(line) if bar
198
- sout.log = line
199
- Log.log "STDERR [#{pid}]: " + line, stderr
200
- end if Integer === stderr and log
201
- serr.close
195
+ if (Integer === stderr and log) || bar
196
+ err_thread = Thread.new do
197
+ while line = serr.gets
198
+ bar.process(line) if bar
199
+ sout.log = line
200
+ Log.log "STDERR [#{pid}]: " + line, stderr if log
201
+ end
202
+ serr.close
203
+ end
204
+ else
205
+ Misc.consume_stream(serr, true)
206
+ err_thread = nil
202
207
  end
203
208
 
204
209
  sout.threads = [in_thread, err_thread, wait_thr].compact
205
210
 
206
211
  sout
207
212
  else
208
- err = ""
209
- err_thread = Thread.new do
210
- while not serr.eof?
211
- err << serr.gets if Integer === stderr
213
+
214
+ if bar
215
+ err = ""
216
+ err_thread = Thread.new do
217
+ while not serr.eof?
218
+ line = serr.gets
219
+ bar.process(line)
220
+ err << line if Integer === stderr and log
221
+ end
222
+ serr.close
212
223
  end
213
- serr.close
224
+ elsif log and Integer === stderr
225
+ err = ""
226
+ err_thread = Thread.new do
227
+ while not serr.eof?
228
+ err << serr.gets
229
+ end
230
+ serr.close
231
+ end
232
+ else
233
+ Misc.consume_stream(serr, true)
234
+ #serr.close
235
+ err_thread = nil
236
+ err = ""
214
237
  end
215
238
 
216
239
  ConcurrentStream.setup sout, :pids => pids, :threads => [in_thread, err_thread].compact, :autojoin => no_wait, :no_fail => no_fail
@@ -220,7 +243,11 @@ module CMD
220
243
 
221
244
  status = wait_thr.value
222
245
  if not status.success? and not no_fail
223
- raise ProcessFailed.new "Command [#{pid}] #{cmd} failed with error status #{status.exitstatus}.\n#{err}"
246
+ if !err.empty?
247
+ raise ProcessFailed.new "Command [#{pid}] #{cmd} failed with error status #{status.exitstatus}.\n#{err}"
248
+ else
249
+ raise ProcessFailed.new "Command [#{pid}] #{cmd} failed with error status #{status.exitstatus}"
250
+ end
224
251
  else
225
252
  Log.log err, stderr if Integer === stderr and log
226
253
  end
@@ -263,11 +290,6 @@ module CMD
263
290
  if c == "\n"
264
291
  bar.process(line) if bar
265
292
  starting = true
266
- #if pid
267
- # Log.logn "STDOUT [#{pid}]: ", level
268
- #else
269
- # Log.logn "STDOUT: ", level
270
- #end
271
293
  line = "" if bar
272
294
  end
273
295
  end
@@ -38,13 +38,13 @@ module SimpleDSL
38
38
  hook_method(method)
39
39
 
40
40
  # Execute
41
+ @config ||= {}
41
42
  if actions.is_a? Proc
42
43
  begin
43
- require 'parse_tree_extensions'
44
- require 'parse_tree'
45
- require 'ruby2ruby'
46
- @config[@@method_name] = actions.to_ruby.collect[1..-2].join
44
+ require 'method_source'
45
+ @config[@@method_name] = actions.source.split("\n")[1..-2] * "\n"
47
46
  rescue Exception
47
+ Log.exception $!
48
48
  @config[@@method_name] = NoRuby2Ruby.new "The gem ruby2ruby is not installed. It will not work on ruby 1.9."
49
49
  end
50
50
 
data/lib/rbbt/workflow.rb CHANGED
@@ -347,6 +347,11 @@ module Workflow
347
347
 
348
348
  inputs = IndiferentHash.setup(inputs)
349
349
 
350
+ not_overriden = inputs.delete :not_overriden
351
+ if not_overriden
352
+ inputs[:not_overriden] = :not_overriden_dep
353
+ end
354
+
350
355
  Workflow.resolve_locals(inputs)
351
356
 
352
357
  task_info = task_info(taskname)
@@ -400,7 +405,11 @@ module Workflow
400
405
  jobname = DEFAULT_NAME if jobname.nil? or jobname.empty?
401
406
 
402
407
  dependencies = real_dependencies(task, jobname, defaults.merge(inputs), task_dependencies[taskname] || [])
403
- overriden = has_overriden_inputs || dependencies.select{|dep| dep.overriden }.any?
408
+
409
+ overriden_deps = dependencies.select{|d| d.overriden }
410
+ true_overriden_deps = overriden_deps.select{|d| TrueClass === d.overriden }
411
+
412
+ overriden = has_overriden_inputs || overriden_deps.any?
404
413
 
405
414
  if real_inputs.empty? && Workflow::TAG != :inputs && ! overriden
406
415
  step_path = step_path taskname, jobname, [], [], task.extension
@@ -413,7 +422,16 @@ module Workflow
413
422
  job = get_job_step step_path, task, input_values, dependencies
414
423
  job.workflow = self
415
424
  job.clean_name = jobname
416
- job.overriden = overriden
425
+
426
+ case not_overriden
427
+ when TrueClass
428
+ job.overriden = has_overriden_inputs || true_overriden_deps.any?
429
+ when :not_overriden_dep
430
+ job.overriden = true if has_overriden_inputs || true_overriden_deps.any?
431
+ else
432
+ job.overriden = true if has_overriden_inputs || overriden_deps.any?
433
+ end
434
+
417
435
  job.real_inputs = real_inputs.keys
418
436
  job
419
437
  end
@@ -302,7 +302,7 @@ module Workflow
302
302
  workflow, task = m.values_at 1, 2
303
303
  workflow = self.to_s if workflow.empty?
304
304
  override_dependencies[workflow] ||= IndiferentHash.setup({})
305
- override_dependencies[workflow][task] = value
305
+ override_dependencies[workflow][task] = value.dup
306
306
  end
307
307
  end
308
308
  override_dependencies
@@ -34,13 +34,40 @@ class Step
34
34
  end
35
35
  end
36
36
 
37
+
38
+ def overriden?
39
+ return true if @overriden
40
+ return true if dependencies.select{|dep| dep.overriden? }.any?
41
+ info[:archived_info].each do |f,i|
42
+ return true if i[:overriden] || i["overriden"]
43
+ end if info[:archived_info]
44
+ return false
45
+ end
46
+
37
47
  def overriden
38
- if @overriden.nil?
39
- return [] if dependencies.nil?
40
- dependencies.select{|dep| dep.overriden }.any?
41
- else
42
- @overriden
48
+ @overriden
49
+ #if @overriden.nil?
50
+ # return false if dependencies.nil?
51
+ # dependencies.select{|dep| dep.overriden? }.any?
52
+ #else
53
+ # @overriden
54
+ #end
55
+ end
56
+
57
+ def overriden_deps
58
+ ord = []
59
+ deps = dependencies.dup
60
+ while dep = deps.shift
61
+ case dep.overriden
62
+ when FalseClass
63
+ next
64
+ when Symbol
65
+ ord << dep
66
+ else
67
+ deps += dep.dependencies
68
+ end
43
69
  end
70
+ ord
44
71
  end
45
72
 
46
73
  def initialize(path, task = nil, inputs = nil, dependencies = nil, bindings = nil, clean_name = nil)
@@ -134,7 +161,11 @@ class Step
134
161
 
135
162
  archived_info = {}
136
163
  dependencies.each do |dep|
137
- archived_info[dep.path] = dep.info
164
+ if Symbol === dep.overriden
165
+ archived_info[dep.path] = dep.overriden
166
+ else
167
+ archived_info[dep.path] = dep.info
168
+ end
138
169
  archived_info.merge!(dep.archived_info)
139
170
  end if dependencies
140
171
 
@@ -248,7 +248,7 @@ class Step
248
248
  def init_info(force = false)
249
249
  return nil if @exec || info_file.nil? || (Open.exists?(info_file) && ! force)
250
250
  Open.lock(info_file, :lock => info_lock) do
251
- i = {:status => :waiting, :pid => Process.pid, :path => path, :real_inputs => real_inputs}
251
+ i = {:status => :waiting, :pid => Process.pid, :path => path, :real_inputs => real_inputs, :overriden => overriden}
252
252
  i[:dependencies] = dependencies.collect{|dep| [dep.task_name, dep.name, dep.path]} if dependencies
253
253
  Misc.sensiblewrite(info_file, Step.serialize_info(i), :force => true, :lock => false)
254
254
  @info_cache = IndiferentHash.setup(i)
@@ -551,7 +551,7 @@ class Step
551
551
 
552
552
  def aborted?
553
553
  status = self.status
554
- status == :aborted || ((status != :dependencies && status != :cleaned && status != :noinfo && status != :setup && status != :noinfo) && nopid?)
554
+ status == :aborted || ((status != :ending && status != :dependencies && status != :cleaned && status != :noinfo && status != :setup && status != :noinfo) && nopid?)
555
555
  end
556
556
 
557
557
  # {{{ INFO
@@ -206,9 +206,9 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
206
206
  puts Log.color(:magenta, "BATCH parameters: ")
207
207
  case job_batch_system
208
208
  when 'slurm'
209
- text = CMD.cmd('grep "^#SBATCH" |tail -n +5', :in => Open.read(fcmd)).read.strip
209
+ text = CMD.cmd('grep "^#SBATCH" ', :in => Open.read(fcmd)).read.strip
210
210
  when 'lsf'
211
- text = CMD.cmd('grep "^#BSUB" |tail -n +5', :in => Open.read(fcmd)).read.strip
211
+ text = CMD.cmd('grep "^#BSUB" ', :in => Open.read(fcmd)).read.strip
212
212
  else
213
213
  text = ""
214
214
  end
@@ -19,6 +19,7 @@ $slurm_options = SOPT.get <<EOF
19
19
  -e--exclusive Make exclusive use of the node
20
20
  -hm--highmem Make use of highmem cores
21
21
  -wc--wipe_container* Wipe the jobs from the contain directory
22
+ -pd--purge_deps Purge job dependencies
22
23
  -CS--contain_and_sync Contain and sync to default locations
23
24
  -ci--copy_image When using a container directory, copy image there
24
25
  -t--tail Tail the logs
@@ -26,6 +27,8 @@ $slurm_options = SOPT.get <<EOF
26
27
  -q--queue* Queue
27
28
  -t--task_cpus* Tasks
28
29
  -tm--time* Time
30
+ -m--mem* SLURM minimum memory
31
+ -mcpu--mem_per_cpu* SLURM minimum memory per CPU
29
32
  -lin--licenses* SLURM licenses
30
33
  -cons--constraint* SLURM constraint
31
34
  -W--workflows* Additional workflows
@@ -18,6 +18,7 @@ $slurm_options = SOPT.get <<EOF
18
18
  -e--exclusive Make exclusive use of the node
19
19
  -hm--highmem Make use of highmem cores
20
20
  -wc--wipe_container* Wipe the jobs from the contain directory
21
+ -pd--purge_deps Purge job dependencies
21
22
  -CS--contain_and_sync Contain and sync to default locations
22
23
  -ci--copy_image When using a container directory, copy image there
23
24
  -t--tail Tail the logs
@@ -25,6 +26,8 @@ $slurm_options = SOPT.get <<EOF
25
26
  -q--queue* Queue
26
27
  -t--task_cpus* Tasks
27
28
  -tm--time* Time
29
+ -m--mem* SLURM minimum memory
30
+ -mcpu--mem_per_cpu* SLURM minimum memory per CPU
28
31
  -lin--licenses* SLURM licenses
29
32
  -cons--constraint* SLURM constraint
30
33
  -W--workflows* Additional workflows
@@ -206,9 +206,9 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
206
206
  puts Log.color(:magenta, "BATCH parameters: ")
207
207
  case job_batch_system
208
208
  when 'slurm'
209
- text = CMD.cmd('grep "^#SBATCH" |tail -n +5', :in => Open.read(fcmd)).read.strip
209
+ text = CMD.cmd('grep "^#SBATCH" ', :in => Open.read(fcmd)).read.strip
210
210
  when 'lsf'
211
- text = CMD.cmd('grep "^#BSUB" |tail -n +5', :in => Open.read(fcmd)).read.strip
211
+ text = CMD.cmd('grep "^#BSUB" ', :in => Open.read(fcmd)).read.strip
212
212
  else
213
213
  text = ""
214
214
  end
@@ -19,6 +19,7 @@ $slurm_options = SOPT.get <<EOF
19
19
  -e--exclusive Make exclusive use of the node
20
20
  -hm--highmem Make use of highmem cores
21
21
  -wc--wipe_container* Wipe the jobs from the contain directory
22
+ -pd--purge_deps Purge job dependencies
22
23
  -CS--contain_and_sync Contain and sync to default locations
23
24
  -ci--copy_image When using a container directory, copy image there
24
25
  -t--tail Tail the logs
@@ -26,6 +27,8 @@ $slurm_options = SOPT.get <<EOF
26
27
  -q--queue* Queue
27
28
  -t--task_cpus* Tasks
28
29
  -tm--time* Time
30
+ -m--mem* SLURM minimum memory
31
+ -mcpu--mem_per_cpu* SLURM minimum memory per CPU
29
32
  -lin--licenses* SLURM licenses
30
33
  -cons--constraint* SLURM constraint
31
34
  -W--workflows* Additional workflows
@@ -18,6 +18,7 @@ $slurm_options = SOPT.get <<EOF
18
18
  -e--exclusive Make exclusive use of the node
19
19
  -hm--highmem Make use of highmem cores
20
20
  -wc--wipe_container* Wipe the jobs from the contain directory
21
+ -pd--purge_deps Purge job dependencies
21
22
  -CS--contain_and_sync Contain and sync to default locations
22
23
  -ci--copy_image When using a container directory, copy image there
23
24
  -t--tail Tail the logs
@@ -25,6 +26,8 @@ $slurm_options = SOPT.get <<EOF
25
26
  -q--queue* Queue
26
27
  -t--task_cpus* Tasks
27
28
  -tm--time* Time
29
+ -m--mem* SLURM minimum memory
30
+ -mcpu--mem_per_cpu* SLURM minimum memory per CPU
28
31
  -lin--licenses* SLURM licenses
29
32
  -cons--constraint* SLURM constraint
30
33
  -W--workflows* Additional workflows
@@ -206,9 +206,9 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
206
206
  puts Log.color(:magenta, "BATCH parameters: ")
207
207
  case job_batch_system
208
208
  when 'slurm'
209
- text = CMD.cmd('grep "^#SBATCH" |tail -n +5', :in => Open.read(fcmd)).read.strip
209
+ text = CMD.cmd('grep "^#SBATCH" ', :in => Open.read(fcmd)).read.strip
210
210
  when 'lsf'
211
- text = CMD.cmd('grep "^#BSUB" |tail -n +5', :in => Open.read(fcmd)).read.strip
211
+ text = CMD.cmd('grep "^#BSUB" ', :in => Open.read(fcmd)).read.strip
212
212
  else
213
213
  text = ""
214
214
  end
@@ -19,6 +19,7 @@ $slurm_options = SOPT.get <<EOF
19
19
  -e--exclusive Make exclusive use of the node
20
20
  -hm--highmem Make use of highmem cores
21
21
  -wc--wipe_container* Wipe the jobs from the contain directory
22
+ -pd--purge_deps Purge job dependencies
22
23
  -CS--contain_and_sync Contain and sync to default locations
23
24
  -ci--copy_image When using a container directory, copy image there
24
25
  -t--tail Tail the logs
@@ -26,6 +27,8 @@ $slurm_options = SOPT.get <<EOF
26
27
  -q--queue* Queue
27
28
  -t--task_cpus* Tasks
28
29
  -tm--time* Time
30
+ -m--mem* SLURM minimum memory
31
+ -mcpu--mem_per_cpu* SLURM minimum memory per CPU
29
32
  -lin--licenses* SLURM licenses
30
33
  -cons--constraint* SLURM constraint
31
34
  -W--workflows* Additional workflows
@@ -18,6 +18,7 @@ $slurm_options = SOPT.get <<EOF
18
18
  -e--exclusive Make exclusive use of the node
19
19
  -hm--highmem Make use of highmem cores
20
20
  -wc--wipe_container* Wipe the jobs from the contain directory
21
+ -pd--purge_deps Purge job dependencies
21
22
  -CS--contain_and_sync Contain and sync to default locations
22
23
  -ci--copy_image When using a container directory, copy image there
23
24
  -t--tail Tail the logs
@@ -25,6 +26,8 @@ $slurm_options = SOPT.get <<EOF
25
26
  -q--queue* Queue
26
27
  -t--task_cpus* Tasks
27
28
  -tm--time* Time
29
+ -m--mem* SLURM minimum memory
30
+ -mcpu--mem_per_cpu* SLURM minimum memory per CPU
28
31
  -lin--licenses* SLURM licenses
29
32
  -cons--constraint* SLURM constraint
30
33
  -W--workflows* Additional workflows
@@ -38,11 +38,11 @@ step.copy_files_dir
38
38
  dependencies = step.dependencies
39
39
 
40
40
  if remove && remove.any?
41
- remove_paths = dependencies.select do |dep|
42
- remove.include?(dep.task_name) || remove.include?([dep.workflow.to_s, dep.task_name] * "#")
43
- end.collect{|dep| dep.path }
41
+ remove_paths = dependencies.select do |dep|
42
+ remove.include?(dep.task_name) || remove.include?([dep.workflow.to_s, dep.task_name] * "#")
43
+ end.collect{|dep| dep.path }
44
44
  else
45
- remove_paths = dependencies.collect{|dep| dep.path }
45
+ remove_paths = dependencies.collect{|dep| dep.path }
46
46
  end
47
47
 
48
48
  step.set_info :dependencies, step.info[:dependencies].reject{|info| remove_paths.include? info.last}
@@ -50,6 +50,7 @@ step.set_info :dependencies, step.info[:dependencies].reject{|info| remove_paths
50
50
  if options[:purge] || options[:recursive_purge]
51
51
  dependencies.each do |dependency|
52
52
  next unless remove_paths.include? dependency.path
53
+ next unless Open.exists?(dependency.info_file)
53
54
  Step.purge(dependency.path, options[:recursive_purge])
54
55
  end
55
56
  end
@@ -35,12 +35,12 @@ class TestDSL < Test::Unit::TestCase
35
35
 
36
36
  def test_config
37
37
  config = <<-EOC
38
- action1("Hello")
39
- action2("Good bye")
38
+ action1 "Hello"
39
+ action2 "Good bye"
40
40
  EOC
41
41
 
42
42
  begin
43
- assert(@parser.config(:action) == config)
43
+ assert_equal config.split("\n").collect{|l| l.strip}, @parser.config(:action).split("\n").collect{|l| l.strip}
44
44
  rescue SimpleDSL::NoRuby2Ruby
45
45
  end
46
46
  end
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.32.10
4
+ version: 5.32.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miguel Vazquez
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-05-04 00:00:00.000000000 Z
11
+ date: 2021-05-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -555,7 +555,7 @@ homepage: http://github.com/mikisvaz/rbbt-util
555
555
  licenses:
556
556
  - MIT
557
557
  metadata: {}
558
- post_install_message:
558
+ post_install_message:
559
559
  rdoc_options: []
560
560
  require_paths:
561
561
  - lib
@@ -570,104 +570,103 @@ required_rubygems_version: !ruby/object:Gem::Requirement
570
570
  - !ruby/object:Gem::Version
571
571
  version: '0'
572
572
  requirements: []
573
- rubyforge_project:
574
- rubygems_version: 2.7.6
575
- signing_key:
573
+ rubygems_version: 3.1.4
574
+ signing_key:
576
575
  specification_version: 4
577
576
  summary: Utilities for the Ruby Bioinformatics Toolkit (rbbt)
578
577
  test_files:
579
- - test/test_helper.rb
580
- - test/rbbt/entity/test_identifiers.rb
581
- - test/rbbt/test_resource.rb
582
- - test/rbbt/test_association.rb
583
- - test/rbbt/hpc/test_slurm.rb
584
- - test/rbbt/hpc/test_batch.rb
585
- - test/rbbt/persist/test_tsv.rb
586
- - test/rbbt/persist/tsv/test_kyotocabinet.rb
587
- - test/rbbt/persist/tsv/test_lmdb.rb
588
- - test/rbbt/persist/tsv/test_tokyocabinet.rb
589
- - test/rbbt/persist/tsv/test_cdb.rb
590
- - test/rbbt/persist/tsv/test_leveldb.rb
591
- - test/rbbt/persist/tsv/test_sharder.rb
592
- - test/rbbt/test_packed_index.rb
593
578
  - test/rbbt/test_entity.rb
594
- - test/rbbt/test_fix_width_table.rb
595
579
  - test/rbbt/workflow/test_remote_workflow.rb
596
- - test/rbbt/workflow/test_doc.rb
597
- - test/rbbt/workflow/step/test_dependencies.rb
598
- - test/rbbt/workflow/test_schedule.rb
599
580
  - test/rbbt/workflow/util/test_archive.rb
600
581
  - test/rbbt/workflow/util/test_orchestrator.rb
601
- - test/rbbt/workflow/test_task.rb
582
+ - test/rbbt/workflow/test_doc.rb
583
+ - test/rbbt/workflow/test_schedule.rb
602
584
  - test/rbbt/workflow/test_step.rb
603
- - test/rbbt/test_tsv.rb
604
- - test/rbbt/test_annotations.rb
605
- - test/rbbt/test_knowledge_base.rb
606
- - test/rbbt/util/test_migrate.rb
607
- - test/rbbt/util/test_simpleDSL.rb
608
- - test/rbbt/util/concurrency/processes/test_socket.rb
609
- - test/rbbt/util/concurrency/test_processes.rb
610
- - test/rbbt/util/concurrency/test_threads.rb
611
- - test/rbbt/util/test_filecache.rb
612
- - test/rbbt/util/simpleopt/test_get.rb
613
- - test/rbbt/util/simpleopt/test_parse.rb
614
- - test/rbbt/util/simpleopt/test_setup.rb
615
- - test/rbbt/util/test_misc.rb
616
- - test/rbbt/util/test_excel2tsv.rb
617
- - test/rbbt/util/test_semaphore.rb
618
- - test/rbbt/util/test_procpath.rb
619
- - test/rbbt/util/R/test_model.rb
620
- - test/rbbt/util/R/test_eval.rb
621
- - test/rbbt/util/R/test_plot.rb
622
- - test/rbbt/util/test_open.rb
623
- - test/rbbt/util/test_tmpfile.rb
624
- - test/rbbt/util/test_cmd.rb
625
- - test/rbbt/util/test_concurrency.rb
585
+ - test/rbbt/workflow/step/test_dependencies.rb
586
+ - test/rbbt/workflow/test_task.rb
587
+ - test/rbbt/resource/test_path.rb
626
588
  - test/rbbt/util/test_colorize.rb
627
- - test/rbbt/util/test_config.rb
628
- - test/rbbt/util/test_log.rb
629
- - test/rbbt/util/test_simpleopt.rb
630
- - test/rbbt/util/test_python.rb
631
- - test/rbbt/util/test_chain_methods.rb
589
+ - test/rbbt/util/test_procpath.rb
590
+ - test/rbbt/util/misc/test_development.rb
632
591
  - test/rbbt/util/misc/test_omics.rb
592
+ - test/rbbt/util/misc/test_pipes.rb
593
+ - test/rbbt/util/misc/test_format.rb
633
594
  - test/rbbt/util/misc/test_lock.rb
634
595
  - test/rbbt/util/misc/test_multipart_payload.rb
635
596
  - test/rbbt/util/misc/test_bgzf.rb
636
- - test/rbbt/util/misc/test_development.rb
637
- - test/rbbt/util/misc/test_format.rb
638
- - test/rbbt/util/misc/test_pipes.rb
597
+ - test/rbbt/util/test_concurrency.rb
598
+ - test/rbbt/util/test_cmd.rb
599
+ - test/rbbt/util/R/test_plot.rb
600
+ - test/rbbt/util/R/test_eval.rb
601
+ - test/rbbt/util/R/test_model.rb
602
+ - test/rbbt/util/test_config.rb
603
+ - test/rbbt/util/test_log.rb
604
+ - test/rbbt/util/test_simpleDSL.rb
639
605
  - test/rbbt/util/log/test_progress.rb
606
+ - test/rbbt/util/test_tmpfile.rb
640
607
  - test/rbbt/util/test_R.rb
641
- - test/rbbt/test_workflow.rb
642
- - test/rbbt/knowledge_base/test_entity.rb
643
- - test/rbbt/knowledge_base/test_enrichment.rb
644
- - test/rbbt/knowledge_base/test_traverse.rb
645
- - test/rbbt/knowledge_base/test_syndicate.rb
646
- - test/rbbt/knowledge_base/test_registry.rb
647
- - test/rbbt/knowledge_base/test_query.rb
648
- - test/rbbt/association/test_item.rb
649
- - test/rbbt/association/test_util.rb
650
- - test/rbbt/association/test_open.rb
651
- - test/rbbt/association/test_database.rb
652
- - test/rbbt/association/test_index.rb
653
- - test/rbbt/annotations/test_util.rb
654
- - test/rbbt/test_monitor.rb
655
- - test/rbbt/resource/test_path.rb
656
- - test/rbbt/test_hpc.rb
657
- - test/rbbt/test_persist.rb
608
+ - test/rbbt/util/test_excel2tsv.rb
609
+ - test/rbbt/util/test_misc.rb
610
+ - test/rbbt/util/test_open.rb
611
+ - test/rbbt/util/test_simpleopt.rb
612
+ - test/rbbt/util/simpleopt/test_parse.rb
613
+ - test/rbbt/util/simpleopt/test_setup.rb
614
+ - test/rbbt/util/simpleopt/test_get.rb
615
+ - test/rbbt/util/test_python.rb
616
+ - test/rbbt/util/test_filecache.rb
617
+ - test/rbbt/util/concurrency/test_processes.rb
618
+ - test/rbbt/util/concurrency/test_threads.rb
619
+ - test/rbbt/util/concurrency/processes/test_socket.rb
620
+ - test/rbbt/util/test_semaphore.rb
621
+ - test/rbbt/util/test_chain_methods.rb
622
+ - test/rbbt/util/test_migrate.rb
623
+ - test/rbbt/test_resource.rb
624
+ - test/rbbt/test_packed_index.rb
625
+ - test/rbbt/tsv/test_change_id.rb
626
+ - test/rbbt/tsv/test_attach.rb
627
+ - test/rbbt/tsv/test_filter.rb
658
628
  - test/rbbt/tsv/test_parser.rb
659
629
  - test/rbbt/tsv/test_csv.rb
660
- - test/rbbt/tsv/test_manipulate.rb
630
+ - test/rbbt/tsv/test_accessor.rb
631
+ - test/rbbt/tsv/test_matrix.rb
661
632
  - test/rbbt/tsv/test_field_index.rb
662
633
  - test/rbbt/tsv/test_util.rb
663
- - test/rbbt/tsv/test_accessor.rb
664
- - test/rbbt/tsv/test_filter.rb
665
- - test/rbbt/tsv/test_stream.rb
634
+ - test/rbbt/tsv/test_index.rb
666
635
  - test/rbbt/tsv/test_parallel.rb
667
- - test/rbbt/tsv/test_matrix.rb
668
- - test/rbbt/tsv/test_attach.rb
636
+ - test/rbbt/tsv/test_manipulate.rb
669
637
  - test/rbbt/tsv/test_excel.rb
670
- - test/rbbt/tsv/test_change_id.rb
671
- - test/rbbt/tsv/test_index.rb
672
- - test/rbbt/tsv/parallel/test_traverse.rb
673
638
  - test/rbbt/tsv/parallel/test_through.rb
639
+ - test/rbbt/tsv/parallel/test_traverse.rb
640
+ - test/rbbt/tsv/test_stream.rb
641
+ - test/rbbt/test_association.rb
642
+ - test/rbbt/hpc/test_batch.rb
643
+ - test/rbbt/hpc/test_slurm.rb
644
+ - test/rbbt/association/test_database.rb
645
+ - test/rbbt/association/test_item.rb
646
+ - test/rbbt/association/test_open.rb
647
+ - test/rbbt/association/test_util.rb
648
+ - test/rbbt/association/test_index.rb
649
+ - test/rbbt/test_knowledge_base.rb
650
+ - test/rbbt/persist/tsv/test_kyotocabinet.rb
651
+ - test/rbbt/persist/tsv/test_cdb.rb
652
+ - test/rbbt/persist/tsv/test_lmdb.rb
653
+ - test/rbbt/persist/tsv/test_sharder.rb
654
+ - test/rbbt/persist/tsv/test_leveldb.rb
655
+ - test/rbbt/persist/tsv/test_tokyocabinet.rb
656
+ - test/rbbt/persist/test_tsv.rb
657
+ - test/rbbt/test_tsv.rb
658
+ - test/rbbt/test_annotations.rb
659
+ - test/rbbt/test_fix_width_table.rb
660
+ - test/rbbt/test_workflow.rb
661
+ - test/rbbt/entity/test_identifiers.rb
662
+ - test/rbbt/annotations/test_util.rb
663
+ - test/rbbt/test_hpc.rb
664
+ - test/rbbt/test_monitor.rb
665
+ - test/rbbt/test_persist.rb
666
+ - test/rbbt/knowledge_base/test_entity.rb
667
+ - test/rbbt/knowledge_base/test_registry.rb
668
+ - test/rbbt/knowledge_base/test_syndicate.rb
669
+ - test/rbbt/knowledge_base/test_query.rb
670
+ - test/rbbt/knowledge_base/test_enrichment.rb
671
+ - test/rbbt/knowledge_base/test_traverse.rb
672
+ - test/test_helper.rb