scout-gear 10.7.0 → 10.7.1

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: ac64d599e0df97b8ba5abd7aef4855ed1181ab9d9a3ba39196255b6649f56a0c
4
- data.tar.gz: 9f1cf16da9432beb46eeb486de5bab1c57e460b09f2126556126eb356c6a6fd6
3
+ metadata.gz: 3e72b6d2bef9af0067bf2601e059aa992ffdab98fba772dba1e297f958edb02d
4
+ data.tar.gz: 2c2cc3591c1645ccf34dbb250f1b2acda1b69040c0b051806c02c97eb07cc253
5
5
  SHA512:
6
- metadata.gz: 27015e493797ff3e80631a49e0d9bf2ccc115997e86d449b217dd55adc6dd0abd7701019c19467e9c48aa6bc7ff3c372238fcd58200069533686e2729870938f
7
- data.tar.gz: 4930f226926fdc18b06952f037f8e60b45b49116be115409cbcee36bf66202f0bb909691f20fddc6711babbb2ec9b604a5f3e551742ab52cb3f96748665b13a6
6
+ metadata.gz: d1be99dd4127f54c5cf16833197e527a3cfa41014c7db4306ec291e8f01b78f8340cad7ee6e342dee2ed25221f2b02a6f6b665f46e81365ad5a12eea087b300d
7
+ data.tar.gz: cc3a9b28e47520f6756cba18d6037d7e83b7cd4d0cded1597a7cafc2cc167234090c1014d2b38adcc0a6a69c8d3ba1a72255538bd924e14f55b95769f3eca977
data/.vimproject CHANGED
@@ -7,10 +7,12 @@ scout-gear=/$PWD filter="*.rb *.yaml" {
7
7
  scout=scout{
8
8
  workflow.rb
9
9
  workflow=workflow{
10
+ exceptions.rb
10
11
  definition.rb
11
12
  documentation.rb
12
13
  usage.rb
13
14
  util.rb
15
+ path.rb
14
16
  step.rb
15
17
  step=step{
16
18
  config.rb
@@ -80,7 +82,6 @@ scout-gear=/$PWD filter="*.rb *.yaml" {
80
82
  sort.rb
81
83
  unzip.rb
82
84
  }
83
- entity.rb
84
85
  parser.rb
85
86
  dumper.rb
86
87
  transformer.rb
data/VERSION CHANGED
@@ -1 +1 @@
1
- 10.7.0
1
+ 10.7.1
data/lib/scout/entity.rb CHANGED
@@ -34,6 +34,8 @@ module Entity
34
34
  entity = (entity.frozen? and not entity.nil?) ? entity.dup : ((Array === entity and dup_array) ? entity.collect{|e| e.nil? ? e : e.dup} : entity)
35
35
 
36
36
  entity = mod.setup(entity, params)
37
+
38
+ entity.extend AnnotatedArray if Array === entity && ! options[:annotated_array] == FalseClass
37
39
  end
38
40
 
39
41
  entity
@@ -352,6 +352,7 @@ module TSV
352
352
  all_field_names ||= [@key_field] + @fields
353
353
  fields = all_field_names if fields == :all
354
354
  positions = NamedArray.identify_name(all_field_names, fields)
355
+
355
356
  raise "Not all fields (#{Log.fingerprint fields}) identified in #{Log.fingerprint all_field_names}" if positions.include?(nil)
356
357
  kwargs[:positions] = positions
357
358
  field_names = all_field_names.values_at *positions
@@ -140,8 +140,17 @@ module Workflow
140
140
  end
141
141
  end
142
142
 
143
- FORGET_DEP_TASKS = ENV["SCOUT_FORGET_DEP_TASKS"] == "true"
144
- REMOVE_DEP_TASKS = ENV["SCOUT_REMOVE_DEP_TASKS"] == "true"
143
+ FORGET_TASK_ALIAS = begin
144
+ %w(SCOUT_FORGET_TASK_ALIAS SCOUT_FORGET_DEP_TASKS RBBT_FORGET_DEP_TASKS).select do |var|
145
+ ENV[var] == 'true'
146
+ end.any?
147
+ end
148
+ REMOVE_TASK_ALIAS = begin
149
+ remove = %w(SCOUT_REMOVE_TASK_ALIAS SCOUT_REMOVE_DEP_TASKS RBBT_REMOVE_DEP_TASKS).select do |var|
150
+ ENV.include?(var) && ENV[var] != 'false'
151
+ end.first
152
+ remove.nil? ? false : remove
153
+ end
145
154
  def task_alias(name, workflow, oname, *rest, &block)
146
155
  dep(workflow, oname, *rest, &block)
147
156
  extension :dep_task unless @extension
@@ -158,9 +167,15 @@ module Workflow
158
167
  raise dep.get_exception if dep.error?
159
168
  raise Aborted, "Aborted dependency #{dep.path}" if dep.aborted?
160
169
  set_info :type, dep.info[:type]
161
- forget = config :forget_dep_tasks, "forget_dep_tasks", :default => FORGET_DEP_TASKS
170
+
171
+ forget = config :forget_task_alias, "forget_task_alias"
172
+ forget = config :forget_dep_tasks, "forget_dep_tasks", :default => FORGET_TASK_ALIAS if forget.nil?
173
+
162
174
  if forget
163
- remove = config :remove_dep_tasks, "remove_dep_tasks", :default => REMOVE_DEP_TASKS
175
+ remove = config :remove_task_alias, "remove_task_alias"
176
+ remove = config :remove_dep_tasks, "remove_dep_tasks", :default => REMOVE_TASK_ALIAS if remove.nil?
177
+
178
+ Log.medium "Forget task_alias (remove: #{remove}): #{short_path}"
164
179
 
165
180
  self.archive_deps
166
181
  self.copy_linked_files_dir
@@ -179,9 +194,9 @@ module Workflow
179
194
  when 'recursive'
180
195
  (dep.dependencies + dep.rec_dependencies).uniq.each do |d|
181
196
  next if d.overriden
182
- d.clean unless config(:remove_dep, d.task_signature, d.task_name, d.workflow.to_s, :default => true).to_s == 'false'
197
+ d.clean unless Scout::Config.get(:remove_dep, "task:#{d.task_signature}", "task:#{d.task_name}", "workflow:#{d.workflow.name}", :default => true).to_s == 'false'
183
198
  end
184
- dep.clean unless config(:remove_dep, dep.task_signature, dep.task_name, dep.workflow.to_s, :default => true).to_s == 'false'
199
+ dep.clean unless Scout::Config.get(:remove_dep, "task:#{dep.task_signature}", "task:#{dep.task_name}", "workflow:#{dep.workflow.name}", :default => true).to_s == 'false'
185
200
  end
186
201
  end
187
202
  else
@@ -253,7 +253,7 @@ module Workflow
253
253
  end
254
254
  end
255
255
 
256
- def self.produce_dependencies(jobs, tasks, produce_cpus = Etc.nprocessors)
256
+ def self.produce_dependencies(jobs, tasks, produce_cpus = Etc.nprocessors, produce_timer = 5)
257
257
  jobs = [jobs] unless Array === jobs
258
258
  produce_list = []
259
259
  jobs.each do |job|
@@ -265,7 +265,7 @@ module Workflow
265
265
  end
266
266
  end
267
267
 
268
- orchestrator = Orchestrator.new 0.1, cpus: produce_cpus.to_i
268
+ orchestrator = Orchestrator.new produce_timer, cpus: produce_cpus.to_i
269
269
  orchestrator.process({}, produce_list)
270
270
  produce_list
271
271
  end
@@ -0,0 +1 @@
1
+ class TaskNotFound < StandardError; end
@@ -0,0 +1,40 @@
1
+ module Path
2
+ def self.step_file?(path)
3
+ return false unless path =~ /\.files(?:\/|$)/
4
+ parts = path.split("/")
5
+ job = parts.select{|p| p =~ /\.files$/}.first
6
+
7
+ if job
8
+ i = parts.index job
9
+ begin
10
+ workflow, task = parts.values_at i - 2, i - 1
11
+ _loaded = false
12
+ begin
13
+ Kernel.const_get(workflow)
14
+ rescue
15
+ if ! _loaded
16
+ Workflow.require_workflow workflow
17
+ _loaded = true
18
+ retry
19
+ end
20
+ raise $!
21
+ end
22
+ return parts[i-2..-1] * "/"
23
+ rescue
24
+ Log.exception $!
25
+ end
26
+ end
27
+
28
+ false
29
+ end
30
+
31
+ alias original_digest_str digest_str
32
+
33
+ def digest_str
34
+ if step_file = Path.step_file?(self)
35
+ "Step file: #{step_file}"
36
+ else
37
+ original_digest_str
38
+ end
39
+ end
40
+ end
@@ -11,7 +11,7 @@ class Step
11
11
  end
12
12
 
13
13
  def recursive_inputs
14
- recursive_inputs = NamedArray === @inputs ? @inputs.to_hash : {}
14
+ recursive_inputs = NamedArray === inputs ? inputs.to_hash : {}
15
15
  return recursive_inputs if dependencies.nil?
16
16
  dependencies.inject(recursive_inputs) do |acc,dep|
17
17
  acc.merge(dep.recursive_inputs)
@@ -10,7 +10,11 @@ class Step
10
10
  end
11
11
 
12
12
  def self.load_info(info_file)
13
- info = Persist.load(info_file, SERIALIZER) || {}
13
+ info = begin
14
+ Persist.load(info_file, SERIALIZER) || {}
15
+ rescue
16
+ {status: :noinfo}
17
+ end
14
18
  IndiferentHash.setup(info)
15
19
  end
16
20
 
@@ -152,7 +156,7 @@ class Step
152
156
  end
153
157
 
154
158
  def running?
155
- ! done? && (info[:pid] && Misc.pid_alive?(info[:pid]))
159
+ ! (done? && status == :done) && (info[:pid] && Misc.pid_alive?(info[:pid]))
156
160
  end
157
161
 
158
162
  def overriden?
@@ -31,6 +31,7 @@ class Step
31
31
  end
32
32
 
33
33
  def clean
34
+ Log.debug "Cleaning job files: #{path}"
34
35
  @take_stream = nil
35
36
  @result = nil
36
37
  @info = nil
@@ -372,7 +372,8 @@ class Step
372
372
  end
373
373
 
374
374
  def task_signature
375
- [workflow.to_s, task_name] * "#"
375
+ workflow_name = String === workflow ? workflow : workflow.name
376
+ [workflow, task_name] * "#"
376
377
  end
377
378
 
378
379
  def alias?
@@ -91,6 +91,8 @@ module Task
91
91
  if Path.is_filename?(value)
92
92
  if type == :path
93
93
  Open.write(input_file + ".as_path", value)
94
+ elsif Path.step_file?(value)
95
+ Open.write(input_file + ".as_path", value)
94
96
  else
95
97
  relative_file = save_file_input(value, directory)
96
98
  Open.write(input_file + ".as_file", relative_file)
@@ -92,7 +92,6 @@ module Task
92
92
  end
93
93
  end
94
94
 
95
-
96
95
  path = directory[name]
97
96
 
98
97
  path = path.set_extension(extension) if extension
@@ -138,7 +138,7 @@ module Workflow
138
138
 
139
139
  dep_tree = {}
140
140
  task = self.tasks[task_name]
141
- raise "TaskNotFound: #{task_name}" if task.nil?
141
+ raise TaskNotFound, "Task #{task_name} in #{self.to_s}" if task.nil?
142
142
  task.deps.each do |workflow, task, options|
143
143
  next if seen.include? dep
144
144
  seen << [workflow, task, options.merge(seen_options)]
@@ -5,6 +5,8 @@ require_relative 'workflow/step'
5
5
  require_relative 'workflow/documentation'
6
6
  require_relative 'workflow/usage'
7
7
  require_relative 'workflow/deployment'
8
+ require_relative 'workflow/exceptions'
9
+ require_relative 'workflow/path'
8
10
 
9
11
  require 'scout/resource'
10
12
  require 'scout/resource/scout'
@@ -153,6 +155,7 @@ module Workflow
153
155
 
154
156
  def job(name, *args)
155
157
  task = tasks[name]
158
+ raise TaskNotFound, "Task #{task_name} in #{self.to_s}" if task.nil?
156
159
  step = task.job(*args)
157
160
  step.extend step_module
158
161
  step
data/scout-gear.gemspec CHANGED
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: scout-gear 10.7.0 ruby lib
5
+ # stub: scout-gear 10.7.1 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "scout-gear".freeze
9
- s.version = "10.7.0".freeze
9
+ s.version = "10.7.1".freeze
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib".freeze]
13
13
  s.authors = ["Miguel Vazquez".freeze]
14
- s.date = "2024-06-05"
14
+ s.date = "2024-07-01"
15
15
  s.description = "Temporary files, logs, path, resources, persistence, workflows, TSV, etc.".freeze
16
16
  s.email = "mikisvaz@gmail.com".freeze
17
17
  s.executables = ["scout".freeze]
@@ -97,6 +97,8 @@ Gem::Specification.new do |s|
97
97
  "lib/scout/workflow/deployment/orchestrator.rb",
98
98
  "lib/scout/workflow/deployment/trace.rb",
99
99
  "lib/scout/workflow/documentation.rb",
100
+ "lib/scout/workflow/exceptions.rb",
101
+ "lib/scout/workflow/path.rb",
100
102
  "lib/scout/workflow/step.rb",
101
103
  "lib/scout/workflow/step/archive.rb",
102
104
  "lib/scout/workflow/step/children.rb",
@@ -212,6 +214,7 @@ Gem::Specification.new do |s|
212
214
  "test/scout/workflow/task/test_inputs.rb",
213
215
  "test/scout/workflow/test_definition.rb",
214
216
  "test/scout/workflow/test_documentation.rb",
217
+ "test/scout/workflow/test_path.rb",
215
218
  "test/scout/workflow/test_step.rb",
216
219
  "test/scout/workflow/test_task.rb",
217
220
  "test/scout/workflow/test_usage.rb",
@@ -66,5 +66,36 @@ class TestWorkflowDefinition < Test::Unit::TestCase
66
66
  assert_include job.archived_info, dep_path
67
67
  assert_equal :done, job.archived_info[dep_path][:status]
68
68
  end
69
+
70
+ def test_task_alias_remove_dep_partial
71
+ wf = Workflow.annonymous_workflow do
72
+ self.name = "CallName"
73
+
74
+ task :salute => :string do |name|
75
+ "Hi"
76
+ end
77
+
78
+ dep :salute
79
+ input :name, :string, "Name to call", nil, :jobname => true
80
+ task :call_name => :string do |name|
81
+ "#{step(:salute).load} #{name}"
82
+ end
83
+
84
+ task_alias :call_miguel, self, :call_name, name: "Miguel"
85
+ end
86
+
87
+ old_cache = Scout::Config::CACHE.dup
88
+ Scout::Config.set({:forget_dep_tasks => true, :remove_dep_tasks => :recursive}, 'task:CallName#call_miguel')
89
+ Scout::Config.set({:remove_dep => false}, 'task:CallName#call_name')
90
+ job = wf.job(:call_miguel)
91
+ call_name = job.step(:call_name)
92
+ salute = job.step(:salute)
93
+ assert_equal "Hi Miguel", job.run
94
+ refute salute.done?
95
+ assert call_name.done?
96
+ Scout::Config::CACHE.replace old_cache
97
+ assert_include job.archived_info, call_name.path
98
+ assert_equal :done, job.archived_info[call_name.path][:status]
99
+ end
69
100
  end
70
101
 
@@ -0,0 +1,9 @@
1
+ require File.expand_path(__FILE__).sub(%r(/test/.*), '/test/test_helper.rb')
2
+ require File.expand_path(__FILE__).sub(%r(.*/test/), '').sub(/test_(.*)\.rb/,'\1')
3
+
4
+ class TestClass < Test::Unit::TestCase
5
+ def test_path_digest
6
+ iii Misc.digest_str(Path.setup("test_file"))
7
+ end
8
+ end
9
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scout-gear
3
3
  version: !ruby/object:Gem::Version
4
- version: 10.7.0
4
+ version: 10.7.1
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-06-05 00:00:00.000000000 Z
11
+ date: 2024-07-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: scout-essentials
@@ -209,6 +209,8 @@ files:
209
209
  - lib/scout/workflow/deployment/orchestrator.rb
210
210
  - lib/scout/workflow/deployment/trace.rb
211
211
  - lib/scout/workflow/documentation.rb
212
+ - lib/scout/workflow/exceptions.rb
213
+ - lib/scout/workflow/path.rb
212
214
  - lib/scout/workflow/step.rb
213
215
  - lib/scout/workflow/step/archive.rb
214
216
  - lib/scout/workflow/step/children.rb
@@ -324,6 +326,7 @@ files:
324
326
  - test/scout/workflow/task/test_inputs.rb
325
327
  - test/scout/workflow/test_definition.rb
326
328
  - test/scout/workflow/test_documentation.rb
329
+ - test/scout/workflow/test_path.rb
327
330
  - test/scout/workflow/test_step.rb
328
331
  - test/scout/workflow/test_task.rb
329
332
  - test/scout/workflow/test_usage.rb