mongo_mapper_tree 1.0.0 → 1.1.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 ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MWJhYjAwZDk3OWI3MGYxNmNlYzdmNGY4YjI0NDczYjY0ODYxNjg0MQ==
5
+ data.tar.gz: !binary |-
6
+ NTZiNWRlMGJjMWZhMzIzZjdkMzdhYzFkMDdkYzA1OGIzYzVhM2YxOQ==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ YjkxMzI3Mjk3MWM0MzJhMWMxMDgyYmU5MjU3ZmI2NDcxY2I1YTdkZGExNmE4
10
+ NGRmODY1ZWRjNDIxY2MyYjYyOWQ3ZGRmNzc2OTEwNzE0ZDNiNTQ4MTc0Mjc4
11
+ ZWFlNGZjY2QwZWNiNzVjMTA0ZjgwMzQwNTFjMDUwNDQ1OWNhODM=
12
+ data.tar.gz: !binary |-
13
+ ZmZmZjlkNWM3OTNiNGE3Mzk0MDQxNmQxZmRhMTU0NDA4ZDE4YTk0NzU3NGIw
14
+ YjIyY2Y4MmVjY2ExMDE0ZTIyNjdkMTc5YWMwZWZiMDMzYmQ2OTVkMDRkZDNh
15
+ YTJjNWY3YmFkNDNhZmQxYWJhMzY2YWJhMTQzNzIzNTVhZGU1ODE=
data/README.rdoc CHANGED
@@ -1,6 +1,6 @@
1
1
  = mongo_mapper_tree
2
2
 
3
- This is an modernized version of mongo_mapper_acts_as_tree (https://github.com/ramdiv/mongo_mapper_acts_as_tree)
3
+ This is an maintained version of mongo_mapper_acts_as_tree (https://github.com/ramdiv/mongo_mapper_acts_as_tree) (ie. most of the code is written by Jacob Vidmar)
4
4
  In it's essence it's an implementation of a tree structure for MongoMapper, think acts as tree but for mongodb.
5
5
 
6
6
 
@@ -43,4 +43,5 @@ For best performance add a index on the field called path_field.
43
43
 
44
44
  == Copyright
45
45
 
46
+ Original code written by Jakob Vidmar https://github.com/ramdiv/mongo_mapper_acts_as_tree
46
47
  Copyright (c) 2011 Joel Junström. See LICENSE for details.
@@ -115,7 +115,9 @@ module MongoMapper
115
115
  end
116
116
 
117
117
  def destroy_descendants
118
- tree_search_class.destroy(self.descendants.map(&:_id))
118
+ self.descendants.each do |descendant|
119
+ descendant.destroy
120
+ end
119
121
  end
120
122
 
121
123
  included do
data/lib/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  # encoding: UTF-8
2
2
  module MongoMapperTree
3
- Version = '1.0.0'
3
+ Version = '1.1.0'
4
4
  end
data/test/helper.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'rubygems'
2
- require 'test/unit'
3
- require 'shoulda'
2
+ gem "minitest"
4
3
  require 'database_cleaner'
4
+ require "minitest/autorun"
5
5
 
6
6
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
7
7
  $LOAD_PATH.unshift(File.dirname(__FILE__))
@@ -13,29 +13,6 @@ Dir["#{File.dirname(__FILE__)}/models/*.rb"].each {|file| require file}
13
13
 
14
14
  DatabaseCleaner.strategy = :truncation
15
15
 
16
- class Test::Unit::TestCase
17
- # Drop all collections after each test case.
18
- def setup
19
- DatabaseCleaner.start
20
- end
21
-
22
- def teardown
23
- DatabaseCleaner.clean
24
- end
25
-
26
- # Make sure that each test case has a teardown
27
- # method to clear the db after each test.
28
- def inherited(base)
29
- base.define_method setup do
30
- super
31
- end
32
-
33
- base.define_method teardown do
34
- super
35
- end
36
- end
37
-
38
- def eql_arrays?(first, second)
39
- first.collect(&:_id).to_set == second.collect(&:_id).to_set
40
- end
41
- end
16
+ def eql_arrays?(first, second)
17
+ first.collect(&:_id).to_set == second.collect(&:_id).to_set
18
+ end
@@ -6,4 +6,4 @@ class OrderedCategory
6
6
  key :value, Integer
7
7
 
8
8
  self.tree_order = :value.asc
9
- end
9
+ end
data/test/test_order.rb CHANGED
@@ -1,26 +1,30 @@
1
1
  require 'helper'
2
- class TestMongomapperActsAsTree < Test::Unit::TestCase
3
- context "Ordered tree" do
4
- setup do
5
- @root_1 = OrderedCategory.create(:name => "Root 1", :value => 2)
6
- @child_1 = OrderedCategory.create(:name => "Child 1", :parent => @root_1, :value => 1)
7
- @child_2 = OrderedCategory.create(:name => "Child 2", :parent => @root_1, :value => 9)
8
- @child_2_1 = OrderedCategory.create(:name => "Child 2.1", :parent => @child_2, :value => 2)
9
- @child_3 = OrderedCategory.create(:name => "Child 3", :parent => @root_1, :value => 5)
10
- @root_2 = OrderedCategory.create(:name => "Root 2", :value => 1)
11
- end
2
+ class TestOrder < Minitest::Test
3
+ def setup
4
+ DatabaseCleaner.start
12
5
 
13
- should "be in order" do
14
- assert_equal OrderedCategory.roots, [@root_2, @root_1]
6
+ @root_1 = OrderedCategory.create(:name => "Root 1", :value => 2)
7
+ @child_1 = OrderedCategory.create(:name => "Child 1", :parent => @root_1, :value => 1)
8
+ @child_2 = OrderedCategory.create(:name => "Child 2", :parent => @root_1, :value => 9)
9
+ @child_2_1 = OrderedCategory.create(:name => "Child 2.1", :parent => @child_2, :value => 2)
10
+ @child_3 = OrderedCategory.create(:name => "Child 3", :parent => @root_1, :value => 5)
11
+ @root_2 = OrderedCategory.create(:name => "Root 2", :value => 1)
12
+ end
13
+
14
+ def teardown
15
+ DatabaseCleaner.clean
16
+ end
17
+
18
+ def test_in_order
19
+ assert_equal OrderedCategory.roots, [@root_2, @root_1]
15
20
 
16
- assert_equal @root_1.children, [@child_1, @child_3, @child_2]
21
+ assert_equal @root_1.children, [@child_1, @child_3, @child_2]
17
22
 
18
- assert_equal @root_1.descendants, [@child_1, @child_2_1, @child_3, @child_2]
19
- assert_equal @root_1.self_and_descendants, [@root_1, @child_1, @child_2_1, @child_3, @child_2]
23
+ assert_equal @root_1.descendants, [@child_1, @child_2_1, @child_3, @child_2]
24
+ assert_equal @root_1.self_and_descendants, [@root_1, @child_1, @child_2_1, @child_3, @child_2]
20
25
 
21
- assert_equal @child_2.siblings, [@child_1, @child_3]
22
- assert_equal @child_2.self_and_siblings, [@child_1, @child_3, @child_2]
23
- assert_equal @root_1.self_and_siblings, [@root_2, @root_1]
24
- end
26
+ assert_equal @child_2.siblings, [@child_1, @child_3]
27
+ assert_equal @child_2.self_and_siblings, [@child_1, @child_3, @child_2]
28
+ assert_equal @root_1.self_and_siblings, [@root_2, @root_1]
25
29
  end
26
- end
30
+ end
@@ -0,0 +1,54 @@
1
+ require 'helper'
2
+
3
+ class TestSearchMixedTree < Minitest::Test
4
+ def setup
5
+ DatabaseCleaner.start
6
+ shape = Shape.create(name: "Root")
7
+ circle = Circle.create(name: "Circle", parent: shape)
8
+ Square.create(name: "Square", parent: circle)
9
+
10
+ @shape, @circle, @square = Shape.first, Circle.first, Square.first
11
+ end
12
+
13
+ def teardown
14
+ DatabaseCleaner.clean
15
+ end
16
+
17
+ def test_circle_is_child_of_shape
18
+ assert_equal [@circle], @shape.children
19
+ end
20
+
21
+ def test_square_is_child_of_circle
22
+ assert_equal [@square], @circle.children
23
+ end
24
+
25
+ def test_circle_is_parent_of_square
26
+ assert_equal @circle, @square.parent
27
+ end
28
+
29
+ def test_shape_is_parent_of_circle
30
+ assert_equal @shape, @circle.parent
31
+ end
32
+
33
+ def test_shape_decendants
34
+ assert_equal [@circle, @square], @shape.descendants
35
+ end
36
+
37
+ def test_circle_decendants
38
+ assert_equal [@square], @circle.descendants
39
+ end
40
+
41
+ def test_square_ancestors
42
+ assert_equal [@shape, @circle], @square.ancestors
43
+ end
44
+
45
+ def test_circle_ansestors
46
+ assert_equal [@shape], @circle.ancestors
47
+ end
48
+
49
+ def test_destroy_shape_decendants
50
+ @shape.destroy_descendants
51
+ assert_nil Shape.find(@circle._id)
52
+ assert_nil Shape.find(@square._id)
53
+ end
54
+ end
@@ -0,0 +1,52 @@
1
+ require 'helper'
2
+
3
+ class TestSearchTree < Minitest::Test
4
+ def setup
5
+ DatabaseCleaner.start
6
+ shape = Shape.create(name: "Root")
7
+ Circle.create(name: "Circle", parent: shape)
8
+ Square.create(name: "Square", parent: shape)
9
+
10
+ # We are loading from the database here because this process proves the point. If we never did it this
11
+ # way, there would be no reason to change the code.
12
+ @shape, @circle, @square = Shape.first, Circle.first, Square.first
13
+ end
14
+
15
+ def teardown
16
+ DatabaseCleaner.clean
17
+ end
18
+
19
+ def text_children
20
+ assert_equal [@circle, @square], @shape.children
21
+ end
22
+
23
+ def test_shape_parenhood
24
+ assert_equal @shape, @circle.parent
25
+ assert_equal @shape, @square.parent
26
+ end
27
+
28
+ def text_siblings
29
+ assert_equal [@square], @circle.siblings
30
+ assert_equal [@circle, @square], @circle.self_and_siblings
31
+
32
+ assert_equal [@circle], @square.siblings
33
+ assert_equal [@circle, @square], @square.self_and_siblings
34
+ end
35
+
36
+ def test_deendants
37
+ assert_equal [@circle, @square], @shape.descendants
38
+ assert_equal [@shape, @circle, @square], @shape.self_and_descendants
39
+ end
40
+
41
+ def test_ancestors
42
+ assert_equal [@shape], @circle.ancestors
43
+ assert_equal [@shape, @circle], @circle.self_and_ancestors
44
+ assert_equal [@shape], @square.ancestors
45
+ assert_equal [@shape, @square], @square.self_and_ancestors
46
+ end
47
+
48
+ def test_roots
49
+ assert_equal @shape, @square.root
50
+ assert_equal @shape, @circle.root
51
+ end
52
+ end
data/test/test_tree.rb CHANGED
@@ -1,157 +1,151 @@
1
1
  require 'helper'
2
- class TestMongomapperActsAsTree < Test::Unit::TestCase
3
- context "Tree" do
4
- setup do
5
- @root_1 = Category.create(:name => "Root 1")
6
- @child_1 = Category.create(:name => "Child 1", :parent => @root_1)
7
- @child_2 = Category.create(:name => "Child 2", :parent => @root_1)
8
- @child_2_1 = Category.create(:name => "Child 2.1", :parent => @child_2)
9
- @child_3 = Category.create(:name => "Child 3", :parent => @root_1)
10
- @root_2 = Category.create(:name => "Root 2")
11
- end
12
-
13
- should "create node from id " do
14
- assert Category.create(:name => "Child 2.2", :parent_id => @root_1.id).parent == @root_1
15
- end
16
-
17
- should "have roots" do
18
- assert eql_arrays?(Category.roots, [@root_1, @root_2])
19
- end
20
-
21
- context "node" do
22
- should "have a root" do
23
- assert_equal @root_1.root, @root_1
24
- assert_not_equal @root_1.root, @root_2.root
25
- assert_equal @root_1, @child_2_1.root
26
- end
27
-
28
- should "have ancestors" do
29
- assert_equal @root_1.ancestors, []
30
- assert_equal @child_2_1.ancestors, [@root_1, @child_2]
31
- assert_equal @root_1.self_and_ancestors, [@root_1]
32
- assert_equal @child_2_1.self_and_ancestors, [@root_1, @child_2, @child_2_1]
33
- end
34
-
35
- should "have siblings" do
36
- assert eql_arrays?(@root_1.siblings, [@root_2])
37
- assert eql_arrays?(@child_2.siblings, [@child_1, @child_3])
38
- assert eql_arrays?(@child_2_1.siblings, [])
39
- assert eql_arrays?(@root_1.self_and_siblings, [@root_1, @root_2])
40
- assert eql_arrays?(@child_2.self_and_siblings, [@child_1, @child_2, @child_3])
41
- assert eql_arrays?(@child_2_1.self_and_siblings, [@child_2_1])
42
- end
43
-
44
- should "set depth" do
45
- assert_equal 0, @root_1.depth
46
- assert_equal 1, @child_1.depth
47
- assert_equal 2, @child_2_1.depth
48
- end
49
-
50
- should "have children" do
51
- assert @child_2_1.children.empty?
52
- assert eql_arrays?(@root_1.children, [@child_1, @child_2, @child_3])
53
- end
54
-
55
- should "have descendants" do
56
- assert eql_arrays?(@root_1.descendants, [@child_1, @child_2, @child_3, @child_2_1])
57
- assert eql_arrays?(@child_2.descendants, [@child_2_1])
58
- assert @child_2_1.descendants.empty?
59
- assert eql_arrays?(@root_1.self_and_descendants, [@root_1, @child_1, @child_2, @child_3, @child_2_1])
60
- assert eql_arrays?(@child_2.self_and_descendants, [@child_2, @child_2_1])
61
- assert eql_arrays?(@child_2_1.self_and_descendants, [@child_2_1])
62
- end
63
-
64
- should "be able to tell if ancestor" do
65
- assert @root_1.is_ancestor_of?(@child_1)
66
- assert ! @root_2.is_ancestor_of?(@child_2_1)
67
- assert ! @child_2.is_ancestor_of?(@child_2)
68
-
69
- assert @root_1.is_or_is_ancestor_of?(@child_1)
70
- assert ! @root_2.is_or_is_ancestor_of?(@child_2_1)
71
- assert @child_2.is_or_is_ancestor_of?(@child_2)
72
- end
73
-
74
- should "be able to tell if descendant" do
75
- assert ! @root_1.is_descendant_of?(@child_1)
76
- assert @child_1.is_descendant_of?(@root_1)
77
- assert ! @child_2.is_descendant_of?(@child_2)
78
-
79
- assert ! @root_1.is_or_is_descendant_of?(@child_1)
80
- assert @child_1.is_or_is_descendant_of?(@root_1)
81
- assert @child_2.is_or_is_descendant_of?(@child_2)
82
- end
83
-
84
- should "be able to tell if sibling" do
85
- assert ! @root_1.is_sibling_of?(@child_1)
86
- assert ! @child_1.is_sibling_of?(@child_1)
87
- assert ! @child_2.is_sibling_of?(@child_2)
88
-
89
- assert ! @root_1.is_or_is_sibling_of?(@child_1)
90
- assert @child_1.is_or_is_sibling_of?(@child_2)
91
- assert @child_2.is_or_is_sibling_of?(@child_2)
92
- end
93
-
94
- context "when moving" do
95
- should "recalculate path and depth" do
96
- @child_3.parent = @child_2
97
- @child_3.save
98
-
99
- assert @child_2.is_or_is_ancestor_of?(@child_3)
100
- assert @child_3.is_or_is_descendant_of?(@child_2)
101
- assert @child_2.children.include?(@child_3)
102
- assert @child_2.descendants.include?(@child_3)
103
- assert @child_2_1.is_or_is_sibling_of?(@child_3)
104
- assert_equal 2, @child_3.depth
105
- end
106
-
107
- should "move children on save" do
108
- @child_2.parent = @root_2
109
-
110
- assert ! @root_2.is_or_is_ancestor_of?(@child_2_1)
111
- assert ! @child_2_1.is_or_is_descendant_of?(@root_2)
112
- assert ! @root_2.descendants.include?(@child_2_1)
113
-
114
- @child_2.save
115
- @child_2_1.reload
116
-
117
- assert @root_2.is_or_is_ancestor_of?(@child_2_1)
118
- assert @child_2_1.is_or_is_descendant_of?(@root_2)
119
- assert @root_2.descendants.include?(@child_2_1)
120
- end
121
-
122
- should "check against cyclic graph" do
123
- @root_1.parent = @child_2_1
124
- assert ! @root_1.valid?
125
- assert_equal I18n.t(:'mongo_mapper.errors.messages.cyclic'), @root_1.errors[:base].first
126
- end
127
-
128
- should "be able to become root" do
129
- @child_2.parent = nil
130
- @child_2.save
131
- @child_2.reload
132
- assert_nil @child_2.parent
133
- @child_2_1.reload
134
- assert (@child_2_1.path == [@child_2.id])
135
- end
136
-
137
- end
138
-
139
- should "destroy descendants when destroyed" do
140
- @child_2.destroy
141
- assert_nil Category.find(@child_2_1._id)
142
- end
143
- end
144
-
145
- context "root node" do
146
- should "not have a parent" do
147
- assert_nil @root_1.parent
148
- end
149
- end
150
-
151
- context "child_node" do
152
- should "have a parent" do
153
- assert_equal @child_2, @child_2_1.parent
154
- end
155
- end
156
- end
157
- end
2
+ class TestTree < Minitest::Test
3
+ def setup
4
+ DatabaseCleaner.start
5
+ @root_1 = Category.create(name: "Root 1")
6
+ @child_1 = Category.create(name: "Child 1", parent: @root_1)
7
+ @child_2 = Category.create(name: "Child 2", parent: @root_1)
8
+ @child_2_1 = Category.create(name: "Child 2.1", parent: @child_2)
9
+ @child_3 = Category.create(name: "Child 3", parent: @root_1)
10
+ @root_2 = Category.create(name: "Root 2")
11
+ end
12
+
13
+ def teardown
14
+ DatabaseCleaner.clean
15
+ end
16
+
17
+ def test_create_node_from_id
18
+ assert Category.create(name: "Child 2.2", parent_id: @root_1.id).parent == @root_1
19
+ end
20
+
21
+ def test_category_roots
22
+ assert eql_arrays?(Category.roots, [@root_1, @root_2])
23
+ end
24
+
25
+ def test_roots
26
+ assert_equal @root_1.root, @root_1
27
+ refute_equal @root_1.root, @root_2.root
28
+ assert_equal @root_1, @child_2_1.root
29
+ end
30
+
31
+ def test_ancestors
32
+ assert_equal @root_1.ancestors, []
33
+ assert_equal @child_2_1.ancestors, [@root_1, @child_2]
34
+ assert_equal @root_1.self_and_ancestors, [@root_1]
35
+ assert_equal @child_2_1.self_and_ancestors, [@root_1, @child_2, @child_2_1]
36
+ end
37
+
38
+ def test_siblings
39
+ assert eql_arrays?(@root_1.siblings, [@root_2])
40
+ assert eql_arrays?(@child_2.siblings, [@child_1, @child_3])
41
+ assert eql_arrays?(@child_2_1.siblings, [])
42
+ assert eql_arrays?(@root_1.self_and_siblings, [@root_1, @root_2])
43
+ assert eql_arrays?(@child_2.self_and_siblings, [@child_1, @child_2, @child_3])
44
+ assert eql_arrays?(@child_2_1.self_and_siblings, [@child_2_1])
45
+ end
46
+
47
+ def test_depths
48
+ assert_equal 0, @root_1.depth
49
+ assert_equal 1, @child_1.depth
50
+ assert_equal 2, @child_2_1.depth
51
+ end
52
+
53
+ def test_children
54
+ assert @child_2_1.children.empty?
55
+ assert eql_arrays?(@root_1.children, [@child_1, @child_2, @child_3])
56
+ end
57
+
58
+ def test_decendants
59
+ assert eql_arrays?(@root_1.descendants, [@child_1, @child_2, @child_3, @child_2_1])
60
+ assert eql_arrays?(@child_2.descendants, [@child_2_1])
61
+ assert @child_2_1.descendants.empty?
62
+ assert eql_arrays?(@root_1.self_and_descendants, [@root_1, @child_1, @child_2, @child_3, @child_2_1])
63
+ assert eql_arrays?(@child_2.self_and_descendants, [@child_2, @child_2_1])
64
+ assert eql_arrays?(@child_2_1.self_and_descendants, [@child_2_1])
65
+ end
66
+
67
+ def test_knows_if_ancestor
68
+ assert @root_1.is_ancestor_of?(@child_1)
69
+ assert ! @root_2.is_ancestor_of?(@child_2_1)
70
+ assert ! @child_2.is_ancestor_of?(@child_2)
71
+
72
+ assert @root_1.is_or_is_ancestor_of?(@child_1)
73
+ assert ! @root_2.is_or_is_ancestor_of?(@child_2_1)
74
+ assert @child_2.is_or_is_ancestor_of?(@child_2)
75
+ end
76
+
77
+ def test_knows_if_decendant
78
+ assert ! @root_1.is_descendant_of?(@child_1)
79
+ assert @child_1.is_descendant_of?(@root_1)
80
+ assert ! @child_2.is_descendant_of?(@child_2)
81
+
82
+ assert ! @root_1.is_or_is_descendant_of?(@child_1)
83
+ assert @child_1.is_or_is_descendant_of?(@root_1)
84
+ assert @child_2.is_or_is_descendant_of?(@child_2)
85
+ end
86
+
87
+ def test_knows_if_sibling
88
+ assert ! @root_1.is_sibling_of?(@child_1)
89
+ assert ! @child_1.is_sibling_of?(@child_1)
90
+ assert ! @child_2.is_sibling_of?(@child_2)
91
+
92
+ assert ! @root_1.is_or_is_sibling_of?(@child_1)
93
+ assert @child_1.is_or_is_sibling_of?(@child_2)
94
+ assert @child_2.is_or_is_sibling_of?(@child_2)
95
+ end
96
+
97
+ def test_recalculates_path_and_depth_when_moved
98
+ @child_3.parent = @child_2
99
+ @child_3.save
100
+
101
+ assert @child_2.is_or_is_ancestor_of?(@child_3)
102
+ assert @child_3.is_or_is_descendant_of?(@child_2)
103
+ assert @child_2.children.include?(@child_3)
104
+ assert @child_2.descendants.include?(@child_3)
105
+ assert @child_2_1.is_or_is_sibling_of?(@child_3)
106
+ assert_equal 2, @child_3.depth
107
+ end
108
+
109
+ def test_moved_children_when_moved
110
+ @child_2.parent = @root_2
111
+
112
+ assert ! @root_2.is_or_is_ancestor_of?(@child_2_1)
113
+ assert ! @child_2_1.is_or_is_descendant_of?(@root_2)
114
+ assert ! @root_2.descendants.include?(@child_2_1)
115
+
116
+ @child_2.save
117
+ @child_2_1.reload
118
+
119
+ assert @root_2.is_or_is_ancestor_of?(@child_2_1)
120
+ assert @child_2_1.is_or_is_descendant_of?(@root_2)
121
+ assert @root_2.descendants.include?(@child_2_1)
122
+ end
123
+
124
+ def test_checks_against_cyclic_graph
125
+ @root_1.parent = @child_2_1
126
+ assert ! @root_1.valid?
127
+ assert_equal I18n.t(:'mongo_mapper.errors.messages.cyclic'), @root_1.errors[:base].first
128
+ end
129
+
130
+ def test_can_become_root
131
+ @child_2.parent = nil
132
+ @child_2.save
133
+ @child_2.reload
134
+ assert_nil @child_2.parent
135
+ @child_2_1.reload
136
+ assert (@child_2_1.path == [@child_2.id])
137
+ end
138
+
139
+ def test_destroys_decendants
140
+ assert @child_2.destroy
141
+ assert_nil Category.find(@child_2_1._id)
142
+ end
143
+
144
+ def test_roots_cannot_have_parents
145
+ assert_nil @root_1.parent
146
+ end
147
+
148
+ def test_children_have_a_parent
149
+ assert_equal @child_2, @child_2_1.parent
150
+ end
151
+ end
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongo_mapper_tree
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
5
- prerelease:
4
+ version: 1.1.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Joel Junström
@@ -10,30 +9,22 @@ authors:
10
9
  autorequire:
11
10
  bindir: bin
12
11
  cert_chain: []
13
- date: 2012-02-27 00:00:00.000000000 Z
12
+ date: 2013-09-30 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: mongo_mapper
17
- requirement: &70110048249320 !ruby/object:Gem::Requirement
18
- none: false
16
+ requirement: !ruby/object:Gem::Requirement
19
17
  requirements:
20
- - - ~>
18
+ - - '='
21
19
  - !ruby/object:Gem::Version
22
- version: 0.11.0
20
+ version: 0.13.0.beta2
23
21
  type: :runtime
24
22
  prerelease: false
25
- version_requirements: *70110048249320
26
- - !ruby/object:Gem::Dependency
27
- name: shoulda
28
- requirement: &70110048247860 !ruby/object:Gem::Requirement
29
- none: false
23
+ version_requirements: !ruby/object:Gem::Requirement
30
24
  requirements:
31
- - - ~>
25
+ - - '='
32
26
  - !ruby/object:Gem::Version
33
- version: '2.10'
34
- type: :development
35
- prerelease: false
36
- version_requirements: *70110048247860
27
+ version: 0.13.0.beta2
37
28
  description: An Acts As Tree like implementation for MongoMapper based on mongo_mapper_acts_as_tree
38
29
  email:
39
30
  - bender@oktavilla.se
@@ -50,39 +41,33 @@ files:
50
41
  - test/models/ordered_category.rb
51
42
  - test/models/shapes.rb
52
43
  - test/test_order.rb
53
- - test/test_search_class.rb
44
+ - test/test_search_mixed_tree.rb
45
+ - test/test_search_tree.rb
54
46
  - test/test_tree.rb
55
47
  - LICENSE
56
48
  - README.rdoc
57
49
  homepage: http://github.com/Oktavilla/mongo_mapper_tree
58
50
  licenses: []
51
+ metadata: {}
59
52
  post_install_message:
60
53
  rdoc_options: []
61
54
  require_paths:
62
55
  - lib
63
56
  required_ruby_version: !ruby/object:Gem::Requirement
64
- none: false
65
57
  requirements:
66
58
  - - ! '>='
67
59
  - !ruby/object:Gem::Version
68
60
  version: '0'
69
- segments:
70
- - 0
71
- hash: -1182322477251881257
72
61
  required_rubygems_version: !ruby/object:Gem::Requirement
73
- none: false
74
62
  requirements:
75
63
  - - ! '>='
76
64
  - !ruby/object:Gem::Version
77
65
  version: '0'
78
- segments:
79
- - 0
80
- hash: -1182322477251881257
81
66
  requirements: []
82
67
  rubyforge_project:
83
- rubygems_version: 1.8.15
68
+ rubygems_version: 2.0.1
84
69
  signing_key:
85
- specification_version: 3
70
+ specification_version: 4
86
71
  summary: An Acts As Tree like implementation for MongoMapper
87
72
  test_files:
88
73
  - test/helper.rb
@@ -90,5 +75,6 @@ test_files:
90
75
  - test/models/ordered_category.rb
91
76
  - test/models/shapes.rb
92
77
  - test/test_order.rb
93
- - test/test_search_class.rb
78
+ - test/test_search_mixed_tree.rb
79
+ - test/test_search_tree.rb
94
80
  - test/test_tree.rb
@@ -1,90 +0,0 @@
1
- require 'helper'
2
-
3
- class TestSearchScope < Test::Unit::TestCase
4
- context "Simple, mixed type tree" do
5
- setup do
6
- shape = Shape.create(:name => "Root")
7
- Circle.create(:name => "Circle", :parent => shape)
8
- Square.create(:name => "Square", :parent => shape)
9
- end
10
-
11
- setup do
12
- # We are loading from the database here because this process proves the point. If we never did it this
13
- # way, there would be no reason to change the code.
14
- @shape, @circle, @square = Shape.first, Circle.first, Square.first
15
- end
16
-
17
- should "return circle and square as children of shape" do
18
- assert_equal [@circle, @square], @shape.children
19
- end
20
-
21
- should("return shape as parent of circle") { assert_equal @shape, @circle.parent }
22
- should("return shape as parent of square") { assert_equal @shape, @square.parent }
23
-
24
- should("return square as exclusive sibling of circle") { assert_equal [@square], @circle.siblings }
25
- should "return self and square as inclusive siblings of circle" do
26
- assert_equal [@circle, @square], @circle.self_and_siblings
27
- end
28
-
29
- should("return circle as exclusive sibling of square") { assert_equal [@circle], @square.siblings }
30
- should "return self and circle as inclusive siblings of square" do
31
- assert_equal [@circle, @square], @square.self_and_siblings
32
- end
33
-
34
- should "return circle and square as exclusive descendants of shape" do
35
- assert_equal [@circle, @square], @shape.descendants
36
- end
37
- should "return shape, circle and square as inclusive descendants of shape" do
38
- assert_equal [@shape, @circle, @square], @shape.self_and_descendants
39
- end
40
-
41
- should("return shape as exclusive ancestor of circle") { assert_equal [@shape], @circle.ancestors }
42
- should "return self and shape as inclusive ancestors of circle" do
43
- assert_equal [@shape, @circle], @circle.self_and_ancestors
44
- end
45
-
46
- should("return shape as exclusive ancestor of square") { assert_equal [@shape], @square.ancestors }
47
- should "return self and shape as inclusive ancestors of square" do
48
- assert_equal [@shape, @square], @square.self_and_ancestors
49
- end
50
-
51
- should("return shape as root of circle") { assert_equal @shape, @square.root }
52
- should("return shape as root of square") { assert_equal @shape, @circle.root }
53
- end
54
-
55
- context "A tree with mixed types on either side of a branch" do
56
- setup do
57
- shape = Shape.create(:name => "Root")
58
- circle = Circle.create(:name => "Circle", :parent => shape)
59
- Square.create(:name => "Square", :parent => circle)
60
- end
61
-
62
- setup do
63
- @shape, @circle, @square = Shape.first, Circle.first, Square.first
64
- end
65
-
66
- should("return circle as child of shape") { assert_equal [@circle], @shape.children }
67
- should("return square as child of circle") { assert_equal [@square], @circle.children }
68
- should("return circle as parent of square") { assert_equal @circle, @square.parent }
69
- should("return shape as parent of circle") { assert_equal @shape, @circle.parent }
70
-
71
- should "return circle and square as descendants of shape" do
72
- assert_equal [@circle, @square], @shape.descendants
73
- end
74
-
75
- should("return square as descendant of circle") { assert_equal [@square], @circle.descendants }
76
-
77
- should "return shape and circle as ancestors of square" do
78
- assert_equal [@shape, @circle], @square.ancestors
79
- end
80
-
81
- should("return shape as ancestor of circle") { assert_equal [@shape], @circle.ancestors }
82
-
83
- should "destroy descendants of shape" do
84
- @shape.destroy_descendants
85
- assert_nil Shape.find(@circle._id)
86
- assert_nil Shape.find(@square._id)
87
- end
88
- end
89
-
90
- end # TestSearchScope