has_hierarchy 0.4.1 → 0.4.2

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: 86d673f21a344bfee6de33caa82e9d3828766b4c
4
- data.tar.gz: bfd3039a2107c54291497898345bad43024413aa
3
+ metadata.gz: 7fa480c2dfa727db155946f7a32a374012d502a3
4
+ data.tar.gz: c10d67ed70b1dd55e2dff7b01e4037bbdf2d74f7
5
5
  SHA512:
6
- metadata.gz: 324bc0f6c38e8f8ca92c1f350ec204a8925c4820b8b6dbe402f65b28e5d36176e9c9b45f9663a424c51d46be9c2755f80a54d5c8fab6e01d0e494f9a0711beae
7
- data.tar.gz: 7e1fc5c1b53e078bec6e1bc752775fd0cfd0aa6f1a0dc118f2cc9f25540c28402b9c942939f972806b465d8ad9d4d8e9ec282ecf36972d6ba3441e8b03881b1b
6
+ metadata.gz: 77c9d5e8305249b2e249499d3898b18cfcd797a4d6bd0e71fce811e5e9ccbf27c3ba66e03c2f6ce0e7dabf36b119e4460a4fd9911c4223064008eae3cb027c0f
7
+ data.tar.gz: 473491eca491d329ce3cd379377c0c10bc01d34b50fc0f0da78b83ed344c196828c9fc9e243f75939a20aec6b0185ee5b4adfccae4b8e25b559ac73c0bcdcdbe
@@ -49,15 +49,25 @@ module HasHierarchy
49
49
 
50
50
  def tree
51
51
  nodes = all
52
+ tree_hash = {}
53
+
52
54
  index = {}
53
- arranged = {}
55
+ nodes.each{ |n| index[n.id] = {} }
56
+ nodes.each{ |n| (index[n.parent_id] || tree_hash)[n] = index[n.id] }
57
+
58
+ tree_hash
59
+ end
60
+
61
+ def flat_tree(tree_hash = nil)
62
+ tree_hash ||= tree
63
+ list = []
54
64
 
55
- nodes.each do |node|
56
- struct = node.root? ? arranged : (index[node.parent_id] ||= {})
57
- struct[node] = (index[node.id] ||= {})
65
+ tree_hash.each do |node, children|
66
+ list << node
67
+ list += flat_tree(children) unless children.empty?
58
68
  end
59
69
 
60
- arranged
70
+ list
61
71
  end
62
72
 
63
73
  protected
@@ -1,3 +1,3 @@
1
1
  module HasHierarchy
2
- VERSION = '0.4.1'
2
+ VERSION = '0.4.2'
3
3
  end
@@ -18,7 +18,7 @@ shared_examples 'adjacency list' do
18
18
  include_context 'example tree'
19
19
 
20
20
  describe '.tree' do
21
- it 'arranges tree' do
21
+ it 'arranges tree to hash' do
22
22
  expect(described_class.tree).to be_arranged_like({
23
23
  foo => {},
24
24
  bar => {
@@ -43,6 +43,28 @@ shared_examples 'adjacency list' do
43
43
  end
44
44
  end
45
45
 
46
+ describe '.flat_tree' do
47
+ it 'arranges tree to array' do
48
+ expect(described_class.flat_tree).to eq([
49
+ foo,
50
+ bar,
51
+ qux,
52
+ quux,
53
+ baz
54
+ ])
55
+ end
56
+
57
+ it 'allows custom order' do
58
+ expect(described_class.alphabetic.flat_tree).to eq([
59
+ bar,
60
+ baz,
61
+ qux,
62
+ quux,
63
+ foo
64
+ ])
65
+ end
66
+ end
67
+
46
68
  describe '.roots' do
47
69
  it 'returns roots' do
48
70
  expect(described_class.roots).to match_array([ foo, bar ])
@@ -156,12 +178,9 @@ shared_examples 'materialized path' do
156
178
 
157
179
  describe '#subtree' do
158
180
  it 'returns node with descendants' do
159
- expect(bar.subtree.tree).to be_arranged_like({
160
- bar => {
161
- qux => {
162
- quux => {}
163
- },
164
- baz => {}
181
+ expect(qux.subtree.tree).to be_arranged_like({
182
+ qux => {
183
+ quux => {}
165
184
  }
166
185
  })
167
186
  end
@@ -258,8 +277,13 @@ shared_examples 'tree with cached depth' do
258
277
 
259
278
  it 'stores node level' do
260
279
  expect(described_class.where(depth: 0)).to match_array([ foo, bar ])
261
- expect(described_class.where(depth: 1)).to match_array([ qux, baz ])
262
- expect(described_class.where(depth: 2)).to match_array([ quux ])
280
+
281
+ expect(described_class.where(depth: 1...3).tree).to be_arranged_like({
282
+ qux => {
283
+ quux => {}
284
+ },
285
+ baz => {}
286
+ })
263
287
  end
264
288
  end
265
289
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: has_hierarchy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kolesnikov Danil
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-30 00:00:00.000000000 Z
11
+ date: 2014-11-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler