scout-gear 7.1.0 → 7.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/.vimproject +29 -0
  3. data/VERSION +1 -1
  4. data/bin/scout +5 -1
  5. data/lib/rbbt-scout.rb +5 -0
  6. data/lib/scout/concurrent_stream.rb +6 -2
  7. data/lib/scout/config.rb +168 -0
  8. data/lib/scout/exceptions.rb +4 -3
  9. data/lib/scout/indiferent_hash/options.rb +1 -0
  10. data/lib/scout/indiferent_hash.rb +4 -2
  11. data/lib/scout/log/color.rb +3 -1
  12. data/lib/scout/log/progress/report.rb +1 -0
  13. data/lib/scout/log/progress/util.rb +1 -1
  14. data/lib/scout/log/progress.rb +5 -3
  15. data/lib/scout/log.rb +3 -2
  16. data/lib/scout/misc/monitor.rb +3 -0
  17. data/lib/scout/misc/system.rb +15 -0
  18. data/lib/scout/misc.rb +1 -0
  19. data/lib/scout/named_array.rb +68 -0
  20. data/lib/scout/open/stream.rb +38 -7
  21. data/lib/scout/path/find.rb +27 -3
  22. data/lib/scout/path/util.rb +7 -4
  23. data/lib/scout/persist/serialize.rb +7 -14
  24. data/lib/scout/persist.rb +21 -1
  25. data/lib/scout/resource/produce.rb +7 -94
  26. data/lib/scout/resource/software.rb +176 -0
  27. data/lib/scout/tsv/dumper.rb +107 -0
  28. data/lib/scout/tsv/index.rb +49 -0
  29. data/lib/scout/tsv/parser.rb +203 -30
  30. data/lib/scout/tsv/path.rb +13 -0
  31. data/lib/scout/tsv/persist/adapter.rb +348 -0
  32. data/lib/scout/tsv/persist/tokyocabinet.rb +113 -0
  33. data/lib/scout/tsv/persist.rb +15 -0
  34. data/lib/scout/tsv/traverse.rb +48 -0
  35. data/lib/scout/tsv/util.rb +24 -0
  36. data/lib/scout/tsv.rb +16 -3
  37. data/lib/scout/work_queue/worker.rb +3 -3
  38. data/lib/scout/work_queue.rb +22 -7
  39. data/lib/scout/workflow/definition.rb +93 -4
  40. data/lib/scout/workflow/step/config.rb +18 -0
  41. data/lib/scout/workflow/step/dependencies.rb +40 -0
  42. data/lib/scout/workflow/step/file.rb +15 -0
  43. data/lib/scout/workflow/step/info.rb +31 -4
  44. data/lib/scout/workflow/step/provenance.rb +148 -0
  45. data/lib/scout/workflow/step.rb +68 -19
  46. data/lib/scout/workflow/task.rb +3 -2
  47. data/lib/scout/workflow/usage.rb +1 -1
  48. data/lib/scout/workflow.rb +11 -3
  49. data/lib/scout-gear.rb +1 -0
  50. data/lib/scout.rb +1 -0
  51. data/scout-gear.gemspec +34 -3
  52. data/scout_commands/find +1 -1
  53. data/scout_commands/workflow/task +16 -10
  54. data/share/software/install_helpers +523 -0
  55. data/test/scout/log/test_progress.rb +0 -2
  56. data/test/scout/misc/test_system.rb +21 -0
  57. data/test/scout/open/test_stream.rb +159 -0
  58. data/test/scout/path/test_find.rb +14 -7
  59. data/test/scout/resource/test_software.rb +24 -0
  60. data/test/scout/test_config.rb +66 -0
  61. data/test/scout/test_meta_extension.rb +10 -0
  62. data/test/scout/test_named_array.rb +19 -0
  63. data/test/scout/test_persist.rb +35 -0
  64. data/test/scout/test_tmpfile.rb +2 -2
  65. data/test/scout/test_tsv.rb +41 -1
  66. data/test/scout/test_work_queue.rb +40 -13
  67. data/test/scout/tsv/persist/test_adapter.rb +34 -0
  68. data/test/scout/tsv/persist/test_tokyocabinet.rb +92 -0
  69. data/test/scout/tsv/test_dumper.rb +44 -0
  70. data/test/scout/tsv/test_index.rb +64 -0
  71. data/test/scout/tsv/test_parser.rb +86 -0
  72. data/test/scout/tsv/test_persist.rb +36 -0
  73. data/test/scout/tsv/test_traverse.rb +9 -0
  74. data/test/scout/tsv/test_util.rb +0 -0
  75. data/test/scout/work_queue/test_worker.rb +3 -3
  76. data/test/scout/workflow/step/test_dependencies.rb +25 -0
  77. data/test/scout/workflow/step/test_info.rb +15 -17
  78. data/test/scout/workflow/step/test_load.rb +16 -18
  79. data/test/scout/workflow/step/test_provenance.rb +25 -0
  80. data/test/scout/workflow/test_step.rb +206 -10
  81. data/test/scout/workflow/test_task.rb +0 -3
  82. data/test/test_helper.rb +6 -0
  83. metadata +33 -2
@@ -0,0 +1,148 @@
1
+ class Step
2
+ def self.job_path?(path)
3
+ path.split("/")[-4] == "jobs"
4
+ end
5
+
6
+ def self.status_color(status)
7
+ case status.to_sym
8
+ when :error, :aborted, :missing, :dead, :unsync
9
+ :red
10
+ when :streaming, :started
11
+ :cyan
12
+ when :done, :noinfo
13
+ :green
14
+ when :dependencies, :waiting, :setup
15
+ :yellow
16
+ when :notfound, :cleaned
17
+ :blue
18
+ else
19
+ if status.to_s.index ">"
20
+ :cyan
21
+ else
22
+ :cyan
23
+ end
24
+ end
25
+ end
26
+
27
+ def self.prov_status_msg(status)
28
+ color = status_color(status)
29
+ Log.color(color, status.to_s)
30
+ end
31
+
32
+ def self.prov_report_msg(status, name, path, info, input = nil)
33
+ parts = path.sub(/\{.*/,'').split "/"
34
+
35
+ parts.pop
36
+
37
+ task = Log.color(:yellow, parts.pop)
38
+ workflow = Log.color(:magenta, parts.pop)
39
+
40
+ if ! Step.job_path?(path)
41
+ task, status, workflow = Log.color(:yellow, info[:task_name]), Log.color(:green, "file"), Log.color(:magenta, "-")
42
+ end
43
+
44
+ path_mtime = begin
45
+ Open.mtime(path)
46
+ rescue Exception
47
+ nil
48
+ end
49
+
50
+ if input.nil? || input.empty?
51
+ input_str = nil
52
+ else
53
+ input = input.reject{|dep,name| (input & dep.dependencies.collect{|d| [d,name]}).any? }
54
+ input = input.reject{|dep,name| (input & dep.input_dependencies.collect{|d| [d,name]}).any? }
55
+ input_str = Log.color(:magenta, "-> ") + input.collect{|dep,name| Log.color(:yellow, dep.task_name.to_s) + ":" + Log.color(:yellow, name) }.uniq * " "
56
+ end
57
+
58
+ str = if ! (Open.remote?(path) || Open.ssh?(path)) && (Open.exists?(path) && $main_mtime && path_mtime && ($main_mtime - path_mtime) < -2)
59
+ prov_status_msg(status.to_s) << " " << [workflow, task, path, input_str].compact * " " << " (#{Log.color(:red, "Mtime out of sync") })"
60
+ else
61
+ prov_status_msg(status.to_s) << " " << [workflow, task, path, input_str].compact * " "
62
+ end
63
+
64
+ if $inputs and $inputs.any?
65
+ job_inputs = Workflow.load_step(path).recursive_inputs.to_hash
66
+ IndiferentHash.setup(job_inputs)
67
+
68
+ $inputs.each do |input|
69
+ value = job_inputs[input]
70
+ next if value.nil?
71
+ value_str = Misc.fingerprint(value)
72
+ str << "\t#{Log.color :magenta, input}=#{value_str}"
73
+ end
74
+ end
75
+
76
+ if $info_fields and $info_fields.any?
77
+ $info_fields.each do |field|
78
+ IndiferentHash.setup(info)
79
+ value = info[field]
80
+ next if value.nil?
81
+ value_str = Misc.fingerprint(value)
82
+ str << "\t#{Log.color :magenta, field}=#{value_str}"
83
+ end
84
+ end
85
+
86
+ str << "\n"
87
+ end
88
+
89
+ def self.prov_report(step, offset = 0, task = nil, seen = [], expand_repeats = false, input = nil)
90
+ info = step.info || {}
91
+ info[:task_name] = task
92
+ path = step.path
93
+ status = info[:status] || :missing
94
+ status = "remote" if Open.remote?(path) || Open.ssh?(path)
95
+ name = info[:name] || File.basename(path)
96
+ status = :unsync if status == :done and not Open.exist?(path)
97
+ status = :notfound if status == :noinfo and not Open.exist?(path)
98
+
99
+
100
+ this_step_msg = prov_report_msg(status, name, path, info, input)
101
+
102
+ input_dependencies = {}
103
+ step.dependencies.each do |dep|
104
+ if dep.input_dependencies.any?
105
+ dep.input_dependencies.each do |id|
106
+ input_name, _dep = dep.recursive_inputs.fields.zip(dep.recursive_inputs).select{|f,d|
107
+ d == id || (String === d && d.start_with?(id.files_dir)) || (Array === d && d.include?(id))
108
+ }.last
109
+ if input_name
110
+ input_dependencies[id] ||= []
111
+ input_dependencies[id] << [dep, input_name]
112
+ end
113
+ end
114
+ end
115
+ end if step.dependencies
116
+
117
+ str = ""
118
+ str = " " * offset + this_step_msg if ENV["RBBT_ORIGINAL_STACK"] == 'true'
119
+
120
+ step.dependencies.dup.tap{|l|
121
+ l.reverse! if ENV["RBBT_ORIGINAL_STACK"] == 'true'
122
+ }.each do |dep|
123
+ path = dep.path
124
+ new = ! seen.include?(path)
125
+ if new
126
+ seen << path
127
+ str << prov_report(dep, offset + 1, task, seen, expand_repeats, input_dependencies[dep])
128
+ else
129
+ if expand_repeats
130
+ str << Log.color(Step.status_color(dep.status), Log.uncolor(prov_report(dep, offset+1, task)))
131
+ else
132
+ info = dep.info || {}
133
+ status = info[:status] || :missing
134
+ status = "remote" if Open.remote?(path) || Open.ssh?(path)
135
+ name = info[:name] || File.basename(path)
136
+ status = :unsync if status == :done and not Open.exist?(path)
137
+ status = :notfound if status == :noinfo and not Open.exist?(path)
138
+
139
+ str << Log.color(Step.status_color(status), " " * (offset + 1) + Log.uncolor(prov_report_msg(status, name, path, info, input_dependencies[dep])))
140
+ end
141
+ end
142
+ end if step.dependencies
143
+
144
+ str += (" " * offset) + this_step_msg unless ENV["RBBT_ORIGINAL_STACK"] == 'true'
145
+
146
+ str
147
+ end
148
+ end
@@ -2,15 +2,25 @@ require_relative '../path'
2
2
  require_relative '../persist'
3
3
  require_relative 'step/info'
4
4
  require_relative 'step/load'
5
+ require_relative 'step/file'
6
+ require_relative 'step/dependencies'
7
+ require_relative 'step/provenance'
8
+ require_relative 'step/config'
5
9
 
6
10
  class Step
7
11
 
8
- attr_accessor :path, :inputs, :dependencies, :task
12
+ attr_accessor :path, :inputs, :dependencies, :task, :tee_copies
9
13
  def initialize(path, inputs = nil, dependencies = nil, &task)
10
14
  @path = path
11
15
  @inputs = inputs
12
16
  @dependencies = dependencies
13
17
  @task = task
18
+ @mutex = Mutex.new
19
+ @tee_copies = 1
20
+ end
21
+
22
+ def synchronize(&block)
23
+ @mutex.synchronize(&block)
14
24
  end
15
25
 
16
26
  def inputs
@@ -48,30 +58,49 @@ class Step
48
58
  @task_name ||= @task.name if @task.respond_to?(:name)
49
59
  end
50
60
 
61
+ def workflow
62
+ @task.workflow if @task
63
+ end
64
+
51
65
  def exec
52
- self.instance_exec(*inputs, &task)
66
+ @result = self.instance_exec(*inputs, &task)
53
67
  end
54
68
 
55
69
  attr_reader :result
56
70
  def run
57
71
  return @result || self.load if done?
58
- dependencies.each{|dep| dep.run }
59
- @result = Persist.persist(name, type, :path => path) do
72
+ prepare_dependencies
73
+ run_dependencies
74
+ @result = Persist.persist(name, type, :path => path, :tee_copies => tee_copies) do
60
75
  begin
61
76
  merge_info :status => :start, :start => Time.now,
62
77
  :pid => Process.pid, :pid_hostname => ENV["HOSTNAME"],
63
78
  :inputs => inputs, :type => type,
64
79
  :dependencies => dependencies.collect{|d| d.path }
65
80
 
66
- @result = exec
81
+ exec
82
+ rescue Exception => e
83
+ merge_info :status => :error, :exception => e
84
+ raise e
67
85
  ensure
68
- if streaming?
69
- ConcurrentStream.setup(@result) do
86
+ if ! (error? || aborted?)
87
+ if streaming?
88
+ ConcurrentStream.setup(@result) do
89
+ merge_info :status => :done, :end => Time.now
90
+ end
91
+
92
+ @result.abort_callback = proc do |exception|
93
+ if Aborted === exception || Interrupt === exception
94
+ merge_info :status => :aborted, :end => Time.now
95
+ else
96
+ merge_info :status => :error, :exception => exception, :end => Time.now
97
+ end
98
+ end
99
+
100
+ log :streaming
101
+ else
70
102
  merge_info :status => :done, :end => Time.now
71
103
  end
72
- log :streaming
73
- else
74
- merge_info :status => :done, :end => Time.now
75
104
  end
76
105
  end
77
106
  end
@@ -82,19 +111,34 @@ class Step
82
111
  end
83
112
 
84
113
  def streaming?
85
- IO === @result || StringIO === @result
114
+ @take_stream || IO === @result || StringIO === @result
86
115
  end
87
116
 
88
- def stream
89
- join
90
- streaming? ? @result : Open.open(path)
117
+ def get_stream
118
+ synchronize do
119
+ if streaming? && ! @result.nil?
120
+ if @result.next
121
+ Log.debug "Taking result #{Log.fingerprint @result} next #{Log.fingerprint @result.next}"
122
+ else
123
+ Log.debug "Taking result #{Log.fingerprint @result}"
124
+ end
125
+ @take_stream, @result = @result, @result.next
126
+ @take_stream
127
+ elsif done?
128
+ Open.open(self.path)
129
+ else
130
+ if running?
131
+ nil
132
+ else
133
+ exec
134
+ end
135
+ end
136
+ end
91
137
  end
92
138
 
93
139
  def join
94
- if streaming?
95
- Open.consume_stream(@result, false)
96
- @result = nil
97
- end
140
+ stream = get_stream if streaming?
141
+ Open.consume_stream(stream, false) if stream
98
142
  end
99
143
 
100
144
  def produce
@@ -109,8 +153,13 @@ class Step
109
153
  end
110
154
 
111
155
  def clean
156
+ @take_stream = nil
157
+ @result = nil
158
+ @info = nil
159
+ @info_load_time = nil
112
160
  Open.rm path if Open.exist?(path)
113
161
  Open.rm info_file if Open.exist?(info_file)
162
+ Open.rm_rf files_dir if Open.exist?(files_dir)
114
163
  end
115
164
 
116
165
  def recursive_clean
@@ -128,6 +177,6 @@ class Step
128
177
  end
129
178
 
130
179
  def digest_str
131
- path
180
+ path.dup
132
181
  end
133
182
  end
@@ -4,7 +4,7 @@ require_relative 'task/inputs'
4
4
 
5
5
  module Task
6
6
  extend MetaExtension
7
- extension_attr :name, :type, :inputs, :deps, :directory, :description
7
+ extension_attr :name, :type, :inputs, :deps, :directory, :description, :returns, :extension, :workflow
8
8
 
9
9
  DEFAULT_NAME = "Default"
10
10
 
@@ -54,7 +54,7 @@ module Task
54
54
  resolved_inputs = {}
55
55
  inputs.each do |k,v|
56
56
  if Symbol === v
57
- input_dep = dependencies.select{|d| d.task_name == v}.first
57
+ input_dep = dependencies.select{|d| d.task_name == v }.first
58
58
  resolved_inputs[k] = input_dep || inputs[v] || k
59
59
  else
60
60
  resolved_inputs[k] = v
@@ -150,6 +150,7 @@ module Task
150
150
 
151
151
  path = directory[id]
152
152
 
153
+ NamedArray.setup(inputs, @inputs.collect{|i| i[0] }) if @inputs
153
154
  Step.new path.find, inputs, dependencies, &self
154
155
  end
155
156
  end
@@ -34,7 +34,6 @@ module Task
34
34
  str.puts Log.color :yellow, dep + ":"
35
35
  str.puts
36
36
  str.puts SOPT.input_array_doc(inputs)
37
- str.puts
38
37
  end
39
38
 
40
39
  #task_inputs = dep_inputs deps, workflow
@@ -72,6 +71,7 @@ module Task
72
71
  str.puts
73
72
  end
74
73
 
74
+ str.puts
75
75
  str.puts Log.color(:magenta, "Returns: ") << Log.color(:blue, type.to_s) << "\n"
76
76
  str.puts
77
77
 
@@ -24,17 +24,25 @@ module Workflow
24
24
  base.libdir = Path.setup(libdir).tap{|p| p.resource = base}
25
25
  end
26
26
 
27
- def self.require_workflow(workflow)
28
- workflow = Path.setup('workflows')[workflow]["workflow.rb"] unless Open.exists?(workflow)
27
+ def self.require_workflow(workflow_name)
28
+ workflow = workflow_name
29
+ workflow = Path.setup('workflows')[workflow_name]["workflow.rb"] unless Open.exists?(workflow)
30
+ workflow = Path.setup('workflows')[Misc.snake_case(workflow_name)]["workflow.rb"] unless Open.exists?(workflow)
31
+ workflow = Path.setup('workflows')[Misc.camel_case(workflow_name)]["workflow.rb"] unless Open.exists?(workflow)
29
32
  if Open.exists?(workflow)
30
33
  workflow = workflow.find if Path === workflow
34
+ $LOAD_PATH.unshift(File.join(File.dirname(workflow), 'lib'))
31
35
  load workflow
36
+ else
37
+ raise "Workflow #{workflow_name} not found"
32
38
  end
33
39
  workflows.last
34
40
  end
35
41
 
36
42
  def job(name, *args)
37
43
  task = tasks[name]
38
- task.job(*args)
44
+ step = task.job(*args)
45
+ step.extend step_module
46
+ step
39
47
  end
40
48
  end
data/lib/scout-gear.rb CHANGED
@@ -7,3 +7,4 @@ require_relative 'scout/simple_opt'
7
7
  require_relative 'scout/resource'
8
8
  require_relative 'scout/resource/scout'
9
9
  require_relative 'scout/persist'
10
+ require_relative 'scout/tsv'
data/lib/scout.rb CHANGED
@@ -1 +1,2 @@
1
1
  require 'workflow-scout'
2
+ require 'rbbt-scout'
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 7.1.0 ruby lib
5
+ # stub: scout-gear 7.2.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "scout-gear".freeze
9
- s.version = "7.1.0"
9
+ s.version = "7.2.0"
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 = "2023-05-01"
14
+ s.date = "2023-05-09"
15
15
  s.description = "Temporary files, logs, etc.".freeze
16
16
  s.email = "mikisvaz@gmail.com".freeze
17
17
  s.executables = ["scout".freeze]
@@ -28,10 +28,12 @@ Gem::Specification.new do |s|
28
28
  "Rakefile",
29
29
  "VERSION",
30
30
  "bin/scout",
31
+ "lib/rbbt-scout.rb",
31
32
  "lib/scout-gear.rb",
32
33
  "lib/scout.rb",
33
34
  "lib/scout/cmd.rb",
34
35
  "lib/scout/concurrent_stream.rb",
36
+ "lib/scout/config.rb",
35
37
  "lib/scout/exceptions.rb",
36
38
  "lib/scout/indiferent_hash.rb",
37
39
  "lib/scout/indiferent_hash/case_insensitive.rb",
@@ -50,6 +52,8 @@ Gem::Specification.new do |s|
50
52
  "lib/scout/misc/format.rb",
51
53
  "lib/scout/misc/insist.rb",
52
54
  "lib/scout/misc/monitor.rb",
55
+ "lib/scout/misc/system.rb",
56
+ "lib/scout/named_array.rb",
53
57
  "lib/scout/open.rb",
54
58
  "lib/scout/open/lock.rb",
55
59
  "lib/scout/open/remote.rb",
@@ -68,6 +72,7 @@ Gem::Specification.new do |s|
68
72
  "lib/scout/resource/produce.rb",
69
73
  "lib/scout/resource/produce/rake.rb",
70
74
  "lib/scout/resource/scout.rb",
75
+ "lib/scout/resource/software.rb",
71
76
  "lib/scout/resource/util.rb",
72
77
  "lib/scout/semaphore.rb",
73
78
  "lib/scout/simple_opt.rb",
@@ -78,7 +83,15 @@ Gem::Specification.new do |s|
78
83
  "lib/scout/simple_opt/setup.rb",
79
84
  "lib/scout/tmpfile.rb",
80
85
  "lib/scout/tsv.rb",
86
+ "lib/scout/tsv/dumper.rb",
87
+ "lib/scout/tsv/index.rb",
81
88
  "lib/scout/tsv/parser.rb",
89
+ "lib/scout/tsv/path.rb",
90
+ "lib/scout/tsv/persist.rb",
91
+ "lib/scout/tsv/persist/adapter.rb",
92
+ "lib/scout/tsv/persist/tokyocabinet.rb",
93
+ "lib/scout/tsv/traverse.rb",
94
+ "lib/scout/tsv/util.rb",
82
95
  "lib/scout/work_queue.rb",
83
96
  "lib/scout/work_queue/socket.rb",
84
97
  "lib/scout/work_queue/worker.rb",
@@ -86,8 +99,12 @@ Gem::Specification.new do |s|
86
99
  "lib/scout/workflow/definition.rb",
87
100
  "lib/scout/workflow/documentation.rb",
88
101
  "lib/scout/workflow/step.rb",
102
+ "lib/scout/workflow/step/config.rb",
103
+ "lib/scout/workflow/step/dependencies.rb",
104
+ "lib/scout/workflow/step/file.rb",
89
105
  "lib/scout/workflow/step/info.rb",
90
106
  "lib/scout/workflow/step/load.rb",
107
+ "lib/scout/workflow/step/provenance.rb",
91
108
  "lib/scout/workflow/task.rb",
92
109
  "lib/scout/workflow/task/inputs.rb",
93
110
  "lib/scout/workflow/usage.rb",
@@ -104,6 +121,7 @@ Gem::Specification.new do |s|
104
121
  "scout_commands/workflow/task_old",
105
122
  "share/color/color_names",
106
123
  "share/color/diverging_colors.hex",
124
+ "share/software/install_helpers",
107
125
  "test/scout/indiferent_hash/test_case_insensitive.rb",
108
126
  "test/scout/indiferent_hash/test_options.rb",
109
127
  "test/scout/log/test_color.rb",
@@ -111,6 +129,7 @@ Gem::Specification.new do |s|
111
129
  "test/scout/misc/test_digest.rb",
112
130
  "test/scout/misc/test_filesystem.rb",
113
131
  "test/scout/misc/test_insist.rb",
132
+ "test/scout/misc/test_system.rb",
114
133
  "test/scout/open/test_lock.rb",
115
134
  "test/scout/open/test_remote.rb",
116
135
  "test/scout/open/test_stream.rb",
@@ -122,6 +141,7 @@ Gem::Specification.new do |s|
122
141
  "test/scout/persist/test_serialize.rb",
123
142
  "test/scout/resource/test_path.rb",
124
143
  "test/scout/resource/test_produce.rb",
144
+ "test/scout/resource/test_software.rb",
125
145
  "test/scout/resource/test_util.rb",
126
146
  "test/scout/simple_opt/test_doc.rb",
127
147
  "test/scout/simple_opt/test_get.rb",
@@ -129,10 +149,12 @@ Gem::Specification.new do |s|
129
149
  "test/scout/simple_opt/test_setup.rb",
130
150
  "test/scout/test_cmd.rb",
131
151
  "test/scout/test_concurrent_stream.rb",
152
+ "test/scout/test_config.rb",
132
153
  "test/scout/test_indiferent_hash.rb",
133
154
  "test/scout/test_log.rb",
134
155
  "test/scout/test_meta_extension.rb",
135
156
  "test/scout/test_misc.rb",
157
+ "test/scout/test_named_array.rb",
136
158
  "test/scout/test_open.rb",
137
159
  "test/scout/test_path.rb",
138
160
  "test/scout/test_persist.rb",
@@ -142,11 +164,20 @@ Gem::Specification.new do |s|
142
164
  "test/scout/test_tsv.rb",
143
165
  "test/scout/test_work_queue.rb",
144
166
  "test/scout/test_workflow.rb",
167
+ "test/scout/tsv/persist/test_adapter.rb",
168
+ "test/scout/tsv/persist/test_tokyocabinet.rb",
169
+ "test/scout/tsv/test_dumper.rb",
170
+ "test/scout/tsv/test_index.rb",
145
171
  "test/scout/tsv/test_parser.rb",
172
+ "test/scout/tsv/test_persist.rb",
173
+ "test/scout/tsv/test_traverse.rb",
174
+ "test/scout/tsv/test_util.rb",
146
175
  "test/scout/work_queue/test_socket.rb",
147
176
  "test/scout/work_queue/test_worker.rb",
177
+ "test/scout/workflow/step/test_dependencies.rb",
148
178
  "test/scout/workflow/step/test_info.rb",
149
179
  "test/scout/workflow/step/test_load.rb",
180
+ "test/scout/workflow/step/test_provenance.rb",
150
181
  "test/scout/workflow/task/test_inputs.rb",
151
182
  "test/scout/workflow/test_definition.rb",
152
183
  "test/scout/workflow/test_documentation.rb",
data/scout_commands/find CHANGED
@@ -69,7 +69,7 @@ end if resource
69
69
 
70
70
  path = (resource || Scout)[path.dup]
71
71
 
72
- if where.nil? || where == 'all' || path.search_paths.include?(where.to_sym)
72
+ if where.nil? || where == 'all' || path.path_maps.include?(where.to_sym)
73
73
  location = path.find(where)
74
74
 
75
75
  if Array === location
@@ -13,6 +13,7 @@ $ #{$0} [<options>] <workflow> <task>
13
13
  -h--help Print this help
14
14
  -jn--job_name* Name to use as job identifier
15
15
  -pf--print_filepath Print the file path
16
+ -prov--provenance Print the step provenance
16
17
  -cl--clean Clean the last step
17
18
  -rcl--recursive_clean Clean all steps
18
19
  EOF
@@ -22,7 +23,8 @@ workflow_name, task_name = ARGV
22
23
  raise MissingParameterException.new :workflow if workflow_name.nil?
23
24
 
24
25
  workflow = Workflow.require_workflow workflow_name
25
- task = workflow.tasks[task_name.to_sym] if task_name
26
+ task_name = task_name.to_sym if task_name
27
+ task = workflow.tasks[task_name.to_sym]
26
28
 
27
29
  options[:help] = true if task.nil?
28
30
 
@@ -38,20 +40,24 @@ if options[:help]
38
40
  end
39
41
 
40
42
  job_options = task.get_SOPT(task)
41
- job = task.job(options[:job_name], job_options)
43
+ job = workflow.job(task_name, options[:job_name], job_options)
42
44
 
43
45
  job.recursive_clean if options[:recursive_clean]
44
46
  job.clean if options[:clean]
45
47
 
46
- job.run
47
-
48
- if options[:print_filepath]
49
- path = job.path
50
- path = path.find if Path === path
51
- puts path
48
+ if options[:provenance]
49
+ puts Step.prov_report(job)
52
50
  else
53
- if ! Open.consume_stream(job.stream, false, STDOUT, false).end_with? "\n"
54
- puts
51
+ job.run unless job.done?
52
+
53
+ if options[:print_filepath]
54
+ path = job.path
55
+ path = path.find if Path === path
56
+ puts path
57
+ else
58
+ if ! ((c = Open.consume_stream(job.get_stream, false, STDOUT, false)) && c.end_with?("\n"))
59
+ puts
60
+ end
55
61
  end
56
62
  end
57
63