mongoid 7.3.5 → 7.5.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 (895) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +17 -17
  4. data/README.md +3 -3
  5. data/lib/config/locales/en.yml +28 -20
  6. data/lib/mongoid/association/accessors.rb +0 -27
  7. data/lib/mongoid/association/bindable.rb +0 -21
  8. data/lib/mongoid/association/builders.rb +0 -9
  9. data/lib/mongoid/association/constrainable.rb +0 -3
  10. data/lib/mongoid/association/depending.rb +0 -7
  11. data/lib/mongoid/association/eager_loadable.rb +0 -3
  12. data/lib/mongoid/association/embedded/batchable.rb +12 -59
  13. data/lib/mongoid/association/embedded/cyclic.rb +2 -11
  14. data/lib/mongoid/association/embedded/embedded_in/binding.rb +0 -7
  15. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +0 -3
  16. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +0 -13
  17. data/lib/mongoid/association/embedded/embedded_in.rb +0 -23
  18. data/lib/mongoid/association/embedded/embeds_many/binding.rb +0 -7
  19. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +0 -3
  20. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +31 -44
  21. data/lib/mongoid/association/embedded/embeds_many.rb +0 -31
  22. data/lib/mongoid/association/embedded/embeds_one/binding.rb +0 -7
  23. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +0 -3
  24. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +26 -14
  25. data/lib/mongoid/association/embedded/embeds_one.rb +0 -27
  26. data/lib/mongoid/association/embedded.rb +0 -1
  27. data/lib/mongoid/association/macros.rb +26 -5
  28. data/lib/mongoid/association/many.rb +0 -17
  29. data/lib/mongoid/association/marshalable.rb +0 -5
  30. data/lib/mongoid/association/nested/many.rb +0 -11
  31. data/lib/mongoid/association/nested/nested_buildable.rb +0 -9
  32. data/lib/mongoid/association/nested/one.rb +1 -16
  33. data/lib/mongoid/association/nested.rb +0 -3
  34. data/lib/mongoid/association/one.rb +1 -10
  35. data/lib/mongoid/association/options.rb +0 -33
  36. data/lib/mongoid/association/proxy.rb +0 -21
  37. data/lib/mongoid/association/referenced/auto_save.rb +0 -9
  38. data/lib/mongoid/association/referenced/belongs_to/binding.rb +0 -7
  39. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +4 -5
  40. data/lib/mongoid/association/referenced/belongs_to/eager.rb +0 -1
  41. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +0 -13
  42. data/lib/mongoid/association/referenced/belongs_to.rb +9 -34
  43. data/lib/mongoid/association/referenced/counter_cache.rb +2 -15
  44. data/lib/mongoid/association/referenced/eager.rb +3 -24
  45. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +0 -5
  46. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +0 -3
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +0 -1
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +12 -39
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +11 -38
  50. data/lib/mongoid/association/referenced/has_many/binding.rb +0 -5
  51. data/lib/mongoid/association/referenced/has_many/buildable.rb +0 -3
  52. data/lib/mongoid/association/referenced/has_many/eager.rb +0 -1
  53. data/lib/mongoid/association/referenced/has_many/enumerable.rb +20 -64
  54. data/lib/mongoid/association/referenced/has_many/proxy.rb +20 -63
  55. data/lib/mongoid/association/referenced/has_many.rb +12 -39
  56. data/lib/mongoid/association/referenced/has_one/binding.rb +0 -7
  57. data/lib/mongoid/association/referenced/has_one/buildable.rb +3 -4
  58. data/lib/mongoid/association/referenced/has_one/eager.rb +0 -1
  59. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +0 -15
  60. data/lib/mongoid/association/referenced/has_one/proxy.rb +0 -9
  61. data/lib/mongoid/association/referenced/has_one.rb +9 -32
  62. data/lib/mongoid/association/referenced/syncable.rb +0 -17
  63. data/lib/mongoid/association/referenced.rb +0 -1
  64. data/lib/mongoid/association/reflections.rb +0 -1
  65. data/lib/mongoid/association/relatable.rb +0 -61
  66. data/lib/mongoid/association.rb +0 -17
  67. data/lib/mongoid/atomic/modifiers.rb +4 -51
  68. data/lib/mongoid/atomic/paths/embedded/many.rb +0 -24
  69. data/lib/mongoid/atomic/paths/embedded/one.rb +0 -5
  70. data/lib/mongoid/atomic/paths/embedded.rb +0 -3
  71. data/lib/mongoid/atomic/paths/root.rb +0 -5
  72. data/lib/mongoid/atomic/paths.rb +0 -1
  73. data/lib/mongoid/atomic.rb +1 -42
  74. data/lib/mongoid/attributes/dynamic.rb +0 -17
  75. data/lib/mongoid/attributes/nested.rb +0 -5
  76. data/lib/mongoid/attributes/processing.rb +1 -18
  77. data/lib/mongoid/attributes/projector.rb +0 -1
  78. data/lib/mongoid/attributes/readonly.rb +0 -5
  79. data/lib/mongoid/attributes.rb +0 -33
  80. data/lib/mongoid/cacheable.rb +1 -6
  81. data/lib/mongoid/changeable.rb +3 -59
  82. data/lib/mongoid/clients/factory.rb +0 -7
  83. data/lib/mongoid/clients/options.rb +0 -5
  84. data/lib/mongoid/clients/sessions.rb +0 -7
  85. data/lib/mongoid/clients/storage_options.rb +0 -7
  86. data/lib/mongoid/clients/validators/storage.rb +0 -9
  87. data/lib/mongoid/clients/validators.rb +0 -1
  88. data/lib/mongoid/clients.rb +0 -9
  89. data/lib/mongoid/composable.rb +0 -7
  90. data/lib/mongoid/config/environment.rb +21 -6
  91. data/lib/mongoid/config/options.rb +0 -11
  92. data/lib/mongoid/config/validators/client.rb +0 -17
  93. data/lib/mongoid/config/validators/option.rb +0 -3
  94. data/lib/mongoid/config/validators.rb +0 -1
  95. data/lib/mongoid/config.rb +43 -30
  96. data/lib/mongoid/contextual/aggregable/memory.rb +14 -11
  97. data/lib/mongoid/contextual/aggregable/mongo.rb +15 -20
  98. data/lib/mongoid/contextual/aggregable/none.rb +65 -0
  99. data/lib/mongoid/contextual/aggregable.rb +17 -0
  100. data/lib/mongoid/contextual/atomic.rb +0 -25
  101. data/lib/mongoid/contextual/command.rb +0 -5
  102. data/lib/mongoid/contextual/geo_near.rb +1 -34
  103. data/lib/mongoid/contextual/map_reduce.rb +0 -31
  104. data/lib/mongoid/contextual/memory.rb +147 -70
  105. data/lib/mongoid/contextual/mongo.rb +249 -103
  106. data/lib/mongoid/contextual/none.rb +83 -28
  107. data/lib/mongoid/contextual/queryable.rb +0 -3
  108. data/lib/mongoid/contextual.rb +0 -5
  109. data/lib/mongoid/copyable.rb +0 -5
  110. data/lib/mongoid/criteria/findable.rb +0 -13
  111. data/lib/mongoid/criteria/includable.rb +0 -9
  112. data/lib/mongoid/criteria/inspectable.rb +0 -3
  113. data/lib/mongoid/criteria/marshalable.rb +0 -5
  114. data/lib/mongoid/criteria/modifiable.rb +0 -19
  115. data/lib/mongoid/criteria/options.rb +0 -3
  116. data/lib/mongoid/criteria/permission.rb +0 -1
  117. data/lib/mongoid/criteria/queryable/aggregable.rb +0 -13
  118. data/lib/mongoid/criteria/queryable/expandable.rb +0 -1
  119. data/lib/mongoid/criteria/queryable/extensions/array.rb +2 -25
  120. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +0 -3
  121. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +0 -3
  122. data/lib/mongoid/criteria/queryable/extensions/date.rb +0 -7
  123. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +0 -5
  124. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -24
  125. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +0 -13
  126. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +0 -11
  127. data/lib/mongoid/criteria/queryable/extensions/object.rb +1 -28
  128. data/lib/mongoid/criteria/queryable/extensions/range.rb +38 -16
  129. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +0 -9
  130. data/lib/mongoid/criteria/queryable/extensions/set.rb +0 -3
  131. data/lib/mongoid/criteria/queryable/extensions/string.rb +0 -17
  132. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +0 -9
  133. data/lib/mongoid/criteria/queryable/extensions/time.rb +0 -7
  134. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +0 -7
  135. data/lib/mongoid/criteria/queryable/extensions.rb +0 -1
  136. data/lib/mongoid/criteria/queryable/key.rb +1 -14
  137. data/lib/mongoid/criteria/queryable/macroable.rb +0 -3
  138. data/lib/mongoid/criteria/queryable/mergeable.rb +22 -30
  139. data/lib/mongoid/criteria/queryable/optional.rb +0 -45
  140. data/lib/mongoid/criteria/queryable/options.rb +0 -19
  141. data/lib/mongoid/criteria/queryable/pipeline.rb +0 -13
  142. data/lib/mongoid/criteria/queryable/selectable.rb +45 -76
  143. data/lib/mongoid/criteria/queryable/selector.rb +0 -17
  144. data/lib/mongoid/criteria/queryable/smash.rb +0 -11
  145. data/lib/mongoid/criteria/queryable/storable.rb +6 -2
  146. data/lib/mongoid/criteria/queryable.rb +0 -7
  147. data/lib/mongoid/criteria/scopable.rb +25 -19
  148. data/lib/mongoid/criteria.rb +2 -57
  149. data/lib/mongoid/document.rb +1 -50
  150. data/lib/mongoid/equality.rb +26 -10
  151. data/lib/mongoid/errors/ambiguous_relationship.rb +2 -5
  152. data/lib/mongoid/errors/callback.rb +0 -3
  153. data/lib/mongoid/errors/criteria_argument_required.rb +0 -1
  154. data/lib/mongoid/errors/delete_restriction.rb +0 -3
  155. data/lib/mongoid/errors/document_not_destroyed.rb +2 -7
  156. data/lib/mongoid/errors/document_not_found.rb +23 -15
  157. data/lib/mongoid/errors/eager_load.rb +0 -3
  158. data/lib/mongoid/errors/empty_config_file.rb +0 -1
  159. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +0 -3
  160. data/lib/mongoid/errors/invalid_collection.rb +0 -1
  161. data/lib/mongoid/errors/invalid_config_file.rb +0 -1
  162. data/lib/mongoid/errors/invalid_config_option.rb +0 -3
  163. data/lib/mongoid/errors/invalid_dependent_strategy.rb +0 -3
  164. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +0 -1
  165. data/lib/mongoid/errors/invalid_elem_match_operator.rb +0 -1
  166. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +0 -1
  167. data/lib/mongoid/errors/invalid_expression_operator.rb +0 -1
  168. data/lib/mongoid/errors/invalid_field.rb +0 -5
  169. data/lib/mongoid/errors/invalid_field_operator.rb +0 -1
  170. data/lib/mongoid/errors/invalid_field_option.rb +0 -3
  171. data/lib/mongoid/errors/invalid_find.rb +0 -3
  172. data/lib/mongoid/errors/invalid_includes.rb +0 -3
  173. data/lib/mongoid/errors/invalid_index.rb +0 -3
  174. data/lib/mongoid/errors/invalid_options.rb +0 -3
  175. data/lib/mongoid/errors/invalid_path.rb +0 -3
  176. data/lib/mongoid/errors/invalid_persistence_option.rb +0 -5
  177. data/lib/mongoid/errors/invalid_query.rb +0 -1
  178. data/lib/mongoid/errors/invalid_relation.rb +0 -7
  179. data/lib/mongoid/errors/invalid_relation_option.rb +0 -3
  180. data/lib/mongoid/errors/invalid_scope.rb +0 -3
  181. data/lib/mongoid/errors/invalid_session_use.rb +1 -6
  182. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +0 -1
  183. data/lib/mongoid/errors/invalid_storage_options.rb +0 -3
  184. data/lib/mongoid/errors/invalid_storage_parent.rb +0 -3
  185. data/lib/mongoid/errors/invalid_time.rb +0 -3
  186. data/lib/mongoid/errors/invalid_value.rb +0 -1
  187. data/lib/mongoid/errors/inverse_not_found.rb +0 -3
  188. data/lib/mongoid/errors/mixed_client_configuration.rb +0 -3
  189. data/lib/mongoid/errors/mixed_relations.rb +0 -3
  190. data/lib/mongoid/errors/mongoid_error.rb +0 -9
  191. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +0 -3
  192. data/lib/mongoid/errors/no_client_config.rb +0 -3
  193. data/lib/mongoid/errors/no_client_database.rb +0 -3
  194. data/lib/mongoid/errors/no_client_hosts.rb +0 -3
  195. data/lib/mongoid/errors/no_clients_config.rb +0 -3
  196. data/lib/mongoid/errors/no_default_client.rb +0 -3
  197. data/lib/mongoid/errors/no_environment.rb +0 -3
  198. data/lib/mongoid/errors/no_map_reduce_output.rb +0 -3
  199. data/lib/mongoid/errors/no_metadata.rb +0 -3
  200. data/lib/mongoid/errors/no_parent.rb +0 -3
  201. data/lib/mongoid/errors/readonly_attribute.rb +0 -3
  202. data/lib/mongoid/errors/readonly_document.rb +1 -6
  203. data/lib/mongoid/errors/scope_overwrite.rb +0 -1
  204. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +0 -1
  205. data/lib/mongoid/errors/unknown_attribute.rb +0 -3
  206. data/lib/mongoid/errors/unknown_model.rb +0 -3
  207. data/lib/mongoid/errors/unsaved_document.rb +1 -2
  208. data/lib/mongoid/errors/unsupported_javascript.rb +0 -3
  209. data/lib/mongoid/errors/validations.rb +0 -1
  210. data/lib/mongoid/errors.rb +0 -1
  211. data/lib/mongoid/evolvable.rb +0 -3
  212. data/lib/mongoid/extensions/array.rb +3 -29
  213. data/lib/mongoid/extensions/big_decimal.rb +0 -11
  214. data/lib/mongoid/extensions/boolean.rb +0 -3
  215. data/lib/mongoid/extensions/date.rb +0 -9
  216. data/lib/mongoid/extensions/date_time.rb +0 -9
  217. data/lib/mongoid/extensions/decimal128.rb +0 -5
  218. data/lib/mongoid/extensions/false_class.rb +1 -6
  219. data/lib/mongoid/extensions/float.rb +0 -7
  220. data/lib/mongoid/extensions/hash.rb +0 -27
  221. data/lib/mongoid/extensions/integer.rb +0 -9
  222. data/lib/mongoid/extensions/module.rb +0 -3
  223. data/lib/mongoid/extensions/nil_class.rb +0 -5
  224. data/lib/mongoid/extensions/object.rb +1 -40
  225. data/lib/mongoid/extensions/object_id.rb +0 -7
  226. data/lib/mongoid/extensions/range.rb +0 -11
  227. data/lib/mongoid/extensions/regexp.rb +0 -3
  228. data/lib/mongoid/extensions/set.rb +0 -7
  229. data/lib/mongoid/extensions/string.rb +1 -30
  230. data/lib/mongoid/extensions/symbol.rb +0 -7
  231. data/lib/mongoid/extensions/time.rb +0 -11
  232. data/lib/mongoid/extensions/time_with_zone.rb +13 -9
  233. data/lib/mongoid/extensions/true_class.rb +1 -6
  234. data/lib/mongoid/extensions.rb +15 -3
  235. data/lib/mongoid/factory.rb +1 -2
  236. data/lib/mongoid/fields/foreign_key.rb +0 -21
  237. data/lib/mongoid/fields/localized.rb +0 -11
  238. data/lib/mongoid/fields/standard.rb +0 -33
  239. data/lib/mongoid/fields/validators/macro.rb +0 -9
  240. data/lib/mongoid/fields/validators.rb +0 -1
  241. data/lib/mongoid/fields.rb +191 -60
  242. data/lib/mongoid/findable.rb +20 -10
  243. data/lib/mongoid/indexable/specification.rb +0 -15
  244. data/lib/mongoid/indexable/validators/options.rb +0 -7
  245. data/lib/mongoid/indexable.rb +1 -18
  246. data/lib/mongoid/inspectable.rb +1 -10
  247. data/lib/mongoid/interceptable.rb +0 -25
  248. data/lib/mongoid/loggable.rb +0 -9
  249. data/lib/mongoid/matchable.rb +0 -5
  250. data/lib/mongoid/matcher/eq_impl.rb +37 -2
  251. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +6 -1
  252. data/lib/mongoid/persistable/creatable.rb +1 -20
  253. data/lib/mongoid/persistable/deletable.rb +0 -17
  254. data/lib/mongoid/persistable/destroyable.rb +0 -7
  255. data/lib/mongoid/persistable/incrementable.rb +0 -5
  256. data/lib/mongoid/persistable/logical.rb +0 -5
  257. data/lib/mongoid/persistable/poppable.rb +0 -5
  258. data/lib/mongoid/persistable/pullable.rb +0 -7
  259. data/lib/mongoid/persistable/pushable.rb +0 -7
  260. data/lib/mongoid/persistable/renamable.rb +0 -5
  261. data/lib/mongoid/persistable/savable.rb +0 -7
  262. data/lib/mongoid/persistable/settable.rb +0 -5
  263. data/lib/mongoid/persistable/unsettable.rb +0 -5
  264. data/lib/mongoid/persistable/updatable.rb +2 -17
  265. data/lib/mongoid/persistable/upsertable.rb +0 -7
  266. data/lib/mongoid/persistable.rb +0 -23
  267. data/lib/mongoid/persistence_context.rb +0 -27
  268. data/lib/mongoid/positional.rb +0 -5
  269. data/lib/mongoid/query_cache.rb +0 -33
  270. data/lib/mongoid/railtie.rb +0 -15
  271. data/lib/mongoid/railties/controller_runtime.rb +0 -1
  272. data/lib/mongoid/reloadable.rb +4 -16
  273. data/lib/mongoid/scopable.rb +6 -34
  274. data/lib/mongoid/selectable.rb +0 -9
  275. data/lib/mongoid/serializable.rb +0 -15
  276. data/lib/mongoid/shardable.rb +0 -7
  277. data/lib/mongoid/stateful.rb +0 -9
  278. data/lib/mongoid/stringified_symbol.rb +2 -3
  279. data/lib/mongoid/tasks/database.rb +0 -5
  280. data/lib/mongoid/threaded/lifecycle.rb +0 -21
  281. data/lib/mongoid/threaded.rb +0 -55
  282. data/lib/mongoid/timestamps/created/short.rb +0 -1
  283. data/lib/mongoid/timestamps/created.rb +0 -1
  284. data/lib/mongoid/timestamps/short.rb +0 -1
  285. data/lib/mongoid/timestamps/timeless.rb +0 -7
  286. data/lib/mongoid/timestamps/updated/short.rb +0 -1
  287. data/lib/mongoid/timestamps/updated.rb +0 -3
  288. data/lib/mongoid/timestamps.rb +0 -1
  289. data/lib/mongoid/touchable.rb +0 -7
  290. data/lib/mongoid/traversable.rb +67 -53
  291. data/lib/mongoid/validatable/associated.rb +0 -3
  292. data/lib/mongoid/validatable/format.rb +0 -1
  293. data/lib/mongoid/validatable/length.rb +0 -1
  294. data/lib/mongoid/validatable/localizable.rb +0 -3
  295. data/lib/mongoid/validatable/macros.rb +0 -7
  296. data/lib/mongoid/validatable/presence.rb +1 -8
  297. data/lib/mongoid/validatable/queryable.rb +0 -3
  298. data/lib/mongoid/validatable/uniqueness.rb +15 -30
  299. data/lib/mongoid/validatable.rb +1 -22
  300. data/lib/mongoid/version.rb +1 -2
  301. data/lib/mongoid/warnings.rb +29 -0
  302. data/lib/mongoid.rb +1 -15
  303. data/lib/rails/generators/mongoid/config/config_generator.rb +0 -1
  304. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +4 -3
  305. data/lib/rails/generators/mongoid/model/model_generator.rb +0 -1
  306. data/lib/rails/generators/mongoid_generator.rb +0 -1
  307. data/lib/rails/mongoid.rb +0 -3
  308. data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
  309. data/spec/integration/app_spec.rb +20 -15
  310. data/spec/integration/associations/belongs_to_spec.rb +0 -1
  311. data/spec/integration/associations/embedded_dirty_spec.rb +57 -0
  312. data/spec/integration/associations/embedded_spec.rb +0 -1
  313. data/spec/integration/associations/embeds_many_spec.rb +0 -1
  314. data/spec/integration/associations/embeds_one_spec.rb +0 -1
  315. data/spec/integration/associations/foreign_key_spec.rb +0 -1
  316. data/spec/integration/associations/foreign_key_spec_models.rb +0 -1
  317. data/spec/integration/associations/has_many_spec.rb +0 -1
  318. data/spec/integration/associations/has_one_spec.rb +0 -1
  319. data/spec/integration/associations/nested_attributes_assignment_spec.rb +0 -1
  320. data/spec/integration/associations/reverse_population_spec.rb +0 -1
  321. data/spec/integration/associations/reverse_population_spec_models.rb +0 -1
  322. data/spec/integration/associations/scope_option_spec.rb +101 -0
  323. data/spec/integration/atomic/modifiers_spec.rb +0 -1
  324. data/spec/integration/bson_regexp_raw_spec.rb +0 -1
  325. data/spec/integration/callbacks_models.rb +12 -0
  326. data/spec/integration/callbacks_spec.rb +18 -6
  327. data/spec/integration/contextual/empty_spec.rb +0 -1
  328. data/spec/integration/criteria/alias_query_spec.rb +161 -0
  329. data/spec/integration/criteria/date_field_spec.rb +0 -1
  330. data/spec/integration/criteria/default_scope_spec.rb +51 -0
  331. data/spec/integration/criteria/logical_spec.rb +30 -0
  332. data/spec/integration/criteria/range_spec.rb +265 -0
  333. data/spec/integration/criteria/time_with_zone_spec.rb +125 -15
  334. data/spec/integration/discriminator_key_spec.rb +0 -1
  335. data/spec/integration/discriminator_value_spec.rb +0 -1
  336. data/spec/integration/document_spec.rb +0 -1
  337. data/spec/integration/i18n_fallbacks_spec.rb +15 -2
  338. data/spec/integration/matcher_examples_spec.rb +0 -1
  339. data/spec/integration/matcher_operator_spec.rb +27 -3
  340. data/spec/integration/matcher_spec.rb +95 -1
  341. data/spec/integration/server_query_spec.rb +0 -1
  342. data/spec/integration/shardable_spec.rb +0 -1
  343. data/spec/integration/stringified_symbol_field_spec.rb +14 -1
  344. data/spec/lite_spec_helper.rb +1 -2
  345. data/spec/mongoid/association/accessors_spec.rb +44 -15
  346. data/spec/mongoid/association/auto_save_spec.rb +72 -34
  347. data/spec/mongoid/association/builders_spec.rb +1 -2
  348. data/spec/mongoid/association/constrainable_spec.rb +0 -1
  349. data/spec/mongoid/association/counter_cache_spec.rb +32 -33
  350. data/spec/mongoid/association/depending_spec.rb +12 -13
  351. data/spec/mongoid/association/eager_spec.rb +4 -5
  352. data/spec/mongoid/association/embedded/cyclic_spec.rb +2 -3
  353. data/spec/mongoid/association/embedded/dirty_spec.rb +2 -3
  354. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +0 -1
  355. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +0 -1
  356. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +13 -14
  357. data/spec/mongoid/association/embedded/embedded_in_spec.rb +0 -1
  358. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +0 -1
  359. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +0 -1
  360. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +384 -156
  361. data/spec/mongoid/association/embedded/embeds_many_models.rb +0 -122
  362. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +0 -1
  363. data/spec/mongoid/association/embedded/embeds_many_spec.rb +0 -1
  364. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +0 -1
  365. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +0 -1
  366. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +21 -22
  367. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +0 -1
  368. data/spec/mongoid/association/embedded/embeds_one_models.rb +0 -1
  369. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +0 -1
  370. data/spec/mongoid/association/embedded/embeds_one_spec.rb +0 -1
  371. data/spec/mongoid/association/macros_spec.rb +9 -10
  372. data/spec/mongoid/association/nested/many_spec.rb +0 -1
  373. data/spec/mongoid/association/nested/one_spec.rb +0 -1
  374. data/spec/mongoid/association/options_spec.rb +0 -1
  375. data/spec/mongoid/association/polymorphic_spec.rb +0 -1
  376. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +0 -1
  377. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +55 -17
  378. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +50 -15
  379. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +57 -53
  380. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +0 -1
  381. data/spec/mongoid/association/referenced/belongs_to_spec.rb +22 -2
  382. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +0 -1
  383. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +26 -2
  384. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +31 -3
  385. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +0 -1
  386. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +179 -162
  387. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +18 -1
  388. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +0 -1
  389. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +21 -1
  390. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +0 -1
  391. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +21 -1
  392. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +23 -7
  393. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +113 -33
  394. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +0 -1
  395. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +225 -178
  396. data/spec/mongoid/association/referenced/has_many_models.rb +18 -1
  397. data/spec/mongoid/association/referenced/has_many_query_spec.rb +0 -1
  398. data/spec/mongoid/association/referenced/has_many_spec.rb +21 -1
  399. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +0 -1
  400. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +51 -8
  401. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +17 -2
  402. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +26 -27
  403. data/spec/mongoid/association/referenced/has_one_models.rb +18 -1
  404. data/spec/mongoid/association/referenced/has_one_query_spec.rb +0 -1
  405. data/spec/mongoid/association/referenced/has_one_spec.rb +21 -1
  406. data/spec/mongoid/association/reflections_spec.rb +0 -1
  407. data/spec/mongoid/association/syncable_spec.rb +31 -32
  408. data/spec/mongoid/association_spec.rb +0 -1
  409. data/spec/mongoid/atomic/modifiers_spec.rb +0 -1
  410. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +0 -1
  411. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +0 -1
  412. data/spec/mongoid/atomic/paths/root_spec.rb +0 -1
  413. data/spec/mongoid/atomic/paths_spec.rb +0 -1
  414. data/spec/mongoid/atomic_spec.rb +28 -7
  415. data/spec/mongoid/attributes/dynamic_spec.rb +0 -1
  416. data/spec/mongoid/attributes/nested_spec.rb +66 -67
  417. data/spec/mongoid/attributes/projector_spec.rb +5 -2
  418. data/spec/mongoid/attributes/readonly_spec.rb +22 -23
  419. data/spec/mongoid/attributes_spec.rb +32 -33
  420. data/spec/mongoid/cacheable_spec.rb +1 -2
  421. data/spec/mongoid/changeable_spec.rb +35 -36
  422. data/spec/mongoid/clients/factory_spec.rb +11 -13
  423. data/spec/mongoid/clients/options_spec.rb +5 -5
  424. data/spec/mongoid/clients/sessions_spec.rb +22 -23
  425. data/spec/mongoid/clients/transactions_spec.rb +49 -27
  426. data/spec/mongoid/clients_spec.rb +6 -7
  427. data/spec/mongoid/composable_spec.rb +0 -1
  428. data/spec/mongoid/config/environment_spec.rb +39 -2
  429. data/spec/mongoid/config/options_spec.rb +0 -1
  430. data/spec/mongoid/config_spec.rb +154 -4
  431. data/spec/mongoid/contextual/aggregable/memory_spec.rb +51 -12
  432. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +120 -21
  433. data/spec/mongoid/contextual/aggregable/none_spec.rb +60 -0
  434. data/spec/mongoid/contextual/atomic_spec.rb +46 -47
  435. data/spec/mongoid/contextual/geo_near_spec.rb +17 -18
  436. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -3
  437. data/spec/mongoid/contextual/memory_spec.rb +849 -89
  438. data/spec/mongoid/contextual/mongo_spec.rb +1185 -160
  439. data/spec/mongoid/contextual/none_spec.rb +43 -72
  440. data/spec/mongoid/copyable_spec.rb +12 -13
  441. data/spec/mongoid/copyable_spec_models.rb +0 -1
  442. data/spec/mongoid/criteria/findable_spec.rb +23 -24
  443. data/spec/mongoid/criteria/inspectable_spec.rb +0 -1
  444. data/spec/mongoid/criteria/marshalable_spec.rb +0 -1
  445. data/spec/mongoid/criteria/modifiable_spec.rb +36 -37
  446. data/spec/mongoid/criteria/options_spec.rb +0 -1
  447. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +1 -2
  448. data/spec/mongoid/criteria/queryable/expandable_spec.rb +0 -1
  449. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +0 -1
  450. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +0 -1
  451. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -1
  452. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +0 -1
  453. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +0 -1
  454. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +0 -1
  455. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -1
  456. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +0 -1
  457. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -1
  458. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +0 -1
  459. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +0 -1
  460. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +0 -1
  461. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +0 -1
  462. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +237 -179
  463. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +0 -1
  464. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +0 -1
  465. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +0 -1
  466. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +0 -1
  467. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -1
  468. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +0 -1
  469. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +0 -1
  470. data/spec/mongoid/criteria/queryable/key_spec.rb +0 -1
  471. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +0 -1
  472. data/spec/mongoid/criteria/queryable/optional_spec.rb +1 -2
  473. data/spec/mongoid/criteria/queryable/options_spec.rb +0 -1
  474. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +0 -1
  475. data/spec/mongoid/criteria/queryable/queryable_spec.rb +1 -2
  476. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +0 -1
  477. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +0 -1
  478. data/spec/mongoid/criteria/queryable/selectable_spec.rb +227 -55
  479. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +0 -1
  480. data/spec/mongoid/criteria/queryable/selector_spec.rb +0 -1
  481. data/spec/mongoid/criteria/queryable/smash_spec.rb +0 -1
  482. data/spec/mongoid/criteria/queryable/storable_spec.rb +37 -1
  483. data/spec/mongoid/criteria/scopable_spec.rb +127 -1
  484. data/spec/mongoid/criteria_projection_spec.rb +3 -4
  485. data/spec/mongoid/criteria_spec.rb +523 -187
  486. data/spec/mongoid/document_fields_spec.rb +0 -1
  487. data/spec/mongoid/document_persistence_context_spec.rb +0 -1
  488. data/spec/mongoid/document_query_spec.rb +0 -1
  489. data/spec/mongoid/document_spec.rb +11 -33
  490. data/spec/mongoid/equality_spec.rb +142 -41
  491. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +0 -1
  492. data/spec/mongoid/errors/callback_spec.rb +0 -1
  493. data/spec/mongoid/errors/delete_restriction_spec.rb +0 -1
  494. data/spec/mongoid/errors/document_not_destroyed_spec.rb +0 -1
  495. data/spec/mongoid/errors/document_not_found_spec.rb +49 -1
  496. data/spec/mongoid/errors/eager_load_spec.rb +0 -1
  497. data/spec/mongoid/errors/invalid_collection_spec.rb +0 -1
  498. data/spec/mongoid/errors/invalid_config_file_spec.rb +0 -1
  499. data/spec/mongoid/errors/invalid_config_option_spec.rb +0 -1
  500. data/spec/mongoid/errors/invalid_field_option_spec.rb +0 -1
  501. data/spec/mongoid/errors/invalid_field_spec.rb +0 -1
  502. data/spec/mongoid/errors/invalid_find_spec.rb +0 -1
  503. data/spec/mongoid/errors/invalid_includes_spec.rb +0 -1
  504. data/spec/mongoid/errors/invalid_index_spec.rb +0 -1
  505. data/spec/mongoid/errors/invalid_options_spec.rb +0 -1
  506. data/spec/mongoid/errors/invalid_path_spec.rb +0 -1
  507. data/spec/mongoid/errors/invalid_relation_spec.rb +0 -1
  508. data/spec/mongoid/errors/invalid_scope_spec.rb +1 -2
  509. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +0 -1
  510. data/spec/mongoid/errors/invalid_storage_options_spec.rb +0 -1
  511. data/spec/mongoid/errors/invalid_time_spec.rb +0 -1
  512. data/spec/mongoid/errors/inverse_not_found_spec.rb +0 -1
  513. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +0 -1
  514. data/spec/mongoid/errors/mixed_relations_spec.rb +0 -1
  515. data/spec/mongoid/errors/mongoid_error_spec.rb +1 -2
  516. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +0 -1
  517. data/spec/mongoid/errors/no_client_config_spec.rb +0 -1
  518. data/spec/mongoid/errors/no_client_database_spec.rb +0 -1
  519. data/spec/mongoid/errors/no_client_hosts_spec.rb +0 -1
  520. data/spec/mongoid/errors/no_clients_config_spec.rb +0 -1
  521. data/spec/mongoid/errors/no_environment_spec.rb +0 -1
  522. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +0 -1
  523. data/spec/mongoid/errors/no_metadata_spec.rb +0 -1
  524. data/spec/mongoid/errors/no_parent_spec.rb +0 -1
  525. data/spec/mongoid/errors/readonly_attribute_spec.rb +0 -1
  526. data/spec/mongoid/errors/readonly_document_spec.rb +0 -1
  527. data/spec/mongoid/errors/scope_overwrite_spec.rb +0 -1
  528. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +0 -1
  529. data/spec/mongoid/errors/unknown_attribute_spec.rb +2 -3
  530. data/spec/mongoid/errors/unsaved_document_spec.rb +0 -1
  531. data/spec/mongoid/errors/unsupported_javascript_spec.rb +0 -1
  532. data/spec/mongoid/errors/validations_spec.rb +0 -1
  533. data/spec/mongoid/extensions/array_spec.rb +0 -1
  534. data/spec/mongoid/extensions/big_decimal_spec.rb +0 -1
  535. data/spec/mongoid/extensions/binary_spec.rb +0 -1
  536. data/spec/mongoid/extensions/boolean_spec.rb +0 -1
  537. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +0 -1
  538. data/spec/mongoid/extensions/date_spec.rb +0 -1
  539. data/spec/mongoid/extensions/date_time_spec.rb +0 -1
  540. data/spec/mongoid/extensions/decimal128_spec.rb +0 -1
  541. data/spec/mongoid/extensions/false_class_spec.rb +0 -1
  542. data/spec/mongoid/extensions/float_spec.rb +0 -1
  543. data/spec/mongoid/extensions/hash_spec.rb +0 -1
  544. data/spec/mongoid/extensions/integer_spec.rb +0 -1
  545. data/spec/mongoid/extensions/module_spec.rb +0 -1
  546. data/spec/mongoid/extensions/nil_class_spec.rb +0 -1
  547. data/spec/mongoid/extensions/object_id_spec.rb +0 -1
  548. data/spec/mongoid/extensions/object_spec.rb +0 -1
  549. data/spec/mongoid/extensions/range_spec.rb +0 -1
  550. data/spec/mongoid/extensions/regexp_spec.rb +0 -1
  551. data/spec/mongoid/extensions/set_spec.rb +0 -1
  552. data/spec/mongoid/extensions/string_spec.rb +2 -3
  553. data/spec/mongoid/extensions/stringified_symbol_spec.rb +0 -1
  554. data/spec/mongoid/extensions/symbol_spec.rb +0 -1
  555. data/spec/mongoid/extensions/time_spec.rb +0 -1
  556. data/spec/mongoid/extensions/time_with_zone_spec.rb +0 -1
  557. data/spec/mongoid/extensions/true_class_spec.rb +0 -1
  558. data/spec/mongoid/extensions_spec.rb +14 -3
  559. data/spec/mongoid/factory_spec.rb +1 -1
  560. data/spec/mongoid/fields/foreign_key_spec.rb +0 -1
  561. data/spec/mongoid/fields/localized_spec.rb +0 -1
  562. data/spec/mongoid/fields/standard_spec.rb +0 -1
  563. data/spec/mongoid/fields_spec.rb +326 -31
  564. data/spec/mongoid/findable_spec.rb +51 -22
  565. data/spec/mongoid/indexable/specification_spec.rb +0 -1
  566. data/spec/mongoid/indexable_spec.rb +0 -1
  567. data/spec/mongoid/inspectable_spec.rb +0 -1
  568. data/spec/mongoid/interceptable_spec.rb +102 -95
  569. data/spec/mongoid/loggable_spec.rb +0 -1
  570. data/spec/mongoid/matcher/extract_attribute_spec.rb +5 -2
  571. data/spec/mongoid/persistable/creatable_spec.rb +2 -3
  572. data/spec/mongoid/persistable/deletable_spec.rb +18 -19
  573. data/spec/mongoid/persistable/destroyable_spec.rb +8 -9
  574. data/spec/mongoid/persistable/incrementable_spec.rb +8 -9
  575. data/spec/mongoid/persistable/logical_spec.rb +4 -5
  576. data/spec/mongoid/persistable/poppable_spec.rb +4 -5
  577. data/spec/mongoid/persistable/pullable_spec.rb +8 -9
  578. data/spec/mongoid/persistable/pushable_spec.rb +8 -9
  579. data/spec/mongoid/persistable/renamable_spec.rb +3 -4
  580. data/spec/mongoid/persistable/savable_spec.rb +15 -11
  581. data/spec/mongoid/persistable/settable_spec.rb +9 -10
  582. data/spec/mongoid/persistable/unsettable_spec.rb +4 -5
  583. data/spec/mongoid/persistable/updatable_spec.rb +41 -24
  584. data/spec/mongoid/persistable/upsertable_spec.rb +1 -2
  585. data/spec/mongoid/persistable_spec.rb +1 -2
  586. data/spec/mongoid/persistence_context_spec.rb +0 -1
  587. data/spec/mongoid/positional_spec.rb +0 -1
  588. data/spec/mongoid/query_cache_middleware_spec.rb +1 -2
  589. data/spec/mongoid/query_cache_spec.rb +30 -8
  590. data/spec/mongoid/relations/proxy_spec.rb +6 -7
  591. data/spec/mongoid/reloadable_spec.rb +209 -23
  592. data/spec/mongoid/scopable_spec.rb +54 -22
  593. data/spec/mongoid/selectable_spec.rb +6 -7
  594. data/spec/mongoid/serializable_spec.rb +9 -10
  595. data/spec/mongoid/shardable_spec.rb +2 -3
  596. data/spec/mongoid/stateful_spec.rb +1 -2
  597. data/spec/mongoid/tasks/database_rake_spec.rb +0 -1
  598. data/spec/mongoid/tasks/database_spec.rb +0 -1
  599. data/spec/mongoid/threaded_spec.rb +2 -3
  600. data/spec/mongoid/timestamps/created/short_spec.rb +1 -2
  601. data/spec/mongoid/timestamps/created_spec.rb +1 -2
  602. data/spec/mongoid/timestamps/timeless_spec.rb +2 -3
  603. data/spec/mongoid/timestamps/updated/short_spec.rb +3 -4
  604. data/spec/mongoid/timestamps/updated_spec.rb +3 -4
  605. data/spec/mongoid/timestamps_spec.rb +6 -7
  606. data/spec/mongoid/touchable_spec.rb +15 -20
  607. data/spec/mongoid/touchable_spec_models.rb +0 -1
  608. data/spec/mongoid/traversable_spec.rb +65 -2
  609. data/spec/mongoid/validatable/associated_spec.rb +0 -1
  610. data/spec/mongoid/validatable/format_spec.rb +0 -1
  611. data/spec/mongoid/validatable/length_spec.rb +0 -1
  612. data/spec/mongoid/validatable/numericality_spec.rb +0 -1
  613. data/spec/mongoid/validatable/presence_spec.rb +26 -23
  614. data/spec/mongoid/validatable/uniqueness_spec.rb +67 -68
  615. data/spec/mongoid/validatable_spec.rb +2 -3
  616. data/spec/mongoid_spec.rb +0 -1
  617. data/spec/rails/controller_extension/controller_runtime_spec.rb +0 -1
  618. data/spec/rails/mongoid_spec.rb +0 -1
  619. data/spec/shared/lib/mrss/constraints.rb +10 -17
  620. data/spec/shared/lib/mrss/docker_runner.rb +23 -3
  621. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  622. data/spec/shared/lib/mrss/event_subscriber.rb +15 -5
  623. data/spec/shared/lib/mrss/lite_constraints.rb +40 -1
  624. data/spec/shared/share/Dockerfile.erb +56 -54
  625. data/spec/shared/shlib/config.sh +27 -0
  626. data/spec/shared/shlib/distro.sh +2 -1
  627. data/spec/shared/shlib/server.sh +46 -21
  628. data/spec/shared/shlib/set_env.sh +43 -5
  629. data/spec/spec_helper.rb +12 -22
  630. data/spec/support/authorization.rb +0 -1
  631. data/spec/support/constraints.rb +0 -1
  632. data/spec/support/expectations.rb +0 -1
  633. data/spec/support/macros.rb +31 -1
  634. data/spec/support/models/account.rb +1 -2
  635. data/spec/support/models/acolyte.rb +0 -1
  636. data/spec/support/models/actor.rb +0 -1
  637. data/spec/support/models/actress.rb +0 -1
  638. data/spec/support/models/address.rb +0 -1
  639. data/spec/support/models/address_component.rb +0 -1
  640. data/spec/support/models/address_number.rb +0 -1
  641. data/spec/support/models/agency.rb +0 -1
  642. data/spec/support/models/agent.rb +0 -1
  643. data/spec/support/models/album.rb +0 -1
  644. data/spec/support/models/alert.rb +0 -1
  645. data/spec/support/models/animal.rb +0 -1
  646. data/spec/support/models/answer.rb +0 -1
  647. data/spec/support/models/appointment.rb +0 -1
  648. data/spec/support/models/armrest.rb +0 -1
  649. data/spec/support/models/array_field.rb +0 -1
  650. data/spec/support/models/article.rb +0 -1
  651. data/spec/support/models/artist.rb +2 -1
  652. data/spec/support/models/artwork.rb +0 -1
  653. data/spec/support/models/audio.rb +0 -1
  654. data/spec/support/models/augmentation.rb +0 -1
  655. data/spec/support/models/author.rb +0 -1
  656. data/spec/support/models/baby.rb +0 -1
  657. data/spec/support/models/band.rb +4 -1
  658. data/spec/support/models/bar.rb +0 -1
  659. data/spec/support/models/basic.rb +0 -1
  660. data/spec/support/models/bed.rb +0 -1
  661. data/spec/support/models/big_palette.rb +0 -1
  662. data/spec/support/models/birthday.rb +0 -1
  663. data/spec/support/models/bolt.rb +0 -1
  664. data/spec/support/models/bomb.rb +0 -1
  665. data/spec/support/models/book.rb +0 -1
  666. data/spec/support/models/breed.rb +0 -1
  667. data/spec/support/models/browser.rb +0 -1
  668. data/spec/support/models/building.rb +0 -1
  669. data/spec/support/models/building_address.rb +0 -1
  670. data/spec/support/models/bus.rb +0 -1
  671. data/spec/support/models/business.rb +0 -1
  672. data/spec/support/models/callback_test.rb +0 -1
  673. data/spec/support/models/canvas.rb +0 -1
  674. data/spec/support/models/car.rb +0 -1
  675. data/spec/support/models/cat.rb +0 -1
  676. data/spec/support/models/category.rb +0 -1
  677. data/spec/support/models/child.rb +0 -1
  678. data/spec/support/models/child_doc.rb +3 -4
  679. data/spec/support/models/church.rb +0 -1
  680. data/spec/support/models/circle.rb +0 -1
  681. data/spec/support/models/circuit.rb +0 -1
  682. data/spec/support/models/circus.rb +0 -1
  683. data/spec/support/models/code.rb +2 -1
  684. data/spec/support/models/coding/pull_request.rb +0 -1
  685. data/spec/support/models/coding.rb +0 -1
  686. data/spec/support/models/comment.rb +0 -1
  687. data/spec/support/models/company.rb +0 -1
  688. data/spec/support/models/consumption_period.rb +0 -1
  689. data/spec/support/models/contextable_item.rb +0 -1
  690. data/spec/support/models/contractor.rb +0 -1
  691. data/spec/support/models/cookie.rb +0 -1
  692. data/spec/support/models/country_code.rb +2 -1
  693. data/spec/support/models/courier_job.rb +0 -1
  694. data/spec/support/models/crate.rb +0 -1
  695. data/spec/support/models/customer.rb +0 -1
  696. data/spec/support/models/customer_address.rb +0 -1
  697. data/spec/support/models/deed.rb +0 -1
  698. data/spec/support/models/definition.rb +0 -1
  699. data/spec/support/models/delegating_patient.rb +0 -1
  700. data/spec/support/models/description.rb +0 -1
  701. data/spec/support/models/dictionary.rb +0 -1
  702. data/spec/support/models/division.rb +0 -1
  703. data/spec/support/models/doctor.rb +0 -1
  704. data/spec/support/models/dog.rb +0 -1
  705. data/spec/support/models/dokument.rb +0 -1
  706. data/spec/support/models/draft.rb +0 -1
  707. data/spec/support/models/dragon.rb +0 -1
  708. data/spec/support/models/driver.rb +0 -1
  709. data/spec/support/models/drug.rb +0 -1
  710. data/spec/support/models/dungeon.rb +0 -1
  711. data/spec/support/models/edit.rb +0 -1
  712. data/spec/support/models/email.rb +0 -1
  713. data/spec/support/models/employer.rb +0 -1
  714. data/spec/support/models/entry.rb +0 -1
  715. data/spec/support/models/eraser.rb +0 -1
  716. data/spec/support/models/even.rb +0 -1
  717. data/spec/support/models/event.rb +0 -1
  718. data/spec/support/models/exhibition.rb +0 -1
  719. data/spec/support/models/exhibitor.rb +0 -1
  720. data/spec/support/models/explosion.rb +0 -1
  721. data/spec/support/models/eye.rb +0 -1
  722. data/spec/support/models/eye_bowl.rb +0 -1
  723. data/spec/support/models/face.rb +0 -1
  724. data/spec/support/models/favorite.rb +0 -1
  725. data/spec/support/models/filesystem.rb +0 -1
  726. data/spec/support/models/fire_hydrant.rb +0 -1
  727. data/spec/support/models/firefox.rb +0 -1
  728. data/spec/support/models/fish.rb +0 -1
  729. data/spec/support/models/folder.rb +0 -1
  730. data/spec/support/models/folder_item.rb +0 -1
  731. data/spec/support/models/fruits.rb +0 -1
  732. data/spec/support/models/game.rb +0 -1
  733. data/spec/support/models/ghost.rb +0 -1
  734. data/spec/support/models/guitar.rb +0 -1
  735. data/spec/support/models/hole.rb +0 -1
  736. data/spec/support/models/home.rb +0 -1
  737. data/spec/support/models/house.rb +0 -1
  738. data/spec/support/models/html_writer.rb +0 -1
  739. data/spec/support/models/id_key.rb +0 -1
  740. data/spec/support/models/idnodef.rb +0 -1
  741. data/spec/support/models/image.rb +0 -1
  742. data/spec/support/models/implant.rb +0 -1
  743. data/spec/support/models/instrument.rb +0 -1
  744. data/spec/support/models/item.rb +0 -1
  745. data/spec/support/models/jar.rb +0 -1
  746. data/spec/support/models/kaleidoscope.rb +0 -1
  747. data/spec/support/models/kangaroo.rb +0 -1
  748. data/spec/support/models/label.rb +2 -2
  749. data/spec/support/models/language.rb +0 -1
  750. data/spec/support/models/lat_lng.rb +0 -1
  751. data/spec/support/models/league.rb +0 -1
  752. data/spec/support/models/learner.rb +0 -1
  753. data/spec/support/models/line_item.rb +0 -1
  754. data/spec/support/models/location.rb +0 -1
  755. data/spec/support/models/login.rb +0 -1
  756. data/spec/support/models/manufacturer.rb +0 -1
  757. data/spec/support/models/meat.rb +0 -1
  758. data/spec/support/models/membership.rb +1 -1
  759. data/spec/support/models/message.rb +0 -1
  760. data/spec/support/models/minim.rb +0 -1
  761. data/spec/support/models/mixed_drink.rb +0 -1
  762. data/spec/support/models/mop.rb +0 -1
  763. data/spec/support/models/movie.rb +0 -1
  764. data/spec/support/models/my_hash.rb +0 -1
  765. data/spec/support/models/name.rb +0 -1
  766. data/spec/support/models/name_only.rb +0 -1
  767. data/spec/support/models/node.rb +0 -1
  768. data/spec/support/models/note.rb +0 -1
  769. data/spec/support/models/nut.rb +0 -1
  770. data/spec/support/models/odd.rb +0 -1
  771. data/spec/support/models/order.rb +2 -1
  772. data/spec/support/models/ordered_post.rb +1 -2
  773. data/spec/support/models/ordered_preference.rb +0 -1
  774. data/spec/support/models/oscar.rb +0 -1
  775. data/spec/support/models/other_owner_object.rb +0 -1
  776. data/spec/support/models/override.rb +0 -1
  777. data/spec/support/models/ownable.rb +0 -1
  778. data/spec/support/models/owner.rb +0 -1
  779. data/spec/support/models/pack.rb +0 -1
  780. data/spec/support/models/page.rb +0 -1
  781. data/spec/support/models/page_question.rb +0 -1
  782. data/spec/support/models/palette.rb +0 -1
  783. data/spec/support/models/parent.rb +0 -1
  784. data/spec/support/models/parent_doc.rb +0 -1
  785. data/spec/support/models/passport.rb +5 -1
  786. data/spec/support/models/patient.rb +0 -1
  787. data/spec/support/models/pdf_writer.rb +0 -1
  788. data/spec/support/models/pencil.rb +0 -1
  789. data/spec/support/models/person.rb +1 -1
  790. data/spec/support/models/pet.rb +0 -1
  791. data/spec/support/models/pet_owner.rb +0 -1
  792. data/spec/support/models/phone.rb +2 -2
  793. data/spec/support/models/piano.rb +0 -1
  794. data/spec/support/models/pizza.rb +0 -1
  795. data/spec/support/models/player.rb +0 -1
  796. data/spec/support/models/post.rb +0 -1
  797. data/spec/support/models/post_genre.rb +0 -1
  798. data/spec/support/models/powerup.rb +0 -1
  799. data/spec/support/models/preference.rb +0 -1
  800. data/spec/support/models/princess.rb +0 -1
  801. data/spec/support/models/product.rb +0 -1
  802. data/spec/support/models/profile.rb +0 -1
  803. data/spec/support/models/pronunciation.rb +0 -1
  804. data/spec/support/models/pub.rb +0 -1
  805. data/spec/support/models/publication/encyclopedia.rb +0 -1
  806. data/spec/support/models/publication/review.rb +0 -1
  807. data/spec/support/models/publication.rb +0 -1
  808. data/spec/support/models/purchase.rb +0 -1
  809. data/spec/support/models/purchased_item.rb +10 -0
  810. data/spec/support/models/question.rb +0 -1
  811. data/spec/support/models/quiz.rb +0 -1
  812. data/spec/support/models/rating.rb +0 -1
  813. data/spec/support/models/record.rb +0 -1
  814. data/spec/support/models/registry.rb +0 -1
  815. data/spec/support/models/role.rb +0 -1
  816. data/spec/support/models/root_category.rb +0 -1
  817. data/spec/support/models/sandwich.rb +0 -1
  818. data/spec/support/models/scheduler.rb +0 -1
  819. data/spec/support/models/scribe.rb +0 -1
  820. data/spec/support/models/sealer.rb +0 -1
  821. data/spec/support/models/seat.rb +0 -1
  822. data/spec/support/models/seo.rb +0 -1
  823. data/spec/support/models/series.rb +0 -1
  824. data/spec/support/models/server.rb +0 -1
  825. data/spec/support/models/service.rb +0 -1
  826. data/spec/support/models/shape.rb +0 -1
  827. data/spec/support/models/shelf.rb +0 -1
  828. data/spec/support/models/shipment_address.rb +0 -1
  829. data/spec/support/models/shipping_container.rb +0 -1
  830. data/spec/support/models/shipping_pack.rb +0 -1
  831. data/spec/support/models/shirt.rb +0 -1
  832. data/spec/support/models/shop.rb +0 -1
  833. data/spec/support/models/short_agent.rb +0 -1
  834. data/spec/support/models/short_quiz.rb +0 -1
  835. data/spec/support/models/simple.rb +0 -1
  836. data/spec/support/models/slave.rb +0 -1
  837. data/spec/support/models/song.rb +0 -1
  838. data/spec/support/models/sound.rb +0 -1
  839. data/spec/support/models/spacer.rb +0 -1
  840. data/spec/support/models/square.rb +0 -1
  841. data/spec/support/models/staff.rb +0 -1
  842. data/spec/support/models/store_as_dup_test1.rb +0 -1
  843. data/spec/support/models/store_as_dup_test2.rb +0 -1
  844. data/spec/support/models/store_as_dup_test3.rb +0 -1
  845. data/spec/support/models/store_as_dup_test4.rb +0 -1
  846. data/spec/support/models/strategy.rb +0 -1
  847. data/spec/support/models/sub_item.rb +0 -1
  848. data/spec/support/models/subscription.rb +0 -1
  849. data/spec/support/models/survey.rb +0 -1
  850. data/spec/support/models/symptom.rb +0 -1
  851. data/spec/support/models/tag.rb +0 -1
  852. data/spec/support/models/target.rb +0 -1
  853. data/spec/support/models/template.rb +0 -1
  854. data/spec/support/models/thing.rb +0 -1
  855. data/spec/support/models/threadlocker.rb +0 -1
  856. data/spec/support/models/title.rb +0 -1
  857. data/spec/support/models/tool.rb +0 -1
  858. data/spec/support/models/topping.rb +0 -1
  859. data/spec/support/models/toy.rb +0 -1
  860. data/spec/support/models/track.rb +0 -1
  861. data/spec/support/models/translation.rb +0 -1
  862. data/spec/support/models/tree.rb +0 -1
  863. data/spec/support/models/truck.rb +0 -1
  864. data/spec/support/models/updatable.rb +0 -1
  865. data/spec/support/models/user.rb +0 -1
  866. data/spec/support/models/user_account.rb +0 -1
  867. data/spec/support/models/validation_callback.rb +0 -1
  868. data/spec/support/models/vehicle.rb +0 -1
  869. data/spec/support/models/version.rb +0 -1
  870. data/spec/support/models/vertex.rb +0 -1
  871. data/spec/support/models/vet_visit.rb +0 -1
  872. data/spec/support/models/video.rb +0 -1
  873. data/spec/support/models/video_game.rb +0 -1
  874. data/spec/support/models/washer.rb +0 -1
  875. data/spec/support/models/weapon.rb +0 -1
  876. data/spec/support/models/wiki_page.rb +0 -1
  877. data/spec/support/models/word.rb +0 -1
  878. data/spec/support/models/word_origin.rb +0 -1
  879. data/spec/support/models/writer.rb +0 -1
  880. data/spec/support/schema_maps/schema_map_aws.json +17 -0
  881. data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  882. data/spec/support/schema_maps/schema_map_azure.json +17 -0
  883. data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  884. data/spec/support/schema_maps/schema_map_gcp.json +17 -0
  885. data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  886. data/spec/support/schema_maps/schema_map_kmip.json +17 -0
  887. data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  888. data/spec/support/schema_maps/schema_map_local.json +18 -0
  889. data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
  890. data/spec/support/shared/time.rb +0 -1
  891. data/spec/support/spec_config.rb +7 -1
  892. data.tar.gz.sig +0 -0
  893. metadata +51 -11
  894. metadata.gz.sig +0 -0
  895. data/lib/support/ruby_version.rb +0 -29
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # encoding: utf-8
3
2
 
4
3
  require "spec_helper"
5
4
 
@@ -10,7 +9,7 @@ describe Mongoid::Contextual::Mongo do
10
9
  describe "##{method}" do
11
10
 
12
11
  before do
13
- Band.create(name: "Depeche Mode")
12
+ Band.create!(name: "Depeche Mode")
14
13
  end
15
14
 
16
15
  context "when the count is zero" do
@@ -81,11 +80,11 @@ describe Mongoid::Contextual::Mongo do
81
80
  describe "#count" do
82
81
 
83
82
  let!(:depeche) do
84
- Band.create(name: "Depeche Mode")
83
+ Band.create!(name: "Depeche Mode")
85
84
  end
86
85
 
87
86
  let!(:new_order) do
88
- Band.create(name: "New Order")
87
+ Band.create!(name: "New Order")
89
88
  end
90
89
 
91
90
  let(:criteria) do
@@ -134,7 +133,7 @@ describe Mongoid::Contextual::Mongo do
134
133
  context "and a limit true" do
135
134
 
136
135
  before do
137
- 2.times { Band.create(name: "Depeche Mode", likes: 1) }
136
+ 2.times { Band.create!(name: "Depeche Mode", likes: 1) }
138
137
  end
139
138
 
140
139
  let(:count) do
@@ -152,7 +151,7 @@ describe Mongoid::Contextual::Mongo do
152
151
  context "when provided limit" do
153
152
 
154
153
  before do
155
- 2.times { Band.create(name: "Depeche Mode") }
154
+ 2.times { Band.create!(name: "Depeche Mode") }
156
155
  end
157
156
 
158
157
  let(:context) do
@@ -195,11 +194,11 @@ describe Mongoid::Contextual::Mongo do
195
194
  describe "#estimated_count" do
196
195
 
197
196
  let!(:depeche) do
198
- Band.create(name: "Depeche Mode")
197
+ Band.create!(name: "Depeche Mode")
199
198
  end
200
199
 
201
200
  let!(:new_order) do
202
- Band.create(name: "New Order")
201
+ Band.create!(name: "New Order")
203
202
  end
204
203
 
205
204
  let(:criteria) do
@@ -262,11 +261,11 @@ describe Mongoid::Contextual::Mongo do
262
261
  describe "##{method}" do
263
262
 
264
263
  let!(:depeche_mode) do
265
- Band.create(name: "Depeche Mode")
264
+ Band.create!(name: "Depeche Mode")
266
265
  end
267
266
 
268
267
  let!(:new_order) do
269
- Band.create(name: "New Order")
268
+ Band.create!(name: "New Order")
270
269
  end
271
270
 
272
271
  context "when the selector is contraining" do
@@ -367,11 +366,11 @@ describe Mongoid::Contextual::Mongo do
367
366
  describe "##{method}" do
368
367
 
369
368
  let!(:depeche_mode) do
370
- Band.create(name: "Depeche Mode")
369
+ Band.create!(name: "Depeche Mode")
371
370
  end
372
371
 
373
372
  let!(:new_order) do
374
- Band.create(name: "New Order")
373
+ Band.create!(name: "New Order")
375
374
  end
376
375
 
377
376
  context "when the selector is contraining" do
@@ -452,7 +451,7 @@ describe Mongoid::Contextual::Mongo do
452
451
  context 'when the write concern is unacknowledged' do
453
452
 
454
453
  before do
455
- 2.times { Band.create }
454
+ 2.times { Band.create! }
456
455
  end
457
456
 
458
457
  let(:criteria) do
@@ -474,27 +473,83 @@ describe Mongoid::Contextual::Mongo do
474
473
  describe "#distinct" do
475
474
 
476
475
  before do
477
- Band.create(name: "Depeche Mode", years: 30)
478
- Band.create(name: "New Order", years: 25)
476
+ Band.create!(name: "Depeche Mode", years: 30, sales: "1E2")
477
+ Band.create!(name: "New Order", years: 25, sales: "2E3")
478
+ Band.create!(name: "10,000 Maniacs", years: 20, sales: "1E2")
479
479
  end
480
480
 
481
- context "when limiting the result set" do
481
+ with_config_values :legacy_pluck_distinct, true, false do
482
+ context "when limiting the result set" do
482
483
 
483
- let(:criteria) do
484
- Band.where(name: "Depeche Mode")
484
+ let(:criteria) do
485
+ Band.where(name: "Depeche Mode")
486
+ end
487
+
488
+ let(:context) do
489
+ described_class.new(criteria)
490
+ end
491
+
492
+ it "returns the distinct matching fields" do
493
+ expect(context.distinct(:name)).to eq([ "Depeche Mode" ])
494
+ end
485
495
  end
486
496
 
487
- let(:context) do
488
- described_class.new(criteria)
497
+ context "when not limiting the result set" do
498
+
499
+ let(:criteria) do
500
+ Band.criteria
501
+ end
502
+
503
+ let(:context) do
504
+ described_class.new(criteria)
505
+ end
506
+
507
+ it "returns the distinct field values" do
508
+ expect(context.distinct(:name).sort).to eq([ "10,000 Maniacs", "Depeche Mode", "New Order" ].sort)
509
+ end
510
+ end
511
+
512
+ context "when providing an aliased field" do
513
+
514
+ let(:criteria) do
515
+ Band.criteria
516
+ end
517
+
518
+ let(:context) do
519
+ described_class.new(criteria)
520
+ end
521
+
522
+ it "returns the distinct field values" do
523
+ expect(context.distinct(:years).sort).to eq([ 20, 25, 30 ])
524
+ end
489
525
  end
490
526
 
491
- it "returns the distinct matching fields" do
492
- expect(context.distinct(:name)).to eq([ "Depeche Mode" ])
527
+ context 'when a collation is specified' do
528
+ min_server_version '3.4'
529
+
530
+ before do
531
+ Band.create!(name: 'DEPECHE MODE')
532
+ end
533
+
534
+ let(:context) do
535
+ described_class.new(criteria)
536
+ end
537
+
538
+ let(:expected_results) do
539
+ ["10,000 Maniacs", "Depeche Mode", "New Order"]
540
+ end
541
+
542
+ let(:criteria) do
543
+ Band.where({}).collation(locale: 'en_US', strength: 2)
544
+ end
545
+
546
+ it 'applies the collation' do
547
+ expect(context.distinct(:name).sort).to eq(expected_results.sort)
548
+ end
493
549
  end
494
550
  end
495
551
 
496
- context "when not limiting the result set" do
497
-
552
+ context "when providing a demongoizable field" do
498
553
  let(:criteria) do
499
554
  Band.criteria
500
555
  end
@@ -503,47 +558,253 @@ describe Mongoid::Contextual::Mongo do
503
558
  described_class.new(criteria)
504
559
  end
505
560
 
506
- it "returns the distinct field values" do
507
- expect(context.distinct(:name)).to eq([ "Depeche Mode", "New Order" ])
561
+ context "when legacy_pluck_distinct is set" do
562
+ config_override :legacy_pluck_distinct, true
563
+
564
+ it "returns the non-demongoized distinct field values" do
565
+ expect(context.distinct(:sales).sort).to eq([ "1E2", "2E3" ])
566
+ end
567
+ end
568
+
569
+ context "when legacy_pluck_distinct is not set" do
570
+ config_override :legacy_pluck_distinct, false
571
+
572
+ it "returns the non-demongoized distinct field values" do
573
+ expect(context.distinct(:sales).sort).to eq([ BigDecimal("1E2"), BigDecimal("2E3") ])
574
+ end
508
575
  end
509
576
  end
510
577
 
511
- context "when providing an aliased field" do
578
+ context "when getting a localized field" do
579
+ before do
580
+ I18n.locale = :en
581
+ d = Dictionary.create!(description: 'english-text')
582
+ I18n.locale = :de
583
+ d.description = 'deutsch-text'
584
+ d.save!
585
+ end
586
+
587
+ after do
588
+ I18n.locale = :en
589
+ end
512
590
 
513
591
  let(:criteria) do
514
- Band.criteria
592
+ Dictionary.criteria
515
593
  end
516
594
 
517
595
  let(:context) do
518
596
  described_class.new(criteria)
519
597
  end
520
598
 
521
- it "returns the distinct field values" do
522
- expect(context.distinct(:years).sort).to eq([ 25, 30 ])
599
+ context "when getting the field without _translations" do
600
+ context "when legacy_pluck_distinct is set" do
601
+ config_override :legacy_pluck_distinct, true
602
+
603
+ it "gets the full hash" do
604
+ expect(context.distinct(:description)).to eq([{ "de" => "deutsch-text", "en" => "english-text" }])
605
+ end
606
+ end
607
+
608
+ context "when legacy_pluck_distinct is not set" do
609
+ config_override :legacy_pluck_distinct, false
610
+
611
+ it "gets the demongoized localized field" do
612
+ expect(context.distinct(:description)).to eq([ 'deutsch-text' ])
613
+ end
614
+ end
523
615
  end
524
- end
525
616
 
526
- context 'when a collation is specified' do
527
- min_server_version '3.4'
617
+ context "when getting the field with _translations" do
618
+ context "when legacy_pluck_distinct is set" do
619
+ config_override :legacy_pluck_distinct, true
528
620
 
529
- before do
530
- Band.create(name: 'DEPECHE MODE')
621
+ it "gets an empty list" do
622
+ expect(context.distinct(:description_translations)).to eq([])
623
+ end
624
+ end
625
+
626
+ context "when legacy_pluck_distinct is not set" do
627
+ config_override :legacy_pluck_distinct, false
628
+
629
+ it "gets the full hash" do
630
+ expect(context.distinct(:description_translations)).to eq([ { "de" => "deutsch-text", "en" => "english-text" } ])
631
+ end
632
+ end
531
633
  end
532
634
 
533
- let(:context) do
534
- described_class.new(criteria)
635
+ context 'when plucking a specific locale' do
636
+
637
+ let(:distinct) do
638
+ context.distinct(:'description.de')
639
+ end
640
+
641
+ context "when legacy_pluck_distinct is set" do
642
+ config_override :legacy_pluck_distinct, true
643
+
644
+ it 'returns the specific translation' do
645
+ expect(distinct).to eq([ 'deutsch-text' ])
646
+ end
647
+ end
648
+
649
+ context "when legacy_pluck_distinct is not set" do
650
+ config_override :legacy_pluck_distinct, false
651
+
652
+ it 'returns the specific translation' do
653
+ expect(distinct).to eq([ "deutsch-text" ])
654
+ end
655
+ end
535
656
  end
536
657
 
537
- let(:expected_results) do
538
- ["Depeche Mode", "New Order"]
658
+ context 'when plucking a specific locale from _translations field' do
659
+
660
+ let(:distinct) do
661
+ context.distinct(:'description_translations.de')
662
+ end
663
+
664
+ context "when legacy_pluck_distinct is set" do
665
+ config_override :legacy_pluck_distinct, true
666
+
667
+ it 'returns the empty list' do
668
+ expect(distinct).to eq([])
669
+ end
670
+ end
671
+
672
+ context "when legacy_pluck_distinct is not set" do
673
+ config_override :legacy_pluck_distinct, false
674
+
675
+ it 'returns the specific translations' do
676
+ expect(distinct).to eq(['deutsch-text'])
677
+ end
678
+ end
539
679
  end
540
680
 
541
- let(:criteria) do
542
- Band.where({}).collation(locale: 'en_US', strength: 2)
681
+ context 'when fallbacks are enabled with a locale list' do
682
+ require_fallbacks
683
+
684
+ around(:all) do |example|
685
+ prev_fallbacks = I18n.fallbacks.dup
686
+ I18n.fallbacks[:he] = [ :en ]
687
+ example.run
688
+ I18n.fallbacks = prev_fallbacks
689
+ end
690
+
691
+ after do
692
+ I18n.locale = :en
693
+ end
694
+
695
+ let(:distinct) do
696
+ context.distinct(:description).first
697
+ end
698
+
699
+ context "when legacy_pluck_distinct is set" do
700
+ config_override :legacy_pluck_distinct, true
701
+
702
+ it "does not correctly use the fallback" do
703
+ distinct.should == {"de"=>"deutsch-text", "en"=>"english-text"}
704
+ end
705
+ end
706
+
707
+ context "when legacy_pluck_distinct is not set" do
708
+ config_override :legacy_pluck_distinct, false
709
+
710
+ it "correctly uses the fallback" do
711
+ I18n.locale = :en
712
+ d = Dictionary.create!(description: 'english-text')
713
+ I18n.locale = :he
714
+ distinct.should == "english-text"
715
+ end
716
+ end
717
+ end
718
+
719
+ context "when the localized field is embedded" do
720
+ before do
721
+ p = Passport.new
722
+ I18n.locale = :en
723
+ p.name = "Neil"
724
+ I18n.locale = :he
725
+ p.name = "Nissim"
726
+
727
+ Person.create!(passport: p, employer_id: 12345)
728
+ end
729
+
730
+ after do
731
+ I18n.locale = :en
732
+ end
733
+
734
+ let(:criteria) do
735
+ Person.where(employer_id: 12345)
736
+ end
737
+
738
+ let(:context) do
739
+ described_class.new(criteria)
740
+ end
741
+
742
+ let(:distinct) do
743
+ context.distinct("pass.name").first
744
+ end
745
+
746
+ let(:distinct_translations) do
747
+ context.distinct("pass.name_translations").first
748
+ end
749
+
750
+ let(:distinct_translations_field) do
751
+ context.distinct("pass.name_translations.en").first
752
+ end
753
+
754
+ context "when legacy_pluck_distinct is set" do
755
+ config_override :legacy_pluck_distinct, true
756
+
757
+ it "returns the full hash" do
758
+ expect(distinct).to eq({ "en" => "Neil", "he" => "Nissim" })
759
+ end
760
+
761
+ it "returns the empty hash" do
762
+ expect(distinct_translations).to eq(nil)
763
+ end
764
+
765
+ it "returns the empty hash" do
766
+ expect(distinct_translations_field).to eq(nil)
767
+ end
768
+ end
769
+
770
+ context "when legacy_pluck_distinct is not set" do
771
+ config_override :legacy_pluck_distinct, false
772
+
773
+ it "returns the translation for the current locale" do
774
+ expect(distinct).to eq("Nissim")
775
+ end
776
+
777
+ it "returns the full _translation hash" do
778
+ expect(distinct_translations).to eq({ "en" => "Neil", "he" => "Nissim" })
779
+ end
780
+
781
+ it "returns the translation for the requested locale" do
782
+ expect(distinct_translations_field).to eq("Neil")
783
+ end
784
+ end
785
+ end
786
+ end
787
+
788
+ context "when getting an embedded field" do
789
+
790
+ let(:label) { Label.new(sales: "1E2") }
791
+ let!(:band) { Band.create!(label: label) }
792
+ let(:criteria) { Band.where(_id: band.id) }
793
+ let(:context) { described_class.new(criteria) }
794
+
795
+ context "when legacy_pluck_distinct is set" do
796
+ config_override :legacy_pluck_distinct, true
797
+
798
+ it "returns the distinct matching fields" do
799
+ expect(context.distinct("label.sales")).to eq([ "1E2" ])
800
+ end
543
801
  end
544
802
 
545
- it 'applies the collation' do
546
- expect(context.distinct(:name)).to eq(expected_results)
803
+ context "when legacy_pluck_distinct is not set" do
804
+ config_override :legacy_pluck_distinct, false
805
+ it "returns the distinct matching fields" do
806
+ expect(context.distinct("label.sales")).to eq([ BigDecimal("1E2") ])
807
+ end
547
808
  end
548
809
  end
549
810
  end
@@ -551,7 +812,7 @@ describe Mongoid::Contextual::Mongo do
551
812
  describe "#each" do
552
813
 
553
814
  before do
554
- Band.create(name: "Depeche Mode")
815
+ Band.create!(name: "Depeche Mode")
555
816
  end
556
817
 
557
818
  let(:criteria) do
@@ -629,7 +890,7 @@ describe Mongoid::Contextual::Mongo do
629
890
  context "when iterating with next" do
630
891
 
631
892
  before do
632
- 10.times { |i| Band.create(name: "Test #{i}") }
893
+ 10.times { |i| Band.create!(name: "Test #{i}") }
633
894
  end
634
895
 
635
896
  let(:criteria) do
@@ -641,8 +902,21 @@ describe Mongoid::Contextual::Mongo do
641
902
  end
642
903
 
643
904
  it "does not load all documents" do
644
- expect(Mongo::Logger.logger).to receive(:debug?).exactly(2).times.and_call_original
905
+ subscriber = Mrss::EventSubscriber.new
906
+ context.view.client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
907
+
645
908
  enum.next
909
+
910
+ find_events = subscriber.all_events.select do |evt|
911
+ evt.command_name == 'find'
912
+ end
913
+ expect(find_events.length).to be(2)
914
+ get_more_events = subscriber.all_events.select do |evt|
915
+ evt.command_name == 'getMore'
916
+ end
917
+ expect(get_more_events.length).to be(0)
918
+ ensure
919
+ context.view.client.unsubscribe(Mongo::Monitoring::COMMAND, subscriber)
646
920
  end
647
921
  end
648
922
  end
@@ -651,9 +925,9 @@ describe Mongoid::Contextual::Mongo do
651
925
  context 'when the criteria has a parent document' do
652
926
 
653
927
  before do
654
- Post.create(person: person)
655
- Post.create(person: person)
656
- Post.create(person: person)
928
+ Post.create!(person: person)
929
+ Post.create!(person: person)
930
+ Post.create!(person: person)
657
931
  end
658
932
 
659
933
  let(:person) do
@@ -700,7 +974,7 @@ describe Mongoid::Contextual::Mongo do
700
974
  describe "#exists?" do
701
975
 
702
976
  before do
703
- Band.create(name: "Depeche Mode")
977
+ Band.create!(name: "Depeche Mode")
704
978
  end
705
979
 
706
980
  context "when the count is zero" do
@@ -813,11 +1087,11 @@ describe Mongoid::Contextual::Mongo do
813
1087
  describe "#find_one_and_replace" do
814
1088
 
815
1089
  let!(:depeche) do
816
- Band.create(name: "Depeche Mode")
1090
+ Band.create!(name: "Depeche Mode")
817
1091
  end
818
1092
 
819
1093
  let!(:tool) do
820
- Band.create(name: "Tool")
1094
+ Band.create!(name: "Tool")
821
1095
  end
822
1096
 
823
1097
  context "when the selector matches" do
@@ -969,11 +1243,11 @@ describe Mongoid::Contextual::Mongo do
969
1243
  describe "#find_one_and_update" do
970
1244
 
971
1245
  let!(:depeche) do
972
- Band.create(name: "Depeche Mode")
1246
+ Band.create!(name: "Depeche Mode")
973
1247
  end
974
1248
 
975
1249
  let!(:tool) do
976
- Band.create(name: "Tool")
1250
+ Band.create!(name: "Tool")
977
1251
  end
978
1252
 
979
1253
  context "when the selector matches" do
@@ -1122,7 +1396,7 @@ describe Mongoid::Contextual::Mongo do
1122
1396
  describe "#find_one_and_delete" do
1123
1397
 
1124
1398
  let!(:depeche) do
1125
- Band.create(name: "Depeche Mode")
1399
+ Band.create!(name: "Depeche Mode")
1126
1400
  end
1127
1401
 
1128
1402
  let(:criteria) do
@@ -1201,11 +1475,15 @@ describe Mongoid::Contextual::Mongo do
1201
1475
  describe "##{method}" do
1202
1476
 
1203
1477
  let!(:depeche_mode) do
1204
- Band.create(name: "Depeche Mode")
1478
+ Band.create!(name: "Depeche Mode")
1205
1479
  end
1206
1480
 
1207
1481
  let!(:new_order) do
1208
- Band.create(name: "New Order")
1482
+ Band.create!(name: "New Order")
1483
+ end
1484
+
1485
+ let!(:rolling_stones) do
1486
+ Band.create!(name: "The Rolling Stones")
1209
1487
  end
1210
1488
 
1211
1489
  context "when the context is not cached" do
@@ -1248,14 +1526,14 @@ describe Mongoid::Contextual::Mongo do
1248
1526
  context "when there is sort on the context" do
1249
1527
 
1250
1528
  it "follows the main sort" do
1251
- expect(context.send(method)).to eq(new_order)
1529
+ expect(context.send(method)).to eq(rolling_stones)
1252
1530
  end
1253
1531
  end
1254
1532
 
1255
1533
  context "when subsequently calling #last" do
1256
1534
 
1257
1535
  it "returns the correct document" do
1258
- expect(context.send(method)).to eq(new_order)
1536
+ expect(context.send(method)).to eq(rolling_stones)
1259
1537
  expect(context.last).to eq(depeche_mode)
1260
1538
  end
1261
1539
  end
@@ -1280,23 +1558,22 @@ describe Mongoid::Contextual::Mongo do
1280
1558
 
1281
1559
  it 'returns the last document, sorted by _id' do
1282
1560
  expect(context.send(method)).to eq(depeche_mode)
1283
- expect(context.last).to eq(new_order)
1561
+ expect(context.last).to eq(rolling_stones)
1284
1562
  end
1285
1563
  end
1286
1564
 
1287
- context 'with option { sort: :none }' do
1288
-
1565
+ context 'with option { id_sort: :none }' do
1289
1566
  let(:opts) do
1290
1567
  { id_sort: :none }
1291
1568
  end
1292
1569
 
1293
- it 'does not apply the sort on _id' do
1570
+ it 'applies the sort on _id' do
1294
1571
  expect(context.send(method, opts)).to eq(depeche_mode)
1295
1572
  end
1296
1573
 
1297
1574
  context 'when calling #last' do
1298
1575
 
1299
- it 'does not apply a sort on _id' do
1576
+ it 'doesn\'t apply a sort on _id' do
1300
1577
  expect(context.send(method, opts)).to eq(depeche_mode)
1301
1578
  expect(context.last(opts)).to eq(depeche_mode)
1302
1579
  end
@@ -1314,33 +1591,32 @@ describe Mongoid::Contextual::Mongo do
1314
1591
  described_class.new(criteria)
1315
1592
  end
1316
1593
 
1317
-
1318
1594
  it 'applies the criteria sort' do
1319
- expect(context.send(method)).to eq(new_order)
1595
+ expect(context.send(method)).to eq(rolling_stones)
1320
1596
  end
1321
1597
 
1322
1598
  context 'when calling #last' do
1323
1599
 
1324
1600
  it 'applies the criteria sort' do
1325
- expect(context.send(method)).to eq(new_order)
1601
+ expect(context.send(method)).to eq(rolling_stones)
1326
1602
  expect(context.last).to eq(depeche_mode)
1327
1603
  end
1328
1604
  end
1329
1605
 
1330
- context 'with option { sort: :none }' do
1606
+ context 'with option { id_sort: :none }' do
1331
1607
 
1332
1608
  let(:opts) do
1333
1609
  { id_sort: :none }
1334
1610
  end
1335
1611
 
1336
- it 'applies the criteria sort' do
1337
- expect(context.send(method, opts)).to eq(new_order)
1612
+ it 'uses the preexisting sort' do
1613
+ expect(context.send(method, opts)).to eq(rolling_stones)
1338
1614
  end
1339
1615
 
1340
1616
  context 'when calling #last' do
1341
1617
 
1342
- it 'applies the criteria sort' do
1343
- expect(context.send(method, opts)).to eq(new_order)
1618
+ it 'uses the preexisting sort' do
1619
+ expect(context.send(method, opts)).to eq(rolling_stones)
1344
1620
  expect(context.last(opts)).to eq(depeche_mode)
1345
1621
  end
1346
1622
  end
@@ -1360,14 +1636,14 @@ describe Mongoid::Contextual::Mongo do
1360
1636
  context "when there is sort on the context" do
1361
1637
 
1362
1638
  it "follows the main sort" do
1363
- expect(context.send(method)).to eq(new_order)
1639
+ expect(context.send(method)).to eq(rolling_stones)
1364
1640
  end
1365
1641
  end
1366
1642
 
1367
1643
  context "when subsequently calling #last" do
1368
1644
 
1369
1645
  it "returns the correct document" do
1370
- expect(context.send(method)).to eq(new_order)
1646
+ expect(context.send(method)).to eq(rolling_stones)
1371
1647
  expect(context.last).to eq(depeche_mode)
1372
1648
  end
1373
1649
  end
@@ -1407,95 +1683,769 @@ describe Mongoid::Contextual::Mongo do
1407
1683
  end
1408
1684
  end
1409
1685
  end
1410
- end
1411
- end
1412
-
1413
- describe "#initialize" do
1414
-
1415
- let(:criteria) do
1416
- Band.where(name: "Depeche Mode").no_timeout
1417
- end
1418
1686
 
1419
- let(:context) do
1420
- described_class.new(criteria)
1421
- end
1422
-
1423
- it "sets the criteria" do
1424
- expect(context.criteria).to eq(criteria)
1425
- end
1687
+ context "when including a limit" do
1426
1688
 
1427
- it "sets the klass" do
1428
- expect(context.klass).to eq(Band)
1429
- end
1689
+ context "when the context is not cached" do
1430
1690
 
1431
- it "sets the view" do
1432
- expect(context.view).to be_a(Mongo::Collection::View)
1433
- end
1691
+ let(:context) do
1692
+ described_class.new(criteria)
1693
+ end
1434
1694
 
1435
- it "sets the view selector" do
1436
- expect(context.view.selector).to eq({ "name" => "Depeche Mode" })
1437
- end
1438
- end
1695
+ context "when the limit is 1" do
1696
+ let(:criteria) do
1697
+ Band.criteria
1698
+ end
1439
1699
 
1440
- [ :length, :size ].each do |method|
1700
+ let(:docs) do
1701
+ context.send(method, 1)
1702
+ end
1441
1703
 
1442
- describe "##{method}" do
1704
+ it "returns an array of documents" do
1705
+ expect(docs).to eq([ depeche_mode ])
1706
+ end
1707
+ end
1443
1708
 
1444
- before do
1445
- Band.create!(name: "Depeche Mode")
1446
- Band.create!(name: "New Order")
1447
- end
1709
+ context "when the limit is >1" do
1710
+ let(:criteria) do
1711
+ Band.criteria
1712
+ end
1448
1713
 
1449
- context "when the criteria has a limit" do
1714
+ let(:docs) do
1715
+ context.send(method, 2)
1716
+ end
1450
1717
 
1451
- let(:criteria) do
1452
- Band.limit(1)
1453
- end
1718
+ it "returns the number of documents in order" do
1719
+ expect(docs).to eq([ depeche_mode, new_order ])
1720
+ end
1721
+ end
1454
1722
 
1455
- let(:context) do
1456
- described_class.new(criteria)
1457
- end
1723
+ context 'when the criteria has a collation' do
1724
+ min_server_version '3.4'
1458
1725
 
1459
- it "returns the number of documents that match" do
1460
- expect(context.send(method)).to eq(2)
1461
- end
1726
+ let(:criteria) do
1727
+ Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
1728
+ end
1462
1729
 
1463
- context "when calling more than once" do
1464
- it "returns the cached value for subsequent calls" do
1465
- expect(context.view).to receive(:count_documents).once.and_return(2)
1466
- 2.times { expect(context.send(method)).to eq(2) }
1730
+ it "returns the first matching document" do
1731
+ expect(context.send(method, 1)).to eq([ depeche_mode ])
1732
+ end
1467
1733
  end
1468
1734
  end
1469
1735
 
1470
- context "when the results have been iterated over" do
1471
-
1472
- before do
1473
- context.entries
1474
- end
1736
+ context "when the context is cached" do
1475
1737
 
1476
- it "returns the cached value for all calls" do
1477
- expect(context.view).to receive(:count_documents).once.and_return(2)
1478
- expect(context.send(method)).to eq(2)
1738
+ let(:context) do
1739
+ described_class.new(criteria)
1479
1740
  end
1480
1741
 
1481
- context "when the results have been iterated over multiple times" do
1742
+ context "when the whole context is loaded" do
1482
1743
 
1483
1744
  before do
1484
- context.entries
1745
+ context.to_a
1485
1746
  end
1486
1747
 
1487
- it "resets the length on each full iteration" do
1488
- expect(context.size).to eq(2)
1489
- end
1490
- end
1491
- end
1492
- end
1748
+ context "when all of the documents are cached" do
1493
1749
 
1494
- context "when the criteria has no limit" do
1750
+ let(:criteria) do
1751
+ Band.all.cache
1752
+ end
1495
1753
 
1496
- let(:criteria) do
1497
- Band.where(name: "Depeche Mode")
1498
- end
1754
+ context "when requesting all of the documents" do
1755
+
1756
+ let(:docs) do
1757
+ context.send(method, 3)
1758
+ end
1759
+
1760
+ it "returns all of the documents without touching the database" do
1761
+ expect(context).to receive(:view).never
1762
+ expect(docs).to eq([ depeche_mode, new_order, rolling_stones ])
1763
+ end
1764
+ end
1765
+
1766
+ context "when requesting fewer than all of the documents" do
1767
+
1768
+ let(:docs) do
1769
+ context.send(method, 2)
1770
+ end
1771
+
1772
+ it "returns all of the documents without touching the database" do
1773
+ expect(context).to receive(:view).never
1774
+ expect(docs).to eq([ depeche_mode, new_order ])
1775
+ end
1776
+ end
1777
+ end
1778
+
1779
+ context "when only one document is cached" do
1780
+
1781
+ let(:criteria) do
1782
+ Band.where(name: "Depeche Mode").cache
1783
+ end
1784
+
1785
+ context "when requesting one document" do
1786
+
1787
+ let(:docs) do
1788
+ context.send(method, 1)
1789
+ end
1790
+
1791
+ it "returns one document without touching the database" do
1792
+ expect(context).to receive(:view).never
1793
+ expect(docs).to eq([ depeche_mode ])
1794
+ end
1795
+ end
1796
+ end
1797
+ end
1798
+
1799
+ context "when the first method was called before" do
1800
+
1801
+ let(:context) do
1802
+ described_class.new(criteria)
1803
+ end
1804
+
1805
+ let(:criteria) do
1806
+ Band.all.cache
1807
+ end
1808
+
1809
+ before do
1810
+ context.first(before_limit)
1811
+ end
1812
+
1813
+ let(:docs) do
1814
+ context.send(method, limit)
1815
+ end
1816
+
1817
+ context "when getting all of the documents before" do
1818
+ let(:before_limit) { 3 }
1819
+
1820
+ context "when getting all of the documents" do
1821
+ let(:limit) { 3 }
1822
+
1823
+ it "returns all documents without touching the database" do
1824
+ expect(context).to receive(:view).never
1825
+ expect(docs).to eq([ depeche_mode, new_order, rolling_stones ])
1826
+ end
1827
+ end
1828
+
1829
+ context "when getting fewer documents" do
1830
+ let(:limit) { 2 }
1831
+
1832
+ it "returns the correct documents without touching the database" do
1833
+ expect(context).to receive(:view).never
1834
+ expect(docs).to eq([ depeche_mode, new_order ])
1835
+ end
1836
+ end
1837
+ end
1838
+
1839
+ context "when getting fewer documents before" do
1840
+ let(:before_limit) { 2 }
1841
+
1842
+ context "when getting the same number of documents" do
1843
+ let(:limit) { 2 }
1844
+
1845
+ it "returns the correct documents without touching the database" do
1846
+ expect(context).to receive(:view).never
1847
+ expect(docs).to eq([ depeche_mode, new_order ])
1848
+ end
1849
+ end
1850
+
1851
+ context "when getting more documents" do
1852
+ let(:limit) { 3 }
1853
+
1854
+ it "returns the correct documents and touches the database" do
1855
+ expect(context).to receive(:view).exactly(3).times.and_call_original
1856
+ expect(docs).to eq([ depeche_mode, new_order, rolling_stones ])
1857
+ end
1858
+ end
1859
+ end
1860
+
1861
+ context "when getting one document before" do
1862
+ let(:before_limit) { 1 }
1863
+
1864
+ context "when getting one document" do
1865
+ let(:limit) { 1 }
1866
+
1867
+ it "returns the correct documents without touching the database" do
1868
+ expect(context).to receive(:view).never
1869
+ expect(docs).to eq([ depeche_mode ])
1870
+ end
1871
+ end
1872
+
1873
+ context "when getting more than one document" do
1874
+ let(:limit) { 3 }
1875
+
1876
+ it "returns the correct documents and touches the database" do
1877
+ expect(context).to receive(:view).exactly(3).times.and_call_original
1878
+ expect(docs).to eq([ depeche_mode, new_order, rolling_stones ])
1879
+ end
1880
+ end
1881
+ end
1882
+ end
1883
+ end
1884
+ end
1885
+
1886
+ context "when calling #first then #last" do
1887
+
1888
+ let(:context) do
1889
+ described_class.new(criteria)
1890
+ end
1891
+
1892
+ let(:criteria) do
1893
+ Band.all.cache
1894
+ end
1895
+
1896
+ before do
1897
+ context.first(before_limit)
1898
+ end
1899
+
1900
+ let(:docs) do
1901
+ context.last(limit)
1902
+ end
1903
+
1904
+ context "when getting one from the beginning and one from the end" do
1905
+ let(:before_limit) { 2 }
1906
+ let(:limit) { 1 }
1907
+
1908
+ it "gets the correct document" do
1909
+ expect(docs).to eq([rolling_stones])
1910
+ end
1911
+ end
1912
+ end
1913
+ end
1914
+ end
1915
+
1916
+ describe "#last" do
1917
+ let!(:depeche_mode) do
1918
+ Band.create!(name: "Depeche Mode")
1919
+ end
1920
+
1921
+ let!(:new_order) do
1922
+ Band.create!(name: "New Order")
1923
+ end
1924
+
1925
+ let!(:rolling_stones) do
1926
+ Band.create!(name: "The Rolling Stones")
1927
+ end
1928
+
1929
+ context "when the context is not cached" do
1930
+
1931
+ let(:criteria) do
1932
+ Band.where(name: "Depeche Mode")
1933
+ end
1934
+
1935
+ let(:context) do
1936
+ described_class.new(criteria)
1937
+ end
1938
+
1939
+ it "returns the last matching document" do
1940
+ expect(context.last).to eq(depeche_mode)
1941
+ end
1942
+
1943
+ context 'when the criteria has a collation' do
1944
+ min_server_version '3.4'
1945
+
1946
+ let(:criteria) do
1947
+ Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
1948
+ end
1949
+
1950
+ it "returns the last matching document" do
1951
+ expect(context.last).to eq(depeche_mode)
1952
+ end
1953
+ end
1954
+ end
1955
+
1956
+ context "when using .desc" do
1957
+
1958
+ let(:criteria) do
1959
+ Band.desc(:name)
1960
+ end
1961
+
1962
+ let(:context) do
1963
+ described_class.new(criteria)
1964
+ end
1965
+
1966
+ context "when there is sort on the context" do
1967
+
1968
+ it "follows the main sort" do
1969
+ expect(context.last).to eq(depeche_mode)
1970
+ end
1971
+ end
1972
+
1973
+ context "when subsequently calling #first" do
1974
+
1975
+ it "returns the correct document" do
1976
+ expect(context.last).to eq(depeche_mode)
1977
+ expect(context.first).to eq(rolling_stones)
1978
+ end
1979
+ end
1980
+ end
1981
+
1982
+ context 'when the criteria has no sort' do
1983
+
1984
+ let(:criteria) do
1985
+ Band.all
1986
+ end
1987
+
1988
+ let(:context) do
1989
+ described_class.new(criteria)
1990
+ end
1991
+
1992
+ it 'applies a sort on _id' do
1993
+ expect(context.last).to eq(rolling_stones)
1994
+ end
1995
+
1996
+ context 'when calling #first' do
1997
+
1998
+ it 'returns the first document, sorted by _id' do
1999
+ pending "MONGOID-5416"
2000
+ expect(context.last).to eq(rolling_stones)
2001
+ expect(context.first).to eq(depeche_mode)
2002
+ end
2003
+ end
2004
+
2005
+ context 'with option { id_sort: :none }' do
2006
+ let(:opts) do
2007
+ { id_sort: :none }
2008
+ end
2009
+
2010
+ it 'doesn\'t apply the sort on _id' do
2011
+ expect(context.last(opts)).to eq(depeche_mode)
2012
+ end
2013
+
2014
+ context 'when calling #first' do
2015
+
2016
+ it 'doesn\'t apply the sort on _id' do
2017
+ pending "MONGOID-5416"
2018
+ expect(context.last(opts)).to eq(rolling_stones)
2019
+ expect(context.first(opts)).to eq(depeche_mode)
2020
+ end
2021
+ end
2022
+ end
2023
+ end
2024
+
2025
+ context 'when the criteria has a sort' do
2026
+
2027
+ let(:criteria) do
2028
+ Band.desc(:name)
2029
+ end
2030
+
2031
+ let(:context) do
2032
+ described_class.new(criteria)
2033
+ end
2034
+
2035
+
2036
+ it 'applies the criteria sort' do
2037
+ expect(context.last).to eq(depeche_mode)
2038
+ end
2039
+
2040
+ context 'when calling #first' do
2041
+
2042
+ it 'applies the criteria sort' do
2043
+ expect(context.last).to eq(depeche_mode)
2044
+ expect(context.first).to eq(rolling_stones)
2045
+ end
2046
+ end
2047
+
2048
+ context 'with option { id_sort: :none }' do
2049
+
2050
+ let(:opts) do
2051
+ { id_sort: :none }
2052
+ end
2053
+
2054
+ it 'uses the preexisting sort' do
2055
+ expect(context.last(opts)).to eq(depeche_mode)
2056
+ end
2057
+
2058
+ context 'when calling #first' do
2059
+
2060
+ it 'uses the preexisting sort' do
2061
+ expect(context.last(opts)).to eq(depeche_mode)
2062
+ expect(context.first(opts)).to eq(rolling_stones)
2063
+ end
2064
+ end
2065
+ end
2066
+ end
2067
+
2068
+ context "when using .sort" do
2069
+
2070
+ let(:criteria) do
2071
+ Band.all.sort(:name => -1).criteria
2072
+ end
2073
+
2074
+ let(:context) do
2075
+ described_class.new(criteria)
2076
+ end
2077
+
2078
+ context "when there is sort on the context" do
2079
+
2080
+ it "follows the main sort" do
2081
+ expect(context.last).to eq(depeche_mode)
2082
+ end
2083
+ end
2084
+
2085
+ context "when subsequently calling #first" do
2086
+
2087
+ it "returns the correct document" do
2088
+ expect(context.last).to eq(depeche_mode)
2089
+ expect(context.first).to eq(rolling_stones)
2090
+ end
2091
+ end
2092
+ end
2093
+
2094
+ context "when the context is cached" do
2095
+
2096
+ let(:criteria) do
2097
+ Band.where(name: "Depeche Mode").cache
2098
+ end
2099
+
2100
+ let(:context) do
2101
+ described_class.new(criteria)
2102
+ end
2103
+
2104
+ context "when the cache is loaded" do
2105
+
2106
+ before do
2107
+ context.to_a
2108
+ end
2109
+
2110
+ it "returns the last document without touching the database" do
2111
+ expect(context).to receive(:view).never
2112
+ expect(context.last).to eq(depeche_mode)
2113
+ end
2114
+ end
2115
+
2116
+ context "when last method was called before" do
2117
+
2118
+ before do
2119
+ context.last
2120
+ end
2121
+
2122
+ it "returns the last document without touching the database" do
2123
+ expect(context).to receive(:view).never
2124
+ expect(context.last).to eq(depeche_mode)
2125
+ end
2126
+ end
2127
+ end
2128
+
2129
+ context "when including a limit" do
2130
+
2131
+ context "when the context is not cached" do
2132
+
2133
+ let(:context) do
2134
+ described_class.new(criteria)
2135
+ end
2136
+
2137
+ context "when the limit is 1" do
2138
+ let(:criteria) do
2139
+ Band.criteria
2140
+ end
2141
+
2142
+ let(:docs) do
2143
+ context.last(1)
2144
+ end
2145
+
2146
+ it "returns an array of documents" do
2147
+ expect(docs).to eq([ rolling_stones ])
2148
+ end
2149
+ end
2150
+
2151
+ context "when the limit is >1" do
2152
+ let(:criteria) do
2153
+ Band.criteria
2154
+ end
2155
+
2156
+ let(:docs) do
2157
+ context.last(2)
2158
+ end
2159
+
2160
+ it "returns the number of documents in order" do
2161
+ expect(docs).to eq([ new_order, rolling_stones ])
2162
+ end
2163
+ end
2164
+
2165
+ context 'when the criteria has a collation' do
2166
+ min_server_version '3.4'
2167
+
2168
+ let(:criteria) do
2169
+ Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
2170
+ end
2171
+
2172
+ it "returns the first matching document" do
2173
+ expect(context.last(1)).to eq([ depeche_mode ])
2174
+ end
2175
+ end
2176
+ end
2177
+
2178
+ context "when the context is cached" do
2179
+
2180
+ let(:context) do
2181
+ described_class.new(criteria)
2182
+ end
2183
+
2184
+ context "when the whole context is loaded" do
2185
+
2186
+ before do
2187
+ context.to_a
2188
+ end
2189
+
2190
+ context "when all of the documents are cached" do
2191
+
2192
+ let(:criteria) do
2193
+ Band.all.cache
2194
+ end
2195
+
2196
+ context "when requesting all of the documents" do
2197
+
2198
+ let(:docs) do
2199
+ context.last(3)
2200
+ end
2201
+
2202
+ it "returns all of the documents without touching the database" do
2203
+ expect(context).to receive(:view).never
2204
+ expect(docs).to eq([ depeche_mode, new_order, rolling_stones ])
2205
+ end
2206
+ end
2207
+
2208
+ context "when requesting fewer than all of the documents" do
2209
+
2210
+ let(:docs) do
2211
+ context.last(2)
2212
+ end
2213
+
2214
+ it "returns all of the documents without touching the database" do
2215
+ expect(context).to receive(:view).never
2216
+ expect(docs).to eq([ new_order, rolling_stones ])
2217
+ end
2218
+ end
2219
+ end
2220
+
2221
+ context "when only one document is cached" do
2222
+
2223
+ let(:criteria) do
2224
+ Band.where(name: "Depeche Mode").cache
2225
+ end
2226
+
2227
+ context "when requesting one document" do
2228
+
2229
+ let(:docs) do
2230
+ context.last(1)
2231
+ end
2232
+
2233
+ it "returns one document without touching the database" do
2234
+ expect(context).to receive(:view).never
2235
+ expect(docs).to eq([ depeche_mode ])
2236
+ end
2237
+ end
2238
+ end
2239
+ end
2240
+
2241
+ context "when the last method was called before" do
2242
+
2243
+ let(:context) do
2244
+ described_class.new(criteria)
2245
+ end
2246
+
2247
+ let(:criteria) do
2248
+ Band.all.cache
2249
+ end
2250
+
2251
+ before do
2252
+ context.last(before_limit)
2253
+ end
2254
+
2255
+ let(:docs) do
2256
+ context.last(limit)
2257
+ end
2258
+
2259
+ context "when getting all of the documents before" do
2260
+ let(:before_limit) { 3 }
2261
+
2262
+ context "when getting all of the documents" do
2263
+ let(:limit) { 3 }
2264
+
2265
+ it "returns all documents without touching the database" do
2266
+ expect(context).to receive(:view).never
2267
+ expect(docs).to eq([ depeche_mode, new_order, rolling_stones ])
2268
+ end
2269
+ end
2270
+
2271
+ context "when getting fewer documents" do
2272
+ let(:limit) { 2 }
2273
+
2274
+ it "returns the correct documents without touching the database" do
2275
+ expect(context).to receive(:view).never
2276
+ expect(docs).to eq([ new_order, rolling_stones ])
2277
+ end
2278
+ end
2279
+ end
2280
+
2281
+ context "when getting fewer documents before" do
2282
+ let(:before_limit) { 2 }
2283
+
2284
+ context "when getting the same number of documents" do
2285
+ let(:limit) { 2 }
2286
+
2287
+ it "returns the correct documents without touching the database" do
2288
+ expect(context).to receive(:view).never
2289
+ expect(docs).to eq([ new_order, rolling_stones ])
2290
+ end
2291
+ end
2292
+
2293
+ context "when getting more documents" do
2294
+ let(:limit) { 3 }
2295
+
2296
+ it "returns the correct documents and touches the database" do
2297
+ expect(context).to receive(:view).twice.and_call_original
2298
+ expect(docs).to eq([ depeche_mode, new_order, rolling_stones ])
2299
+ end
2300
+ end
2301
+ end
2302
+
2303
+ context "when getting one document before" do
2304
+ let(:before_limit) { 1 }
2305
+
2306
+ context "when getting one document" do
2307
+ let(:limit) { 1 }
2308
+
2309
+ it "returns the correct documents without touching the database" do
2310
+ expect(context).to receive(:view).never
2311
+ expect(docs).to eq([ rolling_stones ])
2312
+ end
2313
+ end
2314
+
2315
+ context "when getting more than one document" do
2316
+ let(:limit) { 3 }
2317
+
2318
+ it "returns the correct documents and touches the database" do
2319
+ expect(context).to receive(:view).twice.and_call_original
2320
+ expect(docs).to eq([ depeche_mode, new_order, rolling_stones ])
2321
+ end
2322
+ end
2323
+ end
2324
+ end
2325
+ end
2326
+ end
2327
+
2328
+ context "when calling #last then #first" do
2329
+
2330
+ let(:context) do
2331
+ described_class.new(criteria)
2332
+ end
2333
+
2334
+ let(:criteria) do
2335
+ Band.all.cache
2336
+ end
2337
+
2338
+ before do
2339
+ context.last(before_limit)
2340
+ end
2341
+
2342
+ let(:docs) do
2343
+ context.first(limit)
2344
+ end
2345
+
2346
+ context "when getting one from the beginning and one from the end" do
2347
+ let(:before_limit) { 2 }
2348
+ let(:limit) { 1 }
2349
+
2350
+ it "hits the database" do
2351
+ expect(context).to receive(:view).exactly(3).times.and_call_original
2352
+ docs
2353
+ end
2354
+
2355
+ it "gets the correct document" do
2356
+ pending "MONGOID-5416"
2357
+ expect(docs).to eq([ depeche_mode ])
2358
+ end
2359
+ end
2360
+ end
2361
+ end
2362
+
2363
+ describe "#initialize" do
2364
+
2365
+ let(:criteria) do
2366
+ Band.where(name: "Depeche Mode").no_timeout
2367
+ end
2368
+
2369
+ let(:context) do
2370
+ described_class.new(criteria)
2371
+ end
2372
+
2373
+ it "sets the criteria" do
2374
+ expect(context.criteria).to eq(criteria)
2375
+ end
2376
+
2377
+ it "sets the klass" do
2378
+ expect(context.klass).to eq(Band)
2379
+ end
2380
+
2381
+ it "sets the view" do
2382
+ expect(context.view).to be_a(Mongo::Collection::View)
2383
+ end
2384
+
2385
+ it "sets the view selector" do
2386
+ expect(context.view.selector).to eq({ "name" => "Depeche Mode" })
2387
+ end
2388
+ end
2389
+
2390
+ [ :length, :size ].each do |method|
2391
+
2392
+ describe "##{method}" do
2393
+
2394
+ before do
2395
+ Band.create!(name: "Depeche Mode")
2396
+ Band.create!(name: "New Order")
2397
+ end
2398
+
2399
+ context "when the criteria has a limit" do
2400
+
2401
+ let(:criteria) do
2402
+ Band.limit(1)
2403
+ end
2404
+
2405
+ let(:context) do
2406
+ described_class.new(criteria)
2407
+ end
2408
+
2409
+ it "returns the number of documents that match" do
2410
+ expect(context.send(method)).to eq(2)
2411
+ end
2412
+
2413
+ context "when calling more than once" do
2414
+ it "returns the cached value for subsequent calls" do
2415
+ expect(context.view).to receive(:count_documents).once.and_return(2)
2416
+ 2.times { expect(context.send(method)).to eq(2) }
2417
+ end
2418
+ end
2419
+
2420
+ context "when the results have been iterated over" do
2421
+
2422
+ before do
2423
+ context.entries
2424
+ end
2425
+
2426
+ it "returns the cached value for all calls" do
2427
+ expect(context.view).to receive(:count_documents).once.and_return(2)
2428
+ expect(context.send(method)).to eq(2)
2429
+ end
2430
+
2431
+ context "when the results have been iterated over multiple times" do
2432
+
2433
+ before do
2434
+ context.entries
2435
+ end
2436
+
2437
+ it "resets the length on each full iteration" do
2438
+ expect(context.size).to eq(2)
2439
+ end
2440
+ end
2441
+ end
2442
+ end
2443
+
2444
+ context "when the criteria has no limit" do
2445
+
2446
+ let(:criteria) do
2447
+ Band.where(name: "Depeche Mode")
2448
+ end
1499
2449
 
1500
2450
  let(:context) do
1501
2451
  described_class.new(criteria)
@@ -1541,11 +2491,11 @@ describe Mongoid::Contextual::Mongo do
1541
2491
  describe "#limit" do
1542
2492
 
1543
2493
  let!(:depeche_mode) do
1544
- Band.create(name: "Depeche Mode")
2494
+ Band.create!(name: "Depeche Mode")
1545
2495
  end
1546
2496
 
1547
2497
  let!(:new_order) do
1548
- Band.create(name: "New Order")
2498
+ Band.create!(name: "New Order")
1549
2499
  end
1550
2500
 
1551
2501
  let(:criteria) do
@@ -1561,11 +2511,85 @@ describe Mongoid::Contextual::Mongo do
1561
2511
  end
1562
2512
  end
1563
2513
 
2514
+ describe "#take" do
2515
+
2516
+ let!(:depeche_mode) do
2517
+ Band.create!(name: "Depeche Mode")
2518
+ end
2519
+
2520
+ let!(:new_order) do
2521
+ Band.create!(name: "New Order")
2522
+ end
2523
+
2524
+ let!(:rolling_stones) do
2525
+ Band.create!(name: "The Rolling Stones")
2526
+ end
2527
+
2528
+ let(:criteria) do
2529
+ Band.all
2530
+ end
2531
+
2532
+ let(:context) do
2533
+ described_class.new(criteria)
2534
+ end
2535
+
2536
+ it "takes the correct number results" do
2537
+ expect(context.take(2)).to eq([ depeche_mode, new_order ])
2538
+ end
2539
+
2540
+ it "returns an array when passing 1" do
2541
+ expect(context.take(1)).to eq([ depeche_mode ])
2542
+ end
2543
+
2544
+ it "does not return an array when not passing an argument" do
2545
+ expect(context.take).to eq(depeche_mode)
2546
+ end
2547
+
2548
+ it "returns all the documents taking more than whats in the db" do
2549
+ expect(context.take(5)).to eq([ depeche_mode, new_order, rolling_stones ])
2550
+ end
2551
+ end
2552
+
2553
+ describe "#take!" do
2554
+
2555
+ let!(:depeche_mode) do
2556
+ Band.create!(name: "Depeche Mode")
2557
+ end
2558
+
2559
+ let!(:new_order) do
2560
+ Band.create!(name: "New Order")
2561
+ end
2562
+
2563
+ let!(:rolling_stones) do
2564
+ Band.create!(name: "The Rolling Stones")
2565
+ end
2566
+
2567
+ let(:criteria) do
2568
+ Band.all
2569
+ end
2570
+
2571
+ let(:context) do
2572
+ described_class.new(criteria)
2573
+ end
2574
+
2575
+ it "takes the first document" do
2576
+ expect(context.take!).to eq(depeche_mode)
2577
+ end
2578
+
2579
+ context "when there are no documents" do
2580
+ it "raises an error" do
2581
+ expect do
2582
+ Person.take!
2583
+ end.to raise_error(Mongoid::Errors::DocumentNotFound)
2584
+ end
2585
+ end
2586
+ end
2587
+
1564
2588
  describe "#map" do
1565
2589
 
1566
2590
  before do
1567
- Band.create(name: "Depeche Mode")
1568
- Band.create(name: "New Order")
2591
+ Band.create!(name: "Depeche Mode")
2592
+ Band.create!(name: "New Order")
1569
2593
  end
1570
2594
 
1571
2595
  let(:criteria) do
@@ -1578,7 +2602,8 @@ describe Mongoid::Contextual::Mongo do
1578
2602
 
1579
2603
  context "when passed the symbol field name" do
1580
2604
 
1581
- it "performs mapping" do
2605
+ it "performs mapping and warns" do
2606
+ expect(Mongoid::Warnings).to receive(:warn_map_field_deprecated)
1582
2607
  expect(context.map(:name)).to eq ["Depeche Mode", "New Order"]
1583
2608
  end
1584
2609
  end
@@ -1594,11 +2619,11 @@ describe Mongoid::Contextual::Mongo do
1594
2619
  describe "#map_reduce" do
1595
2620
 
1596
2621
  let!(:depeche_mode) do
1597
- Band.create(name: "Depeche Mode", likes: 200)
2622
+ Band.create!(name: "Depeche Mode", likes: 200)
1598
2623
  end
1599
2624
 
1600
2625
  let!(:tool) do
1601
- Band.create(name: "Tool", likes: 100)
2626
+ Band.create!(name: "Tool", likes: 100)
1602
2627
  end
1603
2628
 
1604
2629
  let(:map) do
@@ -2023,11 +3048,11 @@ describe Mongoid::Contextual::Mongo do
2023
3048
  describe "#skip" do
2024
3049
 
2025
3050
  let!(:depeche_mode) do
2026
- Band.create(name: "Depeche Mode")
3051
+ Band.create!(name: "Depeche Mode")
2027
3052
  end
2028
3053
 
2029
3054
  let!(:new_order) do
2030
- Band.create(name: "New Order")
3055
+ Band.create!(name: "New Order")
2031
3056
  end
2032
3057
 
2033
3058
  let(:criteria) do
@@ -2046,11 +3071,11 @@ describe Mongoid::Contextual::Mongo do
2046
3071
  describe "#sort" do
2047
3072
 
2048
3073
  let!(:depeche_mode) do
2049
- Band.create(name: "Depeche Mode")
3074
+ Band.create!(name: "Depeche Mode")
2050
3075
  end
2051
3076
 
2052
3077
  let!(:new_order) do
2053
- Band.create(name: "New Order")
3078
+ Band.create!(name: "New Order")
2054
3079
  end
2055
3080
 
2056
3081
  let(:criteria) do
@@ -2089,11 +3114,11 @@ describe Mongoid::Contextual::Mongo do
2089
3114
  describe "#update" do
2090
3115
 
2091
3116
  let!(:depeche_mode) do
2092
- Band.create(name: "Depeche Mode")
3117
+ Band.create!(name: "Depeche Mode")
2093
3118
  end
2094
3119
 
2095
3120
  let!(:new_order) do
2096
- Band.create(name: "New Order")
3121
+ Band.create!(name: "New Order")
2097
3122
  end
2098
3123
 
2099
3124
  let(:criteria) do
@@ -2107,11 +3132,11 @@ describe Mongoid::Contextual::Mongo do
2107
3132
  context "when adding an element to a HABTM set" do
2108
3133
 
2109
3134
  let(:person) do
2110
- Person.create
3135
+ Person.create!
2111
3136
  end
2112
3137
 
2113
3138
  let(:preference) do
2114
- Preference.create
3139
+ Preference.create!
2115
3140
  end
2116
3141
 
2117
3142
  before do
@@ -2250,12 +3275,12 @@ describe Mongoid::Contextual::Mongo do
2250
3275
  b.labels << Label.new(name: 'Warner')
2251
3276
  b.labels << Label.new(name: 'Sony')
2252
3277
  b.labels << Label.new(name: 'Cbs')
2253
- b.save
3278
+ b.save!
2254
3279
 
2255
3280
  b = Band.new(name: 'FKA Twigs')
2256
3281
  b.labels << Label.new(name: 'Warner')
2257
3282
  b.labels << Label.new(name: 'Cbs')
2258
- b.save
3283
+ b.save!
2259
3284
  end
2260
3285
 
2261
3286
 
@@ -2281,11 +3306,11 @@ describe Mongoid::Contextual::Mongo do
2281
3306
  describe "#update_all" do
2282
3307
 
2283
3308
  let!(:depeche_mode) do
2284
- Band.create(name: "Depeche Mode", origin: "Essex")
3309
+ Band.create!(name: "Depeche Mode", origin: "Essex")
2285
3310
  end
2286
3311
 
2287
3312
  let!(:new_order) do
2288
- Band.create(name: "New Order")
3313
+ Band.create!(name: "New Order")
2289
3314
  end
2290
3315
 
2291
3316
  let(:criteria) do
@@ -2423,12 +3448,12 @@ describe Mongoid::Contextual::Mongo do
2423
3448
  b.labels << Label.new(name: 'Warner')
2424
3449
  b.labels << Label.new(name: 'Sony')
2425
3450
  b.labels << Label.new(name: 'Cbs')
2426
- b.save
3451
+ b.save!
2427
3452
 
2428
3453
  b = Band.new(name: 'FKA Twigs')
2429
3454
  b.labels << Label.new(name: 'Warner')
2430
3455
  b.labels << Label.new(name: 'Cbs')
2431
- b.save
3456
+ b.save!
2432
3457
  end
2433
3458
 
2434
3459