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.
Files changed (157) hide show
  1. checksums.yaml +4 -4
  2. data/.vimproject +17 -2
  3. data/VERSION +1 -1
  4. data/bin/scout +10 -10
  5. data/lib/scout/association/fields.rb +15 -15
  6. data/lib/scout/association/index.rb +6 -6
  7. data/lib/scout/association/item.rb +18 -8
  8. data/lib/scout/association.rb +4 -4
  9. data/lib/scout/entity/identifiers.rb +5 -5
  10. data/lib/scout/entity/property.rb +2 -2
  11. data/lib/scout/entity.rb +1 -1
  12. data/lib/scout/knowledge_base/description.rb +10 -10
  13. data/lib/scout/knowledge_base/entity.rb +6 -6
  14. data/lib/scout/knowledge_base/list.rb +1 -1
  15. data/lib/scout/knowledge_base/query.rb +4 -4
  16. data/lib/scout/knowledge_base/registry.rb +6 -6
  17. data/lib/scout/knowledge_base/traverse.rb +7 -40
  18. data/lib/scout/persist/engine/fix_width_table.rb +6 -6
  19. data/lib/scout/persist/engine/packed_index.rb +2 -2
  20. data/lib/scout/persist/engine/sharder.rb +4 -4
  21. data/lib/scout/persist/engine/tkrzw.rb +1 -1
  22. data/lib/scout/persist/engine/tokyocabinet.rb +2 -2
  23. data/lib/scout/persist/tsv/adapter/fix_width_table.rb +1 -1
  24. data/lib/scout/persist/tsv/adapter/packed_index.rb +1 -1
  25. data/lib/scout/persist/tsv/adapter/tkrzw.rb +1 -1
  26. data/lib/scout/persist/tsv/adapter/tokyocabinet.rb +3 -3
  27. data/lib/scout/persist/tsv/serialize.rb +3 -3
  28. data/lib/scout/persist/tsv.rb +1 -1
  29. data/lib/scout/semaphore.rb +100 -17
  30. data/lib/scout/tsv/annotation/repo.rb +4 -4
  31. data/lib/scout/tsv/annotation.rb +2 -2
  32. data/lib/scout/tsv/attach.rb +7 -7
  33. data/lib/scout/tsv/change_id/translate.rb +1 -1
  34. data/lib/scout/tsv/csv.rb +3 -3
  35. data/lib/scout/tsv/dumper.rb +8 -8
  36. data/lib/scout/tsv/index.rb +1 -1
  37. data/lib/scout/tsv/open.rb +3 -3
  38. data/lib/scout/tsv/stream.rb +2 -2
  39. data/lib/scout/tsv/traverse.rb +4 -4
  40. data/lib/scout/tsv/util/filter.rb +9 -9
  41. data/lib/scout/tsv/util/process.rb +2 -2
  42. data/lib/scout/tsv/util/reorder.rb +2 -2
  43. data/lib/scout/tsv/util/select.rb +3 -3
  44. data/lib/scout/tsv/util/unzip.rb +2 -2
  45. data/lib/scout/tsv/util.rb +1 -1
  46. data/lib/scout/tsv.rb +2 -2
  47. data/lib/scout/work_queue/socket.rb +3 -2
  48. data/lib/scout/work_queue/worker.rb +4 -4
  49. data/lib/scout/work_queue.rb +7 -7
  50. data/lib/scout/workflow/definition.rb +18 -16
  51. data/lib/scout/workflow/deployment/local.rb +81 -62
  52. data/lib/scout/workflow/deployment/orchestrator/batches.rb +66 -5
  53. data/lib/scout/workflow/deployment/orchestrator/chains.rb +47 -30
  54. data/lib/scout/workflow/deployment/orchestrator/rules.rb +3 -3
  55. data/lib/scout/workflow/deployment/orchestrator/workload.rb +11 -22
  56. data/lib/scout/workflow/deployment/scheduler/job.rb +34 -36
  57. data/lib/scout/workflow/deployment/scheduler/lfs.rb +1 -1
  58. data/lib/scout/workflow/deployment/scheduler/pbs.rb +4 -4
  59. data/lib/scout/workflow/deployment/scheduler/slurm.rb +2 -2
  60. data/lib/scout/workflow/deployment/scheduler.rb +23 -12
  61. data/lib/scout/workflow/deployment/trace.rb +2 -2
  62. data/lib/scout/workflow/documentation.rb +4 -4
  63. data/lib/scout/workflow/export.rb +1 -1
  64. data/lib/scout/workflow/path.rb +2 -2
  65. data/lib/scout/workflow/step/children.rb +1 -1
  66. data/lib/scout/workflow/step/dependencies.rb +36 -3
  67. data/lib/scout/workflow/step/info.rb +5 -19
  68. data/lib/scout/workflow/step/inputs.rb +1 -1
  69. data/lib/scout/workflow/step/progress.rb +2 -2
  70. data/lib/scout/workflow/step/provenance.rb +4 -4
  71. data/lib/scout/workflow/step/status.rb +23 -9
  72. data/lib/scout/workflow/step.rb +21 -19
  73. data/lib/scout/workflow/task/dependencies.rb +10 -3
  74. data/lib/scout/workflow/task/info.rb +3 -3
  75. data/lib/scout/workflow/task/inputs.rb +8 -8
  76. data/lib/scout/workflow/task.rb +37 -22
  77. data/lib/scout/workflow/usage.rb +13 -13
  78. data/lib/scout/workflow/util.rb +1 -1
  79. data/lib/scout/workflow.rb +6 -6
  80. data/scout-gear.gemspec +4 -3
  81. data/scout_commands/alias +1 -1
  82. data/scout_commands/batch/clean +12 -12
  83. data/scout_commands/batch/list +26 -25
  84. data/scout_commands/batch/tail +9 -5
  85. data/scout_commands/cat +1 -1
  86. data/scout_commands/doc +2 -2
  87. data/scout_commands/entity +4 -4
  88. data/scout_commands/find +1 -1
  89. data/scout_commands/kb/config +1 -1
  90. data/scout_commands/kb/entities +1 -1
  91. data/scout_commands/kb/list +1 -1
  92. data/scout_commands/kb/query +2 -2
  93. data/scout_commands/kb/register +1 -1
  94. data/scout_commands/kb/show +1 -1
  95. data/scout_commands/kb/traverse +1 -1
  96. data/scout_commands/log +6 -6
  97. data/scout_commands/resource/produce +2 -2
  98. data/scout_commands/resource/sync +1 -1
  99. data/scout_commands/system/clean +7 -7
  100. data/scout_commands/system/status +4 -4
  101. data/scout_commands/template +1 -1
  102. data/scout_commands/update +1 -1
  103. data/scout_commands/workflow/cmd +2 -1
  104. data/scout_commands/workflow/example +123 -0
  105. data/scout_commands/workflow/info +10 -1
  106. data/scout_commands/workflow/install +1 -1
  107. data/scout_commands/workflow/list +2 -2
  108. data/scout_commands/workflow/process +2 -2
  109. data/scout_commands/workflow/prov +3 -3
  110. data/scout_commands/workflow/task +36 -11
  111. data/scout_commands/workflow/trace +1 -1
  112. data/scout_commands/workflow/write_info +2 -2
  113. data/share/templates/command +1 -1
  114. data/test/scout/association/test_item.rb +5 -0
  115. data/test/scout/entity/test_property.rb +3 -3
  116. data/test/scout/knowledge_base/test_description.rb +1 -1
  117. data/test/scout/knowledge_base/test_traverse.rb +2 -2
  118. data/test/scout/persist/engine/test_packed_index.rb +6 -6
  119. data/test/scout/persist/test_tsv.rb +4 -4
  120. data/test/scout/persist/tsv/adapter/test_packed_index.rb +4 -4
  121. data/test/scout/persist/tsv/adapter/test_sharder.rb +23 -23
  122. data/test/scout/persist/tsv/adapter/test_tokyocabinet.rb +1 -1
  123. data/test/scout/persist/tsv/test_serialize.rb +1 -1
  124. data/test/scout/test_association.rb +1 -1
  125. data/test/scout/test_tsv.rb +2 -2
  126. data/test/scout/test_workflow.rb +2 -2
  127. data/test/scout/tsv/test_annotation.rb +4 -4
  128. data/test/scout/tsv/test_index.rb +1 -1
  129. data/test/scout/tsv/test_open.rb +2 -2
  130. data/test/scout/tsv/test_parser.rb +2 -2
  131. data/test/scout/tsv/test_stream.rb +1 -1
  132. data/test/scout/tsv/test_transformer.rb +1 -1
  133. data/test/scout/tsv/util/test_filter.rb +1 -1
  134. data/test/scout/tsv/util/test_melt.rb +1 -1
  135. data/test/scout/tsv/util/test_reorder.rb +1 -1
  136. data/test/scout/work_queue/test_socket.rb +3 -3
  137. data/test/scout/work_queue/test_worker.rb +2 -2
  138. data/test/scout/workflow/deployment/orchestrator/test_batches.rb +13 -3
  139. data/test/scout/workflow/deployment/orchestrator/test_chains.rb +15 -13
  140. data/test/scout/workflow/deployment/orchestrator/test_workload.rb +1 -1
  141. data/test/scout/workflow/deployment/test_local.rb +2 -2
  142. data/test/scout/workflow/deployment/test_scheduler.rb +1 -2
  143. data/test/scout/workflow/step/test_children.rb +1 -1
  144. data/test/scout/workflow/step/test_dependencies.rb +36 -1
  145. data/test/scout/workflow/step/test_info.rb +3 -35
  146. data/test/scout/workflow/step/test_load.rb +1 -1
  147. data/test/scout/workflow/step/test_provenance.rb +1 -1
  148. data/test/scout/workflow/step/test_status.rb +33 -1
  149. data/test/scout/workflow/task/test_dependencies.rb +9 -7
  150. data/test/scout/workflow/task/test_inputs.rb +1 -1
  151. data/test/scout/workflow/test_definition.rb +1 -1
  152. data/test/scout/workflow/test_documentation.rb +1 -1
  153. data/test/scout/workflow/test_entity.rb +2 -2
  154. data/test/scout/workflow/test_step.rb +13 -13
  155. data/test/scout/workflow/test_usage.rb +1 -1
  156. data/test/test_helper.rb +1 -1
  157. metadata +3 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f4ce69534bfbce4c385cfc9c23b280c6bb935a9f7228afbf7e585c3f093a5a18
4
- data.tar.gz: 98dee8673df93baf527d75df6fb9358b9ec1ec54a37e60c38f0bcb34920fb124
3
+ metadata.gz: 46332850d0c2cee351bade4c0b7a1d6a46fedebc7de433cc1f0c94d8c3813063
4
+ data.tar.gz: 1a129853fc38015166f689e3ceb23723c44233fb902977155c5c9c617cf39cba
5
5
  SHA512:
6
- metadata.gz: 81b897cea0e0d4153fd1d97cae601a17dc75c4c36ebb0c6fe0699a4440d3b7baddbb501fbdb48c409f89386379fcc153a67b7b53b71f95d460366c6993637986
7
- data.tar.gz: d0cb23b7fa0b9b04e5719cab7ee365231105fb16e32f62aed37c22f886054de9538922b07cc4495371eb1356fbc9b98707ebfb23635dee847564623b53c50bce
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.4
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, Misc.zip_fields(target_values)]
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
@@ -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
@@ -47,7 +47,7 @@ class KnowledgeBase
47
47
 
48
48
  def load_list(id, entity_type = nil)
49
49
  if entity_type
50
- path = list_file(id, entity_type)
50
+ path = list_file(id, entity_type)
51
51
  path = list_file(id) unless path.exists?
52
52
  else
53
53
  path = list_file(id)
@@ -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?