scout-gear 10.1.0 → 10.2.0
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 +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
|