mongoid 8.1.12 → 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 (1024) 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 -5
  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 +16 -1
  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 +8 -3
  34. data/lib/mongoid/association/nested/nested_buildable.rb +32 -0
  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 +131 -104
  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 -91
  104. data/lib/mongoid/contextual/aggregable/memory.rb +1 -0
  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 +45 -42
  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 -0
  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 -27
  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 -1
  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 +1 -0
  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 +14 -2
  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 +24 -0
  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 -15
  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 -30
  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 -16
  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 -58
  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 +1 -0
  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 +1 -0
  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/size.yml +0 -3
  418. data/spec/integration/matcher_operator_data/type.yml +0 -6
  419. data/spec/integration/matcher_operator_data/type_array.yml +0 -1
  420. data/spec/integration/matcher_operator_data/type_decimal.yml +0 -4
  421. data/spec/integration/matcher_operator_spec.rb +1 -0
  422. data/spec/integration/matcher_spec.rb +21 -66
  423. data/spec/integration/persistence/range_field_spec.rb +1 -0
  424. data/spec/integration/server_query_spec.rb +1 -0
  425. data/spec/integration/shardable_spec.rb +1 -0
  426. data/spec/integration/stringified_symbol_field_spec.rb +1 -0
  427. data/spec/lite_spec_helper.rb +36 -10
  428. data/spec/mongoid/association/accessors_spec.rb +11 -28
  429. data/spec/mongoid/association/auto_save_spec.rb +1 -0
  430. data/spec/mongoid/association/builders_spec.rb +1 -0
  431. data/spec/mongoid/association/constrainable_spec.rb +1 -0
  432. data/spec/mongoid/association/counter_cache_spec.rb +1 -0
  433. data/spec/mongoid/association/depending_spec.rb +1 -0
  434. data/spec/mongoid/association/eager_spec.rb +52 -24
  435. data/spec/mongoid/association/embedded/cyclic_spec.rb +1 -0
  436. data/spec/mongoid/association/embedded/dirty_spec.rb +1 -0
  437. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +1 -0
  438. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +1 -0
  439. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +1 -0
  440. data/spec/mongoid/association/embedded/embedded_in_spec.rb +19 -7
  441. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +1 -0
  442. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +1 -0
  443. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +1 -0
  444. data/spec/mongoid/association/embedded/embeds_many_models.rb +17 -2
  445. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +4 -7
  446. data/spec/mongoid/association/embedded/embeds_many_spec.rb +1 -0
  447. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +1 -0
  448. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +1 -0
  449. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +1 -0
  450. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +1 -0
  451. data/spec/mongoid/association/embedded/embeds_one_models.rb +6 -1
  452. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +2 -1
  453. data/spec/mongoid/association/embedded/embeds_one_spec.rb +1 -0
  454. data/spec/mongoid/association/macros_spec.rb +1 -0
  455. data/spec/mongoid/association/nested/many_spec.rb +1 -0
  456. data/spec/mongoid/association/nested/one_spec.rb +1 -0
  457. data/spec/mongoid/association/options_spec.rb +1 -0
  458. data/spec/mongoid/association/polymorphic_spec.rb +1 -0
  459. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +1 -0
  460. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +1 -0
  461. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +1 -0
  462. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +1 -4
  463. data/spec/mongoid/association/referenced/belongs_to_models.rb +1 -0
  464. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +2 -1
  465. data/spec/mongoid/association/referenced/belongs_to_spec.rb +1 -0
  466. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +1 -0
  467. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +2 -1
  468. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +1 -0
  469. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +1 -0
  470. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +38 -31
  471. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +1 -0
  472. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +2 -1
  473. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1 -0
  474. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +1 -0
  475. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +1 -0
  476. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +1 -0
  477. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +1 -0
  478. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +1 -0
  479. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +1085 -2002
  480. data/spec/mongoid/association/referenced/has_many_models.rb +1 -0
  481. data/spec/mongoid/association/referenced/has_many_query_spec.rb +2 -1
  482. data/spec/mongoid/association/referenced/has_many_spec.rb +1 -0
  483. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +1 -0
  484. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +1 -0
  485. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +1 -0
  486. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +1 -0
  487. data/spec/mongoid/association/referenced/has_one_models.rb +1 -0
  488. data/spec/mongoid/association/referenced/has_one_query_spec.rb +2 -1
  489. data/spec/mongoid/association/referenced/has_one_spec.rb +1 -0
  490. data/spec/mongoid/association/reflections_spec.rb +1 -0
  491. data/spec/mongoid/association/syncable_spec.rb +1 -0
  492. data/spec/mongoid/association_spec.rb +1 -0
  493. data/spec/mongoid/atomic/modifiers_spec.rb +1 -0
  494. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +1 -0
  495. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +1 -0
  496. data/spec/mongoid/atomic/paths/root_spec.rb +1 -0
  497. data/spec/mongoid/atomic/paths_spec.rb +1 -0
  498. data/spec/mongoid/atomic_spec.rb +1 -0
  499. data/spec/mongoid/atomic_update_preparer_spec.rb +83 -0
  500. data/spec/mongoid/attributes/dynamic_spec.rb +1 -0
  501. data/spec/mongoid/attributes/embedded_spec.rb +118 -0
  502. data/spec/mongoid/attributes/nested_spec.rb +1 -0
  503. data/spec/mongoid/attributes/nested_spec_models.rb +1 -0
  504. data/spec/mongoid/attributes/projector_spec.rb +1 -0
  505. data/spec/mongoid/attributes/readonly_spec.rb +1 -19
  506. data/spec/mongoid/attributes_spec.rb +18 -35
  507. data/spec/mongoid/cacheable_spec.rb +1 -0
  508. data/spec/mongoid/changeable_spec.rb +4 -3
  509. data/spec/mongoid/clients/factory_spec.rb +77 -30
  510. data/spec/mongoid/clients/options_spec.rb +9 -5
  511. data/spec/mongoid/clients/sessions_spec.rb +27 -10
  512. data/spec/mongoid/clients/transactions_spec.rb +958 -185
  513. data/spec/mongoid/clients/transactions_spec_models.rb +159 -0
  514. data/spec/mongoid/clients_spec.rb +47 -2
  515. data/spec/mongoid/collection_configurable_spec.rb +1 -0
  516. data/spec/mongoid/composable_spec.rb +1 -0
  517. data/spec/mongoid/config/defaults_spec.rb +31 -92
  518. data/spec/mongoid/config/encryption_spec.rb +152 -0
  519. data/spec/mongoid/config/environment_spec.rb +13 -41
  520. data/spec/mongoid/config/introspection_spec.rb +114 -0
  521. data/spec/mongoid/config/options_spec.rb +1 -0
  522. data/spec/mongoid/config_spec.rb +20 -133
  523. data/spec/mongoid/contextual/aggregable/memory_spec.rb +1 -0
  524. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +1 -0
  525. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +5 -29
  526. data/spec/mongoid/contextual/aggregable/none_spec.rb +3 -14
  527. data/spec/mongoid/contextual/atomic_spec.rb +203 -12
  528. data/spec/mongoid/contextual/map_reduce_spec.rb +1 -0
  529. data/spec/mongoid/contextual/memory_spec.rb +364 -534
  530. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +10 -3
  531. data/spec/mongoid/contextual/mongo_spec.rb +101 -283
  532. data/spec/mongoid/contextual/none_spec.rb +1 -0
  533. data/spec/mongoid/copyable_spec.rb +1 -0
  534. data/spec/mongoid/copyable_spec_models.rb +1 -0
  535. data/spec/mongoid/criteria/findable_spec.rb +191 -0
  536. data/spec/mongoid/criteria/includable_spec.rb +1 -0
  537. data/spec/mongoid/criteria/includable_spec_models.rb +1 -0
  538. data/spec/mongoid/criteria/inspectable_spec.rb +1 -0
  539. data/spec/mongoid/criteria/marshalable_spec.rb +3 -2
  540. data/spec/mongoid/criteria/modifiable_spec.rb +1 -0
  541. data/spec/mongoid/criteria/options_spec.rb +1 -0
  542. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +1 -0
  543. data/spec/mongoid/criteria/queryable/expandable_spec.rb +1 -0
  544. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +1 -0
  545. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +8 -7
  546. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +1 -0
  547. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +21 -11
  548. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +1 -0
  549. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +1 -0
  550. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +1 -0
  551. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +1 -0
  552. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +1 -0
  553. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +1 -0
  554. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +1 -0
  555. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +1 -0
  556. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -11
  557. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +1 -11
  558. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +1 -0
  559. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +48 -66
  560. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +5 -0
  561. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +1 -0
  562. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +1 -0
  563. data/spec/mongoid/criteria/queryable/key_spec.rb +1 -0
  564. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +1 -0
  565. data/spec/mongoid/criteria/queryable/optional_spec.rb +1 -0
  566. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -0
  567. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +1 -0
  568. data/spec/mongoid/criteria/queryable/queryable_spec.rb +1 -0
  569. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +4 -3
  570. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +1 -0
  571. data/spec/mongoid/criteria/queryable/selectable_spec.rb +51 -214
  572. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +1 -0
  573. data/spec/mongoid/criteria/queryable/selector_spec.rb +96 -0
  574. data/spec/mongoid/criteria/queryable/smash_spec.rb +1 -0
  575. data/spec/mongoid/criteria/queryable/storable_spec.rb +10 -32
  576. data/spec/mongoid/criteria/scopable_spec.rb +1 -0
  577. data/spec/mongoid/criteria/translator_spec.rb +1 -0
  578. data/spec/mongoid/criteria_projection_spec.rb +6 -5
  579. data/spec/mongoid/criteria_spec.rb +221 -359
  580. data/spec/mongoid/document_fields_spec.rb +1 -0
  581. data/spec/mongoid/document_persistence_context_spec.rb +77 -0
  582. data/spec/mongoid/document_query_spec.rb +5 -4
  583. data/spec/mongoid/document_spec.rb +3 -148
  584. data/spec/mongoid/equality_spec.rb +41 -149
  585. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +1 -0
  586. data/spec/mongoid/errors/attribute_not_loaded_spec.rb +32 -0
  587. data/spec/mongoid/errors/callback_spec.rb +1 -0
  588. data/spec/mongoid/errors/delete_restriction_spec.rb +1 -0
  589. data/spec/mongoid/errors/document_not_destroyed_spec.rb +1 -0
  590. data/spec/mongoid/errors/document_not_found_spec.rb +1 -0
  591. data/spec/mongoid/errors/invalid_collection_spec.rb +1 -0
  592. data/spec/mongoid/errors/invalid_config_file_spec.rb +1 -0
  593. data/spec/mongoid/errors/invalid_config_option_spec.rb +1 -0
  594. data/spec/mongoid/errors/invalid_field_option_spec.rb +1 -0
  595. data/spec/mongoid/errors/invalid_field_spec.rb +1 -0
  596. data/spec/mongoid/errors/invalid_field_type_spec.rb +1 -0
  597. data/spec/mongoid/errors/invalid_find_spec.rb +1 -0
  598. data/spec/mongoid/errors/invalid_includes_spec.rb +1 -0
  599. data/spec/mongoid/errors/invalid_index_spec.rb +1 -0
  600. data/spec/mongoid/errors/invalid_options_spec.rb +1 -0
  601. data/spec/mongoid/errors/invalid_path_spec.rb +1 -0
  602. data/spec/mongoid/errors/invalid_relation_spec.rb +1 -0
  603. data/spec/mongoid/errors/invalid_scope_spec.rb +1 -0
  604. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +1 -0
  605. data/spec/mongoid/errors/invalid_storage_options_spec.rb +1 -0
  606. data/spec/mongoid/errors/invalid_time_spec.rb +1 -0
  607. data/spec/mongoid/errors/inverse_not_found_spec.rb +1 -0
  608. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +1 -0
  609. data/spec/mongoid/errors/mixed_relations_spec.rb +1 -0
  610. data/spec/mongoid/errors/mongoid_error_spec.rb +9 -22
  611. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +1 -0
  612. data/spec/mongoid/errors/no_client_config_spec.rb +1 -0
  613. data/spec/mongoid/errors/no_client_database_spec.rb +1 -0
  614. data/spec/mongoid/errors/no_client_hosts_spec.rb +1 -0
  615. data/spec/mongoid/errors/no_clients_config_spec.rb +1 -0
  616. data/spec/mongoid/errors/no_environment_spec.rb +1 -0
  617. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +1 -0
  618. data/spec/mongoid/errors/no_metadata_spec.rb +1 -0
  619. data/spec/mongoid/errors/no_parent_spec.rb +1 -0
  620. data/spec/mongoid/errors/readonly_attribute_spec.rb +1 -0
  621. data/spec/mongoid/errors/readonly_document_spec.rb +1 -0
  622. data/spec/mongoid/errors/scope_overwrite_spec.rb +1 -0
  623. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -0
  624. data/spec/mongoid/errors/unknown_attribute_spec.rb +1 -0
  625. data/spec/mongoid/errors/unsaved_document_spec.rb +1 -0
  626. data/spec/mongoid/errors/unsupported_javascript_spec.rb +1 -0
  627. data/spec/mongoid/errors/validations_spec.rb +1 -0
  628. data/spec/mongoid/extensions/array_spec.rb +3 -262
  629. data/spec/mongoid/extensions/big_decimal_spec.rb +5 -4
  630. data/spec/mongoid/extensions/binary_spec.rb +1 -0
  631. data/spec/mongoid/extensions/boolean_spec.rb +1 -0
  632. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +8 -7
  633. data/spec/mongoid/extensions/date_spec.rb +3 -20
  634. data/spec/mongoid/extensions/date_time_spec.rb +3 -9
  635. data/spec/mongoid/extensions/decimal128_spec.rb +1 -0
  636. data/spec/mongoid/extensions/false_class_spec.rb +1 -7
  637. data/spec/mongoid/extensions/float_spec.rb +3 -9
  638. data/spec/mongoid/extensions/hash_spec.rb +19 -458
  639. data/spec/mongoid/extensions/integer_spec.rb +3 -8
  640. data/spec/mongoid/extensions/module_spec.rb +1 -0
  641. data/spec/mongoid/extensions/nil_class_spec.rb +1 -0
  642. data/spec/mongoid/extensions/object_id_spec.rb +1 -0
  643. data/spec/mongoid/extensions/object_spec.rb +1 -176
  644. data/spec/mongoid/extensions/range_spec.rb +1 -11
  645. data/spec/mongoid/extensions/raw_value_spec.rb +67 -0
  646. data/spec/mongoid/extensions/regexp_spec.rb +1 -0
  647. data/spec/mongoid/extensions/set_spec.rb +2 -3
  648. data/spec/mongoid/extensions/string_spec.rb +3 -113
  649. data/spec/mongoid/extensions/stringified_symbol_spec.rb +1 -0
  650. data/spec/mongoid/extensions/symbol_spec.rb +1 -31
  651. data/spec/mongoid/extensions/time_spec.rb +32 -350
  652. data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -30
  653. data/spec/mongoid/extensions/true_class_spec.rb +1 -7
  654. data/spec/mongoid/factory_spec.rb +1 -0
  655. data/spec/mongoid/fields/foreign_key_spec.rb +282 -119
  656. data/spec/mongoid/fields/localized_spec.rb +1 -0
  657. data/spec/mongoid/fields/standard_spec.rb +1 -0
  658. data/spec/mongoid/fields_spec.rb +60 -66
  659. data/spec/mongoid/findable_spec.rb +2 -61
  660. data/spec/mongoid/indexable/specification_spec.rb +132 -13
  661. data/spec/mongoid/indexable_spec.rb +323 -9
  662. data/spec/mongoid/inspectable_spec.rb +81 -0
  663. data/spec/mongoid/interceptable_spec.rb +3 -82
  664. data/spec/mongoid/interceptable_spec_models.rb +112 -47
  665. data/spec/mongoid/loading_spec.rb +110 -0
  666. data/spec/mongoid/loggable_spec.rb +1 -0
  667. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -0
  668. data/spec/mongoid/mongoizable_spec.rb +1 -0
  669. data/spec/mongoid/monkey_patches_spec.rb +211 -0
  670. data/spec/mongoid/persistable/creatable_spec.rb +1 -0
  671. data/spec/mongoid/persistable/deletable_spec.rb +78 -31
  672. data/spec/mongoid/persistable/destroyable_spec.rb +230 -52
  673. data/spec/mongoid/persistable/incrementable_spec.rb +1 -0
  674. data/spec/mongoid/persistable/logical_spec.rb +1 -0
  675. data/spec/mongoid/persistable/maxable_spec.rb +147 -0
  676. data/spec/mongoid/persistable/minable_spec.rb +147 -0
  677. data/spec/mongoid/persistable/multipliable_spec.rb +227 -0
  678. data/spec/mongoid/persistable/poppable_spec.rb +1 -0
  679. data/spec/mongoid/persistable/pullable_spec.rb +1 -0
  680. data/spec/mongoid/persistable/pushable_spec.rb +1 -0
  681. data/spec/mongoid/persistable/renamable_spec.rb +1 -0
  682. data/spec/mongoid/persistable/savable_spec.rb +2 -6
  683. data/spec/mongoid/persistable/settable_spec.rb +5 -4
  684. data/spec/mongoid/persistable/unsettable_spec.rb +1 -0
  685. data/spec/mongoid/persistable/updatable_spec.rb +3 -2
  686. data/spec/mongoid/persistable/upsertable_spec.rb +34 -1
  687. data/spec/mongoid/persistable_spec.rb +1 -0
  688. data/spec/mongoid/persistence_context_spec.rb +1 -0
  689. data/spec/mongoid/positional_spec.rb +1 -0
  690. data/spec/mongoid/railties/bson_object_id_serializer_spec.rb +24 -0
  691. data/spec/mongoid/railties/console_sandbox_spec.rb +44 -0
  692. data/spec/mongoid/relations/proxy_spec.rb +1 -0
  693. data/spec/mongoid/reloadable_spec.rb +28 -83
  694. data/spec/mongoid/scopable_spec.rb +39 -50
  695. data/spec/mongoid/search_indexable_spec.rb +147 -0
  696. data/spec/mongoid/selectable_spec.rb +1 -0
  697. data/spec/mongoid/serializable_spec.rb +10 -16
  698. data/spec/mongoid/shardable_models.rb +1 -0
  699. data/spec/mongoid/shardable_spec.rb +1 -0
  700. data/spec/mongoid/stateful_spec.rb +1 -0
  701. data/spec/mongoid/tasks/database_rake_spec.rb +127 -49
  702. data/spec/mongoid/tasks/database_spec.rb +48 -1
  703. data/spec/mongoid/tasks/encryption_spec.rb +187 -0
  704. data/spec/mongoid/threaded_spec.rb +38 -0
  705. data/spec/mongoid/timestamps/created/short_spec.rb +1 -0
  706. data/spec/mongoid/timestamps/created_spec.rb +1 -23
  707. data/spec/mongoid/timestamps/timeless_spec.rb +1 -0
  708. data/spec/mongoid/timestamps/updated/short_spec.rb +1 -0
  709. data/spec/mongoid/timestamps/updated_spec.rb +1 -0
  710. data/spec/mongoid/timestamps_spec.rb +1 -0
  711. data/spec/mongoid/timestamps_spec_models.rb +1 -0
  712. data/spec/mongoid/touchable_spec.rb +485 -69
  713. data/spec/mongoid/touchable_spec_models.rb +96 -1
  714. data/spec/mongoid/traversable_spec.rb +1 -0
  715. data/spec/mongoid/validatable/associated_spec.rb +5 -14
  716. data/spec/mongoid/validatable/format_spec.rb +1 -0
  717. data/spec/mongoid/validatable/length_spec.rb +1 -0
  718. data/spec/mongoid/validatable/numericality_spec.rb +1 -16
  719. data/spec/mongoid/validatable/presence_spec.rb +1 -0
  720. data/spec/mongoid/validatable/uniqueness_spec.rb +48 -3
  721. data/spec/mongoid/validatable_spec.rb +1 -0
  722. data/spec/mongoid/warnings_spec.rb +1 -0
  723. data/spec/mongoid_spec.rb +27 -0
  724. data/spec/rails/controller_extension/controller_runtime_spec.rb +1 -0
  725. data/spec/rails/mongoid_spec.rb +26 -117
  726. data/spec/shared/lib/mrss/docker_runner.rb +1 -1
  727. data/spec/shared/lib/mrss/server_version_registry.rb +1 -1
  728. data/spec/shared/lib/mrss/spec_organizer.rb +3 -32
  729. data/spec/shared/share/Dockerfile.erb +34 -4
  730. data/spec/shared/shlib/distro.sh +0 -10
  731. data/spec/shared/shlib/server.sh +27 -33
  732. data/spec/shared/shlib/set_env.sh +42 -6
  733. data/spec/spec_helper.rb +26 -28
  734. data/spec/support/authorization.rb +1 -0
  735. data/spec/support/client_registry.rb +1 -0
  736. data/spec/support/constraints.rb +1 -0
  737. data/spec/support/crypt/models.rb +50 -0
  738. data/spec/support/crypt.rb +80 -0
  739. data/spec/support/expectations.rb +18 -20
  740. data/spec/support/feature_sandbox.rb +72 -0
  741. data/spec/support/helpers.rb +1 -0
  742. data/spec/support/immutable_ids.rb +22 -21
  743. data/spec/support/macros.rb +4 -6
  744. data/spec/support/models/account.rb +1 -0
  745. data/spec/support/models/acolyte.rb +1 -0
  746. data/spec/support/models/actor.rb +1 -0
  747. data/spec/support/models/actress.rb +1 -0
  748. data/spec/support/models/address.rb +3 -0
  749. data/spec/support/models/address_component.rb +1 -0
  750. data/spec/support/models/address_number.rb +1 -0
  751. data/spec/support/models/agency.rb +1 -0
  752. data/spec/support/models/agent.rb +1 -0
  753. data/spec/support/models/album.rb +1 -0
  754. data/spec/support/models/alert.rb +1 -0
  755. data/spec/support/models/animal.rb +1 -0
  756. data/spec/support/models/answer.rb +1 -0
  757. data/spec/support/models/appointment.rb +1 -0
  758. data/spec/support/models/armrest.rb +1 -0
  759. data/spec/support/models/array_field.rb +1 -0
  760. data/spec/support/models/article.rb +1 -0
  761. data/spec/support/models/artist.rb +1 -0
  762. data/spec/support/models/artwork.rb +1 -0
  763. data/spec/support/models/audible_sound.rb +1 -0
  764. data/spec/support/models/audio.rb +1 -0
  765. data/spec/support/models/augmentation.rb +1 -0
  766. data/spec/support/models/author.rb +1 -0
  767. data/spec/support/models/baby.rb +1 -0
  768. data/spec/support/models/band.rb +5 -1
  769. data/spec/support/models/bar.rb +1 -0
  770. data/spec/support/models/basic.rb +1 -0
  771. data/spec/support/models/bed.rb +1 -0
  772. data/spec/support/models/big_palette.rb +1 -0
  773. data/spec/support/models/birthday.rb +1 -0
  774. data/spec/support/models/bolt.rb +1 -0
  775. data/spec/support/models/bomb.rb +1 -0
  776. data/spec/support/models/book.rb +1 -0
  777. data/spec/support/models/breed.rb +1 -0
  778. data/spec/support/models/browser.rb +1 -0
  779. data/spec/support/models/building.rb +1 -0
  780. data/spec/support/models/building_address.rb +1 -0
  781. data/spec/support/models/bus.rb +1 -0
  782. data/spec/support/models/business.rb +1 -0
  783. data/spec/support/models/callback_test.rb +1 -0
  784. data/spec/support/models/canvas.rb +1 -0
  785. data/spec/support/models/car.rb +1 -0
  786. data/spec/support/models/cat.rb +1 -0
  787. data/spec/support/models/catalog.rb +1 -0
  788. data/spec/support/models/category.rb +1 -0
  789. data/spec/support/models/child.rb +1 -0
  790. data/spec/support/models/child_doc.rb +1 -0
  791. data/spec/support/models/church.rb +1 -0
  792. data/spec/support/models/circle.rb +1 -0
  793. data/spec/support/models/circuit.rb +1 -0
  794. data/spec/support/models/circus.rb +1 -0
  795. data/spec/support/models/code.rb +1 -0
  796. data/spec/support/models/coding/pull_request.rb +1 -0
  797. data/spec/support/models/coding.rb +1 -0
  798. data/spec/support/models/comment.rb +1 -0
  799. data/spec/support/models/company.rb +1 -0
  800. data/spec/support/models/consumption_period.rb +1 -0
  801. data/spec/support/models/contextable_item.rb +1 -0
  802. data/spec/support/models/contractor.rb +1 -0
  803. data/spec/support/models/cookie.rb +1 -0
  804. data/spec/support/models/country_code.rb +1 -0
  805. data/spec/support/models/courier_job.rb +1 -0
  806. data/spec/support/models/cover.rb +1 -0
  807. data/spec/support/models/crate.rb +1 -0
  808. data/spec/support/models/customer.rb +1 -0
  809. data/spec/support/models/customer_address.rb +1 -0
  810. data/spec/support/models/deed.rb +1 -0
  811. data/spec/support/models/definition.rb +1 -0
  812. data/spec/support/models/delegating_patient.rb +1 -0
  813. data/spec/support/models/description.rb +1 -0
  814. data/spec/support/models/dictionary.rb +1 -0
  815. data/spec/support/models/division.rb +1 -0
  816. data/spec/support/models/doctor.rb +1 -0
  817. data/spec/support/models/dog.rb +1 -0
  818. data/spec/support/models/dokument.rb +1 -0
  819. data/spec/support/models/draft.rb +1 -0
  820. data/spec/support/models/dragon.rb +1 -0
  821. data/spec/support/models/driver.rb +1 -0
  822. data/spec/support/models/drug.rb +1 -0
  823. data/spec/support/models/dungeon.rb +1 -0
  824. data/spec/support/models/edit.rb +1 -0
  825. data/spec/support/models/email.rb +1 -0
  826. data/spec/support/models/employer.rb +1 -0
  827. data/spec/support/models/entry.rb +1 -0
  828. data/spec/support/models/eraser.rb +1 -0
  829. data/spec/support/models/even.rb +1 -0
  830. data/spec/support/models/event.rb +1 -0
  831. data/spec/support/models/exhibition.rb +1 -0
  832. data/spec/support/models/exhibitor.rb +1 -0
  833. data/spec/support/models/explosion.rb +1 -0
  834. data/spec/support/models/eye.rb +1 -0
  835. data/spec/support/models/eye_bowl.rb +1 -0
  836. data/spec/support/models/face.rb +1 -0
  837. data/spec/support/models/fanatic.rb +1 -0
  838. data/spec/support/models/favorite.rb +8 -1
  839. data/spec/support/models/filesystem.rb +1 -0
  840. data/spec/support/models/fire_hydrant.rb +1 -0
  841. data/spec/support/models/firefox.rb +1 -0
  842. data/spec/support/models/fish.rb +1 -0
  843. data/spec/support/models/folder.rb +1 -0
  844. data/spec/support/models/folder_item.rb +1 -0
  845. data/spec/support/models/fruits.rb +1 -0
  846. data/spec/support/models/game.rb +1 -0
  847. data/spec/support/models/ghost.rb +1 -0
  848. data/spec/support/models/guitar.rb +1 -0
  849. data/spec/support/models/hole.rb +1 -0
  850. data/spec/support/models/home.rb +1 -0
  851. data/spec/support/models/house.rb +1 -0
  852. data/spec/support/models/html_writer.rb +1 -0
  853. data/spec/support/models/id_key.rb +1 -0
  854. data/spec/support/models/idnodef.rb +1 -0
  855. data/spec/support/models/image.rb +1 -0
  856. data/spec/support/models/implant.rb +1 -0
  857. data/spec/support/models/instrument.rb +1 -0
  858. data/spec/support/models/item.rb +1 -0
  859. data/spec/support/models/jar.rb +1 -0
  860. data/spec/support/models/kaleidoscope.rb +1 -0
  861. data/spec/support/models/kangaroo.rb +1 -0
  862. data/spec/support/models/label.rb +1 -0
  863. data/spec/support/models/language.rb +1 -0
  864. data/spec/support/models/lat_lng.rb +1 -6
  865. data/spec/support/models/league.rb +1 -0
  866. data/spec/support/models/learner.rb +1 -0
  867. data/spec/support/models/line_item.rb +1 -0
  868. data/spec/support/models/location.rb +1 -0
  869. data/spec/support/models/login.rb +1 -0
  870. data/spec/support/models/manufacturer.rb +1 -0
  871. data/spec/support/models/meat.rb +1 -0
  872. data/spec/support/models/membership.rb +1 -0
  873. data/spec/support/models/message.rb +1 -0
  874. data/spec/support/models/minim.rb +1 -0
  875. data/spec/support/models/mixed_drink.rb +1 -0
  876. data/spec/support/models/mop.rb +1 -0
  877. data/spec/support/models/movie.rb +1 -0
  878. data/spec/support/models/my_hash.rb +1 -0
  879. data/spec/support/models/name.rb +1 -0
  880. data/spec/support/models/name_only.rb +1 -0
  881. data/spec/support/models/node.rb +1 -0
  882. data/spec/support/models/note.rb +1 -0
  883. data/spec/support/models/nut.rb +1 -0
  884. data/spec/support/models/odd.rb +1 -0
  885. data/spec/support/models/order.rb +1 -0
  886. data/spec/support/models/ordered_post.rb +1 -0
  887. data/spec/support/models/ordered_preference.rb +1 -0
  888. data/spec/support/models/oscar.rb +1 -0
  889. data/spec/support/models/other_owner_object.rb +1 -0
  890. data/spec/support/models/override.rb +1 -0
  891. data/spec/support/models/ownable.rb +1 -0
  892. data/spec/support/models/owner.rb +1 -0
  893. data/spec/support/models/pack.rb +1 -0
  894. data/spec/support/models/page.rb +1 -0
  895. data/spec/support/models/page_question.rb +1 -0
  896. data/spec/support/models/palette.rb +1 -0
  897. data/spec/support/models/parent.rb +1 -0
  898. data/spec/support/models/parent_doc.rb +1 -0
  899. data/spec/support/models/passport.rb +1 -0
  900. data/spec/support/models/patient.rb +1 -0
  901. data/spec/support/models/pdf_writer.rb +1 -0
  902. data/spec/support/models/pencil.rb +1 -0
  903. data/spec/support/models/person.rb +1 -0
  904. data/spec/support/models/pet.rb +1 -0
  905. data/spec/support/models/pet_owner.rb +1 -0
  906. data/spec/support/models/phone.rb +1 -0
  907. data/spec/support/models/piano.rb +1 -0
  908. data/spec/support/models/pizza.rb +1 -0
  909. data/spec/support/models/player.rb +1 -0
  910. data/spec/support/models/post.rb +1 -0
  911. data/spec/support/models/post_genre.rb +1 -0
  912. data/spec/support/models/powerup.rb +1 -0
  913. data/spec/support/models/preference.rb +1 -0
  914. data/spec/support/models/princess.rb +1 -0
  915. data/spec/support/models/product.rb +1 -0
  916. data/spec/support/models/profile.rb +1 -0
  917. data/spec/support/models/pronunciation.rb +1 -0
  918. data/spec/support/models/pub.rb +1 -0
  919. data/spec/support/models/publication/encyclopedia.rb +1 -0
  920. data/spec/support/models/publication/review.rb +1 -0
  921. data/spec/support/models/publication.rb +1 -0
  922. data/spec/support/models/purchase.rb +1 -0
  923. data/spec/support/models/purchased_item.rb +1 -0
  924. data/spec/support/models/question.rb +1 -0
  925. data/spec/support/models/quiz.rb +1 -0
  926. data/spec/support/models/rating.rb +1 -0
  927. data/spec/support/models/record.rb +1 -0
  928. data/spec/support/models/registry.rb +1 -0
  929. data/spec/support/models/role.rb +1 -0
  930. data/spec/support/models/root_category.rb +1 -0
  931. data/spec/support/models/sandbox/app/models/app_models_message.rb +4 -0
  932. data/spec/support/models/sandbox/lib/models/lib_models_message.rb +4 -0
  933. data/spec/support/models/sandbox/sandbox_message.rb +4 -0
  934. data/spec/support/models/sandbox/sandbox_user.rb +4 -0
  935. data/spec/support/models/sandbox/subdir/sandbox_comment.rb +4 -0
  936. data/spec/support/models/sandwich.rb +1 -0
  937. data/spec/support/models/scheduler.rb +1 -0
  938. data/spec/support/models/school.rb +1 -0
  939. data/spec/support/models/scribe.rb +1 -0
  940. data/spec/support/models/sealer.rb +1 -0
  941. data/spec/support/models/seat.rb +1 -0
  942. data/spec/support/models/seo.rb +1 -0
  943. data/spec/support/models/series.rb +1 -0
  944. data/spec/support/models/server.rb +1 -0
  945. data/spec/support/models/service.rb +1 -0
  946. data/spec/support/models/shape.rb +1 -0
  947. data/spec/support/models/shelf.rb +1 -0
  948. data/spec/support/models/shield.rb +1 -0
  949. data/spec/support/models/shipment_address.rb +1 -0
  950. data/spec/support/models/shipping_container.rb +1 -0
  951. data/spec/support/models/shipping_pack.rb +1 -0
  952. data/spec/support/models/shirt.rb +1 -0
  953. data/spec/support/models/shop.rb +1 -0
  954. data/spec/support/models/short_agent.rb +1 -0
  955. data/spec/support/models/short_quiz.rb +1 -0
  956. data/spec/support/models/simple.rb +1 -0
  957. data/spec/support/models/slave.rb +1 -0
  958. data/spec/support/models/song.rb +1 -0
  959. data/spec/support/models/sound.rb +1 -0
  960. data/spec/support/models/spacer.rb +1 -0
  961. data/spec/support/models/square.rb +1 -0
  962. data/spec/support/models/staff.rb +1 -0
  963. data/spec/support/models/store_as_dup_test1.rb +1 -0
  964. data/spec/support/models/store_as_dup_test2.rb +1 -0
  965. data/spec/support/models/store_as_dup_test3.rb +1 -0
  966. data/spec/support/models/store_as_dup_test4.rb +1 -0
  967. data/spec/support/models/strategy.rb +1 -0
  968. data/spec/support/models/student.rb +1 -0
  969. data/spec/support/models/sub_item.rb +1 -0
  970. data/spec/support/models/subscription.rb +1 -0
  971. data/spec/support/models/survey.rb +1 -0
  972. data/spec/support/models/symptom.rb +1 -0
  973. data/spec/support/models/system_role.rb +1 -0
  974. data/spec/support/models/tag.rb +1 -0
  975. data/spec/support/models/target.rb +1 -0
  976. data/spec/support/models/template.rb +1 -0
  977. data/spec/support/models/thing.rb +1 -0
  978. data/spec/support/models/threadlocker.rb +1 -0
  979. data/spec/support/models/title.rb +1 -0
  980. data/spec/support/models/tool.rb +1 -0
  981. data/spec/support/models/topping.rb +1 -0
  982. data/spec/support/models/toy.rb +1 -0
  983. data/spec/support/models/track.rb +1 -0
  984. data/spec/support/models/translation.rb +1 -0
  985. data/spec/support/models/tree.rb +1 -0
  986. data/spec/support/models/truck.rb +1 -0
  987. data/spec/support/models/updatable.rb +1 -0
  988. data/spec/support/models/user.rb +1 -0
  989. data/spec/support/models/user_account.rb +1 -0
  990. data/spec/support/models/validation_callback.rb +1 -0
  991. data/spec/support/models/vehicle.rb +1 -0
  992. data/spec/support/models/version.rb +1 -0
  993. data/spec/support/models/vertex.rb +1 -0
  994. data/spec/support/models/vet_visit.rb +1 -0
  995. data/spec/support/models/video.rb +1 -0
  996. data/spec/support/models/video_game.rb +1 -0
  997. data/spec/support/models/washer.rb +1 -0
  998. data/spec/support/models/weapon.rb +1 -0
  999. data/spec/support/models/wiki_page.rb +1 -0
  1000. data/spec/support/models/word.rb +1 -0
  1001. data/spec/support/models/word_origin.rb +1 -0
  1002. data/spec/support/models/writer.rb +1 -0
  1003. data/spec/support/rails_mock.rb +32 -0
  1004. data/spec/support/shared/time.rb +3 -21
  1005. data/spec/support/sinatra_mock.rb +7 -0
  1006. data/spec/support/spec_config.rb +30 -9
  1007. data.tar.gz.sig +0 -0
  1008. metadata +127 -48
  1009. metadata.gz.sig +1 -0
  1010. data/lib/mongoid/association/referenced/eager.rb +0 -163
  1011. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +0 -113
  1012. data/lib/mongoid/contextual/geo_near.rb +0 -236
  1013. data/lib/mongoid/errors/invalid_session_use.rb +0 -21
  1014. data/lib/mongoid/errors/invalid_storage_parent.rb +0 -27
  1015. data/lib/mongoid/query_cache.rb +0 -68
  1016. data/lib/mongoid/validatable/numericality.rb +0 -19
  1017. data/spec/mongoid/contextual/geo_near_spec.rb +0 -471
  1018. data/spec/mongoid/extensions_spec.rb +0 -43
  1019. data/spec/mongoid/query_cache_middleware_spec.rb +0 -50
  1020. data/spec/mongoid/query_cache_spec.rb +0 -865
  1021. data/spec/shared/CANDIDATE.md +0 -28
  1022. data/spec/shared/lib/mrss/release/candidate.rb +0 -281
  1023. data/spec/shared/lib/mrss/release/product_data.rb +0 -144
  1024. data/spec/shared/lib/tasks/candidate.rake +0 -64
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  module Mongoid
4
5
  module Association
@@ -45,11 +46,7 @@ module Mongoid
45
46
  # @return [ true | false ] If the objects are equal in a case.
46
47
  def ===(other)
47
48
  return false unless other.respond_to?(:entries)
48
- if Mongoid.legacy_triple_equals
49
- other.class == Class ? (Array == other || Enumerable == other) : self == other
50
- else
51
- entries === other.entries
52
- end
49
+ entries === other.entries
53
50
  end
54
51
 
55
52
  # Append a document to the enumerable.
@@ -422,28 +419,11 @@ module Mongoid
422
419
  #
423
420
  # @return [ Integer ] The size of the enumerable.
424
421
  def size
425
- # If _unloaded is present, then it will match the set of documents
426
- # that belong to this association, which have already been persisted
427
- # to the database. This set of documents must be considered when
428
- # computing the size of the association, along with anything that has
429
- # since been added.
430
- if _unloaded
431
- if _added.any?
432
- # Note that _added may include records that _unloaded already
433
- # matches. This is the case if the association is assigned an array
434
- # of items and some of them were already elements of the association.
435
- #
436
- # we need to thus make sure _unloaded.count excludes any elements
437
- # that already exist in _added.
438
-
439
- count = _unloaded.not(:_id.in => _added.values.map(&:id)).count
440
- count + _added.values.count
441
- else
442
- _unloaded.count
443
- end
444
-
422
+ count = (_unloaded ? _unloaded.count : _loaded.count)
423
+ if count.zero?
424
+ count + _added.count
445
425
  else
446
- _loaded.count + _added.count
426
+ count + _added.values.count { |d| d.new_record? }
447
427
  end
448
428
  end
449
429
 
@@ -498,12 +478,48 @@ module Mongoid
498
478
  end
499
479
 
500
480
  def unloaded_documents
501
- if _unloaded.selector._mongoid_unsatisfiable_criteria?
481
+ if unsatisfiable_criteria?(_unloaded.selector)
502
482
  []
503
483
  else
504
484
  _unloaded
505
485
  end
506
486
  end
487
+
488
+ # Checks whether conditions in the given hash are known to be
489
+ # unsatisfiable, i.e. querying with this hash will always return no
490
+ # documents.
491
+ #
492
+ # This method only handles condition shapes that Mongoid itself uses when
493
+ # it builds association queries. Return value true indicates the condition
494
+ # always produces an empty document set. Note however that return value false
495
+ # is not a guarantee that the condition won't produce an empty document set.
496
+ #
497
+ # @example Unsatisfiable conditions
498
+ # unsatisfiable_criteria?({'_id' => {'$in' => []}})
499
+ # # => true
500
+ #
501
+ # @example Conditions which may be satisfiable
502
+ # unsatisfiable_criteria?({'_id' => '123'})
503
+ # # => false
504
+ #
505
+ # @example Conditions which are unsatisfiable that this method does not handle
506
+ # unsatisfiable_criteria?({'foo' => {'$in' => []}})
507
+ # # => false
508
+ #
509
+ # @param [ Hash ] selector The conditions to check.
510
+ #
511
+ # @return [ true | false ] Whether hash contains known unsatisfiable
512
+ # conditions.
513
+ def unsatisfiable_criteria?(selector)
514
+ unsatisfiable_criteria = { '_id' => { '$in' => [] } }
515
+ return true if selector == unsatisfiable_criteria
516
+ return false unless selector.length == 1 && selector.keys == %w[$and]
517
+
518
+ value = selector.values.first
519
+ value.is_a?(Array) && value.any? do |sub_value|
520
+ sub_value.is_a?(Hash) && unsatisfiable_criteria?(sub_value)
521
+ end
522
+ end
507
523
  end
508
524
  end
509
525
  end
@@ -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
@@ -504,20 +539,29 @@ module Mongoid
504
539
  # @param [ Array<Object> ] ids The ids.
505
540
  def remove_not_in(ids)
506
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)
507
560
  if _association.destructive?
508
561
  removed.delete_all
509
562
  else
510
563
  removed.update_all(foreign_key => nil)
511
564
  end
512
- in_memory.each do |doc|
513
- if !ids.include?(doc._id)
514
- unbind_one(doc)
515
- _target.delete(doc)
516
- if _association.destructive?
517
- doc.destroyed = true
518
- end
519
- end
520
- end
521
565
  end
522
566
 
523
567
  # Save a persisted document immediately or delay a new document for
@@ -539,26 +583,9 @@ module Mongoid
539
583
  doc.save
540
584
  end
541
585
  end
542
-
543
- class << self
544
-
545
- def eager_loader(association, docs)
546
- Eager.new(association, docs)
547
- end
548
-
549
- # Returns true if the association is an embedded one. In this case
550
- # always false.
551
- #
552
- # @example Is this association embedded?
553
- # Referenced::Many.embedded?
554
- #
555
- # @return [ false ] Always false.
556
- def embedded?
557
- false
558
- end
559
- end
560
586
  end
561
587
  end
562
588
  end
563
589
  end
564
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.