mongoid 8.1.13 → 9.0.0

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 (1031) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +1 -0
  3. data/LICENSE +1 -1
  4. data/README.md +4 -9
  5. data/Rakefile +62 -44
  6. data/lib/config/locales/en.yml +66 -31
  7. data/lib/mongoid/association/accessors.rb +16 -20
  8. data/lib/mongoid/association/bindable.rb +27 -8
  9. data/lib/mongoid/association/builders.rb +3 -2
  10. data/lib/mongoid/association/constrainable.rb +1 -0
  11. data/lib/mongoid/association/depending.rb +20 -9
  12. data/lib/mongoid/association/eager.rb +160 -0
  13. data/lib/mongoid/association/eager_loadable.rb +15 -7
  14. data/lib/mongoid/association/embedded/batchable.rb +16 -18
  15. data/lib/mongoid/association/embedded/cyclic.rb +1 -0
  16. data/lib/mongoid/association/embedded/eager.rb +23 -0
  17. data/lib/mongoid/association/embedded/embedded_in/binding.rb +5 -4
  18. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +1 -0
  19. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +21 -7
  20. data/lib/mongoid/association/embedded/embedded_in.rb +7 -0
  21. data/lib/mongoid/association/embedded/embeds_many/binding.rb +3 -2
  22. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -0
  23. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +134 -205
  24. data/lib/mongoid/association/embedded/embeds_many.rb +1 -0
  25. data/lib/mongoid/association/embedded/embeds_one/binding.rb +3 -2
  26. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +1 -0
  27. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +113 -55
  28. data/lib/mongoid/association/embedded/embeds_one.rb +1 -0
  29. data/lib/mongoid/association/embedded.rb +2 -0
  30. data/lib/mongoid/association/macros.rb +17 -14
  31. data/lib/mongoid/association/many.rb +1 -0
  32. data/lib/mongoid/association/marshalable.rb +4 -0
  33. data/lib/mongoid/association/nested/many.rb +11 -41
  34. data/lib/mongoid/association/nested/nested_buildable.rb +32 -14
  35. data/lib/mongoid/association/nested/one.rb +6 -3
  36. data/lib/mongoid/association/nested.rb +1 -0
  37. data/lib/mongoid/association/one.rb +1 -0
  38. data/lib/mongoid/association/options.rb +9 -2
  39. data/lib/mongoid/association/proxy.rb +30 -18
  40. data/lib/mongoid/association/referenced/auto_save.rb +6 -2
  41. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  42. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -0
  43. data/lib/mongoid/association/referenced/belongs_to/eager.rb +2 -1
  44. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +19 -14
  45. data/lib/mongoid/association/referenced/belongs_to.rb +2 -1
  46. data/lib/mongoid/association/referenced/counter_cache.rb +7 -2
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +15 -3
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +1 -0
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -1
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +132 -94
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +8 -3
  52. data/lib/mongoid/association/referenced/has_many/binding.rb +1 -0
  53. data/lib/mongoid/association/referenced/has_many/buildable.rb +1 -0
  54. data/lib/mongoid/association/referenced/has_many/eager.rb +2 -1
  55. data/lib/mongoid/association/referenced/has_many/enumerable.rb +43 -27
  56. data/lib/mongoid/association/referenced/has_many/proxy.rb +132 -204
  57. data/lib/mongoid/association/referenced/has_many.rb +2 -1
  58. data/lib/mongoid/association/referenced/has_one/binding.rb +1 -0
  59. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -0
  60. data/lib/mongoid/association/referenced/has_one/eager.rb +3 -3
  61. data/lib/mongoid/association/referenced/has_one/proxy.rb +37 -28
  62. data/lib/mongoid/association/referenced/has_one.rb +5 -1
  63. data/lib/mongoid/association/referenced/syncable.rb +7 -6
  64. data/lib/mongoid/association/referenced.rb +1 -0
  65. data/lib/mongoid/association/reflections.rb +5 -4
  66. data/lib/mongoid/association/relatable.rb +10 -4
  67. data/lib/mongoid/association.rb +5 -0
  68. data/lib/mongoid/atomic/modifiers.rb +1 -0
  69. data/lib/mongoid/atomic/paths/embedded/many.rb +2 -1
  70. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -0
  71. data/lib/mongoid/atomic/paths/embedded.rb +1 -0
  72. data/lib/mongoid/atomic/paths/root.rb +1 -0
  73. data/lib/mongoid/atomic/paths.rb +1 -0
  74. data/lib/mongoid/atomic.rb +23 -62
  75. data/lib/mongoid/atomic_update_preparer.rb +88 -0
  76. data/lib/mongoid/attributes/dynamic.rb +1 -0
  77. data/lib/mongoid/attributes/embedded.rb +34 -0
  78. data/lib/mongoid/attributes/nested.rb +3 -2
  79. data/lib/mongoid/attributes/processing.rb +11 -10
  80. data/lib/mongoid/attributes/projector.rb +1 -0
  81. data/lib/mongoid/attributes/readonly.rb +4 -8
  82. data/lib/mongoid/attributes.rb +6 -4
  83. data/lib/mongoid/cacheable.rb +2 -1
  84. data/lib/mongoid/changeable.rb +58 -49
  85. data/lib/mongoid/clients/factory.rb +37 -5
  86. data/lib/mongoid/clients/options.rb +113 -3
  87. data/lib/mongoid/clients/sessions.rb +245 -64
  88. data/lib/mongoid/clients/storage_options.rb +37 -1
  89. data/lib/mongoid/clients/validators/storage.rb +1 -0
  90. data/lib/mongoid/clients/validators.rb +1 -0
  91. data/lib/mongoid/clients.rb +36 -4
  92. data/lib/mongoid/collection_configurable.rb +1 -0
  93. data/lib/mongoid/composable.rb +5 -0
  94. data/lib/mongoid/config/defaults.rb +16 -36
  95. data/lib/mongoid/config/encryption.rb +213 -0
  96. data/lib/mongoid/config/environment.rb +2 -5
  97. data/lib/mongoid/config/introspection.rb +152 -0
  98. data/lib/mongoid/config/options.rb +8 -3
  99. data/lib/mongoid/config/validators/async_query_executor.rb +12 -2
  100. data/lib/mongoid/config/validators/client.rb +1 -0
  101. data/lib/mongoid/config/validators/option.rb +1 -0
  102. data/lib/mongoid/config/validators.rb +1 -0
  103. data/lib/mongoid/config.rb +57 -153
  104. data/lib/mongoid/contextual/aggregable/memory.rb +3 -5
  105. data/lib/mongoid/contextual/aggregable/mongo.rb +2 -5
  106. data/lib/mongoid/contextual/aggregable/none.rb +1 -0
  107. data/lib/mongoid/contextual/aggregable.rb +1 -0
  108. data/lib/mongoid/contextual/atomic.rb +98 -11
  109. data/lib/mongoid/contextual/command.rb +3 -0
  110. data/lib/mongoid/contextual/map_reduce.rb +6 -0
  111. data/lib/mongoid/contextual/memory.rb +52 -60
  112. data/lib/mongoid/contextual/mongo/documents_loader.rb +3 -2
  113. data/lib/mongoid/contextual/mongo.rb +33 -61
  114. data/lib/mongoid/contextual/none.rb +15 -32
  115. data/lib/mongoid/contextual/queryable.rb +4 -0
  116. data/lib/mongoid/contextual.rb +4 -0
  117. data/lib/mongoid/copyable.rb +3 -2
  118. data/lib/mongoid/criteria/findable.rb +44 -4
  119. data/lib/mongoid/criteria/includable.rb +5 -4
  120. data/lib/mongoid/criteria/inspectable.rb +4 -0
  121. data/lib/mongoid/criteria/marshalable.rb +4 -0
  122. data/lib/mongoid/criteria/modifiable.rb +5 -0
  123. data/lib/mongoid/criteria/options.rb +1 -0
  124. data/lib/mongoid/criteria/permission.rb +5 -0
  125. data/lib/mongoid/criteria/queryable/aggregable.rb +1 -0
  126. data/lib/mongoid/criteria/queryable/expandable.rb +1 -0
  127. data/lib/mongoid/criteria/queryable/extensions/array.rb +2 -1
  128. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +3 -5
  129. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -1
  130. data/lib/mongoid/criteria/queryable/extensions/date.rb +4 -3
  131. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +2 -1
  132. data/lib/mongoid/criteria/queryable/extensions/hash.rb +2 -1
  133. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +2 -1
  134. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +3 -16
  135. data/lib/mongoid/criteria/queryable/extensions/object.rb +4 -1
  136. data/lib/mongoid/criteria/queryable/extensions/range.rb +2 -1
  137. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +7 -1
  138. data/lib/mongoid/criteria/queryable/extensions/set.rb +2 -1
  139. data/lib/mongoid/criteria/queryable/extensions/string.rb +15 -3
  140. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +2 -1
  141. data/lib/mongoid/criteria/queryable/extensions/time.rb +2 -1
  142. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +3 -1
  143. data/lib/mongoid/criteria/queryable/extensions.rb +1 -0
  144. data/lib/mongoid/criteria/queryable/key.rb +10 -0
  145. data/lib/mongoid/criteria/queryable/macroable.rb +1 -0
  146. data/lib/mongoid/criteria/queryable/mergeable.rb +1 -12
  147. data/lib/mongoid/criteria/queryable/optional.rb +1 -0
  148. data/lib/mongoid/criteria/queryable/options.rb +1 -0
  149. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -0
  150. data/lib/mongoid/criteria/queryable/selectable.rb +12 -136
  151. data/lib/mongoid/criteria/queryable/selector.rb +5 -2
  152. data/lib/mongoid/criteria/queryable/smash.rb +1 -0
  153. data/lib/mongoid/criteria/queryable/storable.rb +4 -3
  154. data/lib/mongoid/criteria/queryable.rb +1 -0
  155. data/lib/mongoid/criteria/scopable.rb +5 -0
  156. data/lib/mongoid/criteria/translator.rb +1 -0
  157. data/lib/mongoid/criteria.rb +37 -10
  158. data/lib/mongoid/deprecable.rb +1 -0
  159. data/lib/mongoid/deprecation.rb +8 -4
  160. data/lib/mongoid/document.rb +171 -125
  161. data/lib/mongoid/encryptable.rb +53 -0
  162. data/lib/mongoid/equality.rb +2 -22
  163. data/lib/mongoid/errors/ambiguous_relationship.rb +1 -0
  164. data/lib/mongoid/errors/attribute_not_loaded.rb +34 -0
  165. data/lib/mongoid/errors/callback.rb +1 -0
  166. data/lib/mongoid/errors/create_collection_failure.rb +1 -0
  167. data/lib/mongoid/errors/criteria_argument_required.rb +1 -0
  168. data/lib/mongoid/errors/delete_restriction.rb +1 -0
  169. data/lib/mongoid/errors/document_not_destroyed.rb +1 -0
  170. data/lib/mongoid/errors/document_not_found.rb +1 -0
  171. data/lib/mongoid/errors/drop_collection_failure.rb +1 -0
  172. data/lib/mongoid/errors/empty_config_file.rb +1 -0
  173. data/lib/mongoid/errors/immutable_attribute.rb +1 -0
  174. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -0
  175. data/lib/mongoid/errors/invalid_async_query_executor.rb +1 -0
  176. data/lib/mongoid/errors/invalid_auto_encryption_configuration.rb +33 -0
  177. data/lib/mongoid/errors/invalid_collection.rb +1 -0
  178. data/lib/mongoid/errors/invalid_config_file.rb +1 -0
  179. data/lib/mongoid/errors/invalid_config_option.rb +1 -0
  180. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -0
  181. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +1 -0
  182. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +1 -0
  183. data/lib/mongoid/errors/invalid_elem_match_operator.rb +1 -0
  184. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +6 -4
  185. data/lib/mongoid/errors/invalid_estimated_count_scoping.rb +27 -0
  186. data/lib/mongoid/errors/invalid_expression_operator.rb +1 -0
  187. data/lib/mongoid/errors/invalid_field.rb +1 -0
  188. data/lib/mongoid/errors/invalid_field_operator.rb +1 -0
  189. data/lib/mongoid/errors/invalid_field_option.rb +1 -0
  190. data/lib/mongoid/errors/invalid_field_type.rb +1 -0
  191. data/lib/mongoid/errors/invalid_find.rb +1 -0
  192. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +1 -0
  193. data/lib/mongoid/errors/invalid_includes.rb +1 -0
  194. data/lib/mongoid/errors/invalid_index.rb +1 -0
  195. data/lib/mongoid/errors/invalid_options.rb +1 -0
  196. data/lib/mongoid/errors/invalid_path.rb +1 -0
  197. data/lib/mongoid/errors/invalid_persistence_option.rb +1 -0
  198. data/lib/mongoid/errors/invalid_query.rb +1 -0
  199. data/lib/mongoid/errors/invalid_relation.rb +1 -0
  200. data/lib/mongoid/errors/invalid_relation_option.rb +1 -0
  201. data/lib/mongoid/errors/invalid_scope.rb +1 -0
  202. data/lib/mongoid/errors/invalid_session_nesting.rb +17 -0
  203. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +1 -1
  204. data/lib/mongoid/errors/invalid_storage_options.rb +1 -0
  205. data/lib/mongoid/errors/invalid_time.rb +1 -0
  206. data/lib/mongoid/errors/invalid_transaction_nesting.rb +17 -0
  207. data/lib/mongoid/errors/inverse_not_found.rb +1 -0
  208. data/lib/mongoid/errors/mixed_client_configuration.rb +1 -0
  209. data/lib/mongoid/errors/mixed_relations.rb +1 -0
  210. data/lib/mongoid/errors/mongoid_error.rb +4 -3
  211. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -0
  212. data/lib/mongoid/errors/no_client_config.rb +1 -0
  213. data/lib/mongoid/errors/no_client_database.rb +1 -0
  214. data/lib/mongoid/errors/no_client_hosts.rb +1 -0
  215. data/lib/mongoid/errors/no_clients_config.rb +1 -0
  216. data/lib/mongoid/errors/no_default_client.rb +1 -0
  217. data/lib/mongoid/errors/no_environment.rb +1 -0
  218. data/lib/mongoid/errors/no_map_reduce_output.rb +1 -0
  219. data/lib/mongoid/errors/no_metadata.rb +1 -0
  220. data/lib/mongoid/errors/no_parent.rb +1 -0
  221. data/lib/mongoid/errors/readonly_attribute.rb +1 -0
  222. data/lib/mongoid/errors/readonly_document.rb +1 -0
  223. data/lib/mongoid/errors/rollback.rb +15 -0
  224. data/lib/mongoid/errors/scope_overwrite.rb +1 -0
  225. data/lib/mongoid/errors/sessions_not_supported.rb +17 -0
  226. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -0
  227. data/lib/mongoid/errors/transaction_error.rb +25 -0
  228. data/lib/mongoid/errors/transactions_not_supported.rb +17 -0
  229. data/lib/mongoid/errors/unknown_attribute.rb +1 -0
  230. data/lib/mongoid/errors/unknown_model.rb +1 -0
  231. data/lib/mongoid/errors/unsaved_document.rb +1 -0
  232. data/lib/mongoid/errors/unsupported_javascript.rb +1 -0
  233. data/lib/mongoid/errors/validations.rb +1 -0
  234. data/lib/mongoid/errors.rb +10 -2
  235. data/lib/mongoid/evolvable.rb +1 -0
  236. data/lib/mongoid/extensions/array.rb +10 -24
  237. data/lib/mongoid/extensions/big_decimal.rb +14 -6
  238. data/lib/mongoid/extensions/binary.rb +3 -0
  239. data/lib/mongoid/extensions/boolean.rb +3 -0
  240. data/lib/mongoid/extensions/date.rb +7 -2
  241. data/lib/mongoid/extensions/date_time.rb +4 -6
  242. data/lib/mongoid/extensions/decimal128.rb +3 -0
  243. data/lib/mongoid/extensions/false_class.rb +5 -2
  244. data/lib/mongoid/extensions/float.rb +4 -1
  245. data/lib/mongoid/extensions/hash.rb +21 -169
  246. data/lib/mongoid/extensions/integer.rb +6 -1
  247. data/lib/mongoid/extensions/module.rb +4 -1
  248. data/lib/mongoid/extensions/nil_class.rb +5 -2
  249. data/lib/mongoid/extensions/object.rb +23 -35
  250. data/lib/mongoid/extensions/object_id.rb +3 -0
  251. data/lib/mongoid/extensions/range.rb +9 -6
  252. data/lib/mongoid/extensions/raw_value.rb +34 -0
  253. data/lib/mongoid/extensions/regexp.rb +3 -0
  254. data/lib/mongoid/extensions/set.rb +13 -2
  255. data/lib/mongoid/extensions/string.rb +18 -10
  256. data/lib/mongoid/extensions/symbol.rb +5 -0
  257. data/lib/mongoid/extensions/time.rb +7 -19
  258. data/lib/mongoid/extensions/time_with_zone.rb +6 -2
  259. data/lib/mongoid/extensions/true_class.rb +5 -2
  260. data/lib/mongoid/extensions.rb +2 -32
  261. data/lib/mongoid/factory.rb +134 -40
  262. data/lib/mongoid/fields/encrypted.rb +48 -0
  263. data/lib/mongoid/fields/foreign_key.rb +29 -3
  264. data/lib/mongoid/fields/localized.rb +6 -0
  265. data/lib/mongoid/fields/standard.rb +5 -0
  266. data/lib/mongoid/fields/validators/macro.rb +3 -1
  267. data/lib/mongoid/fields/validators.rb +1 -0
  268. data/lib/mongoid/fields.rb +41 -46
  269. data/lib/mongoid/findable.rb +2 -2
  270. data/lib/mongoid/indexable/specification.rb +55 -19
  271. data/lib/mongoid/indexable/validators/options.rb +1 -0
  272. data/lib/mongoid/indexable.rb +1 -0
  273. data/lib/mongoid/inspectable.rb +32 -0
  274. data/lib/mongoid/interceptable.rb +18 -8
  275. data/lib/mongoid/loadable.rb +83 -0
  276. data/lib/mongoid/loggable.rb +1 -0
  277. data/lib/mongoid/matchable.rb +2 -6
  278. data/lib/mongoid/matcher/all.rb +15 -0
  279. data/lib/mongoid/matcher/and.rb +14 -0
  280. data/lib/mongoid/matcher/bits.rb +19 -0
  281. data/lib/mongoid/matcher/bits_all_clear.rb +21 -0
  282. data/lib/mongoid/matcher/bits_all_set.rb +21 -0
  283. data/lib/mongoid/matcher/bits_any_clear.rb +21 -0
  284. data/lib/mongoid/matcher/bits_any_set.rb +21 -0
  285. data/lib/mongoid/matcher/elem_match.rb +15 -0
  286. data/lib/mongoid/matcher/elem_match_expression.rb +14 -2
  287. data/lib/mongoid/matcher/eq.rb +15 -0
  288. data/lib/mongoid/matcher/eq_impl.rb +33 -16
  289. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +19 -5
  290. data/lib/mongoid/matcher/exists.rb +15 -0
  291. data/lib/mongoid/matcher/expression.rb +13 -0
  292. data/lib/mongoid/matcher/expression_operator.rb +14 -0
  293. data/lib/mongoid/matcher/field_expression.rb +15 -0
  294. data/lib/mongoid/matcher/field_operator.rb +24 -0
  295. data/lib/mongoid/matcher/gt.rb +15 -0
  296. data/lib/mongoid/matcher/gte.rb +15 -0
  297. data/lib/mongoid/matcher/in.rb +15 -0
  298. data/lib/mongoid/matcher/lt.rb +15 -0
  299. data/lib/mongoid/matcher/lte.rb +15 -0
  300. data/lib/mongoid/matcher/mod.rb +16 -0
  301. data/lib/mongoid/matcher/ne.rb +15 -0
  302. data/lib/mongoid/matcher/nin.rb +15 -0
  303. data/lib/mongoid/matcher/nor.rb +14 -0
  304. data/lib/mongoid/matcher/not.rb +16 -0
  305. data/lib/mongoid/matcher/or.rb +14 -0
  306. data/lib/mongoid/matcher/regex.rb +33 -8
  307. data/lib/mongoid/matcher/size.rb +16 -0
  308. data/lib/mongoid/matcher/type.rb +25 -0
  309. data/lib/mongoid/matcher.rb +5 -16
  310. data/lib/mongoid/persistable/creatable.rb +14 -9
  311. data/lib/mongoid/persistable/deletable.rb +7 -2
  312. data/lib/mongoid/persistable/destroyable.rb +34 -7
  313. data/lib/mongoid/persistable/incrementable.rb +2 -1
  314. data/lib/mongoid/persistable/logical.rb +1 -0
  315. data/lib/mongoid/persistable/maxable.rb +37 -0
  316. data/lib/mongoid/persistable/minable.rb +37 -0
  317. data/lib/mongoid/persistable/multipliable.rb +36 -0
  318. data/lib/mongoid/persistable/poppable.rb +1 -0
  319. data/lib/mongoid/persistable/pullable.rb +1 -0
  320. data/lib/mongoid/persistable/pushable.rb +1 -0
  321. data/lib/mongoid/persistable/renamable.rb +1 -0
  322. data/lib/mongoid/persistable/savable.rb +1 -0
  323. data/lib/mongoid/persistable/settable.rb +1 -0
  324. data/lib/mongoid/persistable/unsettable.rb +1 -0
  325. data/lib/mongoid/persistable/updatable.rb +37 -18
  326. data/lib/mongoid/persistable/upsertable.rb +20 -7
  327. data/lib/mongoid/persistable.rb +11 -1
  328. data/lib/mongoid/persistence_context.rb +46 -6
  329. data/lib/mongoid/positional.rb +1 -0
  330. data/lib/mongoid/railtie.rb +24 -1
  331. data/lib/mongoid/railties/bson_object_id_serializer.rb +39 -0
  332. data/lib/mongoid/railties/console_sandbox.rb +42 -0
  333. data/lib/mongoid/railties/controller_runtime.rb +20 -4
  334. data/lib/mongoid/railties/database.rake +12 -0
  335. data/lib/mongoid/reloadable.rb +38 -30
  336. data/lib/mongoid/scopable.rb +19 -23
  337. data/lib/mongoid/search_indexable.rb +167 -0
  338. data/lib/mongoid/selectable.rb +1 -0
  339. data/lib/mongoid/serializable.rb +8 -7
  340. data/lib/mongoid/shardable.rb +1 -0
  341. data/lib/mongoid/stateful.rb +9 -3
  342. data/lib/mongoid/stringified_symbol.rb +19 -6
  343. data/lib/mongoid/tasks/database.rake +13 -0
  344. data/lib/mongoid/tasks/database.rb +63 -0
  345. data/lib/mongoid/tasks/encryption.rake +59 -0
  346. data/lib/mongoid/tasks/encryption.rb +108 -0
  347. data/lib/mongoid/threaded/lifecycle.rb +1 -0
  348. data/lib/mongoid/threaded.rb +94 -33
  349. data/lib/mongoid/timestamps/created/short.rb +1 -0
  350. data/lib/mongoid/timestamps/created.rb +5 -11
  351. data/lib/mongoid/timestamps/short.rb +1 -0
  352. data/lib/mongoid/timestamps/timeless.rb +29 -0
  353. data/lib/mongoid/timestamps/updated/short.rb +1 -0
  354. data/lib/mongoid/timestamps/updated.rb +2 -1
  355. data/lib/mongoid/timestamps.rb +1 -0
  356. data/lib/mongoid/touchable.rb +154 -49
  357. data/lib/mongoid/traversable.rb +127 -122
  358. data/lib/mongoid/utils.rb +32 -2
  359. data/lib/mongoid/validatable/associated.rb +3 -5
  360. data/lib/mongoid/validatable/format.rb +1 -0
  361. data/lib/mongoid/validatable/length.rb +1 -0
  362. data/lib/mongoid/validatable/localizable.rb +1 -0
  363. data/lib/mongoid/validatable/macros.rb +5 -15
  364. data/lib/mongoid/validatable/presence.rb +1 -0
  365. data/lib/mongoid/validatable/queryable.rb +9 -0
  366. data/lib/mongoid/validatable/uniqueness.rb +2 -1
  367. data/lib/mongoid/validatable.rb +3 -3
  368. data/lib/mongoid/version.rb +2 -5
  369. data/lib/mongoid/warnings.rb +9 -17
  370. data/lib/mongoid.rb +38 -5
  371. data/lib/rails/generators/mongoid/config/config_generator.rb +17 -3
  372. data/lib/rails/generators/mongoid/config/templates/mongoid.rb +25 -0
  373. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +36 -62
  374. data/lib/rails/generators/mongoid/model/model_generator.rb +4 -0
  375. data/lib/rails/generators/mongoid_generator.rb +13 -0
  376. data/lib/rails/mongoid.rb +4 -29
  377. data/spec/config/mongoid.yml +0 -1
  378. data/spec/integration/active_job_spec.rb +32 -0
  379. data/spec/integration/app_spec.rb +72 -66
  380. data/spec/integration/associations/belongs_to_spec.rb +1 -0
  381. data/spec/integration/associations/embedded_dirty_spec.rb +1 -0
  382. data/spec/integration/associations/embedded_spec.rb +75 -6
  383. data/spec/integration/associations/embeds_many_spec.rb +1 -41
  384. data/spec/integration/associations/embeds_one_spec.rb +6 -25
  385. data/spec/integration/associations/foreign_key_spec.rb +1 -0
  386. data/spec/integration/associations/foreign_key_spec_models.rb +1 -0
  387. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +3 -17
  388. data/spec/integration/associations/has_many_spec.rb +1 -0
  389. data/spec/integration/associations/has_one_spec.rb +1 -0
  390. data/spec/integration/associations/nested_attributes_assignment_spec.rb +1 -0
  391. data/spec/integration/associations/reverse_population_spec.rb +1 -0
  392. data/spec/integration/associations/reverse_population_spec_models.rb +1 -0
  393. data/spec/integration/associations/scope_option_spec.rb +1 -0
  394. data/spec/integration/atomic/modifiers_spec.rb +1 -0
  395. data/spec/integration/bson_regexp_raw_spec.rb +1 -0
  396. data/spec/integration/callbacks_models.rb +3 -2
  397. data/spec/integration/callbacks_spec.rb +2 -1
  398. data/spec/integration/contextual/empty_spec.rb +1 -0
  399. data/spec/integration/criteria/alias_query_spec.rb +25 -88
  400. data/spec/integration/criteria/date_field_spec.rb +1 -0
  401. data/spec/integration/criteria/default_scope_spec.rb +1 -0
  402. data/spec/integration/criteria/logical_spec.rb +10 -28
  403. data/spec/integration/criteria/range_spec.rb +1 -2
  404. data/spec/integration/criteria/raw_value_spec.rb +525 -0
  405. data/spec/integration/criteria/time_with_zone_spec.rb +1 -0
  406. data/spec/integration/discriminator_key_spec.rb +1 -0
  407. data/spec/integration/discriminator_value_spec.rb +1 -0
  408. data/spec/integration/document_spec.rb +1 -0
  409. data/spec/integration/dots_and_dollars_spec.rb +3 -12
  410. data/spec/integration/encryption_spec.rb +100 -0
  411. data/spec/integration/i18n_fallbacks_spec.rb +7 -33
  412. data/spec/integration/matcher_examples_spec.rb +1 -0
  413. data/spec/integration/matcher_operator_data/bits_all_clear.yml +0 -15
  414. data/spec/integration/matcher_operator_data/bits_all_set.yml +0 -15
  415. data/spec/integration/matcher_operator_data/bits_any_clear.yml +0 -15
  416. data/spec/integration/matcher_operator_data/bits_any_set.yml +0 -15
  417. data/spec/integration/matcher_operator_data/regex.yml +0 -21
  418. data/spec/integration/matcher_operator_data/size.yml +0 -3
  419. data/spec/integration/matcher_operator_data/type.yml +0 -6
  420. data/spec/integration/matcher_operator_data/type_array.yml +0 -1
  421. data/spec/integration/matcher_operator_data/type_decimal.yml +0 -4
  422. data/spec/integration/matcher_operator_spec.rb +1 -0
  423. data/spec/integration/matcher_spec.rb +21 -66
  424. data/spec/integration/persistence/range_field_spec.rb +1 -0
  425. data/spec/integration/server_query_spec.rb +1 -0
  426. data/spec/integration/shardable_spec.rb +1 -0
  427. data/spec/integration/stringified_symbol_field_spec.rb +1 -0
  428. data/spec/lite_spec_helper.rb +36 -10
  429. data/spec/mongoid/association/accessors_spec.rb +11 -28
  430. data/spec/mongoid/association/auto_save_spec.rb +1 -0
  431. data/spec/mongoid/association/builders_spec.rb +1 -0
  432. data/spec/mongoid/association/constrainable_spec.rb +1 -0
  433. data/spec/mongoid/association/counter_cache_spec.rb +1 -0
  434. data/spec/mongoid/association/depending_spec.rb +1 -0
  435. data/spec/mongoid/association/eager_spec.rb +52 -24
  436. data/spec/mongoid/association/embedded/cyclic_spec.rb +1 -0
  437. data/spec/mongoid/association/embedded/dirty_spec.rb +1 -0
  438. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +1 -0
  439. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +1 -0
  440. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +1 -0
  441. data/spec/mongoid/association/embedded/embedded_in_spec.rb +19 -7
  442. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +1 -0
  443. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +1 -0
  444. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +1 -0
  445. data/spec/mongoid/association/embedded/embeds_many_models.rb +17 -2
  446. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +4 -7
  447. data/spec/mongoid/association/embedded/embeds_many_spec.rb +1 -0
  448. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +1 -0
  449. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +1 -0
  450. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +1 -0
  451. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +1 -0
  452. data/spec/mongoid/association/embedded/embeds_one_models.rb +6 -1
  453. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +2 -1
  454. data/spec/mongoid/association/embedded/embeds_one_spec.rb +1 -0
  455. data/spec/mongoid/association/macros_spec.rb +1 -0
  456. data/spec/mongoid/association/nested/many_spec.rb +1 -0
  457. data/spec/mongoid/association/nested/one_spec.rb +1 -0
  458. data/spec/mongoid/association/options_spec.rb +1 -0
  459. data/spec/mongoid/association/polymorphic_spec.rb +1 -0
  460. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +1 -0
  461. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +1 -0
  462. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +1 -0
  463. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +1 -4
  464. data/spec/mongoid/association/referenced/belongs_to_models.rb +1 -0
  465. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +2 -1
  466. data/spec/mongoid/association/referenced/belongs_to_spec.rb +1 -0
  467. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +1 -0
  468. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +2 -1
  469. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +1 -0
  470. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +1 -0
  471. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +38 -79
  472. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +1 -0
  473. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +2 -1
  474. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1 -0
  475. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +1 -0
  476. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +1 -0
  477. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +1 -0
  478. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +1 -0
  479. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +1 -0
  480. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +1090 -2152
  481. data/spec/mongoid/association/referenced/has_many_models.rb +1 -0
  482. data/spec/mongoid/association/referenced/has_many_query_spec.rb +2 -1
  483. data/spec/mongoid/association/referenced/has_many_spec.rb +1 -0
  484. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +1 -0
  485. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +1 -0
  486. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +1 -0
  487. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +1 -0
  488. data/spec/mongoid/association/referenced/has_one_models.rb +1 -0
  489. data/spec/mongoid/association/referenced/has_one_query_spec.rb +2 -1
  490. data/spec/mongoid/association/referenced/has_one_spec.rb +1 -0
  491. data/spec/mongoid/association/reflections_spec.rb +1 -0
  492. data/spec/mongoid/association/syncable_spec.rb +1 -0
  493. data/spec/mongoid/association_spec.rb +1 -0
  494. data/spec/mongoid/atomic/modifiers_spec.rb +1 -0
  495. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +1 -0
  496. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +1 -0
  497. data/spec/mongoid/atomic/paths/root_spec.rb +1 -0
  498. data/spec/mongoid/atomic/paths_spec.rb +1 -0
  499. data/spec/mongoid/atomic_spec.rb +1 -0
  500. data/spec/mongoid/atomic_update_preparer_spec.rb +83 -0
  501. data/spec/mongoid/attributes/dynamic_spec.rb +1 -0
  502. data/spec/mongoid/attributes/embedded_spec.rb +118 -0
  503. data/spec/mongoid/attributes/nested_spec.rb +11 -204
  504. data/spec/mongoid/attributes/nested_spec_models.rb +1 -0
  505. data/spec/mongoid/attributes/projector_spec.rb +1 -0
  506. data/spec/mongoid/attributes/readonly_spec.rb +1 -19
  507. data/spec/mongoid/attributes_spec.rb +18 -35
  508. data/spec/mongoid/cacheable_spec.rb +1 -0
  509. data/spec/mongoid/changeable_spec.rb +4 -3
  510. data/spec/mongoid/clients/factory_spec.rb +77 -30
  511. data/spec/mongoid/clients/options_spec.rb +9 -5
  512. data/spec/mongoid/clients/sessions_spec.rb +27 -10
  513. data/spec/mongoid/clients/transactions_spec.rb +958 -185
  514. data/spec/mongoid/clients/transactions_spec_models.rb +159 -0
  515. data/spec/mongoid/clients_spec.rb +47 -2
  516. data/spec/mongoid/collection_configurable_spec.rb +1 -0
  517. data/spec/mongoid/composable_spec.rb +1 -0
  518. data/spec/mongoid/config/defaults_spec.rb +31 -92
  519. data/spec/mongoid/config/encryption_spec.rb +152 -0
  520. data/spec/mongoid/config/environment_spec.rb +13 -41
  521. data/spec/mongoid/config/introspection_spec.rb +114 -0
  522. data/spec/mongoid/config/options_spec.rb +1 -0
  523. data/spec/mongoid/config_spec.rb +20 -133
  524. data/spec/mongoid/contextual/aggregable/memory_spec.rb +1 -91
  525. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +1 -0
  526. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +5 -29
  527. data/spec/mongoid/contextual/aggregable/none_spec.rb +3 -14
  528. data/spec/mongoid/contextual/atomic_spec.rb +203 -12
  529. data/spec/mongoid/contextual/map_reduce_spec.rb +1 -0
  530. data/spec/mongoid/contextual/memory_spec.rb +340 -687
  531. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +10 -3
  532. data/spec/mongoid/contextual/mongo_spec.rb +101 -283
  533. data/spec/mongoid/contextual/none_spec.rb +1 -0
  534. data/spec/mongoid/copyable_spec.rb +1 -0
  535. data/spec/mongoid/copyable_spec_models.rb +1 -0
  536. data/spec/mongoid/criteria/findable_spec.rb +191 -0
  537. data/spec/mongoid/criteria/includable_spec.rb +1 -0
  538. data/spec/mongoid/criteria/includable_spec_models.rb +1 -0
  539. data/spec/mongoid/criteria/inspectable_spec.rb +1 -0
  540. data/spec/mongoid/criteria/marshalable_spec.rb +3 -2
  541. data/spec/mongoid/criteria/modifiable_spec.rb +1 -0
  542. data/spec/mongoid/criteria/options_spec.rb +1 -0
  543. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +1 -0
  544. data/spec/mongoid/criteria/queryable/expandable_spec.rb +1 -0
  545. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +1 -0
  546. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +8 -7
  547. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +1 -0
  548. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +21 -11
  549. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +1 -0
  550. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +1 -0
  551. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +1 -0
  552. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +1 -0
  553. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +1 -0
  554. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +1 -0
  555. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +1 -0
  556. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +1 -0
  557. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -11
  558. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +1 -11
  559. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +1 -0
  560. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +48 -66
  561. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +5 -0
  562. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +1 -0
  563. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +1 -0
  564. data/spec/mongoid/criteria/queryable/key_spec.rb +1 -0
  565. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +1 -0
  566. data/spec/mongoid/criteria/queryable/optional_spec.rb +1 -0
  567. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -0
  568. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +1 -0
  569. data/spec/mongoid/criteria/queryable/queryable_spec.rb +1 -0
  570. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +4 -5
  571. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +1 -0
  572. data/spec/mongoid/criteria/queryable/selectable_spec.rb +51 -214
  573. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +1 -235
  574. data/spec/mongoid/criteria/queryable/selector_spec.rb +96 -0
  575. data/spec/mongoid/criteria/queryable/smash_spec.rb +1 -0
  576. data/spec/mongoid/criteria/queryable/storable_spec.rb +10 -32
  577. data/spec/mongoid/criteria/scopable_spec.rb +1 -0
  578. data/spec/mongoid/criteria/translator_spec.rb +1 -0
  579. data/spec/mongoid/criteria_projection_spec.rb +6 -5
  580. data/spec/mongoid/criteria_spec.rb +221 -361
  581. data/spec/mongoid/document_fields_spec.rb +1 -0
  582. data/spec/mongoid/document_persistence_context_spec.rb +77 -0
  583. data/spec/mongoid/document_query_spec.rb +5 -4
  584. data/spec/mongoid/document_spec.rb +3 -148
  585. data/spec/mongoid/equality_spec.rb +41 -149
  586. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +1 -0
  587. data/spec/mongoid/errors/attribute_not_loaded_spec.rb +32 -0
  588. data/spec/mongoid/errors/callback_spec.rb +1 -0
  589. data/spec/mongoid/errors/delete_restriction_spec.rb +1 -0
  590. data/spec/mongoid/errors/document_not_destroyed_spec.rb +1 -0
  591. data/spec/mongoid/errors/document_not_found_spec.rb +1 -0
  592. data/spec/mongoid/errors/invalid_collection_spec.rb +1 -0
  593. data/spec/mongoid/errors/invalid_config_file_spec.rb +1 -0
  594. data/spec/mongoid/errors/invalid_config_option_spec.rb +1 -0
  595. data/spec/mongoid/errors/invalid_field_option_spec.rb +1 -0
  596. data/spec/mongoid/errors/invalid_field_spec.rb +1 -0
  597. data/spec/mongoid/errors/invalid_field_type_spec.rb +1 -0
  598. data/spec/mongoid/errors/invalid_find_spec.rb +1 -0
  599. data/spec/mongoid/errors/invalid_includes_spec.rb +1 -0
  600. data/spec/mongoid/errors/invalid_index_spec.rb +1 -0
  601. data/spec/mongoid/errors/invalid_options_spec.rb +1 -0
  602. data/spec/mongoid/errors/invalid_path_spec.rb +1 -0
  603. data/spec/mongoid/errors/invalid_relation_spec.rb +1 -0
  604. data/spec/mongoid/errors/invalid_scope_spec.rb +1 -0
  605. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +1 -0
  606. data/spec/mongoid/errors/invalid_storage_options_spec.rb +1 -0
  607. data/spec/mongoid/errors/invalid_time_spec.rb +1 -0
  608. data/spec/mongoid/errors/inverse_not_found_spec.rb +1 -0
  609. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +1 -0
  610. data/spec/mongoid/errors/mixed_relations_spec.rb +1 -0
  611. data/spec/mongoid/errors/mongoid_error_spec.rb +9 -22
  612. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +1 -0
  613. data/spec/mongoid/errors/no_client_config_spec.rb +1 -0
  614. data/spec/mongoid/errors/no_client_database_spec.rb +1 -0
  615. data/spec/mongoid/errors/no_client_hosts_spec.rb +1 -0
  616. data/spec/mongoid/errors/no_clients_config_spec.rb +1 -0
  617. data/spec/mongoid/errors/no_environment_spec.rb +1 -0
  618. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +1 -0
  619. data/spec/mongoid/errors/no_metadata_spec.rb +1 -0
  620. data/spec/mongoid/errors/no_parent_spec.rb +1 -0
  621. data/spec/mongoid/errors/readonly_attribute_spec.rb +1 -0
  622. data/spec/mongoid/errors/readonly_document_spec.rb +1 -0
  623. data/spec/mongoid/errors/scope_overwrite_spec.rb +1 -0
  624. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -0
  625. data/spec/mongoid/errors/unknown_attribute_spec.rb +1 -0
  626. data/spec/mongoid/errors/unsaved_document_spec.rb +1 -0
  627. data/spec/mongoid/errors/unsupported_javascript_spec.rb +1 -0
  628. data/spec/mongoid/errors/validations_spec.rb +1 -0
  629. data/spec/mongoid/extensions/array_spec.rb +3 -262
  630. data/spec/mongoid/extensions/big_decimal_spec.rb +5 -4
  631. data/spec/mongoid/extensions/binary_spec.rb +1 -0
  632. data/spec/mongoid/extensions/boolean_spec.rb +1 -0
  633. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +8 -7
  634. data/spec/mongoid/extensions/date_spec.rb +3 -20
  635. data/spec/mongoid/extensions/date_time_spec.rb +3 -9
  636. data/spec/mongoid/extensions/decimal128_spec.rb +1 -0
  637. data/spec/mongoid/extensions/false_class_spec.rb +1 -7
  638. data/spec/mongoid/extensions/float_spec.rb +3 -9
  639. data/spec/mongoid/extensions/hash_spec.rb +19 -458
  640. data/spec/mongoid/extensions/integer_spec.rb +3 -8
  641. data/spec/mongoid/extensions/module_spec.rb +1 -0
  642. data/spec/mongoid/extensions/nil_class_spec.rb +1 -0
  643. data/spec/mongoid/extensions/object_id_spec.rb +1 -0
  644. data/spec/mongoid/extensions/object_spec.rb +1 -176
  645. data/spec/mongoid/extensions/range_spec.rb +1 -11
  646. data/spec/mongoid/extensions/raw_value_spec.rb +67 -0
  647. data/spec/mongoid/extensions/regexp_spec.rb +1 -0
  648. data/spec/mongoid/extensions/set_spec.rb +2 -3
  649. data/spec/mongoid/extensions/string_spec.rb +3 -113
  650. data/spec/mongoid/extensions/stringified_symbol_spec.rb +1 -0
  651. data/spec/mongoid/extensions/symbol_spec.rb +1 -31
  652. data/spec/mongoid/extensions/time_spec.rb +32 -350
  653. data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -30
  654. data/spec/mongoid/extensions/true_class_spec.rb +1 -7
  655. data/spec/mongoid/factory_spec.rb +1 -0
  656. data/spec/mongoid/fields/foreign_key_spec.rb +282 -119
  657. data/spec/mongoid/fields/localized_spec.rb +1 -0
  658. data/spec/mongoid/fields/standard_spec.rb +1 -0
  659. data/spec/mongoid/fields_spec.rb +60 -66
  660. data/spec/mongoid/findable_spec.rb +2 -61
  661. data/spec/mongoid/indexable/specification_spec.rb +132 -13
  662. data/spec/mongoid/indexable_spec.rb +323 -9
  663. data/spec/mongoid/inspectable_spec.rb +81 -0
  664. data/spec/mongoid/interceptable_spec.rb +3 -82
  665. data/spec/mongoid/interceptable_spec_models.rb +112 -47
  666. data/spec/mongoid/loading_spec.rb +110 -0
  667. data/spec/mongoid/loggable_spec.rb +1 -0
  668. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -0
  669. data/spec/mongoid/mongoizable_spec.rb +1 -0
  670. data/spec/mongoid/monkey_patches_spec.rb +211 -0
  671. data/spec/mongoid/persistable/creatable_spec.rb +1 -0
  672. data/spec/mongoid/persistable/deletable_spec.rb +78 -31
  673. data/spec/mongoid/persistable/destroyable_spec.rb +230 -52
  674. data/spec/mongoid/persistable/incrementable_spec.rb +1 -0
  675. data/spec/mongoid/persistable/logical_spec.rb +1 -0
  676. data/spec/mongoid/persistable/maxable_spec.rb +147 -0
  677. data/spec/mongoid/persistable/minable_spec.rb +147 -0
  678. data/spec/mongoid/persistable/multipliable_spec.rb +227 -0
  679. data/spec/mongoid/persistable/poppable_spec.rb +1 -0
  680. data/spec/mongoid/persistable/pullable_spec.rb +1 -0
  681. data/spec/mongoid/persistable/pushable_spec.rb +1 -0
  682. data/spec/mongoid/persistable/renamable_spec.rb +1 -0
  683. data/spec/mongoid/persistable/savable_spec.rb +2 -6
  684. data/spec/mongoid/persistable/settable_spec.rb +5 -4
  685. data/spec/mongoid/persistable/unsettable_spec.rb +1 -0
  686. data/spec/mongoid/persistable/updatable_spec.rb +3 -2
  687. data/spec/mongoid/persistable/upsertable_spec.rb +34 -1
  688. data/spec/mongoid/persistable_spec.rb +1 -0
  689. data/spec/mongoid/persistence_context_spec.rb +1 -0
  690. data/spec/mongoid/positional_spec.rb +1 -0
  691. data/spec/mongoid/railties/bson_object_id_serializer_spec.rb +24 -0
  692. data/spec/mongoid/railties/console_sandbox_spec.rb +44 -0
  693. data/spec/mongoid/relations/proxy_spec.rb +1 -0
  694. data/spec/mongoid/reloadable_spec.rb +28 -83
  695. data/spec/mongoid/scopable_spec.rb +39 -50
  696. data/spec/mongoid/search_indexable_spec.rb +147 -0
  697. data/spec/mongoid/selectable_spec.rb +1 -0
  698. data/spec/mongoid/serializable_spec.rb +10 -16
  699. data/spec/mongoid/shardable_models.rb +1 -0
  700. data/spec/mongoid/shardable_spec.rb +1 -0
  701. data/spec/mongoid/stateful_spec.rb +1 -0
  702. data/spec/mongoid/tasks/database_rake_spec.rb +127 -49
  703. data/spec/mongoid/tasks/database_spec.rb +48 -1
  704. data/spec/mongoid/tasks/encryption_spec.rb +187 -0
  705. data/spec/mongoid/threaded_spec.rb +38 -0
  706. data/spec/mongoid/timestamps/created/short_spec.rb +1 -0
  707. data/spec/mongoid/timestamps/created_spec.rb +1 -23
  708. data/spec/mongoid/timestamps/timeless_spec.rb +1 -0
  709. data/spec/mongoid/timestamps/updated/short_spec.rb +1 -0
  710. data/spec/mongoid/timestamps/updated_spec.rb +1 -0
  711. data/spec/mongoid/timestamps_spec.rb +1 -0
  712. data/spec/mongoid/timestamps_spec_models.rb +1 -0
  713. data/spec/mongoid/touchable_spec.rb +485 -69
  714. data/spec/mongoid/touchable_spec_models.rb +96 -1
  715. data/spec/mongoid/traversable_spec.rb +1 -0
  716. data/spec/mongoid/validatable/associated_spec.rb +5 -14
  717. data/spec/mongoid/validatable/format_spec.rb +1 -0
  718. data/spec/mongoid/validatable/length_spec.rb +1 -0
  719. data/spec/mongoid/validatable/numericality_spec.rb +1 -16
  720. data/spec/mongoid/validatable/presence_spec.rb +1 -0
  721. data/spec/mongoid/validatable/uniqueness_spec.rb +48 -3
  722. data/spec/mongoid/validatable_spec.rb +1 -0
  723. data/spec/mongoid/warnings_spec.rb +1 -0
  724. data/spec/mongoid_spec.rb +27 -0
  725. data/spec/rails/controller_extension/controller_runtime_spec.rb +1 -0
  726. data/spec/rails/mongoid_spec.rb +26 -117
  727. data/spec/shared/lib/mrss/docker_runner.rb +1 -1
  728. data/spec/shared/lib/mrss/server_version_registry.rb +1 -1
  729. data/spec/shared/lib/mrss/spec_organizer.rb +3 -32
  730. data/spec/shared/share/Dockerfile.erb +34 -4
  731. data/spec/shared/shlib/distro.sh +0 -10
  732. data/spec/shared/shlib/server.sh +27 -33
  733. data/spec/shared/shlib/set_env.sh +42 -6
  734. data/spec/spec_helper.rb +26 -28
  735. data/spec/support/authorization.rb +1 -0
  736. data/spec/support/client_registry.rb +1 -0
  737. data/spec/support/constraints.rb +1 -0
  738. data/spec/support/crypt/models.rb +50 -0
  739. data/spec/support/crypt.rb +80 -0
  740. data/spec/support/expectations.rb +18 -20
  741. data/spec/support/feature_sandbox.rb +72 -0
  742. data/spec/support/helpers.rb +1 -0
  743. data/spec/support/immutable_ids.rb +22 -21
  744. data/spec/support/macros.rb +4 -6
  745. data/spec/support/models/account.rb +1 -0
  746. data/spec/support/models/acolyte.rb +1 -0
  747. data/spec/support/models/actor.rb +1 -0
  748. data/spec/support/models/actress.rb +1 -0
  749. data/spec/support/models/address.rb +3 -0
  750. data/spec/support/models/address_component.rb +1 -0
  751. data/spec/support/models/address_number.rb +1 -0
  752. data/spec/support/models/agency.rb +1 -0
  753. data/spec/support/models/agent.rb +1 -0
  754. data/spec/support/models/album.rb +1 -0
  755. data/spec/support/models/alert.rb +1 -0
  756. data/spec/support/models/animal.rb +1 -0
  757. data/spec/support/models/answer.rb +1 -0
  758. data/spec/support/models/appointment.rb +1 -0
  759. data/spec/support/models/armrest.rb +1 -0
  760. data/spec/support/models/array_field.rb +1 -0
  761. data/spec/support/models/article.rb +1 -0
  762. data/spec/support/models/artist.rb +1 -0
  763. data/spec/support/models/artwork.rb +1 -0
  764. data/spec/support/models/audible_sound.rb +1 -0
  765. data/spec/support/models/audio.rb +1 -0
  766. data/spec/support/models/augmentation.rb +1 -0
  767. data/spec/support/models/author.rb +1 -0
  768. data/spec/support/models/baby.rb +1 -0
  769. data/spec/support/models/band.rb +5 -1
  770. data/spec/support/models/bar.rb +1 -0
  771. data/spec/support/models/basic.rb +1 -0
  772. data/spec/support/models/bed.rb +1 -0
  773. data/spec/support/models/big_palette.rb +1 -0
  774. data/spec/support/models/birthday.rb +1 -0
  775. data/spec/support/models/bolt.rb +1 -0
  776. data/spec/support/models/bomb.rb +1 -0
  777. data/spec/support/models/book.rb +1 -0
  778. data/spec/support/models/breed.rb +1 -0
  779. data/spec/support/models/browser.rb +1 -0
  780. data/spec/support/models/building.rb +1 -0
  781. data/spec/support/models/building_address.rb +1 -0
  782. data/spec/support/models/bus.rb +1 -0
  783. data/spec/support/models/business.rb +1 -0
  784. data/spec/support/models/callback_test.rb +1 -0
  785. data/spec/support/models/canvas.rb +1 -0
  786. data/spec/support/models/car.rb +1 -0
  787. data/spec/support/models/cat.rb +1 -0
  788. data/spec/support/models/catalog.rb +1 -0
  789. data/spec/support/models/category.rb +1 -0
  790. data/spec/support/models/child.rb +1 -0
  791. data/spec/support/models/child_doc.rb +1 -0
  792. data/spec/support/models/church.rb +1 -0
  793. data/spec/support/models/circle.rb +1 -0
  794. data/spec/support/models/circuit.rb +1 -0
  795. data/spec/support/models/circus.rb +1 -0
  796. data/spec/support/models/code.rb +1 -0
  797. data/spec/support/models/coding/pull_request.rb +1 -0
  798. data/spec/support/models/coding.rb +1 -0
  799. data/spec/support/models/comment.rb +1 -0
  800. data/spec/support/models/company.rb +1 -0
  801. data/spec/support/models/consumption_period.rb +1 -0
  802. data/spec/support/models/contextable_item.rb +1 -0
  803. data/spec/support/models/contractor.rb +1 -0
  804. data/spec/support/models/cookie.rb +1 -0
  805. data/spec/support/models/country_code.rb +1 -0
  806. data/spec/support/models/courier_job.rb +1 -0
  807. data/spec/support/models/cover.rb +1 -0
  808. data/spec/support/models/crate.rb +1 -0
  809. data/spec/support/models/customer.rb +1 -0
  810. data/spec/support/models/customer_address.rb +1 -0
  811. data/spec/support/models/deed.rb +1 -0
  812. data/spec/support/models/definition.rb +1 -0
  813. data/spec/support/models/delegating_patient.rb +1 -0
  814. data/spec/support/models/description.rb +1 -0
  815. data/spec/support/models/dictionary.rb +1 -0
  816. data/spec/support/models/division.rb +1 -0
  817. data/spec/support/models/doctor.rb +1 -0
  818. data/spec/support/models/dog.rb +1 -0
  819. data/spec/support/models/dokument.rb +1 -0
  820. data/spec/support/models/draft.rb +1 -0
  821. data/spec/support/models/dragon.rb +1 -0
  822. data/spec/support/models/driver.rb +1 -0
  823. data/spec/support/models/drug.rb +1 -0
  824. data/spec/support/models/dungeon.rb +1 -0
  825. data/spec/support/models/edit.rb +1 -0
  826. data/spec/support/models/email.rb +1 -0
  827. data/spec/support/models/employer.rb +1 -0
  828. data/spec/support/models/entry.rb +1 -0
  829. data/spec/support/models/eraser.rb +1 -0
  830. data/spec/support/models/even.rb +1 -0
  831. data/spec/support/models/event.rb +1 -0
  832. data/spec/support/models/exhibition.rb +1 -0
  833. data/spec/support/models/exhibitor.rb +1 -0
  834. data/spec/support/models/explosion.rb +1 -0
  835. data/spec/support/models/eye.rb +1 -0
  836. data/spec/support/models/eye_bowl.rb +1 -0
  837. data/spec/support/models/face.rb +1 -0
  838. data/spec/support/models/fanatic.rb +1 -0
  839. data/spec/support/models/favorite.rb +8 -1
  840. data/spec/support/models/filesystem.rb +1 -0
  841. data/spec/support/models/fire_hydrant.rb +1 -0
  842. data/spec/support/models/firefox.rb +1 -0
  843. data/spec/support/models/fish.rb +1 -0
  844. data/spec/support/models/folder.rb +1 -0
  845. data/spec/support/models/folder_item.rb +1 -0
  846. data/spec/support/models/fruits.rb +1 -0
  847. data/spec/support/models/game.rb +1 -0
  848. data/spec/support/models/ghost.rb +1 -0
  849. data/spec/support/models/guitar.rb +1 -0
  850. data/spec/support/models/hole.rb +1 -0
  851. data/spec/support/models/home.rb +1 -0
  852. data/spec/support/models/house.rb +1 -0
  853. data/spec/support/models/html_writer.rb +1 -0
  854. data/spec/support/models/id_key.rb +1 -0
  855. data/spec/support/models/idnodef.rb +1 -0
  856. data/spec/support/models/image.rb +1 -0
  857. data/spec/support/models/implant.rb +1 -0
  858. data/spec/support/models/instrument.rb +1 -0
  859. data/spec/support/models/item.rb +1 -0
  860. data/spec/support/models/jar.rb +1 -0
  861. data/spec/support/models/kaleidoscope.rb +1 -0
  862. data/spec/support/models/kangaroo.rb +1 -0
  863. data/spec/support/models/label.rb +1 -0
  864. data/spec/support/models/language.rb +1 -0
  865. data/spec/support/models/lat_lng.rb +1 -6
  866. data/spec/support/models/league.rb +1 -0
  867. data/spec/support/models/learner.rb +1 -0
  868. data/spec/support/models/line_item.rb +1 -0
  869. data/spec/support/models/location.rb +1 -0
  870. data/spec/support/models/login.rb +1 -0
  871. data/spec/support/models/manufacturer.rb +1 -0
  872. data/spec/support/models/meat.rb +1 -0
  873. data/spec/support/models/membership.rb +1 -0
  874. data/spec/support/models/message.rb +1 -0
  875. data/spec/support/models/minim.rb +1 -0
  876. data/spec/support/models/mixed_drink.rb +1 -0
  877. data/spec/support/models/mop.rb +1 -0
  878. data/spec/support/models/movie.rb +1 -0
  879. data/spec/support/models/my_hash.rb +1 -0
  880. data/spec/support/models/name.rb +1 -0
  881. data/spec/support/models/name_only.rb +1 -0
  882. data/spec/support/models/node.rb +1 -0
  883. data/spec/support/models/note.rb +1 -0
  884. data/spec/support/models/nut.rb +1 -0
  885. data/spec/support/models/odd.rb +1 -0
  886. data/spec/support/models/order.rb +1 -0
  887. data/spec/support/models/ordered_post.rb +1 -0
  888. data/spec/support/models/ordered_preference.rb +1 -0
  889. data/spec/support/models/oscar.rb +1 -0
  890. data/spec/support/models/other_owner_object.rb +1 -0
  891. data/spec/support/models/override.rb +1 -0
  892. data/spec/support/models/ownable.rb +1 -0
  893. data/spec/support/models/owner.rb +1 -0
  894. data/spec/support/models/pack.rb +1 -0
  895. data/spec/support/models/page.rb +1 -0
  896. data/spec/support/models/page_question.rb +1 -0
  897. data/spec/support/models/palette.rb +1 -0
  898. data/spec/support/models/parent.rb +1 -0
  899. data/spec/support/models/parent_doc.rb +1 -0
  900. data/spec/support/models/passport.rb +1 -0
  901. data/spec/support/models/patient.rb +1 -0
  902. data/spec/support/models/pdf_writer.rb +1 -0
  903. data/spec/support/models/pencil.rb +1 -0
  904. data/spec/support/models/person.rb +1 -0
  905. data/spec/support/models/pet.rb +1 -0
  906. data/spec/support/models/pet_owner.rb +1 -0
  907. data/spec/support/models/phone.rb +1 -0
  908. data/spec/support/models/piano.rb +1 -0
  909. data/spec/support/models/pizza.rb +1 -0
  910. data/spec/support/models/player.rb +1 -0
  911. data/spec/support/models/post.rb +1 -0
  912. data/spec/support/models/post_genre.rb +1 -0
  913. data/spec/support/models/powerup.rb +1 -0
  914. data/spec/support/models/preference.rb +1 -0
  915. data/spec/support/models/princess.rb +1 -0
  916. data/spec/support/models/product.rb +1 -0
  917. data/spec/support/models/profile.rb +1 -0
  918. data/spec/support/models/pronunciation.rb +1 -0
  919. data/spec/support/models/pub.rb +1 -0
  920. data/spec/support/models/publication/encyclopedia.rb +1 -0
  921. data/spec/support/models/publication/review.rb +1 -0
  922. data/spec/support/models/publication.rb +1 -0
  923. data/spec/support/models/purchase.rb +1 -0
  924. data/spec/support/models/purchased_item.rb +1 -0
  925. data/spec/support/models/question.rb +1 -0
  926. data/spec/support/models/quiz.rb +1 -0
  927. data/spec/support/models/rating.rb +1 -0
  928. data/spec/support/models/record.rb +1 -0
  929. data/spec/support/models/registry.rb +1 -0
  930. data/spec/support/models/role.rb +1 -0
  931. data/spec/support/models/root_category.rb +1 -0
  932. data/spec/support/models/sandbox/app/models/app_models_message.rb +4 -0
  933. data/spec/support/models/sandbox/lib/models/lib_models_message.rb +4 -0
  934. data/spec/support/models/sandbox/sandbox_message.rb +4 -0
  935. data/spec/support/models/sandbox/sandbox_user.rb +4 -0
  936. data/spec/support/models/sandbox/subdir/sandbox_comment.rb +4 -0
  937. data/spec/support/models/sandwich.rb +1 -0
  938. data/spec/support/models/scheduler.rb +1 -0
  939. data/spec/support/models/school.rb +1 -0
  940. data/spec/support/models/scribe.rb +1 -0
  941. data/spec/support/models/sealer.rb +1 -0
  942. data/spec/support/models/seat.rb +1 -0
  943. data/spec/support/models/seo.rb +1 -0
  944. data/spec/support/models/series.rb +1 -0
  945. data/spec/support/models/server.rb +1 -0
  946. data/spec/support/models/service.rb +1 -0
  947. data/spec/support/models/shape.rb +1 -0
  948. data/spec/support/models/shelf.rb +1 -0
  949. data/spec/support/models/shield.rb +1 -0
  950. data/spec/support/models/shipment_address.rb +1 -0
  951. data/spec/support/models/shipping_container.rb +1 -0
  952. data/spec/support/models/shipping_pack.rb +1 -0
  953. data/spec/support/models/shirt.rb +1 -0
  954. data/spec/support/models/shop.rb +1 -0
  955. data/spec/support/models/short_agent.rb +1 -0
  956. data/spec/support/models/short_quiz.rb +1 -0
  957. data/spec/support/models/simple.rb +1 -0
  958. data/spec/support/models/slave.rb +1 -0
  959. data/spec/support/models/song.rb +1 -0
  960. data/spec/support/models/sound.rb +1 -0
  961. data/spec/support/models/spacer.rb +1 -0
  962. data/spec/support/models/square.rb +1 -0
  963. data/spec/support/models/staff.rb +1 -0
  964. data/spec/support/models/store_as_dup_test1.rb +1 -0
  965. data/spec/support/models/store_as_dup_test2.rb +1 -0
  966. data/spec/support/models/store_as_dup_test3.rb +1 -0
  967. data/spec/support/models/store_as_dup_test4.rb +1 -0
  968. data/spec/support/models/strategy.rb +1 -0
  969. data/spec/support/models/student.rb +1 -0
  970. data/spec/support/models/sub_item.rb +1 -0
  971. data/spec/support/models/subscription.rb +1 -0
  972. data/spec/support/models/survey.rb +1 -0
  973. data/spec/support/models/symptom.rb +1 -0
  974. data/spec/support/models/system_role.rb +1 -0
  975. data/spec/support/models/tag.rb +1 -0
  976. data/spec/support/models/target.rb +1 -0
  977. data/spec/support/models/template.rb +1 -0
  978. data/spec/support/models/thing.rb +1 -0
  979. data/spec/support/models/threadlocker.rb +1 -0
  980. data/spec/support/models/title.rb +1 -0
  981. data/spec/support/models/tool.rb +1 -0
  982. data/spec/support/models/topping.rb +1 -0
  983. data/spec/support/models/toy.rb +1 -0
  984. data/spec/support/models/track.rb +1 -0
  985. data/spec/support/models/translation.rb +1 -0
  986. data/spec/support/models/tree.rb +1 -0
  987. data/spec/support/models/truck.rb +1 -0
  988. data/spec/support/models/updatable.rb +1 -0
  989. data/spec/support/models/user.rb +1 -0
  990. data/spec/support/models/user_account.rb +1 -0
  991. data/spec/support/models/validation_callback.rb +1 -0
  992. data/spec/support/models/vehicle.rb +1 -0
  993. data/spec/support/models/version.rb +1 -0
  994. data/spec/support/models/vertex.rb +1 -0
  995. data/spec/support/models/vet_visit.rb +1 -0
  996. data/spec/support/models/video.rb +1 -0
  997. data/spec/support/models/video_game.rb +1 -0
  998. data/spec/support/models/washer.rb +1 -0
  999. data/spec/support/models/weapon.rb +1 -0
  1000. data/spec/support/models/wiki_page.rb +1 -0
  1001. data/spec/support/models/word.rb +1 -0
  1002. data/spec/support/models/word_origin.rb +1 -0
  1003. data/spec/support/models/writer.rb +1 -0
  1004. data/spec/support/rails_mock.rb +32 -0
  1005. data/spec/support/shared/time.rb +3 -21
  1006. data/spec/support/sinatra_mock.rb +7 -0
  1007. data/spec/support/spec_config.rb +30 -9
  1008. data.tar.gz.sig +0 -0
  1009. metadata +127 -57
  1010. metadata.gz.sig +1 -0
  1011. data/lib/mongoid/association/referenced/eager.rb +0 -163
  1012. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +0 -113
  1013. data/lib/mongoid/contextual/geo_near.rb +0 -236
  1014. data/lib/mongoid/errors/in_memory_regexp_timeout.rb +0 -26
  1015. data/lib/mongoid/errors/invalid_session_use.rb +0 -21
  1016. data/lib/mongoid/errors/invalid_storage_parent.rb +0 -27
  1017. data/lib/mongoid/field_readable.rb +0 -70
  1018. data/lib/mongoid/matcher/regexp_budget.rb +0 -389
  1019. data/lib/mongoid/query_cache.rb +0 -68
  1020. data/lib/mongoid/validatable/numericality.rb +0 -19
  1021. data/spec/integration/matcher_regexp_timeout_spec.rb +0 -215
  1022. data/spec/integration/query_operator_guard_spec.rb +0 -89
  1023. data/spec/mongoid/contextual/geo_near_spec.rb +0 -471
  1024. data/spec/mongoid/extensions_spec.rb +0 -43
  1025. data/spec/mongoid/matcher/regexp_budget_spec.rb +0 -570
  1026. data/spec/mongoid/query_cache_middleware_spec.rb +0 -50
  1027. data/spec/mongoid/query_cache_spec.rb +0 -865
  1028. data/spec/shared/CANDIDATE.md +0 -28
  1029. data/spec/shared/lib/mrss/release/candidate.rb +0 -281
  1030. data/spec/shared/lib/mrss/release/product_data.rb +0 -144
  1031. data/spec/shared/lib/tasks/candidate.rake +0 -64
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  module Mongoid
4
5
  class Criteria
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  module Mongoid
4
5
  class Criteria
@@ -155,7 +156,7 @@ module Mongoid
155
156
  raise Errors::CriteriaArgumentRequired, :elem_match
156
157
  end
157
158
 
158
- and_or_override(criterion, "$elemMatch")
159
+ and_with_operator(criterion, "$elemMatch")
159
160
  end
160
161
  key :elem_match, :override, "$elemMatch"
161
162
 
@@ -258,7 +259,7 @@ module Mongoid
258
259
  raise Errors::CriteriaArgumentRequired, :eq
259
260
  end
260
261
 
261
- and_or_override(criterion, "$eq")
262
+ and_with_operator(criterion, "$eq")
262
263
  end
263
264
  key :eq, :override, "$eq"
264
265
 
@@ -278,7 +279,7 @@ module Mongoid
278
279
  raise Errors::CriteriaArgumentRequired, :gt
279
280
  end
280
281
 
281
- and_or_override(criterion, "$gt")
282
+ and_with_operator(criterion, "$gt")
282
283
  end
283
284
  key :gt, :override, "$gt"
284
285
 
@@ -298,7 +299,7 @@ module Mongoid
298
299
  raise Errors::CriteriaArgumentRequired, :gte
299
300
  end
300
301
 
301
- and_or_override(criterion, "$gte")
302
+ and_with_operator(criterion, "$gte")
302
303
  end
303
304
  key :gte, :override, "$gte"
304
305
 
@@ -354,7 +355,7 @@ module Mongoid
354
355
  raise Errors::CriteriaArgumentRequired, :lt
355
356
  end
356
357
 
357
- and_or_override(criterion, "$lt")
358
+ and_with_operator(criterion, "$lt")
358
359
  end
359
360
  key :lt, :override, "$lt"
360
361
 
@@ -374,7 +375,7 @@ module Mongoid
374
375
  raise Errors::CriteriaArgumentRequired, :lte
375
376
  end
376
377
 
377
- and_or_override(criterion, "$lte")
378
+ and_with_operator(criterion, "$lte")
378
379
  end
379
380
  key :lte, :override, "$lte"
380
381
 
@@ -411,7 +412,7 @@ module Mongoid
411
412
  raise Errors::CriteriaArgumentRequired, :mod
412
413
  end
413
414
 
414
- and_or_override(criterion, "$mod")
415
+ and_with_operator(criterion, "$mod")
415
416
  end
416
417
  key :mod, :override, "$mod"
417
418
 
@@ -431,7 +432,7 @@ module Mongoid
431
432
  raise Errors::CriteriaArgumentRequired, :ne
432
433
  end
433
434
 
434
- and_or_override(criterion, "$ne")
435
+ and_with_operator(criterion, "$ne")
435
436
  end
436
437
  alias :excludes :ne
437
438
  key :ne, :override, "$ne"
@@ -452,7 +453,7 @@ module Mongoid
452
453
  raise Errors::CriteriaArgumentRequired, :near
453
454
  end
454
455
 
455
- and_or_override(criterion, "$near")
456
+ and_with_operator(criterion, "$near")
456
457
  end
457
458
  key :near, :override, "$near"
458
459
 
@@ -472,7 +473,7 @@ module Mongoid
472
473
  raise Errors::CriteriaArgumentRequired, :near_sphere
473
474
  end
474
475
 
475
- and_or_override(criterion, "$nearSphere")
476
+ and_with_operator(criterion, "$nearSphere")
476
477
  end
477
478
  key :near_sphere, :override, "$nearSphere"
478
479
 
@@ -552,7 +553,7 @@ module Mongoid
552
553
  # @return [ Selectable ] The new selectable.
553
554
  def not(*criteria)
554
555
  if criteria.empty?
555
- dup.tap { |query| query.negating = !query.negating }
556
+ dup.tap { |query| query.negating = true }
556
557
  else
557
558
  criteria.compact.inject(self.clone) do |c, new_s|
558
559
  if new_s.is_a?(Selectable)
@@ -822,12 +823,6 @@ module Mongoid
822
823
  # only ever specify one criterion to #where.
823
824
  @criterion = criterion
824
825
  if criterion.is_a?(String)
825
- unless Mongoid.allow_unsafe_query_operators?
826
- raise Errors::InvalidQuery,
827
- "String criteria are not allowed because they compile to the '$where' operator, " \
828
- 'which is not allowed in a query expression. Set Mongoid.allow_unsafe_query_operators = true ' \
829
- 'to permit all operators.'
830
- end
831
826
  js_query(criterion)
832
827
  else
833
828
  expr_query(criterion)
@@ -837,19 +832,6 @@ module Mongoid
837
832
 
838
833
  private
839
834
 
840
- # Operators permitted at the top level of a query expression without
841
- # opt-in. Excludes $where (JS execution) and other operators not needed
842
- # for ordinary application queries.
843
- ALLOWED_QUERY_OPERATORS = %w[
844
- $and $or $nor $not $text $comment $expr $jsonSchema $alwaysFalse $alwaysTrue
845
- ].freeze
846
-
847
- # Operators that execute server-side JavaScript. These are rejected at
848
- # any depth, not just at the top level: the allowlist above permits
849
- # $expr and the logical operators, and their values are arbitrary
850
- # nested expressions that can carry $function or $where.
851
- JAVASCRIPT_QUERY_OPERATORS = %w[$where $function $accumulator].freeze
852
-
853
835
  # Adds the specified expression to the query.
854
836
  #
855
837
  # Criterion must be a hash in one of the following forms:
@@ -875,8 +857,6 @@ module Mongoid
875
857
  raise Errors::InvalidQuery, "Expression must be a Hash: #{Errors::InvalidQuery.truncate_expr(criterion)}"
876
858
  end
877
859
 
878
- # The operator guard is applied by _mongoid_expand_keys, which every
879
- # query method that accepts a user-supplied expression passes through.
880
860
  normalized = _mongoid_expand_keys(criterion)
881
861
  clone.tap do |query|
882
862
  normalized.each do |field, value|
@@ -892,94 +872,6 @@ module Mongoid
892
872
  end
893
873
  end
894
874
 
895
- # Enforces the operator rules governed by the
896
- # +allow_unsafe_query_operators+ configuration option against a
897
- # normalized query expression.
898
- #
899
- # Two rules apply, and both are skipped when the option is true:
900
- #
901
- # - An operator at the top level of the expression must appear in
902
- # ALLOWED_QUERY_OPERATORS.
903
- # - An operator in JAVASCRIPT_QUERY_OPERATORS is rejected at any depth.
904
- #
905
- # This is called from #_mongoid_expand_keys rather than from the
906
- # individual query methods, because that is the one point every query
907
- # method taking a user-supplied expression passes through on its way to
908
- # the selector.
909
- #
910
- # It deliberately does not cover the APIs that ask for JavaScript
911
- # outright, such as #js_query and Criteria#for_js: there the developer
912
- # has chosen server-side JavaScript, so there is nothing to guard
913
- # against. The same goes for the low-level Storable methods
914
- # (#add_field_expression, #add_operator_expression), which write to the
915
- # selector directly.
916
- #
917
- # @param [ Hash ] expr A normalized query expression.
918
- #
919
- # @raise [ Errors::InvalidQuery ] If a disallowed operator is present.
920
- #
921
- # @api private
922
- def _mongoid_validate_operators!(expr)
923
- return if Mongoid.allow_unsafe_query_operators?
924
-
925
- expr.each_key do |field|
926
- field_s = field.to_s
927
- next unless field_s.start_with?('$')
928
- next if ALLOWED_QUERY_OPERATORS.include?(field_s)
929
-
930
- raise Errors::InvalidQuery,
931
- "Operator '#{field_s}' is not allowed in a query expression. " \
932
- 'Set Mongoid.allow_unsafe_query_operators = true to permit all operators.'
933
- end
934
-
935
- _mongoid_validate_no_javascript!(expr)
936
- end
937
-
938
- # Walks a query expression looking for operators that execute
939
- # server-side JavaScript, descending through both hashes and arrays so
940
- # that nested forms such as {'$expr' => {'$function' => ...}} and
941
- # {'$or' => [ {'$where' => ...} ]} are caught.
942
- #
943
- # The walk does not distinguish operator position from value position,
944
- # so it also rejects queries where a JavaScript operator name appears as
945
- # data rather than as an operator. Server 5.0+ permits $-prefixed field
946
- # names in stored documents, which makes this reachable:
947
- #
948
- # Doc.where(payload: { '$eq' => { '$function' => 'abc' } })
949
- #
950
- # Here the $eq marks its argument as a literal value to compare, so the
951
- # server never evaluates it, but the guard raises anyway. The only
952
- # workaround today is the global allow_unsafe_query_operators flag.
953
- #
954
- # TODO: discuss whether to track operator position (skipping the subtree
955
- # under $eq, $ne, $in, $nin, and $elemMatch values) in a future
956
- # iteration. It removes the false positive but adds exactly the kind of
957
- # state that a real bypass could hide in, so it was left out for now.
958
- #
959
- # @param [ Object ] object A fragment of a query expression.
960
- #
961
- # @raise [ Errors::InvalidQuery ] If a JavaScript operator is present.
962
- #
963
- # @api private
964
- def _mongoid_validate_no_javascript!(object)
965
- case object
966
- when Hash
967
- object.each do |key, value|
968
- key_s = key.to_s
969
- if JAVASCRIPT_QUERY_OPERATORS.include?(key_s)
970
- raise Errors::InvalidQuery,
971
- "Operator '#{key_s}' executes server-side JavaScript and is not allowed " \
972
- 'anywhere in a query expression. Set Mongoid.allow_unsafe_query_operators = true ' \
973
- 'to permit all operators.'
974
- end
975
-
976
- _mongoid_validate_no_javascript!(value)
977
- end
978
- when Array
979
- object.each { |value| _mongoid_validate_no_javascript!(value) }
980
- end
981
- end
982
-
983
875
  # Force the values of the criterion to be evolved.
984
876
  #
985
877
  # @api private
@@ -1042,22 +934,6 @@ module Mongoid
1042
934
  end
1043
935
  end
1044
936
 
1045
- # Combine operator expessions onto a Criteria using either
1046
- # an override or ands depending on the status of the
1047
- # Mongoid.overwrite_chained_operators feature flag.
1048
- #
1049
- # @param [ Hash ] The criterion to add to the criteria.
1050
- # @param [ String ] operator The MongoDB operator.
1051
- #
1052
- # @return [ Criteria ] The resulting criteria.
1053
- def and_or_override(criterion, operator)
1054
- if Mongoid.overwrite_chained_operators
1055
- __override__(criterion, operator)
1056
- else
1057
- and_with_operator(criterion, operator)
1058
- end
1059
- end
1060
-
1061
937
  class << self
1062
938
 
1063
939
  # Get the methods on the selectable that can be forwarded to from a model.
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  module Mongoid
4
5
  class Criteria
@@ -75,7 +76,7 @@ module Mongoid
75
76
 
76
77
  # Get the store name and store value. If the value is of type range,
77
78
  # we need may need to change the store_name as well as the store_value,
78
- # therefore, we cannot just use the evole method.
79
+ # therefore, we cannot just use the evolve method.
79
80
  #
80
81
  # @param [ String ] name The name of the field.
81
82
  # @param [ Object ] serializer The optional serializer for the field.
@@ -151,6 +152,8 @@ module Mongoid
151
152
  # @return [ Object ] The serialized object.
152
153
  def evolve(serializer, value)
153
154
  case value
155
+ when Mongoid::RawValue
156
+ value.raw_value
154
157
  when Hash
155
158
  evolve_hash(serializer, value)
156
159
  when Array
@@ -228,7 +231,7 @@ module Mongoid
228
231
  #
229
232
  # @api private
230
233
  #
231
- # @param [ String ] key The to store the range for.
234
+ # @param [ String ] key The key at which to store the range.
232
235
  # @param [ Object ] serializer The optional serializer for the field.
233
236
  # @param [ Range ] value The Range to serialize.
234
237
  #
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  module Mongoid
4
5
  class Criteria
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  module Mongoid
4
5
  class Criteria
@@ -82,7 +83,7 @@ module Mongoid
82
83
  #
83
84
  # {'$or' => [{'hello' => 'world'}]}
84
85
  #
85
- # ... and operator is '$or' and op_expr is `[{'test' => 123'}]`,
86
+ # ... and operator is '$or' and op_expr is +[{'test' => 123'}]+,
86
87
  # the resulting selector will be:
87
88
  #
88
89
  # {'$or' => [{'hello' => 'world'}, {'test' => 123}]}
@@ -123,7 +124,7 @@ module Mongoid
123
124
  elsif operator == '$and' || selector.empty?
124
125
  # $and can always be added to top level and it will be combined
125
126
  # with whatever other conditions exist.
126
- if !Mongoid.broken_and && current_value = selector[operator]
127
+ if current_value = selector[operator]
127
128
  new_value = current_value + op_expr
128
129
  selector.store(operator, new_value)
129
130
  else
@@ -158,7 +159,7 @@ module Mongoid
158
159
  #
159
160
  # {'foo' => 'bar', '$or' => [{'hello' => 'world'}]}
160
161
  #
161
- # ... and operator is '$or' and op_expr is `{'test' => 123'}`,
162
+ # ... and operator is '$or' and op_expr is +{'test' => 123'}+,
162
163
  # the resulting selector will be:
163
164
  #
164
165
  # {'foo' => 'bar', '$or' => [{'hello' => 'world'}, {'test' => 123}]}
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  require "mongoid/criteria/queryable/expandable"
4
5
  require "mongoid/criteria/queryable/extensions"
@@ -1,7 +1,12 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  module Mongoid
4
5
  class Criteria
6
+
7
+ # Mixin module included in Mongoid::Criteria which adds
8
+ # functionality related to default query scopes and named
9
+ # scopes.
5
10
  module Scopable
6
11
 
7
12
  # Applies the default scope to the criteria.
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  module Mongoid
4
5
  class Criteria
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  require "mongoid/criteria/findable"
4
5
  require "mongoid/criteria/includable"
@@ -40,6 +41,26 @@ module Mongoid
40
41
  include Clients::Sessions
41
42
  include Options
42
43
 
44
+ class << self
45
+ # Convert the given hash to a criteria. Will iterate over each keys in the
46
+ # hash which must correspond to method on a criteria object. The hash
47
+ # must also include a "klass" key.
48
+ #
49
+ # @example Convert the hash to a criteria.
50
+ # Criteria.from_hash({ klass: Band, where: { name: "Depeche Mode" })
51
+ #
52
+ # @param [ Hash ] hash The hash to convert.
53
+ #
54
+ # @return [ Criteria ] The criteria.
55
+ def from_hash(hash)
56
+ criteria = Criteria.new(hash.delete(:klass) || hash.delete('klass'))
57
+ hash.each_pair do |method, args|
58
+ criteria = criteria.__send__(method, args)
59
+ end
60
+ criteria
61
+ end
62
+ end
63
+
43
64
  # Static array used to check with method missing - we only need to ever
44
65
  # instantiate once.
45
66
  CHECK = []
@@ -90,7 +111,8 @@ module Mongoid
90
111
  # enumerator = criteria.find(-> { "Default Band" })
91
112
  #
92
113
  # @param [ [ Object | Array<Object> ]... ] *args The id(s).
93
- # @param [ Proc ] block Optional block to pass.
114
+ # @param &block Optional block to pass.
115
+ # @yield [ Object ] Yields each enumerable element to the block.
94
116
  #
95
117
  # @return [ Document | Array<Document> | nil ] A document or matching documents.
96
118
  #
@@ -158,7 +180,7 @@ module Mongoid
158
180
  #
159
181
  # @return [ Object ] The id.
160
182
  def extract_id
161
- selector.extract_id
183
+ selector['_id'] || selector[:_id] || selector['id'] || selector[:id]
162
184
  end
163
185
 
164
186
  # Adds a criterion to the +Criteria+ that specifies additional options
@@ -221,7 +243,7 @@ module Mongoid
221
243
  # may be desired.
222
244
  #
223
245
  # @example Merge the criteria with another criteria.
224
- # criteri.merge(other_criteria)
246
+ # criteria.merge(other_criteria)
225
247
  #
226
248
  # @example Merge the criteria with a hash. The hash must contain a klass
227
249
  # key and the key/value pairs correspond to method names/args.
@@ -246,16 +268,16 @@ module Mongoid
246
268
  # @example Merge another criteria into this criteria.
247
269
  # criteria.merge(Person.where(name: "bob"))
248
270
  #
249
- # @param [ Criteria ] other The criteria to merge in.
271
+ # @param [ Criteria | Hash ] other The criteria to merge in.
250
272
  #
251
273
  # @return [ Criteria ] The merged criteria.
252
274
  def merge!(other)
253
- criteria = other.to_criteria
254
- selector.merge!(criteria.selector)
255
- options.merge!(criteria.options)
256
- self.documents = criteria.documents.dup unless criteria.documents.empty?
257
- self.scoping_options = criteria.scoping_options
258
- self.inclusions = (inclusions + criteria.inclusions).uniq
275
+ other = self.class.from_hash(other) if other.is_a?(Hash)
276
+ selector.merge!(other.selector)
277
+ options.merge!(other.options)
278
+ self.documents = other.documents.dup unless other.documents.empty?
279
+ self.scoping_options = other.scoping_options
280
+ self.inclusions = (inclusions + other.inclusions).uniq
259
281
  self
260
282
  end
261
283
 
@@ -348,9 +370,11 @@ module Mongoid
348
370
  # criteria.to_criteria
349
371
  #
350
372
  # @return [ Criteria ] self.
373
+ # @deprecated
351
374
  def to_criteria
352
375
  self
353
376
  end
377
+ Mongoid.deprecate(self, :to_criteria)
354
378
 
355
379
  # Convert the criteria to a proc.
356
380
  #
@@ -437,6 +461,8 @@ module Mongoid
437
461
  # @param [ Hash ] scope The scope for the code.
438
462
  #
439
463
  # @return [ Criteria ] The criteria.
464
+ #
465
+ # @deprecated
440
466
  def for_js(javascript, scope = {})
441
467
  code = if scope.empty?
442
468
  # CodeWithScope is not supported for $where as of MongoDB 4.4
@@ -446,6 +472,7 @@ module Mongoid
446
472
  end
447
473
  js_query(code)
448
474
  end
475
+ Mongoid.deprecate(self, :for_js)
449
476
 
450
477
  private
451
478
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  require "mongoid/deprecation"
4
5
 
@@ -1,19 +1,23 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  module Mongoid
4
5
 
5
6
  # Utility class for logging deprecation warnings.
6
7
  class Deprecation < ::ActiveSupport::Deprecation
7
8
 
8
- @gem_name = 'Mongoid'
9
+ def initialize
10
+ # Per change policy, deprecations will be removed in the next major version.
11
+ deprecation_horizon = "#{Mongoid::VERSION.split('.').first.to_i + 1}.0".freeze
12
+ gem_name = 'Mongoid'
13
+ super(deprecation_horizon, gem_name)
14
+ end
9
15
 
10
- # Per change policy, deprecations will be removed in the next major version.
11
- @deprecation_horizon = "#{Mongoid::VERSION.split('.').first.to_i + 1}.0".freeze
12
16
 
13
17
  # Overrides default ActiveSupport::Deprecation behavior
14
18
  # to use Mongoid's logger.
15
19
  #
16
- # @return Array<Proc> The deprecation behavior.
20
+ # @return [ Array<Proc> ] The deprecation behavior.
17
21
  def behavior
18
22
  @behavior ||= Array(->(*args) {
19
23
  logger = Mongoid.logger