mongoid 5.4.1 → 6.1.1
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.
- checksums.yaml +5 -5
- data/README.md +3 -3
- data/lib/config/locales/en.yml +19 -0
- data/lib/mongoid.rb +4 -4
- data/lib/mongoid/atomic.rb +2 -2
- data/lib/mongoid/atomic/modifiers.rb +8 -12
- data/lib/mongoid/attributes.rb +22 -21
- data/lib/mongoid/attributes/readonly.rb +22 -0
- data/lib/mongoid/cacheable.rb +36 -0
- data/lib/mongoid/changeable.rb +36 -0
- data/lib/mongoid/clients.rb +8 -63
- data/lib/mongoid/clients/options.rb +55 -250
- data/lib/mongoid/clients/storage_options.rb +1 -69
- data/lib/mongoid/composable.rb +29 -3
- data/lib/mongoid/config.rb +1 -0
- data/lib/mongoid/contextual/atomic.rb +5 -8
- data/lib/mongoid/contextual/map_reduce.rb +0 -4
- data/lib/mongoid/contextual/memory.rb +2 -2
- data/lib/mongoid/contextual/mongo.rb +40 -22
- data/lib/mongoid/contextual/none.rb +12 -0
- data/lib/mongoid/copyable.rb +13 -6
- data/lib/mongoid/criteria.rb +5 -2
- data/lib/mongoid/criteria/marshalable.rb +2 -2
- data/lib/mongoid/criteria/modifiable.rb +17 -1
- data/lib/mongoid/criteria/options.rb +25 -0
- data/lib/mongoid/criteria/queryable.rb +87 -0
- data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
- data/lib/mongoid/criteria/queryable/extensions.rb +28 -0
- data/lib/mongoid/criteria/queryable/extensions/array.rb +185 -0
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +37 -0
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +34 -0
- data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +53 -0
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +200 -0
- data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +86 -0
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +90 -0
- data/lib/mongoid/criteria/queryable/extensions/object.rb +206 -0
- data/lib/mongoid/criteria/queryable/extensions/range.rb +70 -0
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +79 -0
- data/lib/mongoid/criteria/queryable/extensions/set.rb +34 -0
- data/lib/mongoid/criteria/queryable/extensions/string.rb +137 -0
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +79 -0
- data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +54 -0
- data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
- data/lib/mongoid/criteria/queryable/key.rb +103 -0
- data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
- data/lib/mongoid/criteria/queryable/mergeable.rb +271 -0
- data/lib/mongoid/criteria/queryable/optional.rb +429 -0
- data/lib/mongoid/criteria/queryable/options.rb +153 -0
- data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
- data/lib/mongoid/criteria/queryable/selectable.rb +662 -0
- data/lib/mongoid/criteria/queryable/selector.rb +212 -0
- data/lib/mongoid/criteria/queryable/smash.rb +104 -0
- data/lib/mongoid/document.rb +30 -37
- data/lib/mongoid/errors.rb +2 -0
- data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
- data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -1
- data/lib/mongoid/errors/invalid_field.rb +2 -2
- data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
- data/lib/mongoid/errors/invalid_relation.rb +66 -0
- data/lib/mongoid/evolvable.rb +1 -1
- data/lib/mongoid/extensions.rb +0 -4
- data/lib/mongoid/extensions/big_decimal.rb +17 -8
- data/lib/mongoid/extensions/date.rb +4 -1
- data/lib/mongoid/extensions/decimal128.rb +3 -3
- data/lib/mongoid/extensions/hash.rb +1 -0
- data/lib/mongoid/extensions/string.rb +4 -3
- data/lib/mongoid/extensions/time.rb +4 -1
- data/lib/mongoid/fields/validators/macro.rb +18 -0
- data/lib/mongoid/findable.rb +2 -2
- data/lib/mongoid/indexable.rb +15 -13
- data/lib/mongoid/interceptable.rb +5 -22
- data/lib/mongoid/matchable.rb +13 -7
- data/lib/mongoid/matchable/all.rb +2 -2
- data/lib/mongoid/matchable/and.rb +3 -3
- data/lib/mongoid/matchable/default.rb +2 -2
- data/lib/mongoid/matchable/elem_match.rb +28 -0
- data/lib/mongoid/matchable/exists.rb +2 -2
- data/lib/mongoid/matchable/gt.rb +4 -2
- data/lib/mongoid/matchable/gte.rb +4 -2
- data/lib/mongoid/matchable/in.rb +2 -2
- data/lib/mongoid/matchable/lt.rb +4 -2
- data/lib/mongoid/matchable/lte.rb +4 -2
- data/lib/mongoid/matchable/ne.rb +2 -2
- data/lib/mongoid/matchable/nin.rb +2 -2
- data/lib/mongoid/matchable/or.rb +3 -3
- data/lib/mongoid/matchable/regexp.rb +3 -3
- data/lib/mongoid/matchable/size.rb +2 -2
- data/lib/mongoid/persistable.rb +3 -5
- data/lib/mongoid/persistable/creatable.rb +2 -2
- data/lib/mongoid/persistable/deletable.rb +1 -1
- data/lib/mongoid/persistable/settable.rb +1 -1
- data/lib/mongoid/persistable/updatable.rb +5 -12
- data/lib/mongoid/persistable/upsertable.rb +1 -1
- data/lib/mongoid/persistence_context.rb +215 -0
- data/lib/mongoid/query_cache.rb +3 -6
- data/lib/mongoid/relations/accessors.rb +3 -0
- data/lib/mongoid/relations/auto_save.rb +12 -4
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -4
- data/lib/mongoid/relations/counter_cache.rb +15 -5
- data/lib/mongoid/relations/eager.rb +6 -11
- data/lib/mongoid/relations/eager/base.rb +3 -3
- data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +2 -2
- data/lib/mongoid/relations/eager/has_many.rb +1 -1
- data/lib/mongoid/relations/embedded/batchable.rb +12 -36
- data/lib/mongoid/relations/embedded/in.rb +13 -1
- data/lib/mongoid/relations/embedded/many.rb +28 -10
- data/lib/mongoid/relations/embedded/one.rb +14 -1
- data/lib/mongoid/relations/macros.rb +9 -1
- data/lib/mongoid/relations/metadata.rb +3 -3
- data/lib/mongoid/relations/options.rb +2 -2
- data/lib/mongoid/relations/proxy.rb +1 -31
- data/lib/mongoid/relations/referenced/in.rb +19 -10
- data/lib/mongoid/relations/referenced/many.rb +23 -17
- data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
- data/lib/mongoid/relations/referenced/one.rb +15 -1
- data/lib/mongoid/relations/synchronization.rb +11 -11
- data/lib/mongoid/relations/touchable.rb +6 -3
- data/lib/mongoid/reloadable.rb +1 -1
- data/lib/mongoid/serializable.rb +1 -1
- data/lib/mongoid/traversable.rb +1 -1
- data/lib/mongoid/validatable/uniqueness.rb +1 -2
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +14 -3
- data/spec/app/models/album.rb +5 -1
- data/spec/app/models/artist.rb +21 -0
- data/spec/app/models/book.rb +2 -1
- data/spec/app/models/dokument.rb +1 -0
- data/spec/app/models/ordered_post.rb +5 -0
- data/spec/app/models/oscar.rb +1 -2
- data/spec/app/models/page.rb +1 -1
- data/spec/app/models/person.rb +3 -3
- data/spec/app/models/princess.rb +2 -0
- data/spec/app/models/record.rb +1 -0
- data/spec/app/models/subscription.rb +1 -0
- data/spec/app/models/thing.rb +1 -1
- data/spec/config/mongoid.yml +15 -0
- data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
- data/spec/mongoid/atomic_spec.rb +17 -17
- data/spec/mongoid/attributes/nested_spec.rb +14 -14
- data/spec/mongoid/attributes/readonly_spec.rb +87 -44
- data/spec/mongoid/attributes_spec.rb +90 -5
- data/spec/mongoid/cacheable_spec.rb +112 -0
- data/spec/mongoid/changeable_spec.rb +58 -0
- data/spec/mongoid/clients/factory_spec.rb +31 -3
- data/spec/mongoid/clients/options_spec.rb +382 -96
- data/spec/mongoid/clients_spec.rb +243 -101
- data/spec/mongoid/composable_spec.rb +7 -0
- data/spec/mongoid/config_spec.rb +67 -11
- data/spec/mongoid/contextual/atomic_spec.rb +3 -3
- data/spec/mongoid/contextual/mongo_spec.rb +165 -20
- data/spec/mongoid/contextual/none_spec.rb +15 -0
- data/spec/mongoid/copyable_spec.rb +13 -4
- data/spec/mongoid/criteria/modifiable_spec.rb +239 -7
- data/spec/mongoid/criteria/options_spec.rb +29 -0
- data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
- data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
- data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
- data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
- data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
- data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
- data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
- data/spec/mongoid/{extensions/origin → criteria/queryable/extensions}/regexp_raw_spec.rb +2 -2
- data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +90 -0
- data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
- data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
- data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
- data/spec/mongoid/criteria/queryable/optional_spec.rb +1799 -0
- data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
- data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
- data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +4174 -0
- data/spec/mongoid/criteria/queryable/selector_spec.rb +844 -0
- data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
- data/spec/mongoid/criteria_spec.rb +152 -21
- data/spec/mongoid/document_spec.rb +37 -88
- data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
- data/spec/mongoid/extensions/big_decimal_spec.rb +320 -18
- data/spec/mongoid/extensions/boolean_spec.rb +14 -0
- data/spec/mongoid/extensions/date_spec.rb +2 -6
- data/spec/mongoid/extensions/date_time_spec.rb +2 -6
- data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
- data/spec/mongoid/extensions/float_spec.rb +8 -1
- data/spec/mongoid/extensions/hash_spec.rb +15 -0
- data/spec/mongoid/extensions/integer_spec.rb +8 -1
- data/spec/mongoid/extensions/object_spec.rb +11 -0
- data/spec/mongoid/extensions/string_spec.rb +21 -0
- data/spec/mongoid/extensions/time_spec.rb +2 -6
- data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
- data/spec/mongoid/findable_spec.rb +46 -1
- data/spec/mongoid/indexable_spec.rb +15 -3
- data/spec/mongoid/interceptable_spec.rb +68 -10
- data/spec/mongoid/matchable/all_spec.rb +4 -4
- data/spec/mongoid/matchable/and_spec.rb +10 -10
- data/spec/mongoid/matchable/default_spec.rb +12 -12
- data/spec/mongoid/matchable/elem_match_spec.rb +86 -0
- data/spec/mongoid/matchable/exists_spec.rb +5 -5
- data/spec/mongoid/matchable/gt_spec.rb +18 -7
- data/spec/mongoid/matchable/gte_spec.rb +17 -7
- data/spec/mongoid/matchable/in_spec.rb +5 -5
- data/spec/mongoid/matchable/lt_spec.rb +18 -7
- data/spec/mongoid/matchable/lte_spec.rb +18 -7
- data/spec/mongoid/matchable/ne_spec.rb +5 -5
- data/spec/mongoid/matchable/nin_spec.rb +5 -5
- data/spec/mongoid/matchable/or_spec.rb +7 -7
- data/spec/mongoid/matchable/regexp_spec.rb +5 -5
- data/spec/mongoid/matchable/size_spec.rb +3 -3
- data/spec/mongoid/matchable_spec.rb +173 -53
- data/spec/mongoid/persistable/creatable_spec.rb +7 -2
- data/spec/mongoid/persistable/deletable_spec.rb +16 -1
- data/spec/mongoid/persistable/destroyable_spec.rb +6 -2
- data/spec/mongoid/persistable/savable_spec.rb +35 -30
- data/spec/mongoid/persistable/settable_spec.rb +45 -29
- data/spec/mongoid/persistable/updatable_spec.rb +184 -5
- data/spec/mongoid/persistence_context_spec.rb +680 -0
- data/spec/mongoid/positional_spec.rb +10 -10
- data/spec/mongoid/query_cache_spec.rb +89 -0
- data/spec/mongoid/relations/accessors_spec.rb +1 -1
- data/spec/mongoid/relations/auto_save_spec.rb +39 -6
- data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +4 -4
- data/spec/mongoid/relations/builders_spec.rb +37 -10
- data/spec/mongoid/relations/counter_cache_spec.rb +64 -3
- data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +16 -0
- data/spec/mongoid/relations/eager_spec.rb +40 -0
- data/spec/mongoid/relations/embedded/many_spec.rb +63 -47
- data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
- data/spec/mongoid/relations/macros_spec.rb +395 -7
- data/spec/mongoid/relations/metadata_spec.rb +15 -1
- data/spec/mongoid/relations/proxy_spec.rb +27 -1
- data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
- data/spec/mongoid/relations/referenced/many_spec.rb +13 -25
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +14 -26
- data/spec/mongoid/relations/synchronization_spec.rb +48 -2
- data/spec/mongoid/relations/touchable_spec.rb +40 -0
- data/spec/mongoid/reloadable_spec.rb +51 -0
- data/spec/mongoid/serializable_spec.rb +0 -50
- data/spec/mongoid/validatable/presence_spec.rb +1 -1
- data/spec/mongoid/validatable/uniqueness_spec.rb +18 -9
- data/spec/mongoid/validatable_spec.rb +16 -0
- data/spec/spec_helper.rb +20 -11
- metadata +524 -469
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/mongoid/clients/thread_options.rb +0 -19
- data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
- metadata.gz.sig +0 -0
@@ -29,10 +29,10 @@ module Mongoid
|
|
29
29
|
|
30
30
|
private
|
31
31
|
|
32
|
-
# Get the
|
32
|
+
# Get the queryable of the method.
|
33
33
|
#
|
34
34
|
# @example Get the originating class or module.
|
35
|
-
# error.
|
35
|
+
# error.queryable(Person, :crazy_method_name)
|
36
36
|
#
|
37
37
|
# @param [ Class ] klass The document class.
|
38
38
|
# @param [ Symbol ] name The method name.
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Errors
|
4
|
+
|
5
|
+
# Raised when invalid options are used to create a persistence context.
|
6
|
+
#
|
7
|
+
# @since 6.0.0
|
8
|
+
class InvalidPersistenceOption < MongoidError
|
9
|
+
|
10
|
+
# Instantiate the persistence context option error.
|
11
|
+
#
|
12
|
+
# @example Create the error.
|
13
|
+
# InvalidPersistenceOption.new(:invalid_option, [ :connect_timeout, :database ])
|
14
|
+
#
|
15
|
+
# @param [ Symbol ] invalid The invalid option.
|
16
|
+
# @param [ Array<Symbol> ] valid The allowed options.
|
17
|
+
#
|
18
|
+
# @since 6.0.0
|
19
|
+
def initialize(invalid, valid)
|
20
|
+
super(
|
21
|
+
compose_message(
|
22
|
+
"invalid_persistence_option",
|
23
|
+
{ invalid: invalid, valid: valid }
|
24
|
+
)
|
25
|
+
)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Errors
|
4
|
+
|
5
|
+
# This error is raised when trying to create a relation that conflicts with
|
6
|
+
# an already defined method.
|
7
|
+
#
|
8
|
+
# @since 6.0.0
|
9
|
+
class InvalidRelation < MongoidError
|
10
|
+
|
11
|
+
# Create the new error.
|
12
|
+
#
|
13
|
+
# @example Create the error.
|
14
|
+
# InvalidRelation.new(person, :crazy_relation_name)
|
15
|
+
#
|
16
|
+
# @param [ Class ] klass The document class.
|
17
|
+
# @param [ Symbol ] name The method name.
|
18
|
+
def initialize(klass, name)
|
19
|
+
super(
|
20
|
+
compose_message(
|
21
|
+
"invalid_relation",
|
22
|
+
{
|
23
|
+
name: name,
|
24
|
+
origin: origin(klass, name),
|
25
|
+
file: location(klass, name)[0],
|
26
|
+
line: location(klass, name)[1]
|
27
|
+
}
|
28
|
+
)
|
29
|
+
)
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
# Get the queryable of the method.
|
35
|
+
#
|
36
|
+
# @example Get the originating class or module.
|
37
|
+
# error.queryable(Person, :crazy_method_name)
|
38
|
+
#
|
39
|
+
# @param [ Class ] klass The document class.
|
40
|
+
# @param [ Symbol ] name The method name.
|
41
|
+
#
|
42
|
+
# @return [ Class, Module ] The originating class or module.
|
43
|
+
#
|
44
|
+
# @since 6.0.0
|
45
|
+
def origin(klass, name)
|
46
|
+
klass.instance_method(name).owner
|
47
|
+
end
|
48
|
+
|
49
|
+
# Get the location of the relation definition.
|
50
|
+
#
|
51
|
+
# @example Get the location of the method on the filesystem.
|
52
|
+
# error.location(Person, :crazy_method_name)
|
53
|
+
#
|
54
|
+
# @param [ Class ] klass The document class.
|
55
|
+
# @param [ Symbol ] name The method name.
|
56
|
+
#
|
57
|
+
# @return [ Array<String, Integer> ] The location of the method.
|
58
|
+
#
|
59
|
+
# @since 6.0.0
|
60
|
+
def location(klass, name)
|
61
|
+
@location ||=
|
62
|
+
(klass.instance_method(name).source_location || [ "Unknown", 0 ])
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/lib/mongoid/evolvable.rb
CHANGED
data/lib/mongoid/extensions.rb
CHANGED
@@ -3,9 +3,6 @@ class BSON::ObjectId
|
|
3
3
|
def as_json(options = nil)
|
4
4
|
{ "$oid" => to_s }
|
5
5
|
end
|
6
|
-
def to_xml(options = nil)
|
7
|
-
ActiveSupport::XmlMini.to_tag(options[:root], self.to_s, options)
|
8
|
-
end
|
9
6
|
end
|
10
7
|
|
11
8
|
class Symbol
|
@@ -39,7 +36,6 @@ require "mongoid/extensions/module"
|
|
39
36
|
require "mongoid/extensions/nil_class"
|
40
37
|
require "mongoid/extensions/object"
|
41
38
|
require "mongoid/extensions/object_id"
|
42
|
-
require "mongoid/extensions/origin/regexp_raw"
|
43
39
|
require "mongoid/extensions/range"
|
44
40
|
require "mongoid/extensions/regexp"
|
45
41
|
require "mongoid/extensions/set"
|
@@ -28,6 +28,18 @@ module Mongoid
|
|
28
28
|
to_s
|
29
29
|
end
|
30
30
|
|
31
|
+
# Is the BigDecimal a number?
|
32
|
+
#
|
33
|
+
# @example Is the object a number?.
|
34
|
+
# object.numeric?
|
35
|
+
#
|
36
|
+
# @return [ true ] Always true.
|
37
|
+
#
|
38
|
+
# @since 6.0.0
|
39
|
+
def numeric?
|
40
|
+
true
|
41
|
+
end
|
42
|
+
|
31
43
|
module ClassMethods
|
32
44
|
|
33
45
|
# Convert the object from its mongo friendly ruby type to this type.
|
@@ -37,28 +49,25 @@ module Mongoid
|
|
37
49
|
#
|
38
50
|
# @param [ Object ] object The object to demongoize.
|
39
51
|
#
|
40
|
-
# @return [
|
52
|
+
# @return [ BigDecimal, nil ] A BigDecimal derived from the object or nil.
|
41
53
|
#
|
42
54
|
# @since 3.0.0
|
43
55
|
def demongoize(object)
|
44
|
-
|
45
|
-
object.numeric? ? ::BigDecimal.new(object.to_s) : object
|
46
|
-
end
|
56
|
+
object && object.numeric? ? ::BigDecimal.new(object.to_s) : nil
|
47
57
|
end
|
48
58
|
|
49
|
-
# Mongoize an object of any type to how it's stored in the db as a
|
50
|
-
# decimal.
|
59
|
+
# Mongoize an object of any type to how it's stored in the db as a String.
|
51
60
|
#
|
52
61
|
# @example Mongoize the object.
|
53
62
|
# BigDecimal.mongoize(123)
|
54
63
|
#
|
55
64
|
# @param [ Object ] object The object to Mongoize
|
56
65
|
#
|
57
|
-
# @return [ String ]
|
66
|
+
# @return [ String, nil ] A String representing the object or nil.
|
58
67
|
#
|
59
68
|
# @since 3.0.7
|
60
69
|
def mongoize(object)
|
61
|
-
object ? object.to_s :
|
70
|
+
object && object.numeric? ? object.to_s : nil
|
62
71
|
end
|
63
72
|
end
|
64
73
|
end
|
@@ -4,6 +4,9 @@ module Mongoid
|
|
4
4
|
module Date
|
5
5
|
|
6
6
|
# Constant for epoch - used when passing invalid times.
|
7
|
+
#
|
8
|
+
# @deprecated No longer used as a return value from #mongoize passed
|
9
|
+
# an invalid date string.
|
7
10
|
EPOCH = ::Date.new(1970, 1, 1)
|
8
11
|
|
9
12
|
# Convert the date into a time.
|
@@ -64,7 +67,7 @@ module Mongoid
|
|
64
67
|
time = object.__mongoize_time__
|
65
68
|
::Time.utc(time.year, time.month, time.day)
|
66
69
|
rescue ArgumentError
|
67
|
-
|
70
|
+
nil
|
68
71
|
end
|
69
72
|
end
|
70
73
|
end
|
@@ -10,7 +10,7 @@ module Mongoid
|
|
10
10
|
#
|
11
11
|
# @return [ BSON::Decimal128 ] self.
|
12
12
|
#
|
13
|
-
# @since
|
13
|
+
# @since 6.1.0
|
14
14
|
def __evolve_decimal128__
|
15
15
|
self
|
16
16
|
end
|
@@ -26,7 +26,7 @@ module Mongoid
|
|
26
26
|
#
|
27
27
|
# @return [ BSON::Decimal128 ] The decimal128.
|
28
28
|
#
|
29
|
-
# @since
|
29
|
+
# @since 6.1.0
|
30
30
|
def evolve(object)
|
31
31
|
object.__evolve_decimal128__
|
32
32
|
end
|
@@ -36,4 +36,4 @@ module Mongoid
|
|
36
36
|
end
|
37
37
|
|
38
38
|
BSON::Decimal128.__send__(:include, Mongoid::Extensions::Decimal128)
|
39
|
-
BSON::Decimal128.extend(Mongoid::Extensions::Decimal128::ClassMethods)
|
39
|
+
BSON::Decimal128.extend(Mongoid::Extensions::Decimal128::ClassMethods)
|
@@ -72,7 +72,8 @@ module Mongoid
|
|
72
72
|
self =~ /\A(|_)id$/
|
73
73
|
end
|
74
74
|
|
75
|
-
# Is the string a number?
|
75
|
+
# Is the string a number? The literals "NaN", "Infinity", and "-Infinity"
|
76
|
+
# are counted as numbers.
|
76
77
|
#
|
77
78
|
# @example Is the string a number.
|
78
79
|
# "1234.23".numeric?
|
@@ -81,7 +82,7 @@ module Mongoid
|
|
81
82
|
#
|
82
83
|
# @since 3.0.0
|
83
84
|
def numeric?
|
84
|
-
true if Float(self) rescue (self
|
85
|
+
true if Float(self) rescue (self =~ /^NaN|\-?Infinity$/)
|
85
86
|
end
|
86
87
|
|
87
88
|
# Get the string as a getter string.
|
@@ -117,7 +118,7 @@ module Mongoid
|
|
117
118
|
#
|
118
119
|
# @since 3.0.15
|
119
120
|
def valid_method_name?
|
120
|
-
/[@$"]/ !~ self
|
121
|
+
/[@$"-]/ !~ self
|
121
122
|
end
|
122
123
|
|
123
124
|
# Does the string end with _before_type_cast?
|
@@ -4,6 +4,9 @@ module Mongoid
|
|
4
4
|
module Time
|
5
5
|
|
6
6
|
# Constant for epoch - used when passing invalid times.
|
7
|
+
#
|
8
|
+
# @deprecated No longer used as a return value from #mongoize passed
|
9
|
+
# an invalid time string.
|
7
10
|
EPOCH = ::Time.utc(1970, 1, 1, 0, 0, 0)
|
8
11
|
|
9
12
|
# Turn the object from the ruby type we deal with to a Mongo friendly
|
@@ -76,7 +79,7 @@ module Mongoid
|
|
76
79
|
::Time.at(time.to_i, time.usec).utc
|
77
80
|
end
|
78
81
|
rescue ArgumentError
|
79
|
-
|
82
|
+
nil
|
80
83
|
end
|
81
84
|
end
|
82
85
|
end
|
@@ -36,6 +36,24 @@ module Mongoid
|
|
36
36
|
validate_options(klass, name, options)
|
37
37
|
end
|
38
38
|
|
39
|
+
# Validate the relation definition.
|
40
|
+
#
|
41
|
+
# @example Validate the relation definition.
|
42
|
+
# Macro.validate(Model, :name)
|
43
|
+
#
|
44
|
+
# @param [ Class ] klass The model class.
|
45
|
+
# @param [ Symbol ] name The field name.
|
46
|
+
# @param [ Hash ] options The provided options.
|
47
|
+
#
|
48
|
+
# @since 6.0.0
|
49
|
+
def validate_relation(klass, name, options = {})
|
50
|
+
[name, "#{name}?".to_sym, "#{name}=".to_sym].each do |n|
|
51
|
+
if Mongoid.destructive_fields.include?(n)
|
52
|
+
raise Errors::InvalidRelation.new(klass, n)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
39
57
|
private
|
40
58
|
|
41
59
|
# Determine if the field name is allowed, if not raise an error.
|
data/lib/mongoid/findable.rb
CHANGED
@@ -6,12 +6,12 @@ module Mongoid
|
|
6
6
|
#
|
7
7
|
# @since 4.0.0
|
8
8
|
module Findable
|
9
|
-
extend
|
9
|
+
extend Mongoid::Criteria::Queryable::Forwardable
|
10
10
|
|
11
11
|
select_with :with_default_scope
|
12
12
|
|
13
13
|
# These are methods defined on the criteria that should also be accessible
|
14
|
-
# directly from the
|
14
|
+
# directly from the class level.
|
15
15
|
delegate \
|
16
16
|
:aggregates,
|
17
17
|
:avg,
|
data/lib/mongoid/indexable.rb
CHANGED
@@ -31,8 +31,9 @@ module Mongoid
|
|
31
31
|
index_specifications.each do |spec|
|
32
32
|
key, options = spec.key, spec.options
|
33
33
|
if database = options[:database]
|
34
|
-
with(database: database)
|
35
|
-
collection.indexes.create_one(key, options.except(:database))
|
34
|
+
with(database: database) do |klass|
|
35
|
+
klass.collection.indexes.create_one(key, options.except(:database))
|
36
|
+
end
|
36
37
|
else
|
37
38
|
collection.indexes.create_one(key, options)
|
38
39
|
end
|
@@ -50,18 +51,19 @@ module Mongoid
|
|
50
51
|
# @since 3.0.0
|
51
52
|
def remove_indexes
|
52
53
|
indexed_database_names.each do |database|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
54
|
+
with(database: database) do |klass|
|
55
|
+
begin
|
56
|
+
klass.collection.indexes.each do |spec|
|
57
|
+
unless spec["name"] == "_id_"
|
58
|
+
klass.collection.indexes.drop_one(spec["key"])
|
59
|
+
logger.info(
|
60
|
+
"MONGOID: Removed index '#{spec["name"]}' on collection " +
|
61
|
+
"'#{klass.collection.name}' in database '#{database}'."
|
62
|
+
)
|
63
|
+
end
|
62
64
|
end
|
63
|
-
end
|
64
|
-
|
65
|
+
rescue Mongo::Error::OperationFailure; end
|
66
|
+
end
|
65
67
|
end and true
|
66
68
|
end
|
67
69
|
|
@@ -125,12 +125,6 @@ module Mongoid
|
|
125
125
|
# @since 2.3.0
|
126
126
|
def run_callbacks(kind, *args, &block)
|
127
127
|
cascadable_children(kind).each do |child|
|
128
|
-
# This is returning false for some destroy tests on 4.1.0.beta1,
|
129
|
-
# causing them to fail since 4.1.0 expects a block to be passed if the
|
130
|
-
# callbacks for the type are empty. If no block is passed then the nil
|
131
|
-
# return value gets interpreted as false and halts the chain.
|
132
|
-
#
|
133
|
-
# @see https://github.com/rails/rails/blob/master/activesupport/lib/active_support/callbacks.rb#L79
|
134
128
|
if child.run_callbacks(child_callback_type(kind, child), *args) == false
|
135
129
|
return false
|
136
130
|
end
|
@@ -196,7 +190,7 @@ module Mongoid
|
|
196
190
|
#
|
197
191
|
# @since 2.3.0
|
198
192
|
def cascadable_child?(kind, child, metadata)
|
199
|
-
return false if kind == :initialize || kind == :find
|
193
|
+
return false if kind == :initialize || kind == :find || kind == :touch
|
200
194
|
return false if kind == :validate && metadata.validate?
|
201
195
|
child.callback_executable?(kind) ? child.in_callback_state?(kind) : false
|
202
196
|
end
|
@@ -259,22 +253,11 @@ module Mongoid
|
|
259
253
|
send("_#{kind}_callbacks").each do |callback|
|
260
254
|
chain.append(callback) if callback.kind == place
|
261
255
|
end
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
runner = ActiveSupport::Callbacks::Filters::Environment.new(self, false, nil)
|
266
|
-
chain.compile.call(runner).value
|
267
|
-
end
|
268
|
-
self.class.send :protected, name
|
269
|
-
else
|
270
|
-
class_eval <<-EOM
|
271
|
-
def #{name}()
|
272
|
-
#{chain.compile}
|
273
|
-
end
|
274
|
-
protected :#{name}
|
275
|
-
EOM
|
256
|
+
self.class.send :define_method, name do
|
257
|
+
runner = ActiveSupport::Callbacks::Filters::Environment.new(self, false, nil)
|
258
|
+
chain.compile.call(runner).value
|
276
259
|
end
|
277
|
-
|
260
|
+
self.class.send :protected, name
|
278
261
|
end
|
279
262
|
send(name)
|
280
263
|
end
|
data/lib/mongoid/matchable.rb
CHANGED
@@ -12,6 +12,7 @@ require "mongoid/matchable/ne"
|
|
12
12
|
require "mongoid/matchable/nin"
|
13
13
|
require "mongoid/matchable/or"
|
14
14
|
require "mongoid/matchable/size"
|
15
|
+
require "mongoid/matchable/elem_match"
|
15
16
|
require "mongoid/matchable/regexp"
|
16
17
|
|
17
18
|
module Mongoid
|
@@ -28,6 +29,7 @@ module Mongoid
|
|
28
29
|
# @since 1.0.0
|
29
30
|
MATCHERS = {
|
30
31
|
"$all" => All,
|
32
|
+
"$elemMatch" => ElemMatch,
|
31
33
|
"$and" => And,
|
32
34
|
"$exists" => Exists,
|
33
35
|
"$gt" => Gt,
|
@@ -45,26 +47,26 @@ module Mongoid
|
|
45
47
|
# MongoDB selector. Used for matching on embedded associations.
|
46
48
|
#
|
47
49
|
# @example Does the document match?
|
48
|
-
# document.
|
50
|
+
# document._matches?(:title => { "$in" => [ "test" ] })
|
49
51
|
#
|
50
52
|
# @param [ Hash ] selector The MongoDB selector.
|
51
53
|
#
|
52
54
|
# @return [ true, false ] True if matches, false if not.
|
53
55
|
#
|
54
56
|
# @since 1.0.0
|
55
|
-
def
|
57
|
+
def _matches?(selector)
|
56
58
|
selector.each_pair do |key, value|
|
57
59
|
if value.is_a?(Hash)
|
58
60
|
value.each do |item|
|
59
61
|
if item[0].to_s == "$not".freeze
|
60
62
|
item = item[1]
|
61
|
-
return false if matcher(self, key, item).
|
63
|
+
return false if matcher(self, key, item)._matches?(item)
|
62
64
|
else
|
63
|
-
return false unless matcher(self, key, Hash[*item]).
|
65
|
+
return false unless matcher(self, key, Hash[*item])._matches?(Hash[*item])
|
64
66
|
end
|
65
67
|
end
|
66
68
|
else
|
67
|
-
return false unless matcher(self, key, value).
|
69
|
+
return false unless matcher(self, key, value)._matches?(value)
|
68
70
|
end
|
69
71
|
end
|
70
72
|
true
|
@@ -144,7 +146,7 @@ module Mongoid
|
|
144
146
|
# @since 2.2.1
|
145
147
|
def extract_attribute(document, key)
|
146
148
|
if (key_string = key.to_s) =~ /.+\..+/
|
147
|
-
key_string.split('.').inject(document.
|
149
|
+
key_string.split('.').inject(document.send(:as_attributes)) do |_attribs, _key|
|
148
150
|
if _attribs.is_a?(::Array)
|
149
151
|
if _key =~ /\A\d+\z/ && _attribs.none? {|doc| doc.is_a?(Hash)}
|
150
152
|
_attribs.try(:[], _key.to_i)
|
@@ -156,7 +158,11 @@ module Mongoid
|
|
156
158
|
end
|
157
159
|
end
|
158
160
|
else
|
159
|
-
document.
|
161
|
+
if document.is_a?(Hash)
|
162
|
+
document[key_string]
|
163
|
+
else
|
164
|
+
document.attributes[key_string]
|
165
|
+
end
|
160
166
|
end
|
161
167
|
end
|
162
168
|
end
|