mongoid_tree 0.3.4 → 0.3.5

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.
data/Gemfile CHANGED
@@ -1,14 +1,19 @@
1
1
  source :rubygems
2
2
 
3
+ # My personal global Gemfile in my work directory
3
4
  if File.exist?(file = File.expand_path('../../Gemfile',__FILE__))
4
5
  instance_eval(File.read(file))
5
6
  end
6
7
 
7
- gem "jeweler"
8
- gem "mongoid", "= 2.0.0.beta.16"
8
+ group :development do
9
+ gem "jeweler"
10
+ end
11
+
12
+ gem "mongoid", ">= 2.0.0.beta.16"
9
13
  # Currently used MongoDB version : 1.4.3
10
14
 
11
- gem "rspec", ">= 2.0.0.beta.19"
12
- gem "cucumber", ">= 0.8.5"
13
- gem "yard"
14
- gem "factory_girl"
15
+ group :test do
16
+ gem "rspec", ">= 2.0.0"
17
+ gem "cucumber", ">= 0.8.5"
18
+ gem "factory_girl"
19
+ end
data/Gemfile.lock CHANGED
@@ -1,56 +1,57 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
- activemodel (3.0.0.rc)
5
- activesupport (= 3.0.0.rc)
4
+ activemodel (3.0.1)
5
+ activesupport (= 3.0.1)
6
6
  builder (~> 2.1.2)
7
7
  i18n (~> 0.4.1)
8
- activesupport (3.0.0.rc)
8
+ activesupport (3.0.1)
9
9
  awesome_print (0.2.1)
10
- bson (1.0.4)
10
+ bson (1.1.1)
11
11
  builder (2.1.2)
12
- cucumber (0.8.5)
12
+ cucumber (0.9.2)
13
13
  builder (~> 2.1.2)
14
14
  diff-lcs (~> 1.1.2)
15
- gherkin (~> 2.1.4)
16
- json_pure (~> 1.4.3)
17
- term-ansicolor (~> 1.0.4)
15
+ gherkin (~> 2.2.5)
16
+ json (~> 1.4.6)
17
+ term-ansicolor (~> 1.0.5)
18
18
  diff-lcs (1.1.2)
19
- factory_girl (1.3.1)
19
+ factory_girl (1.3.2)
20
20
  gemcutter (0.6.1)
21
- gherkin (2.1.4)
22
- trollop (~> 1.16.2)
21
+ gherkin (2.2.9)
22
+ json (~> 1.4.6)
23
+ term-ansicolor (~> 1.0.5)
23
24
  git (1.2.5)
24
25
  i18n (0.4.1)
25
26
  jeweler (1.4.0)
26
27
  gemcutter (>= 0.1.0)
27
28
  git (>= 1.2.5)
28
29
  rubyforge (>= 2.0.0)
29
- json_pure (1.4.3)
30
- mongo (1.0.7)
31
- bson (>= 1.0.4)
32
- mongoid (2.0.0.beta.16)
33
- activemodel (= 3.0.0.rc)
34
- bson (= 1.0.4)
35
- mongo (= 1.0.7)
36
- tzinfo (= 0.3.22)
30
+ json (1.4.6)
31
+ json_pure (1.4.6)
32
+ mongo (1.0.9)
33
+ bson (>= 1.0.5)
34
+ mongoid (2.0.0.beta.19)
35
+ activemodel (~> 3.0)
36
+ mongo (= 1.0.9)
37
+ tzinfo (~> 0.3.22)
37
38
  will_paginate (~> 3.0.pre)
38
- rspec (2.0.0.beta.19)
39
- rspec-core (= 2.0.0.beta.19)
40
- rspec-expectations (= 2.0.0.beta.19)
41
- rspec-mocks (= 2.0.0.beta.19)
42
- rspec-core (2.0.0.beta.19)
43
- rspec-expectations (2.0.0.beta.19)
39
+ rspec (2.0.1)
40
+ rspec-core (~> 2.0.1)
41
+ rspec-expectations (~> 2.0.1)
42
+ rspec-mocks (~> 2.0.1)
43
+ rspec-core (2.0.1)
44
+ rspec-expectations (2.0.1)
44
45
  diff-lcs (>= 1.1.2)
45
- rspec-mocks (2.0.0.beta.19)
46
+ rspec-mocks (2.0.1)
47
+ rspec-core (~> 2.0.1)
48
+ rspec-expectations (~> 2.0.1)
46
49
  rubyforge (2.0.4)
47
50
  json_pure (>= 1.1.7)
48
51
  term-ansicolor (1.0.5)
49
- trollop (1.16.2)
50
- tzinfo (0.3.22)
52
+ tzinfo (0.3.23)
51
53
  will_paginate (3.0.pre2)
52
54
  wirble (0.1.3)
53
- yard (0.5.8)
54
55
 
55
56
  PLATFORMS
56
57
  ruby
@@ -60,7 +61,6 @@ DEPENDENCIES
60
61
  cucumber (>= 0.8.5)
61
62
  factory_girl
62
63
  jeweler
63
- mongoid (= 2.0.0.beta.16)
64
- rspec (>= 2.0.0.beta.19)
64
+ mongoid (>= 2.0.0.beta.16)
65
+ rspec (>= 2.0.0)
65
66
  wirble
66
- yard
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.4
1
+ 0.3.5
data/lib/mongoid_tree.rb CHANGED
@@ -80,15 +80,15 @@ module Mongoid
80
80
  end
81
81
 
82
82
  def root
83
- base_class.find(parent_ids.first)
83
+ base_class.find(parent_ids.first) unless root?
84
84
  end
85
85
 
86
86
  def ancestors
87
- base_class.where(:id.in => parent_ids)
87
+ base_class.where(:_id.in => parent_ids)
88
88
  end
89
89
 
90
90
  def ancestors_and_self
91
- ancestors + [self]
91
+ ancestors << self
92
92
  end
93
93
 
94
94
  #Comparable
@@ -150,13 +150,30 @@ module Mongoid
150
150
  child_ids_array = parent.child_ids.clone
151
151
  child_ids_array.delete(id)
152
152
  parent.update_attributes(:child_ids => child_ids_array )
153
- self.update_attributes(:parent_ids => [])
153
+ self.update_attributes(:parent_ids => [], :position => nil )
154
154
  # and append
155
155
  target_node.children << self
156
156
  # recurse through subtree
157
157
  rebuild_paths
158
158
  end
159
159
 
160
+ def move_to_position(target_node, index)
161
+ if index > target_node.child_ids.count
162
+ move_to(target_node)
163
+ else
164
+ # unhinge - I was getting a nil on another implementation, so this is a bit longer but works
165
+ child_ids_array = parent.child_ids.clone
166
+ child_ids_array.delete(id)
167
+ parent.update_attributes(:child_ids => child_ids_array )
168
+ self.update_attributes(:parent_ids => [], :position => nil )
169
+
170
+ target_node.children.sort[index - 1].insert_before(self)
171
+
172
+ # recurse through subtree
173
+ rebuild_paths
174
+ end
175
+ end
176
+
160
177
 
161
178
  def rebuild_paths
162
179
  update_path
data/mongoid_tree.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{mongoid_tree}
8
- s.version = "0.3.4"
8
+ s.version = "0.3.5"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Rainer Kuhn"]
12
- s.date = %q{2010-09-09}
12
+ s.date = %q{2010-10-21}
13
13
  s.description = %q{Fully featured tree implementation for Mongoid using materialized paths and relative associations. Featuring Depth and Breadth first search.}
14
14
  s.email = %q{rkuhn@littleweblab.com}
15
15
  s.extra_rdoc_files = [
@@ -1,13 +1,95 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
- describe "MongoidTree" do
3
+ describe Mongoid::Acts::Tree do
4
4
 
5
5
  before do
6
6
  [ Node ].each { |klass| klass.collection.remove }
7
7
  end
8
-
8
+
9
+ shared_examples_for "a root node" do
10
+ its (:parent_ids) {should be_empty}
11
+ its (:parent) {should be_nil}
12
+ its (:root) {should be_nil}
13
+ it {should be_root}
14
+ its (:ancestors) {should be_empty}
15
+ specify{subject.ancestors_and_self.should eq([subject])}
16
+ end
17
+
18
+ shared_examples_for "a parent node" do
19
+ its (:child_ids) {should_not be_empty}
20
+ its (:children) {should_not eq([])}
21
+ specify{subject.depth_first.should_not eq([subject])}
22
+ specify{subject.breadth_first.should_not eq([subject])}
23
+ end
24
+
25
+ shared_examples_for "a child node" do
26
+ its (:parent_ids) {should_not be_empty}
27
+ its (:parent) {should eq(parent)}
28
+ its (:root) {should_not be_nil}
29
+ it {should_not be_root}
30
+ its (:ancestors) {should_not be_empty}
31
+ specify{subject.ancestors_and_self.should_not eq([subject])}
32
+ end
33
+
34
+ shared_examples_for "a leaf node" do
35
+ its (:child_ids) {should be_empty}
36
+ its (:children) {should eq([])}
37
+ specify{subject.depth_first.should eq([subject])}
38
+ specify{subject.breadth_first.should eq([subject])}
39
+ it { should be_a_leaf }
40
+
41
+ end
42
+
43
+ describe "A node" do
44
+ let(:node) { Node.create :name => "A Node" }
45
+ subject {node}
46
+
47
+ it { should be_valid }
48
+ it_should_behave_like "a leaf node"
49
+ it_should_behave_like "a root node"
50
+
51
+ context "when adding a child" do
52
+ let(:parent){node}
53
+ let(:child){Node.create(:name => "A Child")}
54
+ before do
55
+ node.children << child
56
+ end
57
+
58
+ it_should_behave_like "a parent node"
59
+ it_should_behave_like "a root node"
60
+
61
+ it "should change the children count" do
62
+ expect{
63
+ node.children << Node.create(:name => "another child")
64
+ }.to change{node.child_ids.count}.by(1)
65
+ end
66
+
67
+ it "should exist 2 nodes" do
68
+ Node.count.should be(2)
69
+ end
70
+
71
+ it "should have 1 child" do
72
+ node.children.count.should be(1)
73
+ end
74
+
75
+ it "should be able to access the child" do
76
+ node.children.first.should eq(child)
77
+ end
78
+
79
+ its (:depth_first) {should eq([parent, child])}
80
+ its (:breadth_first) {should eq([parent,child])}
81
+
82
+ context "the child" do
83
+ subject{child}
84
+ it_should_behave_like "a leaf node"
85
+ it_should_behave_like "a child node"
86
+ end
87
+
88
+ end
89
+
90
+ end
91
+
9
92
  describe "A tree of nodes" do
10
-
11
93
  context "A node with a child" do
12
94
 
13
95
  before do
@@ -166,7 +248,21 @@ describe "MongoidTree" do
166
248
  getNode(9).parent_ids.should eql([getNode(1).id, getNode(2).id, getNode(6).id])
167
249
  getNode(10).parent_ids.should eql([getNode(1).id, getNode(2).id, getNode(6).id, getNode(9).id])
168
250
  getNode(11).parent_ids.should eql([getNode(1).id, getNode(2).id, getNode(6).id, getNode(9).id])
169
- end
251
+ end
252
+ end
253
+
254
+ it "should fix the position" do
255
+ getNode(11).move_to(getNode(1))
256
+ getNode(11).position.should be(4)
257
+ end
258
+
259
+ it "should move a node to a specific position" do
260
+ getNode(11).move_to_position(getNode(1),2)
261
+ getNode(2).position.should be(1)
262
+ getNode(11).position.should be(2)
263
+ getNode(7).position.should be(3)
264
+ getNode(8).position.should be(4)
265
+
170
266
  end
171
267
 
172
268
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 3
8
- - 4
9
- version: 0.3.4
8
+ - 5
9
+ version: 0.3.5
10
10
  platform: ruby
11
11
  authors:
12
12
  - Rainer Kuhn
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-09-09 00:00:00 +02:00
17
+ date: 2010-10-21 00:00:00 +02:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency