mongoid 3.1.5 → 8.0.2

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 (1501) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +636 -33
  4. data/LICENSE +2 -1
  5. data/README.md +32 -24
  6. data/Rakefile +75 -5
  7. data/lib/config/locales/en.yml +301 -132
  8. data/lib/mongoid/association/accessors.rb +431 -0
  9. data/lib/mongoid/association/bindable.rb +227 -0
  10. data/lib/mongoid/association/builders.rb +86 -0
  11. data/lib/mongoid/association/constrainable.rb +42 -0
  12. data/lib/mongoid/association/depending.rb +128 -0
  13. data/lib/mongoid/association/eager_loadable.rb +57 -0
  14. data/lib/mongoid/association/embedded/batchable.rb +398 -0
  15. data/lib/mongoid/association/embedded/cyclic.rb +102 -0
  16. data/lib/mongoid/association/embedded/embedded_in/binding.rb +74 -0
  17. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +38 -0
  18. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +111 -0
  19. data/lib/mongoid/association/embedded/embedded_in.rb +135 -0
  20. data/lib/mongoid/association/embedded/embeds_many/binding.rb +42 -0
  21. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +45 -0
  22. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +571 -0
  23. data/lib/mongoid/association/embedded/embeds_many.rb +183 -0
  24. data/lib/mongoid/association/embedded/embeds_one/binding.rb +43 -0
  25. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +53 -0
  26. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +164 -0
  27. data/lib/mongoid/association/embedded/embeds_one.rb +150 -0
  28. data/lib/mongoid/association/embedded.rb +6 -0
  29. data/lib/mongoid/association/macros.rb +228 -0
  30. data/lib/mongoid/association/many.rb +202 -0
  31. data/lib/mongoid/association/marshalable.rb +31 -0
  32. data/lib/mongoid/association/nested/many.rb +192 -0
  33. data/lib/mongoid/association/nested/nested_buildable.rb +66 -0
  34. data/lib/mongoid/association/nested/one.rb +116 -0
  35. data/lib/mongoid/association/nested.rb +15 -0
  36. data/lib/mongoid/association/one.rb +53 -0
  37. data/lib/mongoid/association/options.rb +122 -0
  38. data/lib/mongoid/association/proxy.rb +200 -0
  39. data/lib/mongoid/association/referenced/auto_save.rb +74 -0
  40. data/lib/mongoid/association/referenced/belongs_to/binding.rb +83 -0
  41. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +48 -0
  42. data/lib/mongoid/association/referenced/belongs_to/eager.rb +73 -0
  43. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +124 -0
  44. data/lib/mongoid/association/referenced/belongs_to.rb +226 -0
  45. data/lib/mongoid/association/referenced/counter_cache.rb +152 -0
  46. data/lib/mongoid/association/referenced/eager.rb +163 -0
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +72 -0
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +53 -0
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +345 -0
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +273 -0
  52. data/lib/mongoid/association/referenced/has_many/binding.rb +36 -0
  53. data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
  54. data/lib/mongoid/association/referenced/has_many/eager.rb +44 -0
  55. data/lib/mongoid/association/referenced/has_many/enumerable.rb +494 -0
  56. data/lib/mongoid/association/referenced/has_many/proxy.rb +551 -0
  57. data/lib/mongoid/association/referenced/has_many.rb +251 -0
  58. data/lib/mongoid/association/referenced/has_one/binding.rb +42 -0
  59. data/lib/mongoid/association/referenced/has_one/buildable.rb +74 -0
  60. data/lib/mongoid/association/referenced/has_one/eager.rb +36 -0
  61. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +113 -0
  62. data/lib/mongoid/association/referenced/has_one/proxy.rb +108 -0
  63. data/lib/mongoid/association/referenced/has_one.rb +184 -0
  64. data/lib/mongoid/association/referenced/syncable.rb +155 -0
  65. data/lib/mongoid/association/referenced.rb +9 -0
  66. data/lib/mongoid/association/reflections.rb +69 -0
  67. data/lib/mongoid/association/relatable.rb +489 -0
  68. data/lib/mongoid/association.rb +135 -0
  69. data/lib/mongoid/atomic/modifiers.rb +41 -61
  70. data/lib/mongoid/atomic/paths/embedded/many.rb +24 -8
  71. data/lib/mongoid/atomic/paths/embedded/one.rb +5 -8
  72. data/lib/mongoid/atomic/paths/embedded.rb +3 -34
  73. data/lib/mongoid/atomic/paths/root.rb +4 -20
  74. data/lib/mongoid/atomic/paths.rb +2 -1
  75. data/lib/mongoid/atomic.rb +52 -69
  76. data/lib/mongoid/attributes/dynamic.rb +141 -0
  77. data/lib/mongoid/attributes/nested.rb +93 -0
  78. data/lib/mongoid/attributes/processing.rb +35 -97
  79. data/lib/mongoid/attributes/projector.rb +119 -0
  80. data/lib/mongoid/attributes/readonly.rb +27 -10
  81. data/lib/mongoid/attributes.rb +159 -181
  82. data/lib/mongoid/cacheable.rb +33 -0
  83. data/lib/mongoid/changeable.rb +420 -0
  84. data/lib/mongoid/clients/factory.rb +105 -0
  85. data/lib/mongoid/clients/options.rb +111 -0
  86. data/lib/mongoid/clients/sessions.rb +113 -0
  87. data/lib/mongoid/clients/storage_options.rb +79 -0
  88. data/lib/mongoid/clients/validators/storage.rb +58 -0
  89. data/lib/mongoid/clients/validators.rb +3 -0
  90. data/lib/mongoid/clients.rb +79 -0
  91. data/lib/mongoid/composable.rb +128 -0
  92. data/lib/mongoid/config/environment.rb +51 -13
  93. data/lib/mongoid/config/options.rb +30 -18
  94. data/lib/mongoid/config/validators/client.rb +128 -0
  95. data/lib/mongoid/config/validators/option.rb +3 -4
  96. data/lib/mongoid/config/validators.rb +3 -2
  97. data/lib/mongoid/config.rb +170 -89
  98. data/lib/mongoid/contextual/aggregable/memory.rb +40 -27
  99. data/lib/mongoid/contextual/aggregable/mongo.rb +33 -36
  100. data/lib/mongoid/contextual/aggregable/none.rb +65 -0
  101. data/lib/mongoid/contextual/aggregable.rb +17 -0
  102. data/lib/mongoid/contextual/atomic.rb +80 -79
  103. data/lib/mongoid/contextual/command.rb +8 -11
  104. data/lib/mongoid/contextual/geo_near.rb +42 -44
  105. data/lib/mongoid/contextual/map_reduce.rb +33 -127
  106. data/lib/mongoid/contextual/memory.rb +226 -88
  107. data/lib/mongoid/contextual/mongo.rb +466 -293
  108. data/lib/mongoid/contextual/none.rb +193 -0
  109. data/lib/mongoid/contextual/queryable.rb +3 -4
  110. data/lib/mongoid/contextual.rb +11 -11
  111. data/lib/mongoid/copyable.rb +68 -20
  112. data/lib/mongoid/criteria/findable.rb +143 -0
  113. data/lib/mongoid/criteria/includable.rb +92 -0
  114. data/lib/mongoid/criteria/inspectable.rb +24 -0
  115. data/lib/mongoid/criteria/marshalable.rb +55 -0
  116. data/lib/mongoid/criteria/modifiable.rb +235 -0
  117. data/lib/mongoid/criteria/options.rb +24 -0
  118. data/lib/mongoid/criteria/permission.rb +71 -0
  119. data/lib/mongoid/criteria/queryable/aggregable.rb +109 -0
  120. data/lib/mongoid/criteria/queryable/expandable.rb +68 -0
  121. data/lib/mongoid/criteria/queryable/extensions/array.rb +151 -0
  122. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +57 -0
  123. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +33 -0
  124. data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
  125. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +52 -0
  126. data/lib/mongoid/criteria/queryable/extensions/hash.rb +163 -0
  127. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +75 -0
  128. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +81 -0
  129. data/lib/mongoid/criteria/queryable/extensions/object.rb +182 -0
  130. data/lib/mongoid/criteria/queryable/extensions/range.rb +102 -0
  131. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +72 -0
  132. data/lib/mongoid/criteria/queryable/extensions/set.rb +33 -0
  133. data/lib/mongoid/criteria/queryable/extensions/string.rb +122 -0
  134. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +74 -0
  135. data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
  136. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +66 -0
  137. data/lib/mongoid/criteria/queryable/extensions.rb +25 -0
  138. data/lib/mongoid/criteria/queryable/key.rb +177 -0
  139. data/lib/mongoid/criteria/queryable/macroable.rb +26 -0
  140. data/lib/mongoid/criteria/queryable/mergeable.rb +434 -0
  141. data/lib/mongoid/criteria/queryable/optional.rb +380 -0
  142. data/lib/mongoid/criteria/queryable/options.rb +136 -0
  143. data/lib/mongoid/criteria/queryable/pipeline.rb +106 -0
  144. data/lib/mongoid/criteria/queryable/selectable.rb +937 -0
  145. data/lib/mongoid/criteria/queryable/selector.rb +287 -0
  146. data/lib/mongoid/criteria/queryable/smash.rb +128 -0
  147. data/lib/mongoid/criteria/queryable/storable.rb +237 -0
  148. data/lib/mongoid/criteria/queryable.rb +90 -0
  149. data/lib/mongoid/criteria/scopable.rb +166 -0
  150. data/lib/mongoid/criteria.rb +177 -189
  151. data/lib/mongoid/deprecable.rb +36 -0
  152. data/lib/mongoid/deprecation.rb +25 -0
  153. data/lib/mongoid/document.rb +193 -139
  154. data/lib/mongoid/equality.rb +35 -18
  155. data/lib/mongoid/errors/ambiguous_relationship.rb +5 -6
  156. data/lib/mongoid/errors/callback.rb +2 -3
  157. data/lib/mongoid/errors/criteria_argument_required.rb +18 -0
  158. data/lib/mongoid/errors/delete_restriction.rb +10 -13
  159. data/lib/mongoid/errors/document_not_destroyed.rb +22 -0
  160. data/lib/mongoid/errors/document_not_found.rb +36 -21
  161. data/lib/mongoid/errors/empty_config_file.rb +25 -0
  162. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +19 -0
  163. data/lib/mongoid/errors/invalid_collection.rb +2 -1
  164. data/lib/mongoid/errors/invalid_config_file.rb +25 -0
  165. data/lib/mongoid/errors/invalid_config_option.rb +3 -4
  166. data/lib/mongoid/errors/invalid_dependent_strategy.rb +31 -0
  167. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +24 -0
  168. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  169. data/lib/mongoid/errors/invalid_elem_match_operator.rb +32 -0
  170. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +25 -0
  171. data/lib/mongoid/errors/invalid_expression_operator.rb +27 -0
  172. data/lib/mongoid/errors/invalid_field.rb +10 -9
  173. data/lib/mongoid/errors/invalid_field_operator.rb +32 -0
  174. data/lib/mongoid/errors/invalid_field_option.rb +2 -3
  175. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  176. data/lib/mongoid/errors/invalid_find.rb +2 -3
  177. data/lib/mongoid/errors/invalid_includes.rb +2 -3
  178. data/lib/mongoid/errors/invalid_index.rb +2 -3
  179. data/lib/mongoid/errors/invalid_options.rb +4 -5
  180. data/lib/mongoid/errors/invalid_path.rb +2 -3
  181. data/lib/mongoid/errors/invalid_persistence_option.rb +26 -0
  182. data/lib/mongoid/errors/invalid_query.rb +40 -0
  183. data/lib/mongoid/errors/invalid_relation.rb +61 -0
  184. data/lib/mongoid/errors/invalid_relation_option.rb +28 -0
  185. data/lib/mongoid/errors/invalid_scope.rb +2 -3
  186. data/lib/mongoid/errors/invalid_session_use.rb +21 -0
  187. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +6 -5
  188. data/lib/mongoid/errors/invalid_storage_options.rb +4 -5
  189. data/lib/mongoid/errors/invalid_storage_parent.rb +25 -0
  190. data/lib/mongoid/errors/invalid_time.rb +2 -3
  191. data/lib/mongoid/errors/inverse_not_found.rb +4 -5
  192. data/lib/mongoid/errors/mixed_client_configuration.rb +27 -0
  193. data/lib/mongoid/errors/mixed_relations.rb +2 -3
  194. data/lib/mongoid/errors/mongoid_error.rb +22 -23
  195. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +3 -4
  196. data/lib/mongoid/errors/no_client_config.rb +21 -0
  197. data/lib/mongoid/errors/no_client_database.rb +26 -0
  198. data/lib/mongoid/errors/no_client_hosts.rb +26 -0
  199. data/lib/mongoid/errors/no_clients_config.rb +19 -0
  200. data/lib/mongoid/errors/no_default_client.rb +22 -0
  201. data/lib/mongoid/errors/no_environment.rb +2 -3
  202. data/lib/mongoid/errors/no_map_reduce_output.rb +2 -3
  203. data/lib/mongoid/errors/no_metadata.rb +2 -3
  204. data/lib/mongoid/errors/no_parent.rb +2 -3
  205. data/lib/mongoid/errors/readonly_attribute.rb +3 -4
  206. data/lib/mongoid/errors/readonly_document.rb +21 -0
  207. data/lib/mongoid/errors/scope_overwrite.rb +2 -1
  208. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +3 -1
  209. data/lib/mongoid/errors/unknown_attribute.rb +3 -4
  210. data/lib/mongoid/errors/unknown_model.rb +24 -0
  211. data/lib/mongoid/errors/unsaved_document.rb +3 -2
  212. data/lib/mongoid/errors/unsupported_javascript.rb +2 -3
  213. data/lib/mongoid/errors/validations.rb +2 -1
  214. data/lib/mongoid/errors.rb +30 -9
  215. data/lib/mongoid/evolvable.rb +4 -5
  216. data/lib/mongoid/extensions/array.rb +45 -52
  217. data/lib/mongoid/extensions/big_decimal.rb +41 -22
  218. data/lib/mongoid/extensions/binary.rb +42 -0
  219. data/lib/mongoid/extensions/boolean.rb +19 -17
  220. data/lib/mongoid/extensions/date.rb +33 -23
  221. data/lib/mongoid/extensions/date_time.rb +5 -13
  222. data/lib/mongoid/extensions/decimal128.rb +36 -0
  223. data/lib/mongoid/extensions/false_class.rb +5 -8
  224. data/lib/mongoid/extensions/float.rb +11 -16
  225. data/lib/mongoid/extensions/hash.rb +88 -49
  226. data/lib/mongoid/extensions/integer.rb +10 -18
  227. data/lib/mongoid/extensions/module.rb +3 -4
  228. data/lib/mongoid/extensions/nil_class.rb +2 -5
  229. data/lib/mongoid/extensions/object.rb +38 -62
  230. data/lib/mongoid/extensions/object_id.rb +7 -12
  231. data/lib/mongoid/extensions/range.rb +46 -17
  232. data/lib/mongoid/extensions/regexp.rb +15 -8
  233. data/lib/mongoid/extensions/set.rb +17 -15
  234. data/lib/mongoid/extensions/string.rb +40 -80
  235. data/lib/mongoid/extensions/symbol.rb +7 -23
  236. data/lib/mongoid/extensions/time.rb +42 -25
  237. data/lib/mongoid/extensions/time_with_zone.rb +27 -10
  238. data/lib/mongoid/extensions/true_class.rb +5 -8
  239. data/lib/mongoid/extensions.rb +31 -13
  240. data/lib/mongoid/factory.rb +99 -11
  241. data/lib/mongoid/fields/foreign_key.rb +26 -34
  242. data/lib/mongoid/fields/localized.rb +24 -13
  243. data/lib/mongoid/fields/standard.rb +19 -73
  244. data/lib/mongoid/fields/validators/macro.rb +56 -15
  245. data/lib/mongoid/fields/validators.rb +2 -1
  246. data/lib/mongoid/fields.rb +342 -87
  247. data/lib/mongoid/findable.rb +219 -0
  248. data/lib/mongoid/indexable/specification.rb +103 -0
  249. data/lib/mongoid/indexable/validators/options.rb +110 -0
  250. data/lib/mongoid/indexable.rb +148 -0
  251. data/lib/mongoid/inspectable.rb +52 -0
  252. data/lib/mongoid/interceptable.rb +312 -0
  253. data/lib/mongoid/loggable.rb +15 -18
  254. data/lib/mongoid/matchable.rb +23 -0
  255. data/lib/mongoid/matcher/all.rb +22 -0
  256. data/lib/mongoid/matcher/and.rb +21 -0
  257. data/lib/mongoid/matcher/bits.rb +41 -0
  258. data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
  259. data/lib/mongoid/matcher/bits_all_set.rb +20 -0
  260. data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
  261. data/lib/mongoid/matcher/bits_any_set.rb +20 -0
  262. data/lib/mongoid/matcher/elem_match.rb +36 -0
  263. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  264. data/lib/mongoid/matcher/eq.rb +11 -0
  265. data/lib/mongoid/matcher/eq_impl.rb +67 -0
  266. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +26 -0
  267. data/lib/mongoid/matcher/exists.rb +15 -0
  268. data/lib/mongoid/matcher/expression.rb +35 -0
  269. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  270. data/lib/mongoid/matcher/field_expression.rb +62 -0
  271. data/lib/mongoid/matcher/field_operator.rb +54 -0
  272. data/lib/mongoid/matcher/gt.rb +17 -0
  273. data/lib/mongoid/matcher/gte.rb +17 -0
  274. data/lib/mongoid/matcher/in.rb +25 -0
  275. data/lib/mongoid/matcher/lt.rb +17 -0
  276. data/lib/mongoid/matcher/lte.rb +17 -0
  277. data/lib/mongoid/matcher/mod.rb +17 -0
  278. data/lib/mongoid/matcher/ne.rb +16 -0
  279. data/lib/mongoid/matcher/nin.rb +11 -0
  280. data/lib/mongoid/matcher/nor.rb +25 -0
  281. data/lib/mongoid/matcher/not.rb +29 -0
  282. data/lib/mongoid/matcher/or.rb +21 -0
  283. data/lib/mongoid/matcher/regex.rb +41 -0
  284. data/lib/mongoid/matcher/size.rb +26 -0
  285. data/lib/mongoid/matcher/type.rb +99 -0
  286. data/lib/mongoid/matcher.rb +115 -0
  287. data/lib/mongoid/persistable/creatable.rb +181 -0
  288. data/lib/mongoid/persistable/deletable.rb +132 -0
  289. data/lib/mongoid/persistable/destroyable.rb +57 -0
  290. data/lib/mongoid/persistable/incrementable.rb +35 -0
  291. data/lib/mongoid/persistable/logical.rb +36 -0
  292. data/lib/mongoid/persistable/poppable.rb +36 -0
  293. data/lib/mongoid/persistable/pullable.rb +50 -0
  294. data/lib/mongoid/persistable/pushable.rb +66 -0
  295. data/lib/mongoid/persistable/renamable.rb +37 -0
  296. data/lib/mongoid/persistable/savable.rb +47 -0
  297. data/lib/mongoid/persistable/settable.rb +93 -0
  298. data/lib/mongoid/persistable/unsettable.rb +36 -0
  299. data/lib/mongoid/persistable/updatable.rb +165 -0
  300. data/lib/mongoid/persistable/upsertable.rb +51 -0
  301. data/lib/mongoid/persistable.rb +305 -0
  302. data/lib/mongoid/persistence_context.rb +239 -0
  303. data/lib/mongoid/positional.rb +72 -0
  304. data/lib/mongoid/query_cache.rb +64 -0
  305. data/lib/mongoid/railtie.rb +35 -78
  306. data/lib/mongoid/railties/controller_runtime.rb +88 -0
  307. data/lib/mongoid/railties/database.rake +18 -25
  308. data/lib/mongoid/reloadable.rb +94 -0
  309. data/lib/mongoid/scopable.rb +324 -0
  310. data/lib/mongoid/selectable.rb +49 -0
  311. data/lib/mongoid/serializable.rb +170 -0
  312. data/lib/mongoid/shardable.rb +130 -0
  313. data/lib/mongoid/stateful.rb +134 -0
  314. data/lib/mongoid/stringified_symbol.rb +52 -0
  315. data/lib/mongoid/tasks/database.rake +38 -0
  316. data/lib/mongoid/tasks/database.rb +194 -0
  317. data/lib/mongoid/threaded/lifecycle.rb +28 -70
  318. data/lib/mongoid/threaded.rb +142 -219
  319. data/lib/mongoid/timestamps/created/short.rb +2 -1
  320. data/lib/mongoid/timestamps/created.rb +9 -5
  321. data/lib/mongoid/timestamps/short.rb +2 -1
  322. data/lib/mongoid/timestamps/timeless.rb +52 -16
  323. data/lib/mongoid/timestamps/updated/short.rb +4 -3
  324. data/lib/mongoid/timestamps/updated.rb +14 -9
  325. data/lib/mongoid/timestamps.rb +4 -3
  326. data/lib/mongoid/touchable.rb +131 -0
  327. data/lib/mongoid/traversable.rb +337 -0
  328. data/lib/mongoid/validatable/associated.rb +47 -0
  329. data/lib/mongoid/validatable/format.rb +21 -0
  330. data/lib/mongoid/validatable/length.rb +21 -0
  331. data/lib/mongoid/validatable/localizable.rb +29 -0
  332. data/lib/mongoid/validatable/macros.rb +89 -0
  333. data/lib/mongoid/validatable/presence.rb +81 -0
  334. data/lib/mongoid/validatable/queryable.rb +29 -0
  335. data/lib/mongoid/validatable/uniqueness.rb +304 -0
  336. data/lib/mongoid/validatable.rb +160 -0
  337. data/lib/mongoid/version.rb +3 -2
  338. data/lib/mongoid/warnings.rb +28 -0
  339. data/lib/mongoid.rb +68 -109
  340. data/lib/rails/generators/mongoid/config/config_generator.rb +10 -2
  341. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +150 -45
  342. data/lib/rails/generators/mongoid/model/model_generator.rb +3 -3
  343. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -4
  344. data/lib/rails/generators/mongoid_generator.rb +5 -41
  345. data/lib/rails/mongoid.rb +6 -129
  346. data/spec/README.md +33 -0
  347. data/spec/config/mongoid.yml +56 -25
  348. data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
  349. data/spec/integration/app_spec.rb +345 -0
  350. data/spec/integration/associations/belongs_to_spec.rb +33 -0
  351. data/spec/integration/associations/embedded_dirty_spec.rb +57 -0
  352. data/spec/integration/associations/embedded_spec.rb +283 -0
  353. data/spec/integration/associations/embeds_many_spec.rb +219 -0
  354. data/spec/integration/associations/embeds_one_spec.rb +41 -0
  355. data/spec/integration/associations/foreign_key_spec.rb +107 -0
  356. data/spec/integration/associations/foreign_key_spec_models.rb +64 -0
  357. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  358. data/spec/integration/associations/has_many_spec.rb +128 -0
  359. data/spec/integration/associations/has_one_spec.rb +272 -0
  360. data/spec/integration/associations/nested_attributes_assignment_spec.rb +115 -0
  361. data/spec/integration/associations/reverse_population_spec.rb +34 -0
  362. data/spec/integration/associations/reverse_population_spec_models.rb +36 -0
  363. data/spec/integration/associations/scope_option_spec.rb +101 -0
  364. data/spec/integration/atomic/modifiers_spec.rb +116 -0
  365. data/spec/integration/bson_regexp_raw_spec.rb +19 -0
  366. data/spec/integration/callbacks_models.rb +155 -0
  367. data/spec/integration/callbacks_spec.rb +450 -0
  368. data/spec/integration/contextual/empty_spec.rb +141 -0
  369. data/spec/integration/criteria/alias_query_spec.rb +161 -0
  370. data/spec/integration/criteria/date_field_spec.rb +40 -0
  371. data/spec/integration/criteria/default_scope_spec.rb +72 -0
  372. data/spec/integration/criteria/logical_spec.rb +124 -0
  373. data/spec/integration/criteria/range_spec.rb +359 -0
  374. data/spec/integration/criteria/time_with_zone_spec.rb +142 -0
  375. data/spec/integration/discriminator_key_spec.rb +392 -0
  376. data/spec/integration/discriminator_value_spec.rb +206 -0
  377. data/spec/integration/document_spec.rb +51 -0
  378. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  379. data/spec/integration/i18n_fallbacks_spec.rb +89 -0
  380. data/spec/integration/matcher_examples_spec.rb +765 -0
  381. data/spec/integration/matcher_operator_data/all.yml +140 -0
  382. data/spec/integration/matcher_operator_data/and.yml +93 -0
  383. data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
  384. data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
  385. data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
  386. data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
  387. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  388. data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
  389. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  390. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  391. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  392. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  393. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  394. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  395. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  396. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  397. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  398. data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
  399. data/spec/integration/matcher_operator_data/in.yml +210 -0
  400. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  401. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  402. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  403. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  404. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  405. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  406. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  407. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  408. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  409. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  410. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  411. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  412. data/spec/integration/matcher_operator_data/not.yml +196 -0
  413. data/spec/integration/matcher_operator_data/or.yml +137 -0
  414. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  415. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  416. data/spec/integration/matcher_operator_data/size.yml +174 -0
  417. data/spec/integration/matcher_operator_data/type.yml +70 -0
  418. data/spec/integration/matcher_operator_data/type_array.yml +16 -0
  419. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  420. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  421. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  422. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  423. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  424. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  425. data/spec/integration/matcher_operator_data/type_decimal.yml +41 -0
  426. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  427. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  428. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  429. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  430. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  431. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  432. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  433. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  434. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  435. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  436. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  437. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  438. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  439. data/spec/integration/matcher_operator_spec.rb +122 -0
  440. data/spec/integration/matcher_spec.rb +283 -0
  441. data/spec/integration/persistence/range_field_spec.rb +350 -0
  442. data/spec/integration/server_query_spec.rb +141 -0
  443. data/spec/integration/shardable_spec.rb +148 -0
  444. data/spec/integration/stringified_symbol_field_spec.rb +203 -0
  445. data/spec/lite_spec_helper.rb +83 -0
  446. data/spec/mongoid/association/accessors_spec.rb +1067 -0
  447. data/spec/mongoid/association/auto_save_spec.rb +403 -0
  448. data/spec/mongoid/association/builders_spec.rb +255 -0
  449. data/spec/mongoid/association/constrainable_spec.rb +117 -0
  450. data/spec/mongoid/association/counter_cache_spec.rb +452 -0
  451. data/spec/mongoid/association/depending_spec.rb +959 -0
  452. data/spec/mongoid/association/eager_spec.rb +282 -0
  453. data/spec/mongoid/association/embedded/cyclic_spec.rb +180 -0
  454. data/spec/mongoid/association/embedded/dirty_spec.rb +67 -0
  455. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +174 -0
  456. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +90 -0
  457. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +619 -0
  458. data/spec/mongoid/association/embedded/embedded_in_spec.rb +903 -0
  459. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +56 -0
  460. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +218 -0
  461. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +4863 -0
  462. data/spec/mongoid/association/embedded/embeds_many_models.rb +226 -0
  463. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +63 -0
  464. data/spec/mongoid/association/embedded/embeds_many_spec.rb +932 -0
  465. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +79 -0
  466. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +106 -0
  467. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +1025 -0
  468. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +8 -0
  469. data/spec/mongoid/association/embedded/embeds_one_models.rb +73 -0
  470. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +28 -0
  471. data/spec/mongoid/association/embedded/embeds_one_spec.rb +984 -0
  472. data/spec/mongoid/association/macros_spec.rb +1116 -0
  473. data/spec/mongoid/association/nested/many_spec.rb +232 -0
  474. data/spec/mongoid/association/nested/one_spec.rb +253 -0
  475. data/spec/mongoid/association/options_spec.rb +1323 -0
  476. data/spec/mongoid/association/polymorphic_spec.rb +162 -0
  477. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +244 -0
  478. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +292 -0
  479. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +412 -0
  480. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +1388 -0
  481. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  482. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +57 -0
  483. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2046 -0
  484. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +180 -0
  485. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +148 -0
  486. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +196 -0
  487. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +76 -0
  488. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +3836 -0
  489. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +92 -0
  490. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +39 -0
  491. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1104 -0
  492. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +155 -0
  493. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +251 -0
  494. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +290 -0
  495. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2232 -0
  496. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
  497. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +4161 -0
  498. data/spec/mongoid/association/referenced/has_many_models.rb +97 -0
  499. data/spec/mongoid/association/referenced/has_many_query_spec.rb +37 -0
  500. data/spec/mongoid/association/referenced/has_many_spec.rb +1273 -0
  501. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +133 -0
  502. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +159 -0
  503. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +193 -0
  504. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +1248 -0
  505. data/spec/mongoid/association/referenced/has_one_models.rb +113 -0
  506. data/spec/mongoid/association/referenced/has_one_query_spec.rb +37 -0
  507. data/spec/mongoid/association/referenced/has_one_spec.rb +1383 -0
  508. data/spec/mongoid/association/reflections_spec.rb +92 -0
  509. data/spec/mongoid/association/syncable_spec.rb +513 -0
  510. data/spec/mongoid/association_spec.rb +191 -0
  511. data/spec/mongoid/atomic/modifiers_spec.rb +88 -39
  512. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +10 -49
  513. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +9 -49
  514. data/spec/mongoid/atomic/paths/root_spec.rb +5 -61
  515. data/spec/mongoid/atomic/paths_spec.rb +115 -35
  516. data/spec/mongoid/atomic_spec.rb +89 -42
  517. data/spec/mongoid/attributes/dynamic_spec.rb +152 -0
  518. data/spec/mongoid/attributes/nested_spec.rb +5000 -0
  519. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  520. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  521. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  522. data/spec/mongoid/attributes/projector_spec.rb +40 -0
  523. data/spec/mongoid/attributes/readonly_spec.rb +166 -64
  524. data/spec/mongoid/attributes_spec.rb +1418 -409
  525. data/spec/mongoid/cacheable_spec.rb +114 -0
  526. data/spec/mongoid/changeable_spec.rb +1914 -0
  527. data/spec/mongoid/clients/factory_spec.rb +426 -0
  528. data/spec/mongoid/clients/options_spec.rb +521 -0
  529. data/spec/mongoid/clients/sessions_spec.rb +297 -0
  530. data/spec/mongoid/clients/transactions_spec.rb +415 -0
  531. data/spec/mongoid/clients_spec.rb +1084 -0
  532. data/spec/mongoid/composable_spec.rb +33 -0
  533. data/spec/mongoid/config/environment_spec.rb +138 -17
  534. data/spec/mongoid/config/options_spec.rb +26 -7
  535. data/spec/mongoid/config_spec.rb +607 -93
  536. data/spec/mongoid/contextual/aggregable/memory_spec.rb +433 -153
  537. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  538. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  539. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +221 -56
  540. data/spec/mongoid/contextual/aggregable/none_spec.rb +60 -0
  541. data/spec/mongoid/contextual/atomic_spec.rb +577 -162
  542. data/spec/mongoid/contextual/geo_near_spec.rb +104 -38
  543. data/spec/mongoid/contextual/map_reduce_spec.rb +137 -142
  544. data/spec/mongoid/contextual/memory_spec.rb +1880 -269
  545. data/spec/mongoid/contextual/mongo_spec.rb +2523 -601
  546. data/spec/mongoid/contextual/none_spec.rb +123 -0
  547. data/spec/mongoid/copyable_spec.rb +833 -76
  548. data/spec/mongoid/copyable_spec_models.rb +47 -0
  549. data/spec/mongoid/criteria/findable_spec.rb +1132 -0
  550. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  551. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  552. data/spec/mongoid/criteria/inspectable_spec.rb +29 -0
  553. data/spec/mongoid/criteria/marshalable_spec.rb +47 -0
  554. data/spec/mongoid/criteria/modifiable_spec.rb +1812 -0
  555. data/spec/mongoid/criteria/options_spec.rb +31 -0
  556. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +372 -0
  557. data/spec/mongoid/criteria/queryable/expandable_spec.rb +61 -0
  558. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +513 -0
  559. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +169 -0
  560. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +60 -0
  561. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +215 -0
  562. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +343 -0
  563. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +434 -0
  564. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +60 -0
  565. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +67 -0
  566. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +314 -0
  567. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +67 -0
  568. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +79 -0
  569. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +119 -0
  570. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +110 -0
  571. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +370 -0
  572. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +91 -0
  573. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +92 -0
  574. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +41 -0
  575. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +347 -0
  576. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +169 -0
  577. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +406 -0
  578. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +387 -0
  579. data/spec/mongoid/criteria/queryable/key_spec.rb +96 -0
  580. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +182 -0
  581. data/spec/mongoid/criteria/queryable/optional_spec.rb +1317 -0
  582. data/spec/mongoid/criteria/queryable/options_spec.rb +362 -0
  583. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +214 -0
  584. data/spec/mongoid/criteria/queryable/queryable_spec.rb +139 -0
  585. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +2119 -0
  586. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
  587. data/spec/mongoid/criteria/queryable/selectable_spec.rb +2462 -0
  588. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
  589. data/spec/mongoid/criteria/queryable/selector_spec.rb +895 -0
  590. data/spec/mongoid/criteria/queryable/smash_spec.rb +32 -0
  591. data/spec/mongoid/criteria/queryable/storable_spec.rb +226 -0
  592. data/spec/mongoid/criteria/scopable_spec.rb +601 -0
  593. data/spec/mongoid/criteria_projection_spec.rb +410 -0
  594. data/spec/mongoid/criteria_spec.rb +1828 -3572
  595. data/spec/mongoid/document_fields_spec.rb +262 -0
  596. data/spec/mongoid/document_persistence_context_spec.rb +32 -0
  597. data/spec/mongoid/document_query_spec.rb +89 -0
  598. data/spec/mongoid/document_spec.rb +452 -221
  599. data/spec/mongoid/equality_spec.rb +155 -52
  600. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +8 -6
  601. data/spec/mongoid/errors/callback_spec.rb +5 -3
  602. data/spec/mongoid/errors/delete_restriction_spec.rb +7 -5
  603. data/spec/mongoid/errors/document_not_destroyed_spec.rb +35 -0
  604. data/spec/mongoid/errors/document_not_found_spec.rb +89 -11
  605. data/spec/mongoid/errors/invalid_collection_spec.rb +5 -3
  606. data/spec/mongoid/errors/invalid_config_file_spec.rb +31 -0
  607. data/spec/mongoid/errors/invalid_config_option_spec.rb +5 -3
  608. data/spec/mongoid/errors/invalid_field_option_spec.rb +5 -3
  609. data/spec/mongoid/errors/invalid_field_spec.rb +6 -4
  610. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  611. data/spec/mongoid/errors/invalid_find_spec.rb +5 -3
  612. data/spec/mongoid/errors/invalid_includes_spec.rb +5 -3
  613. data/spec/mongoid/errors/invalid_index_spec.rb +5 -3
  614. data/spec/mongoid/errors/invalid_options_spec.rb +7 -5
  615. data/spec/mongoid/errors/invalid_path_spec.rb +5 -3
  616. data/spec/mongoid/errors/invalid_relation_spec.rb +39 -0
  617. data/spec/mongoid/errors/invalid_scope_spec.rb +7 -5
  618. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +5 -3
  619. data/spec/mongoid/errors/invalid_storage_options_spec.rb +5 -3
  620. data/spec/mongoid/errors/invalid_time_spec.rb +5 -3
  621. data/spec/mongoid/errors/inverse_not_found_spec.rb +6 -4
  622. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +31 -0
  623. data/spec/mongoid/errors/mixed_relations_spec.rb +5 -3
  624. data/spec/mongoid/errors/mongoid_error_spec.rb +45 -10
  625. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +8 -6
  626. data/spec/mongoid/errors/no_client_config_spec.rb +31 -0
  627. data/spec/mongoid/errors/no_client_database_spec.rb +31 -0
  628. data/spec/mongoid/errors/no_client_hosts_spec.rb +31 -0
  629. data/spec/mongoid/errors/no_clients_config_spec.rb +31 -0
  630. data/spec/mongoid/errors/no_environment_spec.rb +8 -6
  631. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +5 -3
  632. data/spec/mongoid/errors/no_metadata_spec.rb +5 -3
  633. data/spec/mongoid/errors/no_parent_spec.rb +6 -4
  634. data/spec/mongoid/errors/readonly_attribute_spec.rb +5 -3
  635. data/spec/mongoid/errors/readonly_document_spec.rb +31 -0
  636. data/spec/mongoid/errors/scope_overwrite_spec.rb +5 -3
  637. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +6 -4
  638. data/spec/mongoid/errors/unknown_attribute_spec.rb +7 -5
  639. data/spec/mongoid/errors/unsaved_document_spec.rb +6 -4
  640. data/spec/mongoid/errors/unsupported_javascript_spec.rb +5 -3
  641. data/spec/mongoid/errors/validations_spec.rb +9 -7
  642. data/spec/mongoid/extensions/array_spec.rb +108 -116
  643. data/spec/mongoid/extensions/big_decimal_spec.rb +838 -49
  644. data/spec/mongoid/extensions/binary_spec.rb +55 -18
  645. data/spec/mongoid/extensions/boolean_spec.rb +76 -74
  646. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +339 -0
  647. data/spec/mongoid/extensions/date_spec.rb +59 -145
  648. data/spec/mongoid/extensions/date_time_spec.rb +35 -76
  649. data/spec/mongoid/extensions/decimal128_spec.rb +46 -0
  650. data/spec/mongoid/extensions/false_class_spec.rb +7 -5
  651. data/spec/mongoid/extensions/float_spec.rb +69 -62
  652. data/spec/mongoid/extensions/hash_spec.rb +197 -30
  653. data/spec/mongoid/extensions/integer_spec.rb +63 -65
  654. data/spec/mongoid/extensions/module_spec.rb +4 -2
  655. data/spec/mongoid/extensions/nil_class_spec.rb +3 -1
  656. data/spec/mongoid/extensions/object_id_spec.rb +136 -134
  657. data/spec/mongoid/extensions/object_spec.rb +53 -57
  658. data/spec/mongoid/extensions/range_spec.rb +287 -28
  659. data/spec/mongoid/extensions/regexp_spec.rb +71 -21
  660. data/spec/mongoid/extensions/set_spec.rb +112 -4
  661. data/spec/mongoid/extensions/string_spec.rb +188 -89
  662. data/spec/mongoid/extensions/stringified_symbol_spec.rb +84 -0
  663. data/spec/mongoid/extensions/symbol_spec.rb +25 -30
  664. data/spec/mongoid/extensions/time_spec.rb +703 -110
  665. data/spec/mongoid/extensions/time_with_zone_spec.rb +82 -67
  666. data/spec/mongoid/extensions/true_class_spec.rb +7 -5
  667. data/spec/mongoid/extensions_spec.rb +43 -0
  668. data/spec/mongoid/factory_spec.rb +374 -25
  669. data/spec/mongoid/fields/foreign_key_spec.rb +116 -92
  670. data/spec/mongoid/fields/localized_spec.rb +177 -35
  671. data/spec/mongoid/fields/standard_spec.rb +15 -13
  672. data/spec/mongoid/fields_spec.rb +952 -238
  673. data/spec/mongoid/findable_spec.rb +632 -0
  674. data/spec/mongoid/indexable/specification_spec.rb +129 -0
  675. data/spec/mongoid/indexable_spec.rb +643 -0
  676. data/spec/mongoid/inspectable_spec.rb +86 -0
  677. data/spec/mongoid/interceptable_spec.rb +2373 -0
  678. data/spec/mongoid/interceptable_spec_models.rb +307 -0
  679. data/spec/mongoid/loggable_spec.rb +3 -1
  680. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  681. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
  682. data/spec/mongoid/matcher/extract_attribute_spec.rb +36 -0
  683. data/spec/mongoid/mongoizable_spec.rb +285 -0
  684. data/spec/mongoid/persistable/creatable_spec.rb +662 -0
  685. data/spec/mongoid/persistable/deletable_spec.rb +514 -0
  686. data/spec/mongoid/persistable/destroyable_spec.rb +455 -0
  687. data/spec/mongoid/persistable/incrementable_spec.rb +241 -0
  688. data/spec/mongoid/persistable/logical_spec.rb +159 -0
  689. data/spec/mongoid/persistable/poppable_spec.rb +131 -0
  690. data/spec/mongoid/persistable/pullable_spec.rb +258 -0
  691. data/spec/mongoid/persistable/pushable_spec.rb +353 -0
  692. data/spec/mongoid/persistable/renamable_spec.rb +151 -0
  693. data/spec/mongoid/persistable/savable_spec.rb +684 -0
  694. data/spec/mongoid/persistable/settable_spec.rb +544 -0
  695. data/spec/mongoid/persistable/unsettable_spec.rb +171 -0
  696. data/spec/mongoid/persistable/updatable_spec.rb +760 -0
  697. data/spec/mongoid/persistable/upsertable_spec.rb +122 -0
  698. data/spec/mongoid/persistable_spec.rb +321 -0
  699. data/spec/mongoid/persistence_context_spec.rb +745 -0
  700. data/spec/mongoid/positional_spec.rb +223 -0
  701. data/spec/mongoid/query_cache_middleware_spec.rb +50 -0
  702. data/spec/mongoid/query_cache_spec.rb +870 -0
  703. data/spec/mongoid/relations/proxy_spec.rb +125 -47
  704. data/spec/mongoid/reloadable_spec.rb +665 -0
  705. data/spec/mongoid/scopable_spec.rb +1234 -0
  706. data/spec/mongoid/selectable_spec.rb +136 -0
  707. data/spec/mongoid/serializable_spec.rb +963 -0
  708. data/spec/mongoid/shardable_models.rb +61 -0
  709. data/spec/mongoid/shardable_spec.rb +204 -0
  710. data/spec/mongoid/stateful_spec.rb +157 -0
  711. data/spec/mongoid/tasks/database_rake_spec.rb +287 -0
  712. data/spec/mongoid/tasks/database_spec.rb +181 -0
  713. data/spec/mongoid/threaded_spec.rb +88 -78
  714. data/spec/mongoid/timestamps/created/short_spec.rb +9 -7
  715. data/spec/mongoid/timestamps/created_spec.rb +8 -6
  716. data/spec/mongoid/timestamps/timeless_spec.rb +29 -10
  717. data/spec/mongoid/timestamps/updated/short_spec.rb +16 -14
  718. data/spec/mongoid/timestamps/updated_spec.rb +14 -16
  719. data/spec/mongoid/timestamps_spec.rb +406 -18
  720. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  721. data/spec/mongoid/touchable_spec.rb +704 -0
  722. data/spec/mongoid/touchable_spec_models.rb +57 -0
  723. data/spec/mongoid/traversable_spec.rb +1410 -0
  724. data/spec/mongoid/validatable/associated_spec.rb +208 -0
  725. data/spec/mongoid/validatable/format_spec.rb +85 -0
  726. data/spec/mongoid/validatable/length_spec.rb +225 -0
  727. data/spec/mongoid/validatable/numericality_spec.rb +32 -0
  728. data/spec/mongoid/validatable/presence_spec.rb +592 -0
  729. data/spec/mongoid/validatable/uniqueness_spec.rb +2504 -0
  730. data/spec/mongoid/validatable_spec.rb +327 -0
  731. data/spec/mongoid/warnings_spec.rb +35 -0
  732. data/spec/mongoid_spec.rb +20 -20
  733. data/spec/rails/controller_extension/controller_runtime_spec.rb +112 -0
  734. data/spec/rails/mongoid_spec.rb +37 -354
  735. data/spec/shared/LICENSE +20 -0
  736. data/spec/shared/bin/get-mongodb-download-url +17 -0
  737. data/spec/shared/bin/s3-copy +45 -0
  738. data/spec/shared/bin/s3-upload +69 -0
  739. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  740. data/spec/shared/lib/mrss/cluster_config.rb +231 -0
  741. data/spec/shared/lib/mrss/constraints.rb +378 -0
  742. data/spec/shared/lib/mrss/docker_runner.rb +291 -0
  743. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  744. data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
  745. data/spec/shared/lib/mrss/lite_constraints.rb +230 -0
  746. data/spec/shared/lib/mrss/server_version_registry.rb +120 -0
  747. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  748. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  749. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  750. data/spec/shared/lib/mrss/utils.rb +15 -0
  751. data/spec/shared/share/Dockerfile.erb +325 -0
  752. data/spec/shared/share/haproxy-1.conf +16 -0
  753. data/spec/shared/share/haproxy-2.conf +17 -0
  754. data/spec/shared/shlib/config.sh +27 -0
  755. data/spec/shared/shlib/distro.sh +74 -0
  756. data/spec/shared/shlib/server.sh +392 -0
  757. data/spec/shared/shlib/set_env.sh +169 -0
  758. data/spec/spec_helper.rb +163 -42
  759. data/spec/support/authorization.rb +15 -0
  760. data/spec/support/client_registry.rb +9 -0
  761. data/spec/support/constraints.rb +77 -0
  762. data/spec/support/expectations.rb +32 -0
  763. data/spec/support/helpers.rb +11 -0
  764. data/spec/support/macros.rb +81 -0
  765. data/spec/support/models/account.rb +38 -0
  766. data/spec/support/models/acolyte.rb +19 -0
  767. data/spec/support/models/actor.rb +20 -0
  768. data/spec/support/models/actress.rb +4 -0
  769. data/spec/support/models/address.rb +85 -0
  770. data/spec/support/models/address_component.rb +7 -0
  771. data/spec/support/models/address_number.rb +8 -0
  772. data/spec/support/models/agency.rb +7 -0
  773. data/spec/support/models/agent.rb +18 -0
  774. data/spec/support/models/album.rb +20 -0
  775. data/spec/support/models/alert.rb +9 -0
  776. data/spec/support/models/animal.rb +28 -0
  777. data/spec/support/models/answer.rb +8 -0
  778. data/spec/support/models/appointment.rb +9 -0
  779. data/spec/support/models/armrest.rb +9 -0
  780. data/spec/support/models/array_field.rb +7 -0
  781. data/spec/support/models/article.rb +14 -0
  782. data/spec/support/models/artist.rb +91 -0
  783. data/spec/support/models/artwork.rb +6 -0
  784. data/spec/support/models/audible_sound.rb +3 -0
  785. data/spec/support/models/audio.rb +7 -0
  786. data/spec/support/models/augmentation.rb +25 -0
  787. data/spec/support/models/author.rb +8 -0
  788. data/spec/support/models/baby.rb +6 -0
  789. data/spec/support/models/band.rb +40 -0
  790. data/spec/support/models/bar.rb +12 -0
  791. data/spec/support/models/basic.rb +8 -0
  792. data/spec/support/models/bed.rb +3 -0
  793. data/spec/support/models/big_palette.rb +4 -0
  794. data/spec/support/models/birthday.rb +15 -0
  795. data/spec/support/models/bolt.rb +7 -0
  796. data/spec/support/models/bomb.rb +6 -0
  797. data/spec/support/models/book.rb +18 -0
  798. data/spec/support/models/breed.rb +6 -0
  799. data/spec/support/models/browser.rb +8 -0
  800. data/spec/support/models/building.rb +8 -0
  801. data/spec/support/models/building_address.rb +9 -0
  802. data/spec/support/models/bus.rb +9 -0
  803. data/spec/support/models/business.rb +7 -0
  804. data/spec/support/models/callback_test.rb +11 -0
  805. data/spec/support/models/canvas.rb +27 -0
  806. data/spec/support/models/car.rb +3 -0
  807. data/spec/support/models/cat.rb +10 -0
  808. data/spec/support/models/catalog.rb +24 -0
  809. data/spec/support/models/category.rb +10 -0
  810. data/spec/support/models/child.rb +6 -0
  811. data/spec/support/models/child_doc.rb +24 -0
  812. data/spec/support/models/church.rb +8 -0
  813. data/spec/support/models/circle.rb +5 -0
  814. data/spec/support/models/circuit.rb +6 -0
  815. data/spec/support/models/circus.rb +12 -0
  816. data/spec/support/models/code.rb +15 -0
  817. data/spec/support/models/coding/pull_request.rb +11 -0
  818. data/spec/support/models/coding.rb +3 -0
  819. data/spec/support/models/comment.rb +18 -0
  820. data/spec/support/models/company.rb +7 -0
  821. data/spec/support/models/consumption_period.rb +9 -0
  822. data/spec/support/models/contextable_item.rb +7 -0
  823. data/spec/support/models/contractor.rb +7 -0
  824. data/spec/support/models/cookie.rb +8 -0
  825. data/spec/support/models/country_code.rb +12 -0
  826. data/spec/support/models/courier_job.rb +6 -0
  827. data/spec/support/models/crate.rb +12 -0
  828. data/spec/support/models/customer.rb +10 -0
  829. data/spec/support/models/customer_address.rb +11 -0
  830. data/spec/support/models/deed.rb +7 -0
  831. data/spec/support/models/definition.rb +11 -0
  832. data/spec/support/models/delegating_patient.rb +15 -0
  833. data/spec/support/models/description.rb +13 -0
  834. data/spec/support/models/dictionary.rb +18 -0
  835. data/spec/support/models/division.rb +12 -0
  836. data/spec/support/models/doctor.rb +14 -0
  837. data/spec/support/models/dog.rb +9 -0
  838. data/spec/support/models/dokument.rb +8 -0
  839. data/spec/support/models/draft.rb +11 -0
  840. data/spec/support/models/dragon.rb +6 -0
  841. data/spec/support/models/driver.rb +9 -0
  842. data/spec/support/models/drug.rb +8 -0
  843. data/spec/support/models/dungeon.rb +6 -0
  844. data/spec/support/models/edit.rb +7 -0
  845. data/spec/support/models/email.rb +8 -0
  846. data/spec/support/models/employer.rb +7 -0
  847. data/spec/support/models/entry.rb +8 -0
  848. data/spec/support/models/eraser.rb +3 -0
  849. data/spec/support/models/even.rb +9 -0
  850. data/spec/support/models/event.rb +24 -0
  851. data/spec/support/models/exhibition.rb +6 -0
  852. data/spec/support/models/exhibitor.rb +8 -0
  853. data/spec/support/models/explosion.rb +6 -0
  854. data/spec/support/models/eye.rb +11 -0
  855. data/spec/support/models/eye_bowl.rb +11 -0
  856. data/spec/support/models/face.rb +10 -0
  857. data/spec/support/models/fanatic.rb +8 -0
  858. data/spec/support/models/favorite.rb +8 -0
  859. data/spec/support/models/filesystem.rb +7 -0
  860. data/spec/support/models/fire_hydrant.rb +8 -0
  861. data/spec/support/models/firefox.rb +6 -0
  862. data/spec/support/models/fish.rb +9 -0
  863. data/spec/support/models/folder.rb +9 -0
  864. data/spec/support/models/folder_item.rb +11 -0
  865. data/spec/support/models/fruits.rb +36 -0
  866. data/spec/support/models/game.rb +21 -0
  867. data/spec/support/models/ghost.rb +9 -0
  868. data/spec/support/models/guitar.rb +4 -0
  869. data/spec/support/models/hole.rb +12 -0
  870. data/spec/support/models/home.rb +6 -0
  871. data/spec/support/models/house.rb +8 -0
  872. data/spec/support/models/html_writer.rb +5 -0
  873. data/spec/support/models/id_key.rb +8 -0
  874. data/spec/support/models/idnodef.rb +7 -0
  875. data/spec/support/models/image.rb +24 -0
  876. data/spec/support/models/implant.rb +27 -0
  877. data/spec/support/models/instrument.rb +8 -0
  878. data/spec/support/models/item.rb +10 -0
  879. data/spec/support/models/jar.rb +9 -0
  880. data/spec/support/models/kaleidoscope.rb +8 -0
  881. data/spec/support/models/kangaroo.rb +6 -0
  882. data/spec/support/models/label.rb +52 -0
  883. data/spec/support/models/language.rb +7 -0
  884. data/spec/support/models/lat_lng.rb +17 -0
  885. data/spec/support/models/league.rb +13 -0
  886. data/spec/support/models/learner.rb +4 -0
  887. data/spec/support/models/line_item.rb +8 -0
  888. data/spec/support/models/location.rb +10 -0
  889. data/spec/support/models/login.rb +10 -0
  890. data/spec/support/models/manufacturer.rb +9 -0
  891. data/spec/support/models/meat.rb +6 -0
  892. data/spec/support/models/membership.rb +7 -0
  893. data/spec/support/models/message.rb +13 -0
  894. data/spec/support/models/minim.rb +6 -0
  895. data/spec/support/models/mixed_drink.rb +6 -0
  896. data/spec/support/models/mop.rb +24 -0
  897. data/spec/support/models/movie.rb +15 -0
  898. data/spec/support/models/my_hash.rb +4 -0
  899. data/spec/support/models/name.rb +26 -0
  900. data/spec/support/models/name_only.rb +8 -0
  901. data/spec/support/models/node.rb +7 -0
  902. data/spec/support/models/note.rb +19 -0
  903. data/spec/support/models/nut.rb +7 -0
  904. data/spec/support/models/odd.rb +9 -0
  905. data/spec/support/models/order.rb +12 -0
  906. data/spec/support/models/ordered_post.rb +13 -0
  907. data/spec/support/models/ordered_preference.rb +8 -0
  908. data/spec/support/models/oscar.rb +16 -0
  909. data/spec/support/models/other_owner_object.rb +4 -0
  910. data/spec/support/models/override.rb +18 -0
  911. data/spec/support/models/ownable.rb +8 -0
  912. data/spec/support/models/owner.rb +10 -0
  913. data/spec/support/models/pack.rb +5 -0
  914. data/spec/support/models/page.rb +18 -0
  915. data/spec/support/models/page_question.rb +6 -0
  916. data/spec/support/models/palette.rb +9 -0
  917. data/spec/support/models/parent.rb +7 -0
  918. data/spec/support/models/parent_doc.rb +8 -0
  919. data/spec/support/models/passport.rb +22 -0
  920. data/spec/support/models/patient.rb +11 -0
  921. data/spec/support/models/pdf_writer.rb +5 -0
  922. data/spec/support/models/pencil.rb +3 -0
  923. data/spec/support/models/person.rb +231 -0
  924. data/spec/support/models/pet.rb +25 -0
  925. data/spec/support/models/pet_owner.rb +8 -0
  926. data/spec/support/models/phone.rb +13 -0
  927. data/spec/support/models/piano.rb +4 -0
  928. data/spec/support/models/pizza.rb +9 -0
  929. data/spec/support/models/player.rb +39 -0
  930. data/spec/support/models/post.rb +52 -0
  931. data/spec/support/models/post_genre.rb +8 -0
  932. data/spec/support/models/powerup.rb +25 -0
  933. data/spec/support/models/preference.rb +11 -0
  934. data/spec/support/models/princess.rb +12 -0
  935. data/spec/support/models/product.rb +19 -0
  936. data/spec/support/models/profile.rb +17 -0
  937. data/spec/support/models/pronunciation.rb +7 -0
  938. data/spec/support/models/pub.rb +8 -0
  939. data/spec/support/models/publication/encyclopedia.rb +11 -0
  940. data/spec/support/models/publication/review.rb +13 -0
  941. data/spec/support/models/publication.rb +4 -0
  942. data/spec/support/models/purchase.rb +6 -0
  943. data/spec/support/models/purchased_item.rb +10 -0
  944. data/spec/support/models/question.rb +10 -0
  945. data/spec/support/models/quiz.rb +9 -0
  946. data/spec/support/models/rating.rb +10 -0
  947. data/spec/support/models/record.rb +54 -0
  948. data/spec/support/models/registry.rb +7 -0
  949. data/spec/support/models/role.rb +9 -0
  950. data/spec/support/models/root_category.rb +6 -0
  951. data/spec/support/models/sandwich.rb +11 -0
  952. data/spec/support/models/scheduler.rb +9 -0
  953. data/spec/support/models/school.rb +14 -0
  954. data/spec/support/models/scribe.rb +7 -0
  955. data/spec/support/models/sealer.rb +7 -0
  956. data/spec/support/models/seat.rb +24 -0
  957. data/spec/support/models/seo.rb +9 -0
  958. data/spec/support/models/series.rb +7 -0
  959. data/spec/support/models/server.rb +15 -0
  960. data/spec/support/models/service.rb +24 -0
  961. data/spec/support/models/shape.rb +14 -0
  962. data/spec/support/models/shelf.rb +7 -0
  963. data/spec/support/models/shield.rb +18 -0
  964. data/spec/support/models/shipment_address.rb +5 -0
  965. data/spec/support/models/shipping_container.rb +7 -0
  966. data/spec/support/models/shipping_pack.rb +5 -0
  967. data/spec/support/models/shirt.rb +11 -0
  968. data/spec/support/models/shop.rb +8 -0
  969. data/spec/support/models/short_agent.rb +6 -0
  970. data/spec/support/models/short_quiz.rb +7 -0
  971. data/spec/support/models/simple.rb +7 -0
  972. data/spec/support/models/slave.rb +8 -0
  973. data/spec/support/models/song.rb +10 -0
  974. data/spec/support/models/sound.rb +7 -0
  975. data/spec/support/models/spacer.rb +7 -0
  976. data/spec/support/models/square.rb +6 -0
  977. data/spec/support/models/staff.rb +9 -0
  978. data/spec/support/models/store_as_dup_test1.rb +7 -0
  979. data/spec/support/models/store_as_dup_test2.rb +7 -0
  980. data/spec/support/models/store_as_dup_test3.rb +7 -0
  981. data/spec/support/models/store_as_dup_test4.rb +7 -0
  982. data/spec/support/models/strategy.rb +5 -0
  983. data/spec/support/models/student.rb +14 -0
  984. data/spec/support/models/sub_item.rb +5 -0
  985. data/spec/support/models/subscription.rb +7 -0
  986. data/spec/support/models/survey.rb +7 -0
  987. data/spec/support/models/symptom.rb +8 -0
  988. data/spec/support/models/system_role.rb +7 -0
  989. data/spec/support/models/tag.rb +10 -0
  990. data/spec/support/models/target.rb +7 -0
  991. data/spec/support/models/template.rb +7 -0
  992. data/spec/support/models/thing.rb +11 -0
  993. data/spec/support/models/threadlocker.rb +7 -0
  994. data/spec/support/models/title.rb +5 -0
  995. data/spec/support/models/tool.rb +10 -0
  996. data/spec/support/models/topping.rb +7 -0
  997. data/spec/support/models/toy.rb +9 -0
  998. data/spec/support/models/track.rb +40 -0
  999. data/spec/support/models/translation.rb +7 -0
  1000. data/spec/support/models/tree.rb +11 -0
  1001. data/spec/support/models/truck.rb +7 -0
  1002. data/spec/support/models/updatable.rb +7 -0
  1003. data/spec/support/models/user.rb +23 -0
  1004. data/spec/support/models/user_account.rb +12 -0
  1005. data/spec/support/models/validation_callback.rb +12 -0
  1006. data/spec/support/models/vehicle.rb +18 -0
  1007. data/spec/support/models/version.rb +7 -0
  1008. data/spec/support/models/vertex.rb +8 -0
  1009. data/spec/support/models/vet_visit.rb +7 -0
  1010. data/spec/support/models/video.rb +15 -0
  1011. data/spec/support/models/video_game.rb +3 -0
  1012. data/spec/support/models/washer.rb +7 -0
  1013. data/spec/support/models/weapon.rb +25 -0
  1014. data/spec/support/models/wiki_page.rb +17 -0
  1015. data/spec/support/models/word.rb +17 -0
  1016. data/spec/support/models/word_origin.rb +13 -0
  1017. data/spec/support/models/writer.rb +13 -0
  1018. data/spec/support/schema_maps/schema_map_aws.json +17 -0
  1019. data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  1020. data/spec/support/schema_maps/schema_map_azure.json +17 -0
  1021. data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  1022. data/spec/support/schema_maps/schema_map_gcp.json +17 -0
  1023. data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  1024. data/spec/support/schema_maps/schema_map_kmip.json +17 -0
  1025. data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  1026. data/spec/support/schema_maps/schema_map_local.json +18 -0
  1027. data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
  1028. data/spec/support/shared/time.rb +53 -0
  1029. data/spec/support/spec_config.rb +64 -0
  1030. data.tar.gz.sig +0 -0
  1031. metadata +1582 -912
  1032. metadata.gz.sig +0 -0
  1033. data/lib/mongoid/atomic/positionable.rb +0 -73
  1034. data/lib/mongoid/callbacks.rb +0 -314
  1035. data/lib/mongoid/components.rb +0 -93
  1036. data/lib/mongoid/config/inflections.rb +0 -6
  1037. data/lib/mongoid/config/validators/session.rb +0 -140
  1038. data/lib/mongoid/contextual/eager.rb +0 -158
  1039. data/lib/mongoid/contextual/find_and_modify.rb +0 -69
  1040. data/lib/mongoid/criterion/findable.rb +0 -179
  1041. data/lib/mongoid/criterion/inspection.rb +0 -25
  1042. data/lib/mongoid/criterion/marshalable.rb +0 -48
  1043. data/lib/mongoid/criterion/modifiable.rb +0 -189
  1044. data/lib/mongoid/criterion/scoping.rb +0 -158
  1045. data/lib/mongoid/dirty.rb +0 -376
  1046. data/lib/mongoid/errors/eager_load.rb +0 -22
  1047. data/lib/mongoid/errors/mixed_session_configuration.rb +0 -28
  1048. data/lib/mongoid/errors/no_default_session.rb +0 -23
  1049. data/lib/mongoid/errors/no_session_config.rb +0 -22
  1050. data/lib/mongoid/errors/no_session_database.rb +0 -27
  1051. data/lib/mongoid/errors/no_session_hosts.rb +0 -27
  1052. data/lib/mongoid/errors/no_sessions_config.rb +0 -20
  1053. data/lib/mongoid/errors/versioning_not_on_root.rb +0 -23
  1054. data/lib/mongoid/finders.rb +0 -130
  1055. data/lib/mongoid/hierarchy.rb +0 -188
  1056. data/lib/mongoid/identity_map.rb +0 -163
  1057. data/lib/mongoid/indexes/validators/options.rb +0 -102
  1058. data/lib/mongoid/indexes.rb +0 -154
  1059. data/lib/mongoid/inspection.rb +0 -55
  1060. data/lib/mongoid/json.rb +0 -16
  1061. data/lib/mongoid/matchers/all.rb +0 -27
  1062. data/lib/mongoid/matchers/and.rb +0 -30
  1063. data/lib/mongoid/matchers/default.rb +0 -72
  1064. data/lib/mongoid/matchers/exists.rb +0 -23
  1065. data/lib/mongoid/matchers/gt.rb +0 -21
  1066. data/lib/mongoid/matchers/gte.rb +0 -21
  1067. data/lib/mongoid/matchers/in.rb +0 -24
  1068. data/lib/mongoid/matchers/lt.rb +0 -21
  1069. data/lib/mongoid/matchers/lte.rb +0 -21
  1070. data/lib/mongoid/matchers/ne.rb +0 -21
  1071. data/lib/mongoid/matchers/nin.rb +0 -21
  1072. data/lib/mongoid/matchers/or.rb +0 -33
  1073. data/lib/mongoid/matchers/size.rb +0 -21
  1074. data/lib/mongoid/matchers/strategies.rb +0 -97
  1075. data/lib/mongoid/matchers.rb +0 -32
  1076. data/lib/mongoid/multi_parameter_attributes.rb +0 -105
  1077. data/lib/mongoid/nested_attributes.rb +0 -78
  1078. data/lib/mongoid/observer.rb +0 -192
  1079. data/lib/mongoid/paranoia.rb +0 -137
  1080. data/lib/mongoid/persistence/atomic/add_to_set.rb +0 -47
  1081. data/lib/mongoid/persistence/atomic/bit.rb +0 -35
  1082. data/lib/mongoid/persistence/atomic/inc.rb +0 -45
  1083. data/lib/mongoid/persistence/atomic/operation.rb +0 -154
  1084. data/lib/mongoid/persistence/atomic/pop.rb +0 -32
  1085. data/lib/mongoid/persistence/atomic/pull.rb +0 -32
  1086. data/lib/mongoid/persistence/atomic/pull_all.rb +0 -32
  1087. data/lib/mongoid/persistence/atomic/push.rb +0 -25
  1088. data/lib/mongoid/persistence/atomic/push_all.rb +0 -25
  1089. data/lib/mongoid/persistence/atomic/rename.rb +0 -30
  1090. data/lib/mongoid/persistence/atomic/sets.rb +0 -28
  1091. data/lib/mongoid/persistence/atomic/unset.rb +0 -27
  1092. data/lib/mongoid/persistence/atomic.rb +0 -231
  1093. data/lib/mongoid/persistence/deletion.rb +0 -32
  1094. data/lib/mongoid/persistence/insertion.rb +0 -38
  1095. data/lib/mongoid/persistence/modification.rb +0 -35
  1096. data/lib/mongoid/persistence/operations/embedded/insert.rb +0 -46
  1097. data/lib/mongoid/persistence/operations/embedded/remove.rb +0 -43
  1098. data/lib/mongoid/persistence/operations/insert.rb +0 -34
  1099. data/lib/mongoid/persistence/operations/remove.rb +0 -33
  1100. data/lib/mongoid/persistence/operations/update.rb +0 -59
  1101. data/lib/mongoid/persistence/operations/upsert.rb +0 -28
  1102. data/lib/mongoid/persistence/operations.rb +0 -214
  1103. data/lib/mongoid/persistence/upsertion.rb +0 -31
  1104. data/lib/mongoid/persistence.rb +0 -352
  1105. data/lib/mongoid/railties/document.rb +0 -12
  1106. data/lib/mongoid/relations/accessors.rb +0 -299
  1107. data/lib/mongoid/relations/auto_save.rb +0 -107
  1108. data/lib/mongoid/relations/binding.rb +0 -241
  1109. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -63
  1110. data/lib/mongoid/relations/bindings/embedded/many.rb +0 -52
  1111. data/lib/mongoid/relations/bindings/embedded/one.rb +0 -55
  1112. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -70
  1113. data/lib/mongoid/relations/bindings/referenced/many.rb +0 -42
  1114. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -67
  1115. data/lib/mongoid/relations/bindings/referenced/one.rb +0 -44
  1116. data/lib/mongoid/relations/bindings.rb +0 -9
  1117. data/lib/mongoid/relations/builder.rb +0 -57
  1118. data/lib/mongoid/relations/builders/embedded/in.rb +0 -29
  1119. data/lib/mongoid/relations/builders/embedded/many.rb +0 -36
  1120. data/lib/mongoid/relations/builders/embedded/one.rb +0 -30
  1121. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -177
  1122. data/lib/mongoid/relations/builders/nested_attributes/one.rb +0 -127
  1123. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  1124. data/lib/mongoid/relations/builders/referenced/many.rb +0 -27
  1125. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -40
  1126. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  1127. data/lib/mongoid/relations/builders.rb +0 -104
  1128. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  1129. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  1130. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  1131. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  1132. data/lib/mongoid/relations/cascading.rb +0 -58
  1133. data/lib/mongoid/relations/constraint.rb +0 -49
  1134. data/lib/mongoid/relations/conversions.rb +0 -34
  1135. data/lib/mongoid/relations/counter_cache.rb +0 -107
  1136. data/lib/mongoid/relations/cyclic.rb +0 -107
  1137. data/lib/mongoid/relations/embedded/batchable.rb +0 -356
  1138. data/lib/mongoid/relations/embedded/in.rb +0 -231
  1139. data/lib/mongoid/relations/embedded/many.rb +0 -659
  1140. data/lib/mongoid/relations/embedded/one.rb +0 -223
  1141. data/lib/mongoid/relations/macros.rb +0 -359
  1142. data/lib/mongoid/relations/many.rb +0 -217
  1143. data/lib/mongoid/relations/marshalable.rb +0 -32
  1144. data/lib/mongoid/relations/metadata.rb +0 -1227
  1145. data/lib/mongoid/relations/nested_builder.rb +0 -74
  1146. data/lib/mongoid/relations/one.rb +0 -60
  1147. data/lib/mongoid/relations/options.rb +0 -48
  1148. data/lib/mongoid/relations/polymorphic.rb +0 -40
  1149. data/lib/mongoid/relations/proxy.rb +0 -264
  1150. data/lib/mongoid/relations/referenced/in.rb +0 -314
  1151. data/lib/mongoid/relations/referenced/many.rb +0 -789
  1152. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -495
  1153. data/lib/mongoid/relations/referenced/one.rb +0 -297
  1154. data/lib/mongoid/relations/reflections.rb +0 -62
  1155. data/lib/mongoid/relations/synchronization.rb +0 -169
  1156. data/lib/mongoid/relations/targets/enumerable.rb +0 -473
  1157. data/lib/mongoid/relations/targets.rb +0 -2
  1158. data/lib/mongoid/relations/touchable.rb +0 -61
  1159. data/lib/mongoid/relations.rb +0 -162
  1160. data/lib/mongoid/reloading.rb +0 -92
  1161. data/lib/mongoid/scoping.rb +0 -356
  1162. data/lib/mongoid/serialization.rb +0 -161
  1163. data/lib/mongoid/sessions/factory.rb +0 -129
  1164. data/lib/mongoid/sessions/mongo_uri.rb +0 -93
  1165. data/lib/mongoid/sessions/validators/storage.rb +0 -49
  1166. data/lib/mongoid/sessions/validators.rb +0 -2
  1167. data/lib/mongoid/sessions.rb +0 -433
  1168. data/lib/mongoid/sharding.rb +0 -61
  1169. data/lib/mongoid/state.rb +0 -97
  1170. data/lib/mongoid/unit_of_work.rb +0 -61
  1171. data/lib/mongoid/validations/associated.rb +0 -46
  1172. data/lib/mongoid/validations/format.rb +0 -20
  1173. data/lib/mongoid/validations/length.rb +0 -20
  1174. data/lib/mongoid/validations/localizable.rb +0 -30
  1175. data/lib/mongoid/validations/macros.rb +0 -93
  1176. data/lib/mongoid/validations/presence.rb +0 -86
  1177. data/lib/mongoid/validations/queryable.rb +0 -31
  1178. data/lib/mongoid/validations/uniqueness.rb +0 -330
  1179. data/lib/mongoid/validations.rb +0 -166
  1180. data/lib/mongoid/versioning.rb +0 -217
  1181. data/lib/rack/mongoid/middleware/identity_map.rb +0 -39
  1182. data/lib/rack/mongoid.rb +0 -2
  1183. data/lib/rails/generators/mongoid/observer/observer_generator.rb +0 -17
  1184. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +0 -4
  1185. data/lib/support/ruby_version.rb +0 -26
  1186. data/spec/app/models/account.rb +0 -32
  1187. data/spec/app/models/acolyte.rb +0 -16
  1188. data/spec/app/models/actor.rb +0 -19
  1189. data/spec/app/models/actor_observer.rb +0 -15
  1190. data/spec/app/models/actress.rb +0 -2
  1191. data/spec/app/models/address.rb +0 -72
  1192. data/spec/app/models/address_component.rb +0 -5
  1193. data/spec/app/models/address_number.rb +0 -6
  1194. data/spec/app/models/agency.rb +0 -5
  1195. data/spec/app/models/agent.rb +0 -12
  1196. data/spec/app/models/album.rb +0 -14
  1197. data/spec/app/models/alert.rb +0 -5
  1198. data/spec/app/models/animal.rb +0 -25
  1199. data/spec/app/models/answer.rb +0 -4
  1200. data/spec/app/models/appointment.rb +0 -7
  1201. data/spec/app/models/article.rb +0 -13
  1202. data/spec/app/models/artist.rb +0 -66
  1203. data/spec/app/models/artwork.rb +0 -4
  1204. data/spec/app/models/augmentation.rb +0 -11
  1205. data/spec/app/models/author.rb +0 -6
  1206. data/spec/app/models/band.rb +0 -25
  1207. data/spec/app/models/bar.rb +0 -9
  1208. data/spec/app/models/basic.rb +0 -6
  1209. data/spec/app/models/bed.rb +0 -1
  1210. data/spec/app/models/big_palette.rb +0 -2
  1211. data/spec/app/models/birthday.rb +0 -13
  1212. data/spec/app/models/book.rb +0 -12
  1213. data/spec/app/models/breed.rb +0 -4
  1214. data/spec/app/models/browser.rb +0 -6
  1215. data/spec/app/models/building.rb +0 -7
  1216. data/spec/app/models/building_address.rb +0 -7
  1217. data/spec/app/models/bus.rb +0 -7
  1218. data/spec/app/models/business.rb +0 -5
  1219. data/spec/app/models/callback_recorder.rb +0 -25
  1220. data/spec/app/models/callback_test.rb +0 -9
  1221. data/spec/app/models/canvas.rb +0 -25
  1222. data/spec/app/models/car.rb +0 -1
  1223. data/spec/app/models/cat.rb +0 -8
  1224. data/spec/app/models/category.rb +0 -8
  1225. data/spec/app/models/child.rb +0 -4
  1226. data/spec/app/models/child_doc.rb +0 -22
  1227. data/spec/app/models/church.rb +0 -4
  1228. data/spec/app/models/circle.rb +0 -3
  1229. data/spec/app/models/circuit.rb +0 -4
  1230. data/spec/app/models/circus.rb +0 -7
  1231. data/spec/app/models/code.rb +0 -5
  1232. data/spec/app/models/comment.rb +0 -16
  1233. data/spec/app/models/contractor.rb +0 -7
  1234. data/spec/app/models/cookie.rb +0 -6
  1235. data/spec/app/models/country_code.rb +0 -8
  1236. data/spec/app/models/definition.rb +0 -8
  1237. data/spec/app/models/description.rb +0 -11
  1238. data/spec/app/models/dictionary.rb +0 -10
  1239. data/spec/app/models/division.rb +0 -10
  1240. data/spec/app/models/doctor.rb +0 -12
  1241. data/spec/app/models/dog.rb +0 -7
  1242. data/spec/app/models/dokument.rb +0 -5
  1243. data/spec/app/models/driver.rb +0 -7
  1244. data/spec/app/models/drug.rb +0 -8
  1245. data/spec/app/models/email.rb +0 -6
  1246. data/spec/app/models/employer.rb +0 -5
  1247. data/spec/app/models/entry.rb +0 -6
  1248. data/spec/app/models/eraser.rb +0 -1
  1249. data/spec/app/models/event.rb +0 -22
  1250. data/spec/app/models/exhibition.rb +0 -4
  1251. data/spec/app/models/exhibitor.rb +0 -5
  1252. data/spec/app/models/eye.rb +0 -9
  1253. data/spec/app/models/eye_bowl.rb +0 -9
  1254. data/spec/app/models/face.rb +0 -8
  1255. data/spec/app/models/favorite.rb +0 -6
  1256. data/spec/app/models/filesystem.rb +0 -4
  1257. data/spec/app/models/fire_hydrant.rb +0 -6
  1258. data/spec/app/models/firefox.rb +0 -4
  1259. data/spec/app/models/fish.rb +0 -8
  1260. data/spec/app/models/folder.rb +0 -7
  1261. data/spec/app/models/folder_item.rb +0 -9
  1262. data/spec/app/models/fruits.rb +0 -28
  1263. data/spec/app/models/game.rb +0 -21
  1264. data/spec/app/models/ghost.rb +0 -7
  1265. data/spec/app/models/home.rb +0 -4
  1266. data/spec/app/models/house.rb +0 -8
  1267. data/spec/app/models/html_writer.rb +0 -3
  1268. data/spec/app/models/image.rb +0 -22
  1269. data/spec/app/models/implant.rb +0 -16
  1270. data/spec/app/models/item.rb +0 -12
  1271. data/spec/app/models/jar.rb +0 -7
  1272. data/spec/app/models/label.rb +0 -40
  1273. data/spec/app/models/language.rb +0 -5
  1274. data/spec/app/models/lat_lng.rb +0 -15
  1275. data/spec/app/models/league.rb +0 -11
  1276. data/spec/app/models/learner.rb +0 -2
  1277. data/spec/app/models/line_item.rb +0 -6
  1278. data/spec/app/models/location.rb +0 -8
  1279. data/spec/app/models/login.rb +0 -8
  1280. data/spec/app/models/manufacturer.rb +0 -7
  1281. data/spec/app/models/meat.rb +0 -4
  1282. data/spec/app/models/membership.rb +0 -4
  1283. data/spec/app/models/mixed_drink.rb +0 -4
  1284. data/spec/app/models/movie.rb +0 -12
  1285. data/spec/app/models/my_hash.rb +0 -2
  1286. data/spec/app/models/name.rb +0 -23
  1287. data/spec/app/models/node.rb +0 -5
  1288. data/spec/app/models/note.rb +0 -12
  1289. data/spec/app/models/ordered_post.rb +0 -6
  1290. data/spec/app/models/ordered_preference.rb +0 -6
  1291. data/spec/app/models/oscar.rb +0 -15
  1292. data/spec/app/models/override.rb +0 -16
  1293. data/spec/app/models/ownable.rb +0 -6
  1294. data/spec/app/models/owner.rb +0 -6
  1295. data/spec/app/models/pack.rb +0 -3
  1296. data/spec/app/models/page.rb +0 -5
  1297. data/spec/app/models/page_question.rb +0 -4
  1298. data/spec/app/models/palette.rb +0 -7
  1299. data/spec/app/models/paranoid_phone.rb +0 -25
  1300. data/spec/app/models/paranoid_post.rb +0 -36
  1301. data/spec/app/models/parent.rb +0 -5
  1302. data/spec/app/models/parent_doc.rb +0 -6
  1303. data/spec/app/models/passport.rb +0 -5
  1304. data/spec/app/models/patient.rb +0 -9
  1305. data/spec/app/models/pdf_writer.rb +0 -3
  1306. data/spec/app/models/pencil.rb +0 -1
  1307. data/spec/app/models/person.rb +0 -201
  1308. data/spec/app/models/pet.rb +0 -23
  1309. data/spec/app/models/pet_owner.rb +0 -6
  1310. data/spec/app/models/phone.rb +0 -11
  1311. data/spec/app/models/phone_observer.rb +0 -6
  1312. data/spec/app/models/pizza.rb +0 -7
  1313. data/spec/app/models/player.rb +0 -35
  1314. data/spec/app/models/post.rb +0 -43
  1315. data/spec/app/models/powerup.rb +0 -11
  1316. data/spec/app/models/preference.rb +0 -9
  1317. data/spec/app/models/princess.rb +0 -8
  1318. data/spec/app/models/product.rb +0 -17
  1319. data/spec/app/models/profile.rb +0 -5
  1320. data/spec/app/models/pronunciation.rb +0 -5
  1321. data/spec/app/models/purchase.rb +0 -4
  1322. data/spec/app/models/question.rb +0 -8
  1323. data/spec/app/models/quiz.rb +0 -10
  1324. data/spec/app/models/rating.rb +0 -8
  1325. data/spec/app/models/record.rb +0 -46
  1326. data/spec/app/models/registry.rb +0 -4
  1327. data/spec/app/models/role.rb +0 -7
  1328. data/spec/app/models/root_category.rb +0 -4
  1329. data/spec/app/models/sandwich.rb +0 -4
  1330. data/spec/app/models/scheduler.rb +0 -7
  1331. data/spec/app/models/seo.rb +0 -7
  1332. data/spec/app/models/series.rb +0 -4
  1333. data/spec/app/models/server.rb +0 -13
  1334. data/spec/app/models/service.rb +0 -22
  1335. data/spec/app/models/shape.rb +0 -12
  1336. data/spec/app/models/shelf.rb +0 -5
  1337. data/spec/app/models/shipping_container.rb +0 -5
  1338. data/spec/app/models/shipping_pack.rb +0 -3
  1339. data/spec/app/models/shop.rb +0 -6
  1340. data/spec/app/models/short_agent.rb +0 -4
  1341. data/spec/app/models/short_quiz.rb +0 -5
  1342. data/spec/app/models/slave.rb +0 -6
  1343. data/spec/app/models/song.rb +0 -8
  1344. data/spec/app/models/square.rb +0 -4
  1345. data/spec/app/models/strategy.rb +0 -3
  1346. data/spec/app/models/sub_item.rb +0 -3
  1347. data/spec/app/models/subscription.rb +0 -4
  1348. data/spec/app/models/survey.rb +0 -5
  1349. data/spec/app/models/symptom.rb +0 -6
  1350. data/spec/app/models/tag.rb +0 -8
  1351. data/spec/app/models/target.rb +0 -5
  1352. data/spec/app/models/template.rb +0 -5
  1353. data/spec/app/models/thing.rb +0 -9
  1354. data/spec/app/models/title.rb +0 -4
  1355. data/spec/app/models/tool.rb +0 -8
  1356. data/spec/app/models/topping.rb +0 -5
  1357. data/spec/app/models/track.rb +0 -38
  1358. data/spec/app/models/translation.rb +0 -5
  1359. data/spec/app/models/tree.rb +0 -9
  1360. data/spec/app/models/truck.rb +0 -3
  1361. data/spec/app/models/user.rb +0 -21
  1362. data/spec/app/models/user_account.rb +0 -10
  1363. data/spec/app/models/validation_callback.rb +0 -10
  1364. data/spec/app/models/vehicle.rb +0 -11
  1365. data/spec/app/models/version.rb +0 -5
  1366. data/spec/app/models/vet_visit.rb +0 -5
  1367. data/spec/app/models/video.rb +0 -17
  1368. data/spec/app/models/video_game.rb +0 -1
  1369. data/spec/app/models/weapon.rb +0 -11
  1370. data/spec/app/models/wiki_page.rb +0 -17
  1371. data/spec/app/models/word.rb +0 -12
  1372. data/spec/app/models/word_origin.rb +0 -11
  1373. data/spec/app/models/writer.rb +0 -11
  1374. data/spec/mongoid/atomic/positionable_spec.rb +0 -227
  1375. data/spec/mongoid/attributes/processing_spec.rb +0 -149
  1376. data/spec/mongoid/callbacks_spec.rb +0 -1564
  1377. data/spec/mongoid/components_spec.rb +0 -24
  1378. data/spec/mongoid/contextual/find_and_modify_spec.rb +0 -220
  1379. data/spec/mongoid/criterion/destructive_spec.rb +0 -101
  1380. data/spec/mongoid/criterion/inspection_spec.rb +0 -27
  1381. data/spec/mongoid/criterion/marshalable_spec.rb +0 -28
  1382. data/spec/mongoid/criterion/modifiable_spec.rb +0 -409
  1383. data/spec/mongoid/criterion/modification_spec.rb +0 -402
  1384. data/spec/mongoid/criterion/scoping_spec.rb +0 -391
  1385. data/spec/mongoid/dirty_spec.rb +0 -1508
  1386. data/spec/mongoid/errors/eager_load_spec.rb +0 -29
  1387. data/spec/mongoid/errors/mixed_session_configuration_spec.rb +0 -29
  1388. data/spec/mongoid/errors/no_session_config_spec.rb +0 -29
  1389. data/spec/mongoid/errors/no_session_database_spec.rb +0 -29
  1390. data/spec/mongoid/errors/no_session_hosts_spec.rb +0 -29
  1391. data/spec/mongoid/errors/no_sessions_config_spec.rb +0 -29
  1392. data/spec/mongoid/errors/versioning_not_on_root_spec.rb +0 -29
  1393. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  1394. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  1395. data/spec/mongoid/finders_spec.rb +0 -321
  1396. data/spec/mongoid/hierarchy_spec.rb +0 -244
  1397. data/spec/mongoid/identity_map_spec.rb +0 -564
  1398. data/spec/mongoid/indexes_spec.rb +0 -404
  1399. data/spec/mongoid/inspection_spec.rb +0 -57
  1400. data/spec/mongoid/json_spec.rb +0 -33
  1401. data/spec/mongoid/matchers/all_spec.rb +0 -31
  1402. data/spec/mongoid/matchers/and_spec.rb +0 -162
  1403. data/spec/mongoid/matchers/default_spec.rb +0 -130
  1404. data/spec/mongoid/matchers/exists_spec.rb +0 -57
  1405. data/spec/mongoid/matchers/gt_spec.rb +0 -74
  1406. data/spec/mongoid/matchers/gte_spec.rb +0 -74
  1407. data/spec/mongoid/matchers/in_spec.rb +0 -25
  1408. data/spec/mongoid/matchers/lt_spec.rb +0 -74
  1409. data/spec/mongoid/matchers/lte_spec.rb +0 -74
  1410. data/spec/mongoid/matchers/ne_spec.rb +0 -25
  1411. data/spec/mongoid/matchers/nin_spec.rb +0 -25
  1412. data/spec/mongoid/matchers/or_spec.rb +0 -106
  1413. data/spec/mongoid/matchers/size_spec.rb +0 -25
  1414. data/spec/mongoid/matchers_spec.rb +0 -532
  1415. data/spec/mongoid/multi_parameter_attributes_spec.rb +0 -128
  1416. data/spec/mongoid/nested_attributes_spec.rb +0 -4945
  1417. data/spec/mongoid/observer_spec.rb +0 -290
  1418. data/spec/mongoid/paranoia_spec.rb +0 -759
  1419. data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +0 -262
  1420. data/spec/mongoid/persistence/atomic/bit_spec.rb +0 -88
  1421. data/spec/mongoid/persistence/atomic/inc_spec.rb +0 -133
  1422. data/spec/mongoid/persistence/atomic/pop_spec.rb +0 -111
  1423. data/spec/mongoid/persistence/atomic/pull_all_spec.rb +0 -77
  1424. data/spec/mongoid/persistence/atomic/pull_spec.rb +0 -80
  1425. data/spec/mongoid/persistence/atomic/push_all_spec.rb +0 -77
  1426. data/spec/mongoid/persistence/atomic/push_spec.rb +0 -77
  1427. data/spec/mongoid/persistence/atomic/rename_spec.rb +0 -42
  1428. data/spec/mongoid/persistence/atomic/sets_spec.rb +0 -154
  1429. data/spec/mongoid/persistence/atomic/unset_spec.rb +0 -65
  1430. data/spec/mongoid/persistence/atomic_spec.rb +0 -216
  1431. data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +0 -191
  1432. data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +0 -8
  1433. data/spec/mongoid/persistence/operations/insert_spec.rb +0 -149
  1434. data/spec/mongoid/persistence/operations/remove_spec.rb +0 -113
  1435. data/spec/mongoid/persistence/operations/update_spec.rb +0 -141
  1436. data/spec/mongoid/persistence/operations/upsert_spec.rb +0 -59
  1437. data/spec/mongoid/persistence/operations_spec.rb +0 -313
  1438. data/spec/mongoid/persistence_spec.rb +0 -2279
  1439. data/spec/mongoid/railties/document_spec.rb +0 -24
  1440. data/spec/mongoid/relations/accessors_spec.rb +0 -844
  1441. data/spec/mongoid/relations/auto_save_spec.rb +0 -261
  1442. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +0 -171
  1443. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +0 -54
  1444. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +0 -77
  1445. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +0 -241
  1446. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +0 -153
  1447. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +0 -178
  1448. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +0 -131
  1449. data/spec/mongoid/relations/builders/embedded/in_spec.rb +0 -34
  1450. data/spec/mongoid/relations/builders/embedded/many_spec.rb +0 -132
  1451. data/spec/mongoid/relations/builders/embedded/one_spec.rb +0 -99
  1452. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +0 -234
  1453. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +0 -250
  1454. data/spec/mongoid/relations/builders/referenced/in_spec.rb +0 -241
  1455. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  1456. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  1457. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -124
  1458. data/spec/mongoid/relations/builders_spec.rb +0 -226
  1459. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  1460. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  1461. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  1462. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  1463. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  1464. data/spec/mongoid/relations/constraint_spec.rb +0 -74
  1465. data/spec/mongoid/relations/conversions_spec.rb +0 -126
  1466. data/spec/mongoid/relations/counter_cache_spec.rb +0 -205
  1467. data/spec/mongoid/relations/cyclic_spec.rb +0 -156
  1468. data/spec/mongoid/relations/embedded/dirty_spec.rb +0 -65
  1469. data/spec/mongoid/relations/embedded/in_spec.rb +0 -580
  1470. data/spec/mongoid/relations/embedded/many_spec.rb +0 -3841
  1471. data/spec/mongoid/relations/embedded/one_spec.rb +0 -1055
  1472. data/spec/mongoid/relations/macros_spec.rb +0 -625
  1473. data/spec/mongoid/relations/metadata_spec.rb +0 -2030
  1474. data/spec/mongoid/relations/options_spec.rb +0 -35
  1475. data/spec/mongoid/relations/polymorphic_spec.rb +0 -132
  1476. data/spec/mongoid/relations/referenced/in_spec.rb +0 -1501
  1477. data/spec/mongoid/relations/referenced/many_spec.rb +0 -3632
  1478. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +0 -3561
  1479. data/spec/mongoid/relations/referenced/one_spec.rb +0 -1331
  1480. data/spec/mongoid/relations/reflections_spec.rb +0 -101
  1481. data/spec/mongoid/relations/synchronization_spec.rb +0 -453
  1482. data/spec/mongoid/relations/targets/enumerable_spec.rb +0 -1710
  1483. data/spec/mongoid/relations_spec.rb +0 -188
  1484. data/spec/mongoid/reloading_spec.rb +0 -305
  1485. data/spec/mongoid/scoping_spec.rb +0 -978
  1486. data/spec/mongoid/serialization_spec.rb +0 -833
  1487. data/spec/mongoid/sessions/factory_spec.rb +0 -312
  1488. data/spec/mongoid/sessions/mongo_uri_spec.rb +0 -103
  1489. data/spec/mongoid/sessions_spec.rb +0 -1111
  1490. data/spec/mongoid/sharding_spec.rb +0 -61
  1491. data/spec/mongoid/state_spec.rb +0 -102
  1492. data/spec/mongoid/unit_of_work_spec.rb +0 -196
  1493. data/spec/mongoid/validations/associated_spec.rb +0 -183
  1494. data/spec/mongoid/validations/format_spec.rb +0 -83
  1495. data/spec/mongoid/validations/length_spec.rb +0 -223
  1496. data/spec/mongoid/validations/numericality_spec.rb +0 -30
  1497. data/spec/mongoid/validations/presence_spec.rb +0 -592
  1498. data/spec/mongoid/validations/uniqueness_spec.rb +0 -2399
  1499. data/spec/mongoid/validations_spec.rb +0 -309
  1500. data/spec/mongoid/versioning_spec.rb +0 -540
  1501. data/spec/rack/mongoid/middleware/identity_map_spec.rb +0 -72
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  describe Mongoid::Contextual::Memory do
@@ -27,7 +29,7 @@ describe Mongoid::Contextual::Memory do
27
29
  end
28
30
 
29
31
  it "returns false" do
30
- context.send(method).should be_false
32
+ expect(context.send(method)).to be false
31
33
  end
32
34
  end
33
35
 
@@ -44,7 +46,22 @@ describe Mongoid::Contextual::Memory do
44
46
  end
45
47
 
46
48
  it "returns true" do
47
- context.send(method).should be_true
49
+ expect(context.send(method)).to be true
50
+ end
51
+ end
52
+
53
+ context 'when there is a collation on the criteria' do
54
+
55
+ let(:criteria) do
56
+ Address.where(street: "hobrecht").tap do |crit|
57
+ crit.documents = [ hobrecht, friedel ]
58
+ end.collation(locale: 'en_US', strength: 2)
59
+ end
60
+
61
+ it "raises an exception" do
62
+ expect {
63
+ context.send(method)
64
+ }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
48
65
  end
49
66
  end
50
67
  end
@@ -73,7 +90,22 @@ describe Mongoid::Contextual::Memory do
73
90
  context "context when no arguments are provided" do
74
91
 
75
92
  it "returns the number of matches" do
76
- context.count.should eq(1)
93
+ expect(context.count).to eq(1)
94
+ end
95
+ end
96
+
97
+ context 'when there is a collation on the criteria' do
98
+
99
+ let(:criteria) do
100
+ Address.where(street: "hobrecht").tap do |crit|
101
+ crit.documents = [ hobrecht, friedel ]
102
+ end.collation(locale: 'en_US', strength: 2)
103
+ end
104
+
105
+ it "raises an exception" do
106
+ expect {
107
+ context.count
108
+ }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
77
109
  end
78
110
  end
79
111
 
@@ -86,7 +118,7 @@ describe Mongoid::Contextual::Memory do
86
118
  end
87
119
 
88
120
  it "returns 1" do
89
- count.should eq(1)
121
+ expect(count).to eq(1)
90
122
  end
91
123
  end
92
124
 
@@ -97,7 +129,7 @@ describe Mongoid::Contextual::Memory do
97
129
  end
98
130
 
99
131
  it "returns 0" do
100
- count.should eq(0)
132
+ expect(count).to eq(0)
101
133
  end
102
134
  end
103
135
  end
@@ -113,7 +145,7 @@ describe Mongoid::Contextual::Memory do
113
145
  end
114
146
 
115
147
  it "returns 1" do
116
- count.should eq(1)
148
+ expect(count).to eq(1)
117
149
  end
118
150
  end
119
151
 
@@ -126,7 +158,7 @@ describe Mongoid::Contextual::Memory do
126
158
  end
127
159
 
128
160
  it "returns 0" do
129
- count.should eq(0)
161
+ expect(count).to eq(0)
130
162
  end
131
163
  end
132
164
  end
@@ -135,19 +167,19 @@ describe Mongoid::Contextual::Memory do
135
167
  [ :delete, :delete_all ].each do |method|
136
168
 
137
169
  let(:person) do
138
- Person.create
170
+ Person.create!
139
171
  end
140
172
 
141
173
  let(:hobrecht) do
142
- person.addresses.create(street: "hobrecht")
174
+ person.addresses.create!(street: "hobrecht")
143
175
  end
144
176
 
145
177
  let(:friedel) do
146
- person.addresses.create(street: "friedel")
178
+ person.addresses.create!(street: "friedel")
147
179
  end
148
180
 
149
181
  let(:pfluger) do
150
- person.addresses.create(street: "pfluger")
182
+ person.addresses.create!(street: "pfluger")
151
183
  end
152
184
 
153
185
  describe "##{method}" do
@@ -169,42 +201,42 @@ describe Mongoid::Contextual::Memory do
169
201
  end
170
202
 
171
203
  it "deletes the first matching document" do
172
- hobrecht.should be_destroyed
204
+ expect(hobrecht).to be_destroyed
173
205
  end
174
206
 
175
207
  it "deletes the last matching document" do
176
- friedel.should be_destroyed
208
+ expect(friedel).to be_destroyed
177
209
  end
178
210
 
179
211
  it "does not delete non matching docs" do
180
- pfluger.should_not be_destroyed
212
+ expect(pfluger).to_not be_destroyed
181
213
  end
182
214
 
183
215
  it "removes the docs from the relation" do
184
- person.addresses.should eq([ pfluger ])
216
+ expect(person.addresses).to eq([ pfluger ])
185
217
  end
186
218
 
187
219
  it "removes the docs from the context" do
188
- context.entries.should be_empty
220
+ expect(context.entries).to be_empty
189
221
  end
190
222
 
191
223
  it "persists the changes to the database" do
192
- person.reload.addresses.should eq([ pfluger ])
224
+ expect(person.reload.addresses).to eq([ pfluger ])
193
225
  end
194
226
 
195
227
  it "returns the number of deleted documents" do
196
- deleted.should eq(2)
228
+ expect(deleted).to eq(2)
197
229
  end
198
230
  end
199
231
 
200
232
  context "when embedded multiple levels" do
201
233
 
202
234
  let!(:home) do
203
- hobrecht.locations.create(name: "home")
235
+ hobrecht.locations.create!(name: "home")
204
236
  end
205
237
 
206
238
  let!(:work) do
207
- hobrecht.locations.create(name: "work")
239
+ hobrecht.locations.create!(name: "work")
208
240
  end
209
241
 
210
242
  let(:criteria) do
@@ -222,27 +254,42 @@ describe Mongoid::Contextual::Memory do
222
254
  end
223
255
 
224
256
  it "deletes the first matching document" do
225
- work.should be_destroyed
257
+ expect(work).to be_destroyed
226
258
  end
227
259
 
228
260
  it "does not delete non matching docs" do
229
- home.should_not be_destroyed
261
+ expect(home).to_not be_destroyed
230
262
  end
231
263
 
232
264
  it "removes the docs from the relation" do
233
- person.addresses.first.locations.should eq([ home ])
265
+ expect(person.addresses.first.locations).to eq([ home ])
234
266
  end
235
267
 
236
268
  it "removes the docs from the context" do
237
- context.entries.should be_empty
269
+ expect(context.entries).to be_empty
238
270
  end
239
271
 
240
272
  it "persists the changes to the database" do
241
- person.reload.addresses.first.locations.should eq([ home ])
273
+ expect(person.reload.addresses.first.locations).to eq([ home ])
242
274
  end
243
275
 
244
276
  it "returns the number of deleted documents" do
245
- deleted.should eq(1)
277
+ expect(deleted).to eq(1)
278
+ end
279
+ end
280
+
281
+ context 'when there is a collation on the criteria' do
282
+
283
+ let(:criteria) do
284
+ Address.any_in(street: [ "hobrecht", "friedel" ]).tap do |crit|
285
+ crit.documents = [ hobrecht, friedel, pfluger ]
286
+ end.collation(locale: 'en_US', strength: 2)
287
+ end
288
+
289
+ it "raises an exception" do
290
+ expect {
291
+ context.send(method)
292
+ }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
246
293
  end
247
294
  end
248
295
  end
@@ -251,19 +298,19 @@ describe Mongoid::Contextual::Memory do
251
298
  [ :destroy, :destroy_all ].each do |method|
252
299
 
253
300
  let(:person) do
254
- Person.create
301
+ Person.create!
255
302
  end
256
303
 
257
304
  let(:hobrecht) do
258
- person.addresses.create(street: "hobrecht")
305
+ person.addresses.create!(street: "hobrecht")
259
306
  end
260
307
 
261
308
  let(:friedel) do
262
- person.addresses.create(street: "friedel")
309
+ person.addresses.create!(street: "friedel")
263
310
  end
264
311
 
265
312
  let(:pfluger) do
266
- person.addresses.create(street: "pfluger")
313
+ person.addresses.create!(street: "pfluger")
267
314
  end
268
315
 
269
316
  let(:criteria) do
@@ -278,55 +325,131 @@ describe Mongoid::Contextual::Memory do
278
325
 
279
326
  describe "##{method}" do
280
327
 
281
- let!(:destroyed) do
282
- context.send(method)
283
- end
328
+ context 'when there is no collation on the criteria' do
284
329
 
285
- it "deletes the first matching document" do
286
- hobrecht.should be_destroyed
287
- end
330
+ let!(:destroyed) do
331
+ context.send(method)
332
+ end
333
+
334
+ it "deletes the first matching document" do
335
+ expect(hobrecht).to be_destroyed
336
+ end
337
+
338
+ it "deletes the last matching document" do
339
+ expect(friedel).to be_destroyed
340
+ end
341
+
342
+ it "does not delete non matching docs" do
343
+ expect(pfluger).to_not be_destroyed
344
+ end
345
+
346
+ it "removes the docs from the relation" do
347
+ expect(person.addresses).to eq([ pfluger ])
348
+ end
349
+
350
+ it "removes the docs from the context" do
351
+ expect(context.entries).to be_empty
352
+ end
353
+
354
+ it "persists the changes to the database" do
355
+ expect(person.reload.addresses).to eq([ pfluger ])
356
+ end
288
357
 
289
- it "deletes the last matching document" do
290
- friedel.should be_destroyed
358
+ it "returns the number of destroyed documents" do
359
+ expect(destroyed).to eq(2)
360
+ end
291
361
  end
292
362
 
293
- it "does not delete non matching docs" do
294
- pfluger.should_not be_destroyed
363
+ context 'when there is a collation on the criteria' do
364
+
365
+ let(:criteria) do
366
+ Address.any_in(street: [ "hobrecht", "friedel" ]).tap do |crit|
367
+ crit.documents = [ hobrecht, friedel, pfluger ]
368
+ end.collation(locale: 'en_US', strength: 2)
369
+ end
370
+
371
+ it "raises an exception" do
372
+ expect {
373
+ context.send(method)
374
+ }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
375
+ end
295
376
  end
377
+ end
378
+ end
379
+
380
+ describe "#distinct" do
381
+
382
+ context "when legacy_pluck_distinct is true" do
383
+ config_override :legacy_pluck_distinct, true
296
384
 
297
- it "removes the docs from the relation" do
298
- person.addresses.should eq([ pfluger ])
385
+ let(:hobrecht) do
386
+ Address.new(street: "hobrecht")
299
387
  end
300
388
 
301
- it "removes the docs from the context" do
302
- context.entries.should be_empty
389
+ let(:friedel) do
390
+ Address.new(street: "friedel")
303
391
  end
304
392
 
305
- it "persists the changes to the database" do
306
- person.reload.addresses.should eq([ pfluger ])
393
+ context "when limiting the result set" do
394
+
395
+ let(:criteria) do
396
+ Address.where(street: "hobrecht").tap do |crit|
397
+ crit.documents = [ hobrecht, hobrecht, friedel ]
398
+ end
399
+ end
400
+
401
+ let(:context) do
402
+ described_class.new(criteria)
403
+ end
404
+
405
+ it "returns the distinct field values" do
406
+ expect(context.distinct(:street)).to eq([ "hobrecht" ])
407
+ end
307
408
  end
308
409
 
309
- it "returns the number of destroyed documents" do
310
- destroyed.should eq(2)
410
+ context "when not limiting the result set" do
411
+
412
+ let(:criteria) do
413
+ Address.all.tap do |crit|
414
+ crit.documents = [ hobrecht, friedel, friedel ]
415
+ end
416
+ end
417
+
418
+ let(:context) do
419
+ described_class.new(criteria)
420
+ end
421
+
422
+ it "returns the distinct field values" do
423
+ expect(context.distinct(:street)).to eq([ "hobrecht", "friedel" ])
424
+ end
311
425
  end
312
- end
313
- end
314
426
 
315
- describe "#distinct" do
427
+ context 'when there is a collation on the criteria' do
316
428
 
317
- let(:hobrecht) do
318
- Address.new(street: "hobrecht")
319
- end
429
+ let(:criteria) do
430
+ Address.where(street: "hobrecht").tap do |crit|
431
+ crit.documents = [ hobrecht, hobrecht, friedel ]
432
+ end.collation(locale: 'en_US', strength: 2)
433
+ end
320
434
 
321
- let(:friedel) do
322
- Address.new(street: "friedel")
435
+ it "raises an exception" do
436
+ expect {
437
+ context.distinct(:street)
438
+ }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
439
+ end
440
+ end
323
441
  end
324
442
 
325
- context "when limiting the result set" do
443
+ context "when legacy_pluck_distinct is false" do
444
+ config_override :legacy_pluck_distinct, false
445
+
446
+ let(:depeche) { Band.create!(name: "Depeche Mode", years: 30, sales: "1E2") }
447
+ let(:new_order) { Band.create!(name: "New Order", years: 25, sales: "2E3") }
448
+ let(:maniacs) { Band.create!(name: "10,000 Maniacs", years: 20, sales: "1E2") }
326
449
 
327
450
  let(:criteria) do
328
- Address.where(street: "hobrecht").tap do |crit|
329
- crit.documents = [ hobrecht, hobrecht, friedel ]
451
+ Band.all.tap do |crit|
452
+ crit.documents = [ depeche, new_order, maniacs ]
330
453
  end
331
454
  end
332
455
 
@@ -334,25 +457,180 @@ describe Mongoid::Contextual::Memory do
334
457
  described_class.new(criteria)
335
458
  end
336
459
 
337
- it "returns the distinct field values" do
338
- context.distinct(:street).should eq([ "hobrecht" ])
460
+ context "when limiting the result set" do
461
+
462
+ let(:criteria) do
463
+ Band.where(name: "Depeche Mode").tap do |crit|
464
+ crit.documents = [ depeche ]
465
+ end
466
+ end
467
+
468
+ it "returns the distinct matching fields" do
469
+ expect(context.distinct(:name)).to eq([ "Depeche Mode" ])
470
+ end
471
+ end
472
+
473
+ context "when not limiting the result set" do
474
+
475
+ it "returns the distinct field values" do
476
+ expect(context.distinct(:name).sort).to eq([ "10,000 Maniacs", "Depeche Mode", "New Order" ].sort)
477
+ end
339
478
  end
340
- end
341
479
 
342
- context "when not limiting the result set" do
480
+ context "when providing an aliased field" do
343
481
 
344
- let(:criteria) do
345
- Address.all.tap do |crit|
346
- crit.documents = [ hobrecht, friedel, friedel ]
482
+ it "returns the distinct field values" do
483
+ expect(context.distinct(:years).sort).to eq([ 20, 25, 30 ])
347
484
  end
348
485
  end
349
486
 
350
- let(:context) do
351
- described_class.new(criteria)
487
+ context "when providing a demongoizable field" do
488
+
489
+ it "returns the non-demongoized distinct field values" do
490
+ expect(context.distinct(:sales).sort).to eq([ BigDecimal("1E2"), BigDecimal("2E3") ])
491
+ end
492
+ end
493
+
494
+ context "when getting a localized field" do
495
+ before do
496
+ I18n.locale = :en
497
+ d = Dictionary.create!(description: 'english-text')
498
+ I18n.locale = :de
499
+ d.description = 'deutsch-text'
500
+ d.save!
501
+ end
502
+
503
+ after do
504
+ I18n.locale = :en
505
+ end
506
+
507
+ let(:criteria) do
508
+ Dictionary.all.tap do |crit|
509
+ crit.documents = [ Dictionary.first ]
510
+ end
511
+ end
512
+
513
+ context "when getting the field without _translations" do
514
+ it "gets the demongoized localized field" do
515
+ expect(context.distinct(:description)).to eq([ 'deutsch-text' ])
516
+ end
517
+ end
518
+
519
+ context "when getting the field with _translations" do
520
+
521
+ it "gets the full hash" do
522
+ expect(context.distinct(:description_translations)).to eq([ { "de" => "deutsch-text", "en" => "english-text" } ])
523
+ end
524
+ end
525
+
526
+ context 'when plucking a specific locale' do
527
+
528
+ let(:distinct) do
529
+ context.distinct(:'description.de')
530
+ end
531
+
532
+ it 'returns the specific translation' do
533
+ expect(distinct).to eq([ "deutsch-text" ])
534
+ end
535
+ end
536
+
537
+ context 'when plucking a specific locale from _translations field' do
538
+
539
+ let(:distinct) do
540
+ context.distinct(:'description_translations.de')
541
+ end
542
+
543
+ it 'returns the specific translations' do
544
+ expect(distinct).to eq(['deutsch-text'])
545
+ end
546
+ end
547
+
548
+ context 'when fallbacks are enabled with a locale list' do
549
+ require_fallbacks
550
+
551
+ around(:all) do |example|
552
+ prev_fallbacks = I18n.fallbacks.dup
553
+ I18n.fallbacks[:he] = [ :en ]
554
+ example.run
555
+ I18n.fallbacks = prev_fallbacks
556
+ end
557
+
558
+ after do
559
+ I18n.locale = :en
560
+ end
561
+
562
+ let(:distinct) do
563
+ context.distinct(:description).first
564
+ end
565
+
566
+ it "correctly uses the fallback" do
567
+ I18n.locale = :en
568
+ d = Dictionary.create!(description: 'english-text')
569
+ I18n.locale = :he
570
+ distinct.should == "english-text"
571
+ end
572
+ end
573
+
574
+ context "when the localized field is embedded" do
575
+ let(:person) do
576
+ p = Passport.new
577
+ I18n.locale = :en
578
+ p.name = "Neil"
579
+ I18n.locale = :he
580
+ p.name = "Nissim"
581
+
582
+ Person.create!(passport: p, employer_id: 12345)
583
+ end
584
+
585
+ after do
586
+ I18n.locale = :en
587
+ end
588
+
589
+ let(:criteria) do
590
+ Person.where(employer_id: 12345).tap do |crit|
591
+ crit.documents = [ person ]
592
+ end
593
+ end
594
+
595
+ let(:distinct) do
596
+ context.distinct("pass.name").first
597
+ end
598
+
599
+ let(:distinct_translations) do
600
+ context.distinct("pass.name_translations").first
601
+ end
602
+
603
+ let(:distinct_translations_field) do
604
+ context.distinct("pass.name_translations.en").first
605
+ end
606
+
607
+ it "returns the translation for the current locale" do
608
+ expect(distinct).to eq("Nissim")
609
+ end
610
+
611
+ it "returns the full _translation hash" do
612
+ expect(distinct_translations).to eq({ "en" => "Neil", "he" => "Nissim" })
613
+ end
614
+
615
+ it "returns the translation for the requested locale" do
616
+ expect(distinct_translations_field).to eq("Neil")
617
+ end
618
+ end
352
619
  end
353
620
 
354
- it "returns the distinct field values" do
355
- context.distinct(:street).should eq([ "hobrecht", "friedel" ])
621
+ context "when getting an embedded field" do
622
+
623
+ let(:label) { Label.new(sales: "1E2") }
624
+ let!(:band) { Band.create!(label: label) }
625
+ let(:criteria) do
626
+ Band.where(_id: band.id).tap do |crit|
627
+ crit.documents = [ band ]
628
+ end
629
+ end
630
+
631
+ it "returns the distinct matching fields" do
632
+ expect(context.distinct("label.sales")).to eq([ BigDecimal("1E2") ])
633
+ end
356
634
  end
357
635
  end
358
636
  end
@@ -384,7 +662,7 @@ describe Mongoid::Contextual::Memory do
384
662
  end
385
663
 
386
664
  it "contains no documents" do
387
- context.map(&:street).should be_empty
665
+ expect(context.map(&:street)).to be_empty
388
666
  end
389
667
 
390
668
  context "when calling next on the enumerator" do
@@ -401,13 +679,13 @@ describe Mongoid::Contextual::Memory do
401
679
 
402
680
  it "yields mongoid documents to the block" do
403
681
  context.each do |doc|
404
- doc.should be_a(Mongoid::Document)
682
+ expect(doc).to be_a(Mongoid::Document)
405
683
  end
406
684
  end
407
685
 
408
686
  it "iterates over the matching documents" do
409
687
  context.each do |doc|
410
- doc.should eq(hobrecht)
688
+ expect(doc).to eq(hobrecht)
411
689
  end
412
690
  end
413
691
  end
@@ -419,7 +697,7 @@ describe Mongoid::Contextual::Memory do
419
697
  end
420
698
 
421
699
  it "returns an enumerator" do
422
- enum.should be_a(Enumerator)
700
+ expect(enum).to be_a(Enumerator)
423
701
  end
424
702
 
425
703
  context "when iterating over the enumerator" do
@@ -428,7 +706,7 @@ describe Mongoid::Contextual::Memory do
428
706
 
429
707
  it "yields mongoid documents to the block" do
430
708
  enum.each do |doc|
431
- doc.should be_a(Mongoid::Document)
709
+ expect(doc).to be_a(Mongoid::Document)
432
710
  end
433
711
  end
434
712
  end
@@ -436,11 +714,26 @@ describe Mongoid::Contextual::Memory do
436
714
  context "when iterating with next" do
437
715
 
438
716
  it "yields mongoid documents" do
439
- enum.next.should be_a(Mongoid::Document)
717
+ expect(enum.next).to be_a(Mongoid::Document)
440
718
  end
441
719
  end
442
720
  end
443
721
  end
722
+
723
+ context 'when there is a collation on the criteria' do
724
+
725
+ let(:criteria) do
726
+ Address.where(street: "hobrecht").tap do |crit|
727
+ crit.documents = [ hobrecht, friedel ]
728
+ end.collation(locale: 'en_US', strength: 2)
729
+ end
730
+
731
+ it "raises an exception" do
732
+ expect {
733
+ context.each
734
+ }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
735
+ end
736
+ end
444
737
  end
445
738
 
446
739
  describe "#exists?" do
@@ -466,7 +759,7 @@ describe Mongoid::Contextual::Memory do
466
759
  end
467
760
 
468
761
  it "returns true" do
469
- context.should be_exists
762
+ expect(context).to be_exists
470
763
  end
471
764
  end
472
765
 
@@ -483,42 +776,29 @@ describe Mongoid::Contextual::Memory do
483
776
  end
484
777
 
485
778
  it "returns false" do
486
- context.should_not be_exists
779
+ expect(context).to_not be_exists
487
780
  end
488
781
  end
489
- end
490
-
491
- [ :first, :one ].each do |method|
492
-
493
- describe "##{method}" do
494
-
495
- let(:hobrecht) do
496
- Address.new(street: "hobrecht")
497
- end
498
782
 
499
- let(:friedel) do
500
- Address.new(street: "friedel")
501
- end
783
+ context 'when there is a collation on the criteria' do
502
784
 
503
785
  let(:criteria) do
504
- Address.where(:street.in => [ "hobrecht", "friedel" ]).tap do |crit|
786
+ Address.where(street: "pfluger").tap do |crit|
505
787
  crit.documents = [ hobrecht, friedel ]
506
- end
507
- end
508
-
509
- let(:context) do
510
- described_class.new(criteria)
788
+ end.collation(locale: 'en_US', strength: 2)
511
789
  end
512
790
 
513
- it "returns the first matching document" do
514
- context.send(method).should eq(hobrecht)
791
+ it "raises an exception" do
792
+ expect {
793
+ context
794
+ }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
515
795
  end
516
796
  end
517
797
  end
518
798
 
519
- describe "#initialize" do
799
+ [ :first, :one ].each do |method|
520
800
 
521
- context "when the criteria has no options" do
801
+ describe "##{method}" do
522
802
 
523
803
  let(:hobrecht) do
524
804
  Address.new(street: "hobrecht")
@@ -529,7 +809,7 @@ describe Mongoid::Contextual::Memory do
529
809
  end
530
810
 
531
811
  let(:criteria) do
532
- Address.where(street: "hobrecht").tap do |crit|
812
+ Address.where(:street.in => [ "hobrecht", "friedel" ]).tap do |crit|
533
813
  crit.documents = [ hobrecht, friedel ]
534
814
  end
535
815
  end
@@ -538,83 +818,1023 @@ describe Mongoid::Contextual::Memory do
538
818
  described_class.new(criteria)
539
819
  end
540
820
 
541
- it "sets the criteria" do
542
- context.criteria.should eq(criteria)
821
+ it "returns the first matching document" do
822
+ expect(context.send(method)).to eq(hobrecht)
543
823
  end
544
824
 
545
- it "sets the klass" do
546
- context.klass.should eq(Address)
825
+ it "returns a list when passing a limit" do
826
+ expect(context.send(method, 2)).to eq([ hobrecht, friedel ])
547
827
  end
548
828
 
549
- it "sets the matching documents" do
550
- context.documents.should eq([ hobrecht ])
829
+ it "returns a list when passing 1" do
830
+ expect(context.send(method, 1)).to eq([ hobrecht ])
551
831
  end
552
- end
553
-
554
- context "when the criteria skips" do
555
832
 
556
- let(:hobrecht) do
557
- Address.new(street: "hobrecht")
558
- end
833
+ context 'when there is a collation on the criteria' do
559
834
 
560
- let(:friedel) do
561
- Address.new(street: "friedel")
562
- end
835
+ let(:criteria) do
836
+ Address.where(:street.in => [ "hobrecht", "friedel" ]).tap do |crit|
837
+ crit.documents = [ hobrecht, friedel ]
838
+ end.collation(locale: 'en_US', strength: 2)
839
+ end
563
840
 
564
- let(:criteria) do
565
- Address.all.skip(1).tap do |crit|
566
- crit.documents = [ hobrecht, friedel ]
841
+ it "raises an exception" do
842
+ expect {
843
+ context.send(method)
844
+ }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
567
845
  end
568
846
  end
847
+ end
848
+ end
569
849
 
570
- let(:context) do
571
- described_class.new(criteria)
572
- end
850
+ describe "#take" do
573
851
 
574
- it "limits the matching documents" do
575
- context.should eq([ friedel ])
576
- end
852
+ let(:hobrecht) do
853
+ Address.new(street: "hobrecht")
577
854
  end
578
855
 
579
- context "when the criteria limits" do
580
-
856
+ let(:friedel) do
857
+ Address.new(street: "friedel")
858
+ end
859
+
860
+ let(:criteria) do
861
+ Address.where(:street.in => [ "hobrecht", "friedel" ]).tap do |crit|
862
+ crit.documents = [ hobrecht, friedel ]
863
+ end
864
+ end
865
+
866
+ let(:context) do
867
+ described_class.new(criteria)
868
+ end
869
+
870
+ it "returns the first matching document" do
871
+ expect(context.take).to eq(hobrecht)
872
+ end
873
+
874
+ it "returns an array when passing a limit" do
875
+ expect(context.take(2)).to eq([ hobrecht, friedel ])
876
+ end
877
+
878
+ it "returns an array when passing a limit as 1" do
879
+ expect(context.take(1)).to eq([ hobrecht ])
880
+ end
881
+
882
+ context 'when there is a collation on the criteria' do
883
+
884
+ let(:criteria) do
885
+ Address.where(:street.in => [ "hobrecht", "friedel" ]).tap do |crit|
886
+ crit.documents = [ hobrecht, friedel ]
887
+ end.collation(locale: 'en_US', strength: 2)
888
+ end
889
+
890
+ it "raises an exception" do
891
+ expect {
892
+ context.take
893
+ }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
894
+ end
895
+ end
896
+ end
897
+
898
+ describe "#take!" do
899
+
900
+ let(:hobrecht) do
901
+ Address.new(street: "hobrecht")
902
+ end
903
+
904
+ let(:friedel) do
905
+ Address.new(street: "friedel")
906
+ end
907
+
908
+ let(:criteria) do
909
+ Address.where(:street.in => [ "hobrecht", "friedel" ]).tap do |crit|
910
+ crit.documents = [ hobrecht, friedel ]
911
+ end
912
+ end
913
+
914
+ let(:context) do
915
+ described_class.new(criteria)
916
+ end
917
+
918
+ it "returns the first matching document" do
919
+ expect(context.take!).to eq(hobrecht)
920
+ end
921
+
922
+ context "when the criteria is empty" do
923
+ let(:criteria) do
924
+ Address.where(street: "bogus").tap do |crit|
925
+ crit.documents = []
926
+ end
927
+ end
928
+
929
+ it "raise an error" do
930
+ expect do
931
+ context.take!
932
+ end.to raise_error(Mongoid::Errors::DocumentNotFound, /Could not find a document of class Address./)
933
+ end
934
+ end
935
+
936
+ context 'when there is a collation on the criteria' do
937
+
938
+ let(:criteria) do
939
+ Address.where(:street.in => [ "hobrecht", "friedel" ]).tap do |crit|
940
+ crit.documents = [ hobrecht, friedel ]
941
+ end.collation(locale: 'en_US', strength: 2)
942
+ end
943
+
944
+ it "raises an exception" do
945
+ expect {
946
+ context.take
947
+ }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
948
+ end
949
+ end
950
+ end
951
+
952
+ describe "#initialize" do
953
+
954
+ context "when the criteria has no options" do
955
+
956
+ let(:hobrecht) do
957
+ Address.new(street: "hobrecht")
958
+ end
959
+
960
+ let(:friedel) do
961
+ Address.new(street: "friedel")
962
+ end
963
+
964
+ let(:criteria) do
965
+ Address.where(street: "hobrecht").tap do |crit|
966
+ crit.documents = [ hobrecht, friedel ]
967
+ end
968
+ end
969
+
970
+ let(:context) do
971
+ described_class.new(criteria)
972
+ end
973
+
974
+ it "sets the criteria" do
975
+ expect(context.criteria).to eq(criteria)
976
+ end
977
+
978
+ it "sets the klass" do
979
+ expect(context.klass).to eq(Address)
980
+ end
981
+
982
+ it "sets the matching documents" do
983
+ expect(context.documents).to eq([ hobrecht ])
984
+ end
985
+ end
986
+
987
+ context "when the criteria skips" do
988
+
989
+ let(:hobrecht) do
990
+ Address.new(street: "hobrecht")
991
+ end
992
+
993
+ let(:friedel) do
994
+ Address.new(street: "friedel")
995
+ end
996
+
997
+ let(:criteria) do
998
+ Address.all.skip(1).tap do |crit|
999
+ crit.documents = [ hobrecht, friedel ]
1000
+ end
1001
+ end
1002
+
1003
+ let(:context) do
1004
+ described_class.new(criteria)
1005
+ end
1006
+
1007
+ it "limits the matching documents" do
1008
+ expect(context).to eq([ friedel ])
1009
+ end
1010
+ end
1011
+
1012
+ context "when the criteria limits" do
1013
+
1014
+ let(:hobrecht) do
1015
+ Address.new(street: "hobrecht")
1016
+ end
1017
+
1018
+ let(:friedel) do
1019
+ Address.new(street: "friedel")
1020
+ end
1021
+
1022
+ let(:criteria) do
1023
+ Address.all.limit(1).tap do |crit|
1024
+ crit.documents = [ hobrecht, friedel ]
1025
+ end
1026
+ end
1027
+
1028
+ let(:context) do
1029
+ described_class.new(criteria)
1030
+ end
1031
+
1032
+ it "limits the matching documents" do
1033
+ expect(context).to eq([ hobrecht ])
1034
+ end
1035
+ end
1036
+
1037
+ context 'when there is a collation on the criteria' do
1038
+
1039
+ let(:criteria) do
1040
+ Address.all.limit(1).tap do |crit|
1041
+ crit.documents = [ hobrecht, friedel ]
1042
+ end.collation(locale: 'en_US', strength: 2)
1043
+ end
1044
+
1045
+ it "raises an exception" do
1046
+ expect {
1047
+ context
1048
+ }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
1049
+ end
1050
+ end
1051
+ end
1052
+
1053
+ describe "#last" do
1054
+
1055
+ let(:hobrecht) do
1056
+ Address.new(street: "hobrecht")
1057
+ end
1058
+
1059
+ let(:friedel) do
1060
+ Address.new(street: "friedel")
1061
+ end
1062
+
1063
+ let(:criteria) do
1064
+ Address.where(:street.in => [ "hobrecht", "friedel" ]).tap do |crit|
1065
+ crit.documents = [ hobrecht, friedel ]
1066
+ end
1067
+ end
1068
+
1069
+ let(:context) do
1070
+ described_class.new(criteria)
1071
+ end
1072
+
1073
+ it "returns the last matching document" do
1074
+ expect(context.last).to eq(friedel)
1075
+ end
1076
+
1077
+ it "returns a list when a limit is passed" do
1078
+ expect(context.last(2)).to eq([ hobrecht, friedel ])
1079
+ end
1080
+
1081
+ it "returns a list when the limit is 1" do
1082
+ expect(context.last(1)).to eq([ friedel ])
1083
+ end
1084
+
1085
+ context 'when there is a collation on the criteria' do
1086
+
1087
+ let(:criteria) do
1088
+ Address.where(:street.in => [ "hobrecht", "friedel" ]).tap do |crit|
1089
+ crit.documents = [ hobrecht, friedel ]
1090
+ end.collation(locale: 'en_US', strength: 2)
1091
+ end
1092
+
1093
+ it "raises an exception" do
1094
+ expect {
1095
+ context.last
1096
+ }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
1097
+ end
1098
+ end
1099
+ end
1100
+
1101
+ [ :length, :size ].each do |method|
1102
+
1103
+ describe "##{method}" do
1104
+
1105
+ let(:hobrecht) do
1106
+ Address.new(street: "hobrecht")
1107
+ end
1108
+
1109
+ let(:friedel) do
1110
+ Address.new(street: "friedel")
1111
+ end
1112
+
1113
+ context "when there are matching documents" do
1114
+
1115
+ let(:criteria) do
1116
+ Address.where(street: "hobrecht").tap do |crit|
1117
+ crit.documents = [ hobrecht, friedel ]
1118
+ end
1119
+ end
1120
+
1121
+ let(:context) do
1122
+ described_class.new(criteria)
1123
+ end
1124
+
1125
+ it "returns the number of matches" do
1126
+ expect(context.send(method)).to eq(1)
1127
+ end
1128
+ end
1129
+
1130
+ context "when there are no matching documents" do
1131
+
1132
+ let(:criteria) do
1133
+ Address.where(street: "pfluger").tap do |crit|
1134
+ crit.documents = [ hobrecht, friedel ]
1135
+ end
1136
+ end
1137
+
1138
+ let(:context) do
1139
+ described_class.new(criteria)
1140
+ end
1141
+
1142
+ it "returns zero" do
1143
+ expect(context.send(method)).to eq(0)
1144
+ end
1145
+ end
1146
+
1147
+ context 'when there is a collation on the criteria' do
1148
+
1149
+ let(:criteria) do
1150
+ Address.where(street: "hobrecht").tap do |crit|
1151
+ crit.documents = [ hobrecht, friedel ]
1152
+ end.collation(locale: 'en_US', strength: 2)
1153
+ end
1154
+
1155
+ it "raises an exception" do
1156
+ expect {
1157
+ context.send(method)
1158
+ }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
1159
+ end
1160
+ end
1161
+ end
1162
+ end
1163
+
1164
+ describe "#limit" do
1165
+
1166
+ let(:hobrecht) do
1167
+ Address.new(street: "hobrecht")
1168
+ end
1169
+
1170
+ let(:friedel) do
1171
+ Address.new(street: "friedel")
1172
+ end
1173
+
1174
+ let(:pfluger) do
1175
+ Address.new(street: "pfluger")
1176
+ end
1177
+
1178
+ let(:criteria) do
1179
+ Address.all.tap do |crit|
1180
+ crit.documents = [ hobrecht, friedel, pfluger ]
1181
+ end
1182
+ end
1183
+
1184
+ let(:context) do
1185
+ described_class.new(criteria)
1186
+ end
1187
+
1188
+ context 'when there is no collation on the criteria' do
1189
+
1190
+ let!(:limit) do
1191
+ context.limit(2)
1192
+ end
1193
+
1194
+ it "returns the context" do
1195
+ expect(limit).to eq(context)
1196
+ end
1197
+
1198
+ context "when asking for all documents" do
1199
+
1200
+ context "when only a limit exists" do
1201
+
1202
+ it "only returns the limited documents" do
1203
+ expect(context.entries).to eq([ hobrecht, friedel ])
1204
+ end
1205
+ end
1206
+
1207
+ context "when a skip and limit exist" do
1208
+
1209
+ before do
1210
+ limit.skip(1)
1211
+ end
1212
+
1213
+ it "applies the skip before the limit" do
1214
+ expect(context.entries).to eq([ friedel, pfluger ])
1215
+ end
1216
+ end
1217
+ end
1218
+ end
1219
+
1220
+ context 'when there is a collation on the criteria' do
1221
+
1222
+ let(:criteria) do
1223
+ Address.all.tap do |crit|
1224
+ crit.documents = [ hobrecht, friedel, pfluger ]
1225
+ end.collation(locale: 'en_US', strength: 2)
1226
+ end
1227
+
1228
+ it "raises an exception" do
1229
+ expect {
1230
+ context.limit(2)
1231
+ }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
1232
+ end
1233
+ end
1234
+ end
1235
+
1236
+ describe "#pluck" do
1237
+
1238
+ let(:context) do
1239
+ described_class.new(criteria)
1240
+ end
1241
+
1242
+ context "when legacy_pluck_distinct is true" do
1243
+ config_override :legacy_pluck_distinct, true
1244
+
581
1245
  let(:hobrecht) do
582
1246
  Address.new(street: "hobrecht")
583
1247
  end
584
1248
 
585
- let(:friedel) do
586
- Address.new(street: "friedel")
1249
+ let(:friedel) do
1250
+ Address.new(street: "friedel")
1251
+ end
1252
+
1253
+ let(:criteria) do
1254
+ Address.all.tap do |crit|
1255
+ crit.documents = [ hobrecht, friedel ]
1256
+ end
1257
+ end
1258
+
1259
+ context "when plucking" do
1260
+
1261
+ let!(:plucked) do
1262
+ context.pluck(:street)
1263
+ end
1264
+
1265
+ it "returns the values" do
1266
+ expect(plucked).to eq([ "hobrecht", "friedel" ])
1267
+ end
1268
+ end
1269
+
1270
+ context "when plucking a mix of empty and non-empty values" do
1271
+
1272
+ let(:empty_doc) do
1273
+ Address.new(street: nil)
1274
+ end
1275
+
1276
+ let(:criteria) do
1277
+ Address.all.tap do |crit|
1278
+ crit.documents = [ hobrecht, friedel, empty_doc ]
1279
+ end
1280
+ end
1281
+
1282
+ let!(:plucked) do
1283
+ context.pluck(:street)
1284
+ end
1285
+
1286
+ it "returns the values" do
1287
+ expect(plucked).to eq([ "hobrecht", "friedel", nil ])
1288
+ end
1289
+ end
1290
+
1291
+ context "when plucking a field that doesnt exist" do
1292
+
1293
+ context "when pluck one field" do
1294
+
1295
+ let(:plucked) do
1296
+ context.pluck(:foo)
1297
+ end
1298
+
1299
+ it "returns a empty array" do
1300
+ expect(plucked).to eq([nil, nil])
1301
+ end
1302
+ end
1303
+
1304
+ context "when pluck multiple fields" do
1305
+
1306
+ let(:plucked) do
1307
+ context.pluck(:foo, :bar)
1308
+ end
1309
+
1310
+ it "returns a empty array" do
1311
+ expect(plucked).to eq([[nil, nil], [nil, nil]])
1312
+ end
1313
+ end
1314
+ end
1315
+
1316
+ context 'when there is a collation on the criteria' do
1317
+
1318
+ let(:criteria) do
1319
+ Address.all.tap do |crit|
1320
+ crit.documents = [ hobrecht, friedel ]
1321
+ end.collation(locale: 'en_US', strength: 2)
1322
+ end
1323
+
1324
+ it "raises an exception" do
1325
+ expect {
1326
+ context.pluck(:foo, :bar)
1327
+ }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
1328
+ end
1329
+ end
1330
+ end
1331
+
1332
+ context "when legacy_pluck_distinct is false" do
1333
+ config_override :legacy_pluck_distinct, false
1334
+
1335
+ let!(:depeche) do
1336
+ Band.create!(name: "Depeche Mode", likes: 3)
1337
+ end
1338
+
1339
+ let!(:tool) do
1340
+ Band.create!(name: "Tool", likes: 3)
1341
+ end
1342
+
1343
+ let!(:photek) do
1344
+ Band.create!(name: "Photek", likes: 1)
1345
+ end
1346
+
1347
+ let!(:maniacs) do
1348
+ Band.create!(name: "10,000 Maniacs", likes: 1, sales: "1E2")
1349
+ end
1350
+
1351
+ let(:criteria) do
1352
+ Band.all.tap do |crit|
1353
+ crit.documents = [ depeche, tool, photek, maniacs ]
1354
+ end
1355
+ end
1356
+
1357
+ context "when the field is aliased" do
1358
+
1359
+ let!(:expensive) do
1360
+ Product.create!(price: 100000)
1361
+ end
1362
+
1363
+ let!(:cheap) do
1364
+ Product.create!(price: 1)
1365
+ end
1366
+
1367
+ let(:criteria) do
1368
+ Product.all.tap do |crit|
1369
+ crit.documents = [ expensive, cheap ]
1370
+ end
1371
+ end
1372
+
1373
+ context "when using alias_attribute" do
1374
+
1375
+ let(:plucked) do
1376
+ context.pluck(:price)
1377
+ end
1378
+
1379
+ it "uses the aliases" do
1380
+ expect(plucked).to eq([ 100000, 1 ])
1381
+ end
1382
+ end
1383
+ end
1384
+
1385
+ context "when the criteria matches" do
1386
+
1387
+ context "when there are no duplicate values" do
1388
+
1389
+ let!(:plucked) do
1390
+ context.pluck(:name)
1391
+ end
1392
+
1393
+ it "returns the values" do
1394
+ expect(plucked).to contain_exactly("10,000 Maniacs", "Depeche Mode", "Tool", "Photek")
1395
+ end
1396
+
1397
+ context "when subsequently executing the criteria without a pluck" do
1398
+
1399
+ it "does not limit the fields" do
1400
+ expect(context.first.likes).to eq(3)
1401
+ end
1402
+ end
1403
+
1404
+ context 'when the field is a subdocument' do
1405
+
1406
+ context 'when a top-level field and a subdocument field are plucked' do
1407
+ let(:criteria) do
1408
+ Band.where(name: 'FKA Twigs').tap do |crit|
1409
+ crit.documents = [
1410
+ Band.create!(name: 'FKA Twigs'),
1411
+ Band.create!(name: 'FKA Twigs', records: [ Record.new(name: 'LP1') ])
1412
+ ]
1413
+ end
1414
+ end
1415
+
1416
+ let(:embedded_pluck) do
1417
+ context.pluck(:name, 'records.name')
1418
+ end
1419
+
1420
+ let(:expected) do
1421
+ [
1422
+ ["FKA Twigs", []],
1423
+ ['FKA Twigs', ["LP1"]]
1424
+ ]
1425
+ end
1426
+
1427
+ it 'returns the list of top-level field and subdocument values' do
1428
+ expect(embedded_pluck).to eq(expected)
1429
+ end
1430
+ end
1431
+
1432
+ context 'when only a subdocument field is plucked' do
1433
+
1434
+ let(:criteria) do
1435
+ Band.where(name: 'FKA Twigs').tap do |crit|
1436
+ crit.documents = [
1437
+ Band.create!(name: 'FKA Twigs'),
1438
+ Band.create!(name: 'FKA Twigs', records: [ Record.new(name: 'LP1') ])
1439
+ ]
1440
+ end
1441
+ end
1442
+
1443
+ let(:embedded_pluck) do
1444
+ context.pluck('records.name')
1445
+ end
1446
+
1447
+ let(:expected) do
1448
+ [
1449
+ [],
1450
+ ["LP1"]
1451
+ ]
1452
+ end
1453
+
1454
+ it 'returns the list of subdocument values' do
1455
+ expect(embedded_pluck).to eq(expected)
1456
+ end
1457
+ end
1458
+ end
1459
+ end
1460
+
1461
+ context "when plucking multi-fields" do
1462
+
1463
+ let(:plucked) do
1464
+ context.pluck(:name, :likes)
1465
+ end
1466
+
1467
+ it "returns the values" do
1468
+ expect(plucked).to contain_exactly(["10,000 Maniacs", 1], ["Depeche Mode", 3], ["Tool", 3], ["Photek", 1])
1469
+ end
1470
+ end
1471
+
1472
+ context "when there are duplicate values" do
1473
+
1474
+ let(:plucked) do
1475
+ context.pluck(:likes)
1476
+ end
1477
+
1478
+ it "returns the duplicates" do
1479
+ expect(plucked).to contain_exactly(1, 3, 3, 1)
1480
+ end
1481
+ end
1482
+ end
1483
+
1484
+ context "when plucking an aliased field" do
1485
+
1486
+ let(:plucked) do
1487
+ context.pluck(:id)
1488
+ end
1489
+
1490
+ it "returns the field values" do
1491
+ expect(plucked).to eq([ depeche.id, tool.id, photek.id, maniacs.id ])
1492
+ end
1493
+ end
1494
+
1495
+ context "when plucking existent and non-existent fields" do
1496
+
1497
+ let(:plucked) do
1498
+ context.pluck(:id, :fooz)
1499
+ end
1500
+
1501
+ it "returns nil for the field that doesnt exist" do
1502
+ expect(plucked).to eq([[depeche.id, nil], [tool.id, nil], [photek.id, nil], [maniacs.id, nil] ])
1503
+ end
1504
+ end
1505
+
1506
+ context "when plucking a field that doesnt exist" do
1507
+
1508
+ context "when pluck one field" do
1509
+
1510
+ let(:plucked) do
1511
+ context.pluck(:foo)
1512
+ end
1513
+
1514
+ it "returns an array with nil values" do
1515
+ expect(plucked).to eq([nil, nil, nil, nil])
1516
+ end
1517
+ end
1518
+
1519
+ context "when pluck multiple fields" do
1520
+
1521
+ let(:plucked) do
1522
+ context.pluck(:foo, :bar)
1523
+ end
1524
+
1525
+ it "returns an array of arrays with nil values" do
1526
+ expect(plucked).to eq([[nil, nil], [nil, nil], [nil, nil], [nil, nil]])
1527
+ end
1528
+ end
1529
+ end
1530
+
1531
+ context 'when plucking a localized field' do
1532
+
1533
+ before do
1534
+ I18n.locale = :en
1535
+ d = Dictionary.create!(description: 'english-text')
1536
+ I18n.locale = :de
1537
+ d.description = 'deutsch-text'
1538
+ d.save!
1539
+ end
1540
+
1541
+ after do
1542
+ I18n.locale = :en
1543
+ end
1544
+
1545
+ let(:criteria) do
1546
+ Dictionary.all.tap do |crit|
1547
+ crit.documents = [ Dictionary.first ]
1548
+ end
1549
+ end
1550
+
1551
+ context 'when plucking the entire field' do
1552
+
1553
+ let(:plucked) do
1554
+ context.pluck(:description)
1555
+ end
1556
+
1557
+ let(:plucked_translations) do
1558
+ context.pluck(:description_translations)
1559
+ end
1560
+
1561
+ let(:plucked_translations_both) do
1562
+ context.pluck(:description_translations, :description)
1563
+ end
1564
+
1565
+ it 'returns the demongoized translations' do
1566
+ expect(plucked.first).to eq('deutsch-text')
1567
+ end
1568
+
1569
+ it 'returns the full translations hash to _translations' do
1570
+ expect(plucked_translations.first).to eq({"de"=>"deutsch-text", "en"=>"english-text"})
1571
+ end
1572
+
1573
+ it 'returns both' do
1574
+ expect(plucked_translations_both.first).to eq([{"de"=>"deutsch-text", "en"=>"english-text"}, "deutsch-text"])
1575
+ end
1576
+ end
1577
+
1578
+ context 'when plucking a specific locale' do
1579
+
1580
+ let(:plucked) do
1581
+ context.pluck(:'description.de')
1582
+ end
1583
+
1584
+ it 'returns the specific translations' do
1585
+ expect(plucked.first).to eq('deutsch-text')
1586
+ end
1587
+ end
1588
+
1589
+ context 'when plucking a specific locale from _translations field' do
1590
+
1591
+ let(:plucked) do
1592
+ context.pluck(:'description_translations.de')
1593
+ end
1594
+
1595
+ it 'returns the specific translations' do
1596
+ expect(plucked.first).to eq('deutsch-text')
1597
+ end
1598
+ end
1599
+
1600
+ context 'when fallbacks are enabled with a locale list' do
1601
+ require_fallbacks
1602
+
1603
+ around(:all) do |example|
1604
+ prev_fallbacks = I18n.fallbacks.dup
1605
+ I18n.fallbacks[:he] = [ :en ]
1606
+ example.run
1607
+ I18n.fallbacks = prev_fallbacks
1608
+ end
1609
+
1610
+ after do
1611
+ I18n.locale = :en
1612
+ end
1613
+
1614
+ let(:plucked) do
1615
+ context.pluck(:description).first
1616
+ end
1617
+
1618
+ it "correctly uses the fallback" do
1619
+ I18n.locale = :en
1620
+ d = Dictionary.create!(description: 'english-text')
1621
+ I18n.locale = :he
1622
+ plucked.should == "english-text"
1623
+ end
1624
+ end
1625
+
1626
+ context "when the localized field is embedded" do
1627
+ before do
1628
+ p = Passport.new
1629
+ I18n.locale = :en
1630
+ p.name = "Neil"
1631
+ I18n.locale = :he
1632
+ p.name = "Nissim"
1633
+
1634
+ Person.create!(passport: p, employer_id: 12345)
1635
+ end
1636
+
1637
+ after do
1638
+ I18n.locale = :en
1639
+ end
1640
+
1641
+ let(:plucked) do
1642
+ Person.where(employer_id: 12345).pluck("pass.name").first
1643
+ end
1644
+
1645
+ let(:plucked_translations) do
1646
+ Person.where(employer_id: 12345).pluck("pass.name_translations").first
1647
+ end
1648
+
1649
+ let(:plucked_translations_field) do
1650
+ Person.where(employer_id: 12345).pluck("pass.name_translations.en").first
1651
+ end
1652
+
1653
+ it "returns the translation for the current locale" do
1654
+ expect(plucked).to eq("Nissim")
1655
+ end
1656
+
1657
+ it "returns the full _translation hash" do
1658
+ expect(plucked_translations).to eq({ "en" => "Neil", "he" => "Nissim" })
1659
+ end
1660
+
1661
+ it "returns the translation for the requested locale" do
1662
+ expect(plucked_translations_field).to eq("Neil")
1663
+ end
1664
+ end
1665
+ end
1666
+
1667
+ context 'when plucking a field to be demongoized' do
1668
+
1669
+ let(:plucked) do
1670
+ Band.where(name: maniacs.name).pluck(:sales)
1671
+ end
1672
+
1673
+ with_config_values :map_big_decimal_to_decimal128, true, false do
1674
+
1675
+ it "demongoizes the field" do
1676
+ expect(plucked.first).to be_a(BigDecimal)
1677
+ expect(plucked.first).to eq(BigDecimal("1E2"))
1678
+ end
1679
+ end
1680
+ end
1681
+
1682
+ context "when plucking an embedded field" do
1683
+ let(:label) { Label.new(sales: "1E2") }
1684
+ let!(:band) { Band.create!(label: label) }
1685
+
1686
+ let(:plucked) do
1687
+ Band.where(_id: band.id).tap do |crit|
1688
+ crit.documents = [ band ]
1689
+ end.pluck("label.sales")
1690
+ end
1691
+
1692
+ it "demongoizes the field" do
1693
+ expect(plucked).to eq([ BigDecimal("1E2") ])
1694
+ end
1695
+ end
1696
+
1697
+ context "when plucking an embeds_many field" do
1698
+ let(:label) { Label.new(sales: "1E2") }
1699
+ let!(:band) { Band.create!(labels: [label]) }
1700
+
1701
+ let(:plucked) { Band.where(_id: band.id).pluck("labels.sales") }
1702
+
1703
+ it "demongoizes the field" do
1704
+ expect(plucked.first).to eq([ BigDecimal("1E2") ])
1705
+ end
1706
+ end
1707
+
1708
+ context "when plucking a nonexistent embedded field" do
1709
+ let(:label) { Label.new(sales: "1E2") }
1710
+ let!(:band) { Band.create!(label: label) }
1711
+
1712
+ let(:plucked) do
1713
+ Band.where(_id: band.id).tap do |crit|
1714
+ crit.documents = [ band ]
1715
+ end.pluck("label.qwerty")
1716
+ end
1717
+
1718
+ it "returns nil" do
1719
+ expect(plucked.first).to eq(nil)
1720
+ end
1721
+ end
1722
+
1723
+ context "when tallying deeply nested arrays/embedded associations" do
1724
+
1725
+ let(:criteria) do
1726
+ Person.all.tap do |crit|
1727
+ crit.documents = [
1728
+ Person.create!(addresses: [ Address.new(code: Code.new(deepest: Deepest.new(array: [ { y: { z: 1 } }, { y: { z: 2 } } ]))) ]),
1729
+ Person.create!(addresses: [ Address.new(code: Code.new(deepest: Deepest.new(array: [ { y: { z: 1 } }, { y: { z: 2 } } ]))) ]),
1730
+ Person.create!(addresses: [ Address.new(code: Code.new(deepest: Deepest.new(array: [ { y: { z: 1 } }, { y: { z: 3 } } ]))) ]),
1731
+ ]
1732
+ end
1733
+ end
1734
+
1735
+ let(:plucked) do
1736
+ context.pluck("addresses.code.deepest.array.y.z")
1737
+ end
1738
+
1739
+ it "returns the correct hash" do
1740
+ expect(plucked).to eq([
1741
+ [ [ 1, 2 ] ], [ [ 1, 2 ] ], [ [ 1, 3 ] ]
1742
+ ])
1743
+ end
1744
+ end
1745
+ end
1746
+ end
1747
+
1748
+ describe "#pick" do
1749
+
1750
+ let(:depeche) do
1751
+ Band.create!(name: "Depeche Mode", likes: 3)
1752
+ end
1753
+
1754
+ let(:tool) do
1755
+ Band.create!(name: "Tool", likes: 3)
1756
+ end
1757
+
1758
+ let(:criteria) do
1759
+ Band.all.tap do |crit|
1760
+ crit.documents = [ depeche, tool ]
1761
+ end
1762
+ end
1763
+
1764
+ let(:context) do
1765
+ described_class.new(criteria)
1766
+ end
1767
+
1768
+ context "when picking a field" do
1769
+
1770
+ let(:picked) do
1771
+ context.pick(:name)
1772
+ end
1773
+
1774
+ it "returns one element" do
1775
+ expect(picked).to eq("Depeche Mode")
1776
+ end
1777
+ end
1778
+
1779
+ context "when picking multiple fields" do
1780
+
1781
+ let(:picked) do
1782
+ context.pick(:name, :likes)
1783
+ end
1784
+
1785
+ it "returns an array" do
1786
+ expect(picked).to eq([ "Depeche Mode", 3 ])
587
1787
  end
1788
+ end
1789
+
1790
+ context "when no documents to pick" do
588
1791
 
589
1792
  let(:criteria) do
590
- Address.all.limit(1).tap do |crit|
591
- crit.documents = [ hobrecht, friedel ]
1793
+ Band.all.tap do |crit|
1794
+ crit.documents = []
592
1795
  end
593
1796
  end
594
1797
 
595
- let(:context) do
596
- described_class.new(criteria)
1798
+ let(:picked) do
1799
+ context.pick(:name)
597
1800
  end
598
1801
 
599
- it "limits the matching documents" do
600
- context.should eq([ hobrecht ])
1802
+ it "returns nil" do
1803
+ expect(picked).to be_nil
601
1804
  end
602
1805
  end
603
1806
  end
604
1807
 
605
- describe "#last" do
1808
+ describe "#tally" do
1809
+ let(:fans1) { [ Fanatic.new(age:1), Fanatic.new(age:2) ] }
1810
+ let(:fans2) { [ Fanatic.new(age:1), Fanatic.new(age:2) ] }
1811
+ let(:fans3) { [ Fanatic.new(age:1), Fanatic.new(age:3) ] }
606
1812
 
607
- let(:hobrecht) do
608
- Address.new(street: "hobrecht")
609
- end
1813
+ let(:genres1) { [ { x: 1, y: { z: 1 } }, { x: 2, y: { z: 2 } }, { y: 3 } ]}
1814
+ let(:genres2) { [ { x: 1, y: { z: 1 } }, { x: 2, y: { z: 2 } }, { y: 4 } ]}
1815
+ let(:genres3) { [ { x: 1, y: { z: 1 } }, { x: 3, y: { z: 3 } }, { y: 5 } ]}
1816
+
1817
+ let(:label1) { Label.new(name: "Atlantic") }
1818
+ let(:label2) { Label.new(name: "Atlantic") }
1819
+ let(:label3) { Label.new(name: "Columbia") }
610
1820
 
611
- let(:friedel) do
612
- Address.new(street: "friedel")
613
- end
1821
+
1822
+ let(:band1) { Band.new(origin: "tally", name: "Depeche Mode", years: 30, sales: "1E2", label: label1, genres: genres1) }
1823
+ let(:band2) { Band.new(origin: "tally", name: "New Order", years: 30, sales: "2E3", label: label2, genres: genres2) }
1824
+ let(:band3) { Band.new(origin: "tally", name: "10,000 Maniacs", years: 30, sales: "1E2", label: label3, genres: genres3) }
1825
+ let(:band4) { Band.new(origin: "tally2", fanatics: fans1, genres: [1, 2]) }
1826
+ let(:band5) { Band.new(origin: "tally2", fanatics: fans2, genres: [1, 2]) }
1827
+ let(:band6) { Band.new(origin: "tally2", fanatics: fans3, genres: [1, 3]) }
614
1828
 
615
1829
  let(:criteria) do
616
- Address.where(:street.in => [ "hobrecht", "friedel" ]).tap do |crit|
617
- crit.documents = [ hobrecht, friedel ]
1830
+ Band.where(origin: "tally").all.tap do |crit|
1831
+ crit.documents = [ band1, band2, band3 ]
1832
+ end
1833
+ end
1834
+
1835
+ let(:criteria2) do
1836
+ Band.where(origin: "tally2").tap do |crit|
1837
+ crit.documents = [ band4, band5, band6 ]
618
1838
  end
619
1839
  end
620
1840
 
@@ -622,110 +1842,437 @@ describe Mongoid::Contextual::Memory do
622
1842
  described_class.new(criteria)
623
1843
  end
624
1844
 
625
- it "returns the last matching document" do
626
- context.last.should eq(friedel)
1845
+ let(:context2) do
1846
+ described_class.new(criteria2)
627
1847
  end
628
- end
629
1848
 
630
- [ :length, :size ].each do |method|
1849
+ context "when tallying a string" do
1850
+ let(:tally) do
1851
+ context.tally(:name)
1852
+ end
631
1853
 
632
- describe "##{method}" do
1854
+ it "returns the correct hash" do
1855
+ expect(tally).to eq("Depeche Mode" => 1, "New Order" => 1, "10,000 Maniacs" => 1)
1856
+ end
1857
+ end
633
1858
 
634
- let(:hobrecht) do
635
- Address.new(street: "hobrecht")
1859
+ context "using an aliased field" do
1860
+ let(:tally) do
1861
+ context.tally(:years)
636
1862
  end
637
1863
 
638
- let(:friedel) do
639
- Address.new(street: "friedel")
1864
+ it "returns the correct hash" do
1865
+ expect(tally).to eq(30 => 3)
640
1866
  end
1867
+ end
641
1868
 
642
- context "when there are matching documents" do
1869
+ context "when tallying a demongoizable field" do
1870
+ let(:tally) do
1871
+ context.tally(:sales)
1872
+ end
643
1873
 
644
- let(:criteria) do
645
- Address.where(street: "hobrecht").tap do |crit|
646
- crit.documents = [ hobrecht, friedel ]
647
- end
1874
+ it "returns the correct hash" do
1875
+ expect(tally).to eq(BigDecimal("1E2") => 2, BigDecimal("2E3") => 1)
1876
+ end
1877
+ end
1878
+
1879
+ context "when tallying a localized field" do
1880
+ let(:d1) { Dictionary.new(description: 'en1') }
1881
+ let(:d2) { Dictionary.new(description: 'en1') }
1882
+ let(:d3) { Dictionary.new(description: 'en1') }
1883
+ let(:d4) { Dictionary.new(description: 'en2') }
1884
+
1885
+ before do
1886
+ I18n.locale = :en
1887
+ d1
1888
+ d2
1889
+ d3
1890
+ d4
1891
+ I18n.locale = :de
1892
+ d1.description = 'de1'
1893
+ d2.description = 'de1'
1894
+ d3.description = 'de2'
1895
+ d4.description = 'de3'
1896
+ I18n.locale = :en
1897
+ end
1898
+
1899
+ let(:criteria) do
1900
+ Dictionary.all.tap do |crit|
1901
+ crit.documents = [ d1, d2, d3, d4 ]
648
1902
  end
1903
+ end
649
1904
 
650
- let(:context) do
651
- described_class.new(criteria)
1905
+ context "when getting the demongoized field" do
1906
+ let(:tallied) do
1907
+ context.tally(:description)
652
1908
  end
653
1909
 
654
- it "returns the number of matches" do
655
- context.send(method).should eq(1)
1910
+ it "returns the translation for the current locale" do
1911
+ expect(tallied).to eq("en1" => 3, "en2" => 1)
656
1912
  end
657
1913
  end
658
1914
 
659
- context "when there are no matching documents" do
1915
+ context "when getting a specific locale" do
1916
+ let(:tallied) do
1917
+ context.tally("description.de")
1918
+ end
660
1919
 
661
- let(:criteria) do
662
- Address.where(street: "pfluger").tap do |crit|
663
- crit.documents = [ hobrecht, friedel ]
664
- end
1920
+ it "returns the translation for the the specific locale" do
1921
+ expect(tallied).to eq("de1" => 2, "de2" => 1, "de3" => 1)
665
1922
  end
1923
+ end
666
1924
 
667
- let(:context) do
668
- described_class.new(criteria)
1925
+ context "when getting the full hash" do
1926
+ let(:tallied) do
1927
+ context.tally("description_translations")
669
1928
  end
670
1929
 
671
- it "returns zero" do
672
- context.send(method).should eq(0)
1930
+ it "returns the correct hash" do
1931
+ expect(tallied).to eq(
1932
+ {"de" => "de1", "en" => "en1" } => 2,
1933
+ {"de" => "de2", "en" => "en1" } => 1,
1934
+ {"de" => "de3", "en" => "en2" } => 1
1935
+ )
673
1936
  end
674
1937
  end
675
1938
  end
676
- end
677
1939
 
678
- describe "#limit" do
1940
+ context "when tallying an embedded localized field" do
679
1941
 
680
- let(:hobrecht) do
681
- Address.new(street: "hobrecht")
1942
+ let(:person1) { Person.create!(addresses: [ address1a, address1b ]) }
1943
+ let(:person2) { Person.create!(addresses: [ address2a, address2b ]) }
1944
+
1945
+ let(:address1a) { Address.new(name: "en1") }
1946
+ let(:address1b) { Address.new(name: "en2") }
1947
+ let(:address2a) { Address.new(name: "en1") }
1948
+ let(:address2b) { Address.new(name: "en3") }
1949
+
1950
+ before do
1951
+ I18n.locale = :en
1952
+ address1a
1953
+ address1b
1954
+ address2a
1955
+ address2b
1956
+ I18n.locale = :de
1957
+ address1a.name = "de1"
1958
+ address1b.name = "de2"
1959
+ address2a.name = "de1"
1960
+ address2b.name = "de3"
1961
+ person1
1962
+ person2
1963
+
1964
+ I18n.locale = :en
1965
+ end
1966
+
1967
+ let(:criteria) do
1968
+ Person.all.tap do |crit|
1969
+ crit.documents = [ person1, person2 ]
1970
+ end
1971
+ end
1972
+
1973
+ context "when getting the demongoized field" do
1974
+ let(:tallied) do
1975
+ context.tally("addresses.name")
1976
+ end
1977
+
1978
+ it "returns the translation for the current locale" do
1979
+ expect(tallied).to eq(
1980
+ [ "en1", "en2" ] => 1,
1981
+ [ "en1", "en3" ] => 1,
1982
+ )
1983
+ end
1984
+ end
1985
+
1986
+ context "when getting a specific locale" do
1987
+ let(:tallied) do
1988
+ context.tally("addresses.name.de")
1989
+ end
1990
+
1991
+ it "returns the translation for the the specific locale" do
1992
+ expect(tallied).to eq(
1993
+ [ "de1", "de2" ] => 1,
1994
+ [ "de1", "de3" ] => 1,
1995
+ )
1996
+ end
1997
+ end
1998
+
1999
+ context "when getting the full hash" do
2000
+ let(:tallied) do
2001
+ context.tally("addresses.name_translations")
2002
+ end
2003
+
2004
+ it "returns the correct hash" do
2005
+ expect(tallied).to eq(
2006
+ [{ "de" => "de1", "en" => "en1" }, { "de" => "de2", "en" => "en2" }] => 1,
2007
+ [{ "de" => "de1", "en" => "en1" }, { "de" => "de3", "en" => "en3" }] => 1,
2008
+ )
2009
+ end
2010
+ end
682
2011
  end
683
2012
 
684
- let(:friedel) do
685
- Address.new(street: "friedel")
2013
+ context "when tallying an embedded field" do
2014
+ let(:tally) do
2015
+ context.tally("label.name")
2016
+ end
2017
+
2018
+ it "returns the correct hash" do
2019
+ expect(tally).to eq("Atlantic" => 2, "Columbia" => 1)
2020
+ end
686
2021
  end
687
2022
 
688
- let(:pfluger) do
689
- Address.new(street: "pfluger")
2023
+ context "when tallying an element in an embeds_many field" do
2024
+
2025
+ let(:tally) do
2026
+ context2.tally("fanatics.age")
2027
+ end
2028
+
2029
+ it "returns the correct hash" do
2030
+ expect(tally).to eq(
2031
+ [1, 2] => 2,
2032
+ [1, 3] => 1
2033
+ )
2034
+ end
690
2035
  end
691
2036
 
692
- let(:criteria) do
693
- Address.all.tap do |crit|
694
- crit.documents = [ hobrecht, friedel, pfluger ]
2037
+ context "when tallying an embeds_many field" do
2038
+
2039
+ let(:tally) do
2040
+ context2.tally("fanatics")
2041
+ end
2042
+
2043
+ it "returns the correct hash" do
2044
+ expect(tally).to eq(
2045
+ fans1 => 1,
2046
+ fans2 => 1,
2047
+ fans3 => 1,
2048
+ )
695
2049
  end
696
2050
  end
697
2051
 
698
- let(:context) do
699
- described_class.new(criteria)
2052
+ context "when tallying a field of type array" do
2053
+
2054
+ let(:tally) do
2055
+ context2.tally("genres")
2056
+ end
2057
+
2058
+ it "returns the correct hash" do
2059
+ expect(tally).to eq(
2060
+ [1, 2] => 2,
2061
+ [1, 3] => 1
2062
+ )
2063
+ end
2064
+ end
2065
+
2066
+ context "when tallying an element from an array of hashes" do
2067
+
2068
+ let(:tally) do
2069
+ context.tally("genres.x")
2070
+ end
2071
+
2072
+ it "returns the correct hash without the nil keys" do
2073
+ expect(tally).to eq(
2074
+ [1, 2] => 2,
2075
+ [1, 3] => 1
2076
+ )
2077
+ end
2078
+ end
2079
+
2080
+ context "when tallying an element from an array of hashes; with duplicate" do
2081
+
2082
+ let(:band4) { Band.new(origin: "tally", genres: [ { x: 1 }, {x: 1} ] ) }
2083
+
2084
+ let(:criteria) do
2085
+ Band.where(origin: "tally").all.tap do |crit|
2086
+ crit.documents = [ band1, band2, band3, band4 ]
2087
+ end
2088
+ end
2089
+
2090
+ let(:tally) do
2091
+ context.tally("genres.x")
2092
+ end
2093
+
2094
+ it "returns the correct hash without the nil keys" do
2095
+ expect(tally).to eq(
2096
+ [1, 2] => 2,
2097
+ [1, 3] => 1,
2098
+ [1, 1] => 1,
2099
+ )
2100
+ end
2101
+ end
2102
+
2103
+ context "when tallying an aliased field of type array" do
2104
+
2105
+ let(:person1) { Person.new(array: [ 1, 2 ]) }
2106
+ let(:person2) { Person.new(array: [ 1, 3 ]) }
2107
+
2108
+ let(:criteria) do
2109
+ Person.all.tap do |crit|
2110
+ crit.documents = [ person1, person2 ]
2111
+ end
2112
+ end
2113
+
2114
+ let(:tally) do
2115
+ context.tally("array")
2116
+ end
2117
+
2118
+ it "returns the correct hash" do
2119
+ expect(tally).to eq(
2120
+ [1, 2] => 1,
2121
+ [1, 3] => 1
2122
+ )
2123
+ end
700
2124
  end
701
2125
 
702
- let!(:limit) do
703
- context.limit(2)
2126
+ context "when going multiple levels deep in arrays" do
2127
+
2128
+ let(:tally) do
2129
+ context.tally("genres.y.z")
2130
+ end
2131
+
2132
+ it "returns the correct hash" do
2133
+ expect(tally).to eq(
2134
+ [1, 2] => 2,
2135
+ [1, 3] => 1
2136
+ )
2137
+ end
2138
+ end
2139
+
2140
+ context "when going multiple levels deep in an array" do
2141
+
2142
+ let(:tally) do
2143
+ context.tally("genres.y.z")
2144
+ end
2145
+
2146
+ it "returns the correct hash" do
2147
+ expect(tally).to eq(
2148
+ [1, 2] => 2,
2149
+ [1, 3] => 1
2150
+ )
2151
+ end
704
2152
  end
705
2153
 
706
- it "returns the context" do
707
- limit.should eq(context)
2154
+ context "when tallying deeply nested arrays/embedded associations" do
2155
+
2156
+ let(:person1) { Person.new(addresses: [ Address.new(code: Code.new(deepest: Deepest.new(array: [ { y: { z: 1 } }, { y: { z: 2 } } ]))) ]) }
2157
+ let(:person2) { Person.new(addresses: [ Address.new(code: Code.new(deepest: Deepest.new(array: [ { y: { z: 1 } }, { y: { z: 2 } } ]))) ]) }
2158
+ let(:person3) { Person.new(addresses: [ Address.new(code: Code.new(deepest: Deepest.new(array: [ { y: { z: 1 } }, { y: { z: 3 } } ]))) ]) }
2159
+
2160
+ let(:criteria) do
2161
+ Person.all.tap do |crit|
2162
+ crit.documents = [ person1, person2, person3 ]
2163
+ end
2164
+ end
2165
+
2166
+ let(:tally) do
2167
+ context.tally("addresses.code.deepest.array.y.z")
2168
+ end
2169
+
2170
+ it "returns the correct hash" do
2171
+ expect(tally).to eq(
2172
+ [ [ 1, 2 ] ] => 2,
2173
+ [ [ 1, 3 ] ] => 1
2174
+ )
2175
+ end
708
2176
  end
709
2177
 
710
- context "when asking for all documents" do
2178
+ context "when tallying deeply nested arrays/embedded associations" do
2179
+
2180
+ let(:person1) do
2181
+ Person.new(addresses: [ Address.new(code: Code.new(deepest: Deepest.new(array: [ { y: { z: 1 } }, { y: { z: 2 } } ]))),
2182
+ Address.new(code: Code.new(deepest: Deepest.new(array: [ { y: { z: 1 } }, { y: { z: 2 } } ]))) ])
2183
+ end
2184
+
2185
+ let(:person2) do
2186
+ Person.new(addresses: [ Address.new(code: Code.new(deepest: Deepest.new(array: [ { y: { z: 1 } }, { y: { z: 2 } } ]))),
2187
+ Address.new(code: Code.new(deepest: Deepest.new(array: [ { y: { z: 1 } }, { y: { z: 2 } } ]))) ])
2188
+ end
711
2189
 
712
- context "when only a limit exists" do
2190
+ let(:person3) do
2191
+ Person.new(addresses: [ Address.new(code: Code.new(deepest: Deepest.new(array: [ { y: { z: 1 } }, { y: { z: 3 } } ]))),
2192
+ Address.new(code: Code.new(deepest: Deepest.new(array: [ { y: { z: 1 } }, { y: { z: 3 } } ]))) ])
2193
+ end
713
2194
 
714
- it "only returns the limited documents" do
715
- context.entries.should eq([ hobrecht, friedel ])
2195
+ let(:criteria) do
2196
+ Person.all.tap do |crit|
2197
+ crit.documents = [ person1, person2, person3 ]
716
2198
  end
717
2199
  end
718
2200
 
719
- context "when a skip and limit exist" do
2201
+ let(:tally) do
2202
+ context.tally("addresses.code.deepest.array.y.z")
2203
+ end
720
2204
 
721
- before do
722
- limit.skip(1)
2205
+ it "returns the correct hash" do
2206
+ expect(tally).to eq(
2207
+ [ [ 1, 2 ], [ 1, 2 ] ] => 2,
2208
+ [ [ 1, 3 ], [ 1, 3 ] ] => 1
2209
+ )
2210
+ end
2211
+ end
2212
+
2213
+ context "when some keys are missing" do
2214
+
2215
+ let(:criteria) do
2216
+ Band.where(origin: "tally").all.tap do |crit|
2217
+ crit.documents = [ band1, band2, band3 ]
2218
+ 3.times{ crit.documents << Band.new(origin: "tally") }
723
2219
  end
2220
+ end
2221
+
2222
+ let(:tally) do
2223
+ context.tally(:name)
2224
+ end
2225
+
2226
+ it "returns the correct hash" do
2227
+ expect(tally).to eq(
2228
+ "Depeche Mode" => 1,
2229
+ "New Order" => 1,
2230
+ "10,000 Maniacs" => 1,
2231
+ nil => 3
2232
+ )
2233
+ end
2234
+ end
724
2235
 
725
- it "applies the skip before the limit" do
726
- context.entries.should eq([ friedel, pfluger ])
2236
+ context "when the first element is an embeds_one" do
2237
+ let(:person1) { Person.create!(name: Name.new(translations: [ Translation.new(language: 1), Translation.new(language: 2) ])) }
2238
+ let(:person2) { Person.create!(name: Name.new(translations: [ Translation.new(language: 1), Translation.new(language: 2) ])) }
2239
+ let(:person3) { Person.create!(name: Name.new(translations: [ Translation.new(language: 1), Translation.new(language: 3) ])) }
2240
+
2241
+ let(:criteria) do
2242
+ Person.all.tap do |crit|
2243
+ crit.documents = [ person1, person2, person3 ]
727
2244
  end
728
2245
  end
2246
+
2247
+ let(:tally) do
2248
+ context.tally("name.translations.language")
2249
+ end
2250
+
2251
+ it "returns the correct hash" do
2252
+ expect(tally).to eq(
2253
+ [1, 2] => 2,
2254
+ [1, 3] => 1
2255
+ )
2256
+ end
2257
+ end
2258
+ end
2259
+
2260
+ describe '#inc' do
2261
+
2262
+ let(:criteria) do
2263
+ Address.all.tap do |crit|
2264
+ crit.documents = [ Address.new(number: 1),
2265
+ Address.new(number: 2),
2266
+ Address.new(number: 3) ]
2267
+ end
2268
+ end
2269
+
2270
+ let(:context) do
2271
+ described_class.new(criteria)
2272
+ end
2273
+
2274
+ it 'increases each member' do
2275
+ expect(context.inc(number: 10).collect(&:number)).to eql([11, 12, 13])
729
2276
  end
730
2277
  end
731
2278
 
@@ -753,34 +2300,52 @@ describe Mongoid::Contextual::Memory do
753
2300
  described_class.new(criteria)
754
2301
  end
755
2302
 
756
- let!(:skip) do
757
- context.skip(1)
758
- end
2303
+ context 'when there is no collation on the criteria' do
759
2304
 
760
- it "returns the context" do
761
- skip.should eq(context)
762
- end
2305
+ let!(:skip) do
2306
+ context.skip(1)
2307
+ end
763
2308
 
764
- context "when asking for all documents" do
2309
+ it "returns the context" do
2310
+ expect(skip).to eq(context)
2311
+ end
765
2312
 
766
- context "when only a skip exists" do
2313
+ context "when asking for all documents" do
767
2314
 
768
- it "skips the correct number" do
769
- context.entries.should eq([ friedel, pfluger ])
2315
+ context "when only a skip exists" do
2316
+
2317
+ it "skips the correct number" do
2318
+ expect(context.entries).to eq([ friedel, pfluger ])
2319
+ end
770
2320
  end
771
- end
772
2321
 
773
- context "when a skip and limit exist" do
2322
+ context "when a skip and limit exist" do
774
2323
 
775
- before do
776
- skip.limit(1)
777
- end
2324
+ before do
2325
+ skip.limit(1)
2326
+ end
778
2327
 
779
- it "applies the skip before the limit" do
780
- context.entries.should eq([ friedel ])
2328
+ it "applies the skip before the limit" do
2329
+ expect(context.entries).to eq([ friedel ])
2330
+ end
781
2331
  end
782
2332
  end
783
2333
  end
2334
+
2335
+ context 'when there is a collation on the criteria' do
2336
+
2337
+ let(:criteria) do
2338
+ Address.all.tap do |crit|
2339
+ crit.documents = [ hobrecht, friedel, pfluger ]
2340
+ end.collation(locale: 'en_US', strength: 2)
2341
+ end
2342
+
2343
+ it "raises an exception" do
2344
+ expect {
2345
+ context.skip(1)
2346
+ }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
2347
+ end
2348
+ end
784
2349
  end
785
2350
 
786
2351
  describe "#sort" do
@@ -816,11 +2381,11 @@ describe Mongoid::Contextual::Memory do
816
2381
  end
817
2382
 
818
2383
  it "sorts the documents" do
819
- context.entries.should eq([ friedel, hobrecht, pfluger ])
2384
+ expect(context.entries).to eq([ friedel, hobrecht, pfluger ])
820
2385
  end
821
2386
 
822
2387
  it "returns the context" do
823
- sorted.should eq(context)
2388
+ expect(sorted).to eq(context)
824
2389
  end
825
2390
  end
826
2391
 
@@ -833,11 +2398,11 @@ describe Mongoid::Contextual::Memory do
833
2398
  end
834
2399
 
835
2400
  it "sorts the documents" do
836
- context.entries.should eq([ pfluger, hobrecht, friedel ])
2401
+ expect(context.entries).to eq([ pfluger, hobrecht, friedel ])
837
2402
  end
838
2403
 
839
2404
  it "returns the context" do
840
- sorted.should eq(context)
2405
+ expect(sorted).to eq(context)
841
2406
  end
842
2407
  end
843
2408
 
@@ -853,11 +2418,11 @@ describe Mongoid::Contextual::Memory do
853
2418
  end
854
2419
 
855
2420
  it "sorts the documents" do
856
- context.entries.should eq([ friedel, hobrecht, pfluger ])
2421
+ expect(context.entries).to eq([ friedel, hobrecht, pfluger ])
857
2422
  end
858
2423
 
859
2424
  it "returns the context" do
860
- sorted.should eq(context)
2425
+ expect(sorted).to eq(context)
861
2426
  end
862
2427
  end
863
2428
  end
@@ -869,8 +2434,13 @@ describe Mongoid::Contextual::Memory do
869
2434
  Address.new(street: "lenau", number: 5, name: "lenau")
870
2435
  end
871
2436
 
2437
+ let(:kampuchea_krom) do
2438
+ Address.new(street: "kampuchea krom", number: 5, name: "kampuchea krom")
2439
+ end
2440
+
872
2441
  before do
873
2442
  criteria.documents.unshift(lenau)
2443
+ criteria.documents.unshift(kampuchea_krom)
874
2444
  end
875
2445
 
876
2446
  context "when the sort is ascending" do
@@ -880,11 +2450,11 @@ describe Mongoid::Contextual::Memory do
880
2450
  end
881
2451
 
882
2452
  it "sorts the documents" do
883
- context.entries.should eq([ friedel, lenau, pfluger, hobrecht ])
2453
+ expect(context.entries).to eq([ friedel, kampuchea_krom, lenau, pfluger, hobrecht ])
884
2454
  end
885
2455
 
886
2456
  it "returns the context" do
887
- sorted.should eq(context)
2457
+ expect(sorted).to eq(context)
888
2458
  end
889
2459
  end
890
2460
 
@@ -895,11 +2465,11 @@ describe Mongoid::Contextual::Memory do
895
2465
  end
896
2466
 
897
2467
  it "sorts the documents" do
898
- context.entries.should eq([ hobrecht, pfluger, lenau, friedel ])
2468
+ expect(context.entries).to eq([ hobrecht, pfluger, lenau, kampuchea_krom, friedel ])
899
2469
  end
900
2470
 
901
2471
  it "returns the context" do
902
- sorted.should eq(context)
2472
+ expect(sorted).to eq(context)
903
2473
  end
904
2474
  end
905
2475
  end
@@ -911,11 +2481,11 @@ describe Mongoid::Contextual::Memory do
911
2481
  end
912
2482
 
913
2483
  it "does not sort the documents" do
914
- context.entries.should eq([ hobrecht, friedel, pfluger ])
2484
+ expect(context.entries).to eq([ hobrecht, friedel, pfluger ])
915
2485
  end
916
2486
 
917
2487
  it "returns the context" do
918
- sorted.should eq(context)
2488
+ expect(sorted).to eq(context)
919
2489
  end
920
2490
  end
921
2491
 
@@ -926,7 +2496,22 @@ describe Mongoid::Contextual::Memory do
926
2496
  end
927
2497
 
928
2498
  it "sorts the documents" do
929
- context.entries.should eq([ friedel, hobrecht, pfluger ])
2499
+ expect(context.entries).to eq([ friedel, hobrecht, pfluger ])
2500
+ end
2501
+ end
2502
+
2503
+ context 'when there is a collation on the criteria' do
2504
+
2505
+ let(:criteria) do
2506
+ Address.all.tap do |crit|
2507
+ crit.documents = [ hobrecht, friedel, pfluger ]
2508
+ end.collation(locale: 'en_US', strength: 2)
2509
+ end
2510
+
2511
+ it "raises an exception" do
2512
+ expect {
2513
+ context.sort(state: 1)
2514
+ }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
930
2515
  end
931
2516
  end
932
2517
  end
@@ -934,19 +2519,19 @@ describe Mongoid::Contextual::Memory do
934
2519
  describe "#update" do
935
2520
 
936
2521
  let(:person) do
937
- Person.create
2522
+ Person.create!
938
2523
  end
939
2524
 
940
2525
  let(:hobrecht) do
941
- person.addresses.create(street: "hobrecht")
2526
+ person.addresses.create!(street: "hobrecht")
942
2527
  end
943
2528
 
944
2529
  let(:friedel) do
945
- person.addresses.create(street: "friedel")
2530
+ person.addresses.create!(street: "friedel")
946
2531
  end
947
2532
 
948
2533
  let(:pfluger) do
949
- person.addresses.create(street: "pfluger")
2534
+ person.addresses.create!(street: "pfluger")
950
2535
  end
951
2536
 
952
2537
  context "when the documents are embedded one level" do
@@ -968,29 +2553,29 @@ describe Mongoid::Contextual::Memory do
968
2553
  end
969
2554
 
970
2555
  it "updates the first matching document" do
971
- hobrecht.number.should eq(5)
2556
+ expect(hobrecht.number).to eq(5)
972
2557
  end
973
2558
 
974
2559
  it "does not update the last matching document" do
975
- friedel.number.should be_nil
2560
+ expect(friedel.number).to be_nil
976
2561
  end
977
2562
 
978
2563
  it "does not update non matching docs" do
979
- pfluger.number.should be_nil
2564
+ expect(pfluger.number).to be_nil
980
2565
  end
981
2566
 
982
2567
  context "when reloading the embedded documents" do
983
2568
 
984
2569
  it "updates the first matching document" do
985
- hobrecht.reload.number.should eq(5)
2570
+ expect(hobrecht.reload.number).to eq(5)
986
2571
  end
987
2572
 
988
2573
  it "updates the last matching document" do
989
- friedel.reload.number.should be_nil
2574
+ expect(friedel.reload.number).to be_nil
990
2575
  end
991
2576
 
992
2577
  it "does not update non matching docs" do
993
- pfluger.reload.number.should be_nil
2578
+ expect(pfluger.reload.number).to be_nil
994
2579
  end
995
2580
  end
996
2581
  end
@@ -998,7 +2583,7 @@ describe Mongoid::Contextual::Memory do
998
2583
  context "when no attributes are provided" do
999
2584
 
1000
2585
  it "returns false" do
1001
- context.update.should be_false
2586
+ expect(context.update).to be false
1002
2587
  end
1003
2588
  end
1004
2589
  end
@@ -1006,11 +2591,11 @@ describe Mongoid::Contextual::Memory do
1006
2591
  context "when the documents are embedded multiple levels" do
1007
2592
 
1008
2593
  let!(:home) do
1009
- hobrecht.locations.create(name: "home")
2594
+ hobrecht.locations.create!(name: "home")
1010
2595
  end
1011
2596
 
1012
2597
  let!(:work) do
1013
- hobrecht.locations.create(name: "work")
2598
+ hobrecht.locations.create!(name: "work")
1014
2599
  end
1015
2600
 
1016
2601
  let(:criteria) do
@@ -1030,21 +2615,21 @@ describe Mongoid::Contextual::Memory do
1030
2615
  end
1031
2616
 
1032
2617
  it "updates the first matching document" do
1033
- work.number.should eq(5)
2618
+ expect(work.number).to eq(5)
1034
2619
  end
1035
2620
 
1036
2621
  it "does not update non matching docs" do
1037
- home.number.should be_nil
2622
+ expect(home.number).to be_nil
1038
2623
  end
1039
2624
 
1040
2625
  context "when reloading the embedded documents" do
1041
2626
 
1042
2627
  it "updates the first matching document" do
1043
- work.reload.number.should eq(5)
2628
+ expect(work.reload.number).to eq(5)
1044
2629
  end
1045
2630
 
1046
2631
  it "does not update non matching docs" do
1047
- home.reload.number.should be_nil
2632
+ expect(home.reload.number).to be_nil
1048
2633
  end
1049
2634
  end
1050
2635
  end
@@ -1052,34 +2637,60 @@ describe Mongoid::Contextual::Memory do
1052
2637
  context "when no attributes are provided" do
1053
2638
 
1054
2639
  it "returns false" do
1055
- context.update.should be_false
2640
+ expect(context.update).to be false
1056
2641
  end
1057
2642
  end
1058
2643
  end
2644
+
2645
+ context 'when there is a collation on the criteria' do
2646
+
2647
+ let(:criteria) do
2648
+ Address.all.collation(locale: 'en_US', strength: 2)
2649
+ end
2650
+
2651
+ it "raises an exception" do
2652
+ expect {
2653
+ context.update
2654
+ }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
2655
+ end
2656
+ end
1059
2657
  end
1060
2658
 
1061
2659
  describe "#update_all" do
1062
2660
 
1063
2661
  let(:person) do
1064
- Person.create
2662
+ Person.create!
1065
2663
  end
1066
2664
 
1067
2665
  let(:hobrecht) do
1068
- person.addresses.create(street: "hobrecht")
2666
+ person.addresses.create!(street: "hobrecht")
1069
2667
  end
1070
2668
 
1071
2669
  let(:friedel) do
1072
- person.addresses.create(street: "friedel")
2670
+ person.addresses.create!(street: "friedel")
1073
2671
  end
1074
2672
 
1075
2673
  let(:pfluger) do
1076
- person.addresses.create(street: "pfluger")
2674
+ person.addresses.create!(street: "pfluger")
2675
+ end
2676
+
2677
+ context 'when there is a collation on the criteria' do
2678
+
2679
+ let(:criteria) do
2680
+ Address.all.collation(locale: 'en_US', strength: 2)
2681
+ end
2682
+
2683
+ it "raises an exception" do
2684
+ expect {
2685
+ context.update_all({})
2686
+ }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
2687
+ end
1077
2688
  end
1078
2689
 
1079
2690
  context "when the documents are empty" do
1080
2691
 
1081
2692
  let(:person_two) do
1082
- Person.create
2693
+ Person.create!
1083
2694
  end
1084
2695
 
1085
2696
  let(:criteria) do
@@ -1091,7 +2702,7 @@ describe Mongoid::Contextual::Memory do
1091
2702
  end
1092
2703
 
1093
2704
  it "returns false" do
1094
- context.update_all({}).should be_false
2705
+ expect(context.update_all({})).to be false
1095
2706
  end
1096
2707
  end
1097
2708
 
@@ -1114,15 +2725,15 @@ describe Mongoid::Contextual::Memory do
1114
2725
  end
1115
2726
 
1116
2727
  it "updates the first matching document" do
1117
- hobrecht.suite.should eq("10B")
2728
+ expect(hobrecht.suite).to eq("10B")
1118
2729
  end
1119
2730
 
1120
2731
  it "updates the last matching document" do
1121
- friedel.suite.should eq("10B")
2732
+ expect(friedel.suite).to eq("10B")
1122
2733
  end
1123
2734
 
1124
2735
  it "does not update non matching docs" do
1125
- pfluger.suite.should be_nil
2736
+ expect(pfluger.suite).to be_nil
1126
2737
  end
1127
2738
  end
1128
2739
 
@@ -1133,29 +2744,29 @@ describe Mongoid::Contextual::Memory do
1133
2744
  end
1134
2745
 
1135
2746
  it "updates the first matching document" do
1136
- hobrecht.number.should eq(5)
2747
+ expect(hobrecht.number).to eq(5)
1137
2748
  end
1138
2749
 
1139
2750
  it "updates the last matching document" do
1140
- friedel.number.should eq(5)
2751
+ expect(friedel.number).to eq(5)
1141
2752
  end
1142
2753
 
1143
2754
  it "does not update non matching docs" do
1144
- pfluger.number.should be_nil
2755
+ expect(pfluger.number).to be_nil
1145
2756
  end
1146
2757
 
1147
2758
  context "when reloading the embedded documents" do
1148
2759
 
1149
2760
  it "updates the first matching document" do
1150
- hobrecht.reload.number.should eq(5)
2761
+ expect(hobrecht.reload.number).to eq(5)
1151
2762
  end
1152
2763
 
1153
2764
  it "updates the last matching document" do
1154
- friedel.reload.number.should eq(5)
2765
+ expect(friedel.reload.number).to eq(5)
1155
2766
  end
1156
2767
 
1157
2768
  it "does not update non matching docs" do
1158
- pfluger.reload.number.should be_nil
2769
+ expect(pfluger.reload.number).to be_nil
1159
2770
  end
1160
2771
  end
1161
2772
 
@@ -1166,7 +2777,7 @@ describe Mongoid::Contextual::Memory do
1166
2777
  end
1167
2778
 
1168
2779
  it "does not error on the update" do
1169
- hobrecht.number.should eq(5)
2780
+ expect(hobrecht.number).to eq(5)
1170
2781
  end
1171
2782
  end
1172
2783
  end
@@ -1174,7 +2785,7 @@ describe Mongoid::Contextual::Memory do
1174
2785
  context "when no attributes are provided" do
1175
2786
 
1176
2787
  it "returns false" do
1177
- context.update_all.should be_false
2788
+ expect(context.update_all).to be false
1178
2789
  end
1179
2790
  end
1180
2791
  end
@@ -1182,11 +2793,11 @@ describe Mongoid::Contextual::Memory do
1182
2793
  context "when the documents are embedded multiple levels" do
1183
2794
 
1184
2795
  let!(:home) do
1185
- hobrecht.locations.create(name: "home")
2796
+ hobrecht.locations.create!(name: "home")
1186
2797
  end
1187
2798
 
1188
2799
  let!(:work) do
1189
- hobrecht.locations.create(name: "work")
2800
+ hobrecht.locations.create!(name: "work")
1190
2801
  end
1191
2802
 
1192
2803
  let(:criteria) do
@@ -1206,21 +2817,21 @@ describe Mongoid::Contextual::Memory do
1206
2817
  end
1207
2818
 
1208
2819
  it "updates the first matching document" do
1209
- work.number.should eq(5)
2820
+ expect(work.number).to eq(5)
1210
2821
  end
1211
2822
 
1212
2823
  it "does not update non matching docs" do
1213
- home.number.should be_nil
2824
+ expect(home.number).to be_nil
1214
2825
  end
1215
2826
 
1216
2827
  context "when reloading the embedded documents" do
1217
2828
 
1218
2829
  it "updates the first matching document" do
1219
- work.reload.number.should eq(5)
2830
+ expect(work.reload.number).to eq(5)
1220
2831
  end
1221
2832
 
1222
2833
  it "does not update non matching docs" do
1223
- home.reload.number.should be_nil
2834
+ expect(home.reload.number).to be_nil
1224
2835
  end
1225
2836
  end
1226
2837
  end
@@ -1228,7 +2839,7 @@ describe Mongoid::Contextual::Memory do
1228
2839
  context "when no attributes are provided" do
1229
2840
 
1230
2841
  it "returns false" do
1231
- context.update_all.should be_false
2842
+ expect(context.update_all).to be false
1232
2843
  end
1233
2844
  end
1234
2845
  end