scout-gear 10.7.13 → 10.8.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/VERSION +1 -1
- data/lib/scout/association/index.rb +1 -1
- data/lib/scout/association.rb +13 -2
- data/lib/scout/knowledge_base/entity.rb +14 -0
- data/lib/scout/persist/engine/tokyocabinet.rb +32 -32
- data/lib/scout/persist/tsv/adapter/base.rb +1 -0
- data/lib/scout/tsv/change_id/translate.rb +1 -0
- data/lib/scout/tsv/index.rb +1 -1
- data/lib/scout/tsv/traverse.rb +2 -0
- data/lib/scout/tsv/util/reorder.rb +5 -5
- data/lib/scout/tsv.rb +0 -1
- data/lib/scout/workflow/deployment/orchestrator.rb +12 -3
- data/lib/scout/workflow/step.rb +10 -0
- data/lib/scout/workflow.rb +5 -4
- data/lib/scout-gear.rb +1 -1
- data/scout-gear.gemspec +4 -4
- data/scout_commands/find +1 -2
- data/scout_commands/workflow/process +4 -3
- data/test/scout/tsv/test_traverse.rb +42 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7a3b309720cd9c3116460e682e1da0810a8601a406de1a86bb2e63c2dc1b2e7e
|
4
|
+
data.tar.gz: 03ee884261ff3393b2d9e52c1361260bd2c55d3038c244251dc75b357891eb93
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 66b6d4780304a2f50f6a7aa384c86df78909851d1c9176d71ebaa67c7bb43b334b10b092fb4d636d1dbeada466db19d17af12d28f181de27ec0fd54450a1367c
|
7
|
+
data.tar.gz: 4efa2ebbc04db80cae4592887ab7f825cdc4783ffd381c1073c5d1e762f034b9c0c0a6e581948bfca96195653d88500c07525e922d7229c81306893a13e41809
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
10.
|
1
|
+
10.8.0
|
data/lib/scout/association.rb
CHANGED
@@ -106,8 +106,19 @@ module Association
|
|
106
106
|
|
107
107
|
transformer.traverse key_field: original_source_header, fields: all_fields.values_at(*field_pos) do |k,v|
|
108
108
|
v = v.dup if TSV === obj
|
109
|
-
|
110
|
-
|
109
|
+
if source_index
|
110
|
+
k = source_index[k]
|
111
|
+
next if k.nil? or k.empty?
|
112
|
+
end
|
113
|
+
if target_index
|
114
|
+
if Array === v[0]
|
115
|
+
v[0] = target_index.values_at(*v[0])
|
116
|
+
v = v.reject{|l| l[0].nil? || l[0].empty?}
|
117
|
+
else
|
118
|
+
v[0] = target_index[v[0]]
|
119
|
+
next if v[0].nil? or v[0].empty?
|
120
|
+
end
|
121
|
+
end
|
111
122
|
[k, v]
|
112
123
|
end
|
113
124
|
|
@@ -78,6 +78,13 @@ class KnowledgeBase
|
|
78
78
|
else
|
79
79
|
identifier_files = database_identifier_files(name)
|
80
80
|
end
|
81
|
+
if registered_identifiers = registered_options(name)[:identifiers]
|
82
|
+
if Array === registered_identifiers
|
83
|
+
identifier_files.concat registered_identifiers
|
84
|
+
else
|
85
|
+
identifier_files.push registered_identifiers
|
86
|
+
end
|
87
|
+
end
|
81
88
|
identifier_files.concat Entity.identifier_files(source(name)) if defined? Entity
|
82
89
|
identifier_files.uniq!
|
83
90
|
identifier_files.collect!{|f| (Path === f) ? f : Path.setup(f.dup) }
|
@@ -95,6 +102,13 @@ class KnowledgeBase
|
|
95
102
|
else
|
96
103
|
identifier_files = database_identifier_files(name)
|
97
104
|
end
|
105
|
+
if registered_identifiers = registered_options(name)[:identifiers]
|
106
|
+
if Array === registered_identifiers
|
107
|
+
identifier_files.concat registered_identifiers
|
108
|
+
else
|
109
|
+
identifier_files.push registered_identifiers
|
110
|
+
end
|
111
|
+
end
|
98
112
|
identifier_files.concat Entity.identifier_files(target(name)) if defined? Entity
|
99
113
|
identifier_files.uniq!
|
100
114
|
identifier_files.collect!{|f| f.annotate(f.gsub(/\bNAMESPACE\b/, namespace))} if self.namespace
|
@@ -108,43 +108,43 @@ if continue
|
|
108
108
|
end
|
109
109
|
end
|
110
110
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
111
|
+
def write_and_close
|
112
|
+
begin
|
113
|
+
write
|
114
|
+
yield
|
115
|
+
ensure
|
116
|
+
close
|
117
|
+
end
|
117
118
|
end
|
118
|
-
end
|
119
119
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
120
|
+
def self.importtsv(database, stream)
|
121
|
+
begin
|
122
|
+
bin = case database
|
123
|
+
when TokyoCabinet::HDB
|
124
|
+
'tchmgr'
|
125
|
+
when TokyoCabinet::BDB
|
126
|
+
'tcbmgr'
|
127
|
+
else
|
128
|
+
raise "Database not HDB or BDB: #{Log.fingerprint database}"
|
129
|
+
end
|
130
|
+
|
131
|
+
database.close
|
132
|
+
CMD.cmd("#{bin} version", :log => false)
|
133
|
+
FileUtils.mkdir_p File.dirname(database.persistence_path)
|
134
|
+
CMD.cmd("#{bin} importtsv '#{database.persistence_path}'", :in => stream, :log => false, :dont_close_in => true)
|
135
|
+
rescue
|
136
|
+
Log.debug("tchmgr importtsv failed for: #{database.persistence_path}")
|
137
|
+
end
|
137
138
|
end
|
138
|
-
end
|
139
139
|
|
140
|
-
|
141
|
-
|
142
|
-
|
140
|
+
class << self
|
141
|
+
alias load_stream importtsv
|
142
|
+
end
|
143
143
|
|
144
|
-
|
145
|
-
|
146
|
-
|
144
|
+
def importtsv(stream)
|
145
|
+
ScoutCabinet.load_stream(self, stream)
|
146
|
+
end
|
147
147
|
|
148
|
-
|
148
|
+
alias load_stream importtsv
|
149
149
|
end
|
150
150
|
end
|
data/lib/scout/tsv/index.rb
CHANGED
data/lib/scout/tsv/traverse.rb
CHANGED
@@ -43,10 +43,12 @@ module TSV
|
|
43
43
|
Log.debug log_message
|
44
44
|
bar = log_message if TrueClass === bar
|
45
45
|
|
46
|
+
invert = select.delete :invert if Hash === select
|
46
47
|
type_swap_tag = [type.to_s, @type.to_s] * "_"
|
47
48
|
Log::ProgressBar.with_obj_bar(self, bar) do |bar|
|
48
49
|
with_unnamed unnamed do
|
49
50
|
each do |key,values|
|
51
|
+
next unless TSV.select key, values, select, invert: invert if select
|
50
52
|
bar.tick if bar
|
51
53
|
values = [values] if @type == :single
|
52
54
|
if positions.nil?
|
@@ -1,11 +1,11 @@
|
|
1
1
|
require 'matrix'
|
2
2
|
|
3
3
|
module TSV
|
4
|
-
def reorder(key_field = nil, fields = nil, merge: true, one2one: true, **kwargs)
|
5
|
-
res = self.annotate({})
|
4
|
+
def reorder(key_field = nil, fields = nil, merge: true, one2one: true, data: nil, unnamed: true, **kwargs)
|
5
|
+
res = data || self.annotate({})
|
6
6
|
res.type = kwargs[:type] if kwargs.include?(:type)
|
7
7
|
kwargs[:one2one] = one2one
|
8
|
-
key_field_name, field_names = with_unnamed do
|
8
|
+
key_field_name, field_names = with_unnamed unnamed do
|
9
9
|
traverse key_field, fields, **kwargs do |k,v|
|
10
10
|
if res.type == :double && merge && res.include?(k)
|
11
11
|
current = res[k]
|
@@ -23,11 +23,11 @@ module TSV
|
|
23
23
|
res[k] = merged
|
24
24
|
end
|
25
25
|
elsif res.type == :flat
|
26
|
-
res[k] ||= []
|
27
26
|
if merge == :concat
|
27
|
+
res[k] ||= []
|
28
28
|
res[k].concat v
|
29
29
|
else
|
30
|
-
res[k]
|
30
|
+
res[k] = res[k].nil? ? v : res[k] + v
|
31
31
|
end
|
32
32
|
else
|
33
33
|
res[k] = v
|
data/lib/scout/tsv.rb
CHANGED
@@ -18,7 +18,6 @@ module TSV
|
|
18
18
|
extend Annotation
|
19
19
|
annotation :key_field, :fields, :type, :cast, :filename, :namespace, :unnamed, :identifiers, :serializer, :entity_options
|
20
20
|
|
21
|
-
|
22
21
|
def self.str2options(str)
|
23
22
|
field_options,_sep, rest = str.partition("#")
|
24
23
|
key, fields_str = field_options.split("~")
|
@@ -251,7 +251,13 @@ module Workflow
|
|
251
251
|
workload = new_workload
|
252
252
|
sleep timer
|
253
253
|
end
|
254
|
-
all_jobs.each{|s|
|
254
|
+
all_jobs.each{|s|
|
255
|
+
begin
|
256
|
+
s.join
|
257
|
+
rescue
|
258
|
+
Log.warn "Job #{s.short_path} ended with exception #{$!.class.to_s}: #{$!.message}"
|
259
|
+
end
|
260
|
+
}
|
255
261
|
rescue TryAgain
|
256
262
|
retry
|
257
263
|
end
|
@@ -275,9 +281,12 @@ module Workflow
|
|
275
281
|
produce_list
|
276
282
|
end
|
277
283
|
|
278
|
-
def self.produce(jobs, produce_cpus: Etc.nprocessors, produce_timer:
|
284
|
+
def self.produce(jobs, produce_cpus: Etc.nprocessors, produce_timer: 1)
|
279
285
|
jobs = [jobs] unless Array === jobs
|
280
286
|
orchestrator = Orchestrator.new produce_timer.to_i, cpus: produce_cpus.to_i
|
281
|
-
|
287
|
+
begin
|
288
|
+
orchestrator.process({}, jobs)
|
289
|
+
rescue Orchestrator::NoWork
|
290
|
+
end
|
282
291
|
end
|
283
292
|
end
|
data/lib/scout/workflow/step.rb
CHANGED
@@ -34,6 +34,15 @@ class Step
|
|
34
34
|
@mutex.synchronize(&block)
|
35
35
|
end
|
36
36
|
|
37
|
+
def provided_inputs
|
38
|
+
@provided_inputs ||= begin
|
39
|
+
if info_file && Open.exists?(info_file)
|
40
|
+
info[:provided_inputs]
|
41
|
+
else
|
42
|
+
{}
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
37
46
|
def inputs
|
38
47
|
@inputs ||= begin
|
39
48
|
if info_file && Open.exists?(info_file)
|
@@ -174,6 +183,7 @@ class Step
|
|
174
183
|
reset_info :status => :setup, :issued => Time.now,
|
175
184
|
:pid => Process.pid, :pid_hostname => Misc.hostname,
|
176
185
|
:task_name => task_name, :workflow => workflow.to_s,
|
186
|
+
:provided_inputs => Annotation.purge(provided_inputs),
|
177
187
|
:inputs => Annotation.purge(inputs), :input_names => input_names, :type => type,
|
178
188
|
:dependencies => (dependencies || []) .collect{|d| d.path }
|
179
189
|
|
data/lib/scout/workflow.rb
CHANGED
@@ -133,10 +133,11 @@ module Workflow
|
|
133
133
|
begin
|
134
134
|
workflow_name, *subworkflows = complete_workflow_name.split("::")
|
135
135
|
workflow_file = workflow_name
|
136
|
-
workflow_file = Path.setup('workflows')[workflow_name]["workflow.rb"] unless Open.exists?(workflow_file)
|
137
|
-
workflow_file = Path.setup('workflows')[Misc.snake_case(workflow_name)]["workflow.rb"] unless Open.exists?(workflow_file)
|
138
|
-
workflow_file = Path.setup('workflows')[Misc.camel_case(workflow_name)]["workflow.rb"] unless Open.exists?(workflow_file)
|
139
|
-
|
136
|
+
workflow_file = Path.setup('workflows')[workflow_name]["workflow.rb"] unless Open.exists?(workflow_file) && ! Open.directory?(workflow_file)
|
137
|
+
workflow_file = Path.setup('workflows')[Misc.snake_case(workflow_name)]["workflow.rb"] unless Open.exists?(workflow_file) && ! Open.directory?(workflow_file)
|
138
|
+
workflow_file = Path.setup('workflows')[Misc.camel_case(workflow_name)]["workflow.rb"] unless Open.exists?(workflow_file) && ! Open.directory?(workflow_file)
|
139
|
+
|
140
|
+
if Open.exists?(workflow_file) && ! Open.directory?(workflow_file)
|
140
141
|
self.main = nil
|
141
142
|
require_workflow_file(workflow_file)
|
142
143
|
elsif autoinstall
|
data/lib/scout-gear.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'scout-essentials'
|
2
2
|
require_relative 'scout/tsv'
|
3
3
|
|
4
|
-
Path.path_maps[:
|
4
|
+
Path.path_maps[:scout_gear_lib] = File.join(Path.caller_lib_dir(__FILE__), "{TOPLEVEL}/{SUBPATH}")
|
5
5
|
|
6
6
|
Persist.cache_dir = Scout.var.cache.persistence
|
7
7
|
TmpFile.tmpdir = Scout.tmp.find :user
|
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.8.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.8.0".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 = "
|
14
|
+
s.date = "2025-06-05"
|
15
15
|
s.description = "Scout gear: workflow, TSVs, persistence, entities, associations, and knowledge_bases.".freeze
|
16
16
|
s.email = "mikisvaz@gmail.com".freeze
|
17
17
|
s.executables = ["scout".freeze]
|
@@ -250,7 +250,7 @@ Gem::Specification.new do |s|
|
|
250
250
|
]
|
251
251
|
s.homepage = "http://github.com/mikisvaz/scout-gear".freeze
|
252
252
|
s.licenses = ["MIT".freeze]
|
253
|
-
s.rubygems_version = "3.6.
|
253
|
+
s.rubygems_version = "3.6.6".freeze
|
254
254
|
s.summary = "basic gear for scouts".freeze
|
255
255
|
|
256
256
|
s.specification_version = 4
|
data/scout_commands/find
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'scout-gear'
|
4
|
-
require 'scout/offsite'
|
5
4
|
|
6
5
|
$0 = "scout #{$previous_commands.any? ? $previous_commands*" " + " " : "" }#{ File.basename(__FILE__) }" if $previous_commands
|
7
6
|
|
@@ -80,5 +79,5 @@ if where.nil? || where == 'all' || path.path_maps.include?(where.to_sym)
|
|
80
79
|
puts location
|
81
80
|
end
|
82
81
|
else
|
83
|
-
|
82
|
+
raise ParameterException, "Where '#{where}' not identified. Try scout-camp if looking for a remote file"
|
84
83
|
end
|
@@ -40,6 +40,8 @@ queue_dir = Scout.var.queue
|
|
40
40
|
|
41
41
|
class TrayAgain < Exception; end
|
42
42
|
|
43
|
+
options.keys_to_sym!
|
44
|
+
|
43
45
|
begin
|
44
46
|
if ARGV.empty?
|
45
47
|
files = queue_dir.glob_all("*/*/*")
|
@@ -67,10 +69,9 @@ begin
|
|
67
69
|
end
|
68
70
|
|
69
71
|
jobs = files.collect{|file| Workflow.queue_job(file) }
|
72
|
+
|
73
|
+
|
70
74
|
begin
|
71
|
-
options.keys.each do |key|
|
72
|
-
options[key.to_sym] = options.delete(key)
|
73
|
-
end
|
74
75
|
Workflow.produce(jobs, **options)
|
75
76
|
rescue Workflow::Orchestrator::NoWork
|
76
77
|
end
|
@@ -374,5 +374,47 @@ row3 a
|
|
374
374
|
assert Annotation::AnnotatedObject === data["row1"]
|
375
375
|
end
|
376
376
|
end
|
377
|
+
|
378
|
+
def test_tsv_traverse_select
|
379
|
+
content =<<-'EOF'
|
380
|
+
#: :sep=/\s+/#:type=:double
|
381
|
+
#Id ValueA ValueB OtherID
|
382
|
+
row1 a|aa|aaa b Id1|Id2
|
383
|
+
row2 A B Id3
|
384
|
+
row2 AA BB Id33
|
385
|
+
EOF
|
386
|
+
|
387
|
+
tsv = TmpFile.with_file(content) do |filename|
|
388
|
+
TSV.open(filename, :persist => true)
|
389
|
+
end
|
390
|
+
|
391
|
+
all_values = []
|
392
|
+
tsv.traverse "ValueA", :all, select: {ValueA: "A"} do |k,v|
|
393
|
+
all_values.concat(v)
|
394
|
+
end
|
395
|
+
refute all_values.flatten.include? "row1"
|
396
|
+
refute all_values.flatten.include? "a"
|
397
|
+
refute all_values.flatten.include? "aaa"
|
398
|
+
|
399
|
+
assert_include all_values.flatten, "row2"
|
400
|
+
|
401
|
+
tsv.traverse "ValueA", :all, select: {ValueA: "a", invert: true} do |k,v|
|
402
|
+
all_values.concat(v)
|
403
|
+
end
|
404
|
+
refute all_values.flatten.include? "row1"
|
405
|
+
refute all_values.flatten.include? "a"
|
406
|
+
refute all_values.flatten.include? "aaa"
|
407
|
+
|
408
|
+
assert_include all_values.flatten, "row2"
|
409
|
+
|
410
|
+
all_values = []
|
411
|
+
tsv.traverse "Id", :all do |k,v|
|
412
|
+
all_values.concat(v)
|
413
|
+
end
|
414
|
+
assert_include all_values.flatten, "row1"
|
415
|
+
assert_include all_values.flatten, "a"
|
416
|
+
assert_include all_values.flatten, "aaa"
|
417
|
+
end
|
418
|
+
|
377
419
|
end
|
378
420
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scout-gear
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 10.
|
4
|
+
version: 10.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Miguel Vazquez
|
8
8
|
bindir: bin
|
9
9
|
cert_chain: []
|
10
|
-
date:
|
10
|
+
date: 2025-06-05 00:00:00.000000000 Z
|
11
11
|
dependencies:
|
12
12
|
- !ruby/object:Gem::Dependency
|
13
13
|
name: scout-essentials
|
@@ -334,7 +334,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
334
334
|
- !ruby/object:Gem::Version
|
335
335
|
version: '0'
|
336
336
|
requirements: []
|
337
|
-
rubygems_version: 3.6.
|
337
|
+
rubygems_version: 3.6.6
|
338
338
|
specification_version: 4
|
339
339
|
summary: basic gear for scouts
|
340
340
|
test_files: []
|