jnunemaker-mongomapper 0.3.3 → 0.3.4
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/History +6 -0
- data/VERSION +1 -1
- data/lib/mongomapper.rb +5 -3
- data/lib/mongomapper/associations.rb +0 -12
- data/lib/mongomapper/associations/base.rb +28 -16
- data/lib/mongomapper/associations/belongs_to_polymorphic_proxy.rb +2 -2
- data/lib/mongomapper/associations/belongs_to_proxy.rb +2 -2
- data/lib/mongomapper/associations/many_documents_as_proxy.rb +27 -0
- data/lib/mongomapper/document.rb +24 -7
- data/lib/mongomapper/embedded_document.rb +25 -14
- data/lib/mongomapper/serialization.rb +1 -1
- data/mongomapper.gemspec +5 -2
- data/test/functional/associations/test_many_documents_as_proxy.rb +253 -0
- data/test/functional/associations/test_many_polymorphic_proxy.rb +36 -34
- data/test/functional/associations/test_many_proxy.rb +7 -7
- data/test/functional/test_associations.rb +9 -2
- data/test/functional/test_document.rb +12 -4
- data/test/models.rb +59 -2
- data/test/unit/serializers/test_json_serializer.rb +36 -4
- data/test/unit/test_association_base.rb +10 -2
- data/test/unit/test_document.rb +0 -8
- data/test/unit/test_embedded_document.rb +65 -0
- data/test/unit/test_key.rb +7 -0
- metadata +6 -4
@@ -27,29 +27,31 @@ class ManyPolymorphicProxyTest < Test::Unit::TestCase
|
|
27
27
|
|
28
28
|
lambda {
|
29
29
|
room.messages = [
|
30
|
-
Enter.new(:body => 'John entered room'),
|
31
|
-
Chat.new(:body => 'Heyyyoooo!'),
|
32
|
-
Exit.new(:body => 'John exited room')
|
30
|
+
Enter.new(:body => 'John entered room', :position => 1),
|
31
|
+
Chat.new(:body => 'Heyyyoooo!', :position => 2),
|
32
|
+
Exit.new(:body => 'John exited room', :position => 3)
|
33
33
|
]
|
34
34
|
}.should change { Message.count }.by(3)
|
35
35
|
|
36
36
|
from_db = Room.find(room.id)
|
37
|
-
from_db.messages.
|
38
|
-
|
39
|
-
|
40
|
-
|
37
|
+
messages = from_db.messages.all :order => "position"
|
38
|
+
messages.size.should == 3
|
39
|
+
messages[0].body.should == 'John entered room'
|
40
|
+
messages[1].body.should == 'Heyyyoooo!'
|
41
|
+
messages[2].body.should == 'John exited room'
|
41
42
|
end
|
42
43
|
|
43
44
|
should "correctly store type when using <<, push and concat" do
|
44
45
|
room = Room.new
|
45
|
-
room.messages <<
|
46
|
-
room.messages.push
|
47
|
-
room.messages.concat
|
46
|
+
room.messages << Enter.new(:body => 'John entered the room', :position => 1)
|
47
|
+
room.messages.push Exit.new(:body => 'John entered the room', :position => 2)
|
48
|
+
room.messages.concat Chat.new(:body => 'Holla!' , :position => 3)
|
48
49
|
|
49
50
|
from_db = Room.find(room.id)
|
50
|
-
from_db.messages
|
51
|
-
|
52
|
-
|
51
|
+
messages = from_db.messages.all :order => "position"
|
52
|
+
messages[0]._type.should == 'Enter'
|
53
|
+
messages[1]._type.should == 'Exit'
|
54
|
+
messages[2]._type.should == 'Chat'
|
53
55
|
end
|
54
56
|
|
55
57
|
context "build" do
|
@@ -124,91 +126,91 @@ class ManyPolymorphicProxyTest < Test::Unit::TestCase
|
|
124
126
|
context "Finding scoped to association" do
|
125
127
|
setup do
|
126
128
|
@lounge = Room.create(:name => 'Lounge')
|
127
|
-
@lm1 = Message.create(:body => 'Loungin!')
|
128
|
-
@lm2 = Message.create(:body => 'I love loungin!')
|
129
|
+
@lm1 = Message.create(:body => 'Loungin!', :position => 1)
|
130
|
+
@lm2 = Message.create(:body => 'I love loungin!', :position => 2)
|
129
131
|
@lounge.messages = [@lm1, @lm2]
|
130
132
|
@lounge.save
|
131
133
|
|
132
134
|
@hall = Room.create(:name => 'Hall')
|
133
|
-
@hm1 = Message.create(:body => 'Do not fall in the hall')
|
134
|
-
@hm2 = Message.create(:body => 'Hall the king!')
|
135
|
-
@hm3 = Message.create(:body => 'Loungin!')
|
135
|
+
@hm1 = Message.create(:body => 'Do not fall in the hall', :position => 1)
|
136
|
+
@hm2 = Message.create(:body => 'Hall the king!', :position => 2)
|
137
|
+
@hm3 = Message.create(:body => 'Loungin!', :position => 3)
|
136
138
|
@hall.messages = [@hm1, @hm2, @hm3]
|
137
139
|
@hall.save
|
138
140
|
end
|
139
141
|
|
140
142
|
context "with :all" do
|
141
143
|
should "work" do
|
142
|
-
@lounge.messages.find(:all).should == [@lm1, @lm2]
|
144
|
+
@lounge.messages.find(:all, :order => "position").should == [@lm1, @lm2]
|
143
145
|
end
|
144
146
|
|
145
147
|
should "work with conditions" do
|
146
|
-
messages = @lounge.messages.find(:all, :conditions => {:body => 'Loungin!'})
|
148
|
+
messages = @lounge.messages.find(:all, :conditions => {:body => 'Loungin!'}, :order => "position")
|
147
149
|
messages.should == [@lm1]
|
148
150
|
end
|
149
151
|
|
150
152
|
should "work with order" do
|
151
|
-
messages = @lounge.messages.find(:all, :order => '
|
153
|
+
messages = @lounge.messages.find(:all, :order => 'position desc')
|
152
154
|
messages.should == [@lm2, @lm1]
|
153
155
|
end
|
154
156
|
end
|
155
157
|
|
156
158
|
context "with #all" do
|
157
159
|
should "work" do
|
158
|
-
@lounge.messages.all.should == [@lm1, @lm2]
|
160
|
+
@lounge.messages.all(:order => "position").should == [@lm1, @lm2]
|
159
161
|
end
|
160
162
|
|
161
163
|
should "work with conditions" do
|
162
|
-
messages = @lounge.messages.all(:conditions => {
|
164
|
+
messages = @lounge.messages.all(:conditions => {:body => 'Loungin!'}, :order => "position")
|
163
165
|
messages.should == [@lm1]
|
164
166
|
end
|
165
167
|
|
166
168
|
should "work with order" do
|
167
|
-
messages = @lounge.messages.all(:order => '
|
169
|
+
messages = @lounge.messages.all(:order => 'position desc')
|
168
170
|
messages.should == [@lm2, @lm1]
|
169
171
|
end
|
170
172
|
end
|
171
173
|
|
172
174
|
context "with :first" do
|
173
175
|
should "work" do
|
174
|
-
@lounge.messages.find(:first).should == @lm1
|
176
|
+
@lounge.messages.find(:first, :order => "position asc").should == @lm1
|
175
177
|
end
|
176
178
|
|
177
179
|
should "work with conditions" do
|
178
|
-
message = @lounge.messages.find(:first, :conditions => {:body => 'I love loungin!'})
|
180
|
+
message = @lounge.messages.find(:first, :conditions => {:body => 'I love loungin!'}, :order => "position asc")
|
179
181
|
message.should == @lm2
|
180
182
|
end
|
181
183
|
end
|
182
184
|
|
183
185
|
context "with #first" do
|
184
186
|
should "work" do
|
185
|
-
@lounge.messages.first.should == @lm1
|
187
|
+
@lounge.messages.first(:order => "position asc").should == @lm1
|
186
188
|
end
|
187
189
|
|
188
190
|
should "work with conditions" do
|
189
|
-
message = @lounge.messages.first(:conditions => {:body => 'I love loungin!'})
|
191
|
+
message = @lounge.messages.first(:conditions => {:body => 'I love loungin!'}, :order => "position asc")
|
190
192
|
message.should == @lm2
|
191
193
|
end
|
192
194
|
end
|
193
195
|
|
194
196
|
context "with :last" do
|
195
197
|
should "work" do
|
196
|
-
@lounge.messages.find(:last).should == @lm2
|
198
|
+
@lounge.messages.find(:last, :order => "position asc").should == @lm2
|
197
199
|
end
|
198
200
|
|
199
201
|
should "work with conditions" do
|
200
|
-
message = @lounge.messages.find(:last, :conditions => {:body => 'Loungin!'})
|
202
|
+
message = @lounge.messages.find(:last, :conditions => {:body => 'Loungin!'}, :order => "position asc")
|
201
203
|
message.should == @lm1
|
202
204
|
end
|
203
205
|
end
|
204
206
|
|
205
207
|
context "with #last" do
|
206
208
|
should "work" do
|
207
|
-
@lounge.messages.last.should == @lm2
|
209
|
+
@lounge.messages.last(:order => "position asc").should == @lm2
|
208
210
|
end
|
209
211
|
|
210
212
|
should "work with conditions" do
|
211
|
-
message = @lounge.messages.last(:conditions => {:body => 'Loungin!'})
|
213
|
+
message = @lounge.messages.last(:conditions => {:body => 'Loungin!'}, :order => "position asc")
|
212
214
|
message.should == @lm1
|
213
215
|
end
|
214
216
|
end
|
@@ -240,7 +242,7 @@ class ManyPolymorphicProxyTest < Test::Unit::TestCase
|
|
240
242
|
|
241
243
|
context "with #paginate" do
|
242
244
|
setup do
|
243
|
-
@messages = @hall.messages.paginate(:per_page => 2, :page => 1, :order => '
|
245
|
+
@messages = @hall.messages.paginate(:per_page => 2, :page => 1, :order => 'position asc')
|
244
246
|
end
|
245
247
|
|
246
248
|
should "return total pages" do
|
@@ -256,4 +258,4 @@ class ManyPolymorphicProxyTest < Test::Unit::TestCase
|
|
256
258
|
end
|
257
259
|
end
|
258
260
|
end
|
259
|
-
end
|
261
|
+
end
|
@@ -160,8 +160,8 @@ class ManyProxyTest < Test::Unit::TestCase
|
|
160
160
|
context "Finding scoped to association" do
|
161
161
|
setup do
|
162
162
|
@project1 = Project.new(:name => 'Project 1')
|
163
|
-
@brand_new = Status.create(:name => 'New')
|
164
|
-
@complete = Status.create(:name => 'Complete')
|
163
|
+
@brand_new = Status.create(:name => 'New', :position => 1 )
|
164
|
+
@complete = Status.create(:name => 'Complete', :position => 2)
|
165
165
|
@project1.statuses = [@brand_new, @complete]
|
166
166
|
@project1.save
|
167
167
|
|
@@ -175,7 +175,7 @@ class ManyProxyTest < Test::Unit::TestCase
|
|
175
175
|
|
176
176
|
context "with :all" do
|
177
177
|
should "work" do
|
178
|
-
@project1.statuses.find(:all).should == [@brand_new, @complete]
|
178
|
+
@project1.statuses.find(:all, :order => "position asc").should == [@brand_new, @complete]
|
179
179
|
end
|
180
180
|
|
181
181
|
should "work with conditions" do
|
@@ -191,7 +191,7 @@ class ManyProxyTest < Test::Unit::TestCase
|
|
191
191
|
|
192
192
|
context "with #all" do
|
193
193
|
should "work" do
|
194
|
-
@project1.statuses.all.should == [@brand_new, @complete]
|
194
|
+
@project1.statuses.all(:order => "position asc").should == [@brand_new, @complete]
|
195
195
|
end
|
196
196
|
|
197
197
|
should "work with conditions" do
|
@@ -229,7 +229,7 @@ class ManyProxyTest < Test::Unit::TestCase
|
|
229
229
|
|
230
230
|
context "with :last" do
|
231
231
|
should "work" do
|
232
|
-
@project1.statuses.find(:last).should == @complete
|
232
|
+
@project1.statuses.find(:last, :order => "position asc").should == @complete
|
233
233
|
end
|
234
234
|
|
235
235
|
should "work with conditions" do
|
@@ -240,7 +240,7 @@ class ManyProxyTest < Test::Unit::TestCase
|
|
240
240
|
|
241
241
|
context "with #last" do
|
242
242
|
should "work" do
|
243
|
-
@project1.statuses.last.should == @complete
|
243
|
+
@project1.statuses.last(:order => "position asc").should == @complete
|
244
244
|
end
|
245
245
|
|
246
246
|
should "work with conditions" do
|
@@ -292,4 +292,4 @@ class ManyProxyTest < Test::Unit::TestCase
|
|
292
292
|
end
|
293
293
|
end
|
294
294
|
end
|
295
|
-
end
|
295
|
+
end
|
@@ -5,21 +5,28 @@ class AssociationsTest < Test::Unit::TestCase
|
|
5
5
|
def setup
|
6
6
|
clear_all_collections
|
7
7
|
end
|
8
|
-
|
8
|
+
|
9
9
|
should "allow changing class names" do
|
10
10
|
class AwesomeUser
|
11
11
|
include MongoMapper::Document
|
12
|
+
|
12
13
|
many :posts, :class_name => 'AssociationsTest::AwesomePost', :foreign_key => :creator_id
|
13
14
|
end
|
14
15
|
|
15
16
|
class AwesomeTag
|
16
17
|
include MongoMapper::EmbeddedDocument
|
18
|
+
|
17
19
|
key :name, String
|
20
|
+
key :post_id, String
|
21
|
+
|
18
22
|
belongs_to :post, :class_name => 'AssociationsTest::AwesomeUser'
|
19
23
|
end
|
20
24
|
|
21
25
|
class AwesomePost
|
22
26
|
include MongoMapper::Document
|
27
|
+
|
28
|
+
key :creator_id, String
|
29
|
+
|
23
30
|
belongs_to :creator, :class_name => 'AssociationsTest::AwesomeUser'
|
24
31
|
many :tags, :class_name => 'AssociationsTest::AwesomeTag', :foreign_key => :post_id
|
25
32
|
end
|
@@ -36,5 +43,5 @@ class AssociationsTest < Test::Unit::TestCase
|
|
36
43
|
|
37
44
|
post1_from_db = AwesomePost.find(post1.id)
|
38
45
|
post1_from_db.tags.should == [tag1]
|
39
|
-
end
|
46
|
+
end
|
40
47
|
end
|
@@ -331,13 +331,13 @@ class DocumentTest < Test::Unit::TestCase
|
|
331
331
|
|
332
332
|
context "with :last" do
|
333
333
|
should "find last document" do
|
334
|
-
@document.find(:last, :order => 'age
|
334
|
+
@document.find(:last, :order => 'age').should == @doc2
|
335
335
|
end
|
336
336
|
end
|
337
337
|
|
338
338
|
context "with #last" do
|
339
339
|
should "find last document based on criteria" do
|
340
|
-
@document.last(:order => 'age
|
340
|
+
@document.last(:order => 'age').should == @doc2
|
341
341
|
@document.last(:conditions => {:age => 28}).should == @doc2
|
342
342
|
end
|
343
343
|
end
|
@@ -375,7 +375,7 @@ class DocumentTest < Test::Unit::TestCase
|
|
375
375
|
end
|
376
376
|
|
377
377
|
should "find last document based on arguments" do
|
378
|
-
doc = @document.find_last_by_last_name('Nunemaker', :order => 'age
|
378
|
+
doc = @document.find_last_by_last_name('Nunemaker', :order => 'age')
|
379
379
|
doc.should == @doc1
|
380
380
|
end
|
381
381
|
|
@@ -561,6 +561,7 @@ class DocumentTest < Test::Unit::TestCase
|
|
561
561
|
context "many" do
|
562
562
|
context "=> destroy" do
|
563
563
|
setup do
|
564
|
+
Property.key :thing_id, String
|
564
565
|
Property.belongs_to :thing, :dependent => :destroy
|
565
566
|
Thing.many :properties, :dependent => :destroy
|
566
567
|
|
@@ -583,6 +584,7 @@ class DocumentTest < Test::Unit::TestCase
|
|
583
584
|
|
584
585
|
context "=> delete_all" do
|
585
586
|
setup do
|
587
|
+
Property.key :thing_id, String
|
586
588
|
Property.belongs_to :thing
|
587
589
|
Thing.has_many :properties, :dependent => :delete_all
|
588
590
|
|
@@ -605,6 +607,7 @@ class DocumentTest < Test::Unit::TestCase
|
|
605
607
|
|
606
608
|
context "=> nullify" do
|
607
609
|
setup do
|
610
|
+
Property.key :thing_id, String
|
608
611
|
Property.belongs_to :thing
|
609
612
|
Thing.has_many :properties, :dependent => :nullify
|
610
613
|
|
@@ -629,6 +632,7 @@ class DocumentTest < Test::Unit::TestCase
|
|
629
632
|
context "belongs_to" do
|
630
633
|
context "=> destroy" do
|
631
634
|
setup do
|
635
|
+
Property.key :thing_id, String
|
632
636
|
Property.belongs_to :thing, :dependent => :destroy
|
633
637
|
Thing.has_many :properties
|
634
638
|
|
@@ -713,7 +717,7 @@ class DocumentTest < Test::Unit::TestCase
|
|
713
717
|
index_name = @document.ensure_index [[:first_name, 1], [:last_name, -1]]
|
714
718
|
}.should change { @document.collection.index_information.size }.by(1)
|
715
719
|
|
716
|
-
|
720
|
+
[ 'first_name_1_last_name_-1', 'last_name_-1_first_name_1' ].should include(index_name)
|
717
721
|
|
718
722
|
index = @document.collection.index_information[index_name]
|
719
723
|
index.should_not be_nil
|
@@ -910,6 +914,10 @@ class DocumentTest < Test::Unit::TestCase
|
|
910
914
|
end
|
911
915
|
|
912
916
|
context "timestamping" do
|
917
|
+
setup do
|
918
|
+
@document.timestamps!
|
919
|
+
end
|
920
|
+
|
913
921
|
should "set created_at and updated_at on create" do
|
914
922
|
doc = @document.new(:first_name => 'John', :age => 27)
|
915
923
|
doc.created_at.should be(nil)
|
data/test/models.rb
CHANGED
@@ -1,5 +1,30 @@
|
|
1
|
+
class Post
|
2
|
+
include MongoMapper::Document
|
3
|
+
|
4
|
+
key :title, String
|
5
|
+
key :body, String
|
6
|
+
|
7
|
+
has_many :comments, :as => :commentable, :class_name => 'PostComment'
|
8
|
+
|
9
|
+
timestamps!
|
10
|
+
end
|
11
|
+
|
12
|
+
class PostComment
|
13
|
+
include MongoMapper::Document
|
14
|
+
|
15
|
+
key :username, String, :default => 'Anonymous'
|
16
|
+
key :body, String
|
17
|
+
|
18
|
+
key :commentable_id, String
|
19
|
+
key :commentable_type, String
|
20
|
+
belongs_to :commentable, :polymorphic => true
|
21
|
+
|
22
|
+
timestamps!
|
23
|
+
end
|
24
|
+
|
1
25
|
class Address
|
2
26
|
include MongoMapper::EmbeddedDocument
|
27
|
+
|
3
28
|
key :address, String
|
4
29
|
key :city, String
|
5
30
|
key :state, String
|
@@ -8,22 +33,35 @@ end
|
|
8
33
|
|
9
34
|
class Message
|
10
35
|
include MongoMapper::Document
|
36
|
+
|
11
37
|
key :body, String
|
38
|
+
key :position, Integer
|
39
|
+
key :_type, String
|
40
|
+
key :room_id, String
|
41
|
+
|
12
42
|
belongs_to :room
|
13
43
|
end
|
14
44
|
|
45
|
+
class Answer
|
46
|
+
include MongoMapper::Document
|
47
|
+
|
48
|
+
key :body, String
|
49
|
+
end
|
50
|
+
|
15
51
|
class Enter < Message; end
|
16
52
|
class Exit < Message; end
|
17
53
|
class Chat < Message; end
|
18
54
|
|
19
55
|
class Room
|
20
56
|
include MongoMapper::Document
|
57
|
+
|
21
58
|
key :name, String
|
22
59
|
many :messages, :polymorphic => true
|
23
60
|
end
|
24
61
|
|
25
62
|
class Project
|
26
63
|
include MongoMapper::Document
|
64
|
+
|
27
65
|
key :name, String
|
28
66
|
many :statuses
|
29
67
|
many :addresses
|
@@ -31,13 +69,20 @@ end
|
|
31
69
|
|
32
70
|
class Status
|
33
71
|
include MongoMapper::Document
|
72
|
+
|
73
|
+
key :project_id, String
|
74
|
+
key :target_id, String
|
75
|
+
key :target_type, String
|
76
|
+
key :name, String
|
77
|
+
key :position, Integer
|
78
|
+
|
34
79
|
belongs_to :project
|
35
80
|
belongs_to :target, :polymorphic => true
|
36
|
-
key :name, String
|
37
81
|
end
|
38
82
|
|
39
83
|
class RealPerson
|
40
84
|
include MongoMapper::Document
|
85
|
+
|
41
86
|
many :pets
|
42
87
|
key :name, String
|
43
88
|
|
@@ -48,19 +93,24 @@ end
|
|
48
93
|
|
49
94
|
class Person
|
50
95
|
include MongoMapper::EmbeddedDocument
|
96
|
+
|
51
97
|
key :name, String
|
52
98
|
key :child, Person
|
99
|
+
|
53
100
|
many :pets
|
54
101
|
end
|
55
102
|
|
56
103
|
class Pet
|
57
104
|
include MongoMapper::EmbeddedDocument
|
105
|
+
|
58
106
|
key :name, String
|
59
107
|
key :species, String
|
60
108
|
end
|
61
109
|
|
62
110
|
class Media
|
63
111
|
include MongoMapper::EmbeddedDocument
|
112
|
+
|
113
|
+
key :_type, String
|
64
114
|
key :file, String
|
65
115
|
end
|
66
116
|
|
@@ -79,34 +129,41 @@ end
|
|
79
129
|
|
80
130
|
class Catalog
|
81
131
|
include MongoMapper::Document
|
132
|
+
|
82
133
|
many :medias, :polymorphic => true
|
83
134
|
end
|
84
135
|
|
85
136
|
module TrModels
|
86
137
|
class Transport
|
87
138
|
include MongoMapper::EmbeddedDocument
|
139
|
+
|
140
|
+
key :_type, String
|
88
141
|
key :license_plate, String
|
89
142
|
end
|
90
143
|
|
91
144
|
class Car < TrModels::Transport
|
92
145
|
include MongoMapper::EmbeddedDocument
|
146
|
+
|
93
147
|
key :model, String
|
94
148
|
key :year, Integer
|
95
149
|
end
|
96
150
|
|
97
151
|
class Bus < TrModels::Transport
|
98
152
|
include MongoMapper::EmbeddedDocument
|
153
|
+
|
99
154
|
key :max_passengers, Integer
|
100
155
|
end
|
101
156
|
|
102
157
|
class Ambulance < TrModels::Transport
|
103
158
|
include MongoMapper::EmbeddedDocument
|
159
|
+
|
104
160
|
key :icu, Boolean
|
105
161
|
end
|
106
162
|
|
107
163
|
class Fleet
|
108
164
|
include MongoMapper::Document
|
165
|
+
|
109
166
|
many :transports, :polymorphic => true, :class_name => "TrModels::Transport"
|
110
167
|
key :name, String
|
111
168
|
end
|
112
|
-
end
|
169
|
+
end
|