forester 1.1.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/forester/aggregators.rb +17 -16
- data/lib/forester/node_content.rb +2 -2
- data/lib/forester/tree_node.rb +1 -8
- data/lib/forester/version.rb +2 -2
- data/test/test_treenode.rb +1 -3
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a837fb2321275845b5c51622079d41896966145e
|
4
|
+
data.tar.gz: 5e1deb643c9233e5d376839948ac74a369bb5e13
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9622068a5b9e8d56dddd96b87e7553d377390b7cfc25d14154dbe4255a30fc6f83f260cf2c8f038728aed4a77f893e161588e475b96de40dfd86f9f86e916ce8
|
7
|
+
data.tar.gz: 8b7b017668323e9c00544518944fdbf1cf7595cdb08b33986d119bf52add39da096cbf3372c73bd4c2b2f7c31631c90a330aa3e3946ce3e93930798eead421a6
|
data/lib/forester/aggregators.rb
CHANGED
@@ -1,16 +1,24 @@
|
|
1
1
|
module Forester
|
2
2
|
module Aggregators
|
3
3
|
|
4
|
-
def
|
4
|
+
def with_ancestry(options = {})
|
5
5
|
default_options = {
|
6
|
-
|
7
|
-
|
6
|
+
include_root: true,
|
7
|
+
include_self: true,
|
8
|
+
descending: true
|
8
9
|
}
|
9
|
-
|
10
10
|
options = default_options.merge(options)
|
11
11
|
|
12
|
+
ancestors = self.parentage || []
|
13
|
+
ancestors = ancestors[0...-1] unless options[:include_root]
|
14
|
+
ancestors = ancestors.unshift(self) if options[:include_self]
|
15
|
+
if options[:descending] then ancestors.reverse else ancestors end
|
16
|
+
end
|
17
|
+
|
18
|
+
def own_and_descendants(field_name, &if_field_missing)
|
19
|
+
if_field_missing = -> (node) { [] } unless block_given?
|
12
20
|
flat_map do |node|
|
13
|
-
Array(node.get(
|
21
|
+
Array(node.get(field_name, &if_field_missing))
|
14
22
|
end
|
15
23
|
end
|
16
24
|
|
@@ -33,7 +41,7 @@ module Forester
|
|
33
41
|
|
34
42
|
found_nodes.flat_map do |node|
|
35
43
|
if options[:include_descendants]
|
36
|
-
node.own_and_descendants(
|
44
|
+
node.own_and_descendants(options[:values_key])
|
37
45
|
else
|
38
46
|
node.get(options[:values_key])
|
39
47
|
end
|
@@ -46,29 +54,22 @@ module Forester
|
|
46
54
|
level: 1,
|
47
55
|
group_field: 'name',
|
48
56
|
aggregation_field: 'value',
|
49
|
-
if_field_missing: -> (
|
57
|
+
if_field_missing: -> (node) { [] },
|
50
58
|
include_ancestry_in_keys: false, # if false, with_root is ignored
|
51
59
|
with_root: false,
|
52
60
|
}
|
53
|
-
|
54
61
|
options = default_options.merge(options)
|
55
62
|
|
56
63
|
nodes_of_level(options[:level]).each_with_object({}) do |node, hash|
|
57
64
|
|
58
65
|
key_nodes = if options[:include_ancestry_in_keys]
|
59
|
-
node.
|
66
|
+
node.with_ancestry({ include_root: options[:with_root] })
|
60
67
|
else
|
61
68
|
node
|
62
69
|
end
|
63
70
|
|
64
71
|
key = key_nodes.map { |kn| kn.get(options[:group_field]) { |n| n.object_id } }
|
65
|
-
|
66
|
-
value = node.own_and_descendants(
|
67
|
-
{
|
68
|
-
field: options[:aggregation_field],
|
69
|
-
if_field_missing: options[:if_field_missing]
|
70
|
-
}
|
71
|
-
)
|
72
|
+
value = node.own_and_descendants(options[:aggregation_field], &options[:if_field_missing])
|
72
73
|
|
73
74
|
hash[key] = value
|
74
75
|
end
|
@@ -21,9 +21,9 @@ module Forester
|
|
21
21
|
|
22
22
|
def method_missing(name, *args, &block)
|
23
23
|
if @hash.has_key?(name)
|
24
|
-
@hash
|
24
|
+
@hash[name]
|
25
25
|
elsif block_given?
|
26
|
-
yield self
|
26
|
+
yield args.fetch(0, {yield_to: self})[:yield_to]
|
27
27
|
else
|
28
28
|
raise ArgumentError.new("the node \"#{self.name}\" does not have any \"#{name}\"")
|
29
29
|
end
|
data/lib/forester/tree_node.rb
CHANGED
@@ -5,13 +5,6 @@ module Forester
|
|
5
5
|
include Mutators
|
6
6
|
include Views
|
7
7
|
|
8
|
-
def ancestry(include_root = true, include_self = false, descending = true)
|
9
|
-
ancestors = self.parentage || []
|
10
|
-
ancestors = ancestors[0...-1] unless include_root
|
11
|
-
ancestors = ancestors.unshift(self) if include_self
|
12
|
-
if descending then ancestors.reverse else ancestors end
|
13
|
-
end
|
14
|
-
|
15
8
|
def nodes_of_level(l)
|
16
9
|
if l.between?(0, max_level) then each_level.take(l + 1).last else [] end
|
17
10
|
end
|
@@ -35,7 +28,7 @@ module Forester
|
|
35
28
|
alias_method :each_node, :breadth_each
|
36
29
|
|
37
30
|
def get(field, &block)
|
38
|
-
content.public_send(field, &block)
|
31
|
+
content.public_send(field, { yield_to: self }, &block)
|
39
32
|
end
|
40
33
|
|
41
34
|
def field_names
|
data/lib/forester/version.rb
CHANGED
data/test/test_treenode.rb
CHANGED
@@ -64,9 +64,7 @@ class TestTreeNode < Minitest::Test
|
|
64
64
|
assert_equal 1, found_nodes.length
|
65
65
|
|
66
66
|
actual_names = found_nodes.flat_map do |node|
|
67
|
-
node.own_and_descendants(
|
68
|
-
field: 'strings'
|
69
|
-
})
|
67
|
+
node.own_and_descendants('strings')
|
70
68
|
end
|
71
69
|
|
72
70
|
assert_equal expected_names, actual_names
|