mongoid 3.0.14 → 3.0.15
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 +40 -0
- data/lib/mongoid/atomic/modifiers.rb +2 -1
- data/lib/mongoid/attributes.rb +26 -2
- data/lib/mongoid/attributes/processing.rb +3 -2
- data/lib/mongoid/contextual/map_reduce.rb +21 -1
- data/lib/mongoid/contextual/mongo.rb +1 -0
- data/lib/mongoid/criteria.rb +2 -0
- data/lib/mongoid/criterion/marshalable.rb +48 -0
- data/lib/mongoid/errors/document_not_found.rb +2 -2
- data/lib/mongoid/extensions/hash.rb +19 -0
- data/lib/mongoid/extensions/string.rb +12 -0
- data/lib/mongoid/multi_parameter_attributes.rb +3 -2
- data/lib/mongoid/observer.rb +21 -0
- data/lib/mongoid/relations/accessors.rb +1 -1
- data/lib/mongoid/relations/cascading.rb +1 -1
- data/lib/mongoid/relations/marshalable.rb +31 -0
- data/lib/mongoid/relations/proxy.rb +17 -2
- data/lib/mongoid/relations/referenced/many_to_many.rb +1 -1
- data/lib/mongoid/relations/targets/enumerable.rb +24 -0
- data/lib/mongoid/sessions.rb +1 -1
- data/lib/mongoid/sessions/factory.rb +1 -1
- data/lib/mongoid/version.rb +1 -1
- metadata +5 -6
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,46 @@
|
|
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.15
|
7
|
+
|
8
|
+
### Resolved Issues
|
9
|
+
|
10
|
+
* \#2630 Fix cascading when the metadata exists but no cascade defined.
|
11
|
+
|
12
|
+
* \#2625 Fix `Marshal.dump` and `Marshal.load` of proxies and criteria
|
13
|
+
objects.
|
14
|
+
|
15
|
+
* \#2619 Fixed the classes returned by `observed_classes` on an observer
|
16
|
+
when it is observing custom models.
|
17
|
+
|
18
|
+
* \#2612 `DocumentNotFound` errors now expose the class in the error
|
19
|
+
instance.
|
20
|
+
|
21
|
+
* \#2610 Ensure calling `first` after a `last` that had sorting options resets
|
22
|
+
the sort.
|
23
|
+
|
24
|
+
* \#2604 Check pulls and pushes for conflicting updates. (Lucas Souza)
|
25
|
+
|
26
|
+
* \#2600 Instantiate the proper class type for attributes when using
|
27
|
+
multi parameter attributes. (xxswingxx)
|
28
|
+
|
29
|
+
* \#2598 Fixed sorting on localized fields with embedded docs.
|
30
|
+
|
31
|
+
* \#2588 Block defining methods for dynamic attributes that would be invalid
|
32
|
+
ruby methods. (Matt Sanford)
|
33
|
+
|
34
|
+
* \#2587 Fix method clash with `belongs_to` proxies when resetting relation
|
35
|
+
unloaded criteria.
|
36
|
+
|
37
|
+
* \#2585 Ensure session configuration options get passed to Moped as symbols.
|
38
|
+
|
39
|
+
* \#2584 Allow map/reduce to operate on secondaries if output is set to `inline`.
|
40
|
+
|
41
|
+
* \#2582 Ensure `nil` session override can never cause to access a session with
|
42
|
+
name `nil`.
|
43
|
+
|
44
|
+
* \#2581 Use strong consistency when reloading documents. (Mark Kremer)
|
45
|
+
|
6
46
|
## 3.0.14
|
7
47
|
|
8
48
|
### Resolved Issues
|
@@ -149,7 +149,8 @@ module Mongoid
|
|
149
149
|
#
|
150
150
|
# @since 2.2.0
|
151
151
|
def set_conflict?(field)
|
152
|
-
|
152
|
+
name = field.split(".", 2)[0]
|
153
|
+
pull_fields.has_key?(name) || push_fields.has_key?(name)
|
153
154
|
end
|
154
155
|
|
155
156
|
# Is the operation going to be a conflict for a $push?
|
data/lib/mongoid/attributes.rb
CHANGED
@@ -58,7 +58,12 @@ module Mongoid
|
|
58
58
|
#
|
59
59
|
# @since 1.0.0
|
60
60
|
def read_attribute(name)
|
61
|
-
|
61
|
+
normalized = name.to_s
|
62
|
+
if hash_dot_syntax?(normalized)
|
63
|
+
attributes.__nested__(normalized)
|
64
|
+
else
|
65
|
+
attributes[normalized]
|
66
|
+
end
|
62
67
|
end
|
63
68
|
alias :[] :read_attribute
|
64
69
|
|
@@ -100,7 +105,8 @@ module Mongoid
|
|
100
105
|
super || (
|
101
106
|
Mongoid.allow_dynamic_fields &&
|
102
107
|
attributes &&
|
103
|
-
attributes.has_key?(name.to_s.reader)
|
108
|
+
attributes.has_key?(name.to_s.reader) &&
|
109
|
+
name.to_s.valid_method_name?
|
104
110
|
)
|
105
111
|
end
|
106
112
|
|
@@ -191,6 +197,8 @@ module Mongoid
|
|
191
197
|
#
|
192
198
|
# @since 3.0.0
|
193
199
|
def define_dynamic_reader(name)
|
200
|
+
return unless name.valid_method_name?
|
201
|
+
|
194
202
|
class_eval <<-READER
|
195
203
|
def #{name}
|
196
204
|
read_attribute(#{name.inspect})
|
@@ -209,6 +217,8 @@ module Mongoid
|
|
209
217
|
#
|
210
218
|
# @since 3.0.0
|
211
219
|
def define_dynamic_writer(name)
|
220
|
+
return unless name.valid_method_name?
|
221
|
+
|
212
222
|
class_eval <<-WRITER
|
213
223
|
def #{name}=(value)
|
214
224
|
write_attribute(#{name.inspect}, value)
|
@@ -216,6 +226,20 @@ module Mongoid
|
|
216
226
|
WRITER
|
217
227
|
end
|
218
228
|
|
229
|
+
# Does the string contain dot syntax for accessing hashes?
|
230
|
+
#
|
231
|
+
# @api private
|
232
|
+
#
|
233
|
+
# @example Is the string in dot syntax.
|
234
|
+
# model.hash_dot_syntax?
|
235
|
+
#
|
236
|
+
# @return [ true, false ] If the string contains a "."
|
237
|
+
#
|
238
|
+
# @since 3.0.15
|
239
|
+
def hash_dot_syntax?(string)
|
240
|
+
string =~ /\./
|
241
|
+
end
|
242
|
+
|
219
243
|
# Used for allowing accessor methods for dynamic attributes.
|
220
244
|
#
|
221
245
|
# @param [ String, Symbol ] name The name of the method.
|
@@ -118,12 +118,13 @@ module Mongoid
|
|
118
118
|
#
|
119
119
|
# @since 2.0.0.rc.7
|
120
120
|
def process_attribute(name, value)
|
121
|
-
|
121
|
+
writer_method = "#{name}="
|
122
|
+
responds = respond_to?(writer_method)
|
122
123
|
if Mongoid.allow_dynamic_fields && !responds
|
123
124
|
write_attribute(name, value)
|
124
125
|
else
|
125
126
|
raise Errors::UnknownAttribute.new(self.class, name) unless responds
|
126
|
-
send(
|
127
|
+
send(writer_method, value)
|
127
128
|
end
|
128
129
|
end
|
129
130
|
|
@@ -286,7 +286,27 @@ module Mongoid
|
|
286
286
|
# @since 3.0.0
|
287
287
|
def results
|
288
288
|
raise Errors::NoMapReduceOutput.new(command) unless command[:out]
|
289
|
-
@results ||=
|
289
|
+
@results ||= __session__.command(command)
|
290
|
+
end
|
291
|
+
|
292
|
+
# Get the session with the proper consistency.
|
293
|
+
#
|
294
|
+
# @api private
|
295
|
+
#
|
296
|
+
# @note We can use eventual if the output is set to inline.
|
297
|
+
#
|
298
|
+
# @example Get the session.
|
299
|
+
# map_reduce.__session__
|
300
|
+
#
|
301
|
+
# @return [ Session ] The session with consistency set.
|
302
|
+
#
|
303
|
+
# @since 3.0.15
|
304
|
+
def __session__
|
305
|
+
if command[:out][:inline] != 1
|
306
|
+
session.with(consistency: :strong)
|
307
|
+
else
|
308
|
+
session
|
309
|
+
end
|
290
310
|
end
|
291
311
|
end
|
292
312
|
end
|
data/lib/mongoid/criteria.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require "mongoid/criterion/inspection"
|
3
|
+
require "mongoid/criterion/marshalable"
|
3
4
|
require "mongoid/criterion/scoping"
|
4
5
|
|
5
6
|
module Mongoid
|
@@ -15,6 +16,7 @@ module Mongoid
|
|
15
16
|
include Contextual
|
16
17
|
include Origin::Queryable
|
17
18
|
include Criterion::Inspection
|
19
|
+
include Criterion::Marshalable
|
18
20
|
include Criterion::Scoping
|
19
21
|
|
20
22
|
attr_accessor :embedded, :klass
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Criterion
|
4
|
+
module Marshalable
|
5
|
+
|
6
|
+
# Provides the data needed to Marshal.dump a criteria.
|
7
|
+
#
|
8
|
+
# @example Dump the criteria.
|
9
|
+
# Marshal.dump(criteria)
|
10
|
+
#
|
11
|
+
# @return [ Array<Object> ] The dumped data.
|
12
|
+
#
|
13
|
+
# @since 3.0.15
|
14
|
+
def marshal_dump
|
15
|
+
data = [ klass, driver, inclusions, documents, strategy, negating ]
|
16
|
+
data.push(scoping_options).push(dump_hash(:selector)).push(dump_hash(:options))
|
17
|
+
end
|
18
|
+
|
19
|
+
# Resets the criteria object after a Marshal.load
|
20
|
+
#
|
21
|
+
# @example Load the criteria.
|
22
|
+
# Marshal.load(criteria)
|
23
|
+
#
|
24
|
+
# @since 3.0.15
|
25
|
+
def marshal_load(data)
|
26
|
+
@scoping_options, raw_selector, raw_options = data.pop(3)
|
27
|
+
@klass, @driver, @inclusions, @documents, @strategy, @negating = data
|
28
|
+
@selector = load_hash(Origin::Selector, raw_selector)
|
29
|
+
@options = load_hash(Origin::Options, raw_options)
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def dump_hash(name)
|
35
|
+
send(name).inject({}) do |raw, (key, value)|
|
36
|
+
raw[key] = value
|
37
|
+
raw
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def load_hash(hash_class, raw)
|
42
|
+
hash = hash_class.new(klass.aliased_fields, klass.fields)
|
43
|
+
hash.merge!(raw)
|
44
|
+
hash
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -7,7 +7,7 @@ module Mongoid
|
|
7
7
|
# it will display all of those.
|
8
8
|
class DocumentNotFound < MongoidError
|
9
9
|
|
10
|
-
attr_reader :params
|
10
|
+
attr_reader :klass, :params
|
11
11
|
|
12
12
|
# Create the new error.
|
13
13
|
#
|
@@ -24,7 +24,7 @@ module Mongoid
|
|
24
24
|
if !unmatched && !params.is_a?(Hash)
|
25
25
|
raise ArgumentError, 'please also supply the unmatched ids'
|
26
26
|
end
|
27
|
-
@params = params
|
27
|
+
@klass, @params = klass, params
|
28
28
|
super(
|
29
29
|
compose_message(
|
30
30
|
message_key(params),
|
@@ -72,6 +72,25 @@ module Mongoid
|
|
72
72
|
self["_id"] || self["id"] || self[:id] || self[:_id]
|
73
73
|
end
|
74
74
|
|
75
|
+
# Fetch a nested value via dot syntax.
|
76
|
+
#
|
77
|
+
# @example Fetch a nested value via dot syntax.
|
78
|
+
# { "name" => { "en" => "test" }}.__nested__("name.en")
|
79
|
+
#
|
80
|
+
# @param [ String ] string the dot syntax string.
|
81
|
+
#
|
82
|
+
# @return [ Object ] The matching value.
|
83
|
+
#
|
84
|
+
# @since 3.0.15
|
85
|
+
def __nested__(string)
|
86
|
+
keys = string.split(".")
|
87
|
+
value = self
|
88
|
+
keys.each do |key|
|
89
|
+
value = value[key]
|
90
|
+
end
|
91
|
+
value
|
92
|
+
end
|
93
|
+
|
75
94
|
# Turn the object from the ruby type we deal with to a Mongo friendly
|
76
95
|
# type.
|
77
96
|
#
|
@@ -120,6 +120,18 @@ module Mongoid
|
|
120
120
|
include?("=")
|
121
121
|
end
|
122
122
|
|
123
|
+
# Is this string a valid_method_name?
|
124
|
+
#
|
125
|
+
# @example Is the string a valid Ruby idenfier for use as a method name
|
126
|
+
# "model=".valid_method_name?
|
127
|
+
#
|
128
|
+
# @return [ true, false ] If the string contains a valid Ruby identifier.
|
129
|
+
#
|
130
|
+
# @since 3.0.15
|
131
|
+
def valid_method_name?
|
132
|
+
/[@$"]/ !~ to_sym.inspect
|
133
|
+
end
|
134
|
+
|
123
135
|
# Is the object not to be converted to bson on criteria creation?
|
124
136
|
#
|
125
137
|
# @example Is the object unconvertable?
|
@@ -51,7 +51,8 @@ module Mongoid
|
|
51
51
|
def process_attributes(attrs = nil, role = :default, guard_protected_attributes = true)
|
52
52
|
if attrs
|
53
53
|
errors = []
|
54
|
-
attributes =
|
54
|
+
attributes = attrs.class.new
|
55
|
+
attributes.permitted = true if attrs.respond_to?(:permitted?) && attrs.permitted?
|
55
56
|
multi_parameter_attributes = {}
|
56
57
|
|
57
58
|
attrs.each_pair do |key, value|
|
@@ -79,7 +80,7 @@ module Mongoid
|
|
79
80
|
raise Errors::MultiparameterAssignmentErrors.new(errors),
|
80
81
|
"#{errors.size} error(s) on assignment of multiparameter attributes"
|
81
82
|
end
|
82
|
-
|
83
|
+
|
83
84
|
super attributes, role, guard_protected_attributes
|
84
85
|
else
|
85
86
|
super
|
data/lib/mongoid/observer.rb
CHANGED
@@ -176,5 +176,26 @@ module Mongoid
|
|
176
176
|
return false unless klass.respond_to?(:observers)
|
177
177
|
klass.observers.disabled_for?(self) || Mongoid.observers.disabled_for?(self)
|
178
178
|
end
|
179
|
+
|
180
|
+
class << self
|
181
|
+
|
182
|
+
# Attaches the observer to the specified classes.
|
183
|
+
#
|
184
|
+
# @example Attach the BandObserver to the class Artist.
|
185
|
+
# class BandObserver < Mongoid::Observer
|
186
|
+
# observe :artist
|
187
|
+
# end
|
188
|
+
#
|
189
|
+
# @param [ Array<Symbol> ] models The names of the models.
|
190
|
+
#
|
191
|
+
# @since 3.0.15
|
192
|
+
def observe(*models)
|
193
|
+
models.flatten!
|
194
|
+
models.collect! do |model|
|
195
|
+
model.respond_to?(:to_sym) ? model.to_s.camelize.constantize : model
|
196
|
+
end
|
197
|
+
singleton_class.redefine_method(:observed_classes) { models }
|
198
|
+
end
|
199
|
+
end
|
179
200
|
end
|
180
201
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Relations
|
4
|
+
module Marshalable
|
5
|
+
|
6
|
+
# Provides the data needed to Marshal.dump a relation proxy.
|
7
|
+
#
|
8
|
+
# @example Dump the proxy.
|
9
|
+
# Marshal.dump(proxy)
|
10
|
+
#
|
11
|
+
# @return [ Array<Object> ] The dumped data.
|
12
|
+
#
|
13
|
+
# @since 3.0.15
|
14
|
+
def marshal_dump
|
15
|
+
[ base, target, metadata ]
|
16
|
+
end
|
17
|
+
|
18
|
+
# Takes the provided data and sets it back on the proxy.
|
19
|
+
#
|
20
|
+
# @example Load the proxy.
|
21
|
+
# Marshal.load(proxy)
|
22
|
+
#
|
23
|
+
# @return [ Array<Object> ] The loaded data.
|
24
|
+
#
|
25
|
+
# @since 3.0.15
|
26
|
+
def marshal_load(data)
|
27
|
+
@base, @target, @metadata = data
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -1,4 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
require "mongoid/relations/marshalable"
|
3
|
+
|
2
4
|
module Mongoid
|
3
5
|
module Relations
|
4
6
|
|
@@ -14,11 +16,12 @@ module Mongoid
|
|
14
16
|
end
|
15
17
|
|
16
18
|
include Threaded::Lifecycle
|
19
|
+
include Marshalable
|
17
20
|
|
18
21
|
attr_accessor :base, :loaded, :metadata, :target
|
19
22
|
|
20
23
|
# Backwards compatibility with Mongoid beta releases.
|
21
|
-
delegate :
|
24
|
+
delegate :foreign_key, :inverse_foreign_key, to: :metadata
|
22
25
|
delegate :bind_one, :unbind_one, to: :binding
|
23
26
|
delegate :collection_name, to: :base
|
24
27
|
|
@@ -39,6 +42,18 @@ module Mongoid
|
|
39
42
|
extend_proxy(metadata.extension) if metadata.extension?
|
40
43
|
end
|
41
44
|
|
45
|
+
# Get the class from the metadata, or return nil if no metadata present.
|
46
|
+
#
|
47
|
+
# @example Get the class.
|
48
|
+
# proxy.klass
|
49
|
+
#
|
50
|
+
# @return [ Class ] The relation class.
|
51
|
+
#
|
52
|
+
# @since 3.0.15
|
53
|
+
def klass
|
54
|
+
metadata ? metadata.klass : nil
|
55
|
+
end
|
56
|
+
|
42
57
|
# Resets the criteria inside the relation proxy. Used by many to many
|
43
58
|
# relations to keep the underlying ids array in sync.
|
44
59
|
#
|
@@ -46,7 +61,7 @@ module Mongoid
|
|
46
61
|
# person.preferences.reset_relation_criteria
|
47
62
|
#
|
48
63
|
# @since 3.0.14
|
49
|
-
def
|
64
|
+
def reset_unloaded
|
50
65
|
target.reset_unloaded(criteria)
|
51
66
|
end
|
52
67
|
|
@@ -309,6 +309,30 @@ module Mongoid
|
|
309
309
|
!!@executed
|
310
310
|
end
|
311
311
|
|
312
|
+
# Provides the data needed to Marshal.dump an enumerable proxy.
|
313
|
+
#
|
314
|
+
# @example Dump the proxy.
|
315
|
+
# Marshal.dump(proxy)
|
316
|
+
#
|
317
|
+
# @return [ Array<Object> ] The dumped data.
|
318
|
+
#
|
319
|
+
# @since 3.0.15
|
320
|
+
def marshal_dump
|
321
|
+
[ _added, _loaded, _unloaded ]
|
322
|
+
end
|
323
|
+
|
324
|
+
# Loads the data needed to Marshal.load an enumerable proxy.
|
325
|
+
#
|
326
|
+
# @example Load the proxy.
|
327
|
+
# Marshal.load(proxy)
|
328
|
+
#
|
329
|
+
# @return [ Array<Object> ] The dumped data.
|
330
|
+
#
|
331
|
+
# @since 3.0.15
|
332
|
+
def marshal_load(data)
|
333
|
+
@_added, @_loaded, @_unloaded = data
|
334
|
+
end
|
335
|
+
|
312
336
|
# Reset the enumerable back to its persisted state.
|
313
337
|
#
|
314
338
|
# @example Reset the enumerable.
|
data/lib/mongoid/sessions.rb
CHANGED
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.15
|
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-
|
12
|
+
date: 2012-12-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activemodel
|
@@ -115,6 +115,7 @@ files:
|
|
115
115
|
- lib/mongoid/copyable.rb
|
116
116
|
- lib/mongoid/criteria.rb
|
117
117
|
- lib/mongoid/criterion/inspection.rb
|
118
|
+
- lib/mongoid/criterion/marshalable.rb
|
118
119
|
- lib/mongoid/criterion/scoping.rb
|
119
120
|
- lib/mongoid/dirty.rb
|
120
121
|
- lib/mongoid/document.rb
|
@@ -281,6 +282,7 @@ files:
|
|
281
282
|
- lib/mongoid/relations/embedded/one.rb
|
282
283
|
- lib/mongoid/relations/macros.rb
|
283
284
|
- lib/mongoid/relations/many.rb
|
285
|
+
- lib/mongoid/relations/marshalable.rb
|
284
286
|
- lib/mongoid/relations/metadata.rb
|
285
287
|
- lib/mongoid/relations/nested_builder.rb
|
286
288
|
- lib/mongoid/relations/one.rb
|
@@ -350,10 +352,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
350
352
|
requirements:
|
351
353
|
- - ! '>='
|
352
354
|
- !ruby/object:Gem::Version
|
353
|
-
version: '
|
354
|
-
segments:
|
355
|
-
- 0
|
356
|
-
hash: 4134482588596477262
|
355
|
+
version: '1.9'
|
357
356
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
358
357
|
none: false
|
359
358
|
requirements:
|