rbbt-util 5.32.16 → 5.32.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c2898a052d60bd9d6c05e3d277482e2221d07c18067b592fe7b8fefd796e8a6a
4
- data.tar.gz: 55bdd8b9a78d2d35a2c4c1574da11113c66b7621128076f29128941a5a0caf77
3
+ metadata.gz: 2e7aa425415a69c6615edd3fd7f38ce4c0bba0b1a911e7f97e927bf433483401
4
+ data.tar.gz: d2e8045de7f45d961afd8671b694c4c92f629dbc41d96057c84b9e97fc8cf15c
5
5
  SHA512:
6
- metadata.gz: 3dd350c68a0c931da771f789aa934e3a94cf52be343101743a14eb2e049b782665db8f941da1f28e7503386af3f17c6ef4e53afa0ef388aecb65c9571ea974a5
7
- data.tar.gz: 110a0a0eed2343835e3c4598f9c91c0280e28c64911a4fa18662c423d4f3d1774893b2e0ed848676a60878cae608a9b3d2e50de7c1c724935894971320628f2e
6
+ metadata.gz: b4f577d5d647b6c9ce1226062e7f5a459e6dee13e151e782d5938494a3e061d4b3fcc41bd14a8276ea646e58b726571445a45db7f2fe03dc34f4ca28d94c2d9a
7
+ data.tar.gz: d8432ea0d5232ddd9ac89c9e9cf0880a677cf708772ea5d0a6b6e28bd2204831d676e613a218c616c950c509c381a0ab2cf1acf88b98a85e9d4f18c3480ef48c
@@ -159,6 +159,12 @@ module Path
159
159
  end
160
160
 
161
161
  def find(where = nil, caller_lib = nil, paths = nil)
162
+
163
+ if located?
164
+ self.original ||= self
165
+ return self
166
+ end
167
+
162
168
  @path ||= {}
163
169
  rsearch_paths = (resource and resource.respond_to?(:search_paths)) ? resource.search_paths : nil
164
170
  key_elems = [where, caller_lib, rsearch_paths, paths]
@@ -167,12 +173,6 @@ module Path
167
173
 
168
174
  return @path[key] if @path[key]
169
175
 
170
- if located?
171
- @path[key] = self
172
- self.original ||= self
173
- return self
174
- end
175
-
176
176
  @path[key] ||= begin
177
177
  paths = [paths, rsearch_paths, self.search_paths, SEARCH_PATHS].reverse.compact.inject({}){|acc,h| acc.merge! h; acc }
178
178
  where = paths[:default] if where == :default
@@ -332,7 +332,7 @@ module TSV
332
332
  Log.low{"Traversing #{name} #{Log.color :green, "->"} #{stream_name(options[:into])}"}
333
333
  begin
334
334
  case obj
335
- when (defined? FastContainers and FastContainers::PriorityQueue)
335
+ when (defined? FastContainers && FastContainers::PriorityQueue === obj)
336
336
  traverse_priority_queue(obj, options, &block)
337
337
  when TSV
338
338
  traverse_tsv(obj, options, &block)
data/lib/rbbt/util/log.rb CHANGED
@@ -322,8 +322,13 @@ module Log
322
322
 
323
323
  def self.exception(e)
324
324
  stack = caller
325
- error([e.class.to_s, e.message].compact * ": " )
326
- error("BACKTRACE [#{Process.pid}]: " << Log.last_caller(stack) << "\n" + color_stack(e.backtrace)*"\n")
325
+ if ENV["RBBT_ORIGINAL_STACK"] == 'true'
326
+ error([e.class.to_s, e.message].compact * ": " )
327
+ error("BACKTRACE [#{Process.pid}]: " << Log.last_caller(stack) << "\n" + color_stack(e.backtrace)*"\n")
328
+ else
329
+ error("BACKTRACE [#{Process.pid}]: " << Log.last_caller(stack) << "\n" + color_stack(e.backtrace.reverse)*"\n")
330
+ error([e.class.to_s, e.message].compact * ": " )
331
+ end
327
332
  end
328
333
 
329
334
  def self.deprecated(m)
@@ -370,11 +375,17 @@ module Log
370
375
 
371
376
  def self.stack(stack)
372
377
  LOG_MUTEX.synchronize do
373
-
374
- STDERR.puts Log.color :magenta, "Stack trace [#{Process.pid}]: " << Log.last_caller(caller)
378
+ if ENV["RBBT_ORIGINAL_STACK"] == 'true'
379
+ STDERR.puts Log.color :magenta, "Stack trace [#{Process.pid}]: " << Log.last_caller(caller)
375
380
  color_stack(stack).each do |line|
376
381
  STDERR.puts line
377
382
  end
383
+ else
384
+ STDERR.puts Log.color :magenta, "Stack trace [#{Process.pid}]: " << Log.last_caller(caller)
385
+ color_stack(stack.reverse).each do |line|
386
+ STDERR.puts line
387
+ end
388
+ end
378
389
  end
379
390
  end
380
391
 
@@ -320,7 +320,7 @@ module Misc
320
320
  end
321
321
  end
322
322
  when String
323
- if Misc.is_filename?(obj) and ! %w(. ..).include?(obj)
323
+ if Misc.is_filename?(obj, false) and ! %w(. ..).include?(obj) and ! Path === obj
324
324
  obj2str Path.setup(obj.dup)
325
325
  else
326
326
  obj = obj.chomp if String === obj
@@ -240,6 +240,7 @@ module Open
240
240
  end
241
241
 
242
242
  def self.find_repo_dir(file)
243
+ return nil
243
244
  self.repository_dirs.each do |dir|
244
245
  dir = dir + '/' unless dir.chars[-1] == "/"
245
246
 
data/lib/rbbt/workflow.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'rbbt/workflow/definition'
2
+ require 'rbbt/workflow/dependencies'
2
3
  require 'rbbt/workflow/task'
3
4
  require 'rbbt/workflow/step'
4
5
  require 'rbbt/workflow/accessor'
@@ -228,6 +229,47 @@ module Workflow
228
229
  end
229
230
  end
230
231
 
232
+ TAG = ENV["RBBT_INPUT_JOBNAME"] == "true" ? :inputs : :hash
233
+ DEBUG_JOB_HASH = ENV["RBBT_DEBUG_JOB_HASH"] == 'true'
234
+ def step_path(taskname, jobname, inputs, dependencies, extension = nil)
235
+ raise "Jobname makes an invalid path: #{ jobname }" if jobname.include? '..'
236
+ if inputs.length > 0 or dependencies.any?
237
+ tagged_jobname = case TAG
238
+ when :hash
239
+ clean_inputs = Annotated.purge(inputs)
240
+ clean_inputs = clean_inputs.collect{|i| Symbol === i ? i.to_s : i }
241
+ deps_str = dependencies.collect{|d| (Step === d || (defined?(RemoteStep) && RemoteStep === Step)) ? "Step: " << (d.overriden? ? d.path : d.short_path) : d }
242
+ key_obj = {:inputs => clean_inputs, :dependencies => deps_str }
243
+ key_str = Misc.obj2str(key_obj)
244
+ hash_str = Misc.digest(key_str)
245
+ Log.debug "Hash for '#{[taskname, jobname] * "/"}' #{hash_str} for #{key_str}" if DEBUG_JOB_HASH
246
+ jobname + '_' << hash_str
247
+ when :inputs
248
+ all_inputs = {}
249
+ inputs.zip(self.task_info(taskname)[:inputs]) do |i,f|
250
+ all_inputs[f] = i
251
+ end
252
+ dependencies.each do |dep|
253
+ ri = dep.recursive_inputs
254
+ ri.zip(ri.fields).each do |i,f|
255
+ all_inputs[f] = i
256
+ end
257
+ end
258
+
259
+ all_inputs.any? ? jobname + '_' << Misc.obj2str(all_inputs) : jobname
260
+ else
261
+ jobname
262
+ end
263
+ else
264
+ tagged_jobname = jobname
265
+ end
266
+
267
+ if extension and not extension.empty?
268
+ tagged_jobname = tagged_jobname + ('.' << extension.to_s)
269
+ end
270
+
271
+ workdir[taskname][tagged_jobname].find
272
+ end
231
273
  def import_task(workflow, orig, new)
232
274
  orig_task = workflow.tasks[orig]
233
275
  new_task = orig_task.dup
@@ -417,7 +459,7 @@ module Workflow
417
459
  extension = nil
418
460
  if dependencies.any?
419
461
  dep_basename = File.basename(dependencies.last.path)
420
- extension = dep_path.split(".").last if dep_basename.include?('.')
462
+ extension = dep_basename.split(".").last if dep_basename.include?('.')
421
463
  end
422
464
  end
423
465
 
@@ -7,7 +7,7 @@ module ComputeDependency
7
7
  dep.extend ComputeDependency
8
8
  dep.compute = value
9
9
  end
10
-
10
+
11
11
  def canfail?
12
12
  compute == :canfail || (Array === compute && compute.include?(:canfail))
13
13
  end
@@ -72,83 +72,6 @@ module Workflow
72
72
  end
73
73
  end
74
74
 
75
- def rec_dependencies(taskname)
76
- @rec_dependencies ||= {}
77
- @rec_dependencies[taskname] ||= begin
78
- if task_dependencies.include? taskname
79
-
80
- deps = task_dependencies[taskname]
81
-
82
- #all_deps = deps.select{|dep| String === dep or Symbol === dep or Array === dep}
83
-
84
- all_deps = []
85
- deps.each do |dep|
86
- if DependencyBlock === dep
87
- all_deps << dep.dependency if dep.dependency
88
- else
89
- all_deps << dep unless Proc === dep
90
- end
91
-
92
- begin
93
- case dep
94
- when Array
95
- wf, t, o = dep
96
-
97
- wf.rec_dependencies(t.to_sym).each do |d|
98
- if Array === d
99
- new = d.dup
100
- else
101
- new = [dep.first, d]
102
- end
103
-
104
- if Hash === o and not o.empty?
105
- if Hash === new.last
106
- hash = new.last.dup
107
- o.each{|k,v| hash[k] ||= v}
108
- new[new.length-1] = hash
109
- else
110
- new.push o.dup
111
- end
112
- end
113
-
114
- all_deps << new
115
- end if wf && t
116
-
117
- when String, Symbol
118
- rec_deps = rec_dependencies(dep.to_sym)
119
- all_deps.concat rec_deps
120
- when DependencyBlock
121
- dep = dep.dependency
122
- raise TryAgain
123
- end
124
- rescue TryAgain
125
- retry
126
- end
127
- end
128
- all_deps.uniq
129
- else
130
- []
131
- end
132
- end
133
- end
134
-
135
- def task_from_dep(dep)
136
- task = case dep
137
- when Array
138
- dep.first.tasks[dep[1]]
139
- when String
140
- tasks[dep.to_sym]
141
- when Symbol
142
- tasks[dep.to_sym]
143
- end
144
- raise "Unknown dependency: #{Misc.fingerprint dep}" if task.nil?
145
- task
146
- end
147
-
148
- #def rec_inputs(taskname)
149
- # [taskname].concat(rec_dependencies(taskname)).inject([]){|acc, tn| acc.concat(task_from_dep(tn).inputs) }.uniq
150
- #end
151
-
152
75
  def rec_inputs(taskname)
153
76
  task = task_from_dep(taskname)
154
77
  deps = rec_dependencies(taskname)
@@ -294,174 +217,24 @@ module Workflow
294
217
  _inputs
295
218
  end
296
219
 
297
- def override_dependencies(inputs)
298
- override_dependencies = IndiferentHash.setup({})
299
- return override_dependencies if inputs.nil?
300
- inputs.each do |key,value|
301
- if String === key && m = key.match(/(.*)#(.*)/)
302
- workflow, task = m.values_at 1, 2
303
- workflow = self.to_s if workflow.empty?
304
- override_dependencies[workflow] ||= IndiferentHash.setup({})
305
- override_dependencies[workflow][task] = value
306
- end
307
- end
308
- override_dependencies
309
- end
310
-
311
- def setup_override_dependency(dep, workflow, task_name)
312
- dep = Step === dep ? dep : Workflow.load_step(dep)
313
- dep.workflow = workflow
314
- dep.info[:name] = dep.name
315
- dep.original_task_name ||= dep.task_name if dep.workflow
316
- begin
317
- workflow = Kernel.const_get workflow if String === workflow
318
- dep.task = workflow.tasks[task_name] if dep.task.nil? && workflow.tasks.include?(task_name)
319
- rescue
320
- Log.exception $!
321
- end
322
- dep.task_name = task_name
323
- dep.overriden = dep.original_task_name.to_sym
324
- dep
325
- end
326
-
327
- def real_dependencies(task, orig_jobname, inputs, dependencies)
328
- real_dependencies = []
329
- path_deps = {}
330
-
331
- override_dependencies = override_dependencies(inputs)
332
-
333
- dependencies.each do |dependency|
334
- _inputs = IndiferentHash.setup(inputs.dup)
335
- jobname = orig_jobname
336
- jobname = _inputs[:jobname] if _inputs.include? :jobname
337
-
338
- real_dep = case dependency
339
- when Array
340
- workflow, dep_task, options = dependency
341
-
342
- if override_dependencies[workflow.to_s] && value = override_dependencies[workflow.to_s][dep_task]
343
- setup_override_dependency(value, workflow, dep_task)
344
- else
345
-
346
- compute = options[:compute] if options
347
-
348
- all_d = (real_dependencies + real_dependencies.flatten.collect{|d| d.rec_dependencies} ).flatten.compact.uniq
349
-
350
- _inputs = assign_dep_inputs(_inputs, options, all_d, workflow.task_info(dep_task))
351
- jobname = _inputs.delete :jobname if _inputs.include? :jobname
352
-
353
- job = workflow._job(dep_task, jobname, _inputs)
354
- ComputeDependency.setup(job, compute) if compute
355
- job
356
- end
357
- when Step
358
- dependency
359
- when Symbol
360
- if override_dependencies[self.to_s] && value = override_dependencies[self.to_s][dependency]
361
- setup_override_dependency(value, self, dependency)
362
- else
363
- _job(dependency, jobname, _inputs)
364
- end
365
- when Proc
366
- if DependencyBlock === dependency
367
- orig_dep = dependency.dependency
368
- wf, task_name, options = orig_dep
369
-
370
- options = {} if options.nil?
371
- compute = options[:compute]
372
-
373
- options = IndiferentHash.setup(options.dup)
374
- dep = dependency.call jobname, _inputs.merge(options), real_dependencies
375
-
376
- dep = [dep] unless Array === dep
377
-
378
- new_=[]
379
- dep.each{|d|
380
- next if d.nil?
381
- if Hash === d
382
- d[:workflow] ||= wf
383
- d[:task] ||= task_name
384
- _override_dependencies = override_dependencies.merge(override_dependencies(d[:inputs] || {}))
385
- d = if _override_dependencies[d[:workflow].to_s] && value = _override_dependencies[d[:workflow].to_s][d[:task]]
386
- setup_override_dependency(value, d[:workflow], d[:task])
387
- else
388
- task_info = d[:workflow].task_info(d[:task])
389
-
390
- _inputs = assign_dep_inputs({}, options.merge(d[:inputs] || {}), real_dependencies, task_info)
391
- d[:workflow]._job(d[:task], d[:jobname], _inputs)
392
- end
393
- end
394
- ComputeDependency.setup(d, compute) if compute
395
- new_ << d
396
- }
397
- dep = new_
398
- else
399
- _inputs = IndiferentHash.setup(_inputs.dup)
400
- dep = dependency.call jobname, _inputs, real_dependencies
401
- if Hash === dep
402
- dep[:workflow] ||= wf || self
403
- _override_dependencies = override_dependencies.merge(override_dependencies(dep[:inputs] || {}))
404
- if _override_dependencies[dep[:workflow].to_s] && value = _override_dependencies[dep[:workflow].to_s][dep[:task]]
405
- setup_override_dependency(value, dep[:workflow], dep[:task])
406
- else
407
- task_info = (dep[:task] && dep[:workflow]) ? dep[:workflow].task_info(dep[:task]) : nil
408
- _inputs = assign_dep_inputs({}, dep[:inputs], real_dependencies, task_info)
409
- dep = dep[:workflow]._job(dep[:task], dep[:jobname], _inputs)
410
- end
411
- end
412
- end
413
-
414
- dep
415
- else
416
- raise "Dependency for #{task.name} not understood: #{Misc.fingerprint dependency}"
417
- end
418
-
419
- real_dependencies << real_dep
420
- end
421
- real_dependencies.flatten.compact
220
+ def task_from_dep(dep)
221
+ task = case dep
222
+ when Array
223
+ dep.first.tasks[dep[1]]
224
+ when String
225
+ tasks[dep.to_sym]
226
+ when Symbol
227
+ tasks[dep.to_sym]
228
+ end
229
+ raise "Unknown dependency: #{Misc.fingerprint dep}" if task.nil?
230
+ task
422
231
  end
423
232
 
424
- TAG = ENV["RBBT_INPUT_JOBNAME"] == "true" ? :inputs : :hash
425
- DEBUG_JOB_HASH = ENV["RBBT_DEBUG_JOB_HASH"] == 'true'
426
- def step_path(taskname, jobname, inputs, dependencies, extension = nil)
427
- raise "Jobname makes an invalid path: #{ jobname }" if jobname.include? '..'
428
- if inputs.length > 0 or dependencies.any?
429
- tagged_jobname = case TAG
430
- when :hash
431
- clean_inputs = Annotated.purge(inputs)
432
- clean_inputs = clean_inputs.collect{|i| Symbol === i ? i.to_s : i }
433
- deps_str = dependencies.collect{|d| (Step === d || (defined?(RemoteStep) && RemoteStep === Step)) ? "Step: " << d.short_path : d }
434
- key_obj = {:inputs => clean_inputs, :dependencies => deps_str }
435
- key_str = Misc.obj2str(key_obj)
436
- hash_str = Misc.digest(key_str)
437
- Log.debug "Hash for '#{[taskname, jobname] * "/"}' #{hash_str} for #{key_str}" if DEBUG_JOB_HASH
438
- jobname + '_' << hash_str
439
- when :inputs
440
- all_inputs = {}
441
- inputs.zip(self.task_info(taskname)[:inputs]) do |i,f|
442
- all_inputs[f] = i
443
- end
444
- dependencies.each do |dep|
445
- ri = dep.recursive_inputs
446
- ri.zip(ri.fields).each do |i,f|
447
- all_inputs[f] = i
448
- end
449
- end
450
-
451
- all_inputs.any? ? jobname + '_' << Misc.obj2str(all_inputs) : jobname
452
- else
453
- jobname
454
- end
455
- else
456
- tagged_jobname = jobname
457
- end
233
+ #def rec_inputs(taskname)
234
+ # [taskname].concat(rec_dependencies(taskname)).inject([]){|acc, tn| acc.concat(task_from_dep(tn).inputs) }.uniq
235
+ #end
458
236
 
459
- if extension and not extension.empty?
460
- tagged_jobname = tagged_jobname + ('.' << extension.to_s)
461
- end
462
237
 
463
- workdir[taskname][tagged_jobname].find
464
- end
465
238
 
466
239
  def id_for(path)
467
240
  if workdir.respond_to? :find
@@ -77,6 +77,7 @@ module Workflow
77
77
  returns workflow.tasks[oname].result_description if workflow.tasks.include?(oname) unless @result_description
78
78
  task name do
79
79
  raise RbbtException, "dependency not found in dep_task" if dependencies.empty?
80
+ Step.wait_for_jobs dependencies
80
81
  dep = dependencies.last
81
82
  dep.join
82
83
  raise dep.get_exception if dep.error?