pwnash-mongo_mapper 0.7.5 → 0.7.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. data/lib/mongo_mapper.rb +6 -8
  2. data/lib/mongo_mapper/document.rb +6 -281
  3. data/lib/mongo_mapper/embedded_document.rb +5 -45
  4. data/lib/mongo_mapper/extensions.rb +190 -0
  5. data/lib/mongo_mapper/plugins.rb +27 -18
  6. data/lib/mongo_mapper/plugins/associations.rb +7 -6
  7. data/lib/mongo_mapper/plugins/associations/base.rb +1 -0
  8. data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +1 -0
  9. data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +1 -0
  10. data/lib/mongo_mapper/plugins/associations/collection.rb +1 -0
  11. data/lib/mongo_mapper/plugins/associations/embedded_collection.rb +1 -0
  12. data/lib/mongo_mapper/plugins/associations/in_array_proxy.rb +2 -1
  13. data/lib/mongo_mapper/plugins/associations/many_documents_as_proxy.rb +1 -0
  14. data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +4 -4
  15. data/lib/mongo_mapper/plugins/associations/many_embedded_polymorphic_proxy.rb +1 -0
  16. data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +1 -0
  17. data/lib/mongo_mapper/plugins/associations/many_polymorphic_proxy.rb +1 -0
  18. data/lib/mongo_mapper/plugins/associations/one_embedded_proxy.rb +1 -0
  19. data/lib/mongo_mapper/plugins/associations/one_proxy.rb +1 -0
  20. data/lib/mongo_mapper/plugins/associations/proxy.rb +1 -0
  21. data/lib/mongo_mapper/plugins/callbacks.rb +4 -3
  22. data/lib/mongo_mapper/plugins/clone.rb +1 -0
  23. data/lib/mongo_mapper/plugins/descendants.rb +1 -0
  24. data/lib/mongo_mapper/plugins/dirty.rb +1 -0
  25. data/lib/mongo_mapper/plugins/document.rb +40 -0
  26. data/lib/mongo_mapper/plugins/dynamic_querying.rb +42 -0
  27. data/lib/mongo_mapper/{support/find.rb → plugins/dynamic_querying/dynamic_finder.rb} +2 -36
  28. data/lib/mongo_mapper/plugins/embedded_document.rb +48 -0
  29. data/lib/mongo_mapper/plugins/equality.rb +1 -0
  30. data/lib/mongo_mapper/plugins/identity_map.rb +8 -11
  31. data/lib/mongo_mapper/plugins/indexes.rb +11 -0
  32. data/lib/mongo_mapper/plugins/inspect.rb +1 -0
  33. data/lib/mongo_mapper/plugins/keys.rb +7 -9
  34. data/lib/mongo_mapper/plugins/keys/key.rb +12 -2
  35. data/lib/mongo_mapper/plugins/logger.rb +1 -0
  36. data/lib/mongo_mapper/plugins/modifiers.rb +3 -2
  37. data/lib/mongo_mapper/plugins/pagination.rb +1 -0
  38. data/lib/mongo_mapper/plugins/pagination/proxy.rb +1 -0
  39. data/lib/mongo_mapper/plugins/persistence.rb +1 -0
  40. data/lib/mongo_mapper/plugins/protected.rb +1 -0
  41. data/lib/mongo_mapper/plugins/query_logger.rb +5 -10
  42. data/lib/mongo_mapper/plugins/querying.rb +236 -0
  43. data/lib/mongo_mapper/plugins/rails.rb +1 -0
  44. data/lib/mongo_mapper/plugins/sci.rb +31 -0
  45. data/lib/mongo_mapper/plugins/serialization.rb +1 -0
  46. data/lib/mongo_mapper/plugins/timestamps.rb +1 -0
  47. data/lib/mongo_mapper/plugins/userstamps.rb +1 -0
  48. data/lib/mongo_mapper/plugins/validations.rb +5 -1
  49. data/lib/mongo_mapper/query.rb +53 -120
  50. data/lib/mongo_mapper/support.rb +2 -213
  51. data/lib/mongo_mapper/support/descendant_appends.rb +3 -6
  52. data/lib/mongo_mapper/version.rb +2 -1
  53. metadata +156 -190
  54. data/.gitignore +0 -10
  55. data/Rakefile +0 -37
  56. data/mongo_mapper.gemspec +0 -216
  57. data/performance/read_write.rb +0 -52
  58. data/specs.watchr +0 -51
  59. data/test/NOTE_ON_TESTING +0 -1
  60. data/test/active_model_lint_test.rb +0 -13
  61. data/test/functional/associations/test_belongs_to_polymorphic_proxy.rb +0 -63
  62. data/test/functional/associations/test_belongs_to_proxy.rb +0 -101
  63. data/test/functional/associations/test_in_array_proxy.rb +0 -325
  64. data/test/functional/associations/test_many_documents_as_proxy.rb +0 -229
  65. data/test/functional/associations/test_many_documents_proxy.rb +0 -536
  66. data/test/functional/associations/test_many_embedded_polymorphic_proxy.rb +0 -176
  67. data/test/functional/associations/test_many_embedded_proxy.rb +0 -256
  68. data/test/functional/associations/test_many_polymorphic_proxy.rb +0 -302
  69. data/test/functional/associations/test_one_embedded_proxy.rb +0 -68
  70. data/test/functional/associations/test_one_proxy.rb +0 -196
  71. data/test/functional/test_associations.rb +0 -44
  72. data/test/functional/test_binary.rb +0 -27
  73. data/test/functional/test_callbacks.rb +0 -151
  74. data/test/functional/test_dirty.rb +0 -163
  75. data/test/functional/test_document.rb +0 -1219
  76. data/test/functional/test_embedded_document.rb +0 -210
  77. data/test/functional/test_identity_map.rb +0 -507
  78. data/test/functional/test_indexing.rb +0 -44
  79. data/test/functional/test_logger.rb +0 -20
  80. data/test/functional/test_modifiers.rb +0 -416
  81. data/test/functional/test_pagination.rb +0 -93
  82. data/test/functional/test_protected.rb +0 -163
  83. data/test/functional/test_string_id_compatibility.rb +0 -67
  84. data/test/functional/test_timestamps.rb +0 -64
  85. data/test/functional/test_userstamps.rb +0 -28
  86. data/test/functional/test_validations.rb +0 -342
  87. data/test/models.rb +0 -227
  88. data/test/support/custom_matchers.rb +0 -37
  89. data/test/support/timing.rb +0 -16
  90. data/test/test_helper.rb +0 -64
  91. data/test/unit/associations/test_base.rb +0 -212
  92. data/test/unit/associations/test_proxy.rb +0 -105
  93. data/test/unit/serializers/test_json_serializer.rb +0 -202
  94. data/test/unit/test_descendant_appends.rb +0 -71
  95. data/test/unit/test_document.rb +0 -225
  96. data/test/unit/test_dynamic_finder.rb +0 -123
  97. data/test/unit/test_embedded_document.rb +0 -657
  98. data/test/unit/test_keys.rb +0 -216
  99. data/test/unit/test_mongo_mapper.rb +0 -118
  100. data/test/unit/test_pagination.rb +0 -160
  101. data/test/unit/test_plugins.rb +0 -50
  102. data/test/unit/test_query.rb +0 -374
  103. data/test/unit/test_rails.rb +0 -181
  104. data/test/unit/test_rails_compatibility.rb +0 -52
  105. data/test/unit/test_serialization.rb +0 -51
  106. data/test/unit/test_support.rb +0 -390
  107. data/test/unit/test_time_zones.rb +0 -39
  108. data/test/unit/test_validations.rb +0 -544
@@ -1,536 +0,0 @@
1
- require 'test_helper'
2
- require 'models'
3
-
4
- class ManyDocumentsProxyTest < Test::Unit::TestCase
5
- def setup
6
- Project.collection.remove
7
- Status.collection.remove
8
-
9
- @pet_class = Doc do
10
- key :name, String
11
- key :owner_id, ObjectId
12
- end
13
-
14
- @owner_class = Doc do
15
- key :name, String
16
- end
17
- @owner_class.many :pets, :class => @pet_class, :foreign_key => :owner_id, :order => 'name'
18
- end
19
-
20
- should "default reader to empty array" do
21
- project = Project.new
22
- project.statuses.should == []
23
- end
24
-
25
- should "allow assignment of many associated documents using a hash" do
26
- person_attributes = {
27
- 'name' => 'Mr. Pet Lover',
28
- 'pets' => [
29
- {'name' => 'Jimmy', 'species' => 'Cocker Spainel'},
30
- {'name' => 'Sasha', 'species' => 'Siberian Husky'},
31
- ]
32
- }
33
-
34
- owner = @owner_class.new(person_attributes)
35
- owner.name.should == 'Mr. Pet Lover'
36
- owner.pets[0].name.should == 'Jimmy'
37
- owner.pets[0].species.should == 'Cocker Spainel'
38
- owner.pets[1].name.should == 'Sasha'
39
- owner.pets[1].species.should == 'Siberian Husky'
40
-
41
- owner.save.should be_true
42
- owner.reload
43
-
44
- owner.name.should == 'Mr. Pet Lover'
45
- owner.pets[0].name.should == 'Jimmy'
46
- owner.pets[0].species.should == 'Cocker Spainel'
47
- owner.pets[1].name.should == 'Sasha'
48
- owner.pets[1].species.should == 'Siberian Husky'
49
- end
50
-
51
- should "allow adding to association like it was an array" do
52
- project = Project.new
53
- project.statuses << Status.new(:name => 'Foo1!')
54
- project.statuses.push Status.new(:name => 'Foo2!')
55
- project.statuses.concat Status.new(:name => 'Foo3!')
56
- project.statuses.size.should == 3
57
- end
58
-
59
- context "replacing the association" do
60
- context "with objects of the class" do
61
- should "work" do
62
- project = Project.new
63
- project.statuses = [Status.new(:name => "ready")]
64
- project.save.should be_true
65
-
66
- project.reload
67
- project.statuses.size.should == 1
68
- project.statuses[0].name.should == "ready"
69
- end
70
- end
71
-
72
- context "with Hashes" do
73
- should "convert to objects of the class and work" do
74
- project = Project.new
75
- project.statuses = [{ 'name' => 'ready' }]
76
- project.save.should be_true
77
-
78
- project.reload
79
- project.statuses.size.should == 1
80
- project.statuses[0].name.should == "ready"
81
- end
82
- end
83
- end
84
-
85
- context "using <<, push and concat" do
86
- context "with objects of the class" do
87
- should "correctly assign foreign key" do
88
- project = Project.new
89
- project.statuses << Status.new(:name => '<<')
90
- project.statuses.push Status.new(:name => 'push')
91
- project.statuses.concat Status.new(:name => 'concat')
92
-
93
- project.reload
94
- project.statuses[0].project_id.should == project.id
95
- project.statuses[1].project_id.should == project.id
96
- project.statuses[2].project_id.should == project.id
97
- end
98
- end
99
-
100
- context "with Hashes" do
101
- should "correctly convert to objects and assign foreign key" do
102
- project = Project.new
103
- project.statuses << { 'name' => '<<' }
104
- project.statuses.push( { 'name' => 'push' })
105
- project.statuses.concat({ 'name' => 'concat' })
106
-
107
- project.reload
108
- project.statuses[0].project_id.should == project.id
109
- project.statuses[1].project_id.should == project.id
110
- project.statuses[2].project_id.should == project.id
111
- end
112
- end
113
- end
114
-
115
- context "build" do
116
- should "assign foreign key" do
117
- project = Project.create
118
- status = project.statuses.build
119
- status.project_id.should == project.id
120
- end
121
-
122
- should "allow assigning attributes" do
123
- project = Project.create
124
- status = project.statuses.build(:name => 'Foo')
125
- status.name.should == 'Foo'
126
- end
127
-
128
- should "reset cache" do
129
- project = Project.create
130
- project.statuses.size.should == 0
131
- status = project.statuses.build(:name => 'Foo')
132
- status.save!
133
- project.statuses.size.should == 1
134
- end
135
-
136
- should "update collection without save" do
137
- project = Project.create
138
- project.statuses.build(:name => 'Foo')
139
- project.statuses.size.should == 1
140
- end
141
-
142
- should "save built document when saving parent" do
143
- project = Project.create
144
- status = project.statuses.build(:name => 'Foo')
145
- project.save!
146
- status.should_not be_new
147
- end
148
- end
149
-
150
- context "create" do
151
- should "assign foreign key" do
152
- project = Project.create
153
- status = project.statuses.create(:name => 'Foo!')
154
- status.project_id.should == project.id
155
- end
156
-
157
- should "save record" do
158
- project = Project.create
159
- lambda {
160
- project.statuses.create(:name => 'Foo!')
161
- }.should change { Status.count }
162
- end
163
-
164
- should "allow passing attributes" do
165
- project = Project.create
166
- status = project.statuses.create(:name => 'Foo!')
167
- status.name.should == 'Foo!'
168
- end
169
-
170
- should "reset cache" do
171
- project = Project.create
172
- project.statuses.size.should == 0
173
- project.statuses.create(:name => 'Foo!')
174
- project.statuses.size.should == 1
175
- end
176
- end
177
-
178
- context "create!" do
179
- should "assign foreign key" do
180
- project = Project.create
181
- status = project.statuses.create!(:name => 'Foo!')
182
- status.project_id.should == project.id
183
- end
184
-
185
- should "save record" do
186
- project = Project.create
187
- lambda {
188
- project.statuses.create!(:name => 'Foo!')
189
- }.should change { Status.count }
190
- end
191
-
192
- should "allow passing attributes" do
193
- project = Project.create
194
- status = project.statuses.create!(:name => 'Foo!')
195
- status.name.should == 'Foo!'
196
- end
197
-
198
- should "raise exception if not valid" do
199
- project = Project.create
200
- lambda {
201
- project.statuses.create!(:name => nil)
202
- }.should raise_error(MongoMapper::DocumentNotValid)
203
- end
204
-
205
- should "reset cache" do
206
- project = Project.create
207
- project.statuses.size.should == 0
208
- project.statuses.create!(:name => 'Foo!')
209
- project.statuses.size.should == 1
210
- end
211
- end
212
-
213
- context "count" do
214
- should "work scoped to association" do
215
- project = Project.create
216
- 3.times { project.statuses.create(:name => 'Foo!') }
217
-
218
- other_project = Project.create
219
- 2.times { other_project.statuses.create(:name => 'Foo!') }
220
-
221
- project.statuses.count.should == 3
222
- other_project.statuses.count.should == 2
223
- end
224
-
225
- should "work with conditions" do
226
- project = Project.create
227
- project.statuses.create(:name => 'Foo')
228
- project.statuses.create(:name => 'Other 1')
229
- project.statuses.create(:name => 'Other 2')
230
-
231
- project.statuses.count(:name => 'Foo').should == 1
232
- end
233
- end
234
-
235
- context "Unassociating documents" do
236
- setup do
237
- @project = Project.create
238
- @project.statuses << Status.create(:name => '1')
239
- @project.statuses << Status.create(:name => '2')
240
-
241
- @project2 = Project.create
242
- @project2.statuses << Status.create(:name => '1')
243
- @project2.statuses << Status.create(:name => '2')
244
- end
245
-
246
- should "work with destroy all" do
247
- @project.statuses.count.should == 2
248
- @project.statuses.destroy_all
249
- @project.statuses.count.should == 0
250
-
251
- @project2.statuses.count.should == 2
252
- Status.count.should == 2
253
- end
254
-
255
- should "work with destroy all and conditions" do
256
- @project.statuses.count.should == 2
257
- @project.statuses.destroy_all(:name => '1')
258
- @project.statuses.count.should == 1
259
-
260
- @project2.statuses.count.should == 2
261
- Status.count.should == 3
262
- end
263
-
264
- should "work with delete all" do
265
- @project.statuses.count.should == 2
266
- @project.statuses.delete_all
267
- @project.statuses.count.should == 0
268
-
269
- @project2.statuses.count.should == 2
270
- Status.count.should == 2
271
- end
272
-
273
- should "work with delete all and conditions" do
274
- @project.statuses.count.should == 2
275
- @project.statuses.delete_all(:name => '1')
276
- @project.statuses.count.should == 1
277
-
278
- @project2.statuses.count.should == 2
279
- Status.count.should == 3
280
- end
281
-
282
- should "work with nullify" do
283
- @project.statuses.count.should == 2
284
- @project.statuses.nullify
285
- @project.statuses.count.should == 0
286
-
287
- @project2.statuses.count.should == 2
288
- Status.count.should == 4
289
- Status.count(:name => '1').should == 2
290
- Status.count(:name => '2').should == 2
291
- end
292
- end
293
-
294
- context "Finding scoped to association" do
295
- setup do
296
- @project1 = Project.new(:name => 'Project 1')
297
- @brand_new = Status.create(:name => 'New', :position => 1 )
298
- @complete = Status.create(:name => 'Complete', :position => 2)
299
- @project1.statuses = [@brand_new, @complete]
300
- @project1.save
301
-
302
- @project2 = Project.create(:name => 'Project 2')
303
- @in_progress = Status.create(:name => 'In Progress')
304
- @archived = Status.create(:name => 'Archived')
305
- @another_complete = Status.create(:name => 'Complete')
306
- @project2.statuses = [@in_progress, @archived, @another_complete]
307
- @project2.save
308
- end
309
-
310
- context "dynamic finders" do
311
- should "work with single key" do
312
- @project1.statuses.find_by_name('New').should == @brand_new
313
- @project1.statuses.find_by_name!('New').should == @brand_new
314
- @project2.statuses.find_by_name('In Progress').should == @in_progress
315
- @project2.statuses.find_by_name!('In Progress').should == @in_progress
316
- end
317
-
318
- should "work with multiple keys" do
319
- @project1.statuses.find_by_name_and_position('New', 1).should == @brand_new
320
- @project1.statuses.find_by_name_and_position!('New', 1).should == @brand_new
321
- @project1.statuses.find_by_name_and_position('New', 2).should be_nil
322
- end
323
-
324
- should "raise error when using !" do
325
- lambda {
326
- @project1.statuses.find_by_name!('Fake')
327
- }.should raise_error(MongoMapper::DocumentNotFound)
328
- end
329
-
330
- context "find_or_create_by" do
331
- should "not create document if found" do
332
- lambda {
333
- status = @project1.statuses.find_or_create_by_name('New')
334
- status.project.should == @project1
335
- status.should == @brand_new
336
- }.should_not change { Status.count }
337
- end
338
-
339
- should "create document if not found" do
340
- lambda {
341
- status = @project1.statuses.find_or_create_by_name('Delivered')
342
- status.project.should == @project1
343
- }.should change { Status.count }
344
- end
345
- end
346
- end
347
-
348
- context "all" do
349
- should "work" do
350
- @project1.statuses.all(:order => "position asc").should == [@brand_new, @complete]
351
- end
352
-
353
- should "work with conditions" do
354
- @project1.statuses.all(:name => 'Complete').should == [@complete]
355
- end
356
- end
357
-
358
- context "first" do
359
- should "work" do
360
- @project1.statuses.first(:order => 'name').should == @complete
361
- end
362
-
363
- should "work with conditions" do
364
- @project1.statuses.first(:name => 'Complete').should == @complete
365
- end
366
- end
367
-
368
- context "last" do
369
- should "work" do
370
- @project1.statuses.last(:order => "position asc").should == @complete
371
- end
372
-
373
- should "work with conditions" do
374
- @project1.statuses.last(:order => 'position', :name => 'New').should == @brand_new
375
- end
376
- end
377
-
378
- context "with one id" do
379
- should "work for id in association" do
380
- @project1.statuses.find(@complete.id).should == @complete
381
- end
382
-
383
- should "not work for id not in association" do
384
- lambda {
385
- @project1.statuses.find!(@archived.id)
386
- }.should raise_error(MongoMapper::DocumentNotFound)
387
- end
388
- end
389
-
390
- context "with multiple ids" do
391
- should "work for ids in association" do
392
- statuses = @project1.statuses.find(@brand_new.id, @complete.id)
393
- statuses.should == [@brand_new, @complete]
394
- end
395
-
396
- should "not work for ids not in association" do
397
- assert_raises(MongoMapper::DocumentNotFound) do
398
- @project1.statuses.find!(@brand_new.id, @complete.id, @archived.id)
399
- end
400
- end
401
- end
402
-
403
- context "with #paginate" do
404
- setup do
405
- @statuses = @project2.statuses.paginate(:per_page => 2, :page => 1, :order => 'name asc')
406
- end
407
-
408
- should "return total pages" do
409
- @statuses.total_pages.should == 2
410
- end
411
-
412
- should "return total entries" do
413
- @statuses.total_entries.should == 3
414
- end
415
-
416
- should "return the subject" do
417
- @statuses.collect(&:name).should == %w(Archived Complete)
418
- end
419
- end
420
- end
421
-
422
- context "extending the association" do
423
- should "work using a block passed to many" do
424
- project = Project.new(:name => "Some Project")
425
- status1 = Status.new(:name => "New")
426
- status2 = Status.new(:name => "Assigned")
427
- status3 = Status.new(:name => "Closed")
428
- project.statuses = [status1, status2, status3]
429
- project.save
430
-
431
- open_statuses = project.statuses.open
432
- open_statuses.should include(status1)
433
- open_statuses.should include(status2)
434
- open_statuses.should_not include(status3)
435
- end
436
-
437
- should "work using many's :extend option" do
438
- project = Project.new(:name => "Some Project")
439
- collaborator1 = Collaborator.new(:name => "zing")
440
- collaborator2 = Collaborator.new(:name => "zang")
441
- project.collaborators = [collaborator1, collaborator2]
442
- project.save
443
- project.collaborators.top.should == collaborator1
444
- end
445
- end
446
-
447
- context ":dependent" do
448
- setup do
449
- # FIXME: make use of already defined models
450
- class ::Property
451
- include MongoMapper::Document
452
- end
453
- Property.collection.remove
454
-
455
- class ::Thing
456
- include MongoMapper::Document
457
- key :name, String
458
- end
459
- Thing.collection.remove
460
- end
461
-
462
- teardown do
463
- Object.send :remove_const, 'Property' if defined?(::Property)
464
- Object.send :remove_const, 'Thing' if defined?(::Thing)
465
- end
466
-
467
- context "=> destroy" do
468
- setup do
469
- Property.key :thing_id, ObjectId
470
- Property.belongs_to :thing, :dependent => :destroy
471
- Thing.many :properties, :dependent => :destroy
472
-
473
- @thing = Thing.create(:name => "Tree")
474
- @property1 = Property.create
475
- @property2 = Property.create
476
- @property3 = Property.create
477
- @thing.properties << @property1
478
- @thing.properties << @property2
479
- @thing.properties << @property3
480
- end
481
-
482
- should "should destroy the associated documents" do
483
- @thing.properties.count.should == 3
484
- @thing.destroy
485
- @thing.properties.count.should == 0
486
- Property.count.should == 0
487
- end
488
- end
489
-
490
- context "=> delete_all" do
491
- setup do
492
- Property.key :thing_id, ObjectId
493
- Property.belongs_to :thing
494
- Thing.has_many :properties, :dependent => :delete_all
495
-
496
- @thing = Thing.create(:name => "Tree")
497
- @property1 = Property.create
498
- @property2 = Property.create
499
- @property3 = Property.create
500
- @thing.properties << @property1
501
- @thing.properties << @property2
502
- @thing.properties << @property3
503
- end
504
-
505
- should "should delete associated documents" do
506
- @thing.properties.count.should == 3
507
- @thing.destroy
508
- @thing.properties.count.should == 0
509
- Property.count.should == 0
510
- end
511
- end
512
-
513
- context "=> nullify" do
514
- setup do
515
- Property.key :thing_id, ObjectId
516
- Property.belongs_to :thing
517
- Thing.has_many :properties, :dependent => :nullify
518
-
519
- @thing = Thing.create(:name => "Tree")
520
- @property1 = Property.create
521
- @property2 = Property.create
522
- @property3 = Property.create
523
- @thing.properties << @property1
524
- @thing.properties << @property2
525
- @thing.properties << @property3
526
- end
527
-
528
- should "should nullify relationship but not destroy associated documents" do
529
- @thing.properties.count.should == 3
530
- @thing.destroy
531
- @thing.properties.count.should == 0
532
- Property.count.should == 3
533
- end
534
- end
535
- end
536
- end