forester 4.1.0 → 4.2.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: 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