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,8 +1,21 @@
1
+ # rubocop:todo all
1
2
  module Mongoid
2
3
  module Matcher
3
4
 
5
+ # Base singleton module used for evaluating whether a given
6
+ # document in-memory matches an MSQL query expression.
7
+ #
4
8
  # @api private
5
9
  module Expression
10
+
11
+ # Returns whether a document satisfies a query expression.
12
+ #
13
+ # @param [ Mongoid::Document ] document The document.
14
+ # @param [ Hash ] expr The expression.
15
+ #
16
+ # @return [ true | false ] Whether the document matches.
17
+ #
18
+ # @api private
6
19
  module_function def matches?(document, expr)
7
20
  if expr.nil?
8
21
  raise Errors::InvalidQuery, "Nil condition in expression context"
@@ -1,6 +1,10 @@
1
+ # rubocop:todo all
1
2
  module Mongoid
2
3
  module Matcher
3
4
 
5
+ # Singleton module provides lookup of logical query operator
6
+ # matchers.
7
+ #
4
8
  # @api private
5
9
  module ExpressionOperator
6
10
  MAP = {
@@ -9,6 +13,16 @@ module Mongoid
9
13
  '$or' => Or,
10
14
  }.freeze
11
15
 
16
+ # Returns the matcher module for a given operator.
17
+ #
18
+ # @param [ String ] op The operator name.
19
+ #
20
+ # @return [ Module ] The matcher module.
21
+ #
22
+ # @raises [ Mongoid::Errors::InvalidExpressionOperator ]
23
+ # Raised if the given operator is unknown.
24
+ #
25
+ # @api private
12
26
  module_function def get(op)
13
27
  MAP.fetch(op)
14
28
  rescue KeyError
@@ -1,8 +1,23 @@
1
+ # rubocop:todo all
1
2
  module Mongoid
2
3
  module Matcher
3
4
 
5
+ # Singleton module used for evaluating whether a given
6
+ # value in-memory matches an MSQL query expression related
7
+ # to a specific field.
8
+ #
4
9
  # @api private
5
10
  module FieldExpression
11
+
12
+ # Returns whether a value satisfies a condition.
13
+ #
14
+ # @param [ true | false ] exists Whether the value exists.
15
+ # @param [ Object ] value The value to check.
16
+ # @param [ Hash | Object ] condition The condition predicate.
17
+ #
18
+ # @return [ true | false ] Whether the value matches.
19
+ #
20
+ # @api private
6
21
  module_function def matches?(exists, value, condition)
7
22
  if condition.is_a?(Hash)
8
23
  condition.all? do |k, cond_v|
@@ -1,6 +1,10 @@
1
+ # rubocop:todo all
1
2
  module Mongoid
2
3
  module Matcher
3
4
 
5
+ # Singleton module provides lookup of query operator matchers
6
+ # related to field values.
7
+ #
4
8
  # @api private
5
9
  module FieldOperator
6
10
  MAP = {
@@ -26,12 +30,27 @@ module Mongoid
26
30
  '$type' => Type,
27
31
  }.freeze
28
32
 
33
+ # Returns the matcher module for a given operator.
34
+ #
35
+ # @param [ String ] op The operator name.
36
+ #
37
+ # @return [ Module ] The matcher module.
38
+ #
39
+ # @raises [ Mongoid::Errors::InvalidFieldOperator ]
40
+ # Raised if the given operator is unknown.
41
+ #
42
+ # @api private
29
43
  module_function def get(op)
30
44
  MAP.fetch(op)
31
45
  rescue KeyError
32
46
  raise Errors::InvalidFieldOperator.new(op)
33
47
  end
34
48
 
49
+ # Used for evaluating $lt, $lte, $gt, $gte comparison operators.
50
+ #
51
+ # @todo Refactor this as it is only relevant to $lt, $lte, $gt, $gte.
52
+ #
53
+ # @api private
35
54
  module_function def apply_array_field_operator(exists, value, condition)
36
55
  if Array === value
37
56
  value.any? { |v| yield v }
@@ -40,6 +59,11 @@ module Mongoid
40
59
  end
41
60
  end
42
61
 
62
+ # Used for evaluating $lt, $lte, $gt, $gte comparison operators.
63
+ #
64
+ # @todo Refactor this as it is only relevant to $lt, $lte, $gt, $gte.
65
+ #
66
+ # @api private
43
67
  module_function def apply_comparison_operator(operator, left, right)
44
68
  left.send(operator, right)
45
69
  rescue ArgumentError, NoMethodError, TypeError
@@ -1,8 +1,23 @@
1
+ # rubocop:todo all
1
2
  module Mongoid
2
3
  module Matcher
3
4
 
5
+ # In-memory matcher for $gt expression.
6
+ #
7
+ # @see https://www.mongodb.com/docs/manual/reference/operator/query/gt/
8
+ #
4
9
  # @api private
5
10
  module Gt
11
+
12
+ # Returns whether a value satisfies a $gt expression.
13
+ #
14
+ # @param [ true | false ] exists Whether the value exists.
15
+ # @param [ Object ] value The value to check.
16
+ # @param [ Object ] condition The $gt condition predicate.
17
+ #
18
+ # @return [ true | false ] Whether the value matches.
19
+ #
20
+ # @api private
6
21
  module_function def matches?(exists, value, condition)
7
22
  case condition
8
23
  when Range
@@ -1,8 +1,23 @@
1
+ # rubocop:todo all
1
2
  module Mongoid
2
3
  module Matcher
3
4
 
5
+ # In-memory matcher for $gte expression.
6
+ #
7
+ # @see https://www.mongodb.com/docs/manual/reference/operator/query/gte/
8
+ #
4
9
  # @api private
5
10
  module Gte
11
+
12
+ # Returns whether a value satisfies a $gte expression.
13
+ #
14
+ # @param [ true | false ] exists Whether the value exists.
15
+ # @param [ Object ] value The value to check.
16
+ # @param [ Object ] condition The $gte condition predicate.
17
+ #
18
+ # @return [ true | false ] Whether the value matches.
19
+ #
20
+ # @api private
6
21
  module_function def matches?(exists, value, condition)
7
22
  case condition
8
23
  when Range
@@ -1,8 +1,23 @@
1
+ # rubocop:todo all
1
2
  module Mongoid
2
3
  module Matcher
3
4
 
5
+ # In-memory matcher for $in expression.
6
+ #
7
+ # @see https://www.mongodb.com/docs/manual/reference/operator/query/in/
8
+ #
4
9
  # @api private
5
10
  module In
11
+
12
+ # Returns whether a value satisfies an $in expression.
13
+ #
14
+ # @param [ true | false ] exists Not used.
15
+ # @param [ Object ] value The value to check.
16
+ # @param [ Array<Object> ] condition The $in condition predicate.
17
+ #
18
+ # @return [ true | false ] Whether the value matches.
19
+ #
20
+ # @api private
6
21
  module_function def matches?(exists, value, condition)
7
22
  unless Array === condition
8
23
  raise Errors::InvalidQuery, "$in argument must be an array: #{Errors::InvalidQuery.truncate_expr(condition)}"
@@ -1,8 +1,23 @@
1
+ # rubocop:todo all
1
2
  module Mongoid
2
3
  module Matcher
3
4
 
5
+ # In-memory matcher for $lt expression.
6
+ #
7
+ # @see https://www.mongodb.com/docs/manual/reference/operator/query/lt/
8
+ #
4
9
  # @api private
5
10
  module Lt
11
+
12
+ # Returns whether a value satisfies a $lt expression.
13
+ #
14
+ # @param [ true | false ] exists Whether the value exists.
15
+ # @param [ Object ] value The value to check.
16
+ # @param [ Object ] condition The $lt condition predicate.
17
+ #
18
+ # @return [ true | false ] Whether the value matches.
19
+ #
20
+ # @api private
6
21
  module_function def matches?(exists, value, condition)
7
22
  case condition
8
23
  when Range
@@ -1,8 +1,23 @@
1
+ # rubocop:todo all
1
2
  module Mongoid
2
3
  module Matcher
3
4
 
5
+ # In-memory matcher for $lte expression.
6
+ #
7
+ # @see https://www.mongodb.com/docs/manual/reference/operator/query/lte/
8
+ #
4
9
  # @api private
5
10
  module Lte
11
+
12
+ # Returns whether a value satisfies a $lte expression.
13
+ #
14
+ # @param [ true | false ] exists Whether the value exists.
15
+ # @param [ Object ] value The value to check.
16
+ # @param [ Object ] condition The $lte condition predicate.
17
+ #
18
+ # @return [ true | false ] Whether the value matches.
19
+ #
20
+ # @api private
6
21
  module_function def matches?(exists, value, condition)
7
22
  case condition
8
23
  when Range
@@ -1,8 +1,24 @@
1
+ # rubocop:todo all
1
2
  module Mongoid
2
3
  module Matcher
3
4
 
5
+ # In-memory matcher for $mod expression.
6
+ #
7
+ # @see https://www.mongodb.com/docs/manual/reference/operator/query/mod/
8
+ #
4
9
  # @api private
5
10
  module Mod
11
+
12
+ # Returns whether a value satisfies a $mod expression.
13
+ #
14
+ # @param [ true | false ] exists Not used.
15
+ # @param [ Numeric ] value The value to check.
16
+ # @param [ Array<Numeric> ] condition The $mod condition predicate,
17
+ # which is a 2-tuple containing the divisor and remainder.
18
+ #
19
+ # @return [ true | false ] Whether the value matches.
20
+ #
21
+ # @api private
6
22
  module_function def matches?(exists, value, condition)
7
23
  unless Array === condition
8
24
  raise Errors::InvalidQuery, "Unknown $mod argument #{condition}"
@@ -1,8 +1,23 @@
1
+ # rubocop:todo all
1
2
  module Mongoid
2
3
  module Matcher
3
4
 
5
+ # In-memory matcher for $ne expression.
6
+ #
7
+ # @see https://www.mongodb.com/docs/manual/reference/operator/query/ne/
8
+ #
4
9
  # @api private
5
10
  module Ne
11
+
12
+ # Returns whether a value satisfies an $ne expression.
13
+ #
14
+ # @param [ true | false ] exists Whether the value exists.
15
+ # @param [ Object ] value The value to check.
16
+ # @param [ Object ] condition The $ne condition predicate.
17
+ #
18
+ # @return [ true | false ] Whether the value matches.
19
+ #
20
+ # @api private
6
21
  module_function def matches?(exists, value, condition)
7
22
  case condition
8
23
  when ::Regexp, BSON::Regexp::Raw
@@ -1,8 +1,23 @@
1
+ # rubocop:todo all
1
2
  module Mongoid
2
3
  module Matcher
3
4
 
5
+ # In-memory matcher for $nin expression.
6
+ #
7
+ # @see https://www.mongodb.com/docs/manual/reference/operator/query/nin/
8
+ #
4
9
  # @api private
5
10
  module Nin
11
+
12
+ # Returns whether a value satisfies a $nin expression.
13
+ #
14
+ # @param [ true | false ] exists Whether the value exists.
15
+ # @param [ Object ] value The value to check.
16
+ # @param [ Array<Object> ] condition The $nin condition predicate.
17
+ #
18
+ # @return [ true | false ] Whether the value matches.
19
+ #
20
+ # @api private
6
21
  module_function def matches?(exists, value, condition)
7
22
  !In.matches?(exists, value, condition)
8
23
  end
@@ -1,8 +1,22 @@
1
+ # rubocop:todo all
1
2
  module Mongoid
2
3
  module Matcher
3
4
 
5
+ # In-memory matcher for $nor expression.
6
+ #
7
+ # @see https://www.mongodb.com/docs/manual/reference/operator/query/nor/
8
+ #
4
9
  # @api private
5
10
  module Nor
11
+
12
+ # Returns whether a document satisfies a $nor expression.
13
+ #
14
+ # @param [ Mongoid::Document ] document The document.
15
+ # @param [ Array<Hash> ] expr The $nor conditions.
16
+ #
17
+ # @return [ true | false ] Whether the document matches.
18
+ #
19
+ # @api private
6
20
  module_function def matches?(document, expr)
7
21
  unless expr.is_a?(Array)
8
22
  raise Errors::InvalidQuery, "$nor argument must be an array: #{Errors::InvalidQuery.truncate_expr(expr)}"
@@ -1,8 +1,24 @@
1
+ # rubocop:todo all
1
2
  module Mongoid
2
3
  module Matcher
3
4
 
5
+ # In-memory matcher for $not expression.
6
+ #
7
+ # @see https://www.mongodb.com/docs/manual/reference/operator/query/not/
8
+ #
4
9
  # @api private
5
10
  module Not
11
+
12
+ # Returns whether a value satisfies an $not expression.
13
+ #
14
+ # @param [ true | false ] exists Whether the value exists.
15
+ # @param [ Object ] value The value to check.
16
+ # @param [ Hash | Regexp | BSON::Regexp::Raw ] condition
17
+ # The $not condition predicate.
18
+ #
19
+ # @return [ true | false ] Whether the value matches.
20
+ #
21
+ # @api private
6
22
  module_function def matches?(exists, value, condition)
7
23
  case condition
8
24
  when ::Regexp, BSON::Regexp::Raw
@@ -1,8 +1,22 @@
1
+ # rubocop:todo all
1
2
  module Mongoid
2
3
  module Matcher
3
4
 
5
+ # In-memory matcher for $or expression.
6
+ #
7
+ # @see https://www.mongodb.com/docs/manual/reference/operator/query/or/
8
+ #
4
9
  # @api private
5
10
  module Or
11
+
12
+ # Returns whether a document satisfies an $or expression.
13
+ #
14
+ # @param [ Mongoid::Document ] document The document.
15
+ # @param [ Array<Hash> ] expr The $or conditions.
16
+ #
17
+ # @return [ true | false ] Whether the document matches.
18
+ #
19
+ # @api private
6
20
  module_function def matches?(document, expr)
7
21
  unless expr.is_a?(Array)
8
22
  raise Errors::InvalidQuery, "$or argument must be an array: #{Errors::InvalidQuery.truncate_expr(expr)}"
@@ -1,31 +1,56 @@
1
+ # rubocop:todo all
1
2
  module Mongoid
2
3
  module Matcher
3
4
 
5
+ # In-memory matcher for $regex expression.
6
+ #
7
+ # @see https://www.mongodb.com/docs/manual/reference/operator/query/regex/
8
+ #
4
9
  # @api private
5
10
  module Regex
6
- module_function def matches?(_exists, value, condition)
7
- unless condition.is_a?(Regexp) || condition.is_a?(BSON::Regexp::Raw)
11
+
12
+ # Returns whether a value satisfies a $regex expression.
13
+ #
14
+ # @param [ true | false ] exists Not used.
15
+ # @param [ String | Array<String> ] value The value to check.
16
+ # @param [ Regexp | BSON::Regexp::Raw ] condition The $regex condition.
17
+ #
18
+ # @return [ true | false ] Whether the value matches.
19
+ #
20
+ # @api private
21
+ module_function def matches?(exists, value, condition)
22
+ condition = case condition
23
+ when Regexp
24
+ condition
25
+ when BSON::Regexp::Raw
26
+ condition.compile
27
+ else
8
28
  # Note that strings must have been converted to a regular expression
9
29
  # instance already (with $options taken into account, if provided).
10
30
  raise Errors::InvalidQuery, "$regex requires a regular expression argument: #{Errors::InvalidQuery.truncate_expr(condition)}"
11
31
  end
12
32
 
13
- # The condition is compiled by RegexpBudget rather than here, so that
14
- # the budget's timeout can be baked into the pattern.
15
33
  case value
16
34
  when Array
17
- # Object#=~ is gone as of Ruby 3.2, so an element that cannot be
18
- # matched against has to be rejected rather than passed to =~.
19
35
  value.any? do |v|
20
- v.respond_to?(:=~) && RegexpBudget.match?(v, condition)
36
+ v =~ condition
21
37
  end
22
38
  when String
23
- RegexpBudget.match?(value, condition)
39
+ value =~ condition
24
40
  else
25
41
  false
26
42
  end
27
43
  end
28
44
 
45
+ # Returns whether an scalar or array value matches a Regexp.
46
+ #
47
+ # @param [ true | false ] exists Not used.
48
+ # @param [ String | Array<String> ] value The value to check.
49
+ # @param [ Regexp ] condition The Regexp condition.
50
+ #
51
+ # @return [ true | false ] Whether the value matches.
52
+ #
53
+ # @api private
29
54
  module_function def matches_array_or_scalar?(value, condition)
30
55
  if Array === value
31
56
  value.any? do |v|
@@ -1,8 +1,24 @@
1
+ # rubocop:todo all
1
2
  module Mongoid
2
3
  module Matcher
3
4
 
5
+ # In-memory matcher for $size expression.
6
+ #
7
+ # @see https://www.mongodb.com/docs/manual/reference/operator/query/size/
8
+ #
4
9
  # @api private
5
10
  module Size
11
+
12
+ # Returns whether a value satisfies a $size expression.
13
+ #
14
+ # @param [ true | false ] exists Not used.
15
+ # @param [ Numeric ] value The value to check.
16
+ # @param [ Integer | Array<Object> ] condition The $size condition
17
+ # predicate, either a non-negative Integer or an Array to match size.
18
+ #
19
+ # @return [ true | false ] Whether the value matches.
20
+ #
21
+ # @api private
6
22
  module_function def matches?(exists, value, condition)
7
23
  case condition
8
24
  when Float
@@ -1,10 +1,24 @@
1
+ # rubocop:todo all
1
2
  module Mongoid
2
3
  module Matcher
3
4
 
5
+ # In-memory matcher for $type expression.
6
+ #
4
7
  # @see https://www.mongodb.com/docs/manual/reference/operator/query/type/
5
8
  #
6
9
  # @api private
7
10
  module Type
11
+
12
+ # Returns whether a value satisfies a $type expression.
13
+ #
14
+ # @param [ true | false ] exists Whether the value exists.
15
+ # @param [ Object ] value The value to check.
16
+ # @param [ Integer | Array<Integer> ] condition The $type condition
17
+ # predicate which corresponds to the BSON type enumeration.
18
+ #
19
+ # @return [ true | false ] Whether the value matches.
20
+ #
21
+ # @api private
8
22
  module_function def matches?(exists, value, condition)
9
23
  conditions = case condition
10
24
  when Array
@@ -22,6 +36,17 @@ module Mongoid
22
36
  false
23
37
  end
24
38
 
39
+ # Returns whether a value satisfies a single $type expression
40
+ # value.
41
+ #
42
+ # @param [ true | false ] exists Whether the value exists.
43
+ # @param [ Object ] value The value to check.
44
+ # @param [ Integer ] condition The $type condition predicate
45
+ # which corresponds to the BSON type enumeration.
46
+ #
47
+ # @return [ true | false ] Whether the value matches.
48
+ #
49
+ # @api private
25
50
  module_function def one_matches?(exists, value, condition)
26
51
  case condition
27
52
  when 1
@@ -1,5 +1,9 @@
1
+ # rubocop:todo all
1
2
  module Mongoid
2
3
 
4
+ # Utility module containing methods which assist in performing
5
+ # in-memory matching of documents with MQL query expressions.
6
+ #
3
7
  # @api private
4
8
  module Matcher
5
9
  # Extracts field values in the document at the specified key.
@@ -35,25 +39,11 @@ module Mongoid
35
39
  # from and behaves identically to association traversal for the purposes
36
40
  # of, for example, subsequent array element retrieval.
37
41
  #
38
- # @param [ Document | Hash | String ] document The document to extract from.
42
+ # @param [ Document | Hash ] document The document to extract from.
39
43
  # @param [ String ] key The key path to extract.
40
44
  #
41
45
  # @return [ Object | Array ] Field value or values.
42
46
  module_function def extract_attribute(document, key)
43
- # The matcher system will wind up sending atomic values to this as well,
44
- # when attepting to match more complex types. If anything other than a
45
- # Document or a Hash is given, we'll short-circuit the logic and just
46
- # return an empty array.
47
- return [] unless document.is_a?(Hash) || document.is_a?(Document)
48
-
49
- # Performance optimization; if the key does not include a '.' character,
50
- # it must reference an immediate attribute of the document.
51
- unless key.include?('.')
52
- hash = document.respond_to?(:attributes) ? document.attributes : document
53
- key = find_exact_key(hash, key)
54
- return key ? [ hash[key] ] : []
55
- end
56
-
57
47
  if document.respond_to?(:as_attributes, true)
58
48
  # If a document has hash fields, as_attributes would keep those fields
59
49
  # as Hash instances which do not offer indifferent access.
@@ -138,7 +128,6 @@ require 'mongoid/matcher/nor'
138
128
  require 'mongoid/matcher/not'
139
129
  require 'mongoid/matcher/or'
140
130
  require 'mongoid/matcher/regex'
141
- require 'mongoid/matcher/regexp_budget'
142
131
  require 'mongoid/matcher/size'
143
132
  require 'mongoid/matcher/type'
144
133
  require 'mongoid/matcher/expression_operator'
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  module Mongoid
4
5
  module Persistable
@@ -83,6 +84,7 @@ module Mongoid
83
84
  # @return [ true ] true.
84
85
  def post_process_insert
85
86
  self.new_record = false
87
+ remember_storage_options!
86
88
  flag_descendants_persisted
87
89
  true
88
90
  end
@@ -103,15 +105,18 @@ module Mongoid
103
105
  raise Errors::ReadonlyDocument.new(self.class) if readonly? && !Mongoid.legacy_readonly
104
106
  return self if performing_validations?(options) &&
105
107
  invalid?(options[:context] || :create)
106
- run_callbacks(:save, with_children: false) do
107
- run_callbacks(:create, with_children: false) do
108
- run_callbacks(:persist_parent, with_children: false) do
109
- _mongoid_run_child_callbacks(:save) do
110
- _mongoid_run_child_callbacks(:create) do
111
- result = yield(self)
112
- if !result.is_a?(Document) || result.errors.empty?
113
- post_process_insert
114
- post_process_persist(result, options)
108
+ ensure_client_compatibility!
109
+ run_callbacks(:commit, with_children: true, skip_if: -> { in_transaction? }) do
110
+ run_callbacks(:save, with_children: false) do
111
+ run_callbacks(:create, with_children: false) do
112
+ run_callbacks(:persist_parent, with_children: false) do
113
+ _mongoid_run_child_callbacks(:save) do
114
+ _mongoid_run_child_callbacks(:create) do
115
+ result = yield(self)
116
+ if !result.is_a?(Document) || result.errors.empty?
117
+ post_process_insert
118
+ post_process_persist(result, options)
119
+ end
115
120
  end
116
121
  end
117
122
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  module Mongoid
4
5
  module Persistable
@@ -12,7 +13,11 @@ module Mongoid
12
13
  # @example Remove the document.
13
14
  # document.remove
14
15
  #
15
- # @param [ Hash ] options Options to pass to remove.
16
+ # @param [ Hash ] options The options.
17
+ # @option options [ true | false ] :persist Whether to persist
18
+ # the delete action.
19
+ # @option options [ true | false ] :suppress Whether to update
20
+ # the parent document in-memory when deleting an embedded document.
16
21
  #
17
22
  # @return [ TrueClass ] True.
18
23
  def delete(options = {})
@@ -99,7 +104,7 @@ module Mongoid
99
104
  # collection.find(atomic_selector).remove
100
105
  # end
101
106
  #
102
- # @return [ Object ] The result of the block.
107
+ # @return [ true ] If the object was deleted successfully.
103
108
  def prepare_delete
104
109
  raise Errors::ReadonlyDocument.new(self.class) if readonly?
105
110
  yield(self)