mongoid 3.0.13 → 3.0.14
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/CHANGELOG.md +17 -0
- data/lib/config/locales/en.yml +11 -22
- data/lib/mongoid/atomic/paths/root.rb +13 -0
- data/lib/mongoid/contextual/map_reduce.rb +20 -0
- data/lib/mongoid/criterion/inspection.rb +6 -9
- data/lib/mongoid/document.rb +5 -1
- data/lib/mongoid/errors.rb +1 -0
- data/lib/mongoid/errors/invalid_path.rb +21 -0
- data/lib/mongoid/extensions/time.rb +3 -1
- data/lib/mongoid/relations/accessors.rb +15 -0
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +8 -2
- data/lib/mongoid/relations/metadata.rb +15 -19
- data/lib/mongoid/relations/proxy.rb +11 -0
- data/lib/mongoid/relations/referenced/many_to_many.rb +6 -1
- data/lib/mongoid/relations/targets/enumerable.rb +15 -2
- data/lib/mongoid/validations/uniqueness.rb +2 -2
- data/lib/mongoid/version.rb +1 -1
- metadata +4 -3
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,23 @@
|
|
3
3
|
For instructions on upgrading to newer versions, visit
|
4
4
|
[mongoid.org](http://mongoid.org/docs/upgrading.html).
|
5
5
|
|
6
|
+
## 3.0.14
|
7
|
+
|
8
|
+
### Resolved Issues
|
9
|
+
|
10
|
+
* \#2575 Prevent end of month times from rounding up since floats are not
|
11
|
+
precise enough to handle usec. (Steve Valaitis)
|
12
|
+
|
13
|
+
* \#2573 Don't use i18n for inspection messages.
|
14
|
+
|
15
|
+
* \#2571 Remove blank error message from locales. (Jordan Elver)
|
16
|
+
|
17
|
+
* \#2568 Fix uniqueness validation for lacalized fields when a scope is also
|
18
|
+
provided.
|
19
|
+
|
20
|
+
* \#2552 Ensure `InvalidPath` errors are raised when embedded documents try to
|
21
|
+
get paths from a root selector.
|
22
|
+
|
6
23
|
## 3.0.13
|
7
24
|
|
8
25
|
### Resolved Issues
|
data/lib/config/locales/en.yml
CHANGED
@@ -1,29 +1,7 @@
|
|
1
1
|
en:
|
2
2
|
mongoid:
|
3
|
-
inspection:
|
4
|
-
criteria: "#<Mongoid::Criteria\n
|
5
|
-
\_\_selector: %{selector},\n
|
6
|
-
\_\_options: %{options},\n
|
7
|
-
\_\_class: %{klass},\n
|
8
|
-
\_\_embedded: %{embedded}>\n"
|
9
|
-
metadata: "#<Mongoid::Relations::Metadata\n
|
10
|
-
\_\_autobuild: %{autobuild},\n
|
11
|
-
\_\_class_name: %{class_name},\n
|
12
|
-
\_\_cyclic: %{cyclic},\n
|
13
|
-
\_\_dependent: %{dependent},\n
|
14
|
-
\_\_inverse_of: %{inverse_of},\n
|
15
|
-
\_\_key: %{key},\n
|
16
|
-
\_\_macro: %{macro},\n
|
17
|
-
\_\_name: %{name},\n
|
18
|
-
\_\_order: %{order},\n
|
19
|
-
\_\_polymorphic: %{polymorphic},\n
|
20
|
-
\_\_relation: %{relation},\n
|
21
|
-
\_\_setter: %{setter},\n
|
22
|
-
\_\_versioned: %{versioned}>\n"
|
23
3
|
errors:
|
24
4
|
messages:
|
25
|
-
blank:
|
26
|
-
"can't be blank"
|
27
5
|
blank_in_locale:
|
28
6
|
"can't be blank in %{location}"
|
29
7
|
ambiguous_relationship:
|
@@ -171,6 +149,17 @@ en:
|
|
171
149
|
slip by."
|
172
150
|
resolution: "Valid options are: %{valid}, make sure these are the ones
|
173
151
|
you are using."
|
152
|
+
invalid_path:
|
153
|
+
message: "Having a root path assigned for %{klass} is invalid."
|
154
|
+
summary: "Mongoid has two different path objects for determining
|
155
|
+
the location of a document in the database, Root and Embedded.
|
156
|
+
This error is raised when an embedded document somehow gets a
|
157
|
+
root path assigned."
|
158
|
+
resolution: "Most likely your embedded model, %{klass} is also
|
159
|
+
referenced via a has_many from a root document in another
|
160
|
+
collection. Double check the relation definitions and fix any
|
161
|
+
instances where embedded documents are improperly referenced
|
162
|
+
from other collections."
|
174
163
|
invalid_scope:
|
175
164
|
message: "Defining a scope of value %{value} on %{klass} is not
|
176
165
|
allowed."
|
@@ -21,6 +21,19 @@ module Mongoid
|
|
21
21
|
@document, @path, @position = document, "", ""
|
22
22
|
end
|
23
23
|
|
24
|
+
# Asking for the insert modifier on a document with a root path
|
25
|
+
# indicates a mixed relation most likely happened.
|
26
|
+
#
|
27
|
+
# @example Attempt to get the insert modifier.
|
28
|
+
# root.insert_modifier
|
29
|
+
#
|
30
|
+
# @raise [ Errors::InvalidPath ] The error for the attempt.
|
31
|
+
#
|
32
|
+
# @since 3.0.14
|
33
|
+
def insert_modifier
|
34
|
+
raise Errors::InvalidPath.new(document.class)
|
35
|
+
end
|
36
|
+
|
24
37
|
# Get the selector to use for the root document when performing atomic
|
25
38
|
# updates. When sharding this will include the shard key.
|
26
39
|
#
|
@@ -201,6 +201,26 @@ module Mongoid
|
|
201
201
|
results["timeMillis"]
|
202
202
|
end
|
203
203
|
|
204
|
+
# Get a pretty string representation of the map/reduce, including the
|
205
|
+
# criteria, map, reduce, finalize, and out option.
|
206
|
+
#
|
207
|
+
# @example Inspect the map_reduce.
|
208
|
+
# map_reduce.inspect
|
209
|
+
#
|
210
|
+
# @return [ String ] The inspection string.
|
211
|
+
#
|
212
|
+
# @since 3.1.0
|
213
|
+
def inspect
|
214
|
+
%Q{#<Mongoid::Contextual::MapReduce
|
215
|
+
selector: #{criteria.selector.inspect}
|
216
|
+
class: #{criteria.klass}
|
217
|
+
map: #{command[:map]}
|
218
|
+
reduce: #{command[:reduce]}
|
219
|
+
finalize: #{command[:finalize]}
|
220
|
+
out: #{command[:out].inspect}>
|
221
|
+
}
|
222
|
+
end
|
223
|
+
|
204
224
|
private
|
205
225
|
|
206
226
|
# Apply criteria specific options - query, sort, limit.
|
@@ -13,15 +13,12 @@ module Mongoid
|
|
13
13
|
#
|
14
14
|
# @since 1.0.0
|
15
15
|
def inspect
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
embedded: embedded?
|
23
|
-
}
|
24
|
-
)
|
16
|
+
%Q{#<Mongoid::Criteria
|
17
|
+
selector: #{selector.inspect}
|
18
|
+
options: #{options.inspect}
|
19
|
+
class: #{klass}
|
20
|
+
embedded: #{embedded?}>
|
21
|
+
}
|
25
22
|
end
|
26
23
|
end
|
27
24
|
end
|
data/lib/mongoid/document.rb
CHANGED
@@ -193,7 +193,11 @@ module Mongoid
|
|
193
193
|
without_autobuild do
|
194
194
|
relation, stored = send(name), meta.store_as
|
195
195
|
if attributes.has_key?(stored) || !relation.blank?
|
196
|
-
|
196
|
+
if relation
|
197
|
+
attributes[stored] = relation.as_document
|
198
|
+
else
|
199
|
+
attributes.delete(stored)
|
200
|
+
end
|
197
201
|
end
|
198
202
|
end
|
199
203
|
end
|
data/lib/mongoid/errors.rb
CHANGED
@@ -13,6 +13,7 @@ require "mongoid/errors/invalid_find"
|
|
13
13
|
require "mongoid/errors/invalid_includes"
|
14
14
|
require "mongoid/errors/invalid_index"
|
15
15
|
require "mongoid/errors/invalid_options"
|
16
|
+
require "mongoid/errors/invalid_path"
|
16
17
|
require "mongoid/errors/invalid_scope"
|
17
18
|
require "mongoid/errors/invalid_set_polymorphic_relation"
|
18
19
|
require "mongoid/errors/invalid_storage_options"
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Errors
|
4
|
+
|
5
|
+
# Used when attempting to get embedded paths with incorrect root path set.
|
6
|
+
class InvalidPath < MongoidError
|
7
|
+
|
8
|
+
# Create the new error.
|
9
|
+
#
|
10
|
+
# @example Create the error.
|
11
|
+
# InvalidPath.new(Address)
|
12
|
+
#
|
13
|
+
# @param [ Class ] klass The document class.
|
14
|
+
#
|
15
|
+
# @since 3.0.14
|
16
|
+
def initialize(klass)
|
17
|
+
super(compose_message("invalid_path", { klass: klass }))
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -64,7 +64,9 @@ module Mongoid
|
|
64
64
|
def mongoize(object)
|
65
65
|
return nil if object.blank?
|
66
66
|
begin
|
67
|
-
|
67
|
+
t = object.__mongoize_time__
|
68
|
+
usec = t.strftime("%9N").to_i / 10**3.0
|
69
|
+
::Time.at(t.to_i, usec).utc
|
68
70
|
rescue ArgumentError
|
69
71
|
raise Errors::InvalidTime.new(object)
|
70
72
|
end
|
@@ -58,6 +58,21 @@ module Mongoid
|
|
58
58
|
ivar(name)
|
59
59
|
end
|
60
60
|
|
61
|
+
# Resets the criteria inside the relation proxy. Used by many to many
|
62
|
+
# relations to keep the underlying ids array in sync.
|
63
|
+
#
|
64
|
+
# @example Reset the relation criteria.
|
65
|
+
# person.reset_relation_criteria(:preferences)
|
66
|
+
#
|
67
|
+
# @param [ Symbol ] name The name of the relation.
|
68
|
+
#
|
69
|
+
# @since 3.0.14
|
70
|
+
def reset_relation_criteria(name)
|
71
|
+
if instance_variable_defined?("@#{name}")
|
72
|
+
send(name).reset_relation_criteria
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
61
76
|
# Set the supplied relation to an instance variable on the class with the
|
62
77
|
# provided name. Used as a helper just for code cleanliness.
|
63
78
|
#
|
@@ -19,7 +19,10 @@ module Mongoid
|
|
19
19
|
def bind_one(doc)
|
20
20
|
binding do
|
21
21
|
inverse_keys = doc.you_must(metadata.inverse_foreign_key)
|
22
|
-
|
22
|
+
if inverse_keys
|
23
|
+
inverse_keys.push(base.id)
|
24
|
+
doc.reset_relation_criteria(metadata.inverse)
|
25
|
+
end
|
23
26
|
base.synced[metadata.foreign_key] = true
|
24
27
|
doc.synced[metadata.inverse_foreign_key] = true
|
25
28
|
end
|
@@ -35,7 +38,10 @@ module Mongoid
|
|
35
38
|
binding do
|
36
39
|
base.send(metadata.foreign_key).delete_one(doc.id)
|
37
40
|
inverse_keys = doc.you_must(metadata.inverse_foreign_key)
|
38
|
-
|
41
|
+
if inverse_keys
|
42
|
+
inverse_keys.delete_one(base.id)
|
43
|
+
doc.reset_relation_criteria(metadata.inverse)
|
44
|
+
end
|
39
45
|
base.synced[metadata.foreign_key] = true
|
40
46
|
doc.synced[metadata.inverse_foreign_key] = true
|
41
47
|
end
|
@@ -357,25 +357,21 @@ module Mongoid
|
|
357
357
|
#
|
358
358
|
# @since 2.0.0.rc.1
|
359
359
|
def inspect
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
setter: setter,
|
376
|
-
versioned: versioned?
|
377
|
-
}
|
378
|
-
)
|
360
|
+
%Q{#<Mongoid::Relations::Metadata
|
361
|
+
autobuild: #{autobuilding?}
|
362
|
+
class_name: #{class_name}
|
363
|
+
cyclic: #{cyclic.inspect}
|
364
|
+
dependent: #{dependent.inspect}
|
365
|
+
inverse_of: #{inverse_of.inspect}
|
366
|
+
key: #{key}
|
367
|
+
macro: #{macro}
|
368
|
+
name: #{name}
|
369
|
+
order: #{order.inspect}
|
370
|
+
polymorphic: #{polymorphic?}
|
371
|
+
relation: #{relation}
|
372
|
+
setter: #{setter}
|
373
|
+
versioned: #{versioned?}>
|
374
|
+
}
|
379
375
|
end
|
380
376
|
|
381
377
|
# Get the name of the inverse relations if they exists. If this is a
|
@@ -39,6 +39,17 @@ module Mongoid
|
|
39
39
|
extend_proxy(metadata.extension) if metadata.extension?
|
40
40
|
end
|
41
41
|
|
42
|
+
# Resets the criteria inside the relation proxy. Used by many to many
|
43
|
+
# relations to keep the underlying ids array in sync.
|
44
|
+
#
|
45
|
+
# @example Reset the relation criteria.
|
46
|
+
# person.preferences.reset_relation_criteria
|
47
|
+
#
|
48
|
+
# @since 3.0.14
|
49
|
+
def reset_relation_criteria
|
50
|
+
target.reset_unloaded(criteria)
|
51
|
+
end
|
52
|
+
|
42
53
|
# The default substitutable object for a relation proxy is the clone of
|
43
54
|
# the target.
|
44
55
|
#
|
@@ -121,6 +121,7 @@ module Mongoid
|
|
121
121
|
doc = super
|
122
122
|
if doc && persistable?
|
123
123
|
base.pull(foreign_key, doc.id)
|
124
|
+
target._unloaded = criteria
|
124
125
|
unsynced(base, foreign_key)
|
125
126
|
end
|
126
127
|
doc
|
@@ -169,7 +170,11 @@ module Mongoid
|
|
169
170
|
# @since 2.0.0.rc.1
|
170
171
|
def substitute(replacement)
|
171
172
|
purge
|
172
|
-
|
173
|
+
unless replacement.blank?
|
174
|
+
push(replacement.compact.uniq)
|
175
|
+
else
|
176
|
+
reset_relation_criteria
|
177
|
+
end
|
173
178
|
self
|
174
179
|
end
|
175
180
|
|
@@ -147,10 +147,10 @@ module Mongoid
|
|
147
147
|
# puts doc
|
148
148
|
# end
|
149
149
|
#
|
150
|
-
# @example return an enumerator containing all the docs
|
150
|
+
# @example return an enumerator containing all the docs
|
151
151
|
#
|
152
152
|
# a = enumerable.each
|
153
|
-
#
|
153
|
+
#
|
154
154
|
# @return [ true ] That the enumerable is now _loaded.
|
155
155
|
#
|
156
156
|
# @since 2.1.0
|
@@ -322,6 +322,19 @@ module Mongoid
|
|
322
322
|
@executed = false
|
323
323
|
end
|
324
324
|
|
325
|
+
# Resets the underlying unloaded criteria object with a new one. Used
|
326
|
+
# my HABTM relations to keep the underlying array in sync.
|
327
|
+
#
|
328
|
+
# @example Reset the unloaded documents.
|
329
|
+
# enumerable.reset_unloaded(criteria)
|
330
|
+
#
|
331
|
+
# @param [ Criteria ] criteria The criteria to replace with.
|
332
|
+
#
|
333
|
+
# @since 3.0.14
|
334
|
+
def reset_unloaded(criteria)
|
335
|
+
@_unloaded = criteria if _unloaded.is_a?(Criteria)
|
336
|
+
end
|
337
|
+
|
325
338
|
# Does this enumerable respond to the provided method?
|
326
339
|
#
|
327
340
|
# @example Does the enumerable respond to the method?
|
@@ -105,13 +105,13 @@ module Mongoid
|
|
105
105
|
# @since 2.4.10
|
106
106
|
def create_criteria(base, document, attribute, value)
|
107
107
|
field = document.fields[attribute.to_s]
|
108
|
-
criteria = base.unscoped
|
108
|
+
criteria = scope(base.unscoped, document, attribute)
|
109
109
|
if field.try(:localized?)
|
110
110
|
criteria.selector.update(criterion(document, attribute, value))
|
111
111
|
else
|
112
112
|
criteria = criteria.where(criterion(document, attribute, value))
|
113
113
|
end
|
114
|
-
|
114
|
+
criteria
|
115
115
|
end
|
116
116
|
|
117
117
|
# Get the default criteria for checking uniqueness.
|
data/lib/mongoid/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongoid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.
|
4
|
+
version: 3.0.14
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-11-
|
12
|
+
date: 2012-11-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activemodel
|
@@ -132,6 +132,7 @@ files:
|
|
132
132
|
- lib/mongoid/errors/invalid_includes.rb
|
133
133
|
- lib/mongoid/errors/invalid_index.rb
|
134
134
|
- lib/mongoid/errors/invalid_options.rb
|
135
|
+
- lib/mongoid/errors/invalid_path.rb
|
135
136
|
- lib/mongoid/errors/invalid_scope.rb
|
136
137
|
- lib/mongoid/errors/invalid_set_polymorphic_relation.rb
|
137
138
|
- lib/mongoid/errors/invalid_storage_options.rb
|
@@ -352,7 +353,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
352
353
|
version: '0'
|
353
354
|
segments:
|
354
355
|
- 0
|
355
|
-
hash:
|
356
|
+
hash: 4134482588596477262
|
356
357
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
357
358
|
none: false
|
358
359
|
requirements:
|