mongoid 5.4.0 → 6.4.8

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 (301) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +3 -3
  4. data/Rakefile +26 -0
  5. data/lib/config/locales/en.yml +40 -0
  6. data/lib/mongoid/atomic/modifiers.rb +2 -2
  7. data/lib/mongoid/atomic.rb +5 -5
  8. data/lib/mongoid/attributes/readonly.rb +22 -0
  9. data/lib/mongoid/attributes.rb +22 -21
  10. data/lib/mongoid/cacheable.rb +36 -0
  11. data/lib/mongoid/changeable.rb +36 -0
  12. data/lib/mongoid/clients/options.rb +55 -250
  13. data/lib/mongoid/clients/sessions.rb +113 -0
  14. data/lib/mongoid/clients/storage_options.rb +2 -69
  15. data/lib/mongoid/clients.rb +10 -63
  16. data/lib/mongoid/composable.rb +29 -2
  17. data/lib/mongoid/config.rb +1 -0
  18. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  19. data/lib/mongoid/contextual/atomic.rb +4 -4
  20. data/lib/mongoid/contextual/map_reduce.rb +7 -3
  21. data/lib/mongoid/contextual/memory.rb +9 -4
  22. data/lib/mongoid/contextual/mongo.rb +65 -30
  23. data/lib/mongoid/contextual/none.rb +12 -0
  24. data/lib/mongoid/copyable.rb +13 -6
  25. data/lib/mongoid/criteria/marshalable.rb +2 -2
  26. data/lib/mongoid/criteria/modifiable.rb +29 -3
  27. data/lib/mongoid/criteria/options.rb +25 -0
  28. data/lib/mongoid/criteria/queryable/aggregable.rb +120 -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/extensions.rb +28 -0
  46. data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
  47. data/lib/mongoid/criteria/queryable/key.rb +103 -0
  48. data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
  49. data/lib/mongoid/criteria/queryable/mergeable.rb +273 -0
  50. data/lib/mongoid/criteria/queryable/optional.rb +429 -0
  51. data/lib/mongoid/criteria/queryable/options.rb +153 -0
  52. data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
  53. data/lib/mongoid/criteria/queryable/selectable.rb +689 -0
  54. data/lib/mongoid/criteria/queryable/selector.rb +212 -0
  55. data/lib/mongoid/criteria/queryable/smash.rb +104 -0
  56. data/lib/mongoid/criteria/queryable.rb +87 -0
  57. data/lib/mongoid/criteria.rb +6 -2
  58. data/lib/mongoid/document.rb +34 -41
  59. data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
  60. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -1
  61. data/lib/mongoid/errors/invalid_field.rb +2 -2
  62. data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
  63. data/lib/mongoid/errors/invalid_relation.rb +66 -0
  64. data/lib/mongoid/errors/invalid_session_use.rb +24 -0
  65. data/lib/mongoid/errors.rb +3 -0
  66. data/lib/mongoid/evolvable.rb +1 -1
  67. data/lib/mongoid/extensions/big_decimal.rb +17 -8
  68. data/lib/mongoid/extensions/date.rb +4 -1
  69. data/lib/mongoid/extensions/decimal128.rb +3 -3
  70. data/lib/mongoid/extensions/hash.rb +1 -0
  71. data/lib/mongoid/extensions/regexp.rb +1 -0
  72. data/lib/mongoid/extensions/string.rb +6 -3
  73. data/lib/mongoid/extensions/time.rb +4 -1
  74. data/lib/mongoid/extensions.rb +0 -4
  75. data/lib/mongoid/factory.rb +2 -1
  76. data/lib/mongoid/fields/validators/macro.rb +18 -0
  77. data/lib/mongoid/findable.rb +2 -2
  78. data/lib/mongoid/indexable.rb +16 -14
  79. data/lib/mongoid/interceptable.rb +9 -22
  80. data/lib/mongoid/matchable/all.rb +2 -2
  81. data/lib/mongoid/matchable/and.rb +3 -3
  82. data/lib/mongoid/matchable/default.rb +2 -2
  83. data/lib/mongoid/matchable/elem_match.rb +28 -0
  84. data/lib/mongoid/matchable/exists.rb +2 -2
  85. data/lib/mongoid/matchable/gt.rb +4 -2
  86. data/lib/mongoid/matchable/gte.rb +4 -2
  87. data/lib/mongoid/matchable/in.rb +2 -2
  88. data/lib/mongoid/matchable/lt.rb +4 -2
  89. data/lib/mongoid/matchable/lte.rb +4 -2
  90. data/lib/mongoid/matchable/ne.rb +2 -2
  91. data/lib/mongoid/matchable/nin.rb +2 -2
  92. data/lib/mongoid/matchable/nor.rb +37 -0
  93. data/lib/mongoid/matchable/or.rb +3 -3
  94. data/lib/mongoid/matchable/regexp.rb +3 -3
  95. data/lib/mongoid/matchable/size.rb +2 -2
  96. data/lib/mongoid/matchable.rb +16 -7
  97. data/lib/mongoid/persistable/creatable.rb +5 -3
  98. data/lib/mongoid/persistable/deletable.rb +5 -3
  99. data/lib/mongoid/persistable/destroyable.rb +1 -5
  100. data/lib/mongoid/persistable/settable.rb +5 -5
  101. data/lib/mongoid/persistable/updatable.rb +7 -14
  102. data/lib/mongoid/persistable/upsertable.rb +2 -1
  103. data/lib/mongoid/persistable.rb +4 -6
  104. data/lib/mongoid/persistence_context.rb +220 -0
  105. data/lib/mongoid/query_cache.rb +67 -23
  106. data/lib/mongoid/railtie.rb +17 -1
  107. data/lib/mongoid/railties/controller_runtime.rb +86 -0
  108. data/lib/mongoid/relations/accessors.rb +3 -0
  109. data/lib/mongoid/relations/auto_save.rb +12 -4
  110. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -4
  111. data/lib/mongoid/relations/counter_cache.rb +15 -5
  112. data/lib/mongoid/relations/eager/base.rb +3 -3
  113. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +2 -2
  114. data/lib/mongoid/relations/eager/has_many.rb +1 -1
  115. data/lib/mongoid/relations/eager.rb +6 -11
  116. data/lib/mongoid/relations/embedded/batchable.rb +20 -18
  117. data/lib/mongoid/relations/embedded/in.rb +13 -1
  118. data/lib/mongoid/relations/embedded/many.rb +51 -10
  119. data/lib/mongoid/relations/embedded/one.rb +14 -1
  120. data/lib/mongoid/relations/macros.rb +9 -1
  121. data/lib/mongoid/relations/many.rb +4 -0
  122. data/lib/mongoid/relations/metadata.rb +3 -3
  123. data/lib/mongoid/relations/options.rb +2 -2
  124. data/lib/mongoid/relations/proxy.rb +1 -31
  125. data/lib/mongoid/relations/referenced/in.rb +19 -10
  126. data/lib/mongoid/relations/referenced/many.rb +30 -26
  127. data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
  128. data/lib/mongoid/relations/referenced/one.rb +15 -1
  129. data/lib/mongoid/relations/synchronization.rb +12 -12
  130. data/lib/mongoid/relations/targets/enumerable.rb +24 -4
  131. data/lib/mongoid/relations/touchable.rb +7 -4
  132. data/lib/mongoid/reloadable.rb +2 -2
  133. data/lib/mongoid/scopable.rb +3 -3
  134. data/lib/mongoid/serializable.rb +1 -1
  135. data/lib/mongoid/stateful.rb +1 -0
  136. data/lib/mongoid/tasks/database.rb +3 -2
  137. data/lib/mongoid/threaded.rb +74 -0
  138. data/lib/mongoid/traversable.rb +1 -1
  139. data/lib/mongoid/validatable/uniqueness.rb +1 -2
  140. data/lib/mongoid/version.rb +1 -1
  141. data/lib/mongoid.rb +6 -6
  142. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +18 -3
  143. data/spec/app/models/agent.rb +2 -0
  144. data/spec/app/models/album.rb +5 -1
  145. data/spec/app/models/array_field.rb +7 -0
  146. data/spec/app/models/artist.rb +21 -0
  147. data/spec/app/models/band.rb +3 -0
  148. data/spec/app/models/book.rb +2 -1
  149. data/spec/app/models/delegating_patient.rb +16 -0
  150. data/spec/app/models/dokument.rb +1 -0
  151. data/spec/app/models/ordered_post.rb +5 -0
  152. data/spec/app/models/oscar.rb +1 -2
  153. data/spec/app/models/page.rb +1 -1
  154. data/spec/app/models/person.rb +3 -3
  155. data/spec/app/models/princess.rb +2 -0
  156. data/spec/app/models/record.rb +1 -0
  157. data/spec/app/models/subscription.rb +1 -0
  158. data/spec/app/models/thing.rb +1 -1
  159. data/spec/config/mongoid.yml +15 -0
  160. data/spec/integration/document_spec.rb +22 -0
  161. data/spec/mongoid/atomic/modifiers_spec.rb +3 -3
  162. data/spec/mongoid/atomic_spec.rb +5 -5
  163. data/spec/mongoid/attributes/nested_spec.rb +18 -14
  164. data/spec/mongoid/attributes/readonly_spec.rb +87 -44
  165. data/spec/mongoid/attributes_spec.rb +90 -5
  166. data/spec/mongoid/cacheable_spec.rb +112 -0
  167. data/spec/mongoid/changeable_spec.rb +58 -0
  168. data/spec/mongoid/clients/factory_spec.rb +80 -28
  169. data/spec/mongoid/clients/options_spec.rb +396 -95
  170. data/spec/mongoid/clients/sessions_spec.rb +334 -0
  171. data/spec/mongoid/clients_spec.rb +243 -101
  172. data/spec/mongoid/composable_spec.rb +7 -0
  173. data/spec/mongoid/config_spec.rb +67 -11
  174. data/spec/mongoid/contextual/atomic_spec.rb +3 -3
  175. data/spec/mongoid/contextual/geo_near_spec.rb +1 -0
  176. data/spec/mongoid/contextual/mongo_spec.rb +275 -22
  177. data/spec/mongoid/contextual/none_spec.rb +15 -0
  178. data/spec/mongoid/copyable_spec.rb +13 -4
  179. data/spec/mongoid/criteria/modifiable_spec.rb +297 -16
  180. data/spec/mongoid/criteria/options_spec.rb +29 -0
  181. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
  182. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
  183. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
  184. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
  185. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
  186. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
  187. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
  188. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
  189. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
  190. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
  191. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
  192. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
  193. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
  194. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
  195. data/spec/mongoid/{extensions/origin → criteria/queryable/extensions}/regexp_raw_spec.rb +2 -2
  196. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +90 -0
  197. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
  198. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
  199. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
  200. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
  201. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
  202. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
  203. data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
  204. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
  205. data/spec/mongoid/criteria/queryable/optional_spec.rb +1799 -0
  206. data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
  207. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
  208. data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
  209. data/spec/mongoid/criteria/queryable/selectable_spec.rb +4242 -0
  210. data/spec/mongoid/criteria/queryable/selector_spec.rb +844 -0
  211. data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
  212. data/spec/mongoid/criteria/scopable_spec.rb +81 -0
  213. data/spec/mongoid/criteria_spec.rb +156 -22
  214. data/spec/mongoid/document_spec.rb +100 -90
  215. data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
  216. data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
  217. data/spec/mongoid/extensions/big_decimal_spec.rb +321 -19
  218. data/spec/mongoid/extensions/boolean_spec.rb +14 -0
  219. data/spec/mongoid/extensions/date_spec.rb +2 -6
  220. data/spec/mongoid/extensions/date_time_spec.rb +2 -6
  221. data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
  222. data/spec/mongoid/extensions/float_spec.rb +8 -1
  223. data/spec/mongoid/extensions/hash_spec.rb +15 -0
  224. data/spec/mongoid/extensions/integer_spec.rb +8 -1
  225. data/spec/mongoid/extensions/object_spec.rb +11 -0
  226. data/spec/mongoid/extensions/regexp_spec.rb +23 -0
  227. data/spec/mongoid/extensions/string_spec.rb +53 -4
  228. data/spec/mongoid/extensions/time_spec.rb +2 -6
  229. data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
  230. data/spec/mongoid/factory_spec.rb +11 -0
  231. data/spec/mongoid/fields_spec.rb +1 -1
  232. data/spec/mongoid/findable_spec.rb +47 -2
  233. data/spec/mongoid/indexable_spec.rb +15 -3
  234. data/spec/mongoid/interceptable_spec.rb +85 -19
  235. data/spec/mongoid/matchable/all_spec.rb +4 -4
  236. data/spec/mongoid/matchable/and_spec.rb +10 -10
  237. data/spec/mongoid/matchable/default_spec.rb +12 -12
  238. data/spec/mongoid/matchable/elem_match_spec.rb +86 -0
  239. data/spec/mongoid/matchable/exists_spec.rb +5 -5
  240. data/spec/mongoid/matchable/gt_spec.rb +18 -7
  241. data/spec/mongoid/matchable/gte_spec.rb +17 -7
  242. data/spec/mongoid/matchable/in_spec.rb +5 -5
  243. data/spec/mongoid/matchable/lt_spec.rb +18 -7
  244. data/spec/mongoid/matchable/lte_spec.rb +18 -7
  245. data/spec/mongoid/matchable/ne_spec.rb +5 -5
  246. data/spec/mongoid/matchable/nin_spec.rb +5 -5
  247. data/spec/mongoid/matchable/nor_spec.rb +209 -0
  248. data/spec/mongoid/matchable/or_spec.rb +7 -7
  249. data/spec/mongoid/matchable/regexp_spec.rb +5 -5
  250. data/spec/mongoid/matchable/size_spec.rb +3 -3
  251. data/spec/mongoid/matchable_spec.rb +199 -54
  252. data/spec/mongoid/persistable/creatable_spec.rb +7 -2
  253. data/spec/mongoid/persistable/deletable_spec.rb +35 -1
  254. data/spec/mongoid/persistable/destroyable_spec.rb +25 -2
  255. data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
  256. data/spec/mongoid/persistable/savable_spec.rb +34 -29
  257. data/spec/mongoid/persistable/settable_spec.rb +77 -27
  258. data/spec/mongoid/persistable/updatable_spec.rb +182 -3
  259. data/spec/mongoid/persistable_spec.rb +16 -16
  260. data/spec/mongoid/persistence_context_spec.rb +694 -0
  261. data/spec/mongoid/positional_spec.rb +1 -1
  262. data/spec/mongoid/query_cache_spec.rb +170 -12
  263. data/spec/mongoid/relations/accessors_spec.rb +1 -1
  264. data/spec/mongoid/relations/auto_save_spec.rb +39 -6
  265. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +4 -4
  266. data/spec/mongoid/relations/builders_spec.rb +37 -10
  267. data/spec/mongoid/relations/counter_cache_spec.rb +64 -3
  268. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +16 -0
  269. data/spec/mongoid/relations/eager_spec.rb +40 -0
  270. data/spec/mongoid/relations/embedded/many_spec.rb +305 -59
  271. data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
  272. data/spec/mongoid/relations/macros_spec.rb +415 -7
  273. data/spec/mongoid/relations/metadata_spec.rb +15 -1
  274. data/spec/mongoid/relations/proxy_spec.rb +27 -1
  275. data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
  276. data/spec/mongoid/relations/referenced/many_spec.rb +35 -25
  277. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +14 -26
  278. data/spec/mongoid/relations/synchronization_spec.rb +48 -2
  279. data/spec/mongoid/relations/targets/enumerable_spec.rb +108 -0
  280. data/spec/mongoid/relations/touchable_spec.rb +40 -0
  281. data/spec/mongoid/reloadable_spec.rb +51 -0
  282. data/spec/mongoid/scopable_spec.rb +13 -0
  283. data/spec/mongoid/serializable_spec.rb +0 -50
  284. data/spec/mongoid/threaded_spec.rb +68 -0
  285. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  286. data/spec/mongoid/validatable/uniqueness_spec.rb +18 -9
  287. data/spec/mongoid/validatable_spec.rb +16 -0
  288. data/spec/rails/controller_extension/controller_runtime_spec.rb +110 -0
  289. data/spec/spec_helper.rb +101 -8
  290. data/spec/support/cluster_config.rb +158 -0
  291. data/spec/support/constraints.rb +101 -0
  292. data/spec/support/macros.rb +20 -0
  293. data/spec/support/session_registry.rb +50 -0
  294. data/spec/support/spec_config.rb +42 -0
  295. data.tar.gz.sig +0 -0
  296. metadata +163 -61
  297. metadata.gz.sig +0 -0
  298. data/lib/mongoid/clients/thread_options.rb +0 -19
  299. data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
  300. data/lib/mongoid/railties/document.rb +0 -12
  301. data/spec/mongoid/railties/document_spec.rb +0 -24
@@ -0,0 +1,24 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Errors
4
+
5
+ # This error is raised when a session is attempted to be used with a model whose client cannot use it, if
6
+ # sessions are nested, or if the mongodb deployment doesn't support sessions.
7
+ #
8
+ # @since 6.4.0
9
+ class InvalidSessionUse < MongoidError
10
+
11
+ # Create the error.
12
+ #
13
+ # @example Create the error.
14
+ # InvalidSessionUse.new(:invalid_session_use)
15
+ #
16
+ # @param [ :invalid_sesion_use, :invalid_session_nesting ] error_type The type of session misuse.
17
+ #
18
+ # @since 6.4.0
19
+ def initialize(error_type)
20
+ super(compose_message(error_type.to_s))
21
+ end
22
+ end
23
+ end
24
+ end
@@ -15,7 +15,10 @@ require "mongoid/errors/invalid_includes"
15
15
  require "mongoid/errors/invalid_index"
16
16
  require "mongoid/errors/invalid_options"
17
17
  require "mongoid/errors/invalid_path"
18
+ require "mongoid/errors/invalid_persistence_option"
19
+ require "mongoid/errors/invalid_relation"
18
20
  require "mongoid/errors/invalid_scope"
21
+ require "mongoid/errors/invalid_session_use"
19
22
  require "mongoid/errors/invalid_set_polymorphic_relation"
20
23
  require "mongoid/errors/invalid_storage_options"
21
24
  require "mongoid/errors/invalid_storage_parent"
@@ -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.
@@ -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(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
@@ -17,6 +17,7 @@ module Mongoid
17
17
  #
18
18
  # @since 3.0.0
19
19
  def mongoize(object)
20
+ return nil if object.nil?
20
21
  ::Regexp.new(object)
21
22
  end
22
23
  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,9 @@ module Mongoid
81
82
  #
82
83
  # @since 3.0.0
83
84
  def numeric?
84
- true if Float(self) rescue (self == "NaN")
85
+ !!Float(self)
86
+ rescue ArgumentError
87
+ (self =~ /\A(?:NaN|-?Infinity)\z/) == 0
85
88
  end
86
89
 
87
90
  # Get the string as a getter string.
@@ -117,7 +120,7 @@ module Mongoid
117
120
  #
118
121
  # @since 3.0.15
119
122
  def valid_method_name?
120
- /[@$"]/ !~ self
123
+ /[@$"-]/ !~ self
121
124
  end
122
125
 
123
126
  # 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
@@ -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"
@@ -17,7 +17,8 @@ module Mongoid
17
17
  #
18
18
  # @return [ Document ] The instantiated document.
19
19
  def build(klass, attributes = nil)
20
- type = (attributes || {})[TYPE]
20
+ attributes ||= {}
21
+ type = attributes[TYPE] || attributes[TYPE.to_sym]
21
22
  if type && klass._types.include?(type)
22
23
  type.constantize.new(attributes)
23
24
  else
@@ -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,10 +31,11 @@ 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(session: _session).create_one(key, options.except(:database))
36
+ end
36
37
  else
37
- collection.indexes.create_one(key, options)
38
+ collection.indexes(session: _session).create_one(key, options)
38
39
  end
39
40
  end and true
40
41
  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(session: _session).each do |spec|
57
+ unless spec["name"] == "_id_"
58
+ klass.collection.indexes(session: _session).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,15 @@ 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
+ env = ActiveSupport::Callbacks::Filters::Environment.new(self, false, nil)
258
+ sequence = chain.compile
259
+ sequence.invoke_before(env)
260
+ env.value = !env.halted
261
+ sequence.invoke_after(env)
262
+ env.value
276
263
  end
277
-
264
+ self.class.send :protected, name
278
265
  end
279
266
  send(name)
280
267
  end
@@ -8,12 +8,12 @@ module Mongoid
8
8
  # Return true if the attribute and first value in the hash are equal.
9
9
  #
10
10
  # @example Do the values match?
11
- # matcher.matches?({ :key => 10 })
11
+ # matcher._matches?({ :key => 10 })
12
12
  #
13
13
  # @param [ Hash ] value The values to check.
14
14
  #
15
15
  # @return [ true, false ] If the values match.
16
- def matches?(value)
16
+ def _matches?(value)
17
17
  first = first(value)
18
18
  return false if first.is_a?(Array) && first.empty?
19
19
 
@@ -8,19 +8,19 @@ module Mongoid
8
8
  # Does the supplied query match the attribute?
9
9
  #
10
10
  # @example Does this match?
11
- # matcher.matches?([ { field => value } ])
11
+ # matcher._matches?([ { field => value } ])
12
12
  #
13
13
  # @param [ Array ] conditions The or expression.
14
14
  #
15
15
  # @return [ true, false ] True if matches, false if not.
16
16
  #
17
17
  # @since 2.3.0
18
- def matches?(conditions)
18
+ def _matches?(conditions)
19
19
  conditions.each do |condition|
20
20
  condition.keys.each do |k|
21
21
  key = k
22
22
  value = condition[k]
23
- return false unless document.matches?(key => value)
23
+ return false unless document._matches?(key => value)
24
24
  end
25
25
  end
26
26
  true
@@ -24,14 +24,14 @@ module Mongoid
24
24
  # if the value is included.
25
25
  #
26
26
  # @example Does this value match?
27
- # default.matches?("value")
27
+ # default._matches?("value")
28
28
  #
29
29
  # @param [ Object ] value The value to check if it matches.
30
30
  #
31
31
  # @return [ true, false ] True if matches, false if not.
32
32
  #
33
33
  # @since 1.0.0
34
- def matches?(value)
34
+ def _matches?(value)
35
35
  attribute.is_a?(Array) && !value.is_a?(Array) ? attribute.any? { |_attribute| value === _attribute } : value === attribute
36
36
  end
37
37
 
@@ -0,0 +1,28 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Matchable
4
+
5
+ class ElemMatch < Default
6
+
7
+ # Return true if a given predicate matches a sub document entirely
8
+ #
9
+ # @example Do the values match?
10
+ # matcher._matches?({"$elemMatch" => {"a" => 1, "b" => 2}})
11
+ #
12
+ # @param [ Hash ] value The values to check.
13
+ #
14
+ # @return [ true, false ] If the values match.
15
+ def _matches?(value)
16
+ if !@attribute.is_a?(Array) || !value.kind_of?(Hash) || !value["$elemMatch"].kind_of?(Hash)
17
+ return false
18
+ end
19
+
20
+ return @attribute.any? do |sub_document|
21
+ value["$elemMatch"].all? do |k, v|
22
+ Matchable.matcher(sub_document, k, v)._matches?(v)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -10,12 +10,12 @@ module Mongoid
10
10
  # non-existence.
11
11
  #
12
12
  # @example Does anything exist?
13
- # matcher.matches?({ :key => 10 })
13
+ # matcher._matches?({ :key => 10 })
14
14
  #
15
15
  # @param [ Hash ] value The values to check.
16
16
  #
17
17
  # @return [ true, false ] If a value exists.
18
- def matches?(value)
18
+ def _matches?(value)
19
19
  @attribute.nil? != value.values.first
20
20
  end
21
21
  end
@@ -8,13 +8,15 @@ module Mongoid
8
8
  # Return true if the attribute is greater than the value.
9
9
  #
10
10
  # @example Do the values match?
11
- # matcher.matches?({ :key => 10 })
11
+ # matcher._matches?({ :key => 10 })
12
12
  #
13
13
  # @param [ Hash ] value The values to check.
14
14
  #
15
15
  # @return [ true, false ] If a value exists.
16
- def matches?(value)
16
+ def _matches?(value)
17
17
  determine(value, :>)
18
+ rescue ArgumentError
19
+ false
18
20
  end
19
21
  end
20
22
  end
@@ -8,13 +8,15 @@ module Mongoid
8
8
  # Return true if the attribute is greater than or equal to the value.
9
9
  #
10
10
  # @example Do the values match?
11
- # matcher.matches?({ :key => 10 })
11
+ # matcher._matches?({ :key => 10 })
12
12
  #
13
13
  # @param [ Hash ] value The values to check.
14
14
  #
15
15
  # @return [ true, false ] If a value exists.
16
- def matches?(value)
16
+ def _matches?(value)
17
17
  determine(value, :>=)
18
+ rescue ArgumentError
19
+ false
18
20
  end
19
21
  end
20
22
  end
@@ -8,12 +8,12 @@ module Mongoid
8
8
  # Return true if the attribute is in the values.
9
9
  #
10
10
  # @example Do the values match?
11
- # matcher.matches?({ :key => 10 })
11
+ # matcher._matches?({ :key => 10 })
12
12
  #
13
13
  # @param [ Hash ] value The values to check.
14
14
  #
15
15
  # @return [ true, false ] If a value exists.
16
- def matches?(value)
16
+ def _matches?(value)
17
17
  attribute_array = @attribute.nil? ? [nil] : Array.wrap(@attribute)
18
18
  value.values.first.any? do |e|
19
19
  attribute_array.any? { |_attribute| e === _attribute }
@@ -8,13 +8,15 @@ module Mongoid
8
8
  # Return true if the attribute is less than the value.
9
9
  #
10
10
  # @example Do the values match?
11
- # matcher.matches?({ :key => 10 })
11
+ # matcher._matches?({ :key => 10 })
12
12
  #
13
13
  # @param [ Hash ] value The values to check.
14
14
  #
15
15
  # @return [ true, false ] If a value exists.
16
- def matches?(value)
16
+ def _matches?(value)
17
17
  determine(value, :<)
18
+ rescue ArgumentError
19
+ false
18
20
  end
19
21
  end
20
22
  end
@@ -8,13 +8,15 @@ module Mongoid
8
8
  # Return true if the attribute is less than or equal to the value.
9
9
  #
10
10
  # @example Do the values match?
11
- # matcher.matches?({ :key => 10 })
11
+ # matcher._matches?({ :key => 10 })
12
12
  #
13
13
  # @param [ Hash ] value The values to check.
14
14
  #
15
15
  # @return [ true, false ] If a value exists.
16
- def matches?(value)
16
+ def _matches?(value)
17
17
  determine(value, :<=)
18
+ rescue ArgumentError
19
+ false
18
20
  end
19
21
  end
20
22
  end
@@ -8,12 +8,12 @@ module Mongoid
8
8
  # Return true if the attribute and first value are not equal.
9
9
  #
10
10
  # @example Do the values match?
11
- # matcher.matches?({ :key => 10 })
11
+ # matcher._matches?({ :key => 10 })
12
12
  #
13
13
  # @param [ Hash ] value The values to check.
14
14
  #
15
15
  # @return [ true, false ] If a value exists.
16
- def matches?(value)
16
+ def _matches?(value)
17
17
  !super(value.values.first)
18
18
  end
19
19
  end
@@ -8,12 +8,12 @@ module Mongoid
8
8
  # Return true if the attribute is not in the value list.
9
9
  #
10
10
  # @example Do the values match?
11
- # matcher.matches?({ :key => 10 })
11
+ # matcher._matches?({ :key => 10 })
12
12
  #
13
13
  # @param [ Hash ] value The values to check.
14
14
  #
15
15
  # @return [ true, false ] If a value exists.
16
- def matches?(value)
16
+ def _matches?(value)
17
17
  attribute_array = @attribute.nil? ? [nil] : Array.wrap(@attribute)
18
18
  attribute_array.none? { |e| value.values.first.include?(e) }
19
19
  end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+ module Mongoid
4
+ module Matchable
5
+
6
+ # Defines behavior for handling $nor expressions in embedded documents.
7
+ class Nor < Default
8
+
9
+ # Does the supplied query match the attribute?
10
+ #
11
+ # Note: an empty array as an argument to $nor is prohibited by
12
+ # MongoDB server. Mongoid does allow this and returns false in this case.
13
+ #
14
+ # @example Does this match?
15
+ # matcher._matches?("$nor" => [ { field => value } ])
16
+ #
17
+ # @param [ Array ] conditions The or expression.
18
+ #
19
+ # @return [ true, false ] True if matches, false if not.
20
+ #
21
+ # @since 6.4.2/7.0.2/7.1.0
22
+ def _matches?(conditions)
23
+ if conditions.length == 0
24
+ # MongoDB does not allow $nor array to be empty, but
25
+ # Mongoid accepts an empty array for $or which MongoDB also
26
+ # prohibits
27
+ return false
28
+ end
29
+ conditions.none? do |condition|
30
+ condition.all? do |key, value|
31
+ document._matches?(key => value)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end