locabulary 0.5.1 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/locabulary/commands/active_hierarchical_roots_command.rb +16 -23
- data/lib/locabulary/commands/build_ordered_hierarchical_tree_command.rb +7 -25
- data/lib/locabulary/facet_wrapper_for_item.rb +1 -0
- data/lib/locabulary/hierarchy_processor.rb +53 -0
- data/lib/locabulary/items/base.rb +6 -0
- data/lib/locabulary/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 278eebac39c183be338728d67f3be9fab289bc96
|
4
|
+
data.tar.gz: 6ed77a8d3f22e607c0a083cbe1f14c22e83ef835
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: be8235aa07b3e25f76d51ec1559d0d1050430ce54bf3156be255e8bbb7b88d426f60dc1ea1680a11c49000567663dc83615a343a5410fcfb82b2b87639601478
|
7
|
+
data.tar.gz: 58887e1e050416cec0011b9f4d1e8848e2a06107c2387401987cb2262cd97f48a32b6f0358a1ede2ec52f8987e947d3ca02603939e7fa3aba237e823043fe338
|
@@ -2,6 +2,7 @@ require 'set'
|
|
2
2
|
require 'date'
|
3
3
|
require 'locabulary/item'
|
4
4
|
require 'locabulary/exceptions'
|
5
|
+
require 'locabulary/hierarchy_processor'
|
5
6
|
|
6
7
|
module Locabulary
|
7
8
|
module Commands
|
@@ -37,42 +38,34 @@ module Locabulary
|
|
37
38
|
def initialize(options = {})
|
38
39
|
@predicate_name = options.fetch(:predicate_name)
|
39
40
|
@as_of = options.fetch(:as_of) { Date.today }
|
40
|
-
@
|
41
|
+
@locabulary_item_class = Item.class_to_instantiate(predicate_name: predicate_name)
|
41
42
|
@utility_service = options.fetch(:utility_service) { default_utility_service }
|
42
43
|
end
|
43
44
|
|
44
45
|
def call
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
items << item
|
51
|
-
top_level_slugs << item.root_slug
|
52
|
-
hierarchy_graph_keys[item.term_label] = item
|
53
|
-
end
|
54
|
-
associate_parents_and_childrens_for(hierarchy_graph_keys, items)
|
55
|
-
top_level_slugs.map { |slug| hierarchy_graph_keys.fetch(slug) }
|
46
|
+
HierarchyProcessor.call(
|
47
|
+
enumerator: data_enumerator,
|
48
|
+
item_builder: item_builder,
|
49
|
+
predicate_name: predicate_name
|
50
|
+
)
|
56
51
|
end
|
57
52
|
|
58
53
|
private
|
59
54
|
|
60
|
-
|
55
|
+
def data_enumerator
|
56
|
+
->(&block) { utility_service.with_active_extraction_for(predicate_name, as_of, &block) }
|
57
|
+
end
|
58
|
+
|
59
|
+
def item_builder
|
60
|
+
->(data) { locabulary_item_class.new(data.merge('predicate_name' => predicate_name)) }
|
61
|
+
end
|
62
|
+
|
63
|
+
attr_reader :predicate_name, :as_of, :locabulary_item_class, :utility_service
|
61
64
|
|
62
65
|
def default_utility_service
|
63
66
|
require 'locabulary/utility'
|
64
67
|
Utility
|
65
68
|
end
|
66
|
-
|
67
|
-
def associate_parents_and_childrens_for(hierarchy_graph_keys, items)
|
68
|
-
items.each do |item|
|
69
|
-
begin
|
70
|
-
hierarchy_graph_keys.fetch(item.parent_term_label).add_child(item) unless item.parent_slugs.empty?
|
71
|
-
rescue KeyError => error
|
72
|
-
raise Exceptions::MissingHierarchicalParentError.new(predicate_name, error)
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
69
|
end
|
77
70
|
end
|
78
71
|
end
|
@@ -3,6 +3,7 @@ require 'locabulary'
|
|
3
3
|
require 'locabulary/exceptions'
|
4
4
|
require 'locabulary/item'
|
5
5
|
require 'locabulary/facet_wrapper_for_item'
|
6
|
+
require 'locabulary/hierarchy_processor'
|
6
7
|
|
7
8
|
module Locabulary
|
8
9
|
module Commands
|
@@ -31,33 +32,17 @@ module Locabulary
|
|
31
32
|
end
|
32
33
|
|
33
34
|
def call
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
items << item
|
40
|
-
top_level_slugs << item.root_slug
|
41
|
-
hierarchy_graph_keys[item.term_label] = item
|
42
|
-
end
|
43
|
-
associate_parents_and_childrens_for(hierarchy_graph_keys, items)
|
44
|
-
top_level_slugs.map { |slug| hierarchy_graph_keys.fetch(slug) }.sort
|
35
|
+
HierarchyProcessor.call(
|
36
|
+
enumerator: faceted_items.method(:each),
|
37
|
+
item_builder: method(:build_item),
|
38
|
+
predicate_name: predicate_name
|
39
|
+
)
|
45
40
|
end
|
46
41
|
|
47
42
|
private
|
48
43
|
|
49
44
|
attr_reader :locabulary_item_class, :predicate_name, :faceted_items, :faceted_item_hierarchy_delimiter
|
50
45
|
|
51
|
-
def associate_parents_and_childrens_for(hierarchy_graph_keys, items)
|
52
|
-
items.each do |item|
|
53
|
-
begin
|
54
|
-
hierarchy_graph_keys.fetch(item.parent_term_label).add_child(item) unless item.parent_slugs.empty?
|
55
|
-
rescue KeyError => error
|
56
|
-
raise Exceptions::MissingHierarchicalParentError.new(predicate_name, error)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
46
|
def build_item(faceted_node)
|
62
47
|
term_label = convert_faceted_node_value_to_term_label(faceted_node.value)
|
63
48
|
locabulary_item = find_locabulary_item(predicate_name: predicate_name, term_label: term_label)
|
@@ -79,10 +64,7 @@ module Locabulary
|
|
79
64
|
|
80
65
|
# Responsible for converting the hierarchy delimiter of the facet item to the hierarchy delimiter of the Locabulary::Item.
|
81
66
|
def convert_faceted_node_value_to_term_label(value)
|
82
|
-
value.
|
83
|
-
/(?<!#{faceted_item_hierarchy_delimiter})#{faceted_item_hierarchy_delimiter}(?!#{faceted_item_hierarchy_delimiter})/,
|
84
|
-
locabulary_item_class.hierarchy_delimiter
|
85
|
-
)
|
67
|
+
value.split(faceted_item_hierarchy_delimiter).join(locabulary_item_class.hierarchy_delimiter)
|
86
68
|
end
|
87
69
|
end
|
88
70
|
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# :nodoc:
|
2
|
+
module Locabulary
|
3
|
+
# @api private
|
4
|
+
#
|
5
|
+
# Responsible for processing an flat enumeration of data and creating
|
6
|
+
# a sorted hierarchy.
|
7
|
+
#
|
8
|
+
# @note This is an extraction of common logic found in two separate classes.
|
9
|
+
class HierarchyProcessor
|
10
|
+
def self.call(options = {})
|
11
|
+
new(options).call
|
12
|
+
end
|
13
|
+
|
14
|
+
# @param options [Hash]
|
15
|
+
# @option options [#call] :item_builder - when called will create a Locabulary::Items::Base object
|
16
|
+
# @option options [#call] :predicate_name -
|
17
|
+
# @option options [#call] :enumerator - when called will yield an enumerated_object to the item_builder
|
18
|
+
def initialize(options = {})
|
19
|
+
@item_builder = options.fetch(:item_builder)
|
20
|
+
@predicate_name = options.fetch(:predicate_name)
|
21
|
+
@enumerator = options.fetch(:enumerator)
|
22
|
+
end
|
23
|
+
|
24
|
+
def call
|
25
|
+
items = []
|
26
|
+
hierarchy_graph_keys = {}
|
27
|
+
top_level_slugs = Set.new
|
28
|
+
enumerator.call do |enumerated_object|
|
29
|
+
item = item_builder.call(enumerated_object)
|
30
|
+
items << item
|
31
|
+
top_level_slugs << item.root_slug
|
32
|
+
hierarchy_graph_keys[item.term_label] = item
|
33
|
+
end
|
34
|
+
associate_parents_and_childrens_for(hierarchy_graph_keys, items)
|
35
|
+
top_level_slugs.map { |slug| hierarchy_graph_keys.fetch(slug) }.sort
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
attr_reader :item_builder, :predicate_name, :enumerator
|
41
|
+
|
42
|
+
def associate_parents_and_childrens_for(hierarchy_graph_keys, items)
|
43
|
+
items.each do |item|
|
44
|
+
begin
|
45
|
+
hierarchy_graph_keys.fetch(item.parent_term_label).add_child(item) unless item.parent_slugs.empty?
|
46
|
+
rescue KeyError => error
|
47
|
+
raise Exceptions::MissingHierarchicalParentError.new(predicate_name, error)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
private_constant :HierarchyProcessor
|
53
|
+
end
|
@@ -135,11 +135,17 @@ module Locabulary
|
|
135
135
|
children.count.zero?
|
136
136
|
end
|
137
137
|
|
138
|
+
# When rendered as part of a select list
|
138
139
|
def selectable_label
|
139
140
|
slugs[-1]
|
140
141
|
end
|
141
142
|
|
142
143
|
alias selectable_id id
|
144
|
+
|
145
|
+
# When rendered as part of a facet list
|
146
|
+
def hierarchy_facet_label
|
147
|
+
slugs[-1]
|
148
|
+
end
|
143
149
|
end
|
144
150
|
end
|
145
151
|
end
|
data/lib/locabulary/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: locabulary
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Friesen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-08-
|
11
|
+
date: 2016-08-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -263,6 +263,7 @@ files:
|
|
263
263
|
- lib/locabulary/commands/build_ordered_hierarchical_tree_command.rb
|
264
264
|
- lib/locabulary/exceptions.rb
|
265
265
|
- lib/locabulary/facet_wrapper_for_item.rb
|
266
|
+
- lib/locabulary/hierarchy_processor.rb
|
266
267
|
- lib/locabulary/item.rb
|
267
268
|
- lib/locabulary/items.rb
|
268
269
|
- lib/locabulary/items/administrative_unit.rb
|