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,18 +1,60 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # TODO: consider refactoring this Proxy class, to satisfy the following
4
+ # cops...
5
+ # rubocop:disable Metrics/ClassLength
3
6
  module Mongoid
4
7
  module Association
5
8
  module Referenced
6
9
  class HasMany
7
-
8
- # This class defines the behavior for all associations that are a
9
- # one-to-many between documents in different collections.
10
+ # Transparent proxy for has_many associations.
11
+ # An instance of this class is returned when calling the
12
+ # association getter method on the subject document. This class
13
+ # inherits from Mongoid::Association::Proxy and forwards most of its
14
+ # methods to the target of the association, i.e. the array of
15
+ # documents on the opposite-side collection which must be loaded.
10
16
  class Proxy < Association::Many
11
17
  extend Forwardable
12
18
 
19
+ # class-level methods for HasMany::Proxy
20
+ module ClassMethods
21
+ def eager_loader(association, docs)
22
+ Eager.new(association, docs)
23
+ end
24
+
25
+ # Returns true if the association is an embedded one. In this case
26
+ # always false.
27
+ #
28
+ # @example Is this association embedded?
29
+ # Referenced::Many.embedded?
30
+ #
31
+ # @return [ false ] Always false.
32
+ def embedded?
33
+ false
34
+ end
35
+ end
36
+
37
+ extend ClassMethods
38
+
13
39
  def_delegator :criteria, :count
14
40
  def_delegators :_target, :first, :in_memory, :last, :reset, :uniq
15
41
 
42
+ # Instantiate a new references_many association. Will set the foreign key
43
+ # and the base on the inverse object.
44
+ #
45
+ # @example Create the new association.
46
+ # Referenced::Many.new(base, target, association)
47
+ #
48
+ # @param [ Document ] base The document this association hangs off of.
49
+ # @param [ Array<Document> ] target The target of the association.
50
+ # @param [ Mongoid::Association::Relatable ] association The association metadata.
51
+ def initialize(base, target, association)
52
+ enum = HasMany::Enumerable.new(target, base, association)
53
+ super(base, enum, association) do
54
+ raise_mixed if klass.embedded? && !klass.cyclic?
55
+ end
56
+ end
57
+
16
58
  # Appends a document or array of documents to the association. Will set
17
59
  # the parent and update the index in the process.
18
60
  #
@@ -31,14 +73,15 @@ module Mongoid
31
73
  def <<(*args)
32
74
  docs = args.flatten
33
75
  return concat(docs) if docs.size > 1
34
- if doc = docs.first
76
+
77
+ if (doc = docs.first)
35
78
  append(doc)
36
79
  doc.save if persistable? && !_assigning? && !doc.validated?
37
80
  end
38
81
  self
39
82
  end
40
83
 
41
- alias :push :<<
84
+ alias push <<
42
85
 
43
86
  # Appends an array of documents to the association. Performs a batch
44
87
  # insert of the documents instead of persisting one at a time.
@@ -53,9 +96,11 @@ module Mongoid
53
96
  docs, inserts = [], []
54
97
  documents.each do |doc|
55
98
  next unless doc
99
+
56
100
  append(doc)
57
101
  save_or_delay(doc, docs, inserts) if persistable?
58
102
  end
103
+
59
104
  persist_delayed(docs, inserts)
60
105
  self
61
106
  end
@@ -71,16 +116,16 @@ module Mongoid
71
116
  #
72
117
  # @return [ Document ] The new document.
73
118
  def build(attributes = {}, type = nil)
74
- doc = Factory.execute_build(type || klass, attributes, execute_callbacks: false)
75
- append(doc)
76
- doc.apply_post_processed_defaults
77
- yield(doc) if block_given?
78
- doc.run_pending_callbacks
79
- doc.run_callbacks(:build) { doc }
80
- doc
119
+ Factory.execute_build(type || klass, attributes, execute_callbacks: false).tap do |doc|
120
+ append(doc)
121
+ doc.apply_post_processed_defaults
122
+ yield doc if block_given?
123
+ doc.run_pending_callbacks
124
+ doc.run_callbacks(:build) { doc }
125
+ end
81
126
  end
82
127
 
83
- alias :new :build
128
+ alias new build
84
129
 
85
130
  # Delete the document from the association. This will set the foreign key
86
131
  # on the document to nil. If the dependent options on the association are
@@ -94,14 +139,14 @@ module Mongoid
94
139
  # @return [ Document ] The matching document.
95
140
  def delete(document)
96
141
  execute_callbacks_around(:remove, document) do
97
- _target.delete(document) do |doc|
142
+ result = _target.delete(document) do |doc|
98
143
  if doc
99
144
  unbind_one(doc)
100
- cascade!(doc) if !_assigning?
145
+ cascade!(doc) unless _assigning?
101
146
  end
102
- end.tap do
103
- reset_unloaded
104
147
  end
148
+
149
+ result.tap { reset_unloaded }
105
150
  end
106
151
  end
107
152
 
@@ -152,9 +197,9 @@ module Mongoid
152
197
  # end
153
198
  #
154
199
  # @return [ Array<Document> ] The loaded docs.
155
- def each
156
- if block_given?
157
- _target.each { |doc| yield(doc) }
200
+ def each(&block)
201
+ if block
202
+ _target.each(&block)
158
203
  else
159
204
  to_enum
160
205
  end
@@ -213,7 +258,8 @@ module Mongoid
213
258
  # later.
214
259
  #
215
260
  # @param [ [ Object | Array<Object> ]... ] *args The ids.
216
- # @param [ Proc ] block Optional block to pass.
261
+ # @param &block Optional block to pass.
262
+ # @yield [ Object ] Yields each enumerable element to the block.
217
263
  #
218
264
  # @return [ Document | Array<Document> | nil ] A document or matching documents.
219
265
  def find(*args, &block)
@@ -222,22 +268,6 @@ module Mongoid
222
268
  matching
223
269
  end
224
270
 
225
- # Instantiate a new references_many association. Will set the foreign key
226
- # and the base on the inverse object.
227
- #
228
- # @example Create the new association.
229
- # Referenced::Many.new(base, target, association)
230
- #
231
- # @param [ Document ] base The document this association hangs off of.
232
- # @param [ Array<Document> ] target The target of the association.
233
- # @param [ Association ] association The association metadata.
234
- def initialize(base, target, association)
235
- enum = HasMany::Enumerable.new(target, base, association)
236
- init(base, enum, association) do
237
- raise_mixed if klass.embedded? && !klass.cyclic?
238
- end
239
- end
240
-
241
271
  # Removes all associations between the base document and the target
242
272
  # documents by deleting the foreign keys and the references, orphaning
243
273
  # the target documents in the process.
@@ -252,7 +282,7 @@ module Mongoid
252
282
  end
253
283
  end
254
284
 
255
- alias :nullify_all :nullify
285
+ alias nullify_all nullify
256
286
 
257
287
  # Clear the association. Will delete the documents from the db if they are
258
288
  # already persisted.
@@ -262,27 +292,27 @@ module Mongoid
262
292
  #
263
293
  # @return [ Many ] The association emptied.
264
294
  def purge
265
- unless _association.destructive?
266
- nullify
267
- else
268
- after_remove_error = nil
269
- criteria.delete_all
270
- many = _target.clear do |doc|
271
- execute_callback :before_remove, doc
272
- unbind_one(doc)
273
- doc.destroyed = true
274
- begin
275
- execute_callback :after_remove, doc
276
- rescue => e
277
- after_remove_error = e
278
- end
295
+ return nullify unless _association.destructive?
296
+
297
+ after_remove_error = nil
298
+ criteria.delete_all
299
+ many = _target.clear do |doc|
300
+ execute_callback :before_remove, doc
301
+ unbind_one(doc)
302
+ doc.destroyed = true
303
+ begin
304
+ execute_callback :after_remove, doc
305
+ rescue StandardError => e
306
+ after_remove_error = e
279
307
  end
280
- raise after_remove_error if after_remove_error
281
- many
282
308
  end
309
+
310
+ raise after_remove_error if after_remove_error
311
+
312
+ many
283
313
  end
284
314
 
285
- alias :clear :purge
315
+ alias clear purge
286
316
 
287
317
  # Substitutes the supplied target documents for the existing documents
288
318
  # in the association. If the new target is nil, perform the necessary
@@ -297,7 +327,7 @@ module Mongoid
297
327
  def substitute(replacement)
298
328
  if replacement
299
329
  new_docs, docs = replacement.compact, []
300
- new_ids = new_docs.map { |doc| doc._id }
330
+ new_ids = new_docs.map(&:_id)
301
331
  remove_not_in(new_ids)
302
332
  new_docs.each do |doc|
303
333
  docs.push(doc) if doc.send(foreign_key) != _base.send(_association.primary_key)
@@ -363,9 +393,9 @@ module Mongoid
363
393
  # association is persisted.
364
394
  def already_related?(document)
365
395
  document.persisted? &&
366
- document._association &&
367
- document.respond_to?(document._association.foreign_key) &&
368
- document.__send__(document._association.foreign_key) == _base._id
396
+ document._association &&
397
+ document.respond_to?(document._association.foreign_key) &&
398
+ document.__send__(document._association.foreign_key) == _base._id
369
399
  end
370
400
 
371
401
  # Instantiate the binding associated with this association.
@@ -409,15 +439,15 @@ module Mongoid
409
439
  #
410
440
  # @return [ true | false ] If the association is destructive.
411
441
  def cascade!(document)
412
- if persistable?
413
- case _association.dependent
414
- when :delete_all
415
- document.delete
416
- when :destroy
417
- document.destroy
418
- else
419
- document.save
420
- end
442
+ return unless persistable?
443
+
444
+ case _association.dependent
445
+ when :delete_all
446
+ document.delete
447
+ when :destroy
448
+ document.destroy
449
+ else
450
+ document.save
421
451
  end
422
452
  end
423
453
 
@@ -428,9 +458,13 @@ module Mongoid
428
458
  #
429
459
  # @param [ Symbol | String ] name The name of the method.
430
460
  # @param [ Object... ] *args The method args
431
- # @param [ Proc ] block Optional block to pass.
461
+ # @param &block Optional block to pass.
432
462
  #
433
463
  # @return [ Criteria | Object ] A Criteria or return value from the target.
464
+ #
465
+ # TODO: make sure we are consistingly using respond_to_missing
466
+ # anywhere we define method_missing.
467
+ # rubocop:disable Style/MissingRespondToMissing
434
468
  ruby2_keywords def method_missing(name, *args, &block)
435
469
  if _target.respond_to?(name)
436
470
  _target.send(name, *args, &block)
@@ -440,6 +474,7 @@ module Mongoid
440
474
  end
441
475
  end
442
476
  end
477
+ # rubocop:enable Style/MissingRespondToMissing
443
478
 
444
479
  # Persist all the delayed batch inserts.
445
480
  #
@@ -451,13 +486,13 @@ module Mongoid
451
486
  # @param [ Array<Document> ] docs The delayed inserts.
452
487
  # @param [ Array<Hash> ] inserts The raw insert document.
453
488
  def persist_delayed(docs, inserts)
454
- unless docs.empty?
455
- collection.insert_many(inserts, session: _session)
456
- docs.each do |doc|
457
- doc.new_record = false
458
- doc.run_after_callbacks(:create, :save) unless _association.autosave?
459
- doc.post_persist
460
- end
489
+ return if docs.empty?
490
+
491
+ collection.insert_many(inserts, session: _session)
492
+ docs.each do |doc|
493
+ doc.new_record = false
494
+ doc.run_after_callbacks(:create, :save) unless _association.autosave?
495
+ doc.post_persist
461
496
  end
462
497
  end
463
498
 
@@ -468,7 +503,7 @@ module Mongoid
468
503
  #
469
504
  # @return [ true | false ] If the association is persistable.
470
505
  def persistable?
471
- !_binding? && (_creating? || _base.persisted? && !_building?)
506
+ !_binding? && (_creating? || (_base.persisted? && !_building?))
472
507
  end
473
508
 
474
509
  # Deletes all related documents from the database given the supplied
@@ -486,111 +521,12 @@ module Mongoid
486
521
  # @return [ Integer ] The number of documents deleted.
487
522
  def remove_all(conditions = nil, method = :delete_all)
488
523
  selector = conditions || {}
489
- selector.merge!(criteria.selector)
490
-
491
- # Scanning before the delete means scanning only what is already in
492
- # memory, so it is only done where there is a pattern whose cost has
493
- # to be bounded. Everywhere else the delete comes first and the scan
494
- # sees the survivors, which is what this association has always
495
- # done.
496
- #
497
- # The limit is read once and carried into whichever branch is taken.
498
- # Letting the branch below ask again would read it a second time,
499
- # across a server round trip, and a limit that had become positive
500
- # in the meantime would put a deadline on the delete_if -- a query,
501
- # and an unbind of every match -- which is the arrangement this
502
- # branch exists to avoid.
503
- limit = Matcher::RegexpBudget.limit_for(selector)
504
- return remove_all_bounded(selector, method, limit) if limit
505
-
506
- removed = klass.send(method, selector)
507
-
508
- # No scope around this. The scan runs after the delete, so the
509
- # association this loads comes back holding only what the delete did
510
- # not match, and there is no pattern here to bound in any case.
511
- # Opening a scope would save _matches? from deciding once per
512
- # document -- 0.48us against 1.74us for the match itself -- but a
513
- # scope with nothing to bound suppresses that decision for
514
- # everything nested inside it, and loading the association runs
515
- # find callbacks. A pattern in a selector one of those evaluates
516
- # would go unguarded, which costs more than the saving is worth on a
517
- # path that has just made two round trips.
524
+ removed = klass.send(method, selector.merge!(criteria.selector))
518
525
  _target.delete_if do |doc|
519
526
  doc._matches?(selector).tap do |b|
520
527
  unbind_one(doc) if b
521
528
  end
522
529
  end
523
-
524
- removed
525
- end
526
-
527
- # Deletes all related documents matching a selector that carries a
528
- # regular expression, with the whole scan under one regexp budget.
529
- #
530
- # The scan runs before anything is deleted, so a budget that runs out
531
- # leaves both the database and the association untouched rather than
532
- # reporting a failure for a delete that has already happened. It also
533
- # means the budget is closed by the time the association is mutated,
534
- # so where the budget is enforced with Timeout there is no window for
535
- # the exception to land in the middle of an unbind.
536
- #
537
- # @param [ Hash ] selector The selector to delete with.
538
- # @param [ Symbol ] method The deletion method to call.
539
- # @param [ Float ] limit The seconds the scan may spend, as read by
540
- # the caller when it chose this path.
541
- #
542
- # @return [ Integer ] The number of documents deleted.
543
- def remove_all_bounded(selector, method, limit)
544
- # Only what the association already holds. Iterating it instead
545
- # would load the whole association before the delete, and for a
546
- # broad pattern that is every document the association has: /.*/ is
547
- # both the cheapest pattern an attacker can supply and the one that
548
- # matches everything, so bounding the cost of the matching would
549
- # have been paid for with an unbounded amount of memory. Nothing is
550
- # missed by not loading, because the server evaluates the same
551
- # selector for the delete itself.
552
- #
553
- # It also means the scan runs no query, so no deadline of ours can
554
- # land on one. Where the budget is enforced with Timeout, covering
555
- # a query would report a slow network as a regexp timeout and could
556
- # deliver the asynchronous exception inside the driver's socket
557
- # read.
558
- documents = _target.in_memory
559
-
560
- matching = Matcher::RegexpBudget.open_with(limit) do
561
- documents.select { |doc| doc._matches?(selector) }
562
- end
563
-
564
- removed = klass.send(method, selector)
565
-
566
- # The ids are already known to be in memory, so the loaded and added
567
- # documents can be dropped directly. Enumerable#delete would look
568
- # each one up by id and stop at the first hash that has it, which
569
- # removes the wrong instance when both hashes hold one for the same
570
- # id. Enumerable#delete_if drops it from both, as this does, but
571
- # only after load_all!, which is the load this scan exists to avoid.
572
- #
573
- # Which documents get unbound has always depended on which ones
574
- # happened to be in memory, and scanning only what is in memory
575
- # keeps that. It matters for has_and_belongs_to_many, whose
576
- # unbind_one pulls the id out of the foreign key array on _base and
577
- # marks it dirty; the scan used to run after the delete, against an
578
- # association that a cold proxy had just reloaded as holding only
579
- # the survivors, so nothing matched and nothing was unbound.
580
- #
581
- # TODO: unbinding should not depend on what was in memory. Every
582
- # matched document leaves the association, so every one of them
583
- # should be unbound, which would also stop _base's foreign key
584
- # array from keeping ids that no longer resolve. That is a
585
- # behaviour change for has_and_belongs_to_many and belongs in a
586
- # ticket of its own, with a release note; it should not ride along
587
- # on this one.
588
- matching.each do |doc|
589
- unbind_one(doc)
590
- _target._loaded.delete(doc._id)
591
- _target._added.delete(doc._id)
592
- end
593
-
594
530
  removed
595
531
  end
596
532
 
@@ -603,20 +539,29 @@ module Mongoid
603
539
  # @param [ Array<Object> ] ids The ids.
604
540
  def remove_not_in(ids)
605
541
  removed = criteria.not_in(_id: ids)
542
+
543
+ update_or_delete_all(removed)
544
+
545
+ in_memory.each do |doc|
546
+ next if ids.include?(doc._id)
547
+
548
+ unbind_one(doc)
549
+ _target.delete(doc)
550
+ doc.destroyed = true if _association.destructive?
551
+ end
552
+ end
553
+
554
+ # If the association is destructive, the matching documents will
555
+ # be removed. Otherwise, their foreign keys will be set to nil.
556
+ #
557
+ # @param [ Criteria ] removed The criteria for the documents to
558
+ # remove.
559
+ def update_or_delete_all(removed)
606
560
  if _association.destructive?
607
561
  removed.delete_all
608
562
  else
609
563
  removed.update_all(foreign_key => nil)
610
564
  end
611
- in_memory.each do |doc|
612
- if !ids.include?(doc._id)
613
- unbind_one(doc)
614
- _target.delete(doc)
615
- if _association.destructive?
616
- doc.destroyed = true
617
- end
618
- end
619
- end
620
565
  end
621
566
 
622
567
  # Save a persisted document immediately or delay a new document for
@@ -638,26 +583,9 @@ module Mongoid
638
583
  doc.save
639
584
  end
640
585
  end
641
-
642
- class << self
643
-
644
- def eager_loader(association, docs)
645
- Eager.new(association, docs)
646
- end
647
-
648
- # Returns true if the association is an embedded one. In this case
649
- # always false.
650
- #
651
- # @example Is this association embedded?
652
- # Referenced::Many.embedded?
653
- #
654
- # @return [ false ] Always false.
655
- def embedded?
656
- false
657
- end
658
- end
659
586
  end
660
587
  end
661
588
  end
662
589
  end
663
590
  end
591
+ # rubocop:enable Metrics/ClassLength
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  require 'mongoid/association/referenced/has_many/binding'
4
5
  require 'mongoid/association/referenced/has_many/buildable'
@@ -46,7 +47,7 @@ module Mongoid
46
47
 
47
48
  # The list of association complements.
48
49
  #
49
- # @return [ Array<Association> ] The association complements.
50
+ # @return [ Array<Mongoid::Association::Relatable> ] The association complements.
50
51
  def relation_complements
51
52
  @relation_complements ||= [ Referenced::BelongsTo ].freeze
52
53
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  module Mongoid
4
5
  module Association
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  module Mongoid
4
5
  module Association
@@ -1,12 +1,12 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  module Mongoid
4
5
  module Association
5
6
  module Referenced
6
-
7
7
  class HasOne
8
-
9
- class Eager < Association::Referenced::Eager::Base
8
+ # Eager class for has_one associations.
9
+ class Eager < Association::Eager
10
10
 
11
11
  private
12
12
 
@@ -4,10 +4,32 @@ module Mongoid
4
4
  module Association
5
5
  module Referenced
6
6
  class HasOne
7
-
8
- # This class defines the behavior for all associations that are a
9
- # one-to-one between documents in different collections.
7
+ # Transparent proxy for has_one associations.
8
+ # An instance of this class is returned when calling the
9
+ # association getter method on the subject document. This class
10
+ # inherits from Mongoid::Association::Proxy and forwards most of
11
+ # its methods to the target of the association, i.e. the
12
+ # document on the opposite-side collection which must be loaded.
10
13
  class Proxy < Association::One
14
+ # class-level methods for the HasOne::Proxy
15
+ module ClassMethods
16
+ def eager_loader(association, docs)
17
+ Eager.new(association, docs)
18
+ end
19
+
20
+ # Returns true if the association is an embedded one. In this case
21
+ # always false.
22
+ #
23
+ # @example Is this association embedded?
24
+ # Referenced::One.embedded?
25
+ #
26
+ # @return [ false ] Always false.
27
+ def embedded?
28
+ false
29
+ end
30
+ end
31
+
32
+ extend ClassMethods
11
33
 
12
34
  # Instantiate a new references_one association. Will set the foreign key
13
35
  # and the base on the inverse object.
@@ -17,9 +39,9 @@ module Mongoid
17
39
  #
18
40
  # @param [ Document ] base The document this association hangs off of.
19
41
  # @param [ Document ] target The target (child) of the association.
20
- # @param [ Association ] association The association metadata.
42
+ # @param [ Mongoid::Association::Relatable ] association The association metadata.
21
43
  def initialize(base, target, association)
22
- init(base, target, association) do
44
+ super do
23
45
  raise_mixed if klass.embedded? && !klass.cyclic?
24
46
  characterize_one(_target)
25
47
  bind_one
@@ -49,16 +71,7 @@ module Mongoid
49
71
  #
50
72
  # @return [ One ] The association.
51
73
  def substitute(replacement)
52
- if self != replacement
53
- unbind_one
54
- if persistable?
55
- if _association.destructive?
56
- send(_association.dependent)
57
- else
58
- save if persisted?
59
- end
60
- end
61
- end
74
+ prepare_for_replacement if self != replacement
62
75
  HasOne::Proxy.new(_base, replacement, _association) if replacement
63
76
  end
64
77
 
@@ -84,21 +97,17 @@ module Mongoid
84
97
  _base.persisted? && !_binding? && !_building?
85
98
  end
86
99
 
87
- class << self
100
+ # Takes the necessary steps to prepare for the current document
101
+ # to be replaced by a non-nil substitute.
102
+ def prepare_for_replacement
103
+ unbind_one
88
104
 
89
- def eager_loader(association, docs)
90
- Eager.new(association, docs)
91
- end
105
+ return unless persistable?
92
106
 
93
- # Returns true if the association is an embedded one. In this case
94
- # always false.
95
- #
96
- # @example Is this association embedded?
97
- # Referenced::One.embedded?
98
- #
99
- # @return [ false ] Always false.
100
- def embedded?
101
- false
107
+ if _association.destructive?
108
+ send(_association.dependent)
109
+ elsif persisted?
110
+ save
102
111
  end
103
112
  end
104
113
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  require 'mongoid/association/referenced/has_one/binding'
4
5
  require 'mongoid/association/referenced/has_one/buildable'
@@ -41,7 +42,7 @@ module Mongoid
41
42
 
42
43
  # The list of association complements.
43
44
  #
44
- # @return [ Array<Association> ] The association complements.
45
+ # @return [ Array<Mongoid::Association::Relatable> ] The association complements.
45
46
  def relation_complements
46
47
  @relation_complements ||= [ Referenced::BelongsTo ].freeze
47
48
  end
@@ -116,6 +117,9 @@ module Mongoid
116
117
  forced_nil_inverse? || (!!inverse && doc.fields.keys.include?(foreign_key))
117
118
  end
118
119
 
120
+ # Does this association type store the foreign key?
121
+ #
122
+ # @return [ false ] Always false.
119
123
  def stores_foreign_key?; false; end
120
124
 
121
125
  # Get the path calculator for the supplied document.