mongo_mapper-unstable 2009.10.16 → 2009.10.31

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 (51) hide show
  1. data/.gitignore +3 -1
  2. data/README.rdoc +3 -0
  3. data/Rakefile +31 -65
  4. data/VERSION +1 -1
  5. data/lib/mongo_mapper/associations/base.rb +31 -4
  6. data/lib/mongo_mapper/associations/many_documents_as_proxy.rb +0 -2
  7. data/lib/mongo_mapper/associations/many_documents_proxy.rb +21 -15
  8. data/lib/mongo_mapper/associations/many_embedded_polymorphic_proxy.rb +2 -2
  9. data/lib/mongo_mapper/associations/many_embedded_proxy.rb +21 -36
  10. data/lib/mongo_mapper/associations/many_polymorphic_proxy.rb +1 -1
  11. data/lib/mongo_mapper/associations/proxy.rb +1 -0
  12. data/lib/mongo_mapper/associations.rb +114 -17
  13. data/lib/mongo_mapper/callbacks.rb +18 -0
  14. data/lib/mongo_mapper/document.rb +230 -95
  15. data/lib/mongo_mapper/dynamic_finder.rb +1 -1
  16. data/lib/mongo_mapper/embedded_document.rb +7 -3
  17. data/lib/mongo_mapper/finder_options.rb +88 -56
  18. data/lib/mongo_mapper/pagination.rb +2 -0
  19. data/lib/mongo_mapper/serialization.rb +2 -3
  20. data/lib/mongo_mapper/serializers/json_serializer.rb +1 -1
  21. data/lib/mongo_mapper/support.rb +9 -0
  22. data/lib/mongo_mapper/validations.rb +14 -42
  23. data/lib/mongo_mapper.rb +15 -13
  24. data/mongo_mapper.gemspec +13 -13
  25. data/specs.watchr +2 -2
  26. data/test/functional/associations/test_belongs_to_polymorphic_proxy.rb +5 -5
  27. data/test/functional/associations/test_belongs_to_proxy.rb +28 -30
  28. data/test/functional/associations/test_many_documents_as_proxy.rb +4 -4
  29. data/test/functional/associations/test_many_embedded_polymorphic_proxy.rb +27 -3
  30. data/test/functional/associations/test_many_embedded_proxy.rb +58 -38
  31. data/test/functional/associations/test_many_polymorphic_proxy.rb +49 -7
  32. data/test/functional/associations/test_many_proxy.rb +65 -15
  33. data/test/functional/test_associations.rb +3 -3
  34. data/test/functional/test_binary.rb +1 -1
  35. data/test/functional/test_callbacks.rb +1 -1
  36. data/test/functional/test_dirty.rb +3 -3
  37. data/test/functional/test_document.rb +178 -57
  38. data/test/functional/test_embedded_document.rb +1 -1
  39. data/test/functional/test_pagination.rb +18 -18
  40. data/test/functional/test_rails_compatibility.rb +1 -1
  41. data/test/functional/test_validations.rb +80 -27
  42. data/test/models.rb +93 -17
  43. data/test/support/{test_timing.rb → timing.rb} +1 -1
  44. data/test/test_helper.rb +8 -11
  45. data/test/unit/test_association_base.rb +23 -1
  46. data/test/unit/test_document.rb +29 -12
  47. data/test/unit/test_embedded_document.rb +13 -4
  48. data/test/unit/test_finder_options.rb +74 -58
  49. data/test/unit/test_mongomapper.rb +2 -2
  50. data/test/unit/test_pagination.rb +4 -0
  51. metadata +7 -7
@@ -1,73 +1,89 @@
1
1
  require 'test_helper'
2
+ require 'models'
2
3
 
3
4
  class FinderOptionsTest < Test::Unit::TestCase
4
5
  include MongoMapper
5
6
 
6
7
  should "raise error if provided something other than a hash" do
7
- lambda { FinderOptions.new }.should raise_error(ArgumentError)
8
- lambda { FinderOptions.new(1) }.should raise_error(ArgumentError)
8
+ lambda { FinderOptions.new(Room) }.should raise_error(ArgumentError)
9
+ lambda { FinderOptions.new(Room, 1) }.should raise_error(ArgumentError)
9
10
  end
10
11
 
11
12
  should "symbolize the keys of the hash provided" do
12
- FinderOptions.new('offset' => 1).options.keys.map do |key|
13
+ FinderOptions.new(Room, 'offset' => 1).options.keys.map do |key|
13
14
  key.should be_instance_of(Symbol)
14
15
  end
15
16
  end
16
17
 
17
- context "#criteria" do
18
- should "convert conditions to criteria" do
19
- FinderOptions.expects(:to_mongo_criteria).with(:foo => 1).returns({})
20
- FinderOptions.new(:conditions => {:foo => 1}).criteria
18
+ context "Converting conditions to criteria" do
19
+ should "not add _type to query if model does not have superclass that is single collection inherited" do
20
+ FinderOptions.new(Message, :foo => 'bar').criteria.should == {
21
+ :foo => 'bar'
22
+ }
21
23
  end
22
- end
23
-
24
- context "#options" do
25
- should "convert options to mongo options" do
26
- FinderOptions.expects(:to_mongo_options).with(:order => 'foo asc', :select => 'foo,bar').returns({})
27
- FinderOptions.new(:order => 'foo asc', :select => 'foo,bar').options
24
+
25
+ should "not add _type to nested conditions" do
26
+ FinderOptions.new(Enter, :foo => 'bar', :age => {'$gt' => 21}).criteria.should == {
27
+ :foo => 'bar',
28
+ :age => {'$gt' => 21},
29
+ :_type => 'Enter'
30
+ }
28
31
  end
29
- end
30
-
31
- context "Converting conditions to criteria" do
32
+
33
+ %w{gt lt gte lte ne in nin mod size where exists}.each do |operator|
34
+ should "convert #{operator} conditions" do
35
+ FinderOptions.new(Room, :age.send(operator) => 21).criteria.should == {
36
+ :age => {"$#{operator}" => 21}
37
+ }
38
+ end
39
+ end
40
+
41
+ should "automatically add _type to query if model is single collection inherited" do
42
+ FinderOptions.new(Enter, :foo => 'bar').criteria.should == {
43
+ :foo => 'bar',
44
+ :_type => 'Enter'
45
+ }
46
+ end
47
+
32
48
  should "work with simple criteria" do
33
- FinderOptions.to_mongo_criteria(:foo => 'bar').should == {
49
+ FinderOptions.new(Room, :foo => 'bar').criteria.should == {
34
50
  :foo => 'bar'
35
51
  }
36
52
 
37
- FinderOptions.to_mongo_criteria(:foo => 'bar', :baz => 'wick').should == {
53
+ FinderOptions.new(Room, :foo => 'bar', :baz => 'wick').criteria.should == {
38
54
  :foo => 'bar',
39
55
  :baz => 'wick'
40
56
  }
41
57
  end
42
58
 
43
59
  should "convert id to _id" do
44
- FinderOptions.to_mongo_criteria(:id => '1').should == {
60
+ FinderOptions.new(Room, :id => '1').criteria.should == {
45
61
  :_id => '1'
46
62
  }
47
63
  end
48
64
 
49
65
  should "use $in for arrays" do
50
- FinderOptions.to_mongo_criteria(:foo => [1,2,3]).should == {
66
+ FinderOptions.new(Room, :foo => [1,2,3]).criteria.should == {
51
67
  :foo => {'$in' => [1,2,3]}
52
68
  }
53
69
  end
54
70
 
55
71
  should "not use $in for arrays if already using array operator" do
56
- FinderOptions.to_mongo_criteria(:foo => {'$all' => [1,2,3]}).should == {
72
+ FinderOptions.new(Room, :foo => {'$all' => [1,2,3]}).criteria.should == {
57
73
  :foo => {'$all' => [1,2,3]}
58
74
  }
59
75
 
60
- FinderOptions.to_mongo_criteria(:foo => {'$any' => [1,2,3]}).should == {
76
+ FinderOptions.new(Room, :foo => {'$any' => [1,2,3]}).criteria.should == {
61
77
  :foo => {'$any' => [1,2,3]}
62
78
  }
63
79
  end
64
80
 
65
81
  should "work arbitrarily deep" do
66
- FinderOptions.to_mongo_criteria(:foo => {:bar => [1,2,3]}).should == {
82
+ FinderOptions.new(Room, :foo => {:bar => [1,2,3]}).criteria.should == {
67
83
  :foo => {:bar => {'$in' => [1,2,3]}}
68
84
  }
69
85
 
70
- FinderOptions.to_mongo_criteria(:foo => {:bar => {'$any' => [1,2,3]}}).should == {
86
+ FinderOptions.new(Room, :foo => {:bar => {'$any' => [1,2,3]}}).criteria.should == {
71
87
  :foo => {:bar => {'$any' => [1,2,3]}}
72
88
  }
73
89
  end
@@ -76,166 +92,166 @@ class FinderOptionsTest < Test::Unit::TestCase
76
92
  context "ordering" do
77
93
  should "single field with ascending direction" do
78
94
  sort = [['foo', 1]]
79
- FinderOptions.to_mongo_options(:order => 'foo asc')[:sort].should == sort
80
- FinderOptions.to_mongo_options(:order => 'foo ASC')[:sort].should == sort
95
+ FinderOptions.new(Room, :order => 'foo asc').options[:sort].should == sort
96
+ FinderOptions.new(Room, :order => 'foo ASC').options[:sort].should == sort
81
97
  end
82
98
 
83
99
  should "single field with descending direction" do
84
100
  sort = [['foo', -1]]
85
- FinderOptions.to_mongo_options(:order => 'foo desc')[:sort].should == sort
86
- FinderOptions.to_mongo_options(:order => 'foo DESC')[:sort].should == sort
101
+ FinderOptions.new(Room, :order => 'foo desc').options[:sort].should == sort
102
+ FinderOptions.new(Room, :order => 'foo DESC').options[:sort].should == sort
87
103
  end
88
104
 
89
105
  should "convert field without direction to ascending" do
90
106
  sort = [['foo', 1]]
91
- FinderOptions.to_mongo_options(:order => 'foo')[:sort].should == sort
107
+ FinderOptions.new(Room, :order => 'foo').options[:sort].should == sort
92
108
  end
93
109
 
94
110
  should "convert multiple fields with directions" do
95
111
  sort = [['foo', -1], ['bar', 1], ['baz', -1]]
96
- FinderOptions.to_mongo_options(:order => 'foo desc, bar asc, baz desc')[:sort].should == sort
112
+ FinderOptions.new(Room, :order => 'foo desc, bar asc, baz desc').options[:sort].should == sort
97
113
  end
98
114
 
99
115
  should "convert multiple fields with some missing directions" do
100
116
  sort = [['foo', -1], ['bar', 1], ['baz', 1]]
101
- FinderOptions.to_mongo_options(:order => 'foo desc, bar, baz')[:sort].should == sort
117
+ FinderOptions.new(Room, :order => 'foo desc, bar, baz').options[:sort].should == sort
102
118
  end
103
119
 
104
120
  should "just use sort if sort and order are present" do
105
121
  sort = [['$natural', 1]]
106
- FinderOptions.to_mongo_options(:sort => sort, :order => 'foo asc')[:sort].should == sort
122
+ FinderOptions.new(Room, :sort => sort, :order => 'foo asc').options[:sort].should == sort
107
123
  end
108
124
 
109
125
  should "convert natural in order to proper" do
110
126
  sort = [['$natural', 1]]
111
- FinderOptions.to_mongo_options(:order => '$natural asc')[:sort].should == sort
127
+ FinderOptions.new(Room, :order => '$natural asc').options[:sort].should == sort
112
128
  sort = [['$natural', -1]]
113
- FinderOptions.to_mongo_options(:order => '$natural desc')[:sort].should == sort
129
+ FinderOptions.new(Room, :order => '$natural desc').options[:sort].should == sort
114
130
  end
115
131
 
116
132
  should "work for natural order ascending" do
117
- FinderOptions.to_mongo_options(:sort => {'$natural' => 1})[:sort]['$natural'].should == 1
133
+ FinderOptions.new(Room, :sort => {'$natural' => 1}).options[:sort]['$natural'].should == 1
118
134
  end
119
135
 
120
136
  should "work for natural order descending" do
121
- FinderOptions.to_mongo_options(:sort => {'$natural' => -1})[:sort]['$natural'].should == -1
137
+ FinderOptions.new(Room, :sort => {'$natural' => -1}).options[:sort]['$natural'].should == -1
122
138
  end
123
139
  end
124
140
 
125
141
  context "skip" do
126
142
  should "default to 0" do
127
- FinderOptions.to_mongo_options({})[:skip].should == 0
143
+ FinderOptions.new(Room, {}).options[:skip].should == 0
128
144
  end
129
145
 
130
146
  should "use skip provided" do
131
- FinderOptions.to_mongo_options(:skip => 2)[:skip].should == 2
147
+ FinderOptions.new(Room, :skip => 2).options[:skip].should == 2
132
148
  end
133
149
 
134
150
  should "covert string to integer" do
135
- FinderOptions.to_mongo_options(:skip => '2')[:skip].should == 2
151
+ FinderOptions.new(Room, :skip => '2').options[:skip].should == 2
136
152
  end
137
153
 
138
154
  should "convert offset to skip" do
139
- FinderOptions.to_mongo_options(:offset => 1)[:skip].should == 1
155
+ FinderOptions.new(Room, :offset => 1).options[:skip].should == 1
140
156
  end
141
157
  end
142
158
 
143
159
  context "limit" do
144
160
  should "default to 0" do
145
- FinderOptions.to_mongo_options({})[:limit].should == 0
161
+ FinderOptions.new(Room, {}).options[:limit].should == 0
146
162
  end
147
163
 
148
164
  should "use limit provided" do
149
- FinderOptions.to_mongo_options(:limit => 2)[:limit].should == 2
165
+ FinderOptions.new(Room, :limit => 2).options[:limit].should == 2
150
166
  end
151
167
 
152
168
  should "covert string to integer" do
153
- FinderOptions.to_mongo_options(:limit => '2')[:limit].should == 2
169
+ FinderOptions.new(Room, :limit => '2').options[:limit].should == 2
154
170
  end
155
171
  end
156
172
 
157
173
  context "fields" do
158
174
  should "default to nil" do
159
- FinderOptions.to_mongo_options({})[:fields].should be(nil)
175
+ FinderOptions.new(Room, {}).options[:fields].should be(nil)
160
176
  end
161
177
 
162
178
  should "be converted to nil if empty string" do
163
- FinderOptions.to_mongo_options(:fields => '')[:fields].should be(nil)
179
+ FinderOptions.new(Room, :fields => '').options[:fields].should be(nil)
164
180
  end
165
181
 
166
182
  should "be converted to nil if []" do
167
- FinderOptions.to_mongo_options(:fields => [])[:fields].should be(nil)
183
+ FinderOptions.new(Room, :fields => []).options[:fields].should be(nil)
168
184
  end
169
185
 
170
186
  should "should work with array" do
171
- FinderOptions.to_mongo_options({:fields => %w(a b)})[:fields].should == %w(a b)
187
+ FinderOptions.new(Room, {:fields => %w(a b)}).options[:fields].should == %w(a b)
172
188
  end
173
189
 
174
190
  should "convert comma separated list to array" do
175
- FinderOptions.to_mongo_options({:fields => 'a, b'})[:fields].should == %w(a b)
191
+ FinderOptions.new(Room, {:fields => 'a, b'}).options[:fields].should == %w(a b)
176
192
  end
177
193
 
178
194
  should "also work as select" do
179
- FinderOptions.new(:select => %w(a b)).options[:fields].should == %w(a b)
195
+ FinderOptions.new(Room, :select => %w(a b)).options[:fields].should == %w(a b)
180
196
  end
181
197
  end
182
198
 
183
199
  context "Condition auto-detection" do
184
200
  should "know :conditions are criteria" do
185
- finder = FinderOptions.new(:conditions => {:foo => 'bar'})
201
+ finder = FinderOptions.new(Room, :conditions => {:foo => 'bar'})
186
202
  finder.criteria.should == {:foo => 'bar'}
187
203
  finder.options.keys.should_not include(:conditions)
188
204
  end
189
205
 
190
206
  should "know fields is an option" do
191
- finder = FinderOptions.new(:fields => ['foo'])
207
+ finder = FinderOptions.new(Room, :fields => ['foo'])
192
208
  finder.options[:fields].should == ['foo']
193
209
  finder.criteria.keys.should_not include(:fields)
194
210
  end
195
211
 
196
212
  # select gets converted to fields so just checking keys
197
213
  should "know select is an option" do
198
- finder = FinderOptions.new(:select => 'foo')
214
+ finder = FinderOptions.new(Room, :select => 'foo')
199
215
  finder.options.keys.should include(:sort)
200
216
  finder.criteria.keys.should_not include(:select)
201
217
  finder.criteria.keys.should_not include(:fields)
202
218
  end
203
219
 
204
220
  should "know skip is an option" do
205
- finder = FinderOptions.new(:skip => 10)
221
+ finder = FinderOptions.new(Room, :skip => 10)
206
222
  finder.options[:skip].should == 10
207
223
  finder.criteria.keys.should_not include(:skip)
208
224
  end
209
225
 
210
226
  # offset gets converted to skip so just checking keys
211
227
  should "know offset is an option" do
212
- finder = FinderOptions.new(:offset => 10)
228
+ finder = FinderOptions.new(Room, :offset => 10)
213
229
  finder.options.keys.should include(:skip)
214
230
  finder.criteria.keys.should_not include(:skip)
215
231
  finder.criteria.keys.should_not include(:offset)
216
232
  end
217
233
 
218
234
  should "know limit is an option" do
219
- finder = FinderOptions.new(:limit => 10)
235
+ finder = FinderOptions.new(Room, :limit => 10)
220
236
  finder.options[:limit].should == 10
221
237
  finder.criteria.keys.should_not include(:limit)
222
238
  end
223
239
 
224
240
  should "know sort is an option" do
225
- finder = FinderOptions.new(:sort => [['foo', 1]])
241
+ finder = FinderOptions.new(Room, :sort => [['foo', 1]])
226
242
  finder.options[:sort].should == [['foo', 1]]
227
243
  finder.criteria.keys.should_not include(:sort)
228
244
  end
229
245
 
230
246
  # order gets converted to sort so just checking keys
231
247
  should "know order is an option" do
232
- finder = FinderOptions.new(:order => 'foo')
248
+ finder = FinderOptions.new(Room, :order => 'foo')
233
249
  finder.options.keys.should include(:sort)
234
250
  finder.criteria.keys.should_not include(:sort)
235
251
  end
236
252
 
237
253
  should "work with full range of things" do
238
- finder_options = FinderOptions.new({
254
+ finder_options = FinderOptions.new(Room, {
239
255
  :foo => 'bar',
240
256
  :baz => true,
241
257
  :sort => [['foo', 1]],
@@ -15,9 +15,9 @@ class MongoMapperTest < Test::Unit::TestCase
15
15
  end
16
16
 
17
17
  should "be able to write and read default database" do
18
- MongoMapper.database = DefaultDatabase
18
+ MongoMapper.database = 'test'
19
19
  MongoMapper.database.should be_instance_of(Mongo::DB)
20
- MongoMapper.database.name.should == DefaultDatabase
20
+ MongoMapper.database.name.should == 'test'
21
21
  end
22
22
 
23
23
  should "have document not found error" do
@@ -58,6 +58,10 @@ class PaginationTest < Test::Unit::TestCase
58
58
  should "know how many records to skip" do
59
59
  PaginationProxy.new(25, 2, 10).skip.should == 10
60
60
  end
61
+
62
+ should "alias offset to skip" do
63
+ PaginationProxy.new(25, 2, 10).offset.should == 10
64
+ end
61
65
 
62
66
  context "previous_page" do
63
67
  should "be nil if current page 1" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongo_mapper-unstable
3
3
  version: !ruby/object:Gem::Version
4
- version: 2009.10.16
4
+ version: 2009.10.31
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Nunemaker
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-10-16 00:00:00 -05:00
12
+ date: 2009-10-31 00:00:00 -05:00
13
13
  default_executable: mmconsole
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -30,7 +30,7 @@ dependencies:
30
30
  requirements:
31
31
  - - "="
32
32
  - !ruby/object:Gem::Version
33
- version: 0.15.1
33
+ version: "0.16"
34
34
  version:
35
35
  - !ruby/object:Gem::Dependency
36
36
  name: jnunemaker-validatable
@@ -40,7 +40,7 @@ dependencies:
40
40
  requirements:
41
41
  - - "="
42
42
  - !ruby/object:Gem::Version
43
- version: 1.7.4
43
+ version: 1.8.1
44
44
  version:
45
45
  - !ruby/object:Gem::Dependency
46
46
  name: jnunemaker-matchy
@@ -147,7 +147,7 @@ files:
147
147
  - test/functional/test_validations.rb
148
148
  - test/models.rb
149
149
  - test/support/custom_matchers.rb
150
- - test/support/test_timing.rb
150
+ - test/support/timing.rb
151
151
  - test/test_helper.rb
152
152
  - test/unit/serializers/test_json_serializer.rb
153
153
  - test/unit/test_association_base.rb
@@ -187,7 +187,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
187
187
  version:
188
188
  requirements: []
189
189
 
190
- rubyforge_project: mongomapper
190
+ rubyforge_project:
191
191
  rubygems_version: 1.3.5
192
192
  signing_key:
193
193
  specification_version: 3
@@ -210,7 +210,7 @@ test_files:
210
210
  - test/unit/test_pagination.rb
211
211
  - test/test_helper.rb
212
212
  - test/support/custom_matchers.rb
213
- - test/support/test_timing.rb
213
+ - test/support/timing.rb
214
214
  - test/functional/test_embedded_document.rb
215
215
  - test/functional/test_associations.rb
216
216
  - test/functional/associations/test_belongs_to_proxy.rb