forester 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
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