mongomodel 0.5.5 → 0.5.6

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.
Files changed (156) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +23 -11
  3. data/gemfiles/rails-3.2.gemfile +2 -2
  4. data/gemfiles/rails-4-observers.gemfile +1 -1
  5. data/gemfiles/rails-4.1.gemfile +2 -2
  6. data/gemfiles/{mongoid.gemfile → rails-4.2.gemfile} +2 -3
  7. data/gemfiles/{mongo_mapper.gemfile → rails-5.0.gemfile} +2 -3
  8. data/gemfiles/rails-5.1.gemfile +10 -0
  9. data/gemfiles/rails-5.2.gemfile +10 -0
  10. data/lib/mongomodel.rb +15 -15
  11. data/lib/mongomodel/attributes/mongo.rb +7 -7
  12. data/lib/mongomodel/attributes/store.rb +4 -4
  13. data/lib/mongomodel/attributes/typecasting.rb +7 -7
  14. data/lib/mongomodel/compatibility/mongo_mapper.rb +3 -3
  15. data/lib/mongomodel/compatibility/mongoid.rb +3 -3
  16. data/lib/mongomodel/concerns/abstract_class.rb +3 -3
  17. data/lib/mongomodel/concerns/activemodel.rb +4 -4
  18. data/lib/mongomodel/concerns/associations.rb +8 -8
  19. data/lib/mongomodel/concerns/associations/base/association.rb +5 -5
  20. data/lib/mongomodel/concerns/associations/base/definition.rb +4 -4
  21. data/lib/mongomodel/concerns/associations/base/proxy.rb +1 -1
  22. data/lib/mongomodel/concerns/associations/belongs_to.rb +19 -19
  23. data/lib/mongomodel/concerns/associations/has_many_by_foreign_key.rb +36 -36
  24. data/lib/mongomodel/concerns/associations/has_many_by_ids.rb +34 -34
  25. data/lib/mongomodel/concerns/attribute_methods.rb +10 -10
  26. data/lib/mongomodel/concerns/attribute_methods/before_type_cast.rb +4 -4
  27. data/lib/mongomodel/concerns/attribute_methods/dirty.rb +95 -13
  28. data/lib/mongomodel/concerns/attribute_methods/forbidden.rb +1 -1
  29. data/lib/mongomodel/concerns/attribute_methods/multi_parameter_assignment.rb +6 -6
  30. data/lib/mongomodel/concerns/attribute_methods/nested.rb +18 -18
  31. data/lib/mongomodel/concerns/attribute_methods/protected.rb +3 -3
  32. data/lib/mongomodel/concerns/attribute_methods/query.rb +3 -3
  33. data/lib/mongomodel/concerns/attribute_methods/read.rb +4 -4
  34. data/lib/mongomodel/concerns/attribute_methods/write.rb +4 -4
  35. data/lib/mongomodel/concerns/attributes.rb +18 -18
  36. data/lib/mongomodel/concerns/callbacks.rb +7 -7
  37. data/lib/mongomodel/concerns/document_parent.rb +2 -2
  38. data/lib/mongomodel/concerns/logging.rb +2 -2
  39. data/lib/mongomodel/concerns/map_reduce.rb +11 -11
  40. data/lib/mongomodel/concerns/pretty_inspect.rb +3 -3
  41. data/lib/mongomodel/concerns/properties.rb +18 -18
  42. data/lib/mongomodel/concerns/record_status.rb +9 -13
  43. data/lib/mongomodel/concerns/serialization.rb +4 -4
  44. data/lib/mongomodel/concerns/timestamps.rb +4 -4
  45. data/lib/mongomodel/concerns/translation.rb +2 -2
  46. data/lib/mongomodel/concerns/validations.rb +5 -5
  47. data/lib/mongomodel/concerns/validations/associated.rb +1 -1
  48. data/lib/mongomodel/document.rb +6 -6
  49. data/lib/mongomodel/document/callbacks.rb +15 -21
  50. data/lib/mongomodel/document/collection_modifiers.rb +5 -5
  51. data/lib/mongomodel/document/dynamic_finders.rb +1 -1
  52. data/lib/mongomodel/document/indexes.rb +19 -19
  53. data/lib/mongomodel/document/optimistic_locking.rb +7 -7
  54. data/lib/mongomodel/document/persistence.rb +23 -23
  55. data/lib/mongomodel/document/scopes.rb +20 -20
  56. data/lib/mongomodel/document/validations.rb +6 -6
  57. data/lib/mongomodel/document/validations/uniqueness.rb +11 -11
  58. data/lib/mongomodel/embedded_document.rb +11 -11
  59. data/lib/mongomodel/locale/en.yml +0 -1
  60. data/lib/mongomodel/log_subscriber.rb +5 -5
  61. data/lib/mongomodel/railtie.rb +13 -13
  62. data/lib/mongomodel/support/collection.rb +31 -31
  63. data/lib/mongomodel/support/configuration.rb +11 -11
  64. data/lib/mongomodel/support/core_extensions.rb +1 -1
  65. data/lib/mongomodel/support/dynamic_finder.rb +12 -12
  66. data/lib/mongomodel/support/exceptions.rb +6 -6
  67. data/lib/mongomodel/support/instrumented_collection.rb +20 -20
  68. data/lib/mongomodel/support/map.rb +33 -33
  69. data/lib/mongomodel/support/mongo_operator.rb +6 -6
  70. data/lib/mongomodel/support/mongo_options.rb +18 -18
  71. data/lib/mongomodel/support/mongo_order.rb +16 -16
  72. data/lib/mongomodel/support/paginator.rb +8 -8
  73. data/lib/mongomodel/support/reference.rb +10 -10
  74. data/lib/mongomodel/support/scope.rb +37 -37
  75. data/lib/mongomodel/support/scope/array_methods.rb +1 -1
  76. data/lib/mongomodel/support/scope/batches.rb +1 -1
  77. data/lib/mongomodel/support/scope/dynamic_finders.rb +1 -1
  78. data/lib/mongomodel/support/scope/finder_methods.rb +7 -7
  79. data/lib/mongomodel/support/scope/load_methods.rb +1 -1
  80. data/lib/mongomodel/support/scope/pagination.rb +1 -1
  81. data/lib/mongomodel/support/scope/query_methods.rb +6 -6
  82. data/lib/mongomodel/support/scope/spawn_methods.rb +8 -8
  83. data/lib/mongomodel/support/types.rb +2 -2
  84. data/lib/mongomodel/support/types/array.rb +1 -1
  85. data/lib/mongomodel/support/types/boolean.rb +3 -3
  86. data/lib/mongomodel/support/types/custom.rb +3 -3
  87. data/lib/mongomodel/support/types/date.rb +2 -2
  88. data/lib/mongomodel/support/types/date_time.rb +6 -16
  89. data/lib/mongomodel/support/types/float.rb +1 -1
  90. data/lib/mongomodel/support/types/hash.rb +1 -1
  91. data/lib/mongomodel/support/types/integer.rb +13 -10
  92. data/lib/mongomodel/support/types/object.rb +5 -5
  93. data/lib/mongomodel/support/types/rational.rb +3 -3
  94. data/lib/mongomodel/support/types/time.rb +2 -2
  95. data/lib/mongomodel/version.rb +1 -1
  96. data/lib/rails/generators/mongo_model/config/templates/mongomodel.yml +3 -4
  97. data/lib/rails/generators/mongo_model/model/model_generator.rb +3 -3
  98. data/mongomodel.gemspec +5 -4
  99. data/spec/mongomodel/attributes/store_spec.rb +21 -21
  100. data/spec/mongomodel/concerns/activemodel_spec.rb +4 -4
  101. data/spec/mongomodel/concerns/associations/base/association_spec.rb +12 -12
  102. data/spec/mongomodel/concerns/associations/belongs_to_spec.rb +34 -21
  103. data/spec/mongomodel/concerns/associations/has_many_by_foreign_key_spec.rb +53 -53
  104. data/spec/mongomodel/concerns/associations/has_many_by_ids_spec.rb +30 -30
  105. data/spec/mongomodel/concerns/attribute_methods/before_type_cast_spec.rb +7 -7
  106. data/spec/mongomodel/concerns/attribute_methods/dirty_spec.rb +45 -41
  107. data/spec/mongomodel/concerns/attribute_methods/multi_parameter_assignment_spec.rb +7 -7
  108. data/spec/mongomodel/concerns/attribute_methods/nested_spec.rb +31 -31
  109. data/spec/mongomodel/concerns/attribute_methods/protected_spec.rb +15 -15
  110. data/spec/mongomodel/concerns/attribute_methods/query_spec.rb +19 -19
  111. data/spec/mongomodel/concerns/attribute_methods/read_spec.rb +9 -9
  112. data/spec/mongomodel/concerns/attribute_methods/write_spec.rb +6 -6
  113. data/spec/mongomodel/concerns/attribute_methods_spec.rb +13 -13
  114. data/spec/mongomodel/concerns/attributes_spec.rb +34 -34
  115. data/spec/mongomodel/concerns/callbacks_spec.rb +25 -21
  116. data/spec/mongomodel/concerns/logging_spec.rb +5 -3
  117. data/spec/mongomodel/concerns/map_reduce_spec.rb +19 -19
  118. data/spec/mongomodel/concerns/observing_spec.rb +3 -3
  119. data/spec/mongomodel/concerns/pretty_inspect_spec.rb +10 -10
  120. data/spec/mongomodel/concerns/properties_spec.rb +11 -11
  121. data/spec/mongomodel/concerns/serialization/json_serialization_spec.rb +13 -13
  122. data/spec/mongomodel/concerns/timestamps_spec.rb +39 -39
  123. data/spec/mongomodel/concerns/validations_spec.rb +41 -38
  124. data/spec/mongomodel/document/callbacks_spec.rb +20 -16
  125. data/spec/mongomodel/document/collection_modifiers_spec.rb +16 -16
  126. data/spec/mongomodel/document/dynamic_finders_spec.rb +46 -46
  127. data/spec/mongomodel/document/finders_spec.rb +15 -15
  128. data/spec/mongomodel/document/indexes_spec.rb +29 -29
  129. data/spec/mongomodel/document/optimistic_locking_spec.rb +16 -16
  130. data/spec/mongomodel/document/persistence_spec.rb +39 -39
  131. data/spec/mongomodel/document/scopes_spec.rb +17 -17
  132. data/spec/mongomodel/document/validations/uniqueness_spec.rb +46 -46
  133. data/spec/mongomodel/document/validations_spec.rb +35 -35
  134. data/spec/mongomodel/document_spec.rb +19 -19
  135. data/spec/mongomodel/embedded_document_spec.rb +19 -19
  136. data/spec/mongomodel/mongomodel_spec.rb +7 -6
  137. data/spec/mongomodel/support/collection_spec.rb +54 -54
  138. data/spec/mongomodel/support/configuration_spec.rb +1 -1
  139. data/spec/mongomodel/support/map_spec.rb +66 -66
  140. data/spec/mongomodel/support/mongo_operator_spec.rb +5 -5
  141. data/spec/mongomodel/support/mongo_options_spec.rb +42 -42
  142. data/spec/mongomodel/support/mongo_order_spec.rb +24 -24
  143. data/spec/mongomodel/support/paginator_spec.rb +15 -15
  144. data/spec/mongomodel/support/property_spec.rb +29 -23
  145. data/spec/mongomodel/support/scope_spec.rb +205 -204
  146. data/spec/spec_helper.rb +13 -2
  147. data/spec/support/callbacks.rb +3 -8
  148. data/spec/support/helpers/define_class.rb +7 -7
  149. data/spec/support/helpers/document_finder_stubs.rb +6 -6
  150. data/spec/support/helpers/specs_for.rb +1 -1
  151. data/spec/support/helpers/validations.rb +1 -1
  152. data/spec/support/matchers/find_with.rb +8 -8
  153. data/spec/support/matchers/respond_to_boolean.rb +3 -3
  154. data/spec/support/matchers/run_callbacks.rb +6 -9
  155. data/spec/support/models.rb +5 -5
  156. metadata +23 -7
@@ -8,43 +8,43 @@ module MongoModel
8
8
  property :age, Integer
9
9
  property :position, Array
10
10
  end
11
-
11
+
12
12
  def subclass(klass)
13
13
  Class.new(klass)
14
14
  end
15
-
15
+
16
16
  it "has an indexes collection" do
17
17
  Article.indexes.should be_an_instance_of(Array)
18
18
  end
19
-
19
+
20
20
  it "inherits indexes from parent classes" do
21
21
  index = double('index')
22
22
  Article.indexes << index
23
23
  subclass(Article).indexes.should include(index)
24
24
  end
25
-
25
+
26
26
  describe "#index" do
27
27
  it "adds an index to the indexes collection" do
28
28
  Article.index :title, :unique => true
29
29
  Article.indexes.last.should == Index.new(:title, :unique => true)
30
30
  end
31
-
31
+
32
32
  it "marks indexes as uninitialized" do
33
33
  Article.ensure_indexes!
34
-
35
- Article.indexes_initialized?.should be_true
34
+
35
+ Article.indexes_initialized?.should be true
36
36
  Article.index :age
37
- Article.indexes_initialized?.should be_false
37
+ Article.indexes_initialized?.should be false
38
38
  end
39
39
  end
40
-
40
+
41
41
  describe "#ensure_indexes!" do
42
42
  before(:each) do
43
43
  Article.index :title, :unique => true
44
44
  Article.index :age => :descending
45
45
  Article.index :position => :geo2d, :min => -100, :max => 100
46
46
  end
47
-
47
+
48
48
  it "creates indexes on the collection" do
49
49
  Article.collection.should_receive(:create_index).with(:_type)
50
50
  Article.collection.should_receive(:create_index).with(:title, :unique => true)
@@ -52,20 +52,20 @@ module MongoModel
52
52
  Article.collection.should_receive(:create_index).with([[:position, Mongo::GEO2D]], :min => -100, :max => 100)
53
53
  Article.ensure_indexes!
54
54
  end
55
-
55
+
56
56
  it "marks indexes as initialized" do
57
- Article.indexes_initialized?.should be_false
57
+ Article.indexes_initialized?.should be false
58
58
  Article.ensure_indexes!
59
- Article.indexes_initialized?.should be_true
59
+ Article.indexes_initialized?.should be true
60
60
  end
61
61
  end
62
-
62
+
63
63
  describe "#_find" do
64
64
  it "runs ensure_indexes!" do
65
65
  Article.should_receive(:ensure_indexes!)
66
66
  Article.first
67
67
  end
68
-
68
+
69
69
  it "reruns ensure_indexes! if indexes are initialized" do
70
70
  Article.ensure_indexes!
71
71
  Article.should_not_receive(:ensure_indexes!)
@@ -73,10 +73,10 @@ module MongoModel
73
73
  end
74
74
  end
75
75
  end
76
-
76
+
77
77
  describe "index shortcuts" do
78
78
  define_class(:TestDocument, Document)
79
-
79
+
80
80
  describe ":index => true" do
81
81
  it "adds an index on the property" do
82
82
  TestDocument.should_receive(:index).with(:title)
@@ -85,56 +85,56 @@ module MongoModel
85
85
  end
86
86
  end
87
87
  end
88
-
88
+
89
89
  describe Index do
90
90
  describe "#to_args" do
91
91
  it "converts index with single key" do
92
92
  Index.new(:title).to_args.should == [:title]
93
93
  end
94
-
94
+
95
95
  it "converts nested index with single key" do
96
96
  Index.new('page.title').to_args.should == [:'page.title']
97
97
  end
98
-
98
+
99
99
  it "converts index with unique option" do
100
100
  Index.new(:title, :unique => true).to_args.should == [:title, { :unique => true }]
101
101
  end
102
-
102
+
103
103
  it "converts index with name option" do
104
104
  Index.new(:title, :name => "my_name").to_args.should == [:title, { :name => "my_name" }]
105
105
  end
106
-
106
+
107
107
  it "converts index with multiple options" do
108
108
  Index.new(:title, :name => "my_name", :unique => true).to_args.should == [:title, { :name => "my_name", :unique => true }]
109
109
  end
110
-
110
+
111
111
  it "converts index with descending key" do
112
112
  Index.new(:title => :descending).to_args.should == [[[:title, Mongo::DESCENDING]]]
113
113
  end
114
-
114
+
115
115
  it "converts index with multiple keys" do
116
116
  Index.new(:title, :age).to_args.should == [[[:age, Mongo::ASCENDING], [:title, Mongo::ASCENDING]]]
117
117
  end
118
-
118
+
119
119
  it "converts index with multiple keys (ascending and descending)" do
120
120
  Index.new(:title => :ascending, :age => :descending).to_args.should == [[[:age, Mongo::DESCENDING], [:title, Mongo::ASCENDING]]]
121
121
  end
122
-
122
+
123
123
  it "converts geospatial index with no options" do
124
124
  Index.new(:position => :geo2d).to_args.should == [[[:position, Mongo::GEO2D]]]
125
125
  end
126
-
126
+
127
127
  it "converts geospatial index with min/max options" do
128
128
  Index.new(:position => :geo2d, :min => -50, :max => 50).to_args.should == [[[:position, Mongo::GEO2D]], { :min => -50, :max => 50 }]
129
129
  end
130
130
  end
131
-
131
+
132
132
  describe "equality" do
133
133
  it "is equal to an equivalent index" do
134
134
  Index.new(:title).should == Index.new(:title)
135
135
  Index.new(:title, :age).should == Index.new(:title => :ascending, :age => :ascending)
136
136
  end
137
-
137
+
138
138
  it "is not equal to an non-equivalent index" do
139
139
  Index.new(:title).should_not == Index.new(:age)
140
140
  Index.new(:title, :age).should_not == Index.new(:title => :ascending, :age => :descending)
@@ -4,50 +4,50 @@ module MongoModel
4
4
  specs_for(Document) do
5
5
  describe "optimistic locking" do
6
6
  define_class(:TestDocument, Document)
7
-
7
+
8
8
  it "does not lock optimistically by default" do
9
- TestDocument.locking_enabled?.should be_false
9
+ TestDocument.locking_enabled?.should be false
10
10
  end
11
-
11
+
12
12
  it "does not include a lock version property" do
13
13
  TestDocument.properties.should_not include(:_lock_version)
14
14
  end
15
-
15
+
16
16
  context "with locking enabled" do
17
17
  define_class(:TestDocument, Document) do
18
18
  property :name, String
19
19
  self.lock_optimistically = true
20
20
  end
21
-
21
+
22
22
  before(:each) do
23
23
  @fresh = TestDocument.create!(:name => 'Original')
24
24
  @stale = @fresh.dup
25
-
25
+
26
26
  @fresh.name = 'Changed'
27
27
  @fresh.save!
28
28
  end
29
-
29
+
30
30
  it "is enabled" do
31
- TestDocument.locking_enabled?.should be_true
31
+ TestDocument.locking_enabled?.should be true
32
32
  end
33
-
33
+
34
34
  it "defines a lock version property" do
35
35
  TestDocument.properties.should include(:_lock_version)
36
36
  end
37
-
37
+
38
38
  it "saves a fresh document" do
39
- @fresh.save.should be_true
39
+ @fresh.save.should be true
40
40
  end
41
-
41
+
42
42
  it "saves! a fresh document" do
43
- @fresh.save!.should be_true
43
+ @fresh.save!.should be true
44
44
  end
45
-
45
+
46
46
  it "does not save a stale document" do
47
- @stale.save.should be_false
47
+ @stale.save.should be false
48
48
  @stale._lock_version.should == 1
49
49
  end
50
-
50
+
51
51
  it "raises an error when trying to save! a stale document" do
52
52
  lambda { @stale.save! }.should raise_error(DocumentNotSaved)
53
53
  end
@@ -7,7 +7,7 @@ module MongoModel
7
7
  property :name, String
8
8
  property :age, Integer
9
9
  end
10
-
10
+
11
11
  context "an unsaved instance" do
12
12
  subject { User.new(:name => 'Test') }
13
13
 
@@ -64,7 +64,7 @@ module MongoModel
64
64
  end
65
65
  end
66
66
  end
67
-
67
+
68
68
  describe "#collection_name" do
69
69
  it "infers the default collection name" do
70
70
  User.collection_name.should == 'users'
@@ -94,7 +94,7 @@ module MongoModel
94
94
 
95
95
  ::CustomCollectionNameSubclass.collection_name.should == 'foobar'
96
96
  end
97
-
97
+
98
98
  it "allows subclasses to set a custom collection name" do
99
99
  class ::CustomCollectionName < Document; end
100
100
  class ::CustomCollectionNameSubclass < ::CustomCollectionName
@@ -113,7 +113,7 @@ module MongoModel
113
113
  it "uses the correct collection name" do
114
114
  User.collection.name.should == 'users'
115
115
  end
116
-
116
+
117
117
  it "is updated when the collection name changes" do
118
118
  collection = User.collection
119
119
  User.collection_name = "custom"
@@ -126,7 +126,7 @@ module MongoModel
126
126
  User.database.should == MongoModel.database
127
127
  end
128
128
  end
129
-
129
+
130
130
  describe "#create" do
131
131
  context "attributes hash" do
132
132
  it "passes attributes to instance" do
@@ -149,7 +149,7 @@ module MongoModel
149
149
  u.should be_a_new_record
150
150
  end
151
151
 
152
- block_called.should be_true
152
+ block_called.should be true
153
153
  end
154
154
  end
155
155
 
@@ -184,7 +184,7 @@ module MongoModel
184
184
  end
185
185
  end
186
186
  end
187
-
187
+
188
188
  describe "#delete (class method)" do
189
189
  before(:each) do
190
190
  User.create(:id => 'user-1', :name => 'Test', :age => 10)
@@ -195,16 +195,16 @@ module MongoModel
195
195
  it "deletes by id" do
196
196
  User.delete('user-1')
197
197
 
198
- User.exists?('user-1').should be_false
199
- User.exists?('user-2').should be_true
198
+ User.exists?('user-1').should be false
199
+ User.exists?('user-2').should be true
200
200
  end
201
-
201
+
202
202
  it "deletes by multiple ids in array" do
203
203
  User.delete(['user-1', 'user-2'])
204
204
 
205
- User.exists?('user-1').should be_false
206
- User.exists?('user-2').should be_false
207
- User.exists?('user-3').should be_true
205
+ User.exists?('user-1').should be false
206
+ User.exists?('user-2').should be false
207
+ User.exists?('user-3').should be true
208
208
  end
209
209
  end
210
210
 
@@ -217,8 +217,8 @@ module MongoModel
217
217
  it "deletes the instance from the database" do
218
218
  @user.delete
219
219
 
220
- User.exists?('user-1').should be_false
221
- User.exists?('user-2').should be_true
220
+ User.exists?('user-1').should be false
221
+ User.exists?('user-2').should be true
222
222
  end
223
223
 
224
224
  it "returns the instance" do
@@ -229,7 +229,7 @@ module MongoModel
229
229
  @user.delete
230
230
  @user.should be_frozen
231
231
  end
232
-
232
+
233
233
  it "marks the instance as destroyed" do
234
234
  @user.delete
235
235
  @user.should be_destroyed
@@ -245,8 +245,8 @@ module MongoModel
245
245
  it "deletes the instance from the database" do
246
246
  @user.destroy
247
247
 
248
- User.exists?('user-1').should be_false
249
- User.exists?('user-2').should be_true
248
+ User.exists?('user-1').should be false
249
+ User.exists?('user-2').should be true
250
250
  end
251
251
 
252
252
  it "returns the instance" do
@@ -257,7 +257,7 @@ module MongoModel
257
257
  @user.destroy
258
258
  @user.should be_frozen
259
259
  end
260
-
260
+
261
261
  it "marks the instance as destroyed" do
262
262
  @user.destroy
263
263
  @user.should be_destroyed
@@ -274,64 +274,64 @@ module MongoModel
274
274
  it "destroys by id" do
275
275
  User.destroy('user-1')
276
276
 
277
- User.exists?('user-1').should be_false
278
- User.exists?('user-2').should be_true
277
+ User.exists?('user-1').should be false
278
+ User.exists?('user-2').should be true
279
279
  end
280
280
 
281
281
  it "destroys by multiple ids in array" do
282
282
  User.destroy(['user-1', 'user-2'])
283
283
 
284
- User.exists?('user-1').should be_false
285
- User.exists?('user-2').should be_false
286
- User.exists?('user-3').should be_true
284
+ User.exists?('user-1').should be false
285
+ User.exists?('user-2').should be false
286
+ User.exists?('user-3').should be true
287
287
  end
288
288
  end
289
-
289
+
290
290
  describe "#update_attributes" do
291
291
  let(:user) { User.new(:name => 'Original', :age => 10) }
292
-
292
+
293
293
  before(:each) { user.update_attributes(:name => 'Changed', :age => 20) }
294
-
294
+
295
295
  it "updates the attributes" do
296
296
  user.name.should == 'Changed'
297
297
  user.age.should == 20
298
298
  end
299
-
299
+
300
300
  it "saves the document" do
301
301
  user.should_not be_a_new_record
302
302
  end
303
303
  end
304
-
304
+
305
305
  describe "#update_attribute" do
306
306
  let(:user) { User.new(:name => 'Original', :age => 10) }
307
-
307
+
308
308
  before(:each) { user.update_attribute(:name, 'Changed') }
309
-
309
+
310
310
  it "updates the given attribute" do
311
311
  user.name.should == 'Changed'
312
312
  end
313
-
313
+
314
314
  it "saves the document" do
315
315
  user.should_not be_a_new_record
316
316
  end
317
317
  end
318
-
318
+
319
319
  describe "#reload" do
320
320
  define_class(:UserComment, Document) do
321
321
  property :title, String
322
322
  property :body, String
323
-
323
+
324
324
  belongs_to :user
325
325
  end
326
-
326
+
327
327
  let(:user) { User.create!(:name => "Bob") }
328
-
328
+
329
329
  subject { UserComment.create!(:title => "Test", :user => user) }
330
-
330
+
331
331
  it "returns itself" do
332
332
  subject.reload.should == subject
333
333
  end
334
-
334
+
335
335
  it "resets the attributes" do
336
336
  subject.title = "New Value"
337
337
  subject.body = "Blah blah blah"
@@ -339,7 +339,7 @@ module MongoModel
339
339
  subject.title.should == "Test"
340
340
  subject.body.should == nil
341
341
  end
342
-
342
+
343
343
  it "resets the associations" do
344
344
  subject.user.should == user
345
345
  subject.user = User.new(:name => "Bill")
@@ -3,29 +3,29 @@ require 'spec_helper'
3
3
  module MongoModel
4
4
  describe Document do
5
5
  define_class(:Post, Document)
6
-
6
+
7
7
  describe "#scoped" do
8
8
  subject { Post.scoped }
9
-
9
+
10
10
  it { should be_an_instance_of(MongoModel::Scope) }
11
-
11
+
12
12
  it "sets the target class" do
13
13
  subject.klass.should == Post
14
14
  end
15
-
15
+
16
16
  context "with default scope(s) set" do
17
17
  define_class(:Post, Document) do
18
18
  default_scope order(:title.asc)
19
19
  default_scope limit(5)
20
20
  end
21
-
21
+
22
22
  it "returns the default scope" do
23
23
  scope = Post.scoped
24
24
  scope.order_values.should == [:title.asc]
25
25
  scope.limit_value.should == 5
26
26
  end
27
27
  end
28
-
28
+
29
29
  context "within a with_scope block" do
30
30
  it "returns the current scope" do
31
31
  Post.class_eval do
@@ -35,7 +35,7 @@ module MongoModel
35
35
  end
36
36
  end
37
37
  end
38
-
38
+
39
39
  context "within nested with_scope blocks" do
40
40
  it "returns the merged scope" do
41
41
  Post.class_eval do
@@ -49,50 +49,50 @@ module MongoModel
49
49
  end
50
50
  end
51
51
  end
52
-
52
+
53
53
  describe "#scope" do
54
54
  define_class(:Post, Document) do
55
55
  scope :published, where(:published => true)
56
-
56
+
57
57
  scope :latest, lambda { |num| order(:created_at.desc).limit(num) }
58
-
58
+
59
59
  scope :recent, order(:created_at.desc).limit(5)
60
60
  scope :recently_published, recent.where(:published => true)
61
61
  end
62
-
62
+
63
63
  define_class(:SpecialPost, :Post)
64
-
64
+
65
65
  it "creates a method returning the scope" do
66
66
  scope = Post.published
67
67
  scope.should be_an_instance_of(MongoModel::Scope)
68
68
  scope.where_values.should == [{:published => true}]
69
69
  end
70
-
70
+
71
71
  it "creates parameterized method returning the scope when given a lambda" do
72
72
  scope = Post.latest(4)
73
73
  scope.order_values.should == [:created_at.desc]
74
74
  scope.limit_value.should == 4
75
75
  end
76
-
76
+
77
77
  it "allows existing scopes to be built upon" do
78
78
  scope = Post.recently_published
79
79
  scope.where_values.should == [{:published => true}]
80
80
  scope.order_values.should == [:created_at.desc]
81
81
  scope.limit_value.should == 5
82
82
  end
83
-
83
+
84
84
  it "merges the scope with the current scope of the class it is called upon" do
85
85
  scope = SpecialPost.published
86
86
  scope.klass.should == SpecialPost
87
87
  end
88
88
  end
89
-
89
+
90
90
  describe "named scopes" do
91
91
  define_class(:Post, Document) do
92
92
  scope :published, where(:published => true)
93
93
  scope :recent, order(:created_at.desc).limit(5)
94
94
  end
95
-
95
+
96
96
  it "is chainable" do
97
97
  scope = Post.published.recent
98
98
  scope.where_values.should == [{:published => true}]