mongoid 2.0.0.beta.15 → 2.0.0.beta.16
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/config/locales/en.yml +40 -0
- data/lib/config/locales/es.yml +41 -0
- data/lib/config/locales/fr.yml +42 -0
- data/lib/config/locales/it.yml +39 -0
- data/lib/config/locales/pl.yml +39 -0
- data/lib/config/locales/pt.yml +40 -0
- data/lib/config/locales/sv.yml +40 -0
- data/lib/mongoid.rb +7 -2
- data/lib/mongoid/associations.rb +16 -9
- data/lib/mongoid/associations/embedded_in.rb +11 -0
- data/lib/mongoid/associations/embeds_many.rb +28 -2
- data/lib/mongoid/associations/embeds_one.rb +18 -2
- data/lib/mongoid/associations/proxy.rb +28 -1
- data/lib/mongoid/associations/referenced_in.rb +10 -0
- data/lib/mongoid/associations/references_many.rb +10 -7
- data/lib/mongoid/associations/references_many_as_array.rb +29 -0
- data/lib/mongoid/associations/references_one.rb +9 -1
- data/lib/mongoid/attributes.rb +13 -3
- data/lib/mongoid/callbacks.rb +1 -0
- data/lib/mongoid/collections.rb +1 -1
- data/lib/mongoid/components.rb +1 -0
- data/lib/mongoid/config.rb +16 -1
- data/lib/mongoid/contexts/enumerable.rb +28 -1
- data/lib/mongoid/contexts/enumerable/sort.rb +43 -0
- data/lib/mongoid/contexts/mongo.rb +13 -1
- data/lib/mongoid/criteria.rb +4 -2
- data/lib/mongoid/criterion/inclusion.rb +22 -1
- data/lib/mongoid/criterion/optional.rb +14 -39
- data/lib/mongoid/criterion/selector.rb +65 -0
- data/lib/mongoid/document.rb +5 -11
- data/lib/mongoid/errors.rb +10 -130
- data/lib/mongoid/errors/document_not_found.rb +29 -0
- data/lib/mongoid/errors/invalid_collection.rb +19 -0
- data/lib/mongoid/errors/invalid_database.rb +20 -0
- data/lib/mongoid/errors/invalid_field.rb +19 -0
- data/lib/mongoid/errors/invalid_options.rb +16 -0
- data/lib/mongoid/errors/invalid_type.rb +26 -0
- data/lib/mongoid/errors/mongoid_error.rb +27 -0
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +21 -0
- data/lib/mongoid/errors/unsupported_version.rb +21 -0
- data/lib/mongoid/errors/validations.rb +22 -0
- data/lib/mongoid/extensions/hash/assimilation.rb +1 -1
- data/lib/mongoid/extensions/hash/criteria_helpers.rb +5 -3
- data/lib/mongoid/extensions/object/conversions.rb +5 -1
- data/lib/mongoid/extensions/objectid/conversions.rb +43 -1
- data/lib/mongoid/field.rb +13 -6
- data/lib/mongoid/finders.rb +1 -1
- data/lib/mongoid/hierarchy.rb +9 -4
- data/lib/mongoid/identity.rb +2 -2
- data/lib/mongoid/indexes.rb +1 -1
- data/lib/mongoid/matchers/default.rb +1 -1
- data/lib/mongoid/modifiers.rb +24 -0
- data/lib/mongoid/modifiers/command.rb +18 -0
- data/lib/mongoid/modifiers/inc.rb +24 -0
- data/lib/mongoid/persistence/command.rb +2 -10
- data/lib/mongoid/persistence/remove_all.rb +1 -1
- data/lib/mongoid/railtie.rb +2 -0
- data/lib/mongoid/railties/database.rake +102 -11
- data/lib/mongoid/railties/document.rb +12 -0
- data/lib/mongoid/safe.rb +13 -0
- data/lib/mongoid/safety.rb +12 -0
- data/lib/mongoid/validations.rb +0 -4
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/versioning.rb +11 -1
- metadata +55 -28
- data/lib/mongoid/validations/locale/en.yml +0 -5
@@ -38,40 +38,6 @@ module Mongoid #:nodoc:
|
|
38
38
|
@options[:cache] == true
|
39
39
|
end
|
40
40
|
|
41
|
-
# If the document is using BSON::ObjectIDs the convert the argument to
|
42
|
-
# either an object id or an array of them if the supplied argument is an
|
43
|
-
# Array. Otherwise just return.
|
44
|
-
#
|
45
|
-
# Options:
|
46
|
-
# args: A +String+ or an +Array+ convert to +BSON::ObjectID+
|
47
|
-
# cast: A +Boolean+ define if we can or not cast to BSON::ObjectID.
|
48
|
-
# If false, we use the default type of args
|
49
|
-
#
|
50
|
-
# Example:
|
51
|
-
#
|
52
|
-
# <tt>Mongoid.cast_ids!("4ab2bc4b8ad548971900005c", true)</tt>
|
53
|
-
# <tt>Mongoid.cast_ids!(["4ab2bc4b8ad548971900005c"])</tt>
|
54
|
-
#
|
55
|
-
# Returns:
|
56
|
-
#
|
57
|
-
# If using object ids:
|
58
|
-
# An +Array+ of +BSON::ObjectID+ of each element if params is an +Array+
|
59
|
-
# A +BSON::ObjectID+ from params if params is +String+
|
60
|
-
# Otherwise:
|
61
|
-
# <tt>args</tt>
|
62
|
-
def cast_ids!(args, cast = true)
|
63
|
-
return args if !using_object_ids? || args.is_a?(BSON::ObjectID) || !cast
|
64
|
-
if args.is_a?(String)
|
65
|
-
BSON::ObjectID(args)
|
66
|
-
elsif args.is_a?(Array)
|
67
|
-
args.map{ |a|
|
68
|
-
a.is_a?(BSON::ObjectID) ? a : BSON::ObjectID(a)
|
69
|
-
}
|
70
|
-
else
|
71
|
-
args
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
41
|
# Adds fields to be sorted in descending order. Will add them in the order
|
76
42
|
# they were passed into the method.
|
77
43
|
#
|
@@ -136,9 +102,12 @@ module Mongoid #:nodoc:
|
|
136
102
|
def id(*ids)
|
137
103
|
ids.flatten!
|
138
104
|
if ids.size > 1
|
139
|
-
self.in(
|
105
|
+
self.in(
|
106
|
+
:_id => ::BSON::ObjectID.cast!(@klass, ids, @klass.primary_key.nil?)
|
107
|
+
)
|
140
108
|
else
|
141
|
-
@selector[:_id] =
|
109
|
+
@selector[:_id] =
|
110
|
+
::BSON::ObjectID.cast!(@klass, ids.first, @klass.primary_key.nil?)
|
142
111
|
end
|
143
112
|
self
|
144
113
|
end
|
@@ -183,10 +152,16 @@ module Mongoid #:nodoc:
|
|
183
152
|
@options[:sort] = [] unless @options[:sort] || args.first.nil?
|
184
153
|
arguments = args.first
|
185
154
|
case arguments
|
186
|
-
when Hash
|
187
|
-
|
155
|
+
when Hash
|
156
|
+
arguments.each do |field, direction|
|
157
|
+
@options[:sort] << [ field, direction ]
|
158
|
+
end
|
159
|
+
when Array
|
160
|
+
@options[:sort].concat(arguments)
|
188
161
|
when Complex
|
189
|
-
args.flatten.each
|
162
|
+
args.flatten.each do |complex|
|
163
|
+
@options[:sort] << [ complex.key, complex.operator.to_sym ]
|
164
|
+
end
|
190
165
|
end; self
|
191
166
|
end
|
192
167
|
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Criterion #:nodoc:
|
4
|
+
|
5
|
+
class Selector < Hash
|
6
|
+
attr_reader :klass
|
7
|
+
|
8
|
+
def initialize(klass)
|
9
|
+
@klass = klass
|
10
|
+
end
|
11
|
+
|
12
|
+
def []=(key, value)
|
13
|
+
super(key, try_to_typecast(key, value))
|
14
|
+
end
|
15
|
+
|
16
|
+
def merge!(other)
|
17
|
+
other.each_pair do |key, value|
|
18
|
+
self[key] = value
|
19
|
+
end
|
20
|
+
self
|
21
|
+
end
|
22
|
+
alias update merge!
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def try_to_typecast(key, value)
|
27
|
+
access = key.to_s
|
28
|
+
return value unless klass.fields.has_key?(access)
|
29
|
+
|
30
|
+
field = klass.fields[access]
|
31
|
+
typecast_value_for(field, value)
|
32
|
+
end
|
33
|
+
|
34
|
+
def typecast_value_for(field, value)
|
35
|
+
return field.set(value) if field.type === value
|
36
|
+
case value
|
37
|
+
when Hash
|
38
|
+
value = value.dup
|
39
|
+
value.each_pair do |k, v|
|
40
|
+
value[k] = typecast_hash_value(field, k, v)
|
41
|
+
end
|
42
|
+
when Array
|
43
|
+
value.map { |v| typecast_value_for(field, v) }
|
44
|
+
when Regexp
|
45
|
+
value
|
46
|
+
else
|
47
|
+
field.set(value)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def typecast_hash_value(field, key, value)
|
52
|
+
case key
|
53
|
+
when "$exists"
|
54
|
+
Boolean.set(value)
|
55
|
+
when "$size"
|
56
|
+
Integer.set(value)
|
57
|
+
else
|
58
|
+
typecast_value_for(field, value)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
data/lib/mongoid/document.rb
CHANGED
@@ -11,15 +11,6 @@ module Mongoid #:nodoc:
|
|
11
11
|
|
12
12
|
module ClassMethods #:nodoc:
|
13
13
|
|
14
|
-
# Perform default behavior but mark the hierarchy as being hereditary.
|
15
|
-
#
|
16
|
-
# This method must remain in the +Document+ module, even though its
|
17
|
-
# behavior affects items in the Hierarchy module.
|
18
|
-
def inherited(subclass)
|
19
|
-
self.hereditary = true
|
20
|
-
super
|
21
|
-
end
|
22
|
-
|
23
14
|
# Instantiate a new object, only when loaded from the database or when
|
24
15
|
# the attributes have already been typecast.
|
25
16
|
#
|
@@ -32,9 +23,9 @@ module Mongoid #:nodoc:
|
|
32
23
|
document = allocate
|
33
24
|
document.instance_variable_set(:@attributes, attributes)
|
34
25
|
document.setup_modifications
|
35
|
-
|
26
|
+
document
|
36
27
|
else
|
37
|
-
|
28
|
+
new(attrs)
|
38
29
|
end
|
39
30
|
end
|
40
31
|
|
@@ -114,6 +105,9 @@ module Mongoid #:nodoc:
|
|
114
105
|
@new_record = true
|
115
106
|
document = yield self if block_given?
|
116
107
|
identify
|
108
|
+
run_callbacks(:initialize) do
|
109
|
+
document
|
110
|
+
end
|
117
111
|
end
|
118
112
|
|
119
113
|
# Returns the class name plus its attributes.
|
data/lib/mongoid/errors.rb
CHANGED
@@ -1,131 +1,11 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
# Example:
|
13
|
-
#
|
14
|
-
# <tt>DocumentNotFound.new(Person, ["1", "2"])</tt>
|
15
|
-
class DocumentNotFound < MongoidError
|
16
|
-
attr_reader :klass, :indentifiers
|
17
|
-
def initialize(klass, ids)
|
18
|
-
@klass = klass
|
19
|
-
@identifiers = ids.is_a?(Array) ? ids.join(", ") : ids
|
20
|
-
super("Document not found for class #{@klass} with id(s) #{@identifiers}")
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
# Raised when invalid options are passed into a constructor or method.
|
25
|
-
#
|
26
|
-
# Example:
|
27
|
-
#
|
28
|
-
# <tt>InvalidOptions.new</tt>
|
29
|
-
class InvalidOptions < MongoidError; end
|
30
|
-
|
31
|
-
# Raised when the database connection has not been set up properly, either
|
32
|
-
# by attempting to set an object on the db that is not a +Mongo::DB+, or
|
33
|
-
# not setting anything at all.
|
34
|
-
#
|
35
|
-
# Example:
|
36
|
-
#
|
37
|
-
# <tt>InvalidDatabase.new("Not a DB")</tt>
|
38
|
-
class InvalidDatabase < MongoidError
|
39
|
-
attr_reader :database
|
40
|
-
def initialize(database)
|
41
|
-
@database = database
|
42
|
-
super("Database should be a Mongo::DB, not #{@database.class.name}")
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
# Raised when trying to get or set a value for a defined field, where the
|
47
|
-
# type of the object does not match the defined field type.
|
48
|
-
#
|
49
|
-
# Example:
|
50
|
-
#
|
51
|
-
# <tt>InvalidType.new(Array, "Not an Array")</tt>
|
52
|
-
class InvalidType < MongoidError
|
53
|
-
def initialize(klass, value)
|
54
|
-
super("Field was defined as a(n) #{klass.name}, but received a #{value.class.name} " +
|
55
|
-
"with the value #{value.inspect}.")
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
# Raised when the database version is not supported by Mongoid.
|
60
|
-
#
|
61
|
-
# Example:
|
62
|
-
#
|
63
|
-
# <tt>UnsupportedVersion.new(Mongo::ServerVersion.new("1.3.1"))</tt>
|
64
|
-
class UnsupportedVersion < MongoidError
|
65
|
-
def initialize(version)
|
66
|
-
super("MongoDB #{version} not supported, please upgrade to #{Mongoid::MONGODB_VERSION}")
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
# Raised when a persisence method ending in ! fails validation. The message
|
71
|
-
# will contain the full error messages from the +Document+ in question.
|
72
|
-
#
|
73
|
-
# Example:
|
74
|
-
#
|
75
|
-
# <tt>Validations.new(person.errors)</tt>
|
76
|
-
class Validations < MongoidError
|
77
|
-
attr_reader :document
|
78
|
-
def initialize(document)
|
79
|
-
@document = document
|
80
|
-
super("Validation Failed: #{@document.errors.full_messages.join(", ")}")
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
# This error is raised when trying to access a Mongo::Collection from an
|
85
|
-
# embedded document.
|
86
|
-
#
|
87
|
-
# Example:
|
88
|
-
#
|
89
|
-
# <tt>InvalidCollection.new(Address)</tt>
|
90
|
-
class InvalidCollection < MongoidError
|
91
|
-
attr_reader :klass
|
92
|
-
def initialize(klass)
|
93
|
-
@klass = klass
|
94
|
-
super("Access to the collection for #{@klass.name} is not allowed " +
|
95
|
-
"since it is an embedded document, please access a collection from " +
|
96
|
-
"the root document")
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
# This error is raised when trying to create a field that conflicts with
|
101
|
-
# a Mongoid internal attribute or method.
|
102
|
-
#
|
103
|
-
# Example:
|
104
|
-
#
|
105
|
-
# <tt>InvalidField.new('collection')</tt>
|
106
|
-
class InvalidField < MongoidError
|
107
|
-
attr_reader :name
|
108
|
-
def initialize(name)
|
109
|
-
@name = name
|
110
|
-
super("Defining a field named '#{@name}' is not allowed. " +
|
111
|
-
"Do not define fields that conflict with Mongoid internal attributes " +
|
112
|
-
"or method names. Use Document#instance_methods to see what " +
|
113
|
-
"names this includes.")
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
# This error is raised when trying to create set nested records above the
|
118
|
-
# specified :limit
|
119
|
-
#
|
120
|
-
# Example:
|
121
|
-
#
|
122
|
-
#<tt>TooManyNestedAttributeRecords.new('association', limit)
|
123
|
-
class TooManyNestedAttributeRecords < MongoidError
|
124
|
-
attr_reader :association, :limit
|
125
|
-
def initialize(association, limit)
|
126
|
-
@association, @limit = association.to_s.humanize.capitalize, limit
|
127
|
-
super("Accept Nested Attributes for #{@association} is limited to #{@limit} records")
|
128
|
-
end
|
129
|
-
end
|
130
|
-
end
|
131
|
-
end
|
2
|
+
require "mongoid/errors/mongoid_error"
|
3
|
+
require "mongoid/errors/document_not_found"
|
4
|
+
require "mongoid/errors/invalid_collection"
|
5
|
+
require "mongoid/errors/invalid_database"
|
6
|
+
require "mongoid/errors/invalid_field"
|
7
|
+
require "mongoid/errors/invalid_options"
|
8
|
+
require "mongoid/errors/invalid_type"
|
9
|
+
require "mongoid/errors/too_many_nested_attribute_records"
|
10
|
+
require "mongoid/errors/unsupported_version"
|
11
|
+
require "mongoid/errors/validations"
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc
|
3
|
+
module Errors #:nodoc
|
4
|
+
|
5
|
+
# Raised when querying the database for a document by a specific id which
|
6
|
+
# does not exist. If multiple ids were passed then it will display all of
|
7
|
+
# those.
|
8
|
+
#
|
9
|
+
# Example:
|
10
|
+
#
|
11
|
+
# <tt>DocumentNotFound.new(Person, ["1", "2"])</tt>
|
12
|
+
class DocumentNotFound < MongoidError
|
13
|
+
|
14
|
+
attr_reader :klass, :indentifiers
|
15
|
+
|
16
|
+
def initialize(klass, ids)
|
17
|
+
@klass = klass
|
18
|
+
@identifiers = ids.is_a?(Array) ? ids.join(", ") : ids
|
19
|
+
|
20
|
+
super(
|
21
|
+
translate(
|
22
|
+
"document_not_found",
|
23
|
+
{ :klass => klass.name, :identifiers => @identifiers }
|
24
|
+
)
|
25
|
+
)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc
|
3
|
+
module Errors #:nodoc
|
4
|
+
|
5
|
+
# This error is raised when trying to access a Mongo::Collection from an
|
6
|
+
# embedded document.
|
7
|
+
#
|
8
|
+
# Example:
|
9
|
+
#
|
10
|
+
# <tt>InvalidCollection.new(Address)</tt>
|
11
|
+
class InvalidCollection < MongoidError
|
12
|
+
def initialize(klass)
|
13
|
+
super(
|
14
|
+
translate("invalid_collection", { :klass => klass.name })
|
15
|
+
)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc
|
3
|
+
module Errors #:nodoc
|
4
|
+
|
5
|
+
# Raised when the database connection has not been set up properly, either
|
6
|
+
# by attempting to set an object on the db that is not a +Mongo::DB+, or
|
7
|
+
# not setting anything at all.
|
8
|
+
#
|
9
|
+
# Example:
|
10
|
+
#
|
11
|
+
# <tt>InvalidDatabase.new("Not a DB")</tt>
|
12
|
+
class InvalidDatabase < MongoidError
|
13
|
+
def initialize(database)
|
14
|
+
super(
|
15
|
+
translate("invalid_database", { :name => database.class.name })
|
16
|
+
)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc
|
3
|
+
module Errors #:nodoc
|
4
|
+
|
5
|
+
# This error is raised when trying to create a field that conflicts with
|
6
|
+
# a Mongoid internal attribute or method.
|
7
|
+
#
|
8
|
+
# Example:
|
9
|
+
#
|
10
|
+
# <tt>InvalidField.new('collection')</tt>
|
11
|
+
class InvalidField < MongoidError
|
12
|
+
def initialize(name)
|
13
|
+
super(
|
14
|
+
translate("invalid_field", { :name => name })
|
15
|
+
)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc
|
3
|
+
module Errors #:nodoc
|
4
|
+
|
5
|
+
# Raised when invalid options are passed into a constructor or method.
|
6
|
+
#
|
7
|
+
# Example:
|
8
|
+
#
|
9
|
+
# <tt>InvalidOptions.new</tt>
|
10
|
+
class InvalidOptions < MongoidError
|
11
|
+
def initialize(key, options)
|
12
|
+
super(translate(key, options))
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc
|
3
|
+
module Errors #:nodoc
|
4
|
+
|
5
|
+
# Raised when trying to get or set a value for a defined field, where the
|
6
|
+
# type of the object does not match the defined field type.
|
7
|
+
#
|
8
|
+
# Example:
|
9
|
+
#
|
10
|
+
# <tt>InvalidType.new(Array, "Not an Array")</tt>
|
11
|
+
class InvalidType < MongoidError
|
12
|
+
def initialize(klass, value)
|
13
|
+
super(
|
14
|
+
translate(
|
15
|
+
"invalid_type",
|
16
|
+
{
|
17
|
+
:klass => klass.name,
|
18
|
+
:other => value.class.name,
|
19
|
+
:value => value.inspect
|
20
|
+
}
|
21
|
+
)
|
22
|
+
)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|