scout-gear 7.2.0 → 8.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.vimproject +51 -6
- data/VERSION +1 -1
- data/bin/scout +6 -3
- data/lib/rbbt-scout.rb +1 -0
- data/lib/scout/cmd.rb +1 -1
- data/lib/scout/concurrent_stream.rb +33 -29
- data/lib/scout/config.rb +1 -1
- data/lib/scout/exceptions.rb +1 -0
- data/lib/scout/log/color.rb +4 -2
- data/lib/scout/log/progress/report.rb +1 -1
- data/lib/scout/log/progress/util.rb +71 -2
- data/lib/scout/log/progress.rb +1 -1
- data/lib/scout/log/trap.rb +107 -0
- data/lib/scout/log.rb +56 -21
- data/lib/scout/meta_extension.rb +13 -6
- data/lib/scout/misc/digest.rb +1 -1
- data/lib/scout/misc/format.rb +12 -0
- data/lib/scout/misc/helper.rb +31 -0
- data/lib/scout/misc/insist.rb +1 -1
- data/lib/scout/misc/monitor.rb +12 -1
- data/lib/scout/misc/system.rb +10 -0
- data/lib/scout/misc.rb +1 -0
- data/lib/scout/named_array.rb +65 -3
- data/lib/scout/open/lock/lockfile.rb +587 -0
- data/lib/scout/open/lock.rb +28 -2
- data/lib/scout/open/remote.rb +4 -0
- data/lib/scout/open/stream.rb +111 -42
- data/lib/scout/open/util.rb +13 -3
- data/lib/scout/path/find.rb +9 -1
- data/lib/scout/path/util.rb +35 -0
- data/lib/scout/persist/serialize.rb +18 -5
- data/lib/scout/persist.rb +60 -30
- data/lib/scout/resource/path.rb +53 -0
- data/lib/scout/resource/produce.rb +0 -8
- data/lib/scout/resource/util.rb +2 -1
- data/lib/scout/semaphore.rb +8 -1
- data/lib/scout/tmpfile.rb +7 -8
- data/lib/scout/tsv/attach.rb +177 -0
- data/lib/scout/tsv/change_id.rb +40 -0
- data/lib/scout/tsv/dumper.rb +85 -54
- data/lib/scout/tsv/index.rb +188 -20
- data/lib/scout/tsv/open.rb +182 -0
- data/lib/scout/tsv/parser.rb +200 -118
- data/lib/scout/tsv/path.rb +5 -6
- data/lib/scout/tsv/persist/adapter.rb +26 -37
- data/lib/scout/tsv/persist/fix_width_table.rb +327 -0
- data/lib/scout/tsv/persist/serialize.rb +117 -0
- data/lib/scout/tsv/persist/tokyocabinet.rb +6 -3
- data/lib/scout/tsv/persist.rb +4 -2
- data/lib/scout/tsv/transformer.rb +141 -0
- data/lib/scout/tsv/traverse.rb +136 -37
- data/lib/scout/tsv/util/filter.rb +312 -0
- data/lib/scout/tsv/util/process.rb +73 -0
- data/lib/scout/tsv/util/reorder.rb +81 -0
- data/lib/scout/tsv/util/select.rb +265 -0
- data/lib/scout/tsv/util/unzip.rb +86 -0
- data/lib/scout/tsv/util.rb +126 -19
- data/lib/scout/tsv.rb +28 -5
- data/lib/scout/work_queue/socket.rb +6 -1
- data/lib/scout/work_queue/worker.rb +5 -2
- data/lib/scout/work_queue.rb +15 -8
- data/lib/scout/workflow/definition.rb +29 -2
- data/lib/scout/workflow/step/dependencies.rb +24 -4
- data/lib/scout/workflow/step/info.rb +40 -5
- data/lib/scout/workflow/step/progress.rb +14 -0
- data/lib/scout/workflow/step/provenance.rb +8 -7
- data/lib/scout/workflow/step/status.rb +45 -0
- data/lib/scout/workflow/step.rb +104 -33
- data/lib/scout/workflow/task/inputs.rb +14 -20
- data/lib/scout/workflow/task.rb +86 -47
- data/lib/scout/workflow/usage.rb +10 -6
- data/scout-gear.gemspec +30 -3
- data/scout_commands/workflow/task +37 -9
- data/scout_commands/workflow/task_old +2 -2
- data/test/scout/open/test_stream.rb +61 -59
- data/test/scout/path/test_find.rb +10 -1
- data/test/scout/resource/test_produce.rb +15 -0
- data/test/scout/test_meta_extension.rb +25 -0
- data/test/scout/test_named_array.rb +18 -0
- data/test/scout/test_persist.rb +67 -0
- data/test/scout/test_tmpfile.rb +1 -1
- data/test/scout/test_tsv.rb +222 -3
- data/test/scout/test_work_queue.rb +21 -18
- data/test/scout/tsv/persist/test_adapter.rb +11 -1
- data/test/scout/tsv/persist/test_fix_width_table.rb +134 -0
- data/test/scout/tsv/persist/test_tokyocabinet.rb +29 -1
- data/test/scout/tsv/test_attach.rb +227 -0
- data/test/scout/tsv/test_change_id.rb +98 -0
- data/test/scout/tsv/test_dumper.rb +1 -1
- data/test/scout/tsv/test_index.rb +127 -3
- data/test/scout/tsv/test_open.rb +167 -0
- data/test/scout/tsv/test_parser.rb +45 -3
- data/test/scout/tsv/test_persist.rb +9 -0
- data/test/scout/tsv/test_transformer.rb +108 -0
- data/test/scout/tsv/test_traverse.rb +195 -3
- data/test/scout/tsv/test_util.rb +24 -0
- data/test/scout/tsv/util/test_filter.rb +188 -0
- data/test/scout/tsv/util/test_process.rb +47 -0
- data/test/scout/tsv/util/test_reorder.rb +94 -0
- data/test/scout/tsv/util/test_select.rb +58 -0
- data/test/scout/tsv/util/test_unzip.rb +112 -0
- data/test/scout/work_queue/test_socket.rb +0 -1
- data/test/scout/work_queue/test_worker.rb +63 -6
- data/test/scout/workflow/step/test_load.rb +3 -3
- data/test/scout/workflow/step/test_status.rb +31 -0
- data/test/scout/workflow/task/test_inputs.rb +14 -14
- data/test/scout/workflow/test_step.rb +13 -13
- data/test/scout/workflow/test_task.rb +168 -32
- data/test/scout/workflow/test_usage.rb +33 -6
- data/test/test_helper.rb +3 -1
- metadata +29 -2
data/lib/scout/workflow/task.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require_relative '../meta_extension'
|
2
|
+
require_relative '../named_array'
|
2
3
|
require_relative 'step'
|
3
4
|
require_relative 'task/inputs'
|
4
5
|
|
@@ -24,7 +25,7 @@ module Task
|
|
24
25
|
return inputs if deps.nil?
|
25
26
|
deps.inject(inputs) do |acc,dep|
|
26
27
|
workflow, task = dep
|
27
|
-
next if workflow.nil?
|
28
|
+
next acc if workflow.nil? || task.nil?
|
28
29
|
acc += workflow.tasks[task].recursive_inputs
|
29
30
|
end
|
30
31
|
end
|
@@ -43,27 +44,45 @@ module Task
|
|
43
44
|
|
44
45
|
provided_inputs ||= {}
|
45
46
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
47
|
+
# Helper function
|
48
|
+
load_dep = proc do |id, workflow, task, step_options, definition_options, dependencies|
|
49
|
+
task = step_options.delete(:task) if step_options.include?(:task)
|
50
|
+
workflow = step_options.delete(:workflow) if step_options.include?(:workflow)
|
51
|
+
id = step_options.delete(:id) if step_options.include?(:id)
|
52
|
+
id = step_options.delete(:jobname) if step_options.include?(:jobname)
|
50
53
|
|
51
|
-
|
52
|
-
|
54
|
+
step_inputs = step_options.include?(:inputs)? step_options.delete(:inputs) : step_options
|
55
|
+
step_inputs = IndiferentHash.add_defaults step_inputs, definition_options
|
53
56
|
|
54
57
|
resolved_inputs = {}
|
55
|
-
|
58
|
+
step_inputs.each do |k,v|
|
56
59
|
if Symbol === v
|
57
60
|
input_dep = dependencies.select{|d| d.task_name == v }.first
|
58
|
-
resolved_inputs[k] = input_dep ||
|
61
|
+
resolved_inputs[k] = input_dep || step_inputs[v] || k
|
59
62
|
else
|
60
63
|
resolved_inputs[k] = v
|
61
64
|
end
|
62
65
|
end
|
63
|
-
workflow.job(task, id, resolved_inputs)
|
66
|
+
[workflow.job(task, id, resolved_inputs), step_inputs]
|
64
67
|
end
|
65
68
|
|
66
|
-
|
69
|
+
# Helper function
|
70
|
+
find_dep_non_default_inputs = proc do |dep,definition_options,step_inputs={}|
|
71
|
+
dep_non_default_inputs = dep.non_default_inputs
|
72
|
+
dep_non_default_inputs.select do |name|
|
73
|
+
step_inputs.include?(name)
|
74
|
+
end
|
75
|
+
dep_non_default_inputs.reject! do |name|
|
76
|
+
definition_options.include?(name) &&
|
77
|
+
(definition_options[name] != :placeholder || definition_options[name] != dep.inputs[name])
|
78
|
+
end
|
79
|
+
|
80
|
+
dep_non_default_inputs
|
81
|
+
end
|
82
|
+
|
83
|
+
deps.each do |workflow,task,definition_options,block=nil|
|
84
|
+
definition_options[:id] = definition_options.delete(:jobname) if definition_options.include?(:jobname)
|
85
|
+
|
67
86
|
if provided_inputs.include?(overriden = [workflow.name, task] * "#")
|
68
87
|
dep = provided_inputs[overriden]
|
69
88
|
dep = Step.new dep unless Step === dep
|
@@ -73,58 +92,52 @@ module Task
|
|
73
92
|
next
|
74
93
|
end
|
75
94
|
|
76
|
-
|
95
|
+
definition_options ||= {}
|
96
|
+
|
77
97
|
if block
|
78
|
-
|
98
|
+
fixed_provided_inputs = self.assign_inputs(provided_inputs).first.to_hash
|
99
|
+
self.inputs.each do |name,type,desc,value|
|
100
|
+
fixed_provided_inputs[name] = value unless fixed_provided_inputs.include?(name)
|
101
|
+
end
|
102
|
+
fixed_provided_inputs = IndiferentHash.add_defaults fixed_provided_inputs, provided_inputs
|
103
|
+
block_options = IndiferentHash.add_defaults definition_options.dup, fixed_provided_inputs
|
79
104
|
|
80
|
-
res = block.call id,
|
105
|
+
res = block.call id, block_options, dependencies
|
81
106
|
|
82
107
|
case res
|
83
108
|
when Step
|
84
109
|
dep = res
|
85
110
|
dependencies << dep
|
86
|
-
dep_non_default_inputs =
|
87
|
-
non_default_inputs.concat(dep_non_default_inputs
|
111
|
+
dep_non_default_inputs = find_dep_non_default_inputs.call(dep, block_options)
|
112
|
+
non_default_inputs.concat(dep_non_default_inputs)
|
88
113
|
when Hash
|
89
|
-
|
90
|
-
dep = load_dep.call(id, workflow, task,
|
114
|
+
step_options = block_options.merge(res)
|
115
|
+
dep, step_inputs = load_dep.call(id, workflow, task, step_options, block_options, dependencies)
|
91
116
|
dependencies << dep
|
92
|
-
dep_non_default_inputs =
|
93
|
-
dep_non_default_inputs -= options.keys
|
94
|
-
if new_options.include?(:inputs)
|
95
|
-
dep_non_default_inputs -= new_options[:inputs].keys
|
96
|
-
else
|
97
|
-
dep_non_default_inputs -= new_options.keys
|
98
|
-
end
|
117
|
+
dep_non_default_inputs = find_dep_non_default_inputs.call(dep, definition_options, step_inputs)
|
99
118
|
non_default_inputs.concat(dep_non_default_inputs)
|
100
119
|
when Array
|
101
120
|
res.each do |_res|
|
102
121
|
if Hash === _res
|
103
|
-
|
104
|
-
dep = load_dep.call(id, workflow, task,
|
122
|
+
step_options = block_options.merge(_res)
|
123
|
+
dep, step_inputs = load_dep.call(id, workflow, task, step_options, block_options, dependencies)
|
105
124
|
dependencies << dep
|
106
|
-
dep_non_default_inputs =
|
107
|
-
dep_non_default_inputs -= options.keys
|
108
|
-
if new_options.include?(:inputs)
|
109
|
-
dep_non_default_inputs -= new_options[:inputs].keys
|
110
|
-
else
|
111
|
-
dep_non_default_inputs -= new_options.keys
|
112
|
-
end
|
125
|
+
dep_non_default_inputs = find_dep_non_default_inputs.call(dep, definition_options, step_inputs)
|
113
126
|
non_default_inputs.concat(dep_non_default_inputs)
|
114
127
|
else
|
115
128
|
dep = _res
|
116
129
|
dependencies << dep
|
117
|
-
dep_non_default_inputs =
|
118
|
-
non_default_inputs.concat(dep_non_default_inputs
|
130
|
+
dep_non_default_inputs = find_dep_non_default_inputs.call(dep, block_options)
|
131
|
+
non_default_inputs.concat(dep_non_default_inputs)
|
119
132
|
end
|
120
133
|
end
|
121
134
|
end
|
122
135
|
else
|
123
|
-
|
124
|
-
dep = load_dep.call(id, workflow, task,
|
136
|
+
step_options = IndiferentHash.add_defaults definition_options.dup, provided_inputs
|
137
|
+
dep, step_inputs = load_dep.call(id, workflow, task, step_options, definition_options, dependencies)
|
125
138
|
dependencies << dep
|
126
|
-
dep_non_default_inputs =
|
127
|
-
non_default_inputs.concat(dep_non_default_inputs
|
139
|
+
dep_non_default_inputs = find_dep_non_default_inputs.call(dep, definition_options, step_inputs)
|
140
|
+
non_default_inputs.concat(dep_non_default_inputs)
|
128
141
|
end
|
129
142
|
end
|
130
143
|
|
@@ -136,21 +149,47 @@ module Task
|
|
136
149
|
provided_inputs = {} if provided_inputs.nil?
|
137
150
|
id = DEFAULT_NAME if id.nil?
|
138
151
|
|
139
|
-
inputs, non_default_inputs,
|
152
|
+
inputs, non_default_inputs, input_digest_str = process_inputs provided_inputs
|
140
153
|
|
141
154
|
dependencies = dependencies(id, provided_inputs, non_default_inputs)
|
142
155
|
|
143
156
|
non_default_inputs.concat provided_inputs.keys.select{|k| String === k && k.include?("#") } if Hash === provided_inputs
|
144
157
|
|
145
158
|
if non_default_inputs.any?
|
146
|
-
hash = Misc.digest(:inputs =>
|
147
|
-
|
148
|
-
|
159
|
+
hash = Misc.digest(:inputs => input_digest_str, :dependencies => dependencies)
|
160
|
+
name = [id, hash] * "_"
|
161
|
+
else
|
162
|
+
name = id
|
163
|
+
end
|
164
|
+
|
165
|
+
extension = self.extension
|
166
|
+
if extension == :dep_task
|
167
|
+
extension = nil
|
168
|
+
if dependencies.any?
|
169
|
+
dep_basename = File.basename(dependencies.last.path)
|
170
|
+
if dep_basename.include? "."
|
171
|
+
parts = dep_basename.split(".")
|
172
|
+
extension = [parts.pop]
|
173
|
+
while parts.last.length <= 4
|
174
|
+
extension << parts.pop
|
175
|
+
end
|
176
|
+
extension = extension.reverse * "."
|
177
|
+
end
|
178
|
+
end
|
149
179
|
end
|
150
180
|
|
151
|
-
path = directory[
|
181
|
+
path = directory[name]
|
182
|
+
|
183
|
+
path = path.set_extension(extension) if extension
|
152
184
|
|
153
|
-
|
154
|
-
|
185
|
+
Persist.memory(path) do
|
186
|
+
if hash
|
187
|
+
Log.debug "ID #{self.name} #{id} - #{hash}: #{Log.fingerprint(:input_digest => input_digest_str, :non_default_inputs => non_default_inputs, :dependencies => dependencies)}"
|
188
|
+
else
|
189
|
+
Log.debug "ID #{self.name} #{id} - Clean"
|
190
|
+
end
|
191
|
+
NamedArray.setup(inputs, @inputs.collect{|i| i[0] }) if @inputs
|
192
|
+
Step.new path.find, inputs, dependencies, id, non_default_inputs, &self
|
193
|
+
end
|
155
194
|
end
|
156
195
|
end
|
data/lib/scout/workflow/usage.rb
CHANGED
@@ -16,13 +16,16 @@ module Task
|
|
16
16
|
str.puts
|
17
17
|
end
|
18
18
|
|
19
|
+
deps = workflow ? workflow.recursive_deps(self.name) : self.deps if deps.nil?
|
19
20
|
if deps and deps.any?
|
20
21
|
seen = inputs.collect{|name,_| name }
|
21
22
|
dep_inputs = {}
|
22
|
-
deps.each do |dep_workflow,task_name|
|
23
|
+
deps.each do |dep_workflow,task_name,options|
|
24
|
+
next if task_name.nil?
|
23
25
|
task = dep_workflow.tasks[task_name]
|
24
26
|
next if task.inputs.nil?
|
25
27
|
inputs = task.inputs.reject{|name, _| seen.include? name }
|
28
|
+
inputs = task.inputs.reject{|name, _| options.include? name }
|
26
29
|
next unless inputs.any?
|
27
30
|
dep = workflow.nil? || dep_workflow.name != workflow.name ? ["#{dep_workflow.name}", task_name.to_s] *"#" : task_name.to_s
|
28
31
|
dep_inputs[dep] = inputs
|
@@ -108,24 +111,25 @@ end
|
|
108
111
|
|
109
112
|
module Workflow
|
110
113
|
|
111
|
-
def dep_tree(task_name, seen = nil)
|
114
|
+
def dep_tree(task_name, seen = nil, seen_options = nil)
|
112
115
|
@dep_tree ||= {}
|
113
116
|
key = [self, task_name]
|
114
117
|
|
115
118
|
return @dep_tree[key] if @dep_tree.include?(key)
|
116
119
|
save = seen.nil?
|
117
120
|
seen = Set.new if seen.nil?
|
121
|
+
seen_options = {} if seen_options.nil?
|
118
122
|
|
119
123
|
dep_tree = {}
|
120
124
|
task = self.tasks[task_name]
|
121
|
-
task.deps.each do |
|
125
|
+
task.deps.each do |workflow, task, options|
|
122
126
|
next if seen.include? dep
|
123
|
-
seen <<
|
124
|
-
|
127
|
+
seen << [workflow, task, options.merge(seen_options)]
|
128
|
+
next if task.nil?
|
125
129
|
|
126
130
|
key = [workflow, task]
|
127
131
|
|
128
|
-
dep_tree[key] = workflow.dep_tree(task, seen)
|
132
|
+
dep_tree[key] = workflow.dep_tree(task, seen, options.merge(seen_options))
|
129
133
|
end if task.deps
|
130
134
|
|
131
135
|
@dep_tree[key] = dep_tree if save
|
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
|
5
|
+
# stub: scout-gear 8.0.0 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "scout-gear".freeze
|
9
|
-
s.version = "
|
9
|
+
s.version = "8.0.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-
|
14
|
+
s.date = "2023-05-23"
|
15
15
|
s.description = "Temporary files, logs, etc.".freeze
|
16
16
|
s.email = "mikisvaz@gmail.com".freeze
|
17
17
|
s.executables = ["scout".freeze]
|
@@ -45,17 +45,20 @@ Gem::Specification.new do |s|
|
|
45
45
|
"lib/scout/log/progress.rb",
|
46
46
|
"lib/scout/log/progress/report.rb",
|
47
47
|
"lib/scout/log/progress/util.rb",
|
48
|
+
"lib/scout/log/trap.rb",
|
48
49
|
"lib/scout/meta_extension.rb",
|
49
50
|
"lib/scout/misc.rb",
|
50
51
|
"lib/scout/misc/digest.rb",
|
51
52
|
"lib/scout/misc/filesystem.rb",
|
52
53
|
"lib/scout/misc/format.rb",
|
54
|
+
"lib/scout/misc/helper.rb",
|
53
55
|
"lib/scout/misc/insist.rb",
|
54
56
|
"lib/scout/misc/monitor.rb",
|
55
57
|
"lib/scout/misc/system.rb",
|
56
58
|
"lib/scout/named_array.rb",
|
57
59
|
"lib/scout/open.rb",
|
58
60
|
"lib/scout/open/lock.rb",
|
61
|
+
"lib/scout/open/lock/lockfile.rb",
|
59
62
|
"lib/scout/open/remote.rb",
|
60
63
|
"lib/scout/open/stream.rb",
|
61
64
|
"lib/scout/open/util.rb",
|
@@ -83,15 +86,26 @@ Gem::Specification.new do |s|
|
|
83
86
|
"lib/scout/simple_opt/setup.rb",
|
84
87
|
"lib/scout/tmpfile.rb",
|
85
88
|
"lib/scout/tsv.rb",
|
89
|
+
"lib/scout/tsv/attach.rb",
|
90
|
+
"lib/scout/tsv/change_id.rb",
|
86
91
|
"lib/scout/tsv/dumper.rb",
|
87
92
|
"lib/scout/tsv/index.rb",
|
93
|
+
"lib/scout/tsv/open.rb",
|
88
94
|
"lib/scout/tsv/parser.rb",
|
89
95
|
"lib/scout/tsv/path.rb",
|
90
96
|
"lib/scout/tsv/persist.rb",
|
91
97
|
"lib/scout/tsv/persist/adapter.rb",
|
98
|
+
"lib/scout/tsv/persist/fix_width_table.rb",
|
99
|
+
"lib/scout/tsv/persist/serialize.rb",
|
92
100
|
"lib/scout/tsv/persist/tokyocabinet.rb",
|
101
|
+
"lib/scout/tsv/transformer.rb",
|
93
102
|
"lib/scout/tsv/traverse.rb",
|
94
103
|
"lib/scout/tsv/util.rb",
|
104
|
+
"lib/scout/tsv/util/filter.rb",
|
105
|
+
"lib/scout/tsv/util/process.rb",
|
106
|
+
"lib/scout/tsv/util/reorder.rb",
|
107
|
+
"lib/scout/tsv/util/select.rb",
|
108
|
+
"lib/scout/tsv/util/unzip.rb",
|
95
109
|
"lib/scout/work_queue.rb",
|
96
110
|
"lib/scout/work_queue/socket.rb",
|
97
111
|
"lib/scout/work_queue/worker.rb",
|
@@ -104,7 +118,9 @@ Gem::Specification.new do |s|
|
|
104
118
|
"lib/scout/workflow/step/file.rb",
|
105
119
|
"lib/scout/workflow/step/info.rb",
|
106
120
|
"lib/scout/workflow/step/load.rb",
|
121
|
+
"lib/scout/workflow/step/progress.rb",
|
107
122
|
"lib/scout/workflow/step/provenance.rb",
|
123
|
+
"lib/scout/workflow/step/status.rb",
|
108
124
|
"lib/scout/workflow/task.rb",
|
109
125
|
"lib/scout/workflow/task/inputs.rb",
|
110
126
|
"lib/scout/workflow/usage.rb",
|
@@ -165,19 +181,30 @@ Gem::Specification.new do |s|
|
|
165
181
|
"test/scout/test_work_queue.rb",
|
166
182
|
"test/scout/test_workflow.rb",
|
167
183
|
"test/scout/tsv/persist/test_adapter.rb",
|
184
|
+
"test/scout/tsv/persist/test_fix_width_table.rb",
|
168
185
|
"test/scout/tsv/persist/test_tokyocabinet.rb",
|
186
|
+
"test/scout/tsv/test_attach.rb",
|
187
|
+
"test/scout/tsv/test_change_id.rb",
|
169
188
|
"test/scout/tsv/test_dumper.rb",
|
170
189
|
"test/scout/tsv/test_index.rb",
|
190
|
+
"test/scout/tsv/test_open.rb",
|
171
191
|
"test/scout/tsv/test_parser.rb",
|
172
192
|
"test/scout/tsv/test_persist.rb",
|
193
|
+
"test/scout/tsv/test_transformer.rb",
|
173
194
|
"test/scout/tsv/test_traverse.rb",
|
174
195
|
"test/scout/tsv/test_util.rb",
|
196
|
+
"test/scout/tsv/util/test_filter.rb",
|
197
|
+
"test/scout/tsv/util/test_process.rb",
|
198
|
+
"test/scout/tsv/util/test_reorder.rb",
|
199
|
+
"test/scout/tsv/util/test_select.rb",
|
200
|
+
"test/scout/tsv/util/test_unzip.rb",
|
175
201
|
"test/scout/work_queue/test_socket.rb",
|
176
202
|
"test/scout/work_queue/test_worker.rb",
|
177
203
|
"test/scout/workflow/step/test_dependencies.rb",
|
178
204
|
"test/scout/workflow/step/test_info.rb",
|
179
205
|
"test/scout/workflow/step/test_load.rb",
|
180
206
|
"test/scout/workflow/step/test_provenance.rb",
|
207
|
+
"test/scout/workflow/step/test_status.rb",
|
181
208
|
"test/scout/workflow/task/test_inputs.rb",
|
182
209
|
"test/scout/workflow/test_definition.rb",
|
183
210
|
"test/scout/workflow/test_documentation.rb",
|
@@ -4,6 +4,9 @@ require 'scout'
|
|
4
4
|
|
5
5
|
$0 = "scout #{$previous_commands.any? ? $previous_commands*" " + " " : "" }#{ File.basename(__FILE__) }" if $previous_commands
|
6
6
|
|
7
|
+
ENV["SCOUT_NO_STREAM"] = "true" if ARGV.include? "--nostream"
|
8
|
+
ENV["SCOUT_UPDATE"] = "true" if ARGV.include? "--update"
|
9
|
+
|
7
10
|
options = SOPT.setup <<EOF
|
8
11
|
|
9
12
|
Run a workflow job
|
@@ -11,11 +14,14 @@ Run a workflow job
|
|
11
14
|
$ #{$0} [<options>] <workflow> <task>
|
12
15
|
|
13
16
|
-h--help Print this help
|
17
|
+
--nostream Disable job streaming
|
18
|
+
--update Update jobs with newer dependencies
|
14
19
|
-jn--job_name* Name to use as job identifier
|
15
20
|
-pf--print_filepath Print the file path
|
16
21
|
-prov--provenance Print the step provenance
|
17
22
|
-cl--clean Clean the last step
|
18
23
|
-rcl--recursive_clean Clean all steps
|
24
|
+
-ct--clean_task* Clean a particular task
|
19
25
|
EOF
|
20
26
|
|
21
27
|
workflow_name, task_name = ARGV
|
@@ -24,11 +30,14 @@ raise MissingParameterException.new :workflow if workflow_name.nil?
|
|
24
30
|
|
25
31
|
workflow = Workflow.require_workflow workflow_name
|
26
32
|
task_name = task_name.to_sym if task_name
|
27
|
-
task = workflow.tasks[task_name.to_sym]
|
33
|
+
task = workflow.tasks[task_name.to_sym] if task_name
|
28
34
|
|
29
35
|
options[:help] = true if task.nil?
|
30
36
|
|
31
|
-
|
37
|
+
help, provenance, clean, recursive_clean, clean_task, jobname, print_filepath = IndiferentHash.process_options options,
|
38
|
+
:help, :provenance, :clean, :recursive_clean, :clean_task, :job_name, :print_filepath
|
39
|
+
|
40
|
+
if help
|
32
41
|
if defined? scout_usage
|
33
42
|
scout_usage
|
34
43
|
else
|
@@ -40,22 +49,41 @@ if options[:help]
|
|
40
49
|
end
|
41
50
|
|
42
51
|
job_options = task.get_SOPT(task)
|
43
|
-
job = workflow.job(task_name,
|
52
|
+
job = workflow.job(task_name, jobname, job_options)
|
53
|
+
|
54
|
+
job.recursive_clean if recursive_clean
|
55
|
+
job.clean if clean
|
56
|
+
|
57
|
+
if clean_task
|
58
|
+
ENV["SCOUT_UPDATE"] = 'true'
|
59
|
+
clean_task.split(",").each do |clean_task|
|
60
|
+
if clean_task.include? "#"
|
61
|
+
clean_workflow, clean_task = clean_task.split("#")
|
62
|
+
end
|
44
63
|
|
45
|
-
job.
|
46
|
-
|
64
|
+
job.rec_dependencies.each do |dep|
|
65
|
+
next unless dep.task_name.to_s == clean_task.to_s
|
66
|
+
next unless clean_workflow.nil? || clean_workflow == dep.workflow.to_s
|
67
|
+
dep.clean
|
68
|
+
dep.set_info :status, :cleaned
|
69
|
+
end
|
70
|
+
|
71
|
+
job.clean if job.task_name.to_s == clean_task.to_s
|
72
|
+
end
|
73
|
+
end
|
47
74
|
|
48
|
-
if
|
75
|
+
if provenance
|
49
76
|
puts Step.prov_report(job)
|
50
77
|
else
|
51
|
-
job.run unless job.done?
|
78
|
+
job.run(true) unless job.done?
|
52
79
|
|
53
|
-
if
|
80
|
+
if print_filepath
|
81
|
+
job.join
|
54
82
|
path = job.path
|
55
83
|
path = path.find if Path === path
|
56
84
|
puts path
|
57
85
|
else
|
58
|
-
if ! ((c = Open.consume_stream(job.
|
86
|
+
if ! ((c = Open.consume_stream(job.stream, false, STDOUT, false)) && c.end_with?("\n"))
|
59
87
|
puts
|
60
88
|
end
|
61
89
|
end
|
@@ -656,12 +656,12 @@ when (defined?(RemoteStep) and RemoteStep)
|
|
656
656
|
end
|
657
657
|
when Step
|
658
658
|
if res.streaming?
|
659
|
-
io = TSV.
|
659
|
+
io = TSV.stream res
|
660
660
|
Misc.consume_stream(io, false, out)
|
661
661
|
io.join if io.respond_to? :join
|
662
662
|
elsif IO === res.result
|
663
663
|
begin
|
664
|
-
io = res.
|
664
|
+
io = res.stream
|
665
665
|
Misc.consume_stream(io, false, out)
|
666
666
|
io.join if io.respond_to? :join
|
667
667
|
rescue Aborted, Interrupt
|
@@ -5,7 +5,7 @@ require 'scout/path'
|
|
5
5
|
require 'scout/open'
|
6
6
|
|
7
7
|
class TestOpenStream < Test::Unit::TestCase
|
8
|
-
def
|
8
|
+
def test_stream
|
9
9
|
content =<<-EOF
|
10
10
|
1
|
11
11
|
2
|
@@ -334,63 +334,65 @@ row1 A B C
|
|
334
334
|
assert_equal %w(## ## ## #Row row1 row2 row3), sorted.read.split("\n").collect{|l| l.split(" ").first}
|
335
335
|
end
|
336
336
|
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
337
|
+
def test_collapse_stream
|
338
|
+
text=<<-EOF
|
339
|
+
row1 A B C
|
340
|
+
row1 a b c
|
341
|
+
row2 AA BB CC
|
342
|
+
row2 aa bb cc
|
343
|
+
EOF
|
344
|
+
|
345
|
+
s = StringIO.new text
|
346
|
+
stream = Open.collapse_stream(s, sep: " ")
|
347
|
+
txt = stream.read
|
348
|
+
assert_include txt, "A|a"
|
349
|
+
assert_include txt, "B|b"
|
350
|
+
assert_include txt, "C|c"
|
351
|
+
end
|
352
|
+
|
353
|
+
|
354
|
+
def test_collapse_sum
|
355
|
+
text=<<-EOF
|
356
|
+
row1 12
|
357
|
+
row1 4
|
358
|
+
row2 10
|
359
|
+
row2 6
|
360
|
+
EOF
|
361
|
+
|
362
|
+
s = StringIO.new text
|
363
|
+
stream = Open.collapse_stream(s, sep: " ") do |parts|
|
364
|
+
next nil if parts.empty?
|
365
|
+
parts.first.split("|").collect{|p| p.to_f}.inject(0){|acc,e| acc += e}.to_s
|
366
|
+
end
|
367
|
+
assert_include stream.read, "row1 16"
|
368
|
+
end
|
369
|
+
|
370
|
+
|
371
|
+
def test_collapse_stream_gap
|
372
|
+
text=<<-EOF
|
373
|
+
row2 AA BB
|
374
|
+
row2 aa bb cc
|
375
|
+
EOF
|
376
|
+
|
377
|
+
s = StringIO.new text
|
378
|
+
assert Open.collapse_stream(s, sep: " ").read =~ /\|cc$/
|
379
|
+
|
380
|
+
text=<<-EOF
|
381
|
+
row2 aa bb cc
|
382
|
+
row2 AA BB
|
383
|
+
EOF
|
384
|
+
|
385
|
+
s = StringIO.new text
|
386
|
+
assert Open.collapse_stream(s, sep: " ").read =~ /cc\|$/
|
387
|
+
|
388
|
+
text=<<-EOF
|
389
|
+
row2 AA BB
|
390
|
+
row2 aa bb cc
|
391
|
+
EOF
|
392
|
+
|
393
|
+
s = StringIO.new text
|
394
|
+
assert Open.collapse_stream(s, sep: " ").read =~ /\|cc$/
|
395
|
+
end
|
394
396
|
#
|
395
397
|
#
|
396
398
|
# def test_paste_stream
|
@@ -433,7 +435,7 @@ row1 A B C
|
|
433
435
|
# s = StringIO.new text
|
434
436
|
# sorted = Misc.sort_stream(s)
|
435
437
|
# assert_equal %w(## ## ## #Row row2 row3 row1), text.split("\n").collect{|l| l.split(" ").first}
|
436
|
-
# assert_equal %w(## ## ## #Row row1 row2 row3), sorted.read.split("\n").collect{|l| l.split(" ").first}
|
438
|
+
# assert_equal %w(## ## ## #Row row1 row2 row3), sorted.read.split("\n").collect{|l| l.split(" ").first}
|
437
439
|
# end
|
438
440
|
#
|
439
441
|
# def test_sort_long_stream
|
@@ -68,7 +68,6 @@ class TestPathFind < Test::Unit::TestCase
|
|
68
68
|
p = Path.setup("/tmp/foo/bar")
|
69
69
|
assert p.located?
|
70
70
|
assert_equal_path p, p.find
|
71
|
-
|
72
71
|
end
|
73
72
|
|
74
73
|
def test_custom
|
@@ -106,5 +105,15 @@ class TestPathFind < Test::Unit::TestCase
|
|
106
105
|
assert Open.exist?(tmpdir.somefile)
|
107
106
|
end
|
108
107
|
end
|
108
|
+
|
109
|
+
def test_with_extension
|
110
|
+
dir = tmpdir.directory[__method__]
|
111
|
+
list = %w(a b)
|
112
|
+
Misc.in_dir(dir) do
|
113
|
+
file = dir.foo
|
114
|
+
Open.write(file.set_extension('list'), list * "\n")
|
115
|
+
assert_equal list, file.list
|
116
|
+
end
|
117
|
+
end
|
109
118
|
end
|
110
119
|
|
@@ -59,4 +59,19 @@ end
|
|
59
59
|
assert_include File.open(TestResource.tmp.test.work.footest.bar.find).read, "OTHER"
|
60
60
|
assert_include File.open(TestResource.tmp.test.work.footest.foo_bar.find).read, "OTHER"
|
61
61
|
end
|
62
|
+
|
63
|
+
def test_produce_with_extension
|
64
|
+
dir = tmpdir.directory[__method__]
|
65
|
+
dir.pkgdir = Scout
|
66
|
+
list = %w(a b)
|
67
|
+
|
68
|
+
Scout.claim dir["foo.list"], :proc do
|
69
|
+
list
|
70
|
+
end
|
71
|
+
|
72
|
+
Misc.in_dir(dir) do
|
73
|
+
file = dir.foo
|
74
|
+
assert_equal list, file.list
|
75
|
+
end
|
76
|
+
end
|
62
77
|
end
|