mongo_doc 0.6.26 → 0.6.27

Sign up to get free protection for your applications and to get access to all the features.
Files changed (101) hide show
  1. data/README.textile +14 -203
  2. data/Rakefile +0 -134
  3. data/lib/mongo_doc/collection.rb +4 -0
  4. data/lib/mongo_doc/finders.rb +1 -0
  5. data/lib/mongo_doc/timestamps.rb +4 -3
  6. data/lib/mongo_doc/version.rb +3 -0
  7. data/lib/mongo_doc.rb +0 -5
  8. metadata +25 -212
  9. data/.document +0 -5
  10. data/.gitignore +0 -8
  11. data/.rspec +0 -2
  12. data/.rvmrc +0 -1
  13. data/.watchr +0 -32
  14. data/Gemfile +0 -3
  15. data/Gemfile.lock +0 -72
  16. data/HISTORY.md +0 -11
  17. data/VERSION +0 -1
  18. data/examples/simple_document.rb +0 -46
  19. data/examples/simple_object.rb +0 -34
  20. data/features/collections.feature +0 -9
  21. data/features/connection.feature +0 -13
  22. data/features/db_references.feature +0 -21
  23. data/features/embed_hash.feature +0 -16
  24. data/features/finders.feature +0 -76
  25. data/features/indexes.feature +0 -28
  26. data/features/mongodb.yml +0 -7
  27. data/features/mongodoc_base.feature +0 -128
  28. data/features/new_record.feature +0 -36
  29. data/features/partial_updates.feature +0 -95
  30. data/features/polymorphic_collections.feature +0 -16
  31. data/features/references.feature +0 -28
  32. data/features/removing_documents.feature +0 -68
  33. data/features/saving_an_object.feature +0 -15
  34. data/features/scopes.feature +0 -66
  35. data/features/step_definitions/collection_steps.rb +0 -17
  36. data/features/step_definitions/connection_steps.rb +0 -13
  37. data/features/step_definitions/document_steps.rb +0 -155
  38. data/features/step_definitions/documents.rb +0 -61
  39. data/features/step_definitions/embed_hash_steps.rb +0 -6
  40. data/features/step_definitions/field_steps.rb +0 -28
  41. data/features/step_definitions/finder_steps.rb +0 -15
  42. data/features/step_definitions/index_steps.rb +0 -10
  43. data/features/step_definitions/json_steps.rb +0 -9
  44. data/features/step_definitions/object_steps.rb +0 -50
  45. data/features/step_definitions/objects.rb +0 -24
  46. data/features/step_definitions/partial_update_steps.rb +0 -31
  47. data/features/step_definitions/query_steps.rb +0 -69
  48. data/features/step_definitions/removing_documents_steps.rb +0 -14
  49. data/features/step_definitions/scope_steps.rb +0 -18
  50. data/features/step_definitions/string_casting_steps.rb +0 -29
  51. data/features/step_definitions/util_steps.rb +0 -7
  52. data/features/string_casting.feature +0 -10
  53. data/features/support/support.rb +0 -12
  54. data/features/timestamps.feature +0 -14
  55. data/features/using_criteria.feature +0 -148
  56. data/mongo_doc.gemspec +0 -272
  57. data/mongodb.example.yml +0 -14
  58. data/perf/mongo_doc_object.rb +0 -83
  59. data/perf/mongo_document.rb +0 -84
  60. data/perf/ruby_driver.rb +0 -49
  61. data/script/console +0 -8
  62. data/spec/active_model_behavior.rb +0 -64
  63. data/spec/array_including_argument_matcher.rb +0 -62
  64. data/spec/associations/collection_proxy_spec.rb +0 -233
  65. data/spec/associations/document_proxy_spec.rb +0 -45
  66. data/spec/associations/hash_proxy_spec.rb +0 -181
  67. data/spec/associations/proxy_base_spec.rb +0 -92
  68. data/spec/associations_spec.rb +0 -218
  69. data/spec/attributes_accessor_spec.rb +0 -39
  70. data/spec/attributes_spec.rb +0 -184
  71. data/spec/bson_matchers.rb +0 -54
  72. data/spec/bson_spec.rb +0 -196
  73. data/spec/collection_spec.rb +0 -169
  74. data/spec/connection_spec.rb +0 -169
  75. data/spec/contexts/ids_spec.rb +0 -49
  76. data/spec/contexts/mongo_spec.rb +0 -241
  77. data/spec/contexts_spec.rb +0 -56
  78. data/spec/criteria/optional_spec.rb +0 -26
  79. data/spec/criteria_spec.rb +0 -73
  80. data/spec/cursor_spec.rb +0 -91
  81. data/spec/database_cleaner_spec.rb +0 -24
  82. data/spec/document_ext.rb +0 -9
  83. data/spec/document_spec.rb +0 -569
  84. data/spec/embedded_save_spec.rb +0 -73
  85. data/spec/ext_spec.rb +0 -100
  86. data/spec/finders_spec.rb +0 -61
  87. data/spec/hash_matchers.rb +0 -29
  88. data/spec/index_spec.rb +0 -79
  89. data/spec/matchers_spec.rb +0 -342
  90. data/spec/mongodb.yml +0 -6
  91. data/spec/mongodb_pairs.yml +0 -8
  92. data/spec/new_record_spec.rb +0 -128
  93. data/spec/polymorphic_collection_spec.rb +0 -47
  94. data/spec/references_many_spec.rb +0 -214
  95. data/spec/references_spec.rb +0 -121
  96. data/spec/root_spec.rb +0 -41
  97. data/spec/scope_spec.rb +0 -88
  98. data/spec/spec_helper.rb +0 -16
  99. data/spec/timestamps_spec.rb +0 -154
  100. data/spec/update_spec.rb +0 -167
  101. data/spec/validations_spec.rb +0 -30
@@ -1,569 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "MongoDoc::Document" do
4
-
5
- describe "#_collection" do
6
- class DocumentCollectionTest
7
- include MongoDoc::Document
8
- end
9
-
10
- let(:doc) do
11
- doc = DocumentCollectionTest.new
12
- doc._root = stub
13
- doc
14
- end
15
-
16
- before do
17
- DocumentCollectionTest.stub(:collection).and_return('collection')
18
- end
19
-
20
- it "delegates to the root's collection" do
21
- doc._root.should_receive :_collection
22
- doc._collection
23
- end
24
- end
25
-
26
- context "ActiveModel" do
27
- class FormForTest
28
- include MongoDoc::Document
29
-
30
- attr_accessor :data
31
- end
32
-
33
- describe FormForTest do
34
- it_should_behave_like AnActiveModel
35
- end
36
-
37
- let(:doc) { FormForTest.new }
38
-
39
- context "persisted record" do
40
- subject { doc._id = '1'; doc }
41
-
42
- it { should_not be_new_record }
43
- it { should be_persisted }
44
- its(:id) { should == doc._id }
45
- its(:to_param) { should == doc._id.to_s }
46
- its(:to_key) { should == [doc._id] }
47
- end
48
-
49
- context "record has not been persisted" do
50
- subject { doc }
51
-
52
- it { should be_new_record }
53
- it { should_not be_persisted }
54
- its(:id) { should be_nil }
55
- its(:to_param) { should be_nil }
56
- its(:to_key) { should be_nil }
57
- end
58
-
59
- it "#initialize takes a hash" do
60
- data = 'data'
61
- FormForTest.new(:data => data).data.should == data
62
- end
63
-
64
- it "#initialize accepts a nil" do
65
- expect do
66
- FormForTest.new(nil)
67
- end.should_not raise_error
68
- end
69
-
70
- end
71
-
72
- context "saving" do
73
- class SaveRoot
74
- include MongoDoc::Document
75
-
76
- embed_many :save_children
77
- end
78
-
79
- class SaveChild
80
- include MongoDoc::Document
81
-
82
- attr_accessor :data
83
- end
84
-
85
- before do
86
- @root = SaveRoot.new
87
- @root.stub(:_save)
88
- @child = SaveChild.new
89
- @root.save_children << @child
90
- end
91
-
92
- context "#save" do
93
- it "delegates to the root" do
94
- validate = true
95
- @root.should_receive(:save).with(validate)
96
- @child.save(validate)
97
- end
98
-
99
- context "when validating" do
100
- it "validates" do
101
- @root.should_receive(:valid?)
102
- @root.save(true)
103
- end
104
-
105
- context "and valid" do
106
- it "delegates to _save" do
107
- @root.should_receive(:_save).with(false)
108
- @root.save(true)
109
- end
110
-
111
- it "returns the result of _save if valid" do
112
- id = 'id'
113
- @root.stub(:valid?).and_return(true)
114
- @root.should_receive(:_save).and_return(id)
115
- @root.save(true).should == id
116
- end
117
- end
118
-
119
- context "and invalid" do
120
- it "does not call _save" do
121
- @root.stub(:valid?).and_return(false)
122
- @root.should_not_receive(:_save)
123
- @root.save(true)
124
- end
125
-
126
- it "returns false" do
127
- @root.stub(:valid?).and_return(false)
128
- @root.save(true).should be_false
129
- end
130
- end
131
- end
132
-
133
- context "when not validating" do
134
- it "does not validate" do
135
- @root.should_not_receive(:valid?)
136
- @root.save(false)
137
- end
138
-
139
- it "delegates to _save" do
140
- @root.should_receive(:_save).with(false)
141
- @root.save(false)
142
- end
143
-
144
- it "returns the result of _save" do
145
- id = 'id'
146
- @root.stub(:_save).and_return(id)
147
- @root.save(false).should == id
148
- end
149
- end
150
- end
151
-
152
- context "#save!" do
153
- it "delegates to the root" do
154
- @root.should_receive(:save!)
155
- @child.save!
156
- end
157
-
158
- it "validates" do
159
- @root.should_receive(:valid?).and_return(true)
160
- @root.save!
161
- end
162
-
163
- it "returns the result of _save if valid" do
164
- id = 'id'
165
- @root.stub(:valid?).and_return(true)
166
- @root.should_receive(:_save).with(true).and_return(id)
167
- @root.save!.should == id
168
- end
169
-
170
- it "raises if invalid" do
171
- @root.stub(:valid?).and_return(false)
172
- expect do
173
- @root.save!
174
- end.should raise_error(MongoDoc::DocumentInvalidError)
175
- end
176
- end
177
- end
178
-
179
- context "#_save" do
180
- class SaveTest
181
- include MongoDoc::Document
182
- end
183
-
184
- before do
185
- @collection = stub('collection')
186
- @doc = SaveTest.new
187
- @doc.stub(:_collection).and_return(@collection)
188
- end
189
-
190
- it "delegates to the collection save" do
191
- safe = true
192
- @collection.should_receive(:save)
193
- @doc.send(:_save, safe)
194
- end
195
-
196
- it "sets the _id of the document" do
197
- id = 'id'
198
- @collection.stub(:save).and_return(id)
199
- @doc.send(:_save, true)
200
- @doc._id.should == id
201
- end
202
-
203
- it "returns the _id" do
204
- id = 'id'
205
- @collection.stub(:save).and_return(id)
206
- @doc.send(:_save, true).should == id
207
- end
208
- end
209
-
210
- context "creating" do
211
- class CreateTest
212
- include MongoDoc::Document
213
-
214
- attr_accessor :data
215
- validates_presence_of :data
216
- end
217
-
218
- let(:data) { 'data' }
219
- let(:instance) { CreateTest.new(:data => data) }
220
-
221
- before do
222
- instance.stub(:save)
223
- instance.stub(:save!)
224
- end
225
-
226
- context ".create" do
227
- it "creates a new document with the attributes" do
228
- CreateTest.should_receive(:new).with(:data => data).and_return(instance)
229
- CreateTest.create(:data => data)
230
- end
231
-
232
- context "with the new document" do
233
- before do
234
- CreateTest.stub(:new).and_return(instance)
235
- end
236
-
237
- it "calls save on the instance with validate => true" do
238
- instance.should_receive(:save).with(true)
239
- CreateTest.create(:data => data)
240
- end
241
-
242
- it "returns the new object" do
243
- CreateTest.create(:data => data).should == instance
244
- end
245
- end
246
- end
247
-
248
- context ".create!" do
249
- it "creates a new document with the attributes" do
250
- CreateTest.should_receive(:new).with(:data => data).and_return(instance)
251
- CreateTest.create!(:data => data)
252
- end
253
-
254
- context "with the new document" do
255
- before do
256
- CreateTest.stub(:new).and_return(instance)
257
- end
258
-
259
- it "calls save! on the instance" do
260
- instance.should_receive(:save!).with(no_args)
261
- CreateTest.create!(:data => data)
262
- end
263
-
264
- it "returns the new object" do
265
- CreateTest.create!(:data => data).should == instance
266
- end
267
- end
268
- end
269
- end
270
-
271
- describe "bson" do
272
- class BSONTest
273
- include MongoDoc::Document
274
-
275
- attr_accessor :other
276
- end
277
-
278
- class BSONDerived < BSONTest
279
- include MongoDoc::Document
280
-
281
- attr_accessor :derived
282
- end
283
-
284
- class OtherObject
285
- attr_accessor :value
286
- end
287
-
288
- before do
289
- @value = 'value'
290
- @other = OtherObject.new
291
- @other.value = @value
292
- @doc = BSONTest.new(:other => @other)
293
- end
294
-
295
- it "encodes the class for the object" do
296
- @doc.to_bson[MongoDoc::BSON::CLASS_KEY].should == BSONTest.name
297
- end
298
-
299
- it "renders a json representation of the object" do
300
- @doc.to_bson.should be_bson_eql({MongoDoc::BSON::CLASS_KEY => BSONTest.name, "other" => {MongoDoc::BSON::CLASS_KEY => OtherObject.name, "value" => @value}})
301
- end
302
-
303
- it "includes the _id of the object" do
304
- @doc._id = BSON::ObjectID.new
305
- @doc.to_bson.should be_bson_eql({MongoDoc::BSON::CLASS_KEY => BSONTest.name, "_id" => @doc._id.to_bson, "other" => {MongoDoc::BSON::CLASS_KEY => OtherObject.name, "value" => @value}})
306
- end
307
-
308
- it "roundtrips the object" do
309
- MongoDoc::BSON.decode(@doc.to_bson).should be_kind_of(BSONTest)
310
- end
311
-
312
- it "ignores the class hash when the :raw_json option is used" do
313
- MongoDoc::BSON.decode(@doc.to_bson.except(MongoDoc::BSON::CLASS_KEY), :raw_json => true)['other'].should == @other.to_bson
314
- end
315
-
316
- it "allows for derived classes" do
317
- derived = BSONDerived.new(:other => @other, :derived => 'derived')
318
- MongoDoc::BSON.decode(derived.to_bson).other.should be_kind_of(OtherObject)
319
- end
320
-
321
- it "roundtrips embedded ruby objects" do
322
- MongoDoc::BSON.decode(@doc.to_bson).other.should be_kind_of(OtherObject)
323
- end
324
-
325
- context "associations" do
326
- context "embed" do
327
- class TestEmbedBsonDoc
328
- include MongoDoc::Document
329
-
330
- embed :subdoc
331
- end
332
-
333
- class SubEmbedBsonDoc
334
- include MongoDoc::Document
335
-
336
- attr_accessor :attr
337
- end
338
-
339
- it "#to_bson renders a bson representation of the document" do
340
- doc = TestEmbedBsonDoc.new
341
- subdoc = SubEmbedBsonDoc.new(:attr => "value")
342
- bson = doc.to_bson
343
- bson["subdoc"] = subdoc.to_bson
344
- doc.subdoc = subdoc
345
- doc.to_bson.should == bson
346
- end
347
-
348
- it "roundtrips" do
349
- doc = TestEmbedBsonDoc.new
350
- subdoc = SubEmbedBsonDoc.new(:attr => "value")
351
- doc.subdoc = subdoc
352
- MongoDoc::BSON.decode(doc.to_bson).should == doc
353
- end
354
- end
355
-
356
- context "embed_many" do
357
-
358
- class SubEmbedManyBsonDoc
359
- include MongoDoc::Document
360
-
361
- attr_accessor :attr
362
- end
363
-
364
- class TestEmbedManyBsonDoc
365
- include MongoDoc::Document
366
- embed_many :subdoc, :class_name => 'SubEmbedManyBsonDoc'
367
- end
368
-
369
- it "#to_bson renders a bson representation of the document" do
370
- doc = TestEmbedManyBsonDoc.new
371
- subdoc = SubEmbedManyBsonDoc.new(:attr => "value")
372
- bson = doc.to_bson
373
- bson["subdoc"] = [subdoc].to_bson
374
- doc.subdoc = subdoc
375
- doc.to_bson.should == bson
376
- end
377
-
378
- it "roundtrips" do
379
- doc = TestEmbedManyBsonDoc.new
380
- subdoc = SubEmbedManyBsonDoc.new(:attr => "value")
381
- doc.subdoc = subdoc
382
- MongoDoc::BSON.decode(doc.to_bson).should == doc
383
- end
384
-
385
- it "roundtrips the proxy" do
386
- doc = TestEmbedManyBsonDoc.new(:subdoc => SubEmbedManyBsonDoc.new(:attr => "value"))
387
- MongoDoc::Associations::CollectionProxy.should === MongoDoc::BSON.decode(doc.to_bson).subdoc
388
- end
389
- end
390
- end
391
- end
392
-
393
- context "removing documents" do
394
- class RemoveDocument
395
- include MongoDoc::Document
396
- end
397
-
398
- let(:doc) { RemoveDocument.new }
399
-
400
- context "#remove" do
401
- it "when called on a embedded document with a _root raises UnsupportedOperation" do
402
- doc._root = RemoveDocument.new
403
- expect { doc.remove }.to raise_error(MongoDoc::UnsupportedOperation)
404
- end
405
-
406
- it "delegates to remove document" do
407
- doc.should_receive(:remove_document)
408
- doc.remove
409
- end
410
- end
411
-
412
- context "#remove_document" do
413
- it "when the document is the root, removes the document" do
414
- doc.should_receive(:_remove)
415
- doc.remove_document
416
- end
417
-
418
- it "when the document is not the root, calls remove_document on the root" do
419
- doc._root = root = RemoveDocument.new
420
- root.should_receive(:remove_document)
421
- doc.remove_document
422
- end
423
- end
424
- end
425
-
426
- context "misc class methods" do
427
- class MiscClassMethods
428
- include MongoDoc::Document
429
- end
430
-
431
- it ".collection_name returns the name of the collection for this class" do
432
- MiscClassMethods.collection_name.should == MiscClassMethods.to_s.tableize.gsub('/', '.')
433
- end
434
-
435
- it ".collection returns a wrapped MongoDoc::Collection" do
436
- db = stub('db')
437
- db.should_receive(:collection).with(MiscClassMethods.to_s.tableize.gsub('/', '.'))
438
- MongoDoc::Connection.should_receive(:database).and_return(db)
439
- MongoDoc::Collection.should === MiscClassMethods.collection
440
- end
441
- end
442
-
443
- context "ActiveModel compliance" do
444
- class ActiveModelComplianceTest
445
- include MongoDoc::Document
446
- end
447
-
448
- let(:model) { ActiveModelComplianceTest.new }
449
-
450
- describe "#to_param" do
451
- let(:string_id) { mock }
452
-
453
- before(:each) do
454
- model.instance_variable_set(:@_id, mock(:oid, :to_s => string_id))
455
- end
456
-
457
- it "returns the string form of the document id" do
458
- model.to_param.should == string_id
459
- end
460
- end
461
-
462
- describe "#valid?" do
463
- subject { model }
464
- it "responds to #valid?" do
465
- should respond_to(:valid?)
466
- end
467
- end
468
-
469
- describe "#new_record?" do
470
- subject { model }
471
- it "responds to #new_record?" do
472
- should respond_to(:new_record?)
473
- end
474
-
475
- context "when the object has an id" do
476
- before(:each) do
477
- model.instance_variable_set(:@_id, mock(:id))
478
- end
479
-
480
- it "is false" do
481
- should_not be_new_record
482
- end
483
- end
484
-
485
- context "when the object has no id" do
486
- before(:each) do
487
- model.instance_variable_set(:@_id, nil)
488
- end
489
-
490
- it "is true" do
491
- should be_new_record
492
- end
493
- end
494
- end
495
-
496
- describe "#destroyed?" do
497
- subject { model }
498
-
499
- it "responds to #destroyed?" do
500
- should respond_to(:destroyed?)
501
- end
502
-
503
- context "when the object has an id" do
504
- before(:each) do
505
- model.instance_variable_set(:@_id, mock(:id))
506
- end
507
-
508
- it "is false" do
509
- should_not be_destroyed
510
- end
511
- end
512
-
513
- context "when the object has no id" do
514
- before(:each) do
515
- model.instance_variable_set(:@_id, nil)
516
- end
517
-
518
- it "is true" do
519
- should be_destroyed
520
- end
521
- end
522
- end
523
-
524
- describe "#errors" do
525
- subject { model }
526
- it "responds to errors" do
527
- should respond_to(:errors)
528
- end
529
-
530
- describe "#[]" do
531
- it "returns an array on a missing key lookup" do
532
- model.errors[:does_not_exist].should be_an(Array)
533
- end
534
- end
535
-
536
- describe "#full_messages" do
537
- it "returns an array" do
538
- model.errors.full_messages.should be_an(Array)
539
- end
540
- end
541
- end
542
-
543
- describe ".model_name" do
544
- it "responds to model_name" do
545
- ActiveModelComplianceTest.should respond_to(:model_name)
546
- end
547
-
548
- it "is a string" do
549
- ActiveModelComplianceTest.model_name.should be_a(String)
550
- end
551
-
552
- it "has a human inflector" do
553
- ActiveModelComplianceTest.model_name.human.should be_a(String)
554
- end
555
-
556
- it "has a partial path inflector" do
557
- ActiveModelComplianceTest.model_name.partial_path.should be_a(String)
558
- end
559
-
560
- it "has a singular inflector" do
561
- ActiveModelComplianceTest.model_name.singular.should be_a(String)
562
- end
563
-
564
- it "has a plural inflector" do
565
- ActiveModelComplianceTest.model_name.plural.should be_a(String)
566
- end
567
- end
568
- end
569
- end
@@ -1,73 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "Saving embedded documents" do
4
- class NestedDocsRoot
5
- include MongoDoc::Document
6
-
7
- embed_many :nested_children
8
- end
9
-
10
- class NestedChild
11
- include MongoDoc::Document
12
-
13
- embed :leaf
14
- end
15
-
16
- class LeafDoc
17
- include MongoDoc::Document
18
-
19
- attr_accessor :data
20
- end
21
-
22
- let(:leaf) do
23
- doc = LeafDoc.new
24
- doc._id = 'id'
25
- doc
26
- end
27
-
28
- let(:data) { 'data' }
29
-
30
- context "#save" do
31
- let(:root) { NestedDocsRoot.new(:nested_children => [NestedChild.new(:leaf => leaf)]) }
32
-
33
- it "calls the root document's save" do
34
- root.should_receive(:save).with(true)
35
- leaf.save
36
- end
37
-
38
- it "(with bang!) calls the root documents save!" do
39
- root.should_receive(:save!)
40
- leaf.save!
41
- end
42
- end
43
-
44
- context "update_attributes" do
45
- context "with no embed_many, update_attributes" do
46
- let(:root) { NestedChild.new(:leaf => leaf) }
47
-
48
- it "calls the root document's _update with a full attribute path and not safe" do
49
- root.should_receive(:_update).with({"leaf._id"=>"id"}, {'leaf.data' => data}, false)
50
- leaf.update_attributes(:data => data)
51
- end
52
-
53
- it "(with bang!) calls the root document's _update with a full attribute path and safe" do
54
- root.should_receive(:_update).with({"leaf._id"=>"id"}, {'leaf.data' => data}, true)
55
- leaf.update_attributes!(:data => data)
56
- end
57
- end
58
-
59
- context "with embed_many, update_attributes" do
60
- let(:root) { NestedDocsRoot.new(:nested_children => [NestedChild.new(:leaf => leaf)]) }
61
-
62
- it "calls the root document's _update with a full attribute path and not safe" do
63
- root.should_receive(:_update).with({"nested_children.leaf._id"=>"id"}, {'nested_children.$.leaf.data' => data}, false)
64
- leaf.update_attributes(:data => data)
65
- end
66
-
67
- it "(with bang!) calls the root document's _update with a full attribute path and safe" do
68
- root.should_receive(:_update).with({"nested_children.leaf._id"=>"id"}, {'nested_children.$.leaf.data' => data}, true)
69
- leaf.update_attributes!(:data => data)
70
- end
71
- end
72
- end
73
- end