mongo_mapper-unstable 2009.10.16 → 2009.10.31

Sign up to get free protection for your applications and to get access to all the features.
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