forester 0.1.0 → 1.0.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/forester.gemspec +2 -3
- data/lib/forester/aggregators.rb +51 -38
- data/lib/forester/tree_node.rb +3 -30
- data/lib/forester/version.rb +2 -2
- data/lib/forester.rb +0 -1
- metadata +4 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0b068adf6d25cfadca224f86d1b64a7668fadf5d
|
4
|
+
data.tar.gz: 9d4494437e8bc4387b4254217e178a41890c2a3c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a0e0684ef70d37ddfd9e4751ecaad5a8fe3fcd03d06a33f0f05158882295e31192a09a9478b1dfdf0323f91934827a68c4b78c5dc3ad2624c6ad6e429b248c9a
|
7
|
+
data.tar.gz: b5619bcb98e2ca43789f8422cd33c38747997fc695c7dad7bdee14676d728f4cbaa152ea3b4b4b207c2ad53197a1a65e545e857d2febbb42e5e988a581165735
|
data/forester.gemspec
CHANGED
@@ -6,9 +6,9 @@ require 'forester/version'
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = 'forester'
|
8
8
|
s.version = Forester::Version
|
9
|
-
s.date = '2016-07-
|
9
|
+
s.date = '2016-07-26'
|
10
10
|
s.summary = "A gem to represent and interact with tree data structures"
|
11
|
-
s.description = "Based on rubytree
|
11
|
+
s.description = "Based on rubytree, this gem lets you build trees and run queries against them."
|
12
12
|
s.authors = ["Eugenio Bruno"]
|
13
13
|
s.email = 'eugeniobruno@gmail.com'
|
14
14
|
s.homepage = 'http://rubygems.org/gems/forester'
|
@@ -22,7 +22,6 @@ Gem::Specification.new do |s|
|
|
22
22
|
s.required_ruby_version = '>= 2.0.0'
|
23
23
|
|
24
24
|
s.add_runtime_dependency 'rubytree', ['0.9.7']
|
25
|
-
s.add_runtime_dependency 'enzymator', ['1.0.0']
|
26
25
|
|
27
26
|
s.add_development_dependency 'rake', ['~> 11.2']
|
28
27
|
s.add_development_dependency 'minitest', ['~> 5.9']
|
data/lib/forester/aggregators.rb
CHANGED
@@ -4,20 +4,41 @@ module Forester
|
|
4
4
|
def own_and_descendants(options = {})
|
5
5
|
default_options = {
|
6
6
|
field: 'name',
|
7
|
-
if_field_missing: ->(c) { [] },
|
7
|
+
if_field_missing: -> (c) { [] },
|
8
8
|
}
|
9
9
|
|
10
10
|
options = default_options.merge(options)
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
12
|
+
flat_map do |node|
|
13
|
+
Array(node.get(options[:field], &options[:if_field_missing]))
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def values_by_field(options)
|
18
|
+
default_options = {
|
19
|
+
field_to_search: 'name',
|
20
|
+
search_keyword: :missing_search_keyword,
|
21
|
+
values_key: :missing_values_key,
|
22
|
+
include_descendants: false,
|
23
|
+
assume_uniqueness: false
|
24
|
+
}
|
25
|
+
options = default_options.merge(options)
|
26
|
+
|
27
|
+
found_nodes = nodes_with(options[:field_to_search], options[:search_keyword])
|
28
|
+
|
29
|
+
# When assuming that node names are unique,
|
30
|
+
# if more than one node was found,
|
31
|
+
# discard all but the first one
|
32
|
+
found_nodes = found_nodes.slice(0, 1) if options[:assume_uniqueness]
|
33
|
+
|
34
|
+
found_nodes.flat_map do |node|
|
35
|
+
if options[:include_descendants]
|
36
|
+
node.own_and_descendants({ field: options[:values_key] })
|
37
|
+
else
|
38
|
+
node.get(options[:values_key])
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
21
42
|
end
|
22
43
|
|
23
44
|
def values_by_subtree_of_level(options = {})
|
@@ -25,40 +46,32 @@ module Forester
|
|
25
46
|
level: 1,
|
26
47
|
group_field: 'name',
|
27
48
|
aggregation_field: 'value',
|
28
|
-
if_field_missing: ->(c) { [] },
|
49
|
+
if_field_missing: -> (c) { [] },
|
29
50
|
include_ancestry_in_keys: false, # if false, with_root is ignored
|
30
51
|
with_root: false,
|
31
52
|
}
|
32
53
|
|
33
54
|
options = default_options.merge(options)
|
34
55
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
)
|
55
|
-
|
56
|
-
{ key => value }
|
57
|
-
},
|
58
|
-
# reduction: ->(acum, hash) { acum.merge(hash) }
|
59
|
-
# empty: {}
|
60
|
-
# automatically assumed
|
61
|
-
}).run_on(input)
|
56
|
+
nodes_of_level(options[:level]).each_with_object({}) do |node, hash|
|
57
|
+
|
58
|
+
key_nodes = if options[:include_ancestry_in_keys]
|
59
|
+
node.ancestry(options[:with_root], true)
|
60
|
+
else
|
61
|
+
node
|
62
|
+
end
|
63
|
+
|
64
|
+
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
|
+
|
73
|
+
hash[key] = value
|
74
|
+
end
|
62
75
|
end
|
63
76
|
|
64
77
|
end
|
data/lib/forester/tree_node.rb
CHANGED
@@ -4,9 +4,9 @@ module Forester
|
|
4
4
|
include Aggregators
|
5
5
|
|
6
6
|
def ancestry(include_root = true, include_self = false, descending = true)
|
7
|
-
ancestors = self.parentage
|
8
|
-
ancestors = ancestors[0...-1]
|
9
|
-
ancestors = ancestors.unshift(self)
|
7
|
+
ancestors = self.parentage || []
|
8
|
+
ancestors = ancestors[0...-1] unless include_root
|
9
|
+
ancestors = ancestors.unshift(self) if include_self
|
10
10
|
if descending then ancestors.reverse else ancestors end
|
11
11
|
end
|
12
12
|
|
@@ -28,33 +28,6 @@ module Forester
|
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
-
def values_by_field(options)
|
32
|
-
default_options = {
|
33
|
-
field_to_search: 'name',
|
34
|
-
search_keyword: :missing_search_keyword,
|
35
|
-
values_key: :missing_values_key,
|
36
|
-
include_descendants: false,
|
37
|
-
assume_uniqueness: false
|
38
|
-
}
|
39
|
-
options = default_options.merge(options)
|
40
|
-
|
41
|
-
found_nodes = nodes_with(options[:field_to_search], options[:search_keyword])
|
42
|
-
|
43
|
-
# When assuming that node names are unique,
|
44
|
-
# if more than one node was found,
|
45
|
-
# discard all but the first one
|
46
|
-
found_nodes = found_nodes.slice(0, 1) if options[:assume_uniqueness]
|
47
|
-
|
48
|
-
found_nodes.flat_map do |node|
|
49
|
-
if options[:include_descendants]
|
50
|
-
node.own_and_descendants({ field: options[:values_key] })
|
51
|
-
else
|
52
|
-
node.get(options[:values_key])
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
end
|
57
|
-
|
58
31
|
def nodes_with(content_key, content_value)
|
59
32
|
each_node.select { |node| Array(node.get(content_key) { :no_match }).include? content_value }
|
60
33
|
end
|
data/lib/forester/version.rb
CHANGED
data/lib/forester.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: forester
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eugenio Bruno
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-07-
|
11
|
+
date: 2016-07-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubytree
|
@@ -24,20 +24,6 @@ dependencies:
|
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 0.9.7
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: enzymator
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - '='
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 1.0.0
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - '='
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: 1.0.0
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
28
|
name: rake
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,8 +66,8 @@ dependencies:
|
|
80
66
|
- - "~>"
|
81
67
|
- !ruby/object:Gem::Version
|
82
68
|
version: '3.4'
|
83
|
-
description: Based on rubytree
|
84
|
-
|
69
|
+
description: Based on rubytree, this gem lets you build trees and run queries against
|
70
|
+
them.
|
85
71
|
email: eugeniobruno@gmail.com
|
86
72
|
executables: []
|
87
73
|
extensions: []
|