forester 1.0.0 → 1.1.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/Rakefile +1 -1
- data/lib/forester.rb +2 -0
- data/lib/forester/aggregators.rb +1 -1
- data/lib/forester/mutators.rb +14 -0
- data/lib/forester/node_content.rb +14 -0
- data/lib/forester/node_content_factory.rb +1 -1
- data/lib/forester/tree_node.rb +9 -7
- data/lib/forester/version.rb +1 -1
- data/lib/forester/views.rb +22 -0
- data/test/test_mutators.rb +23 -0
- data/test/test_treenode.rb +1 -1
- data/test/test_views.rb +25 -0
- metadata +7 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 268ad2f30fdb06a9fbc2fe57e2f044a1a234639a
|
4
|
+
data.tar.gz: 008ea947763719e1d4c1ea5101a8d889979907f9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1fa2bd80e48031e9ccc8e269e20a3b60266252f4f857c046cfa2e53bbf7599eb6f5270b5c6724f628d8cecbe66f8d198f0c96f4e2dc660999c456326b2d6d047
|
7
|
+
data.tar.gz: ed777a43b80efdf961a89e7dd03010b432096e9236b6f48cf64a25b12cb96941f9eef1bfecec60664008630ecc40a7cd3098d8689956c5999d9c67471adfc618
|
data/Rakefile
CHANGED
data/lib/forester.rb
CHANGED
data/lib/forester/aggregators.rb
CHANGED
@@ -0,0 +1,14 @@
|
|
1
|
+
module Forester
|
2
|
+
module Mutators
|
3
|
+
|
4
|
+
def add_field!(name, definition)
|
5
|
+
value = if definition.respond_to? :call then definition.call(self) else definition end
|
6
|
+
content.set!(name, value)
|
7
|
+
end
|
8
|
+
|
9
|
+
def add_field_to_subtree!(name, definition)
|
10
|
+
each_node { |node| node.add_field!(name, definition) }
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
@@ -5,6 +5,20 @@ module Forester
|
|
5
5
|
@hash = HashWithIndifferentAccess.new(hash)
|
6
6
|
end
|
7
7
|
|
8
|
+
def field_names
|
9
|
+
@hash.keys
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_hash
|
13
|
+
@hash.each_with_object({}) do |(k, v), hash|
|
14
|
+
hash[k.to_sym] = v
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def set!(key, value)
|
19
|
+
@hash[key] = value
|
20
|
+
end
|
21
|
+
|
8
22
|
def method_missing(name, *args, &block)
|
9
23
|
if @hash.has_key?(name)
|
10
24
|
@hash.fetch(name)
|
data/lib/forester/tree_node.rb
CHANGED
@@ -2,6 +2,8 @@ module Forester
|
|
2
2
|
class TreeNode < Tree::TreeNode
|
3
3
|
|
4
4
|
include Aggregators
|
5
|
+
include Mutators
|
6
|
+
include Views
|
5
7
|
|
6
8
|
def ancestry(include_root = true, include_self = false, descending = true)
|
7
9
|
ancestors = self.parentage || []
|
@@ -14,9 +16,7 @@ module Forester
|
|
14
16
|
if l.between?(0, max_level) then each_level.take(l + 1).last else [] end
|
15
17
|
end
|
16
18
|
|
17
|
-
|
18
|
-
node_height
|
19
|
-
end
|
19
|
+
alias_method :max_level, :node_height
|
20
20
|
|
21
21
|
def each_level
|
22
22
|
Enumerator.new do |yielder|
|
@@ -32,16 +32,18 @@ module Forester
|
|
32
32
|
each_node.select { |node| Array(node.get(content_key) { :no_match }).include? content_value }
|
33
33
|
end
|
34
34
|
|
35
|
+
alias_method :each_node, :breadth_each
|
36
|
+
|
35
37
|
def get(field, &block)
|
36
38
|
content.public_send(field, &block)
|
37
39
|
end
|
38
40
|
|
39
|
-
def
|
40
|
-
|
41
|
+
def field_names
|
42
|
+
content.field_names
|
41
43
|
end
|
42
44
|
|
43
|
-
def
|
44
|
-
|
45
|
+
def contents
|
46
|
+
each_node.map(&:content)
|
45
47
|
end
|
46
48
|
|
47
49
|
end
|
data/lib/forester/version.rb
CHANGED
@@ -0,0 +1,22 @@
|
|
1
|
+
module Forester
|
2
|
+
module Views
|
3
|
+
|
4
|
+
def as_nested_hash(options = {})
|
5
|
+
default_options = {
|
6
|
+
fields_to_include: field_names,
|
7
|
+
stringify_keys: false
|
8
|
+
}
|
9
|
+
options = default_options.merge(options)
|
10
|
+
|
11
|
+
hash = content.to_hash
|
12
|
+
hash.select! { |k, _| options[:fields_to_include].map(&:to_s).include? k.to_s }
|
13
|
+
hash = hash.each_with_object({}) { |(k, v), h| h[k.to_s] = v } if options[:stringify_keys]
|
14
|
+
|
15
|
+
children_key = :children
|
16
|
+
children_key = children_key.to_s if options[:stringify_keys]
|
17
|
+
|
18
|
+
hash.merge({ children_key => children.map { |node| node.as_nested_hash(options) } })
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'forester'
|
3
|
+
|
4
|
+
class TestMutators < Minitest::Test
|
5
|
+
|
6
|
+
def test_mutators
|
7
|
+
|
8
|
+
path_to_trees = "#{File.dirname(__FILE__)}/trees"
|
9
|
+
tree = Forester::TreeFactory.from_yaml_file("#{path_to_trees}/simple_tree.yml")
|
10
|
+
|
11
|
+
tree.add_field_to_subtree!(:number_five, 5)
|
12
|
+
|
13
|
+
assert_equal 5, tree.get(:number_five)
|
14
|
+
|
15
|
+
number_one = 1
|
16
|
+
|
17
|
+
tree.add_field_to_subtree!(:number_six, -> (node) { node.get(:number_five) + number_one })
|
18
|
+
|
19
|
+
assert_equal 6, tree.get(:number_six)
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
data/test/test_treenode.rb
CHANGED
data/test/test_views.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'forester'
|
3
|
+
|
4
|
+
class TestViews < Minitest::Test
|
5
|
+
|
6
|
+
def test_views
|
7
|
+
|
8
|
+
path_to_trees = "#{File.dirname(__FILE__)}/trees"
|
9
|
+
tree = Forester::TreeFactory.from_yaml_file("#{path_to_trees}/simple_tree.yml")
|
10
|
+
|
11
|
+
hash = (YAML.load(File.read("#{path_to_trees}/simple_tree.yml")))
|
12
|
+
add_empty_children_keys(hash['root'])
|
13
|
+
|
14
|
+
assert_equal hash['root'], tree.as_nested_hash({ stringify_keys: true })
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def add_empty_children_keys(hash)
|
21
|
+
hash['children'] = hash.fetch('children', [])
|
22
|
+
hash['children'].each { |child| add_empty_children_keys(child) }
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: forester
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eugenio Bruno
|
@@ -81,12 +81,16 @@ files:
|
|
81
81
|
- lib/forester.rb
|
82
82
|
- lib/forester/aggregators.rb
|
83
83
|
- lib/forester/hash_with_indifferent_access.rb
|
84
|
+
- lib/forester/mutators.rb
|
84
85
|
- lib/forester/node_content.rb
|
85
86
|
- lib/forester/node_content_factory.rb
|
86
87
|
- lib/forester/tree_factory.rb
|
87
88
|
- lib/forester/tree_node.rb
|
88
89
|
- lib/forester/version.rb
|
90
|
+
- lib/forester/views.rb
|
91
|
+
- test/test_mutators.rb
|
89
92
|
- test/test_treenode.rb
|
93
|
+
- test/test_views.rb
|
90
94
|
- test/trees/simple_tree.yml
|
91
95
|
homepage: http://rubygems.org/gems/forester
|
92
96
|
licenses:
|
@@ -113,5 +117,7 @@ signing_key:
|
|
113
117
|
specification_version: 4
|
114
118
|
summary: A gem to represent and interact with tree data structures
|
115
119
|
test_files:
|
120
|
+
- test/test_mutators.rb
|
116
121
|
- test/test_treenode.rb
|
122
|
+
- test/test_views.rb
|
117
123
|
- test/trees/simple_tree.yml
|