forester 4.1.0 → 4.2.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: 21870a6a2f8976322af18cc53776dc41a6a1dbb9
4
- data.tar.gz: 6947433f22479158ef6e08c8d965a2ce0de7a058
3
+ metadata.gz: 6f4bb170effc47626daaea911274299fb1ad6dcb
4
+ data.tar.gz: f16441506f8ef3111ba831e3ec487088c3e44e6d
5
5
  SHA512:
6
- metadata.gz: 3bc863f4b9fdd51749c3bde9da3baea18265d61cf1f7a240571df07192a0d757fc187fcf1412cc94b1ca2304458e0d23f1de71bc951498496e3f25d177d753f0
7
- data.tar.gz: dfdf878a13b18c54d14ce852d9cee9ac4d136b342c44f080032c8b71f82ad93c87cebfe90ff97a63ce14287b287d08ae84287471cba16c3a1370abee1495834d
6
+ metadata.gz: f38b5a46f316eb0fa0be20d350159cba296db9f1a7a8a1cfd52299ff7b88ca3333e5789719c4f9dd6f2964f1196752dd7d452f941a8ff1fb581d3a2fa8cfa4c7
7
+ data.tar.gz: 045cb745b6d6a868a9689f04764494cbc52e1babe42ea8eed2e33933c5aa9a79dabad37642fc9d06d77bc7c6a2b7b0e9f73b46f0d91273acbcb7b42d3f9902d1
data/forester.gemspec CHANGED
@@ -6,7 +6,7 @@ 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-08-28'
9
+ s.date = '2016-10-01'
10
10
  s.summary = "A gem to represent and interact with tree data structures"
11
11
  s.description = "Based on rubytree, this gem lets you build trees and run queries against them."
12
12
  s.authors = ["Eugenio Bruno"]
@@ -25,6 +25,37 @@ module Forester
25
25
  end
26
26
  end
27
27
 
28
+ def delete_values!(field, values, options = {})
29
+ default_options = {
30
+ percolate: false,
31
+ subtree: true
32
+ }
33
+ options = default_options.merge(options)
34
+
35
+ target_nodes = options[:subtree] ? each_node : [self]
36
+
37
+ target_nodes.each { |node| node.delete_values_from_root!(field, values, options[:percolate]) }
38
+ end
39
+
40
+ def delete_values_from_root!(field, values, percolate)
41
+ return unless has?(field)
42
+ current_value = get(field)
43
+ return unless current_value.is_a?(Array)
44
+
45
+ new_value =
46
+ if percolate
47
+ current_value & Array(values)
48
+ else
49
+ current_value - Array(values)
50
+ end
51
+
52
+ put!(field, new_value)
53
+ end
54
+
55
+ def percolate_values!(field, values, options = {})
56
+ delete_values!(field, values, options.merge(percolate: true))
57
+ end
58
+
28
59
  def remove_levels_past!(last_level_to_keep)
29
60
  nodes_of_level(last_level_to_keep).map(&:remove_all!)
30
61
  self
@@ -1,7 +1,7 @@
1
1
  module Forester
2
2
  class Version
3
3
  MAJOR = 4
4
- MINOR = 1
4
+ MINOR = 2
5
5
  PATCH = 0
6
6
  PRE = nil
7
7
 
@@ -31,4 +31,60 @@ class TestMutators < Minitest::Test
31
31
 
32
32
  end
33
33
 
34
+ def test_delete_values
35
+
36
+ node_1, node_2, node_3 = nodes_with_tags
37
+
38
+ @tree.delete_values!(:tags, [])
39
+ assert_equal ['First tag', 'Second tag', 'Third tag'], node_1.get(:tags)
40
+ assert_equal ['Second tag', 'Third tag'], node_2.get(:tags)
41
+ assert_equal ['Third tag'], node_3.get(:tags)
42
+
43
+ @tree.delete_values!(:tags, ['First tag'])
44
+ assert_equal ['Second tag', 'Third tag'], node_1.get(:tags)
45
+ assert_equal ['Second tag', 'Third tag'], node_2.get(:tags)
46
+ assert_equal ['Third tag'], node_3.get(:tags)
47
+
48
+ @tree.delete_values!(:tags, ['First tag', 'Second tag', 'Third tag'])
49
+ assert_equal [], node_1.get(:tags)
50
+ assert_equal [], node_2.get(:tags)
51
+ assert_equal [], node_3.get(:tags)
52
+
53
+ end
54
+
55
+ def test_percolate_values
56
+
57
+ node_1, node_2, node_3 = nodes_with_tags
58
+
59
+ @tree.percolate_values!(:tags, ['First tag', 'Second tag', 'Third tag'])
60
+ assert_equal ['First tag', 'Second tag', 'Third tag'], node_1.get(:tags)
61
+ assert_equal ['Second tag', 'Third tag'], node_2.get(:tags)
62
+ assert_equal ['Third tag'], node_3.get(:tags)
63
+
64
+ @tree.percolate_values!(:tags, ['First tag'])
65
+ assert_equal ['First tag'], node_1.get(:tags)
66
+ assert_equal [], node_2.get(:tags)
67
+ assert_equal [], node_3.get(:tags)
68
+
69
+ @tree.percolate_values!(:tags, [])
70
+ assert_equal [], node_1.get(:tags)
71
+ assert_equal [], node_2.get(:tags)
72
+ assert_equal [], node_3.get(:tags)
73
+
74
+ end
75
+
76
+ protected
77
+
78
+ def nodes_with_tags
79
+ [1, 6, 9].map do |n|
80
+
81
+ @tree.search({
82
+ single_node: true,
83
+ by_field: :value,
84
+ keywords: n
85
+ }).first
86
+
87
+ end
88
+ end
89
+
34
90
  end
@@ -9,6 +9,10 @@ root:
9
9
  value: 1
10
10
  color: Green
11
11
  tone: Dark
12
+ tags:
13
+ - First tag
14
+ - Second tag
15
+ - Third tag
12
16
  children:
13
17
  - name: First node of level 2
14
18
  value: 2
@@ -32,6 +36,9 @@ root:
32
36
  children:
33
37
  - name: First node of level 3
34
38
  value: 6
39
+ tags:
40
+ - Second tag
41
+ - Third tag
35
42
  strings:
36
43
  - Reached level 3
37
44
  - It's dark
@@ -47,6 +54,8 @@ root:
47
54
  - name: Second node of level 4
48
55
  value: 9
49
56
  color: Yellow
57
+ tags:
58
+ - Third tag
50
59
  strings:
51
60
  - Could forester handle trees with hundreds of levels?
52
61
  - Maybe.
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.1.0
4
+ version: 4.2.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-08-28 00:00:00.000000000 Z
11
+ date: 2016-10-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubytree