scout-gear 10.11.4 → 10.11.7
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 +17 -2
- data/VERSION +1 -1
- data/bin/scout +10 -10
- data/lib/scout/association/fields.rb +15 -15
- data/lib/scout/association/index.rb +6 -6
- data/lib/scout/association/item.rb +18 -8
- data/lib/scout/association.rb +4 -4
- data/lib/scout/entity/identifiers.rb +5 -5
- data/lib/scout/entity/property.rb +2 -2
- data/lib/scout/entity.rb +1 -1
- data/lib/scout/knowledge_base/description.rb +10 -10
- data/lib/scout/knowledge_base/entity.rb +6 -6
- data/lib/scout/knowledge_base/list.rb +1 -1
- data/lib/scout/knowledge_base/query.rb +4 -4
- data/lib/scout/knowledge_base/registry.rb +6 -6
- data/lib/scout/knowledge_base/traverse.rb +7 -40
- data/lib/scout/persist/engine/fix_width_table.rb +6 -6
- data/lib/scout/persist/engine/packed_index.rb +2 -2
- data/lib/scout/persist/engine/sharder.rb +4 -4
- data/lib/scout/persist/engine/tkrzw.rb +1 -1
- data/lib/scout/persist/engine/tokyocabinet.rb +2 -2
- data/lib/scout/persist/tsv/adapter/fix_width_table.rb +1 -1
- data/lib/scout/persist/tsv/adapter/packed_index.rb +1 -1
- data/lib/scout/persist/tsv/adapter/tkrzw.rb +1 -1
- data/lib/scout/persist/tsv/adapter/tokyocabinet.rb +3 -3
- data/lib/scout/persist/tsv/serialize.rb +3 -3
- data/lib/scout/persist/tsv.rb +1 -1
- data/lib/scout/semaphore.rb +100 -17
- data/lib/scout/tsv/annotation/repo.rb +4 -4
- data/lib/scout/tsv/annotation.rb +2 -2
- data/lib/scout/tsv/attach.rb +7 -7
- data/lib/scout/tsv/change_id/translate.rb +1 -1
- data/lib/scout/tsv/csv.rb +3 -3
- data/lib/scout/tsv/dumper.rb +8 -8
- data/lib/scout/tsv/index.rb +1 -1
- data/lib/scout/tsv/open.rb +3 -3
- data/lib/scout/tsv/stream.rb +2 -2
- data/lib/scout/tsv/traverse.rb +4 -4
- data/lib/scout/tsv/util/filter.rb +9 -9
- data/lib/scout/tsv/util/process.rb +2 -2
- data/lib/scout/tsv/util/reorder.rb +2 -2
- data/lib/scout/tsv/util/select.rb +3 -3
- data/lib/scout/tsv/util/unzip.rb +2 -2
- data/lib/scout/tsv/util.rb +1 -1
- data/lib/scout/tsv.rb +2 -2
- data/lib/scout/work_queue/socket.rb +3 -2
- data/lib/scout/work_queue/worker.rb +4 -4
- data/lib/scout/work_queue.rb +7 -7
- data/lib/scout/workflow/definition.rb +18 -16
- data/lib/scout/workflow/deployment/local.rb +81 -62
- data/lib/scout/workflow/deployment/orchestrator/batches.rb +66 -5
- data/lib/scout/workflow/deployment/orchestrator/chains.rb +47 -30
- data/lib/scout/workflow/deployment/orchestrator/rules.rb +3 -3
- data/lib/scout/workflow/deployment/orchestrator/workload.rb +11 -22
- data/lib/scout/workflow/deployment/scheduler/job.rb +34 -36
- data/lib/scout/workflow/deployment/scheduler/lfs.rb +1 -1
- data/lib/scout/workflow/deployment/scheduler/pbs.rb +4 -4
- data/lib/scout/workflow/deployment/scheduler/slurm.rb +2 -2
- data/lib/scout/workflow/deployment/scheduler.rb +23 -12
- data/lib/scout/workflow/deployment/trace.rb +2 -2
- data/lib/scout/workflow/documentation.rb +4 -4
- data/lib/scout/workflow/export.rb +1 -1
- data/lib/scout/workflow/path.rb +2 -2
- data/lib/scout/workflow/step/children.rb +1 -1
- data/lib/scout/workflow/step/dependencies.rb +36 -3
- data/lib/scout/workflow/step/info.rb +5 -19
- data/lib/scout/workflow/step/inputs.rb +1 -1
- data/lib/scout/workflow/step/progress.rb +2 -2
- data/lib/scout/workflow/step/provenance.rb +4 -4
- data/lib/scout/workflow/step/status.rb +23 -9
- data/lib/scout/workflow/step.rb +21 -19
- data/lib/scout/workflow/task/dependencies.rb +10 -3
- data/lib/scout/workflow/task/info.rb +3 -3
- data/lib/scout/workflow/task/inputs.rb +8 -8
- data/lib/scout/workflow/task.rb +37 -22
- data/lib/scout/workflow/usage.rb +13 -13
- data/lib/scout/workflow/util.rb +1 -1
- data/lib/scout/workflow.rb +6 -6
- data/scout-gear.gemspec +4 -3
- data/scout_commands/alias +1 -1
- data/scout_commands/batch/clean +12 -12
- data/scout_commands/batch/list +26 -25
- data/scout_commands/batch/tail +9 -5
- data/scout_commands/cat +1 -1
- data/scout_commands/doc +2 -2
- data/scout_commands/entity +4 -4
- data/scout_commands/find +1 -1
- data/scout_commands/kb/config +1 -1
- data/scout_commands/kb/entities +1 -1
- data/scout_commands/kb/list +1 -1
- data/scout_commands/kb/query +2 -2
- data/scout_commands/kb/register +1 -1
- data/scout_commands/kb/show +1 -1
- data/scout_commands/kb/traverse +1 -1
- data/scout_commands/log +6 -6
- data/scout_commands/resource/produce +2 -2
- data/scout_commands/resource/sync +1 -1
- data/scout_commands/system/clean +7 -7
- data/scout_commands/system/status +4 -4
- data/scout_commands/template +1 -1
- data/scout_commands/update +1 -1
- data/scout_commands/workflow/cmd +2 -1
- data/scout_commands/workflow/example +123 -0
- data/scout_commands/workflow/info +10 -1
- data/scout_commands/workflow/install +1 -1
- data/scout_commands/workflow/list +2 -2
- data/scout_commands/workflow/process +2 -2
- data/scout_commands/workflow/prov +3 -3
- data/scout_commands/workflow/task +36 -11
- data/scout_commands/workflow/trace +1 -1
- data/scout_commands/workflow/write_info +2 -2
- data/share/templates/command +1 -1
- data/test/scout/association/test_item.rb +5 -0
- data/test/scout/entity/test_property.rb +3 -3
- data/test/scout/knowledge_base/test_description.rb +1 -1
- data/test/scout/knowledge_base/test_traverse.rb +2 -2
- data/test/scout/persist/engine/test_packed_index.rb +6 -6
- data/test/scout/persist/test_tsv.rb +4 -4
- data/test/scout/persist/tsv/adapter/test_packed_index.rb +4 -4
- data/test/scout/persist/tsv/adapter/test_sharder.rb +23 -23
- data/test/scout/persist/tsv/adapter/test_tokyocabinet.rb +1 -1
- data/test/scout/persist/tsv/test_serialize.rb +1 -1
- data/test/scout/test_association.rb +1 -1
- data/test/scout/test_tsv.rb +2 -2
- data/test/scout/test_workflow.rb +2 -2
- data/test/scout/tsv/test_annotation.rb +4 -4
- data/test/scout/tsv/test_index.rb +1 -1
- data/test/scout/tsv/test_open.rb +2 -2
- data/test/scout/tsv/test_parser.rb +2 -2
- data/test/scout/tsv/test_stream.rb +1 -1
- data/test/scout/tsv/test_transformer.rb +1 -1
- data/test/scout/tsv/util/test_filter.rb +1 -1
- data/test/scout/tsv/util/test_melt.rb +1 -1
- data/test/scout/tsv/util/test_reorder.rb +1 -1
- data/test/scout/work_queue/test_socket.rb +3 -3
- data/test/scout/work_queue/test_worker.rb +2 -2
- data/test/scout/workflow/deployment/orchestrator/test_batches.rb +13 -3
- data/test/scout/workflow/deployment/orchestrator/test_chains.rb +15 -13
- data/test/scout/workflow/deployment/orchestrator/test_workload.rb +1 -1
- data/test/scout/workflow/deployment/test_local.rb +2 -2
- data/test/scout/workflow/deployment/test_scheduler.rb +1 -2
- data/test/scout/workflow/step/test_children.rb +1 -1
- data/test/scout/workflow/step/test_dependencies.rb +36 -1
- data/test/scout/workflow/step/test_info.rb +3 -35
- data/test/scout/workflow/step/test_load.rb +1 -1
- data/test/scout/workflow/step/test_provenance.rb +1 -1
- data/test/scout/workflow/step/test_status.rb +33 -1
- data/test/scout/workflow/task/test_dependencies.rb +9 -7
- data/test/scout/workflow/task/test_inputs.rb +1 -1
- data/test/scout/workflow/test_definition.rb +1 -1
- data/test/scout/workflow/test_documentation.rb +1 -1
- data/test/scout/workflow/test_entity.rb +2 -2
- data/test/scout/workflow/test_step.rb +13 -13
- data/test/scout/workflow/test_usage.rb +1 -1
- data/test/test_helper.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 46332850d0c2cee351bade4c0b7a1d6a46fedebc7de433cc1f0c94d8c3813063
|
|
4
|
+
data.tar.gz: 1a129853fc38015166f689e3ceb23723c44233fb902977155c5c9c617cf39cba
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d1994a0a9d77b55b35853946a0887875a3208a6ad5c5d53cc73bc9dffb8ed0d8d77692d03c2685383dbc8cc8613df2e9f977ed5b592cc02448a4a0d1172579af
|
|
7
|
+
data.tar.gz: 93acf2601660be878b80eb22ee1a91259ee19bc15902d41f3e790695cb192495ae3331a209bec7a4cc9a8bfa8d3de68c17d4307ecdcc3d917854eb9752a7818c
|
data/.vimproject
CHANGED
|
@@ -2,6 +2,11 @@ scout-gear=/$PWD filter="*.rb *.yaml" {
|
|
|
2
2
|
Rakefile
|
|
3
3
|
README.md
|
|
4
4
|
chats=chats filter="*"{
|
|
5
|
+
job_chains
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
intro
|
|
9
|
+
dev
|
|
5
10
|
|
|
6
11
|
semaphore
|
|
7
12
|
|
|
@@ -76,8 +81,6 @@ scout-gear=/$PWD filter="*.rb *.yaml" {
|
|
|
76
81
|
queue.rb
|
|
77
82
|
|
|
78
83
|
trace.rb
|
|
79
|
-
|
|
80
|
-
orchestrator.rb
|
|
81
84
|
}
|
|
82
85
|
entity.rb
|
|
83
86
|
}
|
|
@@ -193,6 +196,7 @@ scout-gear=/$PWD filter="*.rb *.yaml" {
|
|
|
193
196
|
}
|
|
194
197
|
workflow=workflow{
|
|
195
198
|
task
|
|
199
|
+
example
|
|
196
200
|
list
|
|
197
201
|
info
|
|
198
202
|
write_info
|
|
@@ -207,6 +211,7 @@ scout-gear=/$PWD filter="*.rb *.yaml" {
|
|
|
207
211
|
tail
|
|
208
212
|
list
|
|
209
213
|
clean
|
|
214
|
+
cmd
|
|
210
215
|
}
|
|
211
216
|
resource=resource{
|
|
212
217
|
produce
|
|
@@ -304,4 +309,14 @@ scout-gear=/$PWD filter="*.rb *.yaml" {
|
|
|
304
309
|
workflow.rb
|
|
305
310
|
}
|
|
306
311
|
}
|
|
312
|
+
doc=doc filter="*"{
|
|
313
|
+
Association.md
|
|
314
|
+
Entity.md
|
|
315
|
+
KnowledgeBase.md
|
|
316
|
+
Persist.md
|
|
317
|
+
Semaphore.md
|
|
318
|
+
TSV.md
|
|
319
|
+
WorkQueue.md
|
|
320
|
+
Workflow.md
|
|
321
|
+
}
|
|
307
322
|
}
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
10.11.
|
|
1
|
+
10.11.7
|
data/bin/scout
CHANGED
|
@@ -21,7 +21,7 @@ if _i = ARGV.index("--dev")
|
|
|
21
21
|
ARGV.delete dev_dir
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
if dev_dir.nil?
|
|
24
|
+
if dev_dir.nil?
|
|
25
25
|
_s = nil
|
|
26
26
|
ARGV.each_with_index do |s,i|
|
|
27
27
|
if s.match(/^--dev(?:=(.*))?/)
|
|
@@ -95,7 +95,7 @@ elsif Log.severity.nil?
|
|
|
95
95
|
|
|
96
96
|
global_severity = Log.get_level(Scout.etc.log_severity.read.strip) if Scout.etc.log_severity.exists?
|
|
97
97
|
if ENV["SCOUT_LOG"]
|
|
98
|
-
Log.severity = ENV["SCOUT_LOG"].to_i
|
|
98
|
+
Log.severity = ENV["SCOUT_LOG"].to_i
|
|
99
99
|
else
|
|
100
100
|
global_severity = Log.get_level(Scout.etc.log_severity.read.strip) if Scout.etc.log_severity.exists?
|
|
101
101
|
Log.severity = global_severity.to_i if global_severity
|
|
@@ -119,10 +119,10 @@ $scout_command_dir = Scout.scout_commands
|
|
|
119
119
|
#$scout_command_dir.path_maps[:scout_commands] = File.join(File.dirname(__dir__), "{PATH/bin\\/scout/scout_commands}")
|
|
120
120
|
|
|
121
121
|
SOPT.description =<<EOF
|
|
122
|
-
This command controls many aspects of the Scout framework, from configuration tasks to running applications.
|
|
122
|
+
This command controls many aspects of the Scout framework, from configuration tasks to running applications.
|
|
123
123
|
|
|
124
|
-
Commands are implemented in separate files under the Scout path '#{$scout_command_dir}'.
|
|
125
|
-
Known locations are: #{([$scout_command_dir] + $scout_command_dir.find_all) * ", " }.
|
|
124
|
+
Commands are implemented in separate files under the Scout path '#{$scout_command_dir}'.
|
|
125
|
+
Known locations are: #{([$scout_command_dir] + $scout_command_dir.find_all) * ", " }.
|
|
126
126
|
You can place your own commads at #{$scout_command_dir.find(:user)}.
|
|
127
127
|
EOF
|
|
128
128
|
|
|
@@ -158,11 +158,11 @@ def scout_usage(prev = nil)
|
|
|
158
158
|
puts Log.color :magenta, "## COMMANDS"
|
|
159
159
|
puts
|
|
160
160
|
puts Log.color :magenta, "Command:"
|
|
161
|
-
puts
|
|
161
|
+
puts
|
|
162
162
|
puts " #{File.basename($0)} #{prev * " "}"
|
|
163
|
-
puts
|
|
163
|
+
puts
|
|
164
164
|
puts Log.color :magenta, "Subcommands:"
|
|
165
|
-
puts
|
|
165
|
+
puts
|
|
166
166
|
prev_dir = prev_dir(prev)
|
|
167
167
|
commands(prev).each do |command|
|
|
168
168
|
directory = File.directory? prev_dir[command].find
|
|
@@ -177,7 +177,7 @@ def scout_usage(prev = nil)
|
|
|
177
177
|
true
|
|
178
178
|
end
|
|
179
179
|
|
|
180
|
-
alias usage scout_usage
|
|
180
|
+
alias usage scout_usage
|
|
181
181
|
|
|
182
182
|
def print_error(error, backtrace = nil)
|
|
183
183
|
puts Log.color :magenta, "## ERROR"
|
|
@@ -209,7 +209,7 @@ def cmd_alias
|
|
|
209
209
|
ARGV.replace tokenize_cmd_params(aliases[ARGV[0]]) + ARGV[1..-1]
|
|
210
210
|
end
|
|
211
211
|
end
|
|
212
|
-
|
|
212
|
+
|
|
213
213
|
dir = $scout_command_dir
|
|
214
214
|
$previous_commands = []
|
|
215
215
|
|
|
@@ -24,14 +24,14 @@ module Association
|
|
|
24
24
|
|
|
25
25
|
def self.normalize_specs(spec, all_fields = nil)
|
|
26
26
|
return nil if spec.nil?
|
|
27
|
-
field, header, format = parse_field_specification spec
|
|
27
|
+
field, header, format = parse_field_specification spec
|
|
28
28
|
|
|
29
29
|
specs = if all_fields.nil? or all_fields.include? field
|
|
30
30
|
[field, header, format]
|
|
31
31
|
else
|
|
32
32
|
if all_fields.nil?
|
|
33
33
|
begin
|
|
34
|
-
identify_entity_format field, all_fields
|
|
34
|
+
identify_entity_format field, all_fields
|
|
35
35
|
rescue
|
|
36
36
|
[field, header, format]
|
|
37
37
|
end
|
|
@@ -69,30 +69,30 @@ module Association
|
|
|
69
69
|
end
|
|
70
70
|
|
|
71
71
|
if source_specs[0].nil? and target_specs[0].nil?
|
|
72
|
-
source_specs[0] = key_field
|
|
72
|
+
source_specs[0] = key_field
|
|
73
73
|
target_specs[0] = fields[0]
|
|
74
|
-
elsif source_specs[0].nil?
|
|
74
|
+
elsif source_specs[0].nil?
|
|
75
75
|
if target_specs[0] == :key or target_specs[0] == key_field
|
|
76
76
|
source_specs[0] = fields[0]
|
|
77
77
|
else
|
|
78
78
|
source_specs[0] = key_field
|
|
79
79
|
end
|
|
80
|
-
elsif target_specs[0].nil?
|
|
81
|
-
if source_specs[0] == fields.first
|
|
80
|
+
elsif target_specs[0].nil?
|
|
81
|
+
if source_specs[0] == fields.first
|
|
82
82
|
target_specs[0] = key_field
|
|
83
83
|
else
|
|
84
|
-
target_specs[0] = fields.first
|
|
84
|
+
target_specs[0] = fields.first
|
|
85
85
|
end
|
|
86
86
|
end
|
|
87
87
|
|
|
88
88
|
# If format is specified, then perhaps we need to change the
|
|
89
|
-
if target_specs[2].nil?
|
|
89
|
+
if target_specs[2].nil?
|
|
90
90
|
target_type = Entity.formats[target_specs[1] || target_specs[0]]
|
|
91
91
|
target_specs[2] = format[target_type.to_s] if format
|
|
92
92
|
target_specs[2] = nil if target_specs[2] == target_specs[0] or target_specs[2] == target_specs[1]
|
|
93
93
|
end
|
|
94
94
|
|
|
95
|
-
if source_specs[2].nil?
|
|
95
|
+
if source_specs[2].nil?
|
|
96
96
|
source_type = Entity.formats[source_specs[1] || source_specs[0]]
|
|
97
97
|
source_specs[2] = format[source_type.to_s] if format
|
|
98
98
|
source_specs[2] = nil if source_specs[2] == source_specs[0] or source_specs[2] == source_specs[1]
|
|
@@ -105,7 +105,7 @@ module Association
|
|
|
105
105
|
return nil if default_format.nil? or default_format.empty?
|
|
106
106
|
default_format.each do |type, format|
|
|
107
107
|
entity_type = Entity.formats[field] || format
|
|
108
|
-
return format if entity_type.to_s === type
|
|
108
|
+
return format if entity_type.to_s === type
|
|
109
109
|
end
|
|
110
110
|
return nil
|
|
111
111
|
end
|
|
@@ -118,7 +118,7 @@ module Association
|
|
|
118
118
|
|
|
119
119
|
#source_pos = all_fields.index source_field
|
|
120
120
|
#target_pos = all_fields.index target_field
|
|
121
|
-
|
|
121
|
+
|
|
122
122
|
source_pos = TSV.identify_field all_fields.first, all_fields[1..-1], source_field
|
|
123
123
|
target_pos = TSV.identify_field all_fields.first, all_fields[1..-1], target_field
|
|
124
124
|
|
|
@@ -133,13 +133,13 @@ module Association
|
|
|
133
133
|
info_fields.delete_at NamedArray.identify_name(info_fields, target_field) if NamedArray.identify_name(info_fields, target_field)
|
|
134
134
|
info_fields.unshift target_field
|
|
135
135
|
|
|
136
|
-
field_headers = [target_header]
|
|
136
|
+
field_headers = [target_header]
|
|
137
137
|
info_fields[1..-1].each do |field|
|
|
138
138
|
header = case field
|
|
139
|
-
when String
|
|
139
|
+
when String
|
|
140
140
|
field
|
|
141
141
|
when Numeric
|
|
142
|
-
all_fields[field]
|
|
142
|
+
all_fields[field]
|
|
143
143
|
when :key
|
|
144
144
|
all_fields.first
|
|
145
145
|
end
|
|
@@ -147,7 +147,7 @@ module Association
|
|
|
147
147
|
field_headers << header
|
|
148
148
|
end
|
|
149
149
|
|
|
150
|
-
field_pos = info_fields.collect do |f|
|
|
150
|
+
field_pos = info_fields.collect do |f|
|
|
151
151
|
p = TSV.identify_field all_fields.first, all_fields[1..-1], f
|
|
152
152
|
p == :key ? 0 : p + 1
|
|
153
153
|
end
|
|
@@ -7,8 +7,8 @@ module Association
|
|
|
7
7
|
target = kwargs.delete :target if kwargs.include?(:target)
|
|
8
8
|
|
|
9
9
|
persist_options = IndiferentHash.pull_keys kwargs, :persist
|
|
10
|
-
index_persist_options = IndiferentHash.add_defaults persist_options.dup, persist: true,
|
|
11
|
-
prefix: "Association::Index",
|
|
10
|
+
index_persist_options = IndiferentHash.add_defaults persist_options.dup, persist: true,
|
|
11
|
+
prefix: "Association::Index",
|
|
12
12
|
other_options: kwargs.merge(source: source, target: target, source_format: source_format, target_format: target_format, format: format)
|
|
13
13
|
|
|
14
14
|
index = Persist.tsv(file, kwargs, engine: "BDB", persist_options: index_persist_options) do |data|
|
|
@@ -103,7 +103,7 @@ module Association
|
|
|
103
103
|
end
|
|
104
104
|
end
|
|
105
105
|
|
|
106
|
-
matches = source.uniq.inject([]){|acc,e|
|
|
106
|
+
matches = source.uniq.inject([]){|acc,e|
|
|
107
107
|
if block_given?
|
|
108
108
|
acc.concat(match(e))
|
|
109
109
|
else
|
|
@@ -115,7 +115,7 @@ module Association
|
|
|
115
115
|
|
|
116
116
|
target_matches = {}
|
|
117
117
|
|
|
118
|
-
matches.each{|code|
|
|
118
|
+
matches.each{|code|
|
|
119
119
|
s,sep,t = code.partition "~"
|
|
120
120
|
next if undirected and t > s and source.include? t
|
|
121
121
|
target_matches[t] ||= []
|
|
@@ -217,7 +217,7 @@ module Association
|
|
|
217
217
|
|
|
218
218
|
tsv = if value_pos
|
|
219
219
|
AssociationItem.incidence self.keys, key_field do |key|
|
|
220
|
-
if block_given?
|
|
220
|
+
if block_given?
|
|
221
221
|
yield self[key][value_pos]
|
|
222
222
|
else
|
|
223
223
|
self[key][value_pos]
|
|
@@ -226,7 +226,7 @@ module Association
|
|
|
226
226
|
elsif block_given?
|
|
227
227
|
AssociationItem.incidence self.keys, key_field, &block
|
|
228
228
|
else
|
|
229
|
-
AssociationItem.incidence self.keys, key_field
|
|
229
|
+
AssociationItem.incidence self.keys, key_field
|
|
230
230
|
end
|
|
231
231
|
end
|
|
232
232
|
end
|
|
@@ -9,11 +9,11 @@ module AssociationItem
|
|
|
9
9
|
|
|
10
10
|
property :name => :single do
|
|
11
11
|
[source_entity, target_entity].collect{|e| e.respond_to?(:name)? e.name || e : e } * "~"
|
|
12
|
-
end
|
|
12
|
+
end
|
|
13
13
|
|
|
14
14
|
property :full_name => :single do
|
|
15
15
|
database ? [database, name] * ":" : name
|
|
16
|
-
end
|
|
16
|
+
end
|
|
17
17
|
|
|
18
18
|
property :invert => :both do
|
|
19
19
|
if Array === self
|
|
@@ -73,7 +73,7 @@ module AssociationItem
|
|
|
73
73
|
end
|
|
74
74
|
|
|
75
75
|
property :undirected => :both do
|
|
76
|
-
knowledge_base.undirected(database)
|
|
76
|
+
knowledge_base.undirected(database) if knowledge_base
|
|
77
77
|
end
|
|
78
78
|
|
|
79
79
|
property :target_entity => :array2single do
|
|
@@ -124,7 +124,7 @@ module AssociationItem
|
|
|
124
124
|
if info_fields.empty?
|
|
125
125
|
tsv[p] = [source, target]
|
|
126
126
|
else
|
|
127
|
-
tsv[p] = [source, target].concat v
|
|
127
|
+
tsv[p] = [source, target].concat v
|
|
128
128
|
end
|
|
129
129
|
end
|
|
130
130
|
end
|
|
@@ -142,6 +142,15 @@ module AssociationItem
|
|
|
142
142
|
keys
|
|
143
143
|
end
|
|
144
144
|
|
|
145
|
+
property :incidence => :array do |*args,**kwargs,&block|
|
|
146
|
+
AssociationItem.incidence(self,*args,**kwargs,&block)
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
property :adjacency => :array do |*args,**kwargs,&block|
|
|
150
|
+
AssociationItem.adjacency(self,*args,**kwargs,&block)
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
|
|
145
154
|
def self.incidence(pairs, key_field = nil, &block)
|
|
146
155
|
matrix = {}
|
|
147
156
|
targets = []
|
|
@@ -159,7 +168,7 @@ module AssociationItem
|
|
|
159
168
|
matches[s][t] = value unless value.nil? or (mv = matches[s][t] and value > mv)
|
|
160
169
|
else
|
|
161
170
|
matches[s] ||= Hash.new{false}
|
|
162
|
-
matches[s][t] ||= true
|
|
171
|
+
matches[s][t] ||= true
|
|
163
172
|
end
|
|
164
173
|
end
|
|
165
174
|
|
|
@@ -173,15 +182,16 @@ module AssociationItem
|
|
|
173
182
|
defined?(TSV)? TSV.setup(matrix, :key_field => (key_field || "Source") , :fields => targets, :type => :list) : matrix
|
|
174
183
|
end
|
|
175
184
|
|
|
185
|
+
|
|
176
186
|
def self.adjacency(pairs, key_field = nil, &block)
|
|
177
|
-
incidence = incidence(pairs, key_field, &block)
|
|
187
|
+
incidence = pairs.respond_to?(:incidence) ? pairs.incidence(key_field, &block) : incidence(pairs, key_field, &block)
|
|
178
188
|
|
|
179
189
|
targets = incidence.fields
|
|
180
190
|
adjacency = TSV.setup({}, :key_field => incidence.key_field, :fields => ["Target"], :type => :double)
|
|
181
191
|
TSV.traverse incidence, :into => adjacency, :unnamed => true do |k,values|
|
|
182
192
|
target_values = targets.zip(values).reject{|t,v| v.nil? }.collect{|t,v| [t,v]}
|
|
183
193
|
next if target_values.empty?
|
|
184
|
-
[k,
|
|
194
|
+
[k, NamedArray.zip_fields(target_values)]
|
|
185
195
|
end
|
|
186
196
|
end
|
|
187
197
|
|
|
@@ -210,7 +220,7 @@ module AssociationItem
|
|
|
210
220
|
else
|
|
211
221
|
orig = item.info[key]
|
|
212
222
|
orig = orig.split(";;") if String orig
|
|
213
|
-
_select_match orig, value
|
|
223
|
+
_select_match orig, value
|
|
214
224
|
end
|
|
215
225
|
end
|
|
216
226
|
end
|
data/lib/scout/association.rb
CHANGED
|
@@ -130,15 +130,15 @@ module Association
|
|
|
130
130
|
def self.database(file, *args, **kwargs)
|
|
131
131
|
persist_options = IndiferentHash.pull_keys kwargs, :persist
|
|
132
132
|
|
|
133
|
-
database_persist_options = IndiferentHash.add_defaults persist_options.dup, persist: true,
|
|
133
|
+
database_persist_options = IndiferentHash.add_defaults persist_options.dup, persist: true,
|
|
134
134
|
prefix: "Association::Index", serializer: :double, update: true,
|
|
135
|
-
other_options: kwargs
|
|
135
|
+
other_options: kwargs
|
|
136
136
|
|
|
137
137
|
Persist.tsv(file, kwargs, engine: "BDB", persist_options: database_persist_options) do |data|
|
|
138
138
|
tsv = open(file, *args, **kwargs)
|
|
139
139
|
data.serializer = TSVAdapter.serializer_module(tsv.type) if data.respond_to?(:serializer)
|
|
140
|
-
if TSV::Transformer === tsv
|
|
141
|
-
tsv.tsv(merge: true, data: data)
|
|
140
|
+
if TSV::Transformer === tsv
|
|
141
|
+
tsv.tsv(merge: true, data: data)
|
|
142
142
|
elsif data.respond_to?(:persistence_path)
|
|
143
143
|
data.merge!(tsv)
|
|
144
144
|
tsv.annotate(data)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
module Entity
|
|
2
2
|
def self.identifier_files(field)
|
|
3
3
|
entity_type = Entity.formats[Entity.formats.find(field)]
|
|
4
|
-
return [] unless entity_type and entity_type.include? Entity::Identified
|
|
4
|
+
return [] unless entity_type and entity_type.include? Entity::Identified
|
|
5
5
|
entity_type.identifier_files
|
|
6
6
|
end
|
|
7
7
|
|
|
@@ -20,9 +20,9 @@ module Entity
|
|
|
20
20
|
|
|
21
21
|
target_format = case target_format
|
|
22
22
|
when :name
|
|
23
|
-
identity_type.name_format
|
|
23
|
+
identity_type.name_format
|
|
24
24
|
when :default
|
|
25
|
-
identity_type.default_format
|
|
25
|
+
identity_type.default_format
|
|
26
26
|
else
|
|
27
27
|
target_format
|
|
28
28
|
end
|
|
@@ -45,14 +45,14 @@ module Entity
|
|
|
45
45
|
end
|
|
46
46
|
end
|
|
47
47
|
|
|
48
|
-
def identifier_files
|
|
48
|
+
def identifier_files
|
|
49
49
|
files = identity_type.identifier_files.dup
|
|
50
50
|
return [] if files.nil?
|
|
51
51
|
files.collect!{|f| f.annotate f.gsub(/\b#{NAMESPACE_TAG}\b/, namespace.to_s) } if annotation_hash.include? :namespace and self.namespace
|
|
52
52
|
if files.select{|f| f =~ /\b#{NAMESPACE_TAG}\b/ }.any?
|
|
53
53
|
Log.warn "Rejecting some identifier files for lack of 'namespace': " + files.select{|f| f =~ /\b#{NAMESPACE_TAG}\b/ } * ", "
|
|
54
54
|
end
|
|
55
|
-
files.reject!{|f| f =~ /\b#{NAMESPACE_TAG}\b/ }
|
|
55
|
+
files.reject!{|f| f =~ /\b#{NAMESPACE_TAG}\b/ }
|
|
56
56
|
files
|
|
57
57
|
end
|
|
58
58
|
|
|
@@ -29,7 +29,7 @@ module Entity
|
|
|
29
29
|
def self.single_method(name)
|
|
30
30
|
("_single_" + name.to_s).to_sym
|
|
31
31
|
end
|
|
32
|
-
|
|
32
|
+
|
|
33
33
|
def self.array_method(name)
|
|
34
34
|
("_ary_" + name.to_s).to_sym
|
|
35
35
|
end
|
|
@@ -76,7 +76,7 @@ module Entity
|
|
|
76
76
|
self.each do |item|
|
|
77
77
|
begin
|
|
78
78
|
responses[item] = Entity::Property.persist(name, item, type, options.merge(other: {args: args, kwargs: kwargs})) do
|
|
79
|
-
raise MultipleEntityProperty
|
|
79
|
+
raise MultipleEntityProperty
|
|
80
80
|
end
|
|
81
81
|
rescue MultipleEntityProperty
|
|
82
82
|
missing << item
|
data/lib/scout/entity.rb
CHANGED
|
@@ -34,7 +34,7 @@ module Entity
|
|
|
34
34
|
mod = Entity === field ? field : Entity.formats[field]
|
|
35
35
|
|
|
36
36
|
entity = entity.dup
|
|
37
|
-
entity = (entity.frozen? and not entity.nil?) ? entity.dup : ((Array === entity and dup_array) ? entity.collect{|e| e.nil? ? e : e.dup} : entity)
|
|
37
|
+
entity = (entity.frozen? and not entity.nil?) ? entity.dup : ((Array === entity and dup_array) ? entity.collect{|e| e.nil? ? e : e.dup} : entity)
|
|
38
38
|
|
|
39
39
|
entity = mod.setup(entity, params)
|
|
40
40
|
|
|
@@ -19,7 +19,7 @@ class KnowledgeBase
|
|
|
19
19
|
|
|
20
20
|
def self.parse_knowledge_base_doc(doc)
|
|
21
21
|
description, db_description = doc_parse_up_to doc, /^#/, true
|
|
22
|
-
databases = doc_parse_chunks db_description, /^# (.*)/
|
|
22
|
+
databases = doc_parse_chunks db_description, /^# (.*)/
|
|
23
23
|
IndiferentHash.setup({:description => description.strip, :databases => databases})
|
|
24
24
|
end
|
|
25
25
|
|
|
@@ -32,11 +32,11 @@ class KnowledgeBase
|
|
|
32
32
|
""
|
|
33
33
|
end
|
|
34
34
|
end
|
|
35
|
-
|
|
35
|
+
|
|
36
36
|
def database_description_file(name)
|
|
37
37
|
dir[name.to_s + '.md']
|
|
38
38
|
end
|
|
39
|
-
|
|
39
|
+
|
|
40
40
|
def knowledge_base_description_file(name)
|
|
41
41
|
file = dir['README.md']
|
|
42
42
|
return file if file.exists?
|
|
@@ -46,11 +46,11 @@ class KnowledgeBase
|
|
|
46
46
|
source_readme = file.dirname['README.md'] if file
|
|
47
47
|
return source_readme if source_readme && source_readme.exists?
|
|
48
48
|
end
|
|
49
|
-
|
|
49
|
+
|
|
50
50
|
def description(name)
|
|
51
51
|
return registered_options(name)[:description] if registered_options(name)[:description]
|
|
52
|
-
|
|
53
|
-
return database_description_file(name).read if database_description_file(name).exist?
|
|
52
|
+
|
|
53
|
+
return database_description_file(name).read if database_description_file(name).exist?
|
|
54
54
|
|
|
55
55
|
if knowledge_base_description_file(name)
|
|
56
56
|
KnowledgeBase.parse_knowledge_base_doc(knowledge_base_description_file(name).read)[:databases][name.to_s.downcase]
|
|
@@ -79,21 +79,21 @@ class KnowledgeBase
|
|
|
79
79
|
[]
|
|
80
80
|
end
|
|
81
81
|
|
|
82
|
-
if source_type
|
|
82
|
+
if source_type
|
|
83
83
|
full_description << "Source: #{source_type} - #{source(name)}"
|
|
84
84
|
else
|
|
85
85
|
full_description << "Source: #{source(name)}"
|
|
86
86
|
end
|
|
87
87
|
#full_description.last << ". Accepted formats: #{source_formats*", "}" if source_formats.any?
|
|
88
88
|
|
|
89
|
-
if target_type
|
|
89
|
+
if target_type
|
|
90
90
|
full_description << "Target: #{target_type} - #{target(name)}"
|
|
91
91
|
else
|
|
92
92
|
full_description << "Target: #{target(name)}"
|
|
93
93
|
end
|
|
94
94
|
#full_description.last << ". Accepted formats: #{target_formats*", "}" if target_formats.any?
|
|
95
|
-
|
|
96
|
-
if undirected?(name)
|
|
95
|
+
|
|
96
|
+
if undirected?(name)
|
|
97
97
|
full_description << "Undirected database, source and target can be reversed."
|
|
98
98
|
end
|
|
99
99
|
|
|
@@ -24,7 +24,7 @@ class KnowledgeBase
|
|
|
24
24
|
options[:format] = @format[type] if Hash === @format && @format.include?(type)
|
|
25
25
|
namespace = self.namespace
|
|
26
26
|
namespace = db_namespace(database_name) if namespace.nil? and database_name
|
|
27
|
-
if database_name
|
|
27
|
+
if database_name
|
|
28
28
|
database = get_database(database_name)
|
|
29
29
|
if database.entity_options and (database.entity_options[type] or database.entity_options[Entity.formats[type.to_s].to_s])
|
|
30
30
|
options = options.merge(database.entity_options[type] || database.entity_options[Entity.formats[type.to_s].to_s])
|
|
@@ -94,7 +94,7 @@ class KnowledgeBase
|
|
|
94
94
|
TSV.translation_index identifier_files, nil, source(name), :persist => true
|
|
95
95
|
end
|
|
96
96
|
end
|
|
97
|
-
|
|
97
|
+
|
|
98
98
|
def target_index(name)
|
|
99
99
|
Persist.memory("Target index #{name}: KB directory #{dir}") do
|
|
100
100
|
if @identifier_files && @identifier_files.any?
|
|
@@ -120,9 +120,9 @@ class KnowledgeBase
|
|
|
120
120
|
|
|
121
121
|
def identify_source(name, entity)
|
|
122
122
|
return :all if entity == :all
|
|
123
|
-
index = begin
|
|
124
|
-
source_index(name)
|
|
125
|
-
rescue
|
|
123
|
+
index = begin
|
|
124
|
+
source_index(name)
|
|
125
|
+
rescue
|
|
126
126
|
Log.exception $!
|
|
127
127
|
nil
|
|
128
128
|
end
|
|
@@ -133,7 +133,7 @@ class KnowledgeBase
|
|
|
133
133
|
index[entity] || entity
|
|
134
134
|
end
|
|
135
135
|
end
|
|
136
|
-
|
|
136
|
+
|
|
137
137
|
def identify_target(name, entity)
|
|
138
138
|
return :all if entity == :all
|
|
139
139
|
index = begin target_index(name) rescue nil end
|
|
@@ -19,7 +19,7 @@ class KnowledgeBase
|
|
|
19
19
|
when :all
|
|
20
20
|
{:target => :all, :source => :all}
|
|
21
21
|
when AnnotatedArray
|
|
22
|
-
format = entities.format if entities.respond_to? :format
|
|
22
|
+
format = entities.format if entities.respond_to? :format
|
|
23
23
|
format ||= entities.base_entity.to_s
|
|
24
24
|
{format => entities.purge}
|
|
25
25
|
when Hash
|
|
@@ -31,7 +31,7 @@ class KnowledgeBase
|
|
|
31
31
|
identify, identify_source, identify_target = entities.merge(options || {}).values_at :identify, :identify_source, :identify_target
|
|
32
32
|
|
|
33
33
|
source, target = select_entities(name, entities, options)
|
|
34
|
-
|
|
34
|
+
|
|
35
35
|
source = identify_source(name, source) if identify_source
|
|
36
36
|
target = identify_target(name, target) if identify_target
|
|
37
37
|
|
|
@@ -46,7 +46,7 @@ class KnowledgeBase
|
|
|
46
46
|
|
|
47
47
|
setup(name, matches)
|
|
48
48
|
|
|
49
|
-
matches = matches.select(&block) if block_given?
|
|
49
|
+
matches = matches.select(&block) if block_given?
|
|
50
50
|
|
|
51
51
|
matches
|
|
52
52
|
end
|
|
@@ -89,7 +89,7 @@ class KnowledgeBase
|
|
|
89
89
|
def neighbours(name, entity)
|
|
90
90
|
hash = _neighbours(name, entity)
|
|
91
91
|
IndiferentHash.setup(hash)
|
|
92
|
-
setup(name, hash[:children]) if hash[:children]
|
|
92
|
+
setup(name, hash[:children]) if hash[:children]
|
|
93
93
|
setup(name, hash[:parents], true) if hash[:parents]
|
|
94
94
|
hash
|
|
95
95
|
end
|
|
@@ -23,7 +23,7 @@ class KnowledgeBase
|
|
|
23
23
|
return [] unless @registry
|
|
24
24
|
(@registry.keys + present_databases).uniq
|
|
25
25
|
end
|
|
26
|
-
|
|
26
|
+
|
|
27
27
|
def database_file(name)
|
|
28
28
|
if @registry[name].nil?
|
|
29
29
|
nil
|
|
@@ -72,8 +72,8 @@ class KnowledgeBase
|
|
|
72
72
|
name = name.to_s
|
|
73
73
|
options[:namespace] ||= self.namespace unless self.namespace.nil?
|
|
74
74
|
@indices ||= IndiferentHash.setup({})
|
|
75
|
-
@indices[[name, options]] ||=
|
|
76
|
-
begin
|
|
75
|
+
@indices[[name, options]] ||=
|
|
76
|
+
begin
|
|
77
77
|
if options.empty?
|
|
78
78
|
key = name.to_s
|
|
79
79
|
elsif options[:key]
|
|
@@ -131,11 +131,11 @@ class KnowledgeBase
|
|
|
131
131
|
def get_database(name, options = {})
|
|
132
132
|
options = options.dup
|
|
133
133
|
if self.namespace == options[:namespace]
|
|
134
|
-
options.delete(:namespace)
|
|
134
|
+
options.delete(:namespace)
|
|
135
135
|
end
|
|
136
136
|
@databases ||= IndiferentHash.setup({})
|
|
137
|
-
@databases[[name, options]] ||=
|
|
138
|
-
begin
|
|
137
|
+
@databases[[name, options]] ||=
|
|
138
|
+
begin
|
|
139
139
|
fp = Log.fingerprint([name,options])
|
|
140
140
|
|
|
141
141
|
if options.empty?
|