scout-gear 10.7.1 → 10.7.3
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 +50 -30
- data/VERSION +1 -1
- data/lib/scout/association/index.rb +5 -1
- data/lib/scout/association/item.rb +1 -1
- data/lib/scout/association.rb +46 -11
- data/lib/scout/entity/format.rb +9 -4
- data/lib/scout/entity/identifiers.rb +4 -4
- data/lib/scout/entity/named_array.rb +13 -0
- data/lib/scout/entity/property.rb +3 -1
- data/lib/scout/entity.rb +7 -4
- data/lib/scout/knowledge_base/enrichment.rb +9 -0
- data/lib/scout/knowledge_base/entity.rb +143 -0
- data/lib/scout/knowledge_base/list.rb +95 -0
- data/lib/scout/knowledge_base/query.rb +96 -0
- data/lib/scout/knowledge_base/registry.rb +173 -0
- data/lib/scout/knowledge_base/traverse.rb +329 -0
- data/lib/scout/knowledge_base.rb +91 -0
- data/lib/scout/persist/tsv/adapter/base.rb +13 -1
- data/lib/scout/persist/tsv.rb +2 -1
- data/lib/scout/tsv/annotation.rb +4 -4
- data/lib/scout/tsv/attach.rb +10 -2
- data/lib/scout/tsv/change_id.rb +3 -0
- data/lib/scout/tsv/dumper.rb +34 -30
- data/lib/scout/tsv/index.rb +0 -2
- data/lib/scout/tsv/open.rb +1 -0
- data/lib/scout/tsv/parser.rb +21 -10
- data/lib/scout/tsv/path.rb +8 -0
- data/lib/scout/tsv/stream.rb +17 -10
- data/lib/scout/tsv/traverse.rb +12 -2
- data/lib/scout/tsv/util/process.rb +4 -1
- data/lib/scout/tsv/util/select.rb +8 -2
- data/lib/scout/tsv/util/sort.rb +23 -15
- data/lib/scout/tsv/util.rb +11 -2
- data/lib/scout/tsv.rb +25 -11
- data/lib/scout/workflow/definition.rb +3 -3
- data/lib/scout/workflow/deployment/orchestrator.rb +8 -5
- data/lib/scout/workflow/step/dependencies.rb +35 -11
- data/lib/scout/workflow/step/file.rb +2 -1
- data/lib/scout/workflow/step/info.rb +23 -2
- data/lib/scout/workflow/step/load.rb +5 -3
- data/lib/scout/workflow/step/progress.rb +6 -0
- data/lib/scout/workflow/step/provenance.rb +1 -1
- data/lib/scout/workflow/step/status.rb +10 -4
- data/lib/scout/workflow/step.rb +32 -12
- data/lib/scout/workflow/task/dependencies.rb +33 -24
- data/lib/scout/workflow/task/inputs.rb +40 -12
- data/lib/scout/workflow/task.rb +22 -10
- data/lib/scout/workflow/usage.rb +2 -2
- data/lib/scout/workflow.rb +1 -1
- data/scout-gear.gemspec +28 -4
- data/scout_commands/kb/config +33 -0
- data/scout_commands/kb/entities +35 -0
- data/scout_commands/kb/list +39 -0
- data/scout_commands/kb/query +78 -0
- data/scout_commands/kb/register +44 -0
- data/scout_commands/kb/show +37 -0
- data/scout_commands/kb/traverse +66 -0
- data/test/data/person/brothers +1 -1
- data/test/scout/entity/test_identifiers.rb +3 -3
- data/test/scout/entity/test_named_array.rb +21 -0
- data/test/scout/knowledge_base/test_enrichment.rb +0 -0
- data/test/scout/knowledge_base/test_entity.rb +38 -0
- data/test/scout/knowledge_base/test_list.rb +40 -0
- data/test/scout/knowledge_base/test_query.rb +39 -0
- data/test/scout/knowledge_base/test_registry.rb +16 -0
- data/test/scout/knowledge_base/test_traverse.rb +245 -0
- data/test/scout/persist/test_tsv.rb +20 -0
- data/test/scout/persist/tsv/adapter/test_base.rb +20 -0
- data/test/scout/test_association.rb +17 -3
- data/test/scout/test_entity.rb +0 -15
- data/test/scout/test_knowledge_base.rb +27 -0
- data/test/scout/test_tsv.rb +40 -0
- data/test/scout/tsv/test_dumper.rb +24 -0
- data/test/scout/tsv/test_path.rb +24 -0
- data/test/scout/tsv/test_stream.rb +93 -0
- data/test/scout/tsv/test_traverse.rb +99 -0
- data/test/scout/tsv/test_util.rb +2 -0
- data/test/scout/tsv/util/test_select.rb +22 -0
- data/test/scout/tsv/util/test_sort.rb +24 -0
- data/test/scout/workflow/step/test_dependencies.rb +26 -0
- data/test/scout/workflow/step/test_info.rb +35 -0
- data/test/scout/workflow/task/test_dependencies.rb +67 -1
- data/test/scout/workflow/task/test_inputs.rb +24 -7
- data/test/scout/workflow/test_task.rb +36 -0
- data/test/scout/workflow/test_usage.rb +0 -1
- data/test/test_helper.rb +17 -0
- metadata +27 -3
@@ -3,7 +3,7 @@ module Task
|
|
3
3
|
def self.format_input(value, type, options = {})
|
4
4
|
return value if IO === value || StringIO === value || Step === value
|
5
5
|
|
6
|
-
if String === value && ! [:path, :file, :folder, :binary, :tsv].include?(type) && ! (options && (options[:noload] || options[:stream] || options[:nofile]))
|
6
|
+
if String === value && ! [:path, :file, :folder, :binary, :tsv].include?(type) && ! (options && (options[:noload] || options[:stream] || options[:nofile] || options[:asfile]))
|
7
7
|
if Open.exists?(value) && ! Open.directory?(value)
|
8
8
|
Persist.load(value, type)
|
9
9
|
else
|
@@ -35,11 +35,13 @@ module Task
|
|
35
35
|
input_array = []
|
36
36
|
input_names = []
|
37
37
|
non_default_inputs = []
|
38
|
+
jobname_input = nil
|
38
39
|
self.inputs.each_with_index do |p,i|
|
39
40
|
name, type, desc, value, options = p
|
40
41
|
input_names << name
|
41
42
|
provided = Hash === provided_inputs ? provided_inputs[name] : provided_inputs[i]
|
42
43
|
provided = Task.format_input(provided, type, options || {})
|
44
|
+
|
43
45
|
if provided == value
|
44
46
|
same_as_default = true
|
45
47
|
elsif String === provided && Symbol === value && provided == value.to_s
|
@@ -49,25 +51,39 @@ module Task
|
|
49
51
|
else
|
50
52
|
same_as_default = false
|
51
53
|
end
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
elsif options && options[:jobname]
|
56
|
-
input_array << id
|
57
|
-
else
|
58
|
-
input_array << value
|
54
|
+
|
55
|
+
if options && options[:jobname] && id == provided
|
56
|
+
same_as_jobname = true
|
59
57
|
end
|
58
|
+
|
59
|
+
jobname_input = name if same_as_jobname
|
60
|
+
|
61
|
+
final = if ! provided.nil? && ! same_as_default && ! same_as_jobname
|
62
|
+
non_default_inputs << name.to_sym
|
63
|
+
provided
|
64
|
+
elsif options && options[:jobname] && id
|
65
|
+
non_default_inputs << name.to_sym
|
66
|
+
provided || id
|
67
|
+
else
|
68
|
+
value
|
69
|
+
end
|
70
|
+
|
71
|
+
final = Path.setup(final.dup) if String === final && ! (Path === final) && (type == :file || type == :path || (options && options[:asfile]))
|
72
|
+
|
73
|
+
final = final.find if (Path === final) && (type == :file)
|
74
|
+
|
75
|
+
input_array << final
|
60
76
|
end
|
61
77
|
|
62
78
|
NamedArray.setup(input_array, input_names)
|
63
79
|
|
64
|
-
[input_array, non_default_inputs]
|
80
|
+
[input_array, non_default_inputs, jobname_input]
|
65
81
|
end
|
66
82
|
|
67
83
|
def process_inputs(provided_inputs = {}, id = nil)
|
68
|
-
input_array, non_default_inputs = assign_inputs provided_inputs, id
|
84
|
+
input_array, non_default_inputs, jobname_input = assign_inputs provided_inputs, id
|
69
85
|
digest_str = Misc.digest_str(input_array)
|
70
|
-
[input_array, non_default_inputs, digest_str]
|
86
|
+
[input_array, non_default_inputs, digest_str, jobname_input]
|
71
87
|
end
|
72
88
|
|
73
89
|
def self.save_file_input(orig_file, directory)
|
@@ -139,7 +155,7 @@ module Task
|
|
139
155
|
elsif filename.end_with?('.as_path')
|
140
156
|
value = Open.read(filename).strip
|
141
157
|
Path.setup value
|
142
|
-
elsif (options && (options[:noload] || options[:stream] || options[:nofile]))
|
158
|
+
elsif (options && (options[:noload] || options[:stream] || options[:nofile] || options[:asfile]))
|
143
159
|
filename
|
144
160
|
else
|
145
161
|
Persist.load(filename, type)
|
@@ -150,12 +166,24 @@ module Task
|
|
150
166
|
end
|
151
167
|
|
152
168
|
def load_inputs(directory)
|
169
|
+
if Open.exists?(directory) && ! Open.directory?(directory)
|
170
|
+
TmpFile.with_file do |tmp_directory|
|
171
|
+
Misc.in_dir tmp_directory do
|
172
|
+
CMD.cmd("tar xvfz '#{directory}'")
|
173
|
+
end
|
174
|
+
return load_inputs(tmp_directory)
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
153
178
|
inputs = IndiferentHash.setup({})
|
179
|
+
seen = []
|
154
180
|
self.recursive_inputs.each do |p|
|
155
181
|
name, type, desc, value, options = p
|
182
|
+
next if seen.include?(name)
|
156
183
|
filename = File.join(directory, name.to_s)
|
157
184
|
value = Task.load_input_from_file(filename, type, options)
|
158
185
|
inputs[name] = value unless value.nil?
|
186
|
+
seen << name
|
159
187
|
end
|
160
188
|
|
161
189
|
Dir.glob(File.join(directory, "*#*")).each do |file|
|
data/lib/scout/workflow/task.rb
CHANGED
@@ -31,19 +31,29 @@ module Task
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def job(id = nil, provided_inputs = nil)
|
34
|
-
|
34
|
+
|
35
|
+
if Hash === provided_inputs
|
36
|
+
memory_inputs = provided_inputs.values_at *self.recursive_inputs.collect{|t| t.first }.uniq
|
37
|
+
memory_inputs += provided_inputs.select{|k,v| k.to_s.include?("#") }.collect{|p| p * "=" }
|
38
|
+
memory_inputs << provided_inputs[:load_inputs]
|
39
|
+
else
|
40
|
+
memory_inputs = provided_inputs
|
41
|
+
end
|
42
|
+
|
43
|
+
Persist.memory("Task job #{self.name} #{id}", other_options: {task: self, id: id, provided_inputs: memory_inputs}) do
|
35
44
|
provided_inputs, id = id, nil if (provided_inputs.nil? || provided_inputs.empty?) && (Hash === id || Array === id)
|
36
45
|
provided_inputs = {} if provided_inputs.nil?
|
37
46
|
IndiferentHash.setup(provided_inputs)
|
38
47
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
end
|
44
|
-
id = DEFAULT_NAME if id.nil?
|
48
|
+
jobname_input = nil
|
49
|
+
inputs.each do |name,type,desc,default,input_options|
|
50
|
+
next unless input_options && input_options[:jobname]
|
51
|
+
jobname_input = name
|
45
52
|
end
|
46
53
|
|
54
|
+
id = provided_inputs[jobname_input] if jobname_input && id.nil?
|
55
|
+
#id = provided_inputs[:id] if provided_inputs.include?(:id)
|
56
|
+
|
47
57
|
missing_inputs = []
|
48
58
|
self.inputs.each do |input,type,desc,val,options|
|
49
59
|
next unless options && options[:required]
|
@@ -65,11 +75,13 @@ module Task
|
|
65
75
|
compute = {}
|
66
76
|
dependencies = dependencies(id, provided_inputs, non_default_inputs, compute)
|
67
77
|
|
68
|
-
#non_default_inputs.concat provided_inputs.keys.select{|k| String === k && k.include?("#") } if Hash === provided_inputs
|
69
|
-
|
70
78
|
non_default_inputs.uniq!
|
71
79
|
|
72
|
-
|
80
|
+
non_default_inputs.delete_if{|k| k.to_s.include? "#" } unless dependencies.select{|d| d.overriden? }.any?
|
81
|
+
|
82
|
+
id = DEFAULT_NAME if id.nil?
|
83
|
+
|
84
|
+
if non_default_inputs.any? && !(non_default_inputs == [jobname_input] && provided_inputs[jobname_input] == id)
|
73
85
|
hash = Misc.digest(:inputs => input_digest_str, :dependencies => dependencies)
|
74
86
|
name = [id, hash] * "_"
|
75
87
|
else
|
data/lib/scout/workflow/usage.rb
CHANGED
@@ -162,7 +162,7 @@ module Workflow
|
|
162
162
|
|
163
163
|
def _prov_tasks(tree)
|
164
164
|
tasks = []
|
165
|
-
heap =
|
165
|
+
heap = tree.values
|
166
166
|
while heap.any?
|
167
167
|
t = heap.pop
|
168
168
|
t.each do |k,v|
|
@@ -271,7 +271,7 @@ module Workflow
|
|
271
271
|
description = description.split("\n\n").first
|
272
272
|
|
273
273
|
next if abridge && ! final.include?(name)
|
274
|
-
str.puts Misc.format_definition_list_item(name.to_s, description, nil, nil, :yellow)
|
274
|
+
str.puts Misc.format_definition_list_item(name.to_s, description, nil, nil, color: :yellow)
|
275
275
|
|
276
276
|
prov_string = prov_string(dep_tree(name))
|
277
277
|
str.puts Misc.format_paragraph Log.color(:blue, "->" + prov_string) if prov_string && ! prov_string.empty?
|
data/lib/scout/workflow.rb
CHANGED
@@ -155,7 +155,7 @@ module Workflow
|
|
155
155
|
|
156
156
|
def job(name, *args)
|
157
157
|
task = tasks[name]
|
158
|
-
raise TaskNotFound, "Task #{
|
158
|
+
raise TaskNotFound, "Task #{name} in #{self.to_s}" if task.nil?
|
159
159
|
step = task.job(*args)
|
160
160
|
step.extend step_module
|
161
161
|
step
|
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.7.
|
5
|
+
# stub: scout-gear 10.7.3 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "scout-gear".freeze
|
9
|
-
s.version = "10.7.
|
9
|
+
s.version = "10.7.3".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-01-17"
|
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]
|
@@ -41,8 +41,16 @@ Gem::Specification.new do |s|
|
|
41
41
|
"lib/scout/entity.rb",
|
42
42
|
"lib/scout/entity/format.rb",
|
43
43
|
"lib/scout/entity/identifiers.rb",
|
44
|
+
"lib/scout/entity/named_array.rb",
|
44
45
|
"lib/scout/entity/object.rb",
|
45
46
|
"lib/scout/entity/property.rb",
|
47
|
+
"lib/scout/knowledge_base.rb",
|
48
|
+
"lib/scout/knowledge_base/enrichment.rb",
|
49
|
+
"lib/scout/knowledge_base/entity.rb",
|
50
|
+
"lib/scout/knowledge_base/list.rb",
|
51
|
+
"lib/scout/knowledge_base/query.rb",
|
52
|
+
"lib/scout/knowledge_base/registry.rb",
|
53
|
+
"lib/scout/knowledge_base/traverse.rb",
|
46
54
|
"lib/scout/offsite.rb",
|
47
55
|
"lib/scout/offsite/exceptions.rb",
|
48
56
|
"lib/scout/offsite/ssh.rb",
|
@@ -124,6 +132,13 @@ Gem::Specification.new do |s|
|
|
124
132
|
"scout_commands/doc",
|
125
133
|
"scout_commands/find",
|
126
134
|
"scout_commands/glob",
|
135
|
+
"scout_commands/kb/config",
|
136
|
+
"scout_commands/kb/entities",
|
137
|
+
"scout_commands/kb/list",
|
138
|
+
"scout_commands/kb/query",
|
139
|
+
"scout_commands/kb/register",
|
140
|
+
"scout_commands/kb/show",
|
141
|
+
"scout_commands/kb/traverse",
|
127
142
|
"scout_commands/log",
|
128
143
|
"scout_commands/offsite",
|
129
144
|
"scout_commands/rbbt",
|
@@ -151,8 +166,15 @@ Gem::Specification.new do |s|
|
|
151
166
|
"test/scout/association/test_item.rb",
|
152
167
|
"test/scout/entity/test_format.rb",
|
153
168
|
"test/scout/entity/test_identifiers.rb",
|
169
|
+
"test/scout/entity/test_named_array.rb",
|
154
170
|
"test/scout/entity/test_object.rb",
|
155
171
|
"test/scout/entity/test_property.rb",
|
172
|
+
"test/scout/knowledge_base/test_enrichment.rb",
|
173
|
+
"test/scout/knowledge_base/test_entity.rb",
|
174
|
+
"test/scout/knowledge_base/test_list.rb",
|
175
|
+
"test/scout/knowledge_base/test_query.rb",
|
176
|
+
"test/scout/knowledge_base/test_registry.rb",
|
177
|
+
"test/scout/knowledge_base/test_traverse.rb",
|
156
178
|
"test/scout/offsite/test_ssh.rb",
|
157
179
|
"test/scout/offsite/test_step.rb",
|
158
180
|
"test/scout/offsite/test_sync.rb",
|
@@ -173,6 +195,7 @@ Gem::Specification.new do |s|
|
|
173
195
|
"test/scout/persist/tsv/test_serialize.rb",
|
174
196
|
"test/scout/test_association.rb",
|
175
197
|
"test/scout/test_entity.rb",
|
198
|
+
"test/scout/test_knowledge_base.rb",
|
176
199
|
"test/scout/test_offsite.rb",
|
177
200
|
"test/scout/test_semaphore.rb",
|
178
201
|
"test/scout/test_tsv.rb",
|
@@ -188,6 +211,7 @@ Gem::Specification.new do |s|
|
|
188
211
|
"test/scout/tsv/test_index.rb",
|
189
212
|
"test/scout/tsv/test_open.rb",
|
190
213
|
"test/scout/tsv/test_parser.rb",
|
214
|
+
"test/scout/tsv/test_path.rb",
|
191
215
|
"test/scout/tsv/test_stream.rb",
|
192
216
|
"test/scout/tsv/test_transformer.rb",
|
193
217
|
"test/scout/tsv/test_traverse.rb",
|
@@ -225,7 +249,7 @@ Gem::Specification.new do |s|
|
|
225
249
|
]
|
226
250
|
s.homepage = "http://github.com/mikisvaz/scout-gear".freeze
|
227
251
|
s.licenses = ["MIT".freeze]
|
228
|
-
s.rubygems_version = "3.5.
|
252
|
+
s.rubygems_version = "3.5.23".freeze
|
229
253
|
s.summary = "basic gear for scouts".freeze
|
230
254
|
|
231
255
|
s.specification_version = 4
|
@@ -0,0 +1,33 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'scout'
|
4
|
+
require 'scout/knowledge_base'
|
5
|
+
|
6
|
+
$0 = "scout #{$previous_commands.any? ? $previous_commands*" " + " " : "" }#{ File.basename(__FILE__) }" if $previous_commands
|
7
|
+
|
8
|
+
options = SOPT.setup <<EOF
|
9
|
+
|
10
|
+
Configure a knowlege base
|
11
|
+
|
12
|
+
$ #{$0} [<options>] <name> [knowledge_base]
|
13
|
+
|
14
|
+
-h--help Print this help
|
15
|
+
-i--identifier_files* Identifier files separated by ','
|
16
|
+
-n--namespace* Namespace
|
17
|
+
EOF
|
18
|
+
if options.delete :help
|
19
|
+
if defined? scout_usage
|
20
|
+
scout_usage
|
21
|
+
else
|
22
|
+
puts SOPT.doc
|
23
|
+
end
|
24
|
+
exit 0
|
25
|
+
end
|
26
|
+
|
27
|
+
knowledge_base_name = ARGV.first
|
28
|
+
|
29
|
+
knowledge_base = KnowledgeBase.load knowledge_base_name || :default
|
30
|
+
|
31
|
+
knowledge_base.namespace = options[:namespace] if options.include? :namespace
|
32
|
+
knowledge_base.identifier_files += options[:identifier_files].split(",") if options.include? :identifier_files
|
33
|
+
knowledge_base.save
|
@@ -0,0 +1,35 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'scout'
|
4
|
+
require 'scout/knowledge_base'
|
5
|
+
|
6
|
+
$0 = "scout #{$previous_commands.any? ? $previous_commands*" " + " " : "" }#{ File.basename(__FILE__) }" if $previous_commands
|
7
|
+
|
8
|
+
options = SOPT.setup <<EOF
|
9
|
+
|
10
|
+
Declare a type of entity and assing an identifiers file
|
11
|
+
|
12
|
+
$ #{$0} [<options>] <entity> <identifier_files>
|
13
|
+
|
14
|
+
-h--help Print this help
|
15
|
+
-kb--knowledge_base* Knowlege base name (or :default)
|
16
|
+
EOF
|
17
|
+
if options.delete :help
|
18
|
+
if defined? scout_usage
|
19
|
+
scout_usage
|
20
|
+
else
|
21
|
+
puts SOPT.doc
|
22
|
+
end
|
23
|
+
exit 0
|
24
|
+
end
|
25
|
+
|
26
|
+
entity, identifier_files = ARGV
|
27
|
+
|
28
|
+
knowledge_base = KnowledgeBase.load options[:knowledge_base] || :default
|
29
|
+
|
30
|
+
knowledge_base.entity_options[entity] ||= {}
|
31
|
+
knowledge_base.entity_options[entity][:identifiers] ||= []
|
32
|
+
knowledge_base.entity_options[entity][:identifiers] = [knowledge_base.entity_options[entity][:identifiers]] unless Array === knowledge_base.entity_options[entity][:identifiers]
|
33
|
+
knowledge_base.entity_options[entity][:identifiers] += identifier_files.split(",")
|
34
|
+
knowledge_base.entity_options[entity][:identifiers].uniq!
|
35
|
+
knowledge_base.save
|
@@ -0,0 +1,39 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'scout'
|
4
|
+
require 'scout/knowledge_base'
|
5
|
+
|
6
|
+
$0 = "scout #{$previous_commands.any? ? $previous_commands*" " + " " : "" }#{ File.basename(__FILE__) }" if $previous_commands
|
7
|
+
|
8
|
+
options = SOPT.setup <<EOF
|
9
|
+
|
10
|
+
Description of the tool
|
11
|
+
|
12
|
+
$ #{$0} [<options>] <filename> [<other|->]*
|
13
|
+
|
14
|
+
-h--help Print this help
|
15
|
+
EOF
|
16
|
+
if options[:help]
|
17
|
+
if defined? scout_usage
|
18
|
+
scout_usage
|
19
|
+
else
|
20
|
+
puts SOPT.doc
|
21
|
+
end
|
22
|
+
exit 0
|
23
|
+
end
|
24
|
+
|
25
|
+
knowledge_base = KnowledgeBase.load options[:knowledge_base] || :default
|
26
|
+
knowledge_base.define_entity_modules
|
27
|
+
|
28
|
+
list_name = ARGV.first
|
29
|
+
|
30
|
+
if list_name.nil?
|
31
|
+
knowledge_base.lists.each do |type,lists|
|
32
|
+
puts Log.color :title, type
|
33
|
+
puts lists * "\n"
|
34
|
+
end
|
35
|
+
else
|
36
|
+
list = knowledge_base.load_list(list_name)
|
37
|
+
|
38
|
+
puts list * "\n"
|
39
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'scout'
|
4
|
+
require 'scout/knowledge_base'
|
5
|
+
|
6
|
+
$0 = "scout #{$previous_commands.any? ? $previous_commands*" " + " " : "" }#{ File.basename(__FILE__) }" if $previous_commands
|
7
|
+
|
8
|
+
options = SOPT.setup <<EOF
|
9
|
+
|
10
|
+
Query a database
|
11
|
+
|
12
|
+
$ #{$0} [<options>] <name> <entity>
|
13
|
+
|
14
|
+
-h--help Print this help
|
15
|
+
-kb--knowledge_base* Knowlege base name (or :default)
|
16
|
+
-l--list Only list matches
|
17
|
+
-s--source* Source description
|
18
|
+
-t--target* Target description
|
19
|
+
-n--namespace* Namespace
|
20
|
+
-i--identifiers* Identifiers
|
21
|
+
EOF
|
22
|
+
if options[:help]
|
23
|
+
if defined? scout_usage
|
24
|
+
scout_usage
|
25
|
+
else
|
26
|
+
puts SOPT.doc
|
27
|
+
end
|
28
|
+
exit 0
|
29
|
+
end
|
30
|
+
|
31
|
+
name, entity = ARGV
|
32
|
+
|
33
|
+
raise MissingParameterException, :name if name.nil?
|
34
|
+
raise MissingParameterException, :entity if entity.nil?
|
35
|
+
|
36
|
+
|
37
|
+
knowledge_base = KnowledgeBase.load options[:knowledge_base] || :default
|
38
|
+
|
39
|
+
list = IndiferentHash.process_options options, :list
|
40
|
+
|
41
|
+
raise ParameterException "Database #{name} not found Options: #{Log.fingerprint knowledge_base.all_databases.keys}" unless knowledge_base.include? name
|
42
|
+
|
43
|
+
IndiferentHash.setup(options)
|
44
|
+
options.keys_to_sym!
|
45
|
+
|
46
|
+
index = knowledge_base.get_index(name, options)
|
47
|
+
|
48
|
+
if entity.end_with?("~")
|
49
|
+
matches = index.match(entity[0..-2])
|
50
|
+
elsif entity.start_with?("~")
|
51
|
+
index = index.reverse
|
52
|
+
matches = index.match(entity[1..-1])
|
53
|
+
reverse = true
|
54
|
+
elsif entity.include?("~")
|
55
|
+
matches = [entity]
|
56
|
+
else
|
57
|
+
matches = index.match(entity)
|
58
|
+
end
|
59
|
+
|
60
|
+
AssociationItem.setup(matches) if reverse
|
61
|
+
|
62
|
+
if matches.any?
|
63
|
+
if list
|
64
|
+
if reverse
|
65
|
+
puts matches.collect(&:invert) * "\n"
|
66
|
+
else
|
67
|
+
puts matches * "\n"
|
68
|
+
end
|
69
|
+
else
|
70
|
+
matches.each do |match|
|
71
|
+
puts Log.color :magenta, (reverse ? match.invert : match)
|
72
|
+
puts index[match].prety_print
|
73
|
+
end
|
74
|
+
end
|
75
|
+
else
|
76
|
+
STDERR.puts "Query #{entity} return no results"
|
77
|
+
end
|
78
|
+
|
@@ -0,0 +1,44 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'scout'
|
4
|
+
require 'scout/knowledge_base'
|
5
|
+
|
6
|
+
$0 = "scout #{$previous_commands.any? ? $previous_commands*" " + " " : "" }#{ File.basename(__FILE__) }" if $previous_commands
|
7
|
+
|
8
|
+
options = SOPT.setup <<EOF
|
9
|
+
|
10
|
+
Register a database
|
11
|
+
|
12
|
+
$ #{$0} [<options>] <name> <filename>
|
13
|
+
|
14
|
+
-h--help Print this help
|
15
|
+
-kb--knowledge_base* Knowlege base name (or :default)
|
16
|
+
-s--source* Source description
|
17
|
+
-t--target* Target description
|
18
|
+
-f--fields* Fields to consider
|
19
|
+
-n--namespace* Namespace
|
20
|
+
-i--identifiers* Identifiers
|
21
|
+
-u--undirected
|
22
|
+
EOF
|
23
|
+
if options.delete :help
|
24
|
+
if defined? scout_usage
|
25
|
+
scout_usage
|
26
|
+
else
|
27
|
+
puts SOPT.doc
|
28
|
+
end
|
29
|
+
exit 0
|
30
|
+
end
|
31
|
+
|
32
|
+
name, file = ARGV
|
33
|
+
|
34
|
+
|
35
|
+
raise MissingParameterException, :name if name.nil?
|
36
|
+
raise MissingParameterException, :file if file.nil?
|
37
|
+
|
38
|
+
knowledge_base = KnowledgeBase.load options[:knowledge_base] || :default
|
39
|
+
|
40
|
+
options[:fields] = options[:fields].split(/,\s*/) if options[:fields]
|
41
|
+
file = Scout.identify(File.expand_path(file))
|
42
|
+
knowledge_base.register name, Scout.identify(file), options
|
43
|
+
|
44
|
+
knowledge_base.save
|
@@ -0,0 +1,37 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'scout'
|
4
|
+
require 'scout/knowledge_base'
|
5
|
+
|
6
|
+
$0 = "scout #{$previous_commands.any? ? $previous_commands*" " + " " : "" }#{ File.basename(__FILE__) }" if $previous_commands
|
7
|
+
|
8
|
+
options = SOPT.setup <<EOF
|
9
|
+
|
10
|
+
Show a database
|
11
|
+
|
12
|
+
$ #{$0} [<options>] <name>
|
13
|
+
|
14
|
+
-h--help Print this help
|
15
|
+
-kb--knowledge_base* Knowlege base name (or :default)
|
16
|
+
EOF
|
17
|
+
if options[:help]
|
18
|
+
if defined? scout_usage
|
19
|
+
scout_usage
|
20
|
+
else
|
21
|
+
puts SOPT.doc
|
22
|
+
end
|
23
|
+
exit 0
|
24
|
+
end
|
25
|
+
|
26
|
+
knowledge_base = KnowledgeBase.load options[:knowledge_base] || :default
|
27
|
+
|
28
|
+
name = ARGV.first
|
29
|
+
|
30
|
+
if name.nil?
|
31
|
+
puts knowledge_base.all_databases * "\n"
|
32
|
+
else
|
33
|
+
|
34
|
+
raise ParameterException "Database #{name} not found Options: #{Log.fingerprint knowledge_base.all_databases}" unless knowledge_base.include? name
|
35
|
+
|
36
|
+
Log.tsv knowledge_base.get_database(name, options)
|
37
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'scout'
|
4
|
+
require 'scout/knowledge_base'
|
5
|
+
|
6
|
+
$0 = "scout #{$previous_commands.any? ? $previous_commands*" " + " " : "" }#{ File.basename(__FILE__) }" if $previous_commands
|
7
|
+
|
8
|
+
options = SOPT.setup <<EOF
|
9
|
+
|
10
|
+
Traverse databases
|
11
|
+
|
12
|
+
$ #{$0} [<options>] <traversal>
|
13
|
+
|
14
|
+
-h--help Print this help
|
15
|
+
-kb--knowledge_base* Knowlege base name (or :default)
|
16
|
+
-p--paths Only list paths
|
17
|
+
-e--entities Only list entities
|
18
|
+
-l--list* List entities matching capture
|
19
|
+
-ln--list_name* Save list of matches with a name
|
20
|
+
EOF
|
21
|
+
if options[:help]
|
22
|
+
if defined? scout_usage
|
23
|
+
scout_usage
|
24
|
+
else
|
25
|
+
puts SOPT.doc
|
26
|
+
end
|
27
|
+
exit 0
|
28
|
+
end
|
29
|
+
|
30
|
+
traversal = ARGV.first
|
31
|
+
|
32
|
+
raise MissingParameterException, :traversal if traversal.nil?
|
33
|
+
|
34
|
+
knowledge_base = KnowledgeBase.load options[:knowledge_base] || :default
|
35
|
+
|
36
|
+
only_paths, only_entities, list, list_name = IndiferentHash.process_options options, :paths, :entities, :list, :list_name
|
37
|
+
|
38
|
+
rules = traversal.split(/,\s*/)
|
39
|
+
|
40
|
+
knowledge_base.define_entity_modules
|
41
|
+
|
42
|
+
entities, paths = knowledge_base.traverse(rules, only_entities || list)
|
43
|
+
|
44
|
+
if list
|
45
|
+
entity_list = entities["?" + list] || []
|
46
|
+
puts entity_list * "\n"
|
47
|
+
knowledge_base.save_list list_name, entity_list if list_name
|
48
|
+
else
|
49
|
+
paths = nil if only_entities && ! only_paths
|
50
|
+
entities = nil if only_paths && ! only_entities
|
51
|
+
|
52
|
+
if entities
|
53
|
+
entities.each do |type,list|
|
54
|
+
puts Log.color(:magenta, type[1..-1] + ": ") + Log.fingerprint(list * ", ")
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
if paths
|
59
|
+
paths.each do |path_list|
|
60
|
+
path_list.each do |match|
|
61
|
+
puts Log.color :magenta, (match.reverse ? match.invert : match)
|
62
|
+
puts IndiferentHash.setup(match.info).prety_print if match.info && match.info.any?
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/test/data/person/brothers
CHANGED
@@ -16,9 +16,9 @@ class TestEntityIdentifiers < Test::Unit::TestCase
|
|
16
16
|
|
17
17
|
Person.add_identifiers datafile_test(Entity::Identified::NAMESPACE_TAG + '/identifiers'), "Name", "Alias"
|
18
18
|
|
19
|
-
teardown do
|
20
|
-
|
21
|
-
end
|
19
|
+
#teardown do
|
20
|
+
# Entity.formats.clear
|
21
|
+
#end
|
22
22
|
|
23
23
|
def test_alias
|
24
24
|
miguel = Person.setup("Miguel", namespace: :person)
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require File.expand_path(__FILE__).sub(%r(/test/.*), '/test/test_helper.rb')
|
2
|
+
require File.expand_path(__FILE__).sub(%r(.*/test/), '').sub(/test_(.*)\.rb/,'\1')
|
3
|
+
|
4
|
+
class TestNamedArrayEntity < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
m = Module.new do
|
7
|
+
extend Entity
|
8
|
+
self.format = "SomeEntity"
|
9
|
+
|
10
|
+
property :prop do
|
11
|
+
"PROP: #{self}"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_true
|
17
|
+
a = NamedArray.setup(["a", "b"], %w(SomeEntity Other))
|
18
|
+
assert a["SomeEntity"].respond_to?(:prop)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
File without changes
|