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