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.
Files changed (260) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +3 -3
  3. data/lib/config/locales/en.yml +19 -0
  4. data/lib/mongoid.rb +4 -4
  5. data/lib/mongoid/atomic.rb +2 -2
  6. data/lib/mongoid/atomic/modifiers.rb +8 -12
  7. data/lib/mongoid/attributes.rb +22 -21
  8. data/lib/mongoid/attributes/readonly.rb +22 -0
  9. data/lib/mongoid/cacheable.rb +36 -0
  10. data/lib/mongoid/changeable.rb +36 -0
  11. data/lib/mongoid/clients.rb +8 -63
  12. data/lib/mongoid/clients/options.rb +55 -250
  13. data/lib/mongoid/clients/storage_options.rb +1 -69
  14. data/lib/mongoid/composable.rb +29 -3
  15. data/lib/mongoid/config.rb +1 -0
  16. data/lib/mongoid/contextual/atomic.rb +5 -8
  17. data/lib/mongoid/contextual/map_reduce.rb +0 -4
  18. data/lib/mongoid/contextual/memory.rb +2 -2
  19. data/lib/mongoid/contextual/mongo.rb +40 -22
  20. data/lib/mongoid/contextual/none.rb +12 -0
  21. data/lib/mongoid/copyable.rb +13 -6
  22. data/lib/mongoid/criteria.rb +5 -2
  23. data/lib/mongoid/criteria/marshalable.rb +2 -2
  24. data/lib/mongoid/criteria/modifiable.rb +17 -1
  25. data/lib/mongoid/criteria/options.rb +25 -0
  26. data/lib/mongoid/criteria/queryable.rb +87 -0
  27. data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
  28. data/lib/mongoid/criteria/queryable/extensions.rb +28 -0
  29. data/lib/mongoid/criteria/queryable/extensions/array.rb +185 -0
  30. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +37 -0
  31. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +34 -0
  32. data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
  33. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +53 -0
  34. data/lib/mongoid/criteria/queryable/extensions/hash.rb +200 -0
  35. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +86 -0
  36. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +90 -0
  37. data/lib/mongoid/criteria/queryable/extensions/object.rb +206 -0
  38. data/lib/mongoid/criteria/queryable/extensions/range.rb +70 -0
  39. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +79 -0
  40. data/lib/mongoid/criteria/queryable/extensions/set.rb +34 -0
  41. data/lib/mongoid/criteria/queryable/extensions/string.rb +137 -0
  42. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +79 -0
  43. data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
  44. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +54 -0
  45. data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
  46. data/lib/mongoid/criteria/queryable/key.rb +103 -0
  47. data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
  48. data/lib/mongoid/criteria/queryable/mergeable.rb +271 -0
  49. data/lib/mongoid/criteria/queryable/optional.rb +429 -0
  50. data/lib/mongoid/criteria/queryable/options.rb +153 -0
  51. data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
  52. data/lib/mongoid/criteria/queryable/selectable.rb +662 -0
  53. data/lib/mongoid/criteria/queryable/selector.rb +212 -0
  54. data/lib/mongoid/criteria/queryable/smash.rb +104 -0
  55. data/lib/mongoid/document.rb +30 -37
  56. data/lib/mongoid/errors.rb +2 -0
  57. data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
  58. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -1
  59. data/lib/mongoid/errors/invalid_field.rb +2 -2
  60. data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
  61. data/lib/mongoid/errors/invalid_relation.rb +66 -0
  62. data/lib/mongoid/evolvable.rb +1 -1
  63. data/lib/mongoid/extensions.rb +0 -4
  64. data/lib/mongoid/extensions/big_decimal.rb +17 -8
  65. data/lib/mongoid/extensions/date.rb +4 -1
  66. data/lib/mongoid/extensions/decimal128.rb +3 -3
  67. data/lib/mongoid/extensions/hash.rb +1 -0
  68. data/lib/mongoid/extensions/string.rb +4 -3
  69. data/lib/mongoid/extensions/time.rb +4 -1
  70. data/lib/mongoid/fields/validators/macro.rb +18 -0
  71. data/lib/mongoid/findable.rb +2 -2
  72. data/lib/mongoid/indexable.rb +15 -13
  73. data/lib/mongoid/interceptable.rb +5 -22
  74. data/lib/mongoid/matchable.rb +13 -7
  75. data/lib/mongoid/matchable/all.rb +2 -2
  76. data/lib/mongoid/matchable/and.rb +3 -3
  77. data/lib/mongoid/matchable/default.rb +2 -2
  78. data/lib/mongoid/matchable/elem_match.rb +28 -0
  79. data/lib/mongoid/matchable/exists.rb +2 -2
  80. data/lib/mongoid/matchable/gt.rb +4 -2
  81. data/lib/mongoid/matchable/gte.rb +4 -2
  82. data/lib/mongoid/matchable/in.rb +2 -2
  83. data/lib/mongoid/matchable/lt.rb +4 -2
  84. data/lib/mongoid/matchable/lte.rb +4 -2
  85. data/lib/mongoid/matchable/ne.rb +2 -2
  86. data/lib/mongoid/matchable/nin.rb +2 -2
  87. data/lib/mongoid/matchable/or.rb +3 -3
  88. data/lib/mongoid/matchable/regexp.rb +3 -3
  89. data/lib/mongoid/matchable/size.rb +2 -2
  90. data/lib/mongoid/persistable.rb +3 -5
  91. data/lib/mongoid/persistable/creatable.rb +2 -2
  92. data/lib/mongoid/persistable/deletable.rb +1 -1
  93. data/lib/mongoid/persistable/settable.rb +1 -1
  94. data/lib/mongoid/persistable/updatable.rb +5 -12
  95. data/lib/mongoid/persistable/upsertable.rb +1 -1
  96. data/lib/mongoid/persistence_context.rb +215 -0
  97. data/lib/mongoid/query_cache.rb +3 -6
  98. data/lib/mongoid/relations/accessors.rb +3 -0
  99. data/lib/mongoid/relations/auto_save.rb +12 -4
  100. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -4
  101. data/lib/mongoid/relations/counter_cache.rb +15 -5
  102. data/lib/mongoid/relations/eager.rb +6 -11
  103. data/lib/mongoid/relations/eager/base.rb +3 -3
  104. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +2 -2
  105. data/lib/mongoid/relations/eager/has_many.rb +1 -1
  106. data/lib/mongoid/relations/embedded/batchable.rb +12 -36
  107. data/lib/mongoid/relations/embedded/in.rb +13 -1
  108. data/lib/mongoid/relations/embedded/many.rb +28 -10
  109. data/lib/mongoid/relations/embedded/one.rb +14 -1
  110. data/lib/mongoid/relations/macros.rb +9 -1
  111. data/lib/mongoid/relations/metadata.rb +3 -3
  112. data/lib/mongoid/relations/options.rb +2 -2
  113. data/lib/mongoid/relations/proxy.rb +1 -31
  114. data/lib/mongoid/relations/referenced/in.rb +19 -10
  115. data/lib/mongoid/relations/referenced/many.rb +23 -17
  116. data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
  117. data/lib/mongoid/relations/referenced/one.rb +15 -1
  118. data/lib/mongoid/relations/synchronization.rb +11 -11
  119. data/lib/mongoid/relations/touchable.rb +6 -3
  120. data/lib/mongoid/reloadable.rb +1 -1
  121. data/lib/mongoid/serializable.rb +1 -1
  122. data/lib/mongoid/traversable.rb +1 -1
  123. data/lib/mongoid/validatable/uniqueness.rb +1 -2
  124. data/lib/mongoid/version.rb +1 -1
  125. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +14 -3
  126. data/spec/app/models/album.rb +5 -1
  127. data/spec/app/models/artist.rb +21 -0
  128. data/spec/app/models/book.rb +2 -1
  129. data/spec/app/models/dokument.rb +1 -0
  130. data/spec/app/models/ordered_post.rb +5 -0
  131. data/spec/app/models/oscar.rb +1 -2
  132. data/spec/app/models/page.rb +1 -1
  133. data/spec/app/models/person.rb +3 -3
  134. data/spec/app/models/princess.rb +2 -0
  135. data/spec/app/models/record.rb +1 -0
  136. data/spec/app/models/subscription.rb +1 -0
  137. data/spec/app/models/thing.rb +1 -1
  138. data/spec/config/mongoid.yml +15 -0
  139. data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
  140. data/spec/mongoid/atomic_spec.rb +17 -17
  141. data/spec/mongoid/attributes/nested_spec.rb +14 -14
  142. data/spec/mongoid/attributes/readonly_spec.rb +87 -44
  143. data/spec/mongoid/attributes_spec.rb +90 -5
  144. data/spec/mongoid/cacheable_spec.rb +112 -0
  145. data/spec/mongoid/changeable_spec.rb +58 -0
  146. data/spec/mongoid/clients/factory_spec.rb +31 -3
  147. data/spec/mongoid/clients/options_spec.rb +382 -96
  148. data/spec/mongoid/clients_spec.rb +243 -101
  149. data/spec/mongoid/composable_spec.rb +7 -0
  150. data/spec/mongoid/config_spec.rb +67 -11
  151. data/spec/mongoid/contextual/atomic_spec.rb +3 -3
  152. data/spec/mongoid/contextual/mongo_spec.rb +165 -20
  153. data/spec/mongoid/contextual/none_spec.rb +15 -0
  154. data/spec/mongoid/copyable_spec.rb +13 -4
  155. data/spec/mongoid/criteria/modifiable_spec.rb +239 -7
  156. data/spec/mongoid/criteria/options_spec.rb +29 -0
  157. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
  158. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
  159. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
  160. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
  161. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
  162. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
  163. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
  164. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
  165. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
  166. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
  167. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
  168. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
  169. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
  170. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
  171. data/spec/mongoid/{extensions/origin → criteria/queryable/extensions}/regexp_raw_spec.rb +2 -2
  172. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +90 -0
  173. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
  174. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
  175. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
  176. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
  177. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
  178. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
  179. data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
  180. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
  181. data/spec/mongoid/criteria/queryable/optional_spec.rb +1799 -0
  182. data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
  183. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
  184. data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
  185. data/spec/mongoid/criteria/queryable/selectable_spec.rb +4174 -0
  186. data/spec/mongoid/criteria/queryable/selector_spec.rb +844 -0
  187. data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
  188. data/spec/mongoid/criteria_spec.rb +152 -21
  189. data/spec/mongoid/document_spec.rb +37 -88
  190. data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
  191. data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
  192. data/spec/mongoid/extensions/big_decimal_spec.rb +320 -18
  193. data/spec/mongoid/extensions/boolean_spec.rb +14 -0
  194. data/spec/mongoid/extensions/date_spec.rb +2 -6
  195. data/spec/mongoid/extensions/date_time_spec.rb +2 -6
  196. data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
  197. data/spec/mongoid/extensions/float_spec.rb +8 -1
  198. data/spec/mongoid/extensions/hash_spec.rb +15 -0
  199. data/spec/mongoid/extensions/integer_spec.rb +8 -1
  200. data/spec/mongoid/extensions/object_spec.rb +11 -0
  201. data/spec/mongoid/extensions/string_spec.rb +21 -0
  202. data/spec/mongoid/extensions/time_spec.rb +2 -6
  203. data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
  204. data/spec/mongoid/findable_spec.rb +46 -1
  205. data/spec/mongoid/indexable_spec.rb +15 -3
  206. data/spec/mongoid/interceptable_spec.rb +68 -10
  207. data/spec/mongoid/matchable/all_spec.rb +4 -4
  208. data/spec/mongoid/matchable/and_spec.rb +10 -10
  209. data/spec/mongoid/matchable/default_spec.rb +12 -12
  210. data/spec/mongoid/matchable/elem_match_spec.rb +86 -0
  211. data/spec/mongoid/matchable/exists_spec.rb +5 -5
  212. data/spec/mongoid/matchable/gt_spec.rb +18 -7
  213. data/spec/mongoid/matchable/gte_spec.rb +17 -7
  214. data/spec/mongoid/matchable/in_spec.rb +5 -5
  215. data/spec/mongoid/matchable/lt_spec.rb +18 -7
  216. data/spec/mongoid/matchable/lte_spec.rb +18 -7
  217. data/spec/mongoid/matchable/ne_spec.rb +5 -5
  218. data/spec/mongoid/matchable/nin_spec.rb +5 -5
  219. data/spec/mongoid/matchable/or_spec.rb +7 -7
  220. data/spec/mongoid/matchable/regexp_spec.rb +5 -5
  221. data/spec/mongoid/matchable/size_spec.rb +3 -3
  222. data/spec/mongoid/matchable_spec.rb +173 -53
  223. data/spec/mongoid/persistable/creatable_spec.rb +7 -2
  224. data/spec/mongoid/persistable/deletable_spec.rb +16 -1
  225. data/spec/mongoid/persistable/destroyable_spec.rb +6 -2
  226. data/spec/mongoid/persistable/savable_spec.rb +35 -30
  227. data/spec/mongoid/persistable/settable_spec.rb +45 -29
  228. data/spec/mongoid/persistable/updatable_spec.rb +184 -5
  229. data/spec/mongoid/persistence_context_spec.rb +680 -0
  230. data/spec/mongoid/positional_spec.rb +10 -10
  231. data/spec/mongoid/query_cache_spec.rb +89 -0
  232. data/spec/mongoid/relations/accessors_spec.rb +1 -1
  233. data/spec/mongoid/relations/auto_save_spec.rb +39 -6
  234. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +4 -4
  235. data/spec/mongoid/relations/builders_spec.rb +37 -10
  236. data/spec/mongoid/relations/counter_cache_spec.rb +64 -3
  237. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +16 -0
  238. data/spec/mongoid/relations/eager_spec.rb +40 -0
  239. data/spec/mongoid/relations/embedded/many_spec.rb +63 -47
  240. data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
  241. data/spec/mongoid/relations/macros_spec.rb +395 -7
  242. data/spec/mongoid/relations/metadata_spec.rb +15 -1
  243. data/spec/mongoid/relations/proxy_spec.rb +27 -1
  244. data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
  245. data/spec/mongoid/relations/referenced/many_spec.rb +13 -25
  246. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +14 -26
  247. data/spec/mongoid/relations/synchronization_spec.rb +48 -2
  248. data/spec/mongoid/relations/touchable_spec.rb +40 -0
  249. data/spec/mongoid/reloadable_spec.rb +51 -0
  250. data/spec/mongoid/serializable_spec.rb +0 -50
  251. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  252. data/spec/mongoid/validatable/uniqueness_spec.rb +18 -9
  253. data/spec/mongoid/validatable_spec.rb +16 -0
  254. data/spec/spec_helper.rb +20 -11
  255. metadata +524 -469
  256. checksums.yaml.gz.sig +0 -0
  257. data.tar.gz.sig +0 -0
  258. data/lib/mongoid/clients/thread_options.rb +0 -19
  259. data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
  260. metadata.gz.sig +0 -0
@@ -29,10 +29,10 @@ module Mongoid
29
29
 
30
30
  private
31
31
 
32
- # Get the origin of the method.
32
+ # Get the queryable of the method.
33
33
  #
34
34
  # @example Get the originating class or module.
35
- # error.origin(Person, :crazy_method_name)
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
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
3
 
4
- # Contains behaviour specific to evolving for origin queries.
4
+ # Contains behaviour specific to evolving for queryable queries.
5
5
  module Evolvable
6
6
 
7
7
  # Evolve the document into an object id.
@@ -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 [ Object ] The object.
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
- if object
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 big
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 ] The mongoized object.
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 : object
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
- EPOCH
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 5.2.0
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 5.2.0
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)
@@ -105,6 +105,7 @@ module Mongoid
105
105
  keys = string.split(".")
106
106
  value = self
107
107
  keys.each do |key|
108
+ return nil if value.nil?
108
109
  nested = value[key] || value[key.to_i]
109
110
  value = nested
110
111
  end
@@ -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 == "NaN")
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
- EPOCH
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.
@@ -6,12 +6,12 @@ module Mongoid
6
6
  #
7
7
  # @since 4.0.0
8
8
  module Findable
9
- extend Origin::Forwardable
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 the class level.
14
+ # directly from the class level.
15
15
  delegate \
16
16
  :aggregates,
17
17
  :avg,
@@ -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
- collection = with(database: database).collection
54
- begin
55
- collection.indexes.each do |spec|
56
- unless spec["name"] == "_id_"
57
- collection.indexes.drop_one(spec["key"])
58
- logger.info(
59
- "MONGOID: Removed index '#{spec["name"]}' on collection " +
60
- "'#{collection.name}' in database '#{database}'."
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
- rescue Mongo::Error::OperationFailure; end
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
- if Gem::Version.new("4.1.0") <= Gem::Version.new(ActiveSupport::VERSION::STRING)
264
- self.class.send :define_method, name do
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
@@ -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.matches?(:title => { "$in" => [ "test" ] })
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 matches?(selector)
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).matches?(item)
63
+ return false if matcher(self, key, item)._matches?(item)
62
64
  else
63
- return false unless matcher(self, key, Hash[*item]).matches?(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).matches?(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.as_document) do |_attribs, _key|
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.attributes[key_string]
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