scout-gear 10.1.0 → 10.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.vimproject +49 -3
- data/VERSION +1 -1
- data/lib/scout/tsv/transformer.rb +17 -13
- data/lib/scout/tsv/util/melt.rb +13 -0
- data/lib/scout/tsv/util.rb +1 -0
- data/lib/scout/tsv.rb +7 -4
- data/lib/scout/workflow/definition.rb +10 -4
- data/lib/scout/workflow/step/dependencies.rb +1 -1
- data/lib/scout/workflow/step/file.rb +2 -1
- data/lib/scout/workflow/step/provenance.rb +2 -2
- data/lib/scout/workflow/step/status.rb +4 -4
- data/lib/scout/workflow/step.rb +11 -2
- data/lib/scout/workflow/task/inputs.rb +6 -2
- data/lib/scout/workflow/usage.rb +4 -2
- data/lib/scout/workflow/util.rb +5 -0
- data/scout-gear.gemspec +12 -4
- data/scout_commands/batch/clean +211 -0
- data/scout_commands/batch/list +357 -0
- data/scout_commands/log +45 -0
- data/scout_commands/rbbt +2 -1
- data/scout_commands/workflow/prov +133 -0
- data/scout_commands/workflow/task +6 -5
- data/scout_commands/workflow/trace +49 -0
- data/scout_commands/workflow/write_info +69 -0
- data/test/scout/offsite/test_ssh.rb +1 -1
- data/test/scout/test_tsv.rb +21 -0
- data/test/scout/tsv/util/test_melt.rb +28 -0
- metadata +11 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3e807e8eea8b8ff3b40be002fcd9cdfa9fbc8d3fdb447f20b1b3c56f1c318de8
|
4
|
+
data.tar.gz: 8838111c9867b63671060c82b7224f2ac310b64d375f0cc62c26b42092da6f1d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2dcc68c9d612b208d6b6b94dd366ef37f2467b364d1da8367b1f6833d305d6ef8c35a1dc0f0e27c6e00ce481344e230e20ac6eb85236dd27c75c59e8ad3f0ec5
|
7
|
+
data.tar.gz: 85d8e7458a1453966e2e123fc8ced3a0c2bc8be884a7570f1bb57f4d260db582e90380d2ea0f8a91c91b68decb8439e8b556d294b9d71258c522fa06628ec22b
|
data/.vimproject
CHANGED
@@ -8,6 +8,7 @@ scout-gear=/$PWD filter="*.rb *.yaml" {
|
|
8
8
|
alias
|
9
9
|
find
|
10
10
|
glob
|
11
|
+
log
|
11
12
|
doc
|
12
13
|
update
|
13
14
|
template
|
@@ -16,7 +17,14 @@ scout-gear=/$PWD filter="*.rb *.yaml" {
|
|
16
17
|
task
|
17
18
|
list
|
18
19
|
info
|
20
|
+
write_info
|
19
21
|
install
|
22
|
+
trace
|
23
|
+
prov
|
24
|
+
}
|
25
|
+
batch=batch{
|
26
|
+
list
|
27
|
+
clean
|
20
28
|
}
|
21
29
|
resource=resource{
|
22
30
|
produce
|
@@ -72,6 +80,7 @@ scout-gear=/$PWD filter="*.rb *.yaml" {
|
|
72
80
|
unzip.rb
|
73
81
|
reorder.rb
|
74
82
|
sort.rb
|
83
|
+
melt.rb
|
75
84
|
}
|
76
85
|
parser.rb
|
77
86
|
dumper.rb
|
@@ -122,6 +131,10 @@ scout-gear=/$PWD filter="*.rb *.yaml" {
|
|
122
131
|
test_tsv.rb
|
123
132
|
test_work_queue.rb
|
124
133
|
test_workflow.rb
|
134
|
+
work_queue=work_queue{
|
135
|
+
test_socket.rb
|
136
|
+
test_worker.rb
|
137
|
+
}
|
125
138
|
workflow=workflow{
|
126
139
|
test_definition.rb
|
127
140
|
test_documentation.rb
|
@@ -140,10 +153,42 @@ scout-gear=/$PWD filter="*.rb *.yaml" {
|
|
140
153
|
test_dependencies.rb
|
141
154
|
test_inputs.rb
|
142
155
|
}
|
156
|
+
deployment=deployment{
|
157
|
+
test_orchestrator.rb
|
158
|
+
}
|
143
159
|
}
|
144
|
-
|
145
|
-
|
146
|
-
|
160
|
+
tsv=tsv{
|
161
|
+
test_attach.rb
|
162
|
+
test_change_id.rb
|
163
|
+
test_dumper.rb
|
164
|
+
test_index.rb
|
165
|
+
test_open.rb
|
166
|
+
test_parser.rb
|
167
|
+
test_persist.rb
|
168
|
+
test_stream.rb
|
169
|
+
test_transformer.rb
|
170
|
+
test_traverse.rb
|
171
|
+
test_util.rb
|
172
|
+
util=util{
|
173
|
+
test_filter.rb
|
174
|
+
test_melt.rb
|
175
|
+
test_process.rb
|
176
|
+
test_reorder.rb
|
177
|
+
test_select.rb
|
178
|
+
test_sort.rb
|
179
|
+
test_unzip.rb
|
180
|
+
}
|
181
|
+
persist=persist{
|
182
|
+
test_adapter.rb
|
183
|
+
test_fix_width_table.rb
|
184
|
+
test_tokyocabinet.rb
|
185
|
+
}
|
186
|
+
}
|
187
|
+
offsite=offsite{
|
188
|
+
test_ssh.rb
|
189
|
+
test_step.rb
|
190
|
+
test_sync.rb
|
191
|
+
test_task.rb
|
147
192
|
}
|
148
193
|
}
|
149
194
|
}
|
@@ -524,6 +569,7 @@ scout-gear=/$PWD filter="*.rb *.yaml" {
|
|
524
569
|
test_filter.rb
|
525
570
|
test_index.rb
|
526
571
|
test_manipulate.rb
|
572
|
+
test_marshal.rb
|
527
573
|
test_matrix.rb
|
528
574
|
test_parallel.rb
|
529
575
|
test_parser.rb
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
10.
|
1
|
+
10.2.0
|
@@ -2,15 +2,16 @@ module TSV
|
|
2
2
|
class Transformer
|
3
3
|
attr_accessor :unnamed, :parser, :dumper
|
4
4
|
|
5
|
-
def initialize(parser, dumper = nil, unnamed:
|
5
|
+
def initialize(parser, dumper = nil, unnamed: nil)
|
6
6
|
if TSV::Parser === parser
|
7
7
|
@parser = parser
|
8
8
|
elsif TSV === parser
|
9
9
|
@parser = parser
|
10
|
+
@unnamed = parser.unnamed
|
10
11
|
else
|
11
12
|
@parser = TSV::Parser.new parser
|
12
13
|
end
|
13
|
-
@unnamed = unnamed
|
14
|
+
@unnamed = unnamed unless unnamed.nil?
|
14
15
|
if dumper.nil?
|
15
16
|
@dumper = TSV::Dumper.new(@parser)
|
16
17
|
@dumper.sep = "\t"
|
@@ -70,7 +71,7 @@ module TSV
|
|
70
71
|
@dumper.init if @dumper.respond_to?(:init) && ! @dumper.initialized
|
71
72
|
Log.debug "Transform #{Log.fingerprint @parser} into #{Log.fingerprint @dumper}"
|
72
73
|
Open.traverse(@parser, *args, **kwargs) do |k,v|
|
73
|
-
NamedArray.setup(v, @parser.fields, k) unless @unnamed
|
74
|
+
NamedArray.setup(v, @parser.fields, k) unless @unnamed || @parser.fields.nil?
|
74
75
|
block.call k, v
|
75
76
|
end
|
76
77
|
end
|
@@ -112,16 +113,18 @@ module TSV
|
|
112
113
|
|
113
114
|
def to_list
|
114
115
|
res = self.annotate({})
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
116
|
+
self.with_unnamed do
|
117
|
+
transformer = Transformer.new self, res
|
118
|
+
transformer.type = :list
|
119
|
+
transformer.traverse do |k,v|
|
120
|
+
case self.type
|
121
|
+
when :single
|
122
|
+
[k, [v]]
|
123
|
+
when :double
|
124
|
+
[k, v.collect{|v| v.first }]
|
125
|
+
when :flat
|
126
|
+
[k, v.slice(0,1)]
|
127
|
+
end
|
125
128
|
end
|
126
129
|
end
|
127
130
|
res
|
@@ -131,6 +134,7 @@ module TSV
|
|
131
134
|
res = self.annotate({})
|
132
135
|
transformer = Transformer.new self, res
|
133
136
|
transformer.type = :single
|
137
|
+
transformer.unnamed = true
|
134
138
|
transformer.traverse do |k,v|
|
135
139
|
v = v.first while Array === v
|
136
140
|
[k, v]
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module TSV
|
2
|
+
def melt_columns(value_field, column_field)
|
3
|
+
target = TSV.setup({}, :key_field => "ID", :fields => [key_field, value_field, column_field], :type => :list, :cast => cast)
|
4
|
+
each do |k,values|
|
5
|
+
i = 0
|
6
|
+
values.zip(fields).each do |v,f|
|
7
|
+
target["#{k}:#{i}"] = [k,v,f]
|
8
|
+
i+=1
|
9
|
+
end
|
10
|
+
end
|
11
|
+
target
|
12
|
+
end
|
13
|
+
end
|
data/lib/scout/tsv/util.rb
CHANGED
@@ -7,6 +7,7 @@ require_relative 'util/select'
|
|
7
7
|
require_relative 'util/reorder'
|
8
8
|
require_relative 'util/unzip'
|
9
9
|
require_relative 'util/sort'
|
10
|
+
require_relative 'util/melt'
|
10
11
|
module TSV
|
11
12
|
def self.identify_field(key_field, fields, name, strict: nil)
|
12
13
|
return :key if name == :key || (! strict && NamedArray.field_match(key_field, name))
|
data/lib/scout/tsv.rb
CHANGED
@@ -34,11 +34,14 @@ module TSV
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def self.open(file, options = {})
|
37
|
-
|
38
|
-
|
37
|
+
grep, invert_grep = IndiferentHash.process_options options, :grep, :invert_grep, :persist => false
|
38
|
+
|
39
|
+
persist_options = IndiferentHash.pull_keys options, :persist
|
40
|
+
persist_options = IndiferentHash.add_defaults persist_options, :prefix => "TSV", :type => "HDB"
|
41
|
+
|
39
42
|
file = StringIO.new file if String === file && ! (Path === file) && file.index("\n")
|
40
|
-
Persist.persist(file, type,
|
41
|
-
data = filename ? ScoutCabinet.open(filename, true, type) : nil
|
43
|
+
Persist.persist(file, persist_options[:type], persist_options.merge(:other_options => options)) do |filename|
|
44
|
+
data = filename ? ScoutCabinet.open(filename, true, persist_options[:type]) : nil
|
42
45
|
options[:data] = data if data
|
43
46
|
options[:filename] = file
|
44
47
|
|
@@ -84,8 +84,10 @@ module Workflow
|
|
84
84
|
annotate_next_task :deps, [workflow, task, options, block, args]
|
85
85
|
end
|
86
86
|
|
87
|
-
def input(*
|
88
|
-
|
87
|
+
def input(name, type = nil, *rest)
|
88
|
+
name = name.to_sym
|
89
|
+
type = type.to_sym if type
|
90
|
+
annotate_next_task(:inputs, [name, type] + rest)
|
89
91
|
end
|
90
92
|
|
91
93
|
def desc(description)
|
@@ -102,6 +104,8 @@ module Workflow
|
|
102
104
|
|
103
105
|
def task(name_and_type, &block)
|
104
106
|
name, type = name_and_type.collect.first
|
107
|
+
type = type.to_sym if String === type
|
108
|
+
name = name.to_sym if String === name
|
105
109
|
@tasks ||= IndiferentHash.setup({})
|
106
110
|
block = self.method(name) if block.nil?
|
107
111
|
begin
|
@@ -132,8 +136,10 @@ module Workflow
|
|
132
136
|
def task_alias(name, workflow, oname, *rest, &block)
|
133
137
|
dep(workflow, oname, *rest, &block)
|
134
138
|
extension :dep_task unless @extension
|
135
|
-
|
136
|
-
|
139
|
+
task_proc = workflow.tasks[oname]
|
140
|
+
raise "Task #{name} not found" if task_proc.nil?
|
141
|
+
returns task_proc.returns if @returns.nil?
|
142
|
+
type = task_proc.type
|
137
143
|
task name => type do
|
138
144
|
raise RbbtException, "dep_task does not have any dependencies" if dependencies.empty?
|
139
145
|
Step.wait_for_jobs dependencies.select{|d| d.streaming? }
|
@@ -5,7 +5,7 @@ class Step
|
|
5
5
|
next if seen.include? dep.path
|
6
6
|
next if connected && dep.done? && dep.updated?
|
7
7
|
direct_deps << dep
|
8
|
-
end
|
8
|
+
end if dependencies
|
9
9
|
seen.concat direct_deps.collect{|d| d.path }
|
10
10
|
direct_deps.inject(direct_deps){|acc,d| acc.concat(d.rec_dependencies(connected, seen)); acc }
|
11
11
|
end
|
@@ -68,7 +68,7 @@ class Step
|
|
68
68
|
$inputs.each do |input|
|
69
69
|
value = job_inputs[input]
|
70
70
|
next if value.nil?
|
71
|
-
value_str =
|
71
|
+
value_str = Log.fingerprint(value)
|
72
72
|
str << "\t#{Log.color :magenta, input}=#{value_str}"
|
73
73
|
end
|
74
74
|
end
|
@@ -78,7 +78,7 @@ class Step
|
|
78
78
|
IndiferentHash.setup(info)
|
79
79
|
value = info[field]
|
80
80
|
next if value.nil?
|
81
|
-
value_str =
|
81
|
+
value_str = Log.fingerprint(value)
|
82
82
|
str << "\t#{Log.color :magenta, field}=#{value_str}"
|
83
83
|
end
|
84
84
|
end
|
@@ -27,10 +27,10 @@ class Step
|
|
27
27
|
@result = nil
|
28
28
|
@info = nil
|
29
29
|
@info_load_time = nil
|
30
|
-
Open.rm path if Open.
|
31
|
-
Open.rm tmp_path if Open.
|
32
|
-
Open.rm info_file if Open.
|
33
|
-
Open.rm_rf files_dir if Open.
|
30
|
+
Open.rm path if Open.exist_or_link?(path)
|
31
|
+
Open.rm tmp_path if Open.exist_or_link?(tmp_path)
|
32
|
+
Open.rm info_file if Open.exist_or_link?(info_file)
|
33
|
+
Open.rm_rf files_dir if Open.exist_or_link?(files_dir)
|
34
34
|
self
|
35
35
|
end
|
36
36
|
|
data/lib/scout/workflow/step.rb
CHANGED
@@ -76,10 +76,14 @@ class Step
|
|
76
76
|
|
77
77
|
def task_name
|
78
78
|
@task_name ||= @task.name if @task.respond_to?(:name)
|
79
|
+
@task_name ||= info[:task_name] if Open.exist?(info_file)
|
80
|
+
@task_name ||= path.split("/")[-2]
|
79
81
|
end
|
80
82
|
|
81
83
|
def workflow
|
82
|
-
@task.workflow if @task
|
84
|
+
@workflow ||= @task.workflow if Task === @task
|
85
|
+
@workflow ||= info[:workflow] if Open.exist?(info_file)
|
86
|
+
@workflow ||= path.split("/")[-3]
|
83
87
|
end
|
84
88
|
|
85
89
|
def exec
|
@@ -130,6 +134,7 @@ class Step
|
|
130
134
|
input_names = (task.respond_to?(:inputs) && task.inputs) ? task.inputs.collect{|name,_| name} : []
|
131
135
|
merge_info :status => :start, :start => Time.now,
|
132
136
|
:pid => Process.pid, :pid_hostname => Misc.hostname,
|
137
|
+
:task_name => task_name, :workflow => workflow.to_s,
|
133
138
|
:inputs => MetaExtension.purge(inputs), :input_names => input_names, :type => type,
|
134
139
|
:dependencies => dependencies.collect{|d| d.path }
|
135
140
|
|
@@ -232,11 +237,14 @@ class Step
|
|
232
237
|
while @result && streaming? && stream = self.stream
|
233
238
|
threads << Open.consume_stream(stream, true)
|
234
239
|
end
|
240
|
+
|
241
|
+
threads.compact!
|
242
|
+
|
235
243
|
threads.each do |t|
|
236
244
|
begin
|
237
245
|
t.join
|
238
246
|
rescue Exception
|
239
|
-
threads.each{|t| t.raise(Aborted); t.join }
|
247
|
+
threads.compact.each{|t| t.raise(Aborted); t.join }
|
240
248
|
raise $!
|
241
249
|
end
|
242
250
|
end
|
@@ -252,6 +260,7 @@ class Step
|
|
252
260
|
while ! present?
|
253
261
|
sleep 0.1
|
254
262
|
end
|
263
|
+
self
|
255
264
|
end
|
256
265
|
|
257
266
|
def terminated?
|
@@ -85,8 +85,12 @@ module Task
|
|
85
85
|
input_file = File.join(directory, name.to_s)
|
86
86
|
|
87
87
|
if Path.is_filename?(value)
|
88
|
-
|
89
|
-
|
88
|
+
if type == :path
|
89
|
+
Open.write(input_file + ".as_path", value)
|
90
|
+
else
|
91
|
+
relative_file = save_file_input(value, directory)
|
92
|
+
Open.write(input_file + ".as_file", relative_file)
|
93
|
+
end
|
90
94
|
elsif Step === value
|
91
95
|
Open.write(input_file + ".as_step", value.short_path)
|
92
96
|
elsif type == :file
|
data/lib/scout/workflow/usage.rb
CHANGED
@@ -52,8 +52,9 @@ module Task
|
|
52
52
|
inputs = task.inputs.reject{|name, _| seen.include? name }
|
53
53
|
inputs = task.inputs.reject{|name, _| options.include? name }
|
54
54
|
next unless inputs.any?
|
55
|
-
|
56
|
-
|
55
|
+
input_names = inputs.collect{|name,_| name }
|
56
|
+
task.inputs.select{|name,_| input_names.include? name }.each do |name,_,_,_,options|
|
57
|
+
selects << [name, options[:select_options]] if options && options[:select_options]
|
57
58
|
end
|
58
59
|
|
59
60
|
dep = workflow.nil? || dep_workflow.name != workflow.name ? ["#{dep_workflow.name}", task_name.to_s] *"#" : task_name.to_s
|
@@ -291,6 +292,7 @@ module Workflow
|
|
291
292
|
prov_tree = prov_tree(dep_tree)
|
292
293
|
if prov_tree && ! prov_tree.empty? && prov_tree.split("\n").length > 2
|
293
294
|
|
295
|
+
str.puts
|
294
296
|
str.puts Log.color :magenta, "## DEPENDENCY GRAPH (abridged)"
|
295
297
|
str.puts
|
296
298
|
prov_tree.split("\n").each do |line|
|
data/lib/scout/workflow/util.rb
CHANGED
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.
|
5
|
+
# stub: scout-gear 10.2.0 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "scout-gear".freeze
|
9
|
-
s.version = "10.
|
9
|
+
s.version = "10.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-07-
|
14
|
+
s.date = "2023-07-27"
|
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]
|
@@ -57,6 +57,7 @@ Gem::Specification.new do |s|
|
|
57
57
|
"lib/scout/tsv/traverse.rb",
|
58
58
|
"lib/scout/tsv/util.rb",
|
59
59
|
"lib/scout/tsv/util/filter.rb",
|
60
|
+
"lib/scout/tsv/util/melt.rb",
|
60
61
|
"lib/scout/tsv/util/process.rb",
|
61
62
|
"lib/scout/tsv/util/reorder.rb",
|
62
63
|
"lib/scout/tsv/util/select.rb",
|
@@ -89,9 +90,12 @@ Gem::Specification.new do |s|
|
|
89
90
|
"lib/workflow-scout.rb",
|
90
91
|
"scout-gear.gemspec",
|
91
92
|
"scout_commands/alias",
|
93
|
+
"scout_commands/batch/clean",
|
94
|
+
"scout_commands/batch/list",
|
92
95
|
"scout_commands/doc",
|
93
96
|
"scout_commands/find",
|
94
97
|
"scout_commands/glob",
|
98
|
+
"scout_commands/log",
|
95
99
|
"scout_commands/offsite",
|
96
100
|
"scout_commands/rbbt",
|
97
101
|
"scout_commands/resource/produce",
|
@@ -100,7 +104,10 @@ Gem::Specification.new do |s|
|
|
100
104
|
"scout_commands/workflow/info",
|
101
105
|
"scout_commands/workflow/install",
|
102
106
|
"scout_commands/workflow/list",
|
107
|
+
"scout_commands/workflow/prov",
|
103
108
|
"scout_commands/workflow/task",
|
109
|
+
"scout_commands/workflow/trace",
|
110
|
+
"scout_commands/workflow/write_info",
|
104
111
|
"share/color/color_names",
|
105
112
|
"share/color/diverging_colors.hex",
|
106
113
|
"share/software/install_helpers",
|
@@ -130,6 +137,7 @@ Gem::Specification.new do |s|
|
|
130
137
|
"test/scout/tsv/test_traverse.rb",
|
131
138
|
"test/scout/tsv/test_util.rb",
|
132
139
|
"test/scout/tsv/util/test_filter.rb",
|
140
|
+
"test/scout/tsv/util/test_melt.rb",
|
133
141
|
"test/scout/tsv/util/test_process.rb",
|
134
142
|
"test/scout/tsv/util/test_reorder.rb",
|
135
143
|
"test/scout/tsv/util/test_select.rb",
|
@@ -157,7 +165,7 @@ Gem::Specification.new do |s|
|
|
157
165
|
]
|
158
166
|
s.homepage = "http://github.com/mikisvaz/scout-gear".freeze
|
159
167
|
s.licenses = ["MIT".freeze]
|
160
|
-
s.rubygems_version = "3.
|
168
|
+
s.rubygems_version = "3.5.0.dev".freeze
|
161
169
|
s.summary = "basic gear for scouts".freeze
|
162
170
|
|
163
171
|
s.specification_version = 4
|