forester 4.3.0 → 5.0.0

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