mongo_mapper 0.8.3 → 0.8.4
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.
- data/UPGRADES +7 -0
- data/examples/attr_accessible.rb +22 -0
- data/examples/attr_protected.rb +22 -0
- data/examples/cache_key.rb +24 -0
- data/examples/custom_types.rb +24 -0
- data/examples/identity_map/automatic.rb +8 -0
- data/examples/identity_map/middleware.rb +14 -0
- data/examples/identity_map.rb +33 -0
- data/examples/validating/embedded_docs.rb +29 -0
- data/lib/mongo_mapper/extensions/object_id.rb +1 -1
- data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +0 -1
- data/lib/mongo_mapper/plugins/associations/proxy.rb +17 -0
- data/lib/mongo_mapper/plugins/clone.rb +3 -0
- data/lib/mongo_mapper/plugins/dirty.rb +10 -6
- data/lib/mongo_mapper/plugins/embedded_document.rb +3 -4
- data/lib/mongo_mapper/plugins/identity_map.rb +1 -1
- data/lib/mongo_mapper/plugins/keys/key.rb +1 -1
- data/lib/mongo_mapper/plugins/keys.rb +12 -13
- data/lib/mongo_mapper/plugins/serialization.rb +3 -3
- data/lib/mongo_mapper/plugins/validations.rb +3 -3
- data/lib/mongo_mapper/version.rb +1 -1
- data/rails/init.rb +19 -0
- data/test/functional/associations/test_belongs_to_proxy.rb +1 -1
- data/test/functional/associations/test_many_documents_proxy.rb +31 -1
- data/test/functional/associations/test_one_embedded_proxy.rb +14 -0
- data/test/functional/test_caching.rb +1 -1
- data/test/functional/test_document.rb +1 -1
- data/test/functional/test_identity_map.rb +12 -4
- data/test/functional/test_querying.rb +6 -6
- data/test/functional/test_string_id_compatibility.rb +1 -1
- data/test/test_helper.rb +2 -2
- data/test/unit/serializers/test_json_serializer.rb +15 -0
- data/test/unit/test_clone.rb +1 -1
- data/test/unit/test_document.rb +3 -3
- data/test/unit/test_embedded_document.rb +5 -5
- data/test/unit/test_extensions.rb +7 -7
- data/test/unit/test_key.rb +2 -2
- data/test/unit/test_validations.rb +20 -0
- metadata +20 -11
data/UPGRADES
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
0.7.6 => 0.8
|
2
|
+
* Proxy#owner has been removed in favor of Proxy#proxy_owner
|
3
|
+
* @new instance variable renamed to @_new (you shouldn't be using this anyway)
|
4
|
+
* Removed undefining of object_id in proxies and equal? method in Equality. This means checking equal? for a proxy and a regular document will always be false even if proxy refers to same document. Check Proxy#target instead. (ie: root.equal?(item.root.target))
|
5
|
+
* find no longer takes options as a last argument. It only works with id, multiple ids, array of ids.
|
6
|
+
* MongoMapper::MongoMapperError is now MongoMapper::Error
|
7
|
+
* metaclass, meta_eval, meta_def, class_def removed as they were not being used
|
@@ -0,0 +1,22 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
|
2
|
+
require 'mongo_mapper'
|
3
|
+
|
4
|
+
MongoMapper.database = 'testing'
|
5
|
+
|
6
|
+
class User
|
7
|
+
include MongoMapper::Document
|
8
|
+
key :email, String
|
9
|
+
key :admin, Boolean, :default => false
|
10
|
+
|
11
|
+
# Only accessible or protected can be used, they cannot be used together
|
12
|
+
attr_accessible :email
|
13
|
+
end
|
14
|
+
|
15
|
+
# only accessible are set on new/create/etc.
|
16
|
+
user = User.create(:email => 'IDontLowerCaseThings@gmail.com', :admin => true)
|
17
|
+
puts user.admin # false
|
18
|
+
|
19
|
+
# can be set using accessor
|
20
|
+
user.admin = true
|
21
|
+
user.save
|
22
|
+
puts user.admin # true
|
@@ -0,0 +1,22 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
|
2
|
+
require 'mongo_mapper'
|
3
|
+
|
4
|
+
MongoMapper.database = 'testing'
|
5
|
+
|
6
|
+
class User
|
7
|
+
include MongoMapper::Document
|
8
|
+
key :email, String
|
9
|
+
key :admin, Boolean, :default => false
|
10
|
+
|
11
|
+
# Only accessible or protected can be used, they cannot be used together
|
12
|
+
attr_protected :admin
|
13
|
+
end
|
14
|
+
|
15
|
+
# protected are ignored on new/create/etc.
|
16
|
+
user = User.create(:email => 'IDontLowerCaseThings@gmail.com', :admin => true)
|
17
|
+
puts user.admin # false
|
18
|
+
|
19
|
+
# can be set using accessor
|
20
|
+
user.admin = true
|
21
|
+
user.save
|
22
|
+
puts user.admin # true
|
@@ -0,0 +1,24 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
|
2
|
+
require 'mongo_mapper'
|
3
|
+
|
4
|
+
MongoMapper.database = 'testing'
|
5
|
+
|
6
|
+
class User
|
7
|
+
include MongoMapper::Document
|
8
|
+
end
|
9
|
+
|
10
|
+
# New Documents
|
11
|
+
puts User.new.cache_key # User/new
|
12
|
+
|
13
|
+
# Created Documents
|
14
|
+
puts User.create.cache_key # User/:id (ie: User/4c7a940cbcd1b3319b000003)
|
15
|
+
|
16
|
+
# With Suffix
|
17
|
+
puts User.create.cache_key(:foo) # User/:id/foo
|
18
|
+
|
19
|
+
# With Multiple Suffixes
|
20
|
+
puts User.create.cache_key(:foo, :bar, :baz) # User/:id/foo/bar/baz
|
21
|
+
|
22
|
+
# When updated_at key exists it will be used
|
23
|
+
User.timestamps!
|
24
|
+
puts User.create.cache_key # User/:id-:updated_at (ie: User/4c7a940cbcd1b3319b000003-20100829170828)
|
@@ -0,0 +1,24 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
|
2
|
+
require 'mongo_mapper'
|
3
|
+
require 'pp'
|
4
|
+
|
5
|
+
MongoMapper.database = 'testing'
|
6
|
+
|
7
|
+
class DowncasedString
|
8
|
+
# to_mongo gets called anytime a value is assigned
|
9
|
+
def self.to_mongo(value)
|
10
|
+
value.nil? ? nil : value.to_s.downcase
|
11
|
+
end
|
12
|
+
|
13
|
+
# from mongo gets called anytime a value is read
|
14
|
+
def self.from_mongo(value)
|
15
|
+
value.nil? ? nil : value.to_s.downcase
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class User
|
20
|
+
include MongoMapper::Document
|
21
|
+
key :email, DowncasedString
|
22
|
+
end
|
23
|
+
|
24
|
+
pp User.create(:email => 'IDontLowerCaseThings@gmail.com')
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# To use this, add the following line in environment.rb
|
2
|
+
# config.middleware.use 'PerRequestIdentityMap'
|
3
|
+
class PerRequestIdentityMap
|
4
|
+
def initialize(app)
|
5
|
+
@app = app
|
6
|
+
end
|
7
|
+
|
8
|
+
def call(env)
|
9
|
+
MongoMapper::Plugins::IdentityMap.clear
|
10
|
+
@app.call(env)
|
11
|
+
ensure
|
12
|
+
MongoMapper::Plugins::IdentityMap.clear
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
|
2
|
+
require 'mongo_mapper'
|
3
|
+
require 'pp'
|
4
|
+
|
5
|
+
MongoMapper.database = 'testing'
|
6
|
+
|
7
|
+
class User
|
8
|
+
include MongoMapper::Document
|
9
|
+
plugin MongoMapper::Plugins::IdentityMap
|
10
|
+
|
11
|
+
key :name, String
|
12
|
+
end
|
13
|
+
User.delete_all
|
14
|
+
|
15
|
+
user = User.create(:name => 'John')
|
16
|
+
|
17
|
+
# User gets added to map on save
|
18
|
+
pp User.identity_map[user.id]
|
19
|
+
|
20
|
+
# Does not matter how you find user, it is always the same object until the identity map is cleared
|
21
|
+
puts "#{User.identity_map[user.id].object_id} == #{user.object_id}"
|
22
|
+
puts "#{User.find(user.id).object_id} == #{user.object_id}"
|
23
|
+
puts "#{User.all[0].object_id} == #{user.object_id}"
|
24
|
+
|
25
|
+
MongoMapper::Plugins::IdentityMap.clear
|
26
|
+
puts "#{User.find(user.id).object_id} != #{user.object_id}"
|
27
|
+
|
28
|
+
# User gets removed from map on destroy
|
29
|
+
user = User.create
|
30
|
+
user.destroy
|
31
|
+
puts "Should be nil: " + User.identity_map[user.id].inspect
|
32
|
+
|
33
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
|
2
|
+
require 'mongo_mapper'
|
3
|
+
require 'pp'
|
4
|
+
|
5
|
+
MongoMapper.database = 'testing'
|
6
|
+
|
7
|
+
class Field
|
8
|
+
include MongoMapper::EmbeddedDocument
|
9
|
+
key :name
|
10
|
+
validates_presence_of :name
|
11
|
+
end
|
12
|
+
|
13
|
+
class Template
|
14
|
+
include MongoMapper::Document
|
15
|
+
key :name
|
16
|
+
many :fields
|
17
|
+
|
18
|
+
# This tells the template to validate all
|
19
|
+
# fields when validating the template.
|
20
|
+
validates_associated :fields
|
21
|
+
end
|
22
|
+
|
23
|
+
# Name is missing on embedded field
|
24
|
+
template = Template.new(:fields => [Field.new])
|
25
|
+
puts template.valid? # false
|
26
|
+
|
27
|
+
# Name is present on embedded field
|
28
|
+
template = Template.new(:fields => [Field.new(:name => 'Yay')])
|
29
|
+
puts template.valid? # true
|
@@ -25,6 +25,23 @@ module MongoMapper
|
|
25
25
|
reset
|
26
26
|
end
|
27
27
|
|
28
|
+
# Active support in rails 3 beta 4 can override to_json after this is loaded,
|
29
|
+
# at least when run in mongomapper tests. The implementation was changed in master
|
30
|
+
# some time after this, so not sure whether this is still a problem.
|
31
|
+
#
|
32
|
+
# In rails 2, this isn't a problem however it also solves an issue where
|
33
|
+
# to_json isn't forwarded because it supports to_json itself
|
34
|
+
def to_json(*options)
|
35
|
+
load_target
|
36
|
+
target.to_json(*options)
|
37
|
+
end
|
38
|
+
|
39
|
+
# see comments to to_json
|
40
|
+
def as_json(*options)
|
41
|
+
load_target
|
42
|
+
target.as_json(*options)
|
43
|
+
end
|
44
|
+
|
28
45
|
def inspect
|
29
46
|
load_target
|
30
47
|
target.inspect
|
@@ -7,6 +7,9 @@ module MongoMapper
|
|
7
7
|
@_new = true
|
8
8
|
@_destroyed = false
|
9
9
|
default_id_value({})
|
10
|
+
associations.each do |name, association|
|
11
|
+
instance_variable_set(association.ivar, nil)
|
12
|
+
end
|
10
13
|
self.attributes = other.attributes.clone.except(:_id).inject({}) do |hash, entry|
|
11
14
|
key, value = entry
|
12
15
|
hash[key] = value.duplicable? ? value.clone : value
|
@@ -39,25 +39,29 @@ module MongoMapper
|
|
39
39
|
changed.inject({}) { |h, key| h[key] = key_change(key); h }
|
40
40
|
end
|
41
41
|
|
42
|
-
def initialize(*
|
43
|
-
|
44
|
-
|
42
|
+
def initialize(*)
|
43
|
+
# never register initial id assignment as a change
|
44
|
+
super.tap { changed_keys.delete('_id') }
|
45
45
|
end
|
46
46
|
|
47
|
-
def
|
47
|
+
def initialize_from_database(*)
|
48
|
+
super.tap { changed_keys.clear }
|
49
|
+
end
|
50
|
+
|
51
|
+
def save(*)
|
48
52
|
if status = super
|
49
53
|
changed_keys.clear
|
50
54
|
end
|
51
55
|
status
|
52
56
|
end
|
53
57
|
|
54
|
-
def save!(*
|
58
|
+
def save!(*)
|
55
59
|
status = super
|
56
60
|
changed_keys.clear
|
57
61
|
status
|
58
62
|
end
|
59
63
|
|
60
|
-
def reload(*
|
64
|
+
def reload(*)
|
61
65
|
document = super
|
62
66
|
changed_keys.clear
|
63
67
|
document
|
@@ -4,7 +4,7 @@ module MongoMapper
|
|
4
4
|
module EmbeddedDocument
|
5
5
|
def self.configure(model)
|
6
6
|
model.class_eval do
|
7
|
-
|
7
|
+
attr_accessor :_parent_document
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
@@ -39,9 +39,8 @@ module MongoMapper
|
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
-
def
|
43
|
-
@_root_document
|
44
|
-
@_parent_document = value
|
42
|
+
def _root_document
|
43
|
+
@_root_document ||= _parent_document.try(:_root_document)
|
45
44
|
end
|
46
45
|
end
|
47
46
|
end
|
@@ -41,7 +41,7 @@ module MongoMapper
|
|
41
41
|
def find_one(opts={})
|
42
42
|
query = clone.update(opts)
|
43
43
|
|
44
|
-
if query.simple? && model.identity_map[query[:_id]]
|
44
|
+
if model.identity_map_on? && query.simple? && model.identity_map[query[:_id]]
|
45
45
|
model.identity_map[query[:_id]]
|
46
46
|
else
|
47
47
|
super.tap do |doc|
|
@@ -63,11 +63,10 @@ module MongoMapper
|
|
63
63
|
def load(attrs)
|
64
64
|
return nil if attrs.nil?
|
65
65
|
begin
|
66
|
-
|
67
|
-
klass.new(attrs, true)
|
66
|
+
attrs['_type'].present? ? attrs['_type'].constantize : self
|
68
67
|
rescue NameError
|
69
|
-
|
70
|
-
end
|
68
|
+
self
|
69
|
+
end.allocate.initialize_from_database(attrs)
|
71
70
|
end
|
72
71
|
|
73
72
|
private
|
@@ -160,16 +159,16 @@ module MongoMapper
|
|
160
159
|
end
|
161
160
|
|
162
161
|
module InstanceMethods
|
163
|
-
def initialize(attrs={}
|
162
|
+
def initialize(attrs={})
|
164
163
|
default_id_value(attrs)
|
164
|
+
@_new = true
|
165
|
+
assign(attrs)
|
166
|
+
end
|
165
167
|
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
@_new = true
|
171
|
-
assign(attrs)
|
172
|
-
end
|
168
|
+
def initialize_from_database(attrs={})
|
169
|
+
@_new = false
|
170
|
+
load_from_database(attrs)
|
171
|
+
self
|
173
172
|
end
|
174
173
|
|
175
174
|
def persisted?
|
@@ -275,7 +274,7 @@ module MongoMapper
|
|
275
274
|
unless attrs.nil?
|
276
275
|
id_provided = attrs.keys.map { |k| k.to_s }.detect { |k| k == 'id' || k == '_id' }
|
277
276
|
if !id_provided && self.class.can_default_id?
|
278
|
-
write_key :_id, BSON::
|
277
|
+
write_key :_id, BSON::ObjectId.new
|
279
278
|
end
|
280
279
|
end
|
281
280
|
end
|
@@ -52,7 +52,7 @@ module MongoMapper
|
|
52
52
|
hash[key] = value.map do |item|
|
53
53
|
item.respond_to?(:as_json) ? item.as_json(options) : item
|
54
54
|
end
|
55
|
-
elsif value.is_a? BSON::
|
55
|
+
elsif value.is_a? BSON::ObjectId
|
56
56
|
hash[key] = value.to_s
|
57
57
|
elsif value.respond_to?(:as_json)
|
58
58
|
hash[key] = value.as_json(options)
|
@@ -60,7 +60,7 @@ module MongoMapper
|
|
60
60
|
end
|
61
61
|
|
62
62
|
# Replicate Rails 3 naming - and also bin anytihng after : for use in our dynamic classes from unit tests
|
63
|
-
hash = { ActiveSupport::Inflector.underscore(ActiveSupport::Inflector.demodulize(self)).gsub(/:.*/,'') => hash } if include_root_in_json
|
63
|
+
hash = { ActiveSupport::Inflector.underscore(ActiveSupport::Inflector.demodulize(self.class.name)).gsub(/:.*/,'') => hash } if include_root_in_json
|
64
64
|
hash
|
65
65
|
end
|
66
66
|
end
|
@@ -73,4 +73,4 @@ module MongoMapper
|
|
73
73
|
|
74
74
|
end
|
75
75
|
end
|
76
|
-
end
|
76
|
+
end
|
@@ -21,8 +21,8 @@ module MongoMapper
|
|
21
21
|
|
22
22
|
def valid?(instance)
|
23
23
|
value = instance[attribute]
|
24
|
-
return
|
25
|
-
return
|
24
|
+
return allow_nil if value.nil? and not allow_nil.nil?
|
25
|
+
return allow_blank if value.blank? and not allow_blank.nil?
|
26
26
|
base_conditions = case_sensitive ? {self.attribute => value} : {}
|
27
27
|
doc = instance.class.first(base_conditions.merge(scope_conditions(instance)).merge(where_conditions(instance)))
|
28
28
|
doc.nil? || instance._id == doc._id
|
@@ -47,4 +47,4 @@ module MongoMapper
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
50
|
-
end
|
50
|
+
end
|
data/lib/mongo_mapper/version.rb
CHANGED
data/rails/init.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# See http://groups.google.com/group/mongomapper/browse_thread/thread/68f62e8eda43b43a/4841dba76938290c
|
2
|
+
#
|
3
|
+
# This is only for development mode. You will still want to clear the identity map before each request in production.
|
4
|
+
# See examples/identity_map for more on this.
|
5
|
+
#
|
6
|
+
# to_prepare is called before each request in development mode and the first request in production.
|
7
|
+
Rails.configuration.to_prepare do
|
8
|
+
if Rails.configuration.cache_classes
|
9
|
+
MongoMapper::Plugins::IdentityMap.clear
|
10
|
+
else
|
11
|
+
# Rails reloading was making descendants fill up and leak memory, these make sure they get cleared
|
12
|
+
MongoMapper::Document.descendants.each {|m| m.descendants.clear if m.respond_to?(:descendants) }
|
13
|
+
MongoMapper::Document.descendants.clear
|
14
|
+
MongoMapper::EmbeddedDocument.descendants.each {|m| m.descendants.clear if m.respond_to?(:descendants) }
|
15
|
+
MongoMapper::EmbeddedDocument.descendants.clear
|
16
|
+
MongoMapper::Plugins::IdentityMap.clear
|
17
|
+
MongoMapper::Plugins::IdentityMap.models.clear
|
18
|
+
end
|
19
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'test_helper'
|
1
|
+
require 'test_helper.rb'
|
2
2
|
require 'models'
|
3
3
|
|
4
4
|
class ManyDocumentsProxyTest < Test::Unit::TestCase
|
@@ -145,6 +145,18 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
|
|
145
145
|
project.save!
|
146
146
|
status.should_not be_new
|
147
147
|
end
|
148
|
+
|
149
|
+
should "not save the parent when building associations" do
|
150
|
+
project = Project.new
|
151
|
+
status = project.statuses.build(:name => 'Foo')
|
152
|
+
project.should be_new
|
153
|
+
end
|
154
|
+
|
155
|
+
should "not save the built object" do
|
156
|
+
project = Project.new
|
157
|
+
status = project.statuses.build(:name => 'Foo')
|
158
|
+
status.should be_new
|
159
|
+
end
|
148
160
|
end
|
149
161
|
|
150
162
|
context "create" do
|
@@ -232,6 +244,24 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
|
|
232
244
|
end
|
233
245
|
end
|
234
246
|
|
247
|
+
context "to_json" do
|
248
|
+
should "work on association" do
|
249
|
+
project = Project.create
|
250
|
+
3.times { |i| project.statuses.create(:name => i.to_s) }
|
251
|
+
|
252
|
+
JSON.parse(project.statuses.to_json).collect{|status| status["name"] }.sort.should == ["0","1","2"]
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
context "as_json" do
|
257
|
+
should "work on association" do
|
258
|
+
project = Project.create
|
259
|
+
3.times { |i| project.statuses.create(:name => i.to_s) }
|
260
|
+
|
261
|
+
project.statuses.as_json.collect{|status| status["name"] }.sort.should == ["0","1","2"]
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
235
265
|
context "Unassociating documents" do
|
236
266
|
setup do
|
237
267
|
@project = Project.create
|
@@ -54,6 +54,20 @@ class OneEmbeddedProxyTest < Test::Unit::TestCase
|
|
54
54
|
}.should_not raise_error
|
55
55
|
end
|
56
56
|
|
57
|
+
should "load the parent and root documents for nested embedded documents" do
|
58
|
+
@address_class = EDoc('Address') do
|
59
|
+
key :city, String
|
60
|
+
key :state, String
|
61
|
+
end
|
62
|
+
@author_class.one :address, :class => @address_class
|
63
|
+
@post_class.one :author, :class => @author_class
|
64
|
+
|
65
|
+
post = @post_class.create(:title => 'Post Title', :author => { :name => 'Frank', :address => { :city => 'Boston', :state => 'MA' } })
|
66
|
+
|
67
|
+
post.author.address._parent_document.should == post.author
|
68
|
+
post.author.address._root_document.should == post
|
69
|
+
end
|
70
|
+
|
57
71
|
should "have boolean method for testing presence" do
|
58
72
|
@post_class.one :author, :class => @author_class
|
59
73
|
|
@@ -140,7 +140,7 @@ class IdentityMapTest < Test::Unit::TestCase
|
|
140
140
|
|
141
141
|
context "#load" do
|
142
142
|
setup do
|
143
|
-
@id = BSON::
|
143
|
+
@id = BSON::ObjectId.new
|
144
144
|
end
|
145
145
|
|
146
146
|
should "add document to map" do
|
@@ -327,7 +327,7 @@ class IdentityMapTest < Test::Unit::TestCase
|
|
327
327
|
|
328
328
|
should "return nil for document id not found in collection" do
|
329
329
|
assert_in_map(@person)
|
330
|
-
@person_class.find_by_id(BSON::
|
330
|
+
@person_class.find_by_id(BSON::ObjectId.new).should be_nil
|
331
331
|
end
|
332
332
|
end
|
333
333
|
|
@@ -348,7 +348,7 @@ class IdentityMapTest < Test::Unit::TestCase
|
|
348
348
|
end
|
349
349
|
|
350
350
|
should "return nil if not found" do
|
351
|
-
@person_class.fields(:name).find(BSON::
|
351
|
+
@person_class.fields(:name).find(BSON::ObjectId.new).should be_nil
|
352
352
|
end
|
353
353
|
end
|
354
354
|
|
@@ -452,7 +452,7 @@ class IdentityMapTest < Test::Unit::TestCase
|
|
452
452
|
|
453
453
|
should "not add to map when loading" do
|
454
454
|
@post_class.without_identity_map do
|
455
|
-
post = @post_class.load({'_id' => BSON::
|
455
|
+
post = @post_class.load({'_id' => BSON::ObjectId.new, 'title' => 'Awesome!'})
|
456
456
|
assert_not_in_map(post)
|
457
457
|
end
|
458
458
|
end
|
@@ -465,6 +465,14 @@ class IdentityMapTest < Test::Unit::TestCase
|
|
465
465
|
loaded.should_not equal(post)
|
466
466
|
end
|
467
467
|
end
|
468
|
+
|
469
|
+
should "not load attributes from map when finding" do
|
470
|
+
post = @post_class.create(:title => 'Awesome!')
|
471
|
+
post.title = 'Temporary'
|
472
|
+
@post_class.without_identity_map do
|
473
|
+
@post_class.find(post.id).title.should == 'Awesome!'
|
474
|
+
end
|
475
|
+
end
|
468
476
|
|
469
477
|
context "all" do
|
470
478
|
should "not add to map" do
|
@@ -56,8 +56,8 @@ class QueryingTesting < Test::Unit::TestCase
|
|
56
56
|
end
|
57
57
|
|
58
58
|
should "automatically set id" do
|
59
|
-
@doc.id.should be_instance_of(BSON::
|
60
|
-
@doc._id.should be_instance_of(BSON::
|
59
|
+
@doc.id.should be_instance_of(BSON::ObjectId)
|
60
|
+
@doc._id.should be_instance_of(BSON::ObjectId)
|
61
61
|
end
|
62
62
|
|
63
63
|
should "no longer be new?" do
|
@@ -207,12 +207,12 @@ class QueryingTesting < Test::Unit::TestCase
|
|
207
207
|
end
|
208
208
|
|
209
209
|
should "compact not found when using find" do
|
210
|
-
@document.find(@doc1._id, BSON::
|
210
|
+
@document.find(@doc1._id, BSON::ObjectId.new.to_s).should == [@doc1]
|
211
211
|
end
|
212
212
|
|
213
213
|
should "raise error if not all found when using find!" do
|
214
214
|
assert_raises(MongoMapper::DocumentNotFound) do
|
215
|
-
@document.find!(@doc1._id, BSON::
|
215
|
+
@document.find!(@doc1._id, BSON::ObjectId.new.to_s)
|
216
216
|
end
|
217
217
|
end
|
218
218
|
|
@@ -620,7 +620,7 @@ class QueryingTesting < Test::Unit::TestCase
|
|
620
620
|
end
|
621
621
|
|
622
622
|
should "assign an id for the document" do
|
623
|
-
@doc.id.should be_instance_of(BSON::
|
623
|
+
@doc.id.should be_instance_of(BSON::ObjectId)
|
624
624
|
end
|
625
625
|
|
626
626
|
should "save attributes" do
|
@@ -688,7 +688,7 @@ class QueryingTesting < Test::Unit::TestCase
|
|
688
688
|
end
|
689
689
|
|
690
690
|
should "assign an id for the document" do
|
691
|
-
@doc.id.should be_instance_of(BSON::
|
691
|
+
@doc.id.should be_instance_of(BSON::ObjectId)
|
692
692
|
end
|
693
693
|
|
694
694
|
should "save attributes" do
|
@@ -28,7 +28,7 @@ class StringIdCompatibilityTest < Test::Unit::TestCase
|
|
28
28
|
project._id.should be_instance_of(String)
|
29
29
|
project.id.size.should == 24
|
30
30
|
lambda {
|
31
|
-
BSON::
|
31
|
+
BSON::ObjectId.from_string(project.id)
|
32
32
|
}.should_not raise_error
|
33
33
|
end
|
34
34
|
|
data/test/test_helper.rb
CHANGED
@@ -2,8 +2,8 @@ require 'rubygems'
|
|
2
2
|
gem 'activesupport', ENV['ACTIVE_SUPPORT_VERSION']
|
3
3
|
gem 'json'
|
4
4
|
gem 'jnunemaker-matchy', '~> 0.4.0'
|
5
|
-
gem 'shoulda', '~> 2.
|
6
|
-
gem 'timecop', '~> 0.3.
|
5
|
+
gem 'shoulda', '~> 2.11'
|
6
|
+
gem 'timecop', '~> 0.3.5'
|
7
7
|
gem 'mocha', '~> 0.9.8'
|
8
8
|
|
9
9
|
$:.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
|
@@ -26,6 +26,9 @@ class JsonSerializationTest < Test::Unit::TestCase
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def setup
|
29
|
+
Kernel.const_set('TopLevelContact', Doc('TopLevelContact'))
|
30
|
+
TopLevelContact.key :name, String
|
31
|
+
|
29
32
|
Contact.include_root_in_json = false
|
30
33
|
@contact = Contact.new(
|
31
34
|
:name => 'Konata Izumi',
|
@@ -34,6 +37,18 @@ class JsonSerializationTest < Test::Unit::TestCase
|
|
34
37
|
:awesome => true,
|
35
38
|
:preferences => { :shows => 'anime' }
|
36
39
|
)
|
40
|
+
@top_level_contact = TopLevelContact.new(
|
41
|
+
:name => 'Konata Izumi'
|
42
|
+
)
|
43
|
+
end
|
44
|
+
|
45
|
+
def teardown
|
46
|
+
Kernel.send(:remove_const, 'TopLevelContact') if Object.const_defined?('TopLevelContact')
|
47
|
+
end
|
48
|
+
|
49
|
+
should "include root for class with no module" do
|
50
|
+
TopLevelContact.include_root_in_json = true
|
51
|
+
assert_match %r{^\{"top_level_contact":\s?\{}, convert_to_json(@top_level_contact)
|
37
52
|
end
|
38
53
|
|
39
54
|
should "include demodulized root" do
|
data/test/unit/test_clone.rb
CHANGED
@@ -31,7 +31,7 @@ class CloneTest < Test::Unit::TestCase
|
|
31
31
|
end
|
32
32
|
|
33
33
|
should "clone many embedded documents" do
|
34
|
-
@doc.clone.widgets.should_not equal(@doc.widgets)
|
34
|
+
@doc.clone.widgets.object_id.should_not equal(@doc.widgets.object_id)
|
35
35
|
end
|
36
36
|
|
37
37
|
should "not be destroyed" do
|
data/test/unit/test_document.rb
CHANGED
@@ -105,7 +105,7 @@ class DocumentTest < Test::Unit::TestCase
|
|
105
105
|
end
|
106
106
|
|
107
107
|
should "create id during initialization" do
|
108
|
-
@document.new._id.should be_instance_of(BSON::
|
108
|
+
@document.new._id.should be_instance_of(BSON::ObjectId)
|
109
109
|
end
|
110
110
|
|
111
111
|
should "have access to logger" do
|
@@ -165,7 +165,7 @@ class DocumentTest < Test::Unit::TestCase
|
|
165
165
|
|
166
166
|
context "equality" do
|
167
167
|
setup do
|
168
|
-
@oid = BSON::
|
168
|
+
@oid = BSON::ObjectId.new
|
169
169
|
end
|
170
170
|
|
171
171
|
should "delegate hash to _id" do
|
@@ -201,7 +201,7 @@ class DocumentTest < Test::Unit::TestCase
|
|
201
201
|
end
|
202
202
|
|
203
203
|
should "not be equal if class same but id different" do
|
204
|
-
(@document.new('_id' => @oid) == @document.new('_id' => BSON::
|
204
|
+
(@document.new('_id' => @oid) == @document.new('_id' => BSON::ObjectId.new)).should be(false)
|
205
205
|
end
|
206
206
|
|
207
207
|
should "not be equal if id same but class different" do
|
@@ -236,17 +236,17 @@ class EmbeddedDocumentTest < Test::Unit::TestCase
|
|
236
236
|
end
|
237
237
|
|
238
238
|
should "create id during initialization" do
|
239
|
-
@document.new._id.should be_instance_of(BSON::
|
239
|
+
@document.new._id.should be_instance_of(BSON::ObjectId)
|
240
240
|
end
|
241
241
|
|
242
242
|
should "have id method returns _id" do
|
243
|
-
id = BSON::
|
243
|
+
id = BSON::ObjectId.new
|
244
244
|
doc = @document.new(:_id => id)
|
245
245
|
doc.id.should == id
|
246
246
|
end
|
247
247
|
|
248
248
|
should "convert string object id to mongo object id when assigning id with _id object id type" do
|
249
|
-
id = BSON::
|
249
|
+
id = BSON::ObjectId.new
|
250
250
|
doc = @document.new(:id => id.to_s)
|
251
251
|
doc._id.should == id
|
252
252
|
doc.id.should == id
|
@@ -555,7 +555,7 @@ class EmbeddedDocumentTest < Test::Unit::TestCase
|
|
555
555
|
|
556
556
|
context "equality" do
|
557
557
|
setup do
|
558
|
-
@oid = BSON::
|
558
|
+
@oid = BSON::ObjectId.new
|
559
559
|
end
|
560
560
|
|
561
561
|
should "delegate hash to _id" do
|
@@ -586,7 +586,7 @@ class EmbeddedDocumentTest < Test::Unit::TestCase
|
|
586
586
|
end
|
587
587
|
|
588
588
|
should "not be equal if class same but id different" do
|
589
|
-
(@document.new('_id' => @oid) == @document.new('_id' => BSON::
|
589
|
+
(@document.new('_id' => @oid) == @document.new('_id' => BSON::ObjectId.new)).should be_false
|
590
590
|
end
|
591
591
|
|
592
592
|
should "not be equal if id same but class different" do
|
@@ -204,7 +204,7 @@ class SupportTest < Test::Unit::TestCase
|
|
204
204
|
end
|
205
205
|
|
206
206
|
should "return value if object id" do
|
207
|
-
id = BSON::
|
207
|
+
id = BSON::ObjectId.new
|
208
208
|
ObjectId.to_mongo(id).should be(id)
|
209
209
|
end
|
210
210
|
|
@@ -221,7 +221,7 @@ class SupportTest < Test::Unit::TestCase
|
|
221
221
|
Object.from_mongo('21').should == '21'
|
222
222
|
Object.from_mongo(9223372036854775807).should == 9223372036854775807
|
223
223
|
|
224
|
-
id = BSON::
|
224
|
+
id = BSON::ObjectId.new
|
225
225
|
ObjectId.from_mongo(id).should == id
|
226
226
|
end
|
227
227
|
end
|
@@ -353,28 +353,28 @@ class SupportTest < Test::Unit::TestCase
|
|
353
353
|
end
|
354
354
|
end
|
355
355
|
|
356
|
-
context "BSON::
|
356
|
+
context "BSON::ObjectId" do
|
357
357
|
context "#as_json" do
|
358
358
|
should "convert object id to string" do
|
359
|
-
id = BSON::
|
359
|
+
id = BSON::ObjectId.new
|
360
360
|
id.as_json.should == id.to_s
|
361
361
|
end
|
362
362
|
end
|
363
363
|
|
364
364
|
context "#to_json" do
|
365
365
|
should "convert object id to string" do
|
366
|
-
id = BSON::
|
366
|
+
id = BSON::ObjectId.new
|
367
367
|
id.to_json.should == %Q("#{id}")
|
368
368
|
end
|
369
369
|
|
370
370
|
should "support ruby driver syntax also" do
|
371
|
-
id = BSON::
|
371
|
+
id = BSON::ObjectId.new
|
372
372
|
id.original_to_json.should == %Q({"$oid": "#{id}"})
|
373
373
|
end
|
374
374
|
end
|
375
375
|
end
|
376
376
|
|
377
|
-
context "BSON::
|
377
|
+
context "BSON::ObjectId.to_json" do
|
378
378
|
|
379
379
|
end
|
380
380
|
end
|
data/test/unit/test_key.rb
CHANGED
@@ -96,7 +96,7 @@ class KeyTest < Test::Unit::TestCase
|
|
96
96
|
subject { @key }
|
97
97
|
|
98
98
|
should "cast each element correctly" do
|
99
|
-
ids = [BSON::
|
99
|
+
ids = [BSON::ObjectId.new, BSON::ObjectId.new, BSON::ObjectId.new.to_s, BSON::ObjectId.new.to_s]
|
100
100
|
subject.set(ids).should == ids.map { |id| ObjectId.to_mongo(id) }
|
101
101
|
end
|
102
102
|
end
|
@@ -106,7 +106,7 @@ class KeyTest < Test::Unit::TestCase
|
|
106
106
|
subject { @key }
|
107
107
|
|
108
108
|
should "cast each element correctly" do
|
109
|
-
ids = [BSON::
|
109
|
+
ids = [BSON::ObjectId.new, BSON::ObjectId.new, BSON::ObjectId.new.to_s, BSON::ObjectId.new.to_s]
|
110
110
|
subject.set(ids).should == ids.map { |id| ObjectId.to_mongo(id) }
|
111
111
|
end
|
112
112
|
end
|
@@ -7,6 +7,26 @@ class ValidationsTest < Test::Unit::TestCase
|
|
7
7
|
@document = Doc()
|
8
8
|
end
|
9
9
|
|
10
|
+
context "Validating uniquness of" do
|
11
|
+
should "not validate nil when allow_nil false" do
|
12
|
+
@document.key :name, String
|
13
|
+
@document.validates_uniqueness_of :name, :allow_nil => false
|
14
|
+
doc = @document.new(:name => nil)
|
15
|
+
doc.should have_error_on(:name)
|
16
|
+
doc.name = "Ryan"
|
17
|
+
doc.should_not have_error_on(:name)
|
18
|
+
end
|
19
|
+
|
20
|
+
should "not validate blank when allow_blank false" do
|
21
|
+
@document.key :name, String
|
22
|
+
@document.validates_uniqueness_of :name, :allow_blank => false
|
23
|
+
doc = @document.new(:name => "")
|
24
|
+
doc.should have_error_on(:name)
|
25
|
+
doc.name = "Ryan"
|
26
|
+
doc.should_not have_error_on(:name)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
10
30
|
context "Validating acceptance of" do
|
11
31
|
should "work with validates_acceptance_of macro" do
|
12
32
|
@document.key :terms, String
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongo_mapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 55
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 8
|
9
|
-
-
|
10
|
-
version: 0.8.
|
9
|
+
- 4
|
10
|
+
version: 0.8.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- John Nunemaker
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-08-
|
18
|
+
date: 2010-08-29 00:00:00 -04:00
|
19
19
|
default_executable: mmconsole
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -58,12 +58,12 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
hash:
|
61
|
+
hash: 25
|
62
62
|
segments:
|
63
63
|
- 0
|
64
64
|
- 3
|
65
|
-
-
|
66
|
-
version: 0.3.
|
65
|
+
- 5
|
66
|
+
version: 0.3.5
|
67
67
|
type: :runtime
|
68
68
|
version_requirements: *id003
|
69
69
|
- !ruby/object:Gem::Dependency
|
@@ -118,12 +118,11 @@ dependencies:
|
|
118
118
|
requirements:
|
119
119
|
- - ~>
|
120
120
|
- !ruby/object:Gem::Version
|
121
|
-
hash:
|
121
|
+
hash: 21
|
122
122
|
segments:
|
123
123
|
- 2
|
124
|
-
-
|
125
|
-
|
126
|
-
version: 2.10.2
|
124
|
+
- 11
|
125
|
+
version: "2.11"
|
127
126
|
type: :development
|
128
127
|
version_requirements: *id007
|
129
128
|
- !ruby/object:Gem::Dependency
|
@@ -169,11 +168,19 @@ extra_rdoc_files: []
|
|
169
168
|
|
170
169
|
files:
|
171
170
|
- bin/mmconsole
|
171
|
+
- examples/attr_accessible.rb
|
172
|
+
- examples/attr_protected.rb
|
173
|
+
- examples/cache_key.rb
|
174
|
+
- examples/custom_types.rb
|
175
|
+
- examples/identity_map/automatic.rb
|
176
|
+
- examples/identity_map/middleware.rb
|
177
|
+
- examples/identity_map.rb
|
172
178
|
- examples/keys.rb
|
173
179
|
- examples/modifiers/set.rb
|
174
180
|
- examples/plugins.rb
|
175
181
|
- examples/querying.rb
|
176
182
|
- examples/scopes.rb
|
183
|
+
- examples/validating/embedded_docs.rb
|
177
184
|
- lib/mongo_mapper/connection.rb
|
178
185
|
- lib/mongo_mapper/document.rb
|
179
186
|
- lib/mongo_mapper/embedded_document.rb
|
@@ -243,6 +250,7 @@ files:
|
|
243
250
|
- lib/mongo_mapper/support/descendant_appends.rb
|
244
251
|
- lib/mongo_mapper/version.rb
|
245
252
|
- lib/mongo_mapper.rb
|
253
|
+
- rails/init.rb
|
246
254
|
- test/_NOTE_ON_TESTING
|
247
255
|
- test/functional/associations/test_belongs_to_polymorphic_proxy.rb
|
248
256
|
- test/functional/associations/test_belongs_to_proxy.rb
|
@@ -300,6 +308,7 @@ files:
|
|
300
308
|
- test/unit/test_time_zones.rb
|
301
309
|
- test/unit/test_validations.rb
|
302
310
|
- LICENSE
|
311
|
+
- UPGRADES
|
303
312
|
- README.rdoc
|
304
313
|
has_rdoc: true
|
305
314
|
homepage: http://github.com/jnunemaker/mongomapper
|