rbbt-util 5.32.10 → 5.32.11

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.
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