forester 4.3.0 → 5.0.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.
@@ -1,17 +1,3 @@
1
1
  module Forester
2
- class Version
3
- MAJOR = 4
4
- MINOR = 3
5
- PATCH = 0
6
- PRE = nil
7
-
8
- class << self
9
-
10
- def to_s
11
- [MAJOR, MINOR, PATCH, PRE].compact.join('.')
12
- end
13
-
14
- end
15
-
16
- end
2
+ VERSION = '5.0.0'.freeze
17
3
  end
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.3.0
4
+ version: 5.0.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: 2017-02-26 00:00:00.000000000 Z
11
+ date: 2017-08-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubytree
@@ -24,97 +24,134 @@ dependencies:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.9.7
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.15'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.15'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rake
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
- - - ~>
45
+ - - "~>"
32
46
  - !ruby/object:Gem::Version
33
- version: '12.0'
47
+ version: '10.0'
34
48
  type: :development
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
- - - ~>
52
+ - - "~>"
39
53
  - !ruby/object:Gem::Version
40
- version: '12.0'
54
+ version: '10.0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: minitest
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
- - - ~>
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '5.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '5.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest-bender
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
46
74
  - !ruby/object:Gem::Version
47
- version: '5.10'
75
+ version: '0.0'
48
76
  type: :development
49
77
  prerelease: false
50
78
  version_requirements: !ruby/object:Gem::Requirement
51
79
  requirements:
52
- - - ~>
80
+ - - "~>"
53
81
  - !ruby/object:Gem::Version
54
- version: '5.10'
82
+ version: '0.0'
55
83
  - !ruby/object:Gem::Dependency
56
84
  name: simplecov
57
85
  requirement: !ruby/object:Gem::Requirement
58
86
  requirements:
59
- - - ~>
87
+ - - "~>"
60
88
  - !ruby/object:Gem::Version
61
89
  version: '0.14'
62
90
  type: :development
63
91
  prerelease: false
64
92
  version_requirements: !ruby/object:Gem::Requirement
65
93
  requirements:
66
- - - ~>
94
+ - - "~>"
67
95
  - !ruby/object:Gem::Version
68
96
  version: '0.14'
97
+ - !ruby/object:Gem::Dependency
98
+ name: coveralls
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.8'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.8'
69
111
  - !ruby/object:Gem::Dependency
70
112
  name: pry-byebug
71
113
  requirement: !ruby/object:Gem::Requirement
72
114
  requirements:
73
- - - ~>
115
+ - - "~>"
74
116
  - !ruby/object:Gem::Version
75
117
  version: '3.4'
76
118
  type: :development
77
119
  prerelease: false
78
120
  version_requirements: !ruby/object:Gem::Requirement
79
121
  requirements:
80
- - - ~>
122
+ - - "~>"
81
123
  - !ruby/object:Gem::Version
82
124
  version: '3.4'
83
- description: Forester is a collection of utilities to represent and interact with
84
- tree data structures.
85
- email: eugeniobruno@gmail.com
125
+ description:
126
+ email:
127
+ - eugeniobruno@gmail.com
86
128
  executables: []
87
129
  extensions: []
88
- extra_rdoc_files: []
130
+ extra_rdoc_files:
131
+ - LICENSE.txt
132
+ - README.md
133
+ - CODE_OF_CONDUCT.md
134
+ - CHANGELOG.md
89
135
  files:
90
- - .gitignore
91
- - .travis.yml
136
+ - ".gitignore"
137
+ - ".travis.yml"
138
+ - CHANGELOG.md
139
+ - CODE_OF_CONDUCT.md
92
140
  - Gemfile
93
- - LICENSE
141
+ - LICENSE.txt
94
142
  - README.md
95
143
  - Rakefile
144
+ - bin/console
145
+ - bin/setup
96
146
  - forester.gemspec
97
147
  - lib/forester.rb
98
- - lib/forester/node_content/base.rb
99
- - lib/forester/node_content/dictionary.rb
100
- - lib/forester/node_content/factory.rb
101
- - lib/forester/node_content/list.rb
102
148
  - lib/forester/tree_factory.rb
103
149
  - lib/forester/tree_node.rb
104
- - lib/forester/tree_node_ext/aggregators.rb
150
+ - lib/forester/tree_node_ext/iterators.rb
105
151
  - lib/forester/tree_node_ext/mutators.rb
152
+ - lib/forester/tree_node_ext/serializers.rb
106
153
  - lib/forester/tree_node_ext/validators.rb
107
- - lib/forester/tree_node_ext/views.rb
108
154
  - lib/forester/version.rb
109
- - test/minitest_helper.rb
110
- - test/test_ad_hoc_tree.rb
111
- - test/test_aggregators.rb
112
- - test/test_mutators.rb
113
- - test/test_tree_factory.rb
114
- - test/test_tree_node.rb
115
- - test/test_validators.rb
116
- - test/test_views.rb
117
- - test/trees/simple_tree.yml
118
155
  homepage: https://github.com/eugeniobruno/forester
119
156
  licenses:
120
157
  - MIT
@@ -125,27 +162,18 @@ require_paths:
125
162
  - lib
126
163
  required_ruby_version: !ruby/object:Gem::Requirement
127
164
  requirements:
128
- - - '>='
165
+ - - ">="
129
166
  - !ruby/object:Gem::Version
130
167
  version: 2.0.0
131
168
  required_rubygems_version: !ruby/object:Gem::Requirement
132
169
  requirements:
133
- - - '>='
170
+ - - ">="
134
171
  - !ruby/object:Gem::Version
135
172
  version: '0'
136
173
  requirements: []
137
174
  rubyforge_project:
138
- rubygems_version: 2.4.8
175
+ rubygems_version: 2.5.1
139
176
  signing_key:
140
177
  specification_version: 4
141
- summary: A trees library
142
- test_files:
143
- - test/minitest_helper.rb
144
- - test/test_ad_hoc_tree.rb
145
- - test/test_aggregators.rb
146
- - test/test_mutators.rb
147
- - test/test_tree_factory.rb
148
- - test/test_tree_node.rb
149
- - test/test_validators.rb
150
- - test/test_views.rb
151
- - test/trees/simple_tree.yml
178
+ summary: Forester is a library to work with tree data structures.
179
+ test_files: []
@@ -1,9 +0,0 @@
1
- module Forester
2
- module NodeContent
3
- class Base < SimpleDelegator
4
-
5
-
6
-
7
- end
8
- end
9
- end
@@ -1,91 +0,0 @@
1
- module Forester
2
- module NodeContent
3
- class Dictionary < Base
4
-
5
- def fields
6
- keys
7
- end
8
-
9
- def has_key?(key, indifferent = true)
10
- if indifferent
11
- equivs(key).any? { |k| super(k) }
12
- else
13
- super(key)
14
- end
15
- end
16
- alias_method :has?, :has_key?
17
-
18
- def [](key)
19
- super(best key)
20
- end
21
-
22
- def fetch(key, default = :yield_to_block, &block)
23
- best_key = best key
24
- if default == :yield_to_block
25
- super(best_key, &block)
26
- else
27
- super(best_key, default, &block)
28
- end
29
- end
30
- alias_method :get, :fetch
31
-
32
- def []=(key, value, options = {})
33
- default_options = {
34
- symbolize_key: true
35
- }
36
- options = default_options.merge(options)
37
-
38
- convert_key = ->(k) { k }
39
- convert_key = ->(k) { k.to_sym } if options[:symbolize_key]
40
-
41
- super(convert_key.call(key), value)
42
- end
43
- alias_method :put!, :[]=
44
-
45
- def delete(key, default = :yield_to_block, &block)
46
- best_key = best key
47
- if default == :yield_to_block
48
- super(best_key, &block)
49
- else
50
- super(best_key, default, &block)
51
- end
52
- end
53
- alias_method :del!, :delete
54
-
55
- def to_hash(options = {})
56
- default_options = {
57
- fields_to_include: fields, # all of them
58
- stringify_keys: false,
59
- symbolize_keys: false
60
- }
61
- options = default_options.merge(options)
62
- options[:fields_to_include] = fields if options[:fields_to_include] == :all
63
-
64
- convert_key = ->(k) { k }
65
- convert_key = ->(k) { k.to_s } if options[:stringify_keys]
66
- convert_key = ->(k) { k.to_sym } if options[:symbolize_keys]
67
-
68
- each_with_object({}) do |(k, v), hash|
69
- if equivs(k).any? { |eq| options[:fields_to_include].include?(eq) }
70
- hash[convert_key.call(k)] = v
71
- end
72
- end
73
- end
74
-
75
- def merge(dictionary)
76
- self.class.new(super)
77
- end
78
-
79
- private
80
-
81
- def equivs(key)
82
- [key, key.to_s, key.to_s.to_sym].uniq
83
- end
84
-
85
- def best(key)
86
- equivs(key).find { |k| has_key?(k, false) } || key
87
- end
88
-
89
- end
90
- end
91
- end
@@ -1,25 +0,0 @@
1
- module Forester
2
- module NodeContent
3
- module Factory
4
-
5
- extend self
6
-
7
- def from_hash(hash, children_key, indifferent = true)
8
- ret = without_key(hash, children_key)
9
- ret = Dictionary.new(ret) if indifferent
10
- ret
11
- end
12
-
13
- def from_array(array)
14
- List.new(array)
15
- end
16
-
17
- private
18
-
19
- def without_key(hash, key)
20
- hash.reject { |k, _| k.to_s == key.to_s }
21
- end
22
-
23
- end
24
- end
25
- end
@@ -1,31 +0,0 @@
1
- module Forester
2
- module NodeContent
3
- class List < Base
4
-
5
- def include?(*args)
6
- super
7
- end
8
- alias_method :has?, :include?
9
-
10
- def fetch(*args)
11
- super
12
- end
13
- alias_method :get, :fetch
14
-
15
- def push(*args)
16
- super
17
- end
18
- alias_method :add!, :push
19
-
20
- def delete(*args)
21
- super
22
- end
23
- alias_method :del!, :delete
24
-
25
- def to_array
26
- Array.new(self)
27
- end
28
-
29
- end
30
- end
31
- end
@@ -1,101 +0,0 @@
1
- module Forester
2
- module Aggregators
3
-
4
- def own_and_descendants(field, options = {}, &if_missing)
5
- default_options = {
6
- traversal: :depth_first
7
- }
8
- options = default_options.merge(options)
9
-
10
- if_missing = -> (node) { [] } unless block_given?
11
-
12
- each_node(traversal: options[:traversal]).flat_map do |node|
13
- as_array(node.get(field, &if_missing))
14
- end
15
- end
16
-
17
- def nodes_with(field, values, options = {})
18
- default_options = {
19
- single: false
20
- }
21
- options = default_options.merge(options)
22
-
23
- method = options[:single] ? :find : :select
24
- found_nodes = each_node.public_send(method) do |node|
25
- not ( as_array(node.get(field) { :no_match }) & as_array(values) ).empty?
26
- end
27
-
28
- as_array(found_nodes)
29
- end
30
-
31
- def with_ancestry(options = {})
32
- default_options = {
33
- include_root: true,
34
- include_self: true,
35
- descending: true
36
- }
37
- options = default_options.merge(options)
38
-
39
- ancestors = self.parentage || []
40
- ancestors = ancestors[0...-1] unless options[:include_root]
41
- ancestors = ancestors.unshift(self) if options[:include_self]
42
-
43
- options[:descending] ? ancestors.reverse : ancestors
44
- end
45
-
46
- def search(options)
47
- default_options = {
48
- single_node: false,
49
- by_field: :name,
50
- keywords: :missing_search_keywords,
51
- then_get: :nodes, # if :nodes, subtree is ignored
52
- subtree: true
53
- }
54
- options = default_options.merge(options)
55
-
56
- found_nodes = nodes_with(options[:by_field], options[:keywords], single: options[:single_node] )
57
-
58
- return found_nodes if options[:then_get] == :nodes
59
- # TODO this method should never return [nil]. This happens when single_node
60
- # is true and no matches are found. Moreover, if then_get is not :nodes,
61
- # it should not raise. Both cases should return [].
62
-
63
- found_nodes.flat_map do |node|
64
- node.get(options[:then_get], subtree: options[:subtree])
65
- end
66
- end
67
-
68
- def group_by_sibling_subtrees(options = {})
69
- default_options = {
70
- level: 1,
71
- group_field: 'name',
72
- aggregation_field: 'value',
73
- if_field_missing: -> (node) { [] },
74
- ancestry_in_keys: false, # if false, with_root is ignored
75
- with_root: false
76
- }
77
- options = default_options.merge(options)
78
-
79
- nodes_of_level(options[:level]).each_with_object({}) do |node, hash|
80
- key =
81
- if options[:ancestry_in_keys]
82
- nodes_for_key = node.with_ancestry(include_root: options[:with_root])
83
- nodes_for_key.map { |n| get_or_id(n, options[:group_field]) }
84
- else
85
- get_or_id(node, options[:group_field])
86
- end
87
-
88
- value = node.own_and_descendants(options[:aggregation_field], &options[:if_field_missing])
89
-
90
- hash[key] = value
91
- end
92
- end
93
-
94
- private
95
-
96
- def get_or_id(node, field)
97
- node.get(field) { |n| n.object_id }
98
- end
99
-
100
- end
101
- end