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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0b068adf6d25cfadca224f86d1b64a7668fadf5d
4
- data.tar.gz: 9d4494437e8bc4387b4254217e178a41890c2a3c
3
+ metadata.gz: 268ad2f30fdb06a9fbc2fe57e2f044a1a234639a
4
+ data.tar.gz: 008ea947763719e1d4c1ea5101a8d889979907f9
5
5
  SHA512:
6
- metadata.gz: a0e0684ef70d37ddfd9e4751ecaad5a8fe3fcd03d06a33f0f05158882295e31192a09a9478b1dfdf0323f91934827a68c4b78c5dc3ad2624c6ad6e429b248c9a
7
- data.tar.gz: b5619bcb98e2ca43789f8422cd33c38747997fc695c7dad7bdee14676d728f4cbaa152ea3b4b4b207c2ad53197a1a65e545e857d2febbb42e5e988a581165735
6
+ metadata.gz: 1fa2bd80e48031e9ccc8e269e20a3b60266252f4f857c046cfa2e53bbf7599eb6f5270b5c6724f628d8cecbe66f8d198f0c96f4e2dc660999c456326b2d6d047
7
+ data.tar.gz: ed777a43b80efdf961a89e7dd03010b432096e9236b6f48cf64a25b12cb96941f9eef1bfecec60664008630ecc40a7cd3098d8689956c5999d9c67471adfc618
data/Rakefile CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'rake/testtask'
2
2
 
3
3
  Rake::TestTask.new do |t|
4
- t.libs << 'test'
4
+ t.pattern = "test/**/test_*.rb"
5
5
  end
6
6
 
7
7
  desc "Run tests"
data/lib/forester.rb CHANGED
@@ -3,6 +3,8 @@ require 'securerandom'
3
3
  require 'yaml'
4
4
 
5
5
  require 'forester/aggregators'
6
+ require 'forester/mutators'
7
+ require 'forester/views'
6
8
  require 'forester/tree_node'
7
9
  require 'forester/tree_factory'
8
10
  require 'forester/node_content'
@@ -3,7 +3,7 @@ module Forester
3
3
 
4
4
  def own_and_descendants(options = {})
5
5
  default_options = {
6
- field: 'name',
6
+ field: :name,
7
7
  if_field_missing: -> (c) { [] },
8
8
  }
9
9
 
@@ -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)
@@ -10,7 +10,7 @@ module Forester
10
10
  private
11
11
 
12
12
  def without_key(hash, key)
13
- hash.reject { |k, _| k == key }
13
+ hash.reject { |k, _| k.to_s == key.to_s }
14
14
  end
15
15
 
16
16
  end
@@ -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
- def max_level
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 contents
40
- each_node.map(&:content)
41
+ def field_names
42
+ content.field_names
41
43
  end
42
44
 
43
- def each_node
44
- breadth_each
45
+ def contents
46
+ each_node.map(&:content)
45
47
  end
46
48
 
47
49
  end
@@ -1,7 +1,7 @@
1
1
  module Forester
2
2
  class Version
3
3
  MAJOR = 1
4
- MINOR = 0
4
+ MINOR = 1
5
5
  PATCH = 0
6
6
  PRE = nil
7
7
 
@@ -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
@@ -1,7 +1,7 @@
1
1
  require 'minitest/autorun'
2
2
  require 'forester'
3
3
 
4
- class TreeNodeTest < Minitest::Test
4
+ class TestTreeNode < Minitest::Test
5
5
 
6
6
  def test_tree_node
7
7
 
@@ -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.0.0
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