mongoid 8.1.13 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1031) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +1 -0
  3. data/LICENSE +1 -1
  4. data/README.md +4 -9
  5. data/Rakefile +62 -44
  6. data/lib/config/locales/en.yml +66 -31
  7. data/lib/mongoid/association/accessors.rb +16 -20
  8. data/lib/mongoid/association/bindable.rb +27 -8
  9. data/lib/mongoid/association/builders.rb +3 -2
  10. data/lib/mongoid/association/constrainable.rb +1 -0
  11. data/lib/mongoid/association/depending.rb +20 -9
  12. data/lib/mongoid/association/eager.rb +160 -0
  13. data/lib/mongoid/association/eager_loadable.rb +15 -7
  14. data/lib/mongoid/association/embedded/batchable.rb +16 -18
  15. data/lib/mongoid/association/embedded/cyclic.rb +1 -0
  16. data/lib/mongoid/association/embedded/eager.rb +23 -0
  17. data/lib/mongoid/association/embedded/embedded_in/binding.rb +5 -4
  18. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +1 -0
  19. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +21 -7
  20. data/lib/mongoid/association/embedded/embedded_in.rb +7 -0
  21. data/lib/mongoid/association/embedded/embeds_many/binding.rb +3 -2
  22. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -0
  23. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +134 -205
  24. data/lib/mongoid/association/embedded/embeds_many.rb +1 -0
  25. data/lib/mongoid/association/embedded/embeds_one/binding.rb +3 -2
  26. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +1 -0
  27. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +113 -55
  28. data/lib/mongoid/association/embedded/embeds_one.rb +1 -0
  29. data/lib/mongoid/association/embedded.rb +2 -0
  30. data/lib/mongoid/association/macros.rb +17 -14
  31. data/lib/mongoid/association/many.rb +1 -0
  32. data/lib/mongoid/association/marshalable.rb +4 -0
  33. data/lib/mongoid/association/nested/many.rb +11 -41
  34. data/lib/mongoid/association/nested/nested_buildable.rb +32 -14
  35. data/lib/mongoid/association/nested/one.rb +6 -3
  36. data/lib/mongoid/association/nested.rb +1 -0
  37. data/lib/mongoid/association/one.rb +1 -0
  38. data/lib/mongoid/association/options.rb +9 -2
  39. data/lib/mongoid/association/proxy.rb +30 -18
  40. data/lib/mongoid/association/referenced/auto_save.rb +6 -2
  41. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  42. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -0
  43. data/lib/mongoid/association/referenced/belongs_to/eager.rb +2 -1
  44. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +19 -14
  45. data/lib/mongoid/association/referenced/belongs_to.rb +2 -1
  46. data/lib/mongoid/association/referenced/counter_cache.rb +7 -2
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +15 -3
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +1 -0
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -1
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +132 -94
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +8 -3
  52. data/lib/mongoid/association/referenced/has_many/binding.rb +1 -0
  53. data/lib/mongoid/association/referenced/has_many/buildable.rb +1 -0
  54. data/lib/mongoid/association/referenced/has_many/eager.rb +2 -1
  55. data/lib/mongoid/association/referenced/has_many/enumerable.rb +43 -27
  56. data/lib/mongoid/association/referenced/has_many/proxy.rb +132 -204
  57. data/lib/mongoid/association/referenced/has_many.rb +2 -1
  58. data/lib/mongoid/association/referenced/has_one/binding.rb +1 -0
  59. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -0
  60. data/lib/mongoid/association/referenced/has_one/eager.rb +3 -3
  61. data/lib/mongoid/association/referenced/has_one/proxy.rb +37 -28
  62. data/lib/mongoid/association/referenced/has_one.rb +5 -1
  63. data/lib/mongoid/association/referenced/syncable.rb +7 -6
  64. data/lib/mongoid/association/referenced.rb +1 -0
  65. data/lib/mongoid/association/reflections.rb +5 -4
  66. data/lib/mongoid/association/relatable.rb +10 -4
  67. data/lib/mongoid/association.rb +5 -0
  68. data/lib/mongoid/atomic/modifiers.rb +1 -0
  69. data/lib/mongoid/atomic/paths/embedded/many.rb +2 -1
  70. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -0
  71. data/lib/mongoid/atomic/paths/embedded.rb +1 -0
  72. data/lib/mongoid/atomic/paths/root.rb +1 -0
  73. data/lib/mongoid/atomic/paths.rb +1 -0
  74. data/lib/mongoid/atomic.rb +23 -62
  75. data/lib/mongoid/atomic_update_preparer.rb +88 -0
  76. data/lib/mongoid/attributes/dynamic.rb +1 -0
  77. data/lib/mongoid/attributes/embedded.rb +34 -0
  78. data/lib/mongoid/attributes/nested.rb +3 -2
  79. data/lib/mongoid/attributes/processing.rb +11 -10
  80. data/lib/mongoid/attributes/projector.rb +1 -0
  81. data/lib/mongoid/attributes/readonly.rb +4 -8
  82. data/lib/mongoid/attributes.rb +6 -4
  83. data/lib/mongoid/cacheable.rb +2 -1
  84. data/lib/mongoid/changeable.rb +58 -49
  85. data/lib/mongoid/clients/factory.rb +37 -5
  86. data/lib/mongoid/clients/options.rb +113 -3
  87. data/lib/mongoid/clients/sessions.rb +245 -64
  88. data/lib/mongoid/clients/storage_options.rb +37 -1
  89. data/lib/mongoid/clients/validators/storage.rb +1 -0
  90. data/lib/mongoid/clients/validators.rb +1 -0
  91. data/lib/mongoid/clients.rb +36 -4
  92. data/lib/mongoid/collection_configurable.rb +1 -0
  93. data/lib/mongoid/composable.rb +5 -0
  94. data/lib/mongoid/config/defaults.rb +16 -36
  95. data/lib/mongoid/config/encryption.rb +213 -0
  96. data/lib/mongoid/config/environment.rb +2 -5
  97. data/lib/mongoid/config/introspection.rb +152 -0
  98. data/lib/mongoid/config/options.rb +8 -3
  99. data/lib/mongoid/config/validators/async_query_executor.rb +12 -2
  100. data/lib/mongoid/config/validators/client.rb +1 -0
  101. data/lib/mongoid/config/validators/option.rb +1 -0
  102. data/lib/mongoid/config/validators.rb +1 -0
  103. data/lib/mongoid/config.rb +57 -153
  104. data/lib/mongoid/contextual/aggregable/memory.rb +3 -5
  105. data/lib/mongoid/contextual/aggregable/mongo.rb +2 -5
  106. data/lib/mongoid/contextual/aggregable/none.rb +1 -0
  107. data/lib/mongoid/contextual/aggregable.rb +1 -0
  108. data/lib/mongoid/contextual/atomic.rb +98 -11
  109. data/lib/mongoid/contextual/command.rb +3 -0
  110. data/lib/mongoid/contextual/map_reduce.rb +6 -0
  111. data/lib/mongoid/contextual/memory.rb +52 -60
  112. data/lib/mongoid/contextual/mongo/documents_loader.rb +3 -2
  113. data/lib/mongoid/contextual/mongo.rb +33 -61
  114. data/lib/mongoid/contextual/none.rb +15 -32
  115. data/lib/mongoid/contextual/queryable.rb +4 -0
  116. data/lib/mongoid/contextual.rb +4 -0
  117. data/lib/mongoid/copyable.rb +3 -2
  118. data/lib/mongoid/criteria/findable.rb +44 -4
  119. data/lib/mongoid/criteria/includable.rb +5 -4
  120. data/lib/mongoid/criteria/inspectable.rb +4 -0
  121. data/lib/mongoid/criteria/marshalable.rb +4 -0
  122. data/lib/mongoid/criteria/modifiable.rb +5 -0
  123. data/lib/mongoid/criteria/options.rb +1 -0
  124. data/lib/mongoid/criteria/permission.rb +5 -0
  125. data/lib/mongoid/criteria/queryable/aggregable.rb +1 -0
  126. data/lib/mongoid/criteria/queryable/expandable.rb +1 -0
  127. data/lib/mongoid/criteria/queryable/extensions/array.rb +2 -1
  128. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +3 -5
  129. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -1
  130. data/lib/mongoid/criteria/queryable/extensions/date.rb +4 -3
  131. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +2 -1
  132. data/lib/mongoid/criteria/queryable/extensions/hash.rb +2 -1
  133. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +2 -1
  134. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +3 -16
  135. data/lib/mongoid/criteria/queryable/extensions/object.rb +4 -1
  136. data/lib/mongoid/criteria/queryable/extensions/range.rb +2 -1
  137. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +7 -1
  138. data/lib/mongoid/criteria/queryable/extensions/set.rb +2 -1
  139. data/lib/mongoid/criteria/queryable/extensions/string.rb +15 -3
  140. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +2 -1
  141. data/lib/mongoid/criteria/queryable/extensions/time.rb +2 -1
  142. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +3 -1
  143. data/lib/mongoid/criteria/queryable/extensions.rb +1 -0
  144. data/lib/mongoid/criteria/queryable/key.rb +10 -0
  145. data/lib/mongoid/criteria/queryable/macroable.rb +1 -0
  146. data/lib/mongoid/criteria/queryable/mergeable.rb +1 -12
  147. data/lib/mongoid/criteria/queryable/optional.rb +1 -0
  148. data/lib/mongoid/criteria/queryable/options.rb +1 -0
  149. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -0
  150. data/lib/mongoid/criteria/queryable/selectable.rb +12 -136
  151. data/lib/mongoid/criteria/queryable/selector.rb +5 -2
  152. data/lib/mongoid/criteria/queryable/smash.rb +1 -0
  153. data/lib/mongoid/criteria/queryable/storable.rb +4 -3
  154. data/lib/mongoid/criteria/queryable.rb +1 -0
  155. data/lib/mongoid/criteria/scopable.rb +5 -0
  156. data/lib/mongoid/criteria/translator.rb +1 -0
  157. data/lib/mongoid/criteria.rb +37 -10
  158. data/lib/mongoid/deprecable.rb +1 -0
  159. data/lib/mongoid/deprecation.rb +8 -4
  160. data/lib/mongoid/document.rb +171 -125
  161. data/lib/mongoid/encryptable.rb +53 -0
  162. data/lib/mongoid/equality.rb +2 -22
  163. data/lib/mongoid/errors/ambiguous_relationship.rb +1 -0
  164. data/lib/mongoid/errors/attribute_not_loaded.rb +34 -0
  165. data/lib/mongoid/errors/callback.rb +1 -0
  166. data/lib/mongoid/errors/create_collection_failure.rb +1 -0
  167. data/lib/mongoid/errors/criteria_argument_required.rb +1 -0
  168. data/lib/mongoid/errors/delete_restriction.rb +1 -0
  169. data/lib/mongoid/errors/document_not_destroyed.rb +1 -0
  170. data/lib/mongoid/errors/document_not_found.rb +1 -0
  171. data/lib/mongoid/errors/drop_collection_failure.rb +1 -0
  172. data/lib/mongoid/errors/empty_config_file.rb +1 -0
  173. data/lib/mongoid/errors/immutable_attribute.rb +1 -0
  174. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -0
  175. data/lib/mongoid/errors/invalid_async_query_executor.rb +1 -0
  176. data/lib/mongoid/errors/invalid_auto_encryption_configuration.rb +33 -0
  177. data/lib/mongoid/errors/invalid_collection.rb +1 -0
  178. data/lib/mongoid/errors/invalid_config_file.rb +1 -0
  179. data/lib/mongoid/errors/invalid_config_option.rb +1 -0
  180. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -0
  181. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +1 -0
  182. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +1 -0
  183. data/lib/mongoid/errors/invalid_elem_match_operator.rb +1 -0
  184. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +6 -4
  185. data/lib/mongoid/errors/invalid_estimated_count_scoping.rb +27 -0
  186. data/lib/mongoid/errors/invalid_expression_operator.rb +1 -0
  187. data/lib/mongoid/errors/invalid_field.rb +1 -0
  188. data/lib/mongoid/errors/invalid_field_operator.rb +1 -0
  189. data/lib/mongoid/errors/invalid_field_option.rb +1 -0
  190. data/lib/mongoid/errors/invalid_field_type.rb +1 -0
  191. data/lib/mongoid/errors/invalid_find.rb +1 -0
  192. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +1 -0
  193. data/lib/mongoid/errors/invalid_includes.rb +1 -0
  194. data/lib/mongoid/errors/invalid_index.rb +1 -0
  195. data/lib/mongoid/errors/invalid_options.rb +1 -0
  196. data/lib/mongoid/errors/invalid_path.rb +1 -0
  197. data/lib/mongoid/errors/invalid_persistence_option.rb +1 -0
  198. data/lib/mongoid/errors/invalid_query.rb +1 -0
  199. data/lib/mongoid/errors/invalid_relation.rb +1 -0
  200. data/lib/mongoid/errors/invalid_relation_option.rb +1 -0
  201. data/lib/mongoid/errors/invalid_scope.rb +1 -0
  202. data/lib/mongoid/errors/invalid_session_nesting.rb +17 -0
  203. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +1 -1
  204. data/lib/mongoid/errors/invalid_storage_options.rb +1 -0
  205. data/lib/mongoid/errors/invalid_time.rb +1 -0
  206. data/lib/mongoid/errors/invalid_transaction_nesting.rb +17 -0
  207. data/lib/mongoid/errors/inverse_not_found.rb +1 -0
  208. data/lib/mongoid/errors/mixed_client_configuration.rb +1 -0
  209. data/lib/mongoid/errors/mixed_relations.rb +1 -0
  210. data/lib/mongoid/errors/mongoid_error.rb +4 -3
  211. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -0
  212. data/lib/mongoid/errors/no_client_config.rb +1 -0
  213. data/lib/mongoid/errors/no_client_database.rb +1 -0
  214. data/lib/mongoid/errors/no_client_hosts.rb +1 -0
  215. data/lib/mongoid/errors/no_clients_config.rb +1 -0
  216. data/lib/mongoid/errors/no_default_client.rb +1 -0
  217. data/lib/mongoid/errors/no_environment.rb +1 -0
  218. data/lib/mongoid/errors/no_map_reduce_output.rb +1 -0
  219. data/lib/mongoid/errors/no_metadata.rb +1 -0
  220. data/lib/mongoid/errors/no_parent.rb +1 -0
  221. data/lib/mongoid/errors/readonly_attribute.rb +1 -0
  222. data/lib/mongoid/errors/readonly_document.rb +1 -0
  223. data/lib/mongoid/errors/rollback.rb +15 -0
  224. data/lib/mongoid/errors/scope_overwrite.rb +1 -0
  225. data/lib/mongoid/errors/sessions_not_supported.rb +17 -0
  226. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -0
  227. data/lib/mongoid/errors/transaction_error.rb +25 -0
  228. data/lib/mongoid/errors/transactions_not_supported.rb +17 -0
  229. data/lib/mongoid/errors/unknown_attribute.rb +1 -0
  230. data/lib/mongoid/errors/unknown_model.rb +1 -0
  231. data/lib/mongoid/errors/unsaved_document.rb +1 -0
  232. data/lib/mongoid/errors/unsupported_javascript.rb +1 -0
  233. data/lib/mongoid/errors/validations.rb +1 -0
  234. data/lib/mongoid/errors.rb +10 -2
  235. data/lib/mongoid/evolvable.rb +1 -0
  236. data/lib/mongoid/extensions/array.rb +10 -24
  237. data/lib/mongoid/extensions/big_decimal.rb +14 -6
  238. data/lib/mongoid/extensions/binary.rb +3 -0
  239. data/lib/mongoid/extensions/boolean.rb +3 -0
  240. data/lib/mongoid/extensions/date.rb +7 -2
  241. data/lib/mongoid/extensions/date_time.rb +4 -6
  242. data/lib/mongoid/extensions/decimal128.rb +3 -0
  243. data/lib/mongoid/extensions/false_class.rb +5 -2
  244. data/lib/mongoid/extensions/float.rb +4 -1
  245. data/lib/mongoid/extensions/hash.rb +21 -169
  246. data/lib/mongoid/extensions/integer.rb +6 -1
  247. data/lib/mongoid/extensions/module.rb +4 -1
  248. data/lib/mongoid/extensions/nil_class.rb +5 -2
  249. data/lib/mongoid/extensions/object.rb +23 -35
  250. data/lib/mongoid/extensions/object_id.rb +3 -0
  251. data/lib/mongoid/extensions/range.rb +9 -6
  252. data/lib/mongoid/extensions/raw_value.rb +34 -0
  253. data/lib/mongoid/extensions/regexp.rb +3 -0
  254. data/lib/mongoid/extensions/set.rb +13 -2
  255. data/lib/mongoid/extensions/string.rb +18 -10
  256. data/lib/mongoid/extensions/symbol.rb +5 -0
  257. data/lib/mongoid/extensions/time.rb +7 -19
  258. data/lib/mongoid/extensions/time_with_zone.rb +6 -2
  259. data/lib/mongoid/extensions/true_class.rb +5 -2
  260. data/lib/mongoid/extensions.rb +2 -32
  261. data/lib/mongoid/factory.rb +134 -40
  262. data/lib/mongoid/fields/encrypted.rb +48 -0
  263. data/lib/mongoid/fields/foreign_key.rb +29 -3
  264. data/lib/mongoid/fields/localized.rb +6 -0
  265. data/lib/mongoid/fields/standard.rb +5 -0
  266. data/lib/mongoid/fields/validators/macro.rb +3 -1
  267. data/lib/mongoid/fields/validators.rb +1 -0
  268. data/lib/mongoid/fields.rb +41 -46
  269. data/lib/mongoid/findable.rb +2 -2
  270. data/lib/mongoid/indexable/specification.rb +55 -19
  271. data/lib/mongoid/indexable/validators/options.rb +1 -0
  272. data/lib/mongoid/indexable.rb +1 -0
  273. data/lib/mongoid/inspectable.rb +32 -0
  274. data/lib/mongoid/interceptable.rb +18 -8
  275. data/lib/mongoid/loadable.rb +83 -0
  276. data/lib/mongoid/loggable.rb +1 -0
  277. data/lib/mongoid/matchable.rb +2 -6
  278. data/lib/mongoid/matcher/all.rb +15 -0
  279. data/lib/mongoid/matcher/and.rb +14 -0
  280. data/lib/mongoid/matcher/bits.rb +19 -0
  281. data/lib/mongoid/matcher/bits_all_clear.rb +21 -0
  282. data/lib/mongoid/matcher/bits_all_set.rb +21 -0
  283. data/lib/mongoid/matcher/bits_any_clear.rb +21 -0
  284. data/lib/mongoid/matcher/bits_any_set.rb +21 -0
  285. data/lib/mongoid/matcher/elem_match.rb +15 -0
  286. data/lib/mongoid/matcher/elem_match_expression.rb +14 -2
  287. data/lib/mongoid/matcher/eq.rb +15 -0
  288. data/lib/mongoid/matcher/eq_impl.rb +33 -16
  289. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +19 -5
  290. data/lib/mongoid/matcher/exists.rb +15 -0
  291. data/lib/mongoid/matcher/expression.rb +13 -0
  292. data/lib/mongoid/matcher/expression_operator.rb +14 -0
  293. data/lib/mongoid/matcher/field_expression.rb +15 -0
  294. data/lib/mongoid/matcher/field_operator.rb +24 -0
  295. data/lib/mongoid/matcher/gt.rb +15 -0
  296. data/lib/mongoid/matcher/gte.rb +15 -0
  297. data/lib/mongoid/matcher/in.rb +15 -0
  298. data/lib/mongoid/matcher/lt.rb +15 -0
  299. data/lib/mongoid/matcher/lte.rb +15 -0
  300. data/lib/mongoid/matcher/mod.rb +16 -0
  301. data/lib/mongoid/matcher/ne.rb +15 -0
  302. data/lib/mongoid/matcher/nin.rb +15 -0
  303. data/lib/mongoid/matcher/nor.rb +14 -0
  304. data/lib/mongoid/matcher/not.rb +16 -0
  305. data/lib/mongoid/matcher/or.rb +14 -0
  306. data/lib/mongoid/matcher/regex.rb +33 -8
  307. data/lib/mongoid/matcher/size.rb +16 -0
  308. data/lib/mongoid/matcher/type.rb +25 -0
  309. data/lib/mongoid/matcher.rb +5 -16
  310. data/lib/mongoid/persistable/creatable.rb +14 -9
  311. data/lib/mongoid/persistable/deletable.rb +7 -2
  312. data/lib/mongoid/persistable/destroyable.rb +34 -7
  313. data/lib/mongoid/persistable/incrementable.rb +2 -1
  314. data/lib/mongoid/persistable/logical.rb +1 -0
  315. data/lib/mongoid/persistable/maxable.rb +37 -0
  316. data/lib/mongoid/persistable/minable.rb +37 -0
  317. data/lib/mongoid/persistable/multipliable.rb +36 -0
  318. data/lib/mongoid/persistable/poppable.rb +1 -0
  319. data/lib/mongoid/persistable/pullable.rb +1 -0
  320. data/lib/mongoid/persistable/pushable.rb +1 -0
  321. data/lib/mongoid/persistable/renamable.rb +1 -0
  322. data/lib/mongoid/persistable/savable.rb +1 -0
  323. data/lib/mongoid/persistable/settable.rb +1 -0
  324. data/lib/mongoid/persistable/unsettable.rb +1 -0
  325. data/lib/mongoid/persistable/updatable.rb +37 -18
  326. data/lib/mongoid/persistable/upsertable.rb +20 -7
  327. data/lib/mongoid/persistable.rb +11 -1
  328. data/lib/mongoid/persistence_context.rb +46 -6
  329. data/lib/mongoid/positional.rb +1 -0
  330. data/lib/mongoid/railtie.rb +24 -1
  331. data/lib/mongoid/railties/bson_object_id_serializer.rb +39 -0
  332. data/lib/mongoid/railties/console_sandbox.rb +42 -0
  333. data/lib/mongoid/railties/controller_runtime.rb +20 -4
  334. data/lib/mongoid/railties/database.rake +12 -0
  335. data/lib/mongoid/reloadable.rb +38 -30
  336. data/lib/mongoid/scopable.rb +19 -23
  337. data/lib/mongoid/search_indexable.rb +167 -0
  338. data/lib/mongoid/selectable.rb +1 -0
  339. data/lib/mongoid/serializable.rb +8 -7
  340. data/lib/mongoid/shardable.rb +1 -0
  341. data/lib/mongoid/stateful.rb +9 -3
  342. data/lib/mongoid/stringified_symbol.rb +19 -6
  343. data/lib/mongoid/tasks/database.rake +13 -0
  344. data/lib/mongoid/tasks/database.rb +63 -0
  345. data/lib/mongoid/tasks/encryption.rake +59 -0
  346. data/lib/mongoid/tasks/encryption.rb +108 -0
  347. data/lib/mongoid/threaded/lifecycle.rb +1 -0
  348. data/lib/mongoid/threaded.rb +94 -33
  349. data/lib/mongoid/timestamps/created/short.rb +1 -0
  350. data/lib/mongoid/timestamps/created.rb +5 -11
  351. data/lib/mongoid/timestamps/short.rb +1 -0
  352. data/lib/mongoid/timestamps/timeless.rb +29 -0
  353. data/lib/mongoid/timestamps/updated/short.rb +1 -0
  354. data/lib/mongoid/timestamps/updated.rb +2 -1
  355. data/lib/mongoid/timestamps.rb +1 -0
  356. data/lib/mongoid/touchable.rb +154 -49
  357. data/lib/mongoid/traversable.rb +127 -122
  358. data/lib/mongoid/utils.rb +32 -2
  359. data/lib/mongoid/validatable/associated.rb +3 -5
  360. data/lib/mongoid/validatable/format.rb +1 -0
  361. data/lib/mongoid/validatable/length.rb +1 -0
  362. data/lib/mongoid/validatable/localizable.rb +1 -0
  363. data/lib/mongoid/validatable/macros.rb +5 -15
  364. data/lib/mongoid/validatable/presence.rb +1 -0
  365. data/lib/mongoid/validatable/queryable.rb +9 -0
  366. data/lib/mongoid/validatable/uniqueness.rb +2 -1
  367. data/lib/mongoid/validatable.rb +3 -3
  368. data/lib/mongoid/version.rb +2 -5
  369. data/lib/mongoid/warnings.rb +9 -17
  370. data/lib/mongoid.rb +38 -5
  371. data/lib/rails/generators/mongoid/config/config_generator.rb +17 -3
  372. data/lib/rails/generators/mongoid/config/templates/mongoid.rb +25 -0
  373. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +36 -62
  374. data/lib/rails/generators/mongoid/model/model_generator.rb +4 -0
  375. data/lib/rails/generators/mongoid_generator.rb +13 -0
  376. data/lib/rails/mongoid.rb +4 -29
  377. data/spec/config/mongoid.yml +0 -1
  378. data/spec/integration/active_job_spec.rb +32 -0
  379. data/spec/integration/app_spec.rb +72 -66
  380. data/spec/integration/associations/belongs_to_spec.rb +1 -0
  381. data/spec/integration/associations/embedded_dirty_spec.rb +1 -0
  382. data/spec/integration/associations/embedded_spec.rb +75 -6
  383. data/spec/integration/associations/embeds_many_spec.rb +1 -41
  384. data/spec/integration/associations/embeds_one_spec.rb +6 -25
  385. data/spec/integration/associations/foreign_key_spec.rb +1 -0
  386. data/spec/integration/associations/foreign_key_spec_models.rb +1 -0
  387. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +3 -17
  388. data/spec/integration/associations/has_many_spec.rb +1 -0
  389. data/spec/integration/associations/has_one_spec.rb +1 -0
  390. data/spec/integration/associations/nested_attributes_assignment_spec.rb +1 -0
  391. data/spec/integration/associations/reverse_population_spec.rb +1 -0
  392. data/spec/integration/associations/reverse_population_spec_models.rb +1 -0
  393. data/spec/integration/associations/scope_option_spec.rb +1 -0
  394. data/spec/integration/atomic/modifiers_spec.rb +1 -0
  395. data/spec/integration/bson_regexp_raw_spec.rb +1 -0
  396. data/spec/integration/callbacks_models.rb +3 -2
  397. data/spec/integration/callbacks_spec.rb +2 -1
  398. data/spec/integration/contextual/empty_spec.rb +1 -0
  399. data/spec/integration/criteria/alias_query_spec.rb +25 -88
  400. data/spec/integration/criteria/date_field_spec.rb +1 -0
  401. data/spec/integration/criteria/default_scope_spec.rb +1 -0
  402. data/spec/integration/criteria/logical_spec.rb +10 -28
  403. data/spec/integration/criteria/range_spec.rb +1 -2
  404. data/spec/integration/criteria/raw_value_spec.rb +525 -0
  405. data/spec/integration/criteria/time_with_zone_spec.rb +1 -0
  406. data/spec/integration/discriminator_key_spec.rb +1 -0
  407. data/spec/integration/discriminator_value_spec.rb +1 -0
  408. data/spec/integration/document_spec.rb +1 -0
  409. data/spec/integration/dots_and_dollars_spec.rb +3 -12
  410. data/spec/integration/encryption_spec.rb +100 -0
  411. data/spec/integration/i18n_fallbacks_spec.rb +7 -33
  412. data/spec/integration/matcher_examples_spec.rb +1 -0
  413. data/spec/integration/matcher_operator_data/bits_all_clear.yml +0 -15
  414. data/spec/integration/matcher_operator_data/bits_all_set.yml +0 -15
  415. data/spec/integration/matcher_operator_data/bits_any_clear.yml +0 -15
  416. data/spec/integration/matcher_operator_data/bits_any_set.yml +0 -15
  417. data/spec/integration/matcher_operator_data/regex.yml +0 -21
  418. data/spec/integration/matcher_operator_data/size.yml +0 -3
  419. data/spec/integration/matcher_operator_data/type.yml +0 -6
  420. data/spec/integration/matcher_operator_data/type_array.yml +0 -1
  421. data/spec/integration/matcher_operator_data/type_decimal.yml +0 -4
  422. data/spec/integration/matcher_operator_spec.rb +1 -0
  423. data/spec/integration/matcher_spec.rb +21 -66
  424. data/spec/integration/persistence/range_field_spec.rb +1 -0
  425. data/spec/integration/server_query_spec.rb +1 -0
  426. data/spec/integration/shardable_spec.rb +1 -0
  427. data/spec/integration/stringified_symbol_field_spec.rb +1 -0
  428. data/spec/lite_spec_helper.rb +36 -10
  429. data/spec/mongoid/association/accessors_spec.rb +11 -28
  430. data/spec/mongoid/association/auto_save_spec.rb +1 -0
  431. data/spec/mongoid/association/builders_spec.rb +1 -0
  432. data/spec/mongoid/association/constrainable_spec.rb +1 -0
  433. data/spec/mongoid/association/counter_cache_spec.rb +1 -0
  434. data/spec/mongoid/association/depending_spec.rb +1 -0
  435. data/spec/mongoid/association/eager_spec.rb +52 -24
  436. data/spec/mongoid/association/embedded/cyclic_spec.rb +1 -0
  437. data/spec/mongoid/association/embedded/dirty_spec.rb +1 -0
  438. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +1 -0
  439. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +1 -0
  440. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +1 -0
  441. data/spec/mongoid/association/embedded/embedded_in_spec.rb +19 -7
  442. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +1 -0
  443. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +1 -0
  444. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +1 -0
  445. data/spec/mongoid/association/embedded/embeds_many_models.rb +17 -2
  446. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +4 -7
  447. data/spec/mongoid/association/embedded/embeds_many_spec.rb +1 -0
  448. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +1 -0
  449. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +1 -0
  450. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +1 -0
  451. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +1 -0
  452. data/spec/mongoid/association/embedded/embeds_one_models.rb +6 -1
  453. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +2 -1
  454. data/spec/mongoid/association/embedded/embeds_one_spec.rb +1 -0
  455. data/spec/mongoid/association/macros_spec.rb +1 -0
  456. data/spec/mongoid/association/nested/many_spec.rb +1 -0
  457. data/spec/mongoid/association/nested/one_spec.rb +1 -0
  458. data/spec/mongoid/association/options_spec.rb +1 -0
  459. data/spec/mongoid/association/polymorphic_spec.rb +1 -0
  460. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +1 -0
  461. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +1 -0
  462. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +1 -0
  463. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +1 -4
  464. data/spec/mongoid/association/referenced/belongs_to_models.rb +1 -0
  465. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +2 -1
  466. data/spec/mongoid/association/referenced/belongs_to_spec.rb +1 -0
  467. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +1 -0
  468. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +2 -1
  469. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +1 -0
  470. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +1 -0
  471. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +38 -79
  472. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +1 -0
  473. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +2 -1
  474. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1 -0
  475. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +1 -0
  476. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +1 -0
  477. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +1 -0
  478. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +1 -0
  479. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +1 -0
  480. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +1090 -2152
  481. data/spec/mongoid/association/referenced/has_many_models.rb +1 -0
  482. data/spec/mongoid/association/referenced/has_many_query_spec.rb +2 -1
  483. data/spec/mongoid/association/referenced/has_many_spec.rb +1 -0
  484. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +1 -0
  485. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +1 -0
  486. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +1 -0
  487. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +1 -0
  488. data/spec/mongoid/association/referenced/has_one_models.rb +1 -0
  489. data/spec/mongoid/association/referenced/has_one_query_spec.rb +2 -1
  490. data/spec/mongoid/association/referenced/has_one_spec.rb +1 -0
  491. data/spec/mongoid/association/reflections_spec.rb +1 -0
  492. data/spec/mongoid/association/syncable_spec.rb +1 -0
  493. data/spec/mongoid/association_spec.rb +1 -0
  494. data/spec/mongoid/atomic/modifiers_spec.rb +1 -0
  495. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +1 -0
  496. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +1 -0
  497. data/spec/mongoid/atomic/paths/root_spec.rb +1 -0
  498. data/spec/mongoid/atomic/paths_spec.rb +1 -0
  499. data/spec/mongoid/atomic_spec.rb +1 -0
  500. data/spec/mongoid/atomic_update_preparer_spec.rb +83 -0
  501. data/spec/mongoid/attributes/dynamic_spec.rb +1 -0
  502. data/spec/mongoid/attributes/embedded_spec.rb +118 -0
  503. data/spec/mongoid/attributes/nested_spec.rb +11 -204
  504. data/spec/mongoid/attributes/nested_spec_models.rb +1 -0
  505. data/spec/mongoid/attributes/projector_spec.rb +1 -0
  506. data/spec/mongoid/attributes/readonly_spec.rb +1 -19
  507. data/spec/mongoid/attributes_spec.rb +18 -35
  508. data/spec/mongoid/cacheable_spec.rb +1 -0
  509. data/spec/mongoid/changeable_spec.rb +4 -3
  510. data/spec/mongoid/clients/factory_spec.rb +77 -30
  511. data/spec/mongoid/clients/options_spec.rb +9 -5
  512. data/spec/mongoid/clients/sessions_spec.rb +27 -10
  513. data/spec/mongoid/clients/transactions_spec.rb +958 -185
  514. data/spec/mongoid/clients/transactions_spec_models.rb +159 -0
  515. data/spec/mongoid/clients_spec.rb +47 -2
  516. data/spec/mongoid/collection_configurable_spec.rb +1 -0
  517. data/spec/mongoid/composable_spec.rb +1 -0
  518. data/spec/mongoid/config/defaults_spec.rb +31 -92
  519. data/spec/mongoid/config/encryption_spec.rb +152 -0
  520. data/spec/mongoid/config/environment_spec.rb +13 -41
  521. data/spec/mongoid/config/introspection_spec.rb +114 -0
  522. data/spec/mongoid/config/options_spec.rb +1 -0
  523. data/spec/mongoid/config_spec.rb +20 -133
  524. data/spec/mongoid/contextual/aggregable/memory_spec.rb +1 -91
  525. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +1 -0
  526. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +5 -29
  527. data/spec/mongoid/contextual/aggregable/none_spec.rb +3 -14
  528. data/spec/mongoid/contextual/atomic_spec.rb +203 -12
  529. data/spec/mongoid/contextual/map_reduce_spec.rb +1 -0
  530. data/spec/mongoid/contextual/memory_spec.rb +340 -687
  531. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +10 -3
  532. data/spec/mongoid/contextual/mongo_spec.rb +101 -283
  533. data/spec/mongoid/contextual/none_spec.rb +1 -0
  534. data/spec/mongoid/copyable_spec.rb +1 -0
  535. data/spec/mongoid/copyable_spec_models.rb +1 -0
  536. data/spec/mongoid/criteria/findable_spec.rb +191 -0
  537. data/spec/mongoid/criteria/includable_spec.rb +1 -0
  538. data/spec/mongoid/criteria/includable_spec_models.rb +1 -0
  539. data/spec/mongoid/criteria/inspectable_spec.rb +1 -0
  540. data/spec/mongoid/criteria/marshalable_spec.rb +3 -2
  541. data/spec/mongoid/criteria/modifiable_spec.rb +1 -0
  542. data/spec/mongoid/criteria/options_spec.rb +1 -0
  543. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +1 -0
  544. data/spec/mongoid/criteria/queryable/expandable_spec.rb +1 -0
  545. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +1 -0
  546. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +8 -7
  547. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +1 -0
  548. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +21 -11
  549. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +1 -0
  550. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +1 -0
  551. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +1 -0
  552. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +1 -0
  553. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +1 -0
  554. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +1 -0
  555. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +1 -0
  556. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +1 -0
  557. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -11
  558. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +1 -11
  559. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +1 -0
  560. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +48 -66
  561. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +5 -0
  562. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +1 -0
  563. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +1 -0
  564. data/spec/mongoid/criteria/queryable/key_spec.rb +1 -0
  565. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +1 -0
  566. data/spec/mongoid/criteria/queryable/optional_spec.rb +1 -0
  567. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -0
  568. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +1 -0
  569. data/spec/mongoid/criteria/queryable/queryable_spec.rb +1 -0
  570. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +4 -5
  571. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +1 -0
  572. data/spec/mongoid/criteria/queryable/selectable_spec.rb +51 -214
  573. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +1 -235
  574. data/spec/mongoid/criteria/queryable/selector_spec.rb +96 -0
  575. data/spec/mongoid/criteria/queryable/smash_spec.rb +1 -0
  576. data/spec/mongoid/criteria/queryable/storable_spec.rb +10 -32
  577. data/spec/mongoid/criteria/scopable_spec.rb +1 -0
  578. data/spec/mongoid/criteria/translator_spec.rb +1 -0
  579. data/spec/mongoid/criteria_projection_spec.rb +6 -5
  580. data/spec/mongoid/criteria_spec.rb +221 -361
  581. data/spec/mongoid/document_fields_spec.rb +1 -0
  582. data/spec/mongoid/document_persistence_context_spec.rb +77 -0
  583. data/spec/mongoid/document_query_spec.rb +5 -4
  584. data/spec/mongoid/document_spec.rb +3 -148
  585. data/spec/mongoid/equality_spec.rb +41 -149
  586. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +1 -0
  587. data/spec/mongoid/errors/attribute_not_loaded_spec.rb +32 -0
  588. data/spec/mongoid/errors/callback_spec.rb +1 -0
  589. data/spec/mongoid/errors/delete_restriction_spec.rb +1 -0
  590. data/spec/mongoid/errors/document_not_destroyed_spec.rb +1 -0
  591. data/spec/mongoid/errors/document_not_found_spec.rb +1 -0
  592. data/spec/mongoid/errors/invalid_collection_spec.rb +1 -0
  593. data/spec/mongoid/errors/invalid_config_file_spec.rb +1 -0
  594. data/spec/mongoid/errors/invalid_config_option_spec.rb +1 -0
  595. data/spec/mongoid/errors/invalid_field_option_spec.rb +1 -0
  596. data/spec/mongoid/errors/invalid_field_spec.rb +1 -0
  597. data/spec/mongoid/errors/invalid_field_type_spec.rb +1 -0
  598. data/spec/mongoid/errors/invalid_find_spec.rb +1 -0
  599. data/spec/mongoid/errors/invalid_includes_spec.rb +1 -0
  600. data/spec/mongoid/errors/invalid_index_spec.rb +1 -0
  601. data/spec/mongoid/errors/invalid_options_spec.rb +1 -0
  602. data/spec/mongoid/errors/invalid_path_spec.rb +1 -0
  603. data/spec/mongoid/errors/invalid_relation_spec.rb +1 -0
  604. data/spec/mongoid/errors/invalid_scope_spec.rb +1 -0
  605. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +1 -0
  606. data/spec/mongoid/errors/invalid_storage_options_spec.rb +1 -0
  607. data/spec/mongoid/errors/invalid_time_spec.rb +1 -0
  608. data/spec/mongoid/errors/inverse_not_found_spec.rb +1 -0
  609. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +1 -0
  610. data/spec/mongoid/errors/mixed_relations_spec.rb +1 -0
  611. data/spec/mongoid/errors/mongoid_error_spec.rb +9 -22
  612. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +1 -0
  613. data/spec/mongoid/errors/no_client_config_spec.rb +1 -0
  614. data/spec/mongoid/errors/no_client_database_spec.rb +1 -0
  615. data/spec/mongoid/errors/no_client_hosts_spec.rb +1 -0
  616. data/spec/mongoid/errors/no_clients_config_spec.rb +1 -0
  617. data/spec/mongoid/errors/no_environment_spec.rb +1 -0
  618. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +1 -0
  619. data/spec/mongoid/errors/no_metadata_spec.rb +1 -0
  620. data/spec/mongoid/errors/no_parent_spec.rb +1 -0
  621. data/spec/mongoid/errors/readonly_attribute_spec.rb +1 -0
  622. data/spec/mongoid/errors/readonly_document_spec.rb +1 -0
  623. data/spec/mongoid/errors/scope_overwrite_spec.rb +1 -0
  624. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -0
  625. data/spec/mongoid/errors/unknown_attribute_spec.rb +1 -0
  626. data/spec/mongoid/errors/unsaved_document_spec.rb +1 -0
  627. data/spec/mongoid/errors/unsupported_javascript_spec.rb +1 -0
  628. data/spec/mongoid/errors/validations_spec.rb +1 -0
  629. data/spec/mongoid/extensions/array_spec.rb +3 -262
  630. data/spec/mongoid/extensions/big_decimal_spec.rb +5 -4
  631. data/spec/mongoid/extensions/binary_spec.rb +1 -0
  632. data/spec/mongoid/extensions/boolean_spec.rb +1 -0
  633. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +8 -7
  634. data/spec/mongoid/extensions/date_spec.rb +3 -20
  635. data/spec/mongoid/extensions/date_time_spec.rb +3 -9
  636. data/spec/mongoid/extensions/decimal128_spec.rb +1 -0
  637. data/spec/mongoid/extensions/false_class_spec.rb +1 -7
  638. data/spec/mongoid/extensions/float_spec.rb +3 -9
  639. data/spec/mongoid/extensions/hash_spec.rb +19 -458
  640. data/spec/mongoid/extensions/integer_spec.rb +3 -8
  641. data/spec/mongoid/extensions/module_spec.rb +1 -0
  642. data/spec/mongoid/extensions/nil_class_spec.rb +1 -0
  643. data/spec/mongoid/extensions/object_id_spec.rb +1 -0
  644. data/spec/mongoid/extensions/object_spec.rb +1 -176
  645. data/spec/mongoid/extensions/range_spec.rb +1 -11
  646. data/spec/mongoid/extensions/raw_value_spec.rb +67 -0
  647. data/spec/mongoid/extensions/regexp_spec.rb +1 -0
  648. data/spec/mongoid/extensions/set_spec.rb +2 -3
  649. data/spec/mongoid/extensions/string_spec.rb +3 -113
  650. data/spec/mongoid/extensions/stringified_symbol_spec.rb +1 -0
  651. data/spec/mongoid/extensions/symbol_spec.rb +1 -31
  652. data/spec/mongoid/extensions/time_spec.rb +32 -350
  653. data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -30
  654. data/spec/mongoid/extensions/true_class_spec.rb +1 -7
  655. data/spec/mongoid/factory_spec.rb +1 -0
  656. data/spec/mongoid/fields/foreign_key_spec.rb +282 -119
  657. data/spec/mongoid/fields/localized_spec.rb +1 -0
  658. data/spec/mongoid/fields/standard_spec.rb +1 -0
  659. data/spec/mongoid/fields_spec.rb +60 -66
  660. data/spec/mongoid/findable_spec.rb +2 -61
  661. data/spec/mongoid/indexable/specification_spec.rb +132 -13
  662. data/spec/mongoid/indexable_spec.rb +323 -9
  663. data/spec/mongoid/inspectable_spec.rb +81 -0
  664. data/spec/mongoid/interceptable_spec.rb +3 -82
  665. data/spec/mongoid/interceptable_spec_models.rb +112 -47
  666. data/spec/mongoid/loading_spec.rb +110 -0
  667. data/spec/mongoid/loggable_spec.rb +1 -0
  668. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -0
  669. data/spec/mongoid/mongoizable_spec.rb +1 -0
  670. data/spec/mongoid/monkey_patches_spec.rb +211 -0
  671. data/spec/mongoid/persistable/creatable_spec.rb +1 -0
  672. data/spec/mongoid/persistable/deletable_spec.rb +78 -31
  673. data/spec/mongoid/persistable/destroyable_spec.rb +230 -52
  674. data/spec/mongoid/persistable/incrementable_spec.rb +1 -0
  675. data/spec/mongoid/persistable/logical_spec.rb +1 -0
  676. data/spec/mongoid/persistable/maxable_spec.rb +147 -0
  677. data/spec/mongoid/persistable/minable_spec.rb +147 -0
  678. data/spec/mongoid/persistable/multipliable_spec.rb +227 -0
  679. data/spec/mongoid/persistable/poppable_spec.rb +1 -0
  680. data/spec/mongoid/persistable/pullable_spec.rb +1 -0
  681. data/spec/mongoid/persistable/pushable_spec.rb +1 -0
  682. data/spec/mongoid/persistable/renamable_spec.rb +1 -0
  683. data/spec/mongoid/persistable/savable_spec.rb +2 -6
  684. data/spec/mongoid/persistable/settable_spec.rb +5 -4
  685. data/spec/mongoid/persistable/unsettable_spec.rb +1 -0
  686. data/spec/mongoid/persistable/updatable_spec.rb +3 -2
  687. data/spec/mongoid/persistable/upsertable_spec.rb +34 -1
  688. data/spec/mongoid/persistable_spec.rb +1 -0
  689. data/spec/mongoid/persistence_context_spec.rb +1 -0
  690. data/spec/mongoid/positional_spec.rb +1 -0
  691. data/spec/mongoid/railties/bson_object_id_serializer_spec.rb +24 -0
  692. data/spec/mongoid/railties/console_sandbox_spec.rb +44 -0
  693. data/spec/mongoid/relations/proxy_spec.rb +1 -0
  694. data/spec/mongoid/reloadable_spec.rb +28 -83
  695. data/spec/mongoid/scopable_spec.rb +39 -50
  696. data/spec/mongoid/search_indexable_spec.rb +147 -0
  697. data/spec/mongoid/selectable_spec.rb +1 -0
  698. data/spec/mongoid/serializable_spec.rb +10 -16
  699. data/spec/mongoid/shardable_models.rb +1 -0
  700. data/spec/mongoid/shardable_spec.rb +1 -0
  701. data/spec/mongoid/stateful_spec.rb +1 -0
  702. data/spec/mongoid/tasks/database_rake_spec.rb +127 -49
  703. data/spec/mongoid/tasks/database_spec.rb +48 -1
  704. data/spec/mongoid/tasks/encryption_spec.rb +187 -0
  705. data/spec/mongoid/threaded_spec.rb +38 -0
  706. data/spec/mongoid/timestamps/created/short_spec.rb +1 -0
  707. data/spec/mongoid/timestamps/created_spec.rb +1 -23
  708. data/spec/mongoid/timestamps/timeless_spec.rb +1 -0
  709. data/spec/mongoid/timestamps/updated/short_spec.rb +1 -0
  710. data/spec/mongoid/timestamps/updated_spec.rb +1 -0
  711. data/spec/mongoid/timestamps_spec.rb +1 -0
  712. data/spec/mongoid/timestamps_spec_models.rb +1 -0
  713. data/spec/mongoid/touchable_spec.rb +485 -69
  714. data/spec/mongoid/touchable_spec_models.rb +96 -1
  715. data/spec/mongoid/traversable_spec.rb +1 -0
  716. data/spec/mongoid/validatable/associated_spec.rb +5 -14
  717. data/spec/mongoid/validatable/format_spec.rb +1 -0
  718. data/spec/mongoid/validatable/length_spec.rb +1 -0
  719. data/spec/mongoid/validatable/numericality_spec.rb +1 -16
  720. data/spec/mongoid/validatable/presence_spec.rb +1 -0
  721. data/spec/mongoid/validatable/uniqueness_spec.rb +48 -3
  722. data/spec/mongoid/validatable_spec.rb +1 -0
  723. data/spec/mongoid/warnings_spec.rb +1 -0
  724. data/spec/mongoid_spec.rb +27 -0
  725. data/spec/rails/controller_extension/controller_runtime_spec.rb +1 -0
  726. data/spec/rails/mongoid_spec.rb +26 -117
  727. data/spec/shared/lib/mrss/docker_runner.rb +1 -1
  728. data/spec/shared/lib/mrss/server_version_registry.rb +1 -1
  729. data/spec/shared/lib/mrss/spec_organizer.rb +3 -32
  730. data/spec/shared/share/Dockerfile.erb +34 -4
  731. data/spec/shared/shlib/distro.sh +0 -10
  732. data/spec/shared/shlib/server.sh +27 -33
  733. data/spec/shared/shlib/set_env.sh +42 -6
  734. data/spec/spec_helper.rb +26 -28
  735. data/spec/support/authorization.rb +1 -0
  736. data/spec/support/client_registry.rb +1 -0
  737. data/spec/support/constraints.rb +1 -0
  738. data/spec/support/crypt/models.rb +50 -0
  739. data/spec/support/crypt.rb +80 -0
  740. data/spec/support/expectations.rb +18 -20
  741. data/spec/support/feature_sandbox.rb +72 -0
  742. data/spec/support/helpers.rb +1 -0
  743. data/spec/support/immutable_ids.rb +22 -21
  744. data/spec/support/macros.rb +4 -6
  745. data/spec/support/models/account.rb +1 -0
  746. data/spec/support/models/acolyte.rb +1 -0
  747. data/spec/support/models/actor.rb +1 -0
  748. data/spec/support/models/actress.rb +1 -0
  749. data/spec/support/models/address.rb +3 -0
  750. data/spec/support/models/address_component.rb +1 -0
  751. data/spec/support/models/address_number.rb +1 -0
  752. data/spec/support/models/agency.rb +1 -0
  753. data/spec/support/models/agent.rb +1 -0
  754. data/spec/support/models/album.rb +1 -0
  755. data/spec/support/models/alert.rb +1 -0
  756. data/spec/support/models/animal.rb +1 -0
  757. data/spec/support/models/answer.rb +1 -0
  758. data/spec/support/models/appointment.rb +1 -0
  759. data/spec/support/models/armrest.rb +1 -0
  760. data/spec/support/models/array_field.rb +1 -0
  761. data/spec/support/models/article.rb +1 -0
  762. data/spec/support/models/artist.rb +1 -0
  763. data/spec/support/models/artwork.rb +1 -0
  764. data/spec/support/models/audible_sound.rb +1 -0
  765. data/spec/support/models/audio.rb +1 -0
  766. data/spec/support/models/augmentation.rb +1 -0
  767. data/spec/support/models/author.rb +1 -0
  768. data/spec/support/models/baby.rb +1 -0
  769. data/spec/support/models/band.rb +5 -1
  770. data/spec/support/models/bar.rb +1 -0
  771. data/spec/support/models/basic.rb +1 -0
  772. data/spec/support/models/bed.rb +1 -0
  773. data/spec/support/models/big_palette.rb +1 -0
  774. data/spec/support/models/birthday.rb +1 -0
  775. data/spec/support/models/bolt.rb +1 -0
  776. data/spec/support/models/bomb.rb +1 -0
  777. data/spec/support/models/book.rb +1 -0
  778. data/spec/support/models/breed.rb +1 -0
  779. data/spec/support/models/browser.rb +1 -0
  780. data/spec/support/models/building.rb +1 -0
  781. data/spec/support/models/building_address.rb +1 -0
  782. data/spec/support/models/bus.rb +1 -0
  783. data/spec/support/models/business.rb +1 -0
  784. data/spec/support/models/callback_test.rb +1 -0
  785. data/spec/support/models/canvas.rb +1 -0
  786. data/spec/support/models/car.rb +1 -0
  787. data/spec/support/models/cat.rb +1 -0
  788. data/spec/support/models/catalog.rb +1 -0
  789. data/spec/support/models/category.rb +1 -0
  790. data/spec/support/models/child.rb +1 -0
  791. data/spec/support/models/child_doc.rb +1 -0
  792. data/spec/support/models/church.rb +1 -0
  793. data/spec/support/models/circle.rb +1 -0
  794. data/spec/support/models/circuit.rb +1 -0
  795. data/spec/support/models/circus.rb +1 -0
  796. data/spec/support/models/code.rb +1 -0
  797. data/spec/support/models/coding/pull_request.rb +1 -0
  798. data/spec/support/models/coding.rb +1 -0
  799. data/spec/support/models/comment.rb +1 -0
  800. data/spec/support/models/company.rb +1 -0
  801. data/spec/support/models/consumption_period.rb +1 -0
  802. data/spec/support/models/contextable_item.rb +1 -0
  803. data/spec/support/models/contractor.rb +1 -0
  804. data/spec/support/models/cookie.rb +1 -0
  805. data/spec/support/models/country_code.rb +1 -0
  806. data/spec/support/models/courier_job.rb +1 -0
  807. data/spec/support/models/cover.rb +1 -0
  808. data/spec/support/models/crate.rb +1 -0
  809. data/spec/support/models/customer.rb +1 -0
  810. data/spec/support/models/customer_address.rb +1 -0
  811. data/spec/support/models/deed.rb +1 -0
  812. data/spec/support/models/definition.rb +1 -0
  813. data/spec/support/models/delegating_patient.rb +1 -0
  814. data/spec/support/models/description.rb +1 -0
  815. data/spec/support/models/dictionary.rb +1 -0
  816. data/spec/support/models/division.rb +1 -0
  817. data/spec/support/models/doctor.rb +1 -0
  818. data/spec/support/models/dog.rb +1 -0
  819. data/spec/support/models/dokument.rb +1 -0
  820. data/spec/support/models/draft.rb +1 -0
  821. data/spec/support/models/dragon.rb +1 -0
  822. data/spec/support/models/driver.rb +1 -0
  823. data/spec/support/models/drug.rb +1 -0
  824. data/spec/support/models/dungeon.rb +1 -0
  825. data/spec/support/models/edit.rb +1 -0
  826. data/spec/support/models/email.rb +1 -0
  827. data/spec/support/models/employer.rb +1 -0
  828. data/spec/support/models/entry.rb +1 -0
  829. data/spec/support/models/eraser.rb +1 -0
  830. data/spec/support/models/even.rb +1 -0
  831. data/spec/support/models/event.rb +1 -0
  832. data/spec/support/models/exhibition.rb +1 -0
  833. data/spec/support/models/exhibitor.rb +1 -0
  834. data/spec/support/models/explosion.rb +1 -0
  835. data/spec/support/models/eye.rb +1 -0
  836. data/spec/support/models/eye_bowl.rb +1 -0
  837. data/spec/support/models/face.rb +1 -0
  838. data/spec/support/models/fanatic.rb +1 -0
  839. data/spec/support/models/favorite.rb +8 -1
  840. data/spec/support/models/filesystem.rb +1 -0
  841. data/spec/support/models/fire_hydrant.rb +1 -0
  842. data/spec/support/models/firefox.rb +1 -0
  843. data/spec/support/models/fish.rb +1 -0
  844. data/spec/support/models/folder.rb +1 -0
  845. data/spec/support/models/folder_item.rb +1 -0
  846. data/spec/support/models/fruits.rb +1 -0
  847. data/spec/support/models/game.rb +1 -0
  848. data/spec/support/models/ghost.rb +1 -0
  849. data/spec/support/models/guitar.rb +1 -0
  850. data/spec/support/models/hole.rb +1 -0
  851. data/spec/support/models/home.rb +1 -0
  852. data/spec/support/models/house.rb +1 -0
  853. data/spec/support/models/html_writer.rb +1 -0
  854. data/spec/support/models/id_key.rb +1 -0
  855. data/spec/support/models/idnodef.rb +1 -0
  856. data/spec/support/models/image.rb +1 -0
  857. data/spec/support/models/implant.rb +1 -0
  858. data/spec/support/models/instrument.rb +1 -0
  859. data/spec/support/models/item.rb +1 -0
  860. data/spec/support/models/jar.rb +1 -0
  861. data/spec/support/models/kaleidoscope.rb +1 -0
  862. data/spec/support/models/kangaroo.rb +1 -0
  863. data/spec/support/models/label.rb +1 -0
  864. data/spec/support/models/language.rb +1 -0
  865. data/spec/support/models/lat_lng.rb +1 -6
  866. data/spec/support/models/league.rb +1 -0
  867. data/spec/support/models/learner.rb +1 -0
  868. data/spec/support/models/line_item.rb +1 -0
  869. data/spec/support/models/location.rb +1 -0
  870. data/spec/support/models/login.rb +1 -0
  871. data/spec/support/models/manufacturer.rb +1 -0
  872. data/spec/support/models/meat.rb +1 -0
  873. data/spec/support/models/membership.rb +1 -0
  874. data/spec/support/models/message.rb +1 -0
  875. data/spec/support/models/minim.rb +1 -0
  876. data/spec/support/models/mixed_drink.rb +1 -0
  877. data/spec/support/models/mop.rb +1 -0
  878. data/spec/support/models/movie.rb +1 -0
  879. data/spec/support/models/my_hash.rb +1 -0
  880. data/spec/support/models/name.rb +1 -0
  881. data/spec/support/models/name_only.rb +1 -0
  882. data/spec/support/models/node.rb +1 -0
  883. data/spec/support/models/note.rb +1 -0
  884. data/spec/support/models/nut.rb +1 -0
  885. data/spec/support/models/odd.rb +1 -0
  886. data/spec/support/models/order.rb +1 -0
  887. data/spec/support/models/ordered_post.rb +1 -0
  888. data/spec/support/models/ordered_preference.rb +1 -0
  889. data/spec/support/models/oscar.rb +1 -0
  890. data/spec/support/models/other_owner_object.rb +1 -0
  891. data/spec/support/models/override.rb +1 -0
  892. data/spec/support/models/ownable.rb +1 -0
  893. data/spec/support/models/owner.rb +1 -0
  894. data/spec/support/models/pack.rb +1 -0
  895. data/spec/support/models/page.rb +1 -0
  896. data/spec/support/models/page_question.rb +1 -0
  897. data/spec/support/models/palette.rb +1 -0
  898. data/spec/support/models/parent.rb +1 -0
  899. data/spec/support/models/parent_doc.rb +1 -0
  900. data/spec/support/models/passport.rb +1 -0
  901. data/spec/support/models/patient.rb +1 -0
  902. data/spec/support/models/pdf_writer.rb +1 -0
  903. data/spec/support/models/pencil.rb +1 -0
  904. data/spec/support/models/person.rb +1 -0
  905. data/spec/support/models/pet.rb +1 -0
  906. data/spec/support/models/pet_owner.rb +1 -0
  907. data/spec/support/models/phone.rb +1 -0
  908. data/spec/support/models/piano.rb +1 -0
  909. data/spec/support/models/pizza.rb +1 -0
  910. data/spec/support/models/player.rb +1 -0
  911. data/spec/support/models/post.rb +1 -0
  912. data/spec/support/models/post_genre.rb +1 -0
  913. data/spec/support/models/powerup.rb +1 -0
  914. data/spec/support/models/preference.rb +1 -0
  915. data/spec/support/models/princess.rb +1 -0
  916. data/spec/support/models/product.rb +1 -0
  917. data/spec/support/models/profile.rb +1 -0
  918. data/spec/support/models/pronunciation.rb +1 -0
  919. data/spec/support/models/pub.rb +1 -0
  920. data/spec/support/models/publication/encyclopedia.rb +1 -0
  921. data/spec/support/models/publication/review.rb +1 -0
  922. data/spec/support/models/publication.rb +1 -0
  923. data/spec/support/models/purchase.rb +1 -0
  924. data/spec/support/models/purchased_item.rb +1 -0
  925. data/spec/support/models/question.rb +1 -0
  926. data/spec/support/models/quiz.rb +1 -0
  927. data/spec/support/models/rating.rb +1 -0
  928. data/spec/support/models/record.rb +1 -0
  929. data/spec/support/models/registry.rb +1 -0
  930. data/spec/support/models/role.rb +1 -0
  931. data/spec/support/models/root_category.rb +1 -0
  932. data/spec/support/models/sandbox/app/models/app_models_message.rb +4 -0
  933. data/spec/support/models/sandbox/lib/models/lib_models_message.rb +4 -0
  934. data/spec/support/models/sandbox/sandbox_message.rb +4 -0
  935. data/spec/support/models/sandbox/sandbox_user.rb +4 -0
  936. data/spec/support/models/sandbox/subdir/sandbox_comment.rb +4 -0
  937. data/spec/support/models/sandwich.rb +1 -0
  938. data/spec/support/models/scheduler.rb +1 -0
  939. data/spec/support/models/school.rb +1 -0
  940. data/spec/support/models/scribe.rb +1 -0
  941. data/spec/support/models/sealer.rb +1 -0
  942. data/spec/support/models/seat.rb +1 -0
  943. data/spec/support/models/seo.rb +1 -0
  944. data/spec/support/models/series.rb +1 -0
  945. data/spec/support/models/server.rb +1 -0
  946. data/spec/support/models/service.rb +1 -0
  947. data/spec/support/models/shape.rb +1 -0
  948. data/spec/support/models/shelf.rb +1 -0
  949. data/spec/support/models/shield.rb +1 -0
  950. data/spec/support/models/shipment_address.rb +1 -0
  951. data/spec/support/models/shipping_container.rb +1 -0
  952. data/spec/support/models/shipping_pack.rb +1 -0
  953. data/spec/support/models/shirt.rb +1 -0
  954. data/spec/support/models/shop.rb +1 -0
  955. data/spec/support/models/short_agent.rb +1 -0
  956. data/spec/support/models/short_quiz.rb +1 -0
  957. data/spec/support/models/simple.rb +1 -0
  958. data/spec/support/models/slave.rb +1 -0
  959. data/spec/support/models/song.rb +1 -0
  960. data/spec/support/models/sound.rb +1 -0
  961. data/spec/support/models/spacer.rb +1 -0
  962. data/spec/support/models/square.rb +1 -0
  963. data/spec/support/models/staff.rb +1 -0
  964. data/spec/support/models/store_as_dup_test1.rb +1 -0
  965. data/spec/support/models/store_as_dup_test2.rb +1 -0
  966. data/spec/support/models/store_as_dup_test3.rb +1 -0
  967. data/spec/support/models/store_as_dup_test4.rb +1 -0
  968. data/spec/support/models/strategy.rb +1 -0
  969. data/spec/support/models/student.rb +1 -0
  970. data/spec/support/models/sub_item.rb +1 -0
  971. data/spec/support/models/subscription.rb +1 -0
  972. data/spec/support/models/survey.rb +1 -0
  973. data/spec/support/models/symptom.rb +1 -0
  974. data/spec/support/models/system_role.rb +1 -0
  975. data/spec/support/models/tag.rb +1 -0
  976. data/spec/support/models/target.rb +1 -0
  977. data/spec/support/models/template.rb +1 -0
  978. data/spec/support/models/thing.rb +1 -0
  979. data/spec/support/models/threadlocker.rb +1 -0
  980. data/spec/support/models/title.rb +1 -0
  981. data/spec/support/models/tool.rb +1 -0
  982. data/spec/support/models/topping.rb +1 -0
  983. data/spec/support/models/toy.rb +1 -0
  984. data/spec/support/models/track.rb +1 -0
  985. data/spec/support/models/translation.rb +1 -0
  986. data/spec/support/models/tree.rb +1 -0
  987. data/spec/support/models/truck.rb +1 -0
  988. data/spec/support/models/updatable.rb +1 -0
  989. data/spec/support/models/user.rb +1 -0
  990. data/spec/support/models/user_account.rb +1 -0
  991. data/spec/support/models/validation_callback.rb +1 -0
  992. data/spec/support/models/vehicle.rb +1 -0
  993. data/spec/support/models/version.rb +1 -0
  994. data/spec/support/models/vertex.rb +1 -0
  995. data/spec/support/models/vet_visit.rb +1 -0
  996. data/spec/support/models/video.rb +1 -0
  997. data/spec/support/models/video_game.rb +1 -0
  998. data/spec/support/models/washer.rb +1 -0
  999. data/spec/support/models/weapon.rb +1 -0
  1000. data/spec/support/models/wiki_page.rb +1 -0
  1001. data/spec/support/models/word.rb +1 -0
  1002. data/spec/support/models/word_origin.rb +1 -0
  1003. data/spec/support/models/writer.rb +1 -0
  1004. data/spec/support/rails_mock.rb +32 -0
  1005. data/spec/support/shared/time.rb +3 -21
  1006. data/spec/support/sinatra_mock.rb +7 -0
  1007. data/spec/support/spec_config.rb +30 -9
  1008. data.tar.gz.sig +0 -0
  1009. metadata +127 -57
  1010. metadata.gz.sig +1 -0
  1011. data/lib/mongoid/association/referenced/eager.rb +0 -163
  1012. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +0 -113
  1013. data/lib/mongoid/contextual/geo_near.rb +0 -236
  1014. data/lib/mongoid/errors/in_memory_regexp_timeout.rb +0 -26
  1015. data/lib/mongoid/errors/invalid_session_use.rb +0 -21
  1016. data/lib/mongoid/errors/invalid_storage_parent.rb +0 -27
  1017. data/lib/mongoid/field_readable.rb +0 -70
  1018. data/lib/mongoid/matcher/regexp_budget.rb +0 -389
  1019. data/lib/mongoid/query_cache.rb +0 -68
  1020. data/lib/mongoid/validatable/numericality.rb +0 -19
  1021. data/spec/integration/matcher_regexp_timeout_spec.rb +0 -215
  1022. data/spec/integration/query_operator_guard_spec.rb +0 -89
  1023. data/spec/mongoid/contextual/geo_near_spec.rb +0 -471
  1024. data/spec/mongoid/extensions_spec.rb +0 -43
  1025. data/spec/mongoid/matcher/regexp_budget_spec.rb +0 -570
  1026. data/spec/mongoid/query_cache_middleware_spec.rb +0 -50
  1027. data/spec/mongoid/query_cache_spec.rb +0 -865
  1028. data/spec/shared/CANDIDATE.md +0 -28
  1029. data/spec/shared/lib/mrss/release/candidate.rb +0 -281
  1030. data/spec/shared/lib/mrss/release/product_data.rb +0 -144
  1031. data/spec/shared/lib/tasks/candidate.rake +0 -64
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  require "spec_helper"
4
5
 
@@ -408,270 +409,183 @@ describe Mongoid::Contextual::Memory do
408
409
  end
409
410
 
410
411
  describe "#distinct" do
412
+ let(:depeche) { Band.create!(name: "Depeche Mode", years: 30, sales: "1E2") }
413
+ let(:new_order) { Band.create!(name: "New Order", years: 25, sales: "2E3") }
414
+ let(:maniacs) { Band.create!(name: "10,000 Maniacs", years: 20, sales: "1E2") }
411
415
 
412
- context "when legacy_pluck_distinct is true" do
413
- config_override :legacy_pluck_distinct, true
414
-
415
- let(:hobrecht) do
416
- Address.new(street: "hobrecht")
416
+ let(:criteria) do
417
+ Band.all.tap do |crit|
418
+ crit.documents = [ depeche, new_order, maniacs ]
417
419
  end
420
+ end
418
421
 
419
- let(:friedel) do
420
- Address.new(street: "friedel")
421
- end
422
+ let(:context) do
423
+ described_class.new(criteria)
424
+ end
422
425
 
423
- context "when limiting the result set" do
426
+ context "when limiting the result set" do
424
427
 
425
- let(:criteria) do
426
- Address.where(street: "hobrecht").tap do |crit|
427
- crit.documents = [ hobrecht, hobrecht, friedel ]
428
- end
429
- end
430
-
431
- let(:context) do
432
- described_class.new(criteria)
428
+ let(:criteria) do
429
+ Band.where(name: "Depeche Mode").tap do |crit|
430
+ crit.documents = [ depeche ]
433
431
  end
432
+ end
434
433
 
435
- it "returns the distinct field values" do
436
- expect(context.distinct(:street)).to eq([ "hobrecht" ])
437
- end
434
+ it "returns the distinct matching fields" do
435
+ expect(context.distinct(:name)).to eq([ "Depeche Mode" ])
438
436
  end
437
+ end
439
438
 
440
- context "when not limiting the result set" do
439
+ context "when not limiting the result set" do
441
440
 
442
- let(:criteria) do
443
- Address.all.tap do |crit|
444
- crit.documents = [ hobrecht, friedel, friedel ]
445
- end
446
- end
441
+ it "returns the distinct field values" do
442
+ expect(context.distinct(:name).sort).to eq([ "10,000 Maniacs", "Depeche Mode", "New Order" ].sort)
443
+ end
444
+ end
447
445
 
448
- let(:context) do
449
- described_class.new(criteria)
450
- end
446
+ context "when providing an aliased field" do
451
447
 
452
- it "returns the distinct field values" do
453
- expect(context.distinct(:street)).to eq([ "hobrecht", "friedel" ])
454
- end
448
+ it "returns the distinct field values" do
449
+ expect(context.distinct(:years).sort).to eq([ 20, 25, 30 ])
455
450
  end
451
+ end
456
452
 
457
- context 'when there is a collation on the criteria' do
458
-
459
- let(:criteria) do
460
- Address.where(street: "hobrecht").tap do |crit|
461
- crit.documents = [ hobrecht, hobrecht, friedel ]
462
- end.collation(locale: 'en_US', strength: 2)
463
- end
453
+ context "when providing a demongoizable field" do
464
454
 
465
- it "raises an exception" do
466
- expect {
467
- context.distinct(:street)
468
- }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
469
- end
455
+ it "returns the non-demongoized distinct field values" do
456
+ expect(context.distinct(:sales).sort).to eq([ BigDecimal("1E2"), BigDecimal("2E3") ])
470
457
  end
471
458
  end
472
459
 
473
- context "when legacy_pluck_distinct is false" do
474
- config_override :legacy_pluck_distinct, false
460
+ context "when getting a localized field" do
461
+ with_default_i18n_configs
475
462
 
476
- let(:depeche) { Band.create!(name: "Depeche Mode", years: 30, sales: "1E2") }
477
- let(:new_order) { Band.create!(name: "New Order", years: 25, sales: "2E3") }
478
- let(:maniacs) { Band.create!(name: "10,000 Maniacs", years: 20, sales: "1E2") }
463
+ before do
464
+ I18n.locale = :en
465
+ d = Dictionary.create!(description: 'english-text')
466
+ I18n.locale = :de
467
+ d.description = 'deutsch-text'
468
+ d.save!
469
+ end
479
470
 
480
471
  let(:criteria) do
481
- Band.all.tap do |crit|
482
- crit.documents = [ depeche, new_order, maniacs ]
472
+ Dictionary.all.tap do |crit|
473
+ crit.documents = [ Dictionary.first ]
483
474
  end
484
475
  end
485
476
 
486
- let(:context) do
487
- described_class.new(criteria)
477
+ context "when getting the field without _translations" do
478
+ it "gets the demongoized localized field" do
479
+ expect(context.distinct(:description)).to eq([ 'deutsch-text' ])
480
+ end
488
481
  end
489
482
 
490
- context "when limiting the result set" do
491
-
492
- let(:criteria) do
493
- Band.where(name: "Depeche Mode").tap do |crit|
494
- crit.documents = [ depeche ]
495
- end
496
- end
483
+ context "when getting the field with _translations" do
497
484
 
498
- it "returns the distinct matching fields" do
499
- expect(context.distinct(:name)).to eq([ "Depeche Mode" ])
485
+ it "gets the full hash" do
486
+ expect(context.distinct(:description_translations)).to eq([ { "de" => "deutsch-text", "en" => "english-text" } ])
500
487
  end
501
488
  end
502
489
 
503
- context "when not limiting the result set" do
490
+ context 'when plucking a specific locale' do
504
491
 
505
- it "returns the distinct field values" do
506
- expect(context.distinct(:name).sort).to eq([ "10,000 Maniacs", "Depeche Mode", "New Order" ].sort)
492
+ let(:distinct) do
493
+ context.distinct(:'description.de')
507
494
  end
508
- end
509
495
 
510
- context "when providing an aliased field" do
511
-
512
- it "returns the distinct field values" do
513
- expect(context.distinct(:years).sort).to eq([ 20, 25, 30 ])
496
+ it 'returns the specific translation' do
497
+ expect(distinct).to eq([ "deutsch-text" ])
514
498
  end
515
499
  end
516
500
 
517
- context "when providing a demongoizable field" do
501
+ context 'when plucking a specific locale from _translations field' do
502
+
503
+ let(:distinct) do
504
+ context.distinct(:'description_translations.de')
505
+ end
518
506
 
519
- it "returns the non-demongoized distinct field values" do
520
- expect(context.distinct(:sales).sort).to eq([ BigDecimal("1E2"), BigDecimal("2E3") ])
507
+ it 'returns the specific translations' do
508
+ expect(distinct).to eq(['deutsch-text'])
521
509
  end
522
510
  end
523
511
 
524
- context "when getting a localized field" do
512
+ context 'when fallbacks are enabled with a locale list' do
513
+ require_fallbacks
525
514
  with_default_i18n_configs
526
515
 
527
516
  before do
528
- I18n.locale = :en
529
- d = Dictionary.create!(description: 'english-text')
530
- I18n.locale = :de
531
- d.description = 'deutsch-text'
532
- d.save!
533
- end
534
-
535
- let(:criteria) do
536
- Dictionary.all.tap do |crit|
537
- crit.documents = [ Dictionary.first ]
538
- end
517
+ I18n.fallbacks[:he] = [ :en ]
539
518
  end
540
519
 
541
- context "when getting the field without _translations" do
542
- it "gets the demongoized localized field" do
543
- expect(context.distinct(:description)).to eq([ 'deutsch-text' ])
544
- end
520
+ let(:distinct) do
521
+ context.distinct(:description).first
545
522
  end
546
523
 
547
- context "when getting the field with _translations" do
548
-
549
- it "gets the full hash" do
550
- expect(context.distinct(:description_translations)).to eq([ { "de" => "deutsch-text", "en" => "english-text" } ])
551
- end
524
+ it "correctly uses the fallback" do
525
+ I18n.locale = :en
526
+ Dictionary.create!(description: 'english-text')
527
+ I18n.locale = :he
528
+ distinct.should == "english-text"
552
529
  end
530
+ end
553
531
 
554
- context 'when plucking a specific locale' do
532
+ context "when the localized field is embedded" do
533
+ with_default_i18n_configs
555
534
 
556
- let(:distinct) do
557
- context.distinct(:'description.de')
558
- end
535
+ let(:person) do
536
+ p = Passport.new
537
+ I18n.locale = :en
538
+ p.name = "Neil"
539
+ I18n.locale = :he
540
+ p.name = "Nissim"
559
541
 
560
- it 'returns the specific translation' do
561
- expect(distinct).to eq([ "deutsch-text" ])
562
- end
542
+ Person.create!(passport: p, employer_id: 12345)
563
543
  end
564
544
 
565
- context 'when plucking a specific locale from _translations field' do
566
-
567
- let(:distinct) do
568
- context.distinct(:'description_translations.de')
569
- end
570
-
571
- it 'returns the specific translations' do
572
- expect(distinct).to eq(['deutsch-text'])
545
+ let(:criteria) do
546
+ Person.where(employer_id: 12345).tap do |crit|
547
+ crit.documents = [ person ]
573
548
  end
574
549
  end
575
550
 
576
- context 'when fallbacks are enabled with a locale list' do
577
- require_fallbacks
578
- with_default_i18n_configs
579
-
580
- before do
581
- I18n.fallbacks[:he] = [ :en ]
582
- end
583
-
584
- let(:distinct) do
585
- context.distinct(:description).first
586
- end
587
-
588
- it "correctly uses the fallback" do
589
- I18n.locale = :en
590
- Dictionary.create!(description: 'english-text')
591
- I18n.locale = :he
592
- distinct.should == "english-text"
593
- end
551
+ let(:distinct) do
552
+ context.distinct("pass.name").first
594
553
  end
595
554
 
596
- context "when the localized field is embedded" do
597
- with_default_i18n_configs
598
-
599
- let(:person) do
600
- p = Passport.new
601
- I18n.locale = :en
602
- p.name = "Neil"
603
- I18n.locale = :he
604
- p.name = "Nissim"
605
-
606
- Person.create!(passport: p, employer_id: 12345)
607
- end
608
-
609
- let(:criteria) do
610
- Person.where(employer_id: 12345).tap do |crit|
611
- crit.documents = [ person ]
612
- end
613
- end
614
-
615
- let(:distinct) do
616
- context.distinct("pass.name").first
617
- end
618
-
619
- let(:distinct_translations) do
620
- context.distinct("pass.name_translations").first
621
- end
622
-
623
- let(:distinct_translations_field) do
624
- context.distinct("pass.name_translations.en").first
625
- end
626
-
627
- it "returns the translation for the current locale" do
628
- expect(distinct).to eq("Nissim")
629
- end
630
-
631
- it "returns the full _translation hash" do
632
- expect(distinct_translations).to eq({ "en" => "Neil", "he" => "Nissim" })
633
- end
555
+ let(:distinct_translations) do
556
+ context.distinct("pass.name_translations").first
557
+ end
634
558
 
635
- it "returns the translation for the requested locale" do
636
- expect(distinct_translations_field).to eq("Neil")
637
- end
559
+ let(:distinct_translations_field) do
560
+ context.distinct("pass.name_translations.en").first
638
561
  end
639
- end
640
562
 
641
- context "when getting an embedded field" do
563
+ it "returns the translation for the current locale" do
564
+ expect(distinct).to eq("Nissim")
565
+ end
642
566
 
643
- let(:label) { Label.new(sales: "1E2") }
644
- let!(:band) { Band.create!(label: label) }
645
- let(:criteria) do
646
- Band.where(_id: band.id).tap do |crit|
647
- crit.documents = [ band ]
648
- end
567
+ it "returns the full _translation hash" do
568
+ expect(distinct_translations).to eq({ "en" => "Neil", "he" => "Nissim" })
649
569
  end
650
570
 
651
- it "returns the distinct matching fields" do
652
- expect(context.distinct("label.sales")).to eq([ BigDecimal("1E2") ])
571
+ it "returns the translation for the requested locale" do
572
+ expect(distinct_translations_field).to eq("Neil")
653
573
  end
654
574
  end
655
575
  end
656
576
 
657
- context 'when the field name is a method name' do
658
- let!(:person) do
659
- Person.create!(ssn: 'secret-ssn')
660
- end
661
-
662
- let!(:address) do
663
- person.addresses.create!(street: 'hobrecht')
664
- end
577
+ context "when getting an embedded field" do
665
578
 
579
+ let(:label) { Label.new(sales: "1E2") }
580
+ let!(:band) { Band.create!(label: label) }
666
581
  let(:criteria) do
667
- Address.all.tap do |crit|
668
- crit.documents = [ address ]
582
+ Band.where(_id: band.id).tap do |crit|
583
+ crit.documents = [ band ]
669
584
  end
670
585
  end
671
586
 
672
- it 'does not call the method' do
673
- expect(address).not_to receive(:destroy)
674
- expect(context.distinct(:destroy)).to eq([ nil ])
587
+ it "returns the distinct matching fields" do
588
+ expect(context.distinct("label.sales")).to eq([ BigDecimal("1E2") ])
675
589
  end
676
590
  end
677
591
  end
@@ -1513,618 +1427,403 @@ describe Mongoid::Contextual::Memory do
1513
1427
  described_class.new(criteria)
1514
1428
  end
1515
1429
 
1516
- context "when legacy_pluck_distinct is true" do
1517
- config_override :legacy_pluck_distinct, true
1518
-
1519
- let(:hobrecht) do
1520
- Address.new(street: "hobrecht", number: 213)
1521
- end
1522
-
1523
- let(:friedel) do
1524
- Address.new(street: "friedel", number: 11)
1525
- end
1430
+ let!(:depeche) do
1431
+ Band.create!(name: "Depeche Mode", likes: 3)
1432
+ end
1526
1433
 
1527
- let(:criteria) do
1528
- Address.all.tap do |crit|
1529
- crit.documents = [ hobrecht, friedel ]
1530
- end
1531
- end
1434
+ let!(:tool) do
1435
+ Band.create!(name: "Tool", likes: 3)
1436
+ end
1532
1437
 
1533
- context "when plucking" do
1438
+ let!(:photek) do
1439
+ Band.create!(name: "Photek", likes: 1)
1440
+ end
1534
1441
 
1535
- let!(:plucked) do
1536
- context.pluck(:street)
1537
- end
1442
+ let!(:maniacs) do
1443
+ Band.create!(name: "10,000 Maniacs", likes: 1, sales: "1E2")
1444
+ end
1538
1445
 
1539
- it "returns the values" do
1540
- expect(plucked).to eq([ "hobrecht", "friedel" ])
1541
- end
1446
+ let(:criteria) do
1447
+ Band.all.tap do |crit|
1448
+ crit.documents = [ depeche, tool, photek, maniacs ]
1542
1449
  end
1450
+ end
1543
1451
 
1544
- context "when plucking multiple fields" do
1545
-
1546
- let!(:plucked) do
1547
- context.pluck(:street, :number)
1548
- end
1452
+ context "when the field is aliased" do
1549
1453
 
1550
- it "returns the values as an array" do
1551
- expect(plucked).to eq([ ["hobrecht", 213], ["friedel", 11] ])
1552
- end
1454
+ let!(:expensive) do
1455
+ Product.create!(price: 100000)
1553
1456
  end
1554
1457
 
1555
- context "when plucking a mix of empty and non-empty values" do
1556
-
1557
- let(:empty_doc) do
1558
- Address.new(street: nil)
1559
- end
1560
-
1561
- let(:criteria) do
1562
- Address.all.tap do |crit|
1563
- crit.documents = [ hobrecht, friedel, empty_doc ]
1564
- end
1565
- end
1566
-
1567
- let!(:plucked) do
1568
- context.pluck(:street)
1569
- end
1570
-
1571
- it "returns the values" do
1572
- expect(plucked).to eq([ "hobrecht", "friedel", nil ])
1573
- end
1458
+ let!(:cheap) do
1459
+ Product.create!(price: 1)
1574
1460
  end
1575
1461
 
1576
- context "when plucking a field that doesnt exist" do
1577
-
1578
- context "when pluck one field" do
1579
-
1580
- let(:plucked) do
1581
- context.pluck(:foo)
1582
- end
1583
-
1584
- it "returns an empty array" do
1585
- expect(plucked).to eq([nil, nil])
1586
- end
1587
- end
1588
-
1589
- context "when pluck multiple fields" do
1590
-
1591
- let(:plucked) do
1592
- context.pluck(:foo, :bar)
1593
- end
1594
-
1595
- it "returns an empty array" do
1596
- expect(plucked).to eq([[nil, nil], [nil, nil]])
1597
- end
1462
+ let(:criteria) do
1463
+ Product.all.tap do |crit|
1464
+ crit.documents = [ expensive, cheap ]
1598
1465
  end
1599
1466
  end
1600
1467
 
1601
- context 'when there is a collation on the criteria' do
1468
+ context "when using alias_attribute" do
1602
1469
 
1603
- let(:criteria) do
1604
- Address.all.tap do |crit|
1605
- crit.documents = [ hobrecht, friedel ]
1606
- end.collation(locale: 'en_US', strength: 2)
1470
+ let(:plucked) do
1471
+ context.pluck(:price)
1607
1472
  end
1608
1473
 
1609
- it "raises an exception" do
1610
- expect {
1611
- context.pluck(:foo, :bar)
1612
- }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
1474
+ it "uses the aliases" do
1475
+ expect(plucked).to eq([ 100000, 1 ])
1613
1476
  end
1614
1477
  end
1615
1478
  end
1616
1479
 
1617
- context "when legacy_pluck_distinct is false" do
1618
- config_override :legacy_pluck_distinct, false
1619
-
1620
- let!(:depeche) do
1621
- Band.create!(name: "Depeche Mode", likes: 3)
1622
- end
1623
-
1624
- let!(:tool) do
1625
- Band.create!(name: "Tool", likes: 3)
1626
- end
1627
-
1628
- let!(:photek) do
1629
- Band.create!(name: "Photek", likes: 1)
1630
- end
1480
+ context "when the criteria matches" do
1631
1481
 
1632
- let!(:maniacs) do
1633
- Band.create!(name: "10,000 Maniacs", likes: 1, sales: "1E2")
1634
- end
1482
+ context "when there are no duplicate values" do
1635
1483
 
1636
- let(:criteria) do
1637
- Band.all.tap do |crit|
1638
- crit.documents = [ depeche, tool, photek, maniacs ]
1484
+ let!(:plucked) do
1485
+ context.pluck(:name)
1639
1486
  end
1640
- end
1641
1487
 
1642
- context "when the field is aliased" do
1643
-
1644
- let!(:expensive) do
1645
- Product.create!(price: 100000)
1488
+ it "returns the values" do
1489
+ expect(plucked).to contain_exactly("10,000 Maniacs", "Depeche Mode", "Tool", "Photek")
1646
1490
  end
1647
1491
 
1648
- let!(:cheap) do
1649
- Product.create!(price: 1)
1650
- end
1492
+ context "when subsequently executing the criteria without a pluck" do
1651
1493
 
1652
- let(:criteria) do
1653
- Product.all.tap do |crit|
1654
- crit.documents = [ expensive, cheap ]
1494
+ it "does not limit the fields" do
1495
+ expect(context.first.likes).to eq(3)
1655
1496
  end
1656
1497
  end
1657
1498
 
1658
- context "when using alias_attribute" do
1659
-
1660
- let(:plucked) do
1661
- context.pluck(:price)
1662
- end
1499
+ context 'when the field is a subdocument' do
1663
1500
 
1664
- it "uses the aliases" do
1665
- expect(plucked).to eq([ 100000, 1 ])
1666
- end
1667
- end
1668
- end
1669
-
1670
- context "when the criteria matches" do
1671
-
1672
- context "when there are no duplicate values" do
1673
-
1674
- let!(:plucked) do
1675
- context.pluck(:name)
1676
- end
1501
+ context 'when a top-level field and a subdocument field are plucked' do
1502
+ let(:criteria) do
1503
+ Band.where(name: 'FKA Twigs').tap do |crit|
1504
+ crit.documents = [
1505
+ Band.create!(name: 'FKA Twigs'),
1506
+ Band.create!(name: 'FKA Twigs', records: [ Record.new(name: 'LP1') ])
1507
+ ]
1508
+ end
1509
+ end
1677
1510
 
1678
- it "returns the values" do
1679
- expect(plucked).to contain_exactly("10,000 Maniacs", "Depeche Mode", "Tool", "Photek")
1680
- end
1511
+ let(:embedded_pluck) do
1512
+ context.pluck(:name, 'records.name')
1513
+ end
1681
1514
 
1682
- context "when subsequently executing the criteria without a pluck" do
1515
+ let(:expected) do
1516
+ [
1517
+ ["FKA Twigs", []],
1518
+ ['FKA Twigs', ["LP1"]]
1519
+ ]
1520
+ end
1683
1521
 
1684
- it "does not limit the fields" do
1685
- expect(context.first.likes).to eq(3)
1522
+ it 'returns the list of top-level field and subdocument values' do
1523
+ expect(embedded_pluck).to eq(expected)
1686
1524
  end
1687
1525
  end
1688
1526
 
1689
- context 'when the field is a subdocument' do
1527
+ context 'when only a subdocument field is plucked' do
1690
1528
 
1691
- context 'when a top-level field and a subdocument field are plucked' do
1692
- let(:criteria) do
1693
- Band.where(name: 'FKA Twigs').tap do |crit|
1694
- crit.documents = [
1695
- Band.create!(name: 'FKA Twigs'),
1696
- Band.create!(name: 'FKA Twigs', records: [ Record.new(name: 'LP1') ])
1697
- ]
1698
- end
1699
- end
1700
-
1701
- let(:embedded_pluck) do
1702
- context.pluck(:name, 'records.name')
1703
- end
1704
-
1705
- let(:expected) do
1706
- [
1707
- ["FKA Twigs", []],
1708
- ['FKA Twigs', ["LP1"]]
1529
+ let(:criteria) do
1530
+ Band.where(name: 'FKA Twigs').tap do |crit|
1531
+ crit.documents = [
1532
+ Band.create!(name: 'FKA Twigs'),
1533
+ Band.create!(name: 'FKA Twigs', records: [ Record.new(name: 'LP1') ])
1709
1534
  ]
1710
1535
  end
1711
-
1712
- it 'returns the list of top-level field and subdocument values' do
1713
- expect(embedded_pluck).to eq(expected)
1714
- end
1715
1536
  end
1716
1537
 
1717
- context 'when only a subdocument field is plucked' do
1718
-
1719
- let(:criteria) do
1720
- Band.where(name: 'FKA Twigs').tap do |crit|
1721
- crit.documents = [
1722
- Band.create!(name: 'FKA Twigs'),
1723
- Band.create!(name: 'FKA Twigs', records: [ Record.new(name: 'LP1') ])
1724
- ]
1725
- end
1726
- end
1727
-
1728
- let(:embedded_pluck) do
1729
- context.pluck('records.name')
1730
- end
1538
+ let(:embedded_pluck) do
1539
+ context.pluck('records.name')
1540
+ end
1731
1541
 
1732
- let(:expected) do
1733
- [
1734
- [],
1735
- ["LP1"]
1736
- ]
1737
- end
1542
+ let(:expected) do
1543
+ [
1544
+ [],
1545
+ ["LP1"]
1546
+ ]
1547
+ end
1738
1548
 
1739
- it 'returns the list of subdocument values' do
1740
- expect(embedded_pluck).to eq(expected)
1741
- end
1549
+ it 'returns the list of subdocument values' do
1550
+ expect(embedded_pluck).to eq(expected)
1742
1551
  end
1743
1552
  end
1744
1553
  end
1554
+ end
1745
1555
 
1746
- context "when plucking multi-fields" do
1747
-
1748
- let(:plucked) do
1749
- context.pluck(:name, :likes)
1750
- end
1556
+ context "when plucking multi-fields" do
1751
1557
 
1752
- it "returns the values" do
1753
- expect(plucked).to contain_exactly(["10,000 Maniacs", 1], ["Depeche Mode", 3], ["Tool", 3], ["Photek", 1])
1754
- end
1558
+ let(:plucked) do
1559
+ context.pluck(:name, :likes)
1755
1560
  end
1756
1561
 
1757
- context "when there are duplicate values" do
1758
-
1759
- let(:plucked) do
1760
- context.pluck(:likes)
1761
- end
1762
-
1763
- it "returns the duplicates" do
1764
- expect(plucked).to contain_exactly(1, 3, 3, 1)
1765
- end
1562
+ it "returns the values" do
1563
+ expect(plucked).to contain_exactly(["10,000 Maniacs", 1], ["Depeche Mode", 3], ["Tool", 3], ["Photek", 1])
1766
1564
  end
1767
1565
  end
1768
1566
 
1769
- context "when plucking an aliased field" do
1567
+ context "when there are duplicate values" do
1770
1568
 
1771
1569
  let(:plucked) do
1772
- context.pluck(:id)
1570
+ context.pluck(:likes)
1773
1571
  end
1774
1572
 
1775
- it "returns the field values" do
1776
- expect(plucked).to eq([ depeche.id, tool.id, photek.id, maniacs.id ])
1573
+ it "returns the duplicates" do
1574
+ expect(plucked).to contain_exactly(1, 3, 3, 1)
1777
1575
  end
1778
1576
  end
1577
+ end
1779
1578
 
1780
- context "when plucking existent and non-existent fields" do
1579
+ context "when plucking an aliased field" do
1781
1580
 
1782
- let(:plucked) do
1783
- context.pluck(:id, :fooz)
1784
- end
1581
+ let(:plucked) do
1582
+ context.pluck(:id)
1583
+ end
1785
1584
 
1786
- it "returns nil for the field that doesnt exist" do
1787
- expect(plucked).to eq([[depeche.id, nil], [tool.id, nil], [photek.id, nil], [maniacs.id, nil] ])
1788
- end
1585
+ it "returns the field values" do
1586
+ expect(plucked).to eq([ depeche.id, tool.id, photek.id, maniacs.id ])
1789
1587
  end
1588
+ end
1790
1589
 
1791
- context "when plucking a field that doesnt exist" do
1590
+ context "when plucking existent and non-existent fields" do
1792
1591
 
1793
- context "when pluck one field" do
1592
+ let(:plucked) do
1593
+ context.pluck(:id, :fooz)
1594
+ end
1794
1595
 
1795
- let(:plucked) do
1796
- context.pluck(:foo)
1797
- end
1596
+ it "returns nil for the field that doesnt exist" do
1597
+ expect(plucked).to eq([[depeche.id, nil], [tool.id, nil], [photek.id, nil], [maniacs.id, nil] ])
1598
+ end
1599
+ end
1798
1600
 
1799
- it "returns an array with nil values" do
1800
- expect(plucked).to eq([nil, nil, nil, nil])
1801
- end
1802
- end
1601
+ context "when plucking a field that doesnt exist" do
1803
1602
 
1804
- context "when pluck multiple fields" do
1603
+ context "when pluck one field" do
1805
1604
 
1806
- let(:plucked) do
1807
- context.pluck(:foo, :bar)
1808
- end
1605
+ let(:plucked) do
1606
+ context.pluck(:foo)
1607
+ end
1809
1608
 
1810
- it "returns an array of arrays with nil values" do
1811
- expect(plucked).to eq([[nil, nil], [nil, nil], [nil, nil], [nil, nil]])
1812
- end
1609
+ it "returns an array with nil values" do
1610
+ expect(plucked).to eq([nil, nil, nil, nil])
1813
1611
  end
1814
1612
  end
1815
1613
 
1816
- context 'when plucking a localized field' do
1817
- with_default_i18n_configs
1614
+ context "when pluck multiple fields" do
1818
1615
 
1819
- before do
1820
- I18n.locale = :en
1821
- d = Dictionary.create!(description: 'english-text')
1822
- I18n.locale = :de
1823
- d.description = 'deutsch-text'
1824
- d.save!
1616
+ let(:plucked) do
1617
+ context.pluck(:foo, :bar)
1825
1618
  end
1826
1619
 
1827
- let(:criteria) do
1828
- Dictionary.all.tap do |crit|
1829
- crit.documents = [ Dictionary.first ]
1830
- end
1620
+ it "returns an array of arrays with nil values" do
1621
+ expect(plucked).to eq([[nil, nil], [nil, nil], [nil, nil], [nil, nil]])
1831
1622
  end
1623
+ end
1624
+ end
1832
1625
 
1833
- context 'when plucking the entire field' do
1834
-
1835
- let(:plucked) do
1836
- context.pluck(:description)
1837
- end
1838
-
1839
- let(:plucked_translations) do
1840
- context.pluck(:description_translations)
1841
- end
1842
-
1843
- let(:plucked_translations_both) do
1844
- context.pluck(:description_translations, :description)
1845
- end
1846
-
1847
- it 'returns the demongoized translations' do
1848
- expect(plucked.first).to eq('deutsch-text')
1849
- end
1626
+ context 'when plucking a localized field' do
1627
+ with_default_i18n_configs
1850
1628
 
1851
- it 'returns the full translations hash to _translations' do
1852
- expect(plucked_translations.first).to eq({"de"=>"deutsch-text", "en"=>"english-text"})
1853
- end
1629
+ before do
1630
+ I18n.locale = :en
1631
+ d = Dictionary.create!(description: 'english-text')
1632
+ I18n.locale = :de
1633
+ d.description = 'deutsch-text'
1634
+ d.save!
1635
+ end
1854
1636
 
1855
- it 'returns both' do
1856
- expect(plucked_translations_both.first).to eq([{"de"=>"deutsch-text", "en"=>"english-text"}, "deutsch-text"])
1857
- end
1637
+ let(:criteria) do
1638
+ Dictionary.all.tap do |crit|
1639
+ crit.documents = [ Dictionary.first ]
1858
1640
  end
1641
+ end
1859
1642
 
1860
- context 'when plucking a specific locale' do
1861
-
1862
- let(:plucked) do
1863
- context.pluck(:'description.de')
1864
- end
1643
+ context 'when plucking the entire field' do
1865
1644
 
1866
- it 'returns the specific translations' do
1867
- expect(plucked.first).to eq('deutsch-text')
1868
- end
1645
+ let(:plucked) do
1646
+ context.pluck(:description)
1869
1647
  end
1870
1648
 
1871
- context 'when plucking a specific locale from _translations field' do
1872
-
1873
- let(:plucked) do
1874
- context.pluck(:'description_translations.de')
1875
- end
1876
-
1877
- it 'returns the specific translations' do
1878
- expect(plucked.first).to eq('deutsch-text')
1879
- end
1649
+ let(:plucked_translations) do
1650
+ context.pluck(:description_translations)
1880
1651
  end
1881
1652
 
1882
- context 'when fallbacks are enabled with a locale list' do
1883
- require_fallbacks
1884
- with_default_i18n_configs
1885
-
1886
- before do
1887
- I18n.fallbacks[:he] = [ :en ]
1888
- end
1889
-
1890
- let(:plucked) do
1891
- context.pluck(:description).first
1892
- end
1893
-
1894
- it "correctly uses the fallback" do
1895
- I18n.locale = :en
1896
- Dictionary.create!(description: 'english-text')
1897
- I18n.locale = :he
1898
- plucked.should == "english-text"
1899
- end
1653
+ let(:plucked_translations_both) do
1654
+ context.pluck(:description_translations, :description)
1900
1655
  end
1901
1656
 
1902
- context "when the localized field is embedded" do
1903
- with_default_i18n_configs
1904
-
1905
- before do
1906
- p = Passport.new
1907
- I18n.locale = :en
1908
- p.name = "Neil"
1909
- I18n.locale = :he
1910
- p.name = "Nissim"
1911
-
1912
- Person.create!(passport: p, employer_id: 12345)
1913
- end
1914
-
1915
- let(:plucked) do
1916
- Person.where(employer_id: 12345).pluck("pass.name").first
1917
- end
1918
-
1919
- let(:plucked_translations) do
1920
- Person.where(employer_id: 12345).pluck("pass.name_translations").first
1921
- end
1922
-
1923
- let(:plucked_translations_field) do
1924
- Person.where(employer_id: 12345).pluck("pass.name_translations.en").first
1925
- end
1926
-
1927
- it "returns the translation for the current locale" do
1928
- expect(plucked).to eq("Nissim")
1929
- end
1657
+ it 'returns the demongoized translations' do
1658
+ expect(plucked.first).to eq('deutsch-text')
1659
+ end
1930
1660
 
1931
- it "returns the full _translation hash" do
1932
- expect(plucked_translations).to eq({ "en" => "Neil", "he" => "Nissim" })
1933
- end
1661
+ it 'returns the full translations hash to _translations' do
1662
+ expect(plucked_translations.first).to eq({"de"=>"deutsch-text", "en"=>"english-text"})
1663
+ end
1934
1664
 
1935
- it "returns the translation for the requested locale" do
1936
- expect(plucked_translations_field).to eq("Neil")
1937
- end
1665
+ it 'returns both' do
1666
+ expect(plucked_translations_both.first).to eq([{"de"=>"deutsch-text", "en"=>"english-text"}, "deutsch-text"])
1938
1667
  end
1939
1668
  end
1940
1669
 
1941
- context 'when plucking a field to be demongoized' do
1670
+ context 'when plucking a specific locale' do
1942
1671
 
1943
1672
  let(:plucked) do
1944
- Band.where(name: maniacs.name).pluck(:sales)
1673
+ context.pluck(:'description.de')
1945
1674
  end
1946
1675
 
1947
- with_config_values :map_big_decimal_to_decimal128, true, false do
1948
-
1949
- it "demongoizes the field" do
1950
- expect(plucked.first).to be_a(BigDecimal)
1951
- expect(plucked.first).to eq(BigDecimal("1E2"))
1952
- end
1676
+ it 'returns the specific translations' do
1677
+ expect(plucked.first).to eq('deutsch-text')
1953
1678
  end
1954
1679
  end
1955
1680
 
1956
- context "when plucking an embedded field" do
1957
- let(:label) { Label.new(sales: "1E2") }
1958
- let!(:band) { Band.create!(label: label) }
1681
+ context 'when plucking a specific locale from _translations field' do
1959
1682
 
1960
1683
  let(:plucked) do
1961
- Band.where(_id: band.id).tap do |crit|
1962
- crit.documents = [ band ]
1963
- end.pluck("label.sales")
1684
+ context.pluck(:'description_translations.de')
1964
1685
  end
1965
1686
 
1966
- it "demongoizes the field" do
1967
- expect(plucked).to eq([ BigDecimal("1E2") ])
1687
+ it 'returns the specific translations' do
1688
+ expect(plucked.first).to eq('deutsch-text')
1968
1689
  end
1969
1690
  end
1970
1691
 
1971
- context "when plucking an embeds_many field" do
1972
- let(:label) { Label.new(sales: "1E2") }
1973
- let!(:band) { Band.create!(labels: [label]) }
1974
-
1975
- let(:plucked) { Band.where(_id: band.id).pluck("labels.sales") }
1692
+ context 'when fallbacks are enabled with a locale list' do
1693
+ require_fallbacks
1694
+ with_default_i18n_configs
1976
1695
 
1977
- it "demongoizes the field" do
1978
- expect(plucked.first).to eq([ BigDecimal("1E2") ])
1696
+ before do
1697
+ I18n.fallbacks[:he] = [ :en ]
1979
1698
  end
1980
- end
1981
-
1982
- context "when plucking a nonexistent embedded field" do
1983
- let(:label) { Label.new(sales: "1E2") }
1984
- let!(:band) { Band.create!(label: label) }
1985
1699
 
1986
1700
  let(:plucked) do
1987
- Band.where(_id: band.id).tap do |crit|
1988
- crit.documents = [ band ]
1989
- end.pluck("label.qwerty")
1701
+ context.pluck(:description).first
1990
1702
  end
1991
1703
 
1992
- it "returns nil" do
1993
- expect(plucked.first).to eq(nil)
1704
+ it "correctly uses the fallback" do
1705
+ I18n.locale = :en
1706
+ Dictionary.create!(description: 'english-text')
1707
+ I18n.locale = :he
1708
+ plucked.should == "english-text"
1994
1709
  end
1995
1710
  end
1996
1711
 
1997
- context "when plucking deeply nested arrays/embedded associations" do
1712
+ context "when the localized field is embedded" do
1713
+ with_default_i18n_configs
1998
1714
 
1999
- let(:criteria) do
2000
- Person.all.tap do |crit|
2001
- crit.documents = [
2002
- Person.create!(addresses: [ Address.new(code: Code.new(deepest: Deepest.new(array: [ { y: { z: 1 } }, { y: { z: 2 } } ]))) ]),
2003
- Person.create!(addresses: [ Address.new(code: Code.new(deepest: Deepest.new(array: [ { y: { z: 1 } }, { y: { z: 2 } } ]))) ]),
2004
- Person.create!(addresses: [ Address.new(code: Code.new(deepest: Deepest.new(array: [ { y: { z: 1 } }, { y: { z: 3 } } ]))) ]),
2005
- ]
2006
- end
1715
+ before do
1716
+ p = Passport.new
1717
+ I18n.locale = :en
1718
+ p.name = "Neil"
1719
+ I18n.locale = :he
1720
+ p.name = "Nissim"
1721
+
1722
+ Person.create!(passport: p, employer_id: 12345)
2007
1723
  end
2008
1724
 
2009
1725
  let(:plucked) do
2010
- context.pluck("addresses.code.deepest.array.y.z")
1726
+ Person.where(employer_id: 12345).pluck("pass.name").first
2011
1727
  end
2012
1728
 
2013
- it "returns the correct hash" do
2014
- expect(plucked).to eq([
2015
- [ [ 1, 2 ] ], [ [ 1, 2 ] ], [ [ 1, 3 ] ]
2016
- ])
1729
+ let(:plucked_translations) do
1730
+ Person.where(employer_id: 12345).pluck("pass.name_translations").first
2017
1731
  end
2018
- end
2019
- end
2020
1732
 
2021
- context 'when plucking a dynamic attribute' do
2022
- let(:criteria) do
2023
- Band.all.tap do |crit|
2024
- crit.documents = [ Band.create!(name: 'Depeche Mode', mood: 'dark') ]
1733
+ let(:plucked_translations_field) do
1734
+ Person.where(employer_id: 12345).pluck("pass.name_translations.en").first
2025
1735
  end
2026
- end
2027
-
2028
- it 'returns the value from the attributes' do
2029
- expect(context.pluck(:mood)).to eq([ 'dark' ])
2030
- end
2031
- end
2032
1736
 
2033
- context 'when the field name is a method name' do
2034
- let!(:person) do
2035
- Person.create!(ssn: 'secret-ssn')
2036
- end
1737
+ it "returns the translation for the current locale" do
1738
+ expect(plucked).to eq("Nissim")
1739
+ end
2037
1740
 
2038
- let!(:address) do
2039
- person.addresses.create!(street: 'hobrecht')
2040
- end
1741
+ it "returns the full _translation hash" do
1742
+ expect(plucked_translations).to eq({ "en" => "Neil", "he" => "Nissim" })
1743
+ end
2041
1744
 
2042
- let(:criteria) do
2043
- Address.all.tap do |crit|
2044
- crit.documents = [ address ]
1745
+ it "returns the translation for the requested locale" do
1746
+ expect(plucked_translations_field).to eq("Neil")
2045
1747
  end
2046
1748
  end
1749
+ end
2047
1750
 
2048
- it 'does not call the method' do
2049
- expect(address).not_to receive(:destroy)
2050
- expect(context.pluck(:destroy)).to eq([ nil ])
2051
- end
1751
+ context 'when plucking a field to be demongoized' do
2052
1752
 
2053
- it 'does not return the attributes hash' do
2054
- expect(context.pluck(:attributes)).to eq([ nil ])
1753
+ let(:plucked) do
1754
+ Band.where(name: maniacs.name).pluck(:sales)
2055
1755
  end
2056
1756
 
2057
- it 'does not traverse to the parent document' do
2058
- expect(context.pluck('_root.ssn')).to eq([ nil ])
2059
- end
1757
+ with_config_values :map_big_decimal_to_decimal128, true, false do
2060
1758
 
2061
- it 'does not destroy the parent document' do
2062
- expect(context.pluck('_root.destroy')).to eq([ nil ])
2063
- expect(Person.where(_id: person.id).count).to eq(1)
1759
+ it "demongoizes the field" do
1760
+ expect(plucked.first).to be_a(BigDecimal)
1761
+ expect(plucked.first).to eq(BigDecimal("1E2"))
1762
+ end
2064
1763
  end
2065
1764
  end
2066
1765
 
2067
- context 'when plucking a belongs_to association' do
2068
- let!(:band) do
2069
- Band.create!(name: 'Depeche Mode')
2070
- end
1766
+ context "when plucking an embedded field" do
1767
+ let(:label) { Label.new(sales: "1E2") }
1768
+ let!(:band) { Band.create!(label: label) }
2071
1769
 
2072
- let!(:artist) do
2073
- Artist.create!(band: band)
1770
+ let(:plucked) do
1771
+ Band.where(_id: band.id).tap do |crit|
1772
+ crit.documents = [ band ]
1773
+ end.pluck("label.sales")
2074
1774
  end
2075
1775
 
2076
- let(:criteria) do
2077
- Artist.all.tap do |crit|
2078
- crit.documents = [ artist ]
2079
- end
1776
+ it "demongoizes the field" do
1777
+ expect(plucked).to eq([ BigDecimal("1E2") ])
2080
1778
  end
1779
+ end
2081
1780
 
2082
- it 'traverses to the associated document' do
2083
- expect(context.pluck('band.name')).to eq([ 'Depeche Mode' ])
2084
- end
1781
+ context "when plucking an embeds_many field" do
1782
+ let(:label) { Label.new(sales: "1E2") }
1783
+ let!(:band) { Band.create!(labels: [label]) }
2085
1784
 
2086
- it 'returns the document for the association name' do
2087
- expect(context.pluck(:band)).to eq([ band ])
2088
- end
1785
+ let(:plucked) { Band.where(_id: band.id).pluck("labels.sales") }
2089
1786
 
2090
- it 'returns the id for the foreign key' do
2091
- expect(context.pluck(:band_id)).to eq([ band.id ])
1787
+ it "demongoizes the field" do
1788
+ expect(plucked.first).to eq([ BigDecimal("1E2") ])
2092
1789
  end
2093
1790
  end
2094
1791
 
2095
- context 'when plucking the foreign key of a many to many association' do
2096
- let!(:preference) do
2097
- Preference.create!(name: 'nature')
2098
- end
2099
-
2100
- let!(:person) do
2101
- Person.create!(preferences: [ preference ])
2102
- end
1792
+ context "when plucking a nonexistent embedded field" do
1793
+ let(:label) { Label.new(sales: "1E2") }
1794
+ let!(:band) { Band.create!(label: label) }
2103
1795
 
2104
- let(:criteria) do
2105
- Person.all.tap do |crit|
2106
- crit.documents = [ person ]
2107
- end
1796
+ let(:plucked) do
1797
+ Band.where(_id: band.id).tap do |crit|
1798
+ crit.documents = [ band ]
1799
+ end.pluck("label.qwerty")
2108
1800
  end
2109
1801
 
2110
- it 'returns the stored ids' do
2111
- expect(context.pluck(:preference_ids)).to eq([ [ preference.id ] ])
1802
+ it "returns nil" do
1803
+ expect(plucked.first).to eq(nil)
2112
1804
  end
2113
1805
  end
2114
1806
 
2115
- context 'when the field path has an empty segment' do
2116
- let!(:band) do
2117
- Band.create!(name: 'Depeche Mode', label: Label.new(name: 'Mute'))
2118
- end
1807
+ context "when plucking deeply nested arrays/embedded associations" do
2119
1808
 
2120
1809
  let(:criteria) do
2121
- Band.all.tap do |crit|
2122
- crit.documents = [ band ]
1810
+ Person.all.tap do |crit|
1811
+ crit.documents = [
1812
+ Person.create!(addresses: [ Address.new(code: Code.new(deepest: Deepest.new(array: [ { y: { z: 1 } }, { y: { z: 2 } } ]))) ]),
1813
+ Person.create!(addresses: [ Address.new(code: Code.new(deepest: Deepest.new(array: [ { y: { z: 1 } }, { y: { z: 2 } } ]))) ]),
1814
+ Person.create!(addresses: [ Address.new(code: Code.new(deepest: Deepest.new(array: [ { y: { z: 1 } }, { y: { z: 3 } } ]))) ]),
1815
+ ]
2123
1816
  end
2124
1817
  end
2125
1818
 
2126
- it 'returns nil' do
2127
- expect(context.pluck('label..name')).to eq([ nil ])
1819
+ let(:plucked) do
1820
+ context.pluck("addresses.code.deepest.array.y.z")
1821
+ end
1822
+
1823
+ it "returns the correct hash" do
1824
+ expect(plucked).to eq([
1825
+ [ [ 1, 2 ] ], [ [ 1, 2 ] ], [ [ 1, 3 ] ]
1826
+ ])
2128
1827
  end
2129
1828
  end
2130
1829
  end
@@ -2187,27 +1886,6 @@ describe Mongoid::Contextual::Memory do
2187
1886
  expect(picked).to be_nil
2188
1887
  end
2189
1888
  end
2190
-
2191
- context 'when the field name is a method name' do
2192
- let!(:person) do
2193
- Person.create!(ssn: 'secret-ssn')
2194
- end
2195
-
2196
- let!(:address) do
2197
- person.addresses.create!(street: 'hobrecht')
2198
- end
2199
-
2200
- let(:criteria) do
2201
- Address.all.tap do |crit|
2202
- crit.documents = [ address ]
2203
- end
2204
- end
2205
-
2206
- it 'does not call the method' do
2207
- expect(address).not_to receive(:destroy)
2208
- expect(context.pick(:destroy)).to be_nil
2209
- end
2210
- end
2211
1889
  end
2212
1890
 
2213
1891
  describe "#tally" do
@@ -2662,31 +2340,6 @@ describe Mongoid::Contextual::Memory do
2662
2340
  )
2663
2341
  end
2664
2342
  end
2665
-
2666
- context 'when the field name is a method name' do
2667
- let!(:person) do
2668
- Person.create!(ssn: 'secret-ssn')
2669
- end
2670
-
2671
- let!(:address) do
2672
- person.addresses.create!(street: 'hobrecht')
2673
- end
2674
-
2675
- let(:criteria) do
2676
- Address.all.tap do |crit|
2677
- crit.documents = [ address ]
2678
- end
2679
- end
2680
-
2681
- it 'does not call the method' do
2682
- expect(address).not_to receive(:destroy)
2683
- expect(context.tally(:destroy)).to eq(nil => 1)
2684
- end
2685
-
2686
- it 'does not disclose the parent document fields' do
2687
- expect(context.tally('_root.ssn')).to eq(nil => 1)
2688
- end
2689
- end
2690
2343
  end
2691
2344
 
2692
2345
  describe '#inc' do