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.
Files changed (88) hide show
  1. checksums.yaml +4 -4
  2. data/.vimproject +50 -30
  3. data/VERSION +1 -1
  4. data/lib/scout/association/index.rb +5 -1
  5. data/lib/scout/association/item.rb +1 -1
  6. data/lib/scout/association.rb +46 -11
  7. data/lib/scout/entity/format.rb +9 -4
  8. data/lib/scout/entity/identifiers.rb +4 -4
  9. data/lib/scout/entity/named_array.rb +13 -0
  10. data/lib/scout/entity/property.rb +3 -1
  11. data/lib/scout/entity.rb +7 -4
  12. data/lib/scout/knowledge_base/enrichment.rb +9 -0
  13. data/lib/scout/knowledge_base/entity.rb +143 -0
  14. data/lib/scout/knowledge_base/list.rb +95 -0
  15. data/lib/scout/knowledge_base/query.rb +96 -0
  16. data/lib/scout/knowledge_base/registry.rb +173 -0
  17. data/lib/scout/knowledge_base/traverse.rb +329 -0
  18. data/lib/scout/knowledge_base.rb +91 -0
  19. data/lib/scout/persist/tsv/adapter/base.rb +13 -1
  20. data/lib/scout/persist/tsv.rb +2 -1
  21. data/lib/scout/tsv/annotation.rb +4 -4
  22. data/lib/scout/tsv/attach.rb +10 -2
  23. data/lib/scout/tsv/change_id.rb +3 -0
  24. data/lib/scout/tsv/dumper.rb +34 -30
  25. data/lib/scout/tsv/index.rb +0 -2
  26. data/lib/scout/tsv/open.rb +1 -0
  27. data/lib/scout/tsv/parser.rb +21 -10
  28. data/lib/scout/tsv/path.rb +8 -0
  29. data/lib/scout/tsv/stream.rb +17 -10
  30. data/lib/scout/tsv/traverse.rb +12 -2
  31. data/lib/scout/tsv/util/process.rb +4 -1
  32. data/lib/scout/tsv/util/select.rb +8 -2
  33. data/lib/scout/tsv/util/sort.rb +23 -15
  34. data/lib/scout/tsv/util.rb +11 -2
  35. data/lib/scout/tsv.rb +25 -11
  36. data/lib/scout/workflow/definition.rb +3 -3
  37. data/lib/scout/workflow/deployment/orchestrator.rb +8 -5
  38. data/lib/scout/workflow/step/dependencies.rb +35 -11
  39. data/lib/scout/workflow/step/file.rb +2 -1
  40. data/lib/scout/workflow/step/info.rb +23 -2
  41. data/lib/scout/workflow/step/load.rb +5 -3
  42. data/lib/scout/workflow/step/progress.rb +6 -0
  43. data/lib/scout/workflow/step/provenance.rb +1 -1
  44. data/lib/scout/workflow/step/status.rb +10 -4
  45. data/lib/scout/workflow/step.rb +32 -12
  46. data/lib/scout/workflow/task/dependencies.rb +33 -24
  47. data/lib/scout/workflow/task/inputs.rb +40 -12
  48. data/lib/scout/workflow/task.rb +22 -10
  49. data/lib/scout/workflow/usage.rb +2 -2
  50. data/lib/scout/workflow.rb +1 -1
  51. data/scout-gear.gemspec +28 -4
  52. data/scout_commands/kb/config +33 -0
  53. data/scout_commands/kb/entities +35 -0
  54. data/scout_commands/kb/list +39 -0
  55. data/scout_commands/kb/query +78 -0
  56. data/scout_commands/kb/register +44 -0
  57. data/scout_commands/kb/show +37 -0
  58. data/scout_commands/kb/traverse +66 -0
  59. data/test/data/person/brothers +1 -1
  60. data/test/scout/entity/test_identifiers.rb +3 -3
  61. data/test/scout/entity/test_named_array.rb +21 -0
  62. data/test/scout/knowledge_base/test_enrichment.rb +0 -0
  63. data/test/scout/knowledge_base/test_entity.rb +38 -0
  64. data/test/scout/knowledge_base/test_list.rb +40 -0
  65. data/test/scout/knowledge_base/test_query.rb +39 -0
  66. data/test/scout/knowledge_base/test_registry.rb +16 -0
  67. data/test/scout/knowledge_base/test_traverse.rb +245 -0
  68. data/test/scout/persist/test_tsv.rb +20 -0
  69. data/test/scout/persist/tsv/adapter/test_base.rb +20 -0
  70. data/test/scout/test_association.rb +17 -3
  71. data/test/scout/test_entity.rb +0 -15
  72. data/test/scout/test_knowledge_base.rb +27 -0
  73. data/test/scout/test_tsv.rb +40 -0
  74. data/test/scout/tsv/test_dumper.rb +24 -0
  75. data/test/scout/tsv/test_path.rb +24 -0
  76. data/test/scout/tsv/test_stream.rb +93 -0
  77. data/test/scout/tsv/test_traverse.rb +99 -0
  78. data/test/scout/tsv/test_util.rb +2 -0
  79. data/test/scout/tsv/util/test_select.rb +22 -0
  80. data/test/scout/tsv/util/test_sort.rb +24 -0
  81. data/test/scout/workflow/step/test_dependencies.rb +26 -0
  82. data/test/scout/workflow/step/test_info.rb +35 -0
  83. data/test/scout/workflow/task/test_dependencies.rb +67 -1
  84. data/test/scout/workflow/task/test_inputs.rb +24 -7
  85. data/test/scout/workflow/test_task.rb +36 -0
  86. data/test/scout/workflow/test_usage.rb +0 -1
  87. data/test/test_helper.rb +17 -0
  88. 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
- if ! provided.nil? && ! same_as_default
53
- non_default_inputs << name.to_sym
54
- input_array << provided
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|
@@ -31,19 +31,29 @@ module Task
31
31
  end
32
32
 
33
33
  def job(id = nil, provided_inputs = nil)
34
- Persist.memory("Task job", other_options: {task: self, id: id, provided_inputs: provided_inputs}) do
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
- if id.nil?
40
- inputs.each do |name,type,desc,default,input_options|
41
- next unless input_options && input_options[:jobname]
42
- id = provided_inputs[name] || default
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
- if non_default_inputs.any?
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
@@ -162,7 +162,7 @@ module Workflow
162
162
 
163
163
  def _prov_tasks(tree)
164
164
  tasks = []
165
- heap = [tree]
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?
@@ -155,7 +155,7 @@ module Workflow
155
155
 
156
156
  def job(name, *args)
157
157
  task = tasks[name]
158
- raise TaskNotFound, "Task #{task_name} in #{self.to_s}" if task.nil?
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.1 ruby lib
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.1".freeze
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 = "2024-07-01"
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.10".freeze
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
@@ -1,4 +1,4 @@
1
1
  #: :sep=,#:type=:list
2
- #Older,Younger
2
+ #Older (Alias),Younger (Alias)
3
3
  Clei,Guille
4
4
  Isa,Miki
@@ -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
- Entity.formats.clear
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