mongoid 7.2.1 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1082) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +20 -20
  4. data/LICENSE +1 -1
  5. data/README.md +7 -12
  6. data/Rakefile +58 -1
  7. data/lib/config/locales/en.yml +191 -60
  8. data/lib/mongoid/association/accessors.rb +67 -53
  9. data/lib/mongoid/association/bindable.rb +77 -31
  10. data/lib/mongoid/association/builders.rb +8 -14
  11. data/lib/mongoid/association/constrainable.rb +2 -5
  12. data/lib/mongoid/association/depending.rb +20 -12
  13. data/lib/mongoid/association/eager.rb +160 -0
  14. data/lib/mongoid/association/eager_loadable.rb +41 -11
  15. data/lib/mongoid/association/embedded/batchable.rb +63 -52
  16. data/lib/mongoid/association/embedded/cyclic.rb +4 -12
  17. data/lib/mongoid/association/embedded/eager.rb +23 -0
  18. data/lib/mongoid/association/embedded/embedded_in/binding.rb +29 -13
  19. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +3 -5
  20. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +25 -23
  21. data/lib/mongoid/association/embedded/embedded_in.rb +11 -26
  22. data/lib/mongoid/association/embedded/embeds_many/binding.rb +4 -9
  23. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +5 -6
  24. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +226 -203
  25. data/lib/mongoid/association/embedded/embeds_many.rb +3 -33
  26. data/lib/mongoid/association/embedded/embeds_one/binding.rb +3 -9
  27. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +20 -8
  28. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +131 -42
  29. data/lib/mongoid/association/embedded/embeds_one.rb +4 -30
  30. data/lib/mongoid/association/embedded.rb +2 -1
  31. data/lib/mongoid/association/macros.rb +47 -16
  32. data/lib/mongoid/association/many.rb +12 -24
  33. data/lib/mongoid/association/marshalable.rb +4 -5
  34. data/lib/mongoid/association/nested/many.rb +14 -19
  35. data/lib/mongoid/association/nested/nested_buildable.rb +36 -13
  36. data/lib/mongoid/association/nested/one.rb +54 -26
  37. data/lib/mongoid/association/nested.rb +1 -3
  38. data/lib/mongoid/association/one.rb +3 -11
  39. data/lib/mongoid/association/options.rb +18 -44
  40. data/lib/mongoid/association/proxy.rb +49 -42
  41. data/lib/mongoid/association/referenced/auto_save.rb +11 -15
  42. data/lib/mongoid/association/referenced/belongs_to/binding.rb +2 -7
  43. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +6 -6
  44. data/lib/mongoid/association/referenced/belongs_to/eager.rb +2 -2
  45. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +23 -32
  46. data/lib/mongoid/association/referenced/belongs_to.rb +13 -37
  47. data/lib/mongoid/association/referenced/counter_cache.rb +18 -26
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +15 -8
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +1 -3
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -2
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +191 -123
  52. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +23 -42
  53. data/lib/mongoid/association/referenced/has_many/binding.rb +1 -5
  54. data/lib/mongoid/association/referenced/has_many/buildable.rb +1 -3
  55. data/lib/mongoid/association/referenced/has_many/eager.rb +2 -2
  56. data/lib/mongoid/association/referenced/has_many/enumerable.rb +471 -496
  57. data/lib/mongoid/association/referenced/has_many/proxy.rb +182 -179
  58. data/lib/mongoid/association/referenced/has_many.rb +17 -43
  59. data/lib/mongoid/association/referenced/has_one/binding.rb +1 -7
  60. data/lib/mongoid/association/referenced/has_one/buildable.rb +5 -5
  61. data/lib/mongoid/association/referenced/has_one/eager.rb +3 -4
  62. data/lib/mongoid/association/referenced/has_one/proxy.rb +38 -41
  63. data/lib/mongoid/association/referenced/has_one.rb +17 -36
  64. data/lib/mongoid/association/referenced/syncable.rb +11 -27
  65. data/lib/mongoid/association/referenced.rb +1 -1
  66. data/lib/mongoid/association/reflections.rb +9 -9
  67. data/lib/mongoid/association/relatable.rb +55 -74
  68. data/lib/mongoid/association.rb +10 -22
  69. data/lib/mongoid/atomic/modifiers.rb +7 -53
  70. data/lib/mongoid/atomic/paths/embedded/many.rb +20 -5
  71. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -5
  72. data/lib/mongoid/atomic/paths/embedded.rb +1 -3
  73. data/lib/mongoid/atomic/paths/root.rb +1 -5
  74. data/lib/mongoid/atomic/paths.rb +1 -1
  75. data/lib/mongoid/atomic.rb +39 -86
  76. data/lib/mongoid/atomic_update_preparer.rb +88 -0
  77. data/lib/mongoid/attributes/dynamic.rb +5 -21
  78. data/lib/mongoid/attributes/embedded.rb +34 -0
  79. data/lib/mongoid/attributes/nested.rb +9 -13
  80. data/lib/mongoid/attributes/processing.rb +43 -28
  81. data/lib/mongoid/attributes/projector.rb +120 -0
  82. data/lib/mongoid/attributes/readonly.rb +4 -8
  83. data/lib/mongoid/attributes.rb +85 -89
  84. data/lib/mongoid/cacheable.rb +5 -9
  85. data/lib/mongoid/changeable.rb +183 -97
  86. data/lib/mongoid/clients/factory.rb +58 -15
  87. data/lib/mongoid/clients/options.rb +117 -8
  88. data/lib/mongoid/clients/sessions.rb +246 -84
  89. data/lib/mongoid/clients/storage_options.rb +37 -11
  90. data/lib/mongoid/clients/validators/storage.rb +4 -24
  91. data/lib/mongoid/clients/validators.rb +1 -1
  92. data/lib/mongoid/clients.rb +37 -14
  93. data/lib/mongoid/collection_configurable.rb +59 -0
  94. data/lib/mongoid/composable.rb +7 -7
  95. data/lib/mongoid/config/defaults.rb +40 -0
  96. data/lib/mongoid/config/encryption.rb +213 -0
  97. data/lib/mongoid/config/environment.rb +25 -5
  98. data/lib/mongoid/config/introspection.rb +152 -0
  99. data/lib/mongoid/config/options.rb +11 -14
  100. data/lib/mongoid/config/validators/async_query_executor.rb +34 -0
  101. data/lib/mongoid/config/validators/client.rb +7 -23
  102. data/lib/mongoid/config/validators/option.rb +1 -3
  103. data/lib/mongoid/config/validators.rb +2 -1
  104. data/lib/mongoid/config.rb +183 -46
  105. data/lib/mongoid/contextual/aggregable/memory.rb +38 -26
  106. data/lib/mongoid/contextual/aggregable/mongo.rb +26 -32
  107. data/lib/mongoid/contextual/aggregable/none.rb +66 -0
  108. data/lib/mongoid/contextual/aggregable.rb +18 -0
  109. data/lib/mongoid/contextual/atomic.rb +97 -30
  110. data/lib/mongoid/contextual/command.rb +3 -5
  111. data/lib/mongoid/contextual/map_reduce.rb +8 -33
  112. data/lib/mongoid/contextual/memory.rb +396 -89
  113. data/lib/mongoid/contextual/mongo/documents_loader.rb +178 -0
  114. data/lib/mongoid/contextual/mongo.rb +640 -311
  115. data/lib/mongoid/contextual/none.rb +244 -30
  116. data/lib/mongoid/contextual/queryable.rb +5 -4
  117. data/lib/mongoid/contextual.rb +18 -7
  118. data/lib/mongoid/copyable.rb +34 -14
  119. data/lib/mongoid/criteria/findable.rb +52 -22
  120. data/lib/mongoid/criteria/includable.rb +31 -34
  121. data/lib/mongoid/criteria/inspectable.rb +4 -3
  122. data/lib/mongoid/criteria/marshalable.rb +14 -7
  123. data/lib/mongoid/criteria/modifiable.rb +5 -19
  124. data/lib/mongoid/criteria/options.rb +1 -3
  125. data/lib/mongoid/criteria/permission.rb +6 -2
  126. data/lib/mongoid/criteria/queryable/aggregable.rb +3 -15
  127. data/lib/mongoid/criteria/queryable/expandable.rb +1 -25
  128. data/lib/mongoid/criteria/queryable/extensions/array.rb +6 -41
  129. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -9
  130. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +5 -7
  131. data/lib/mongoid/criteria/queryable/extensions/date.rb +10 -11
  132. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +8 -7
  133. data/lib/mongoid/criteria/queryable/extensions/hash.rb +3 -41
  134. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +2 -14
  135. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +3 -21
  136. data/lib/mongoid/criteria/queryable/extensions/object.rb +7 -30
  137. data/lib/mongoid/criteria/queryable/extensions/range.rb +48 -17
  138. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +10 -13
  139. data/lib/mongoid/criteria/queryable/extensions/set.rb +3 -5
  140. data/lib/mongoid/criteria/queryable/extensions/string.rb +19 -34
  141. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +6 -22
  142. data/lib/mongoid/criteria/queryable/extensions/time.rb +8 -9
  143. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +9 -9
  144. data/lib/mongoid/criteria/queryable/extensions.rb +1 -5
  145. data/lib/mongoid/criteria/queryable/key.rb +15 -18
  146. data/lib/mongoid/criteria/queryable/macroable.rb +1 -3
  147. data/lib/mongoid/criteria/queryable/mergeable.rb +69 -50
  148. data/lib/mongoid/criteria/queryable/optional.rb +12 -62
  149. data/lib/mongoid/criteria/queryable/options.rb +3 -21
  150. data/lib/mongoid/criteria/queryable/pipeline.rb +2 -14
  151. data/lib/mongoid/criteria/queryable/selectable.rb +87 -124
  152. data/lib/mongoid/criteria/queryable/selector.rb +96 -25
  153. data/lib/mongoid/criteria/queryable/smash.rb +41 -18
  154. data/lib/mongoid/criteria/queryable/storable.rb +14 -9
  155. data/lib/mongoid/criteria/queryable.rb +12 -13
  156. data/lib/mongoid/criteria/scopable.rb +32 -21
  157. data/lib/mongoid/criteria/translator.rb +46 -0
  158. data/lib/mongoid/criteria.rb +60 -109
  159. data/lib/mongoid/deprecable.rb +38 -0
  160. data/lib/mongoid/deprecation.rb +29 -0
  161. data/lib/mongoid/document.rb +263 -173
  162. data/lib/mongoid/encryptable.rb +53 -0
  163. data/lib/mongoid/equality.rb +22 -25
  164. data/lib/mongoid/errors/ambiguous_relationship.rb +3 -5
  165. data/lib/mongoid/errors/attribute_not_loaded.rb +34 -0
  166. data/lib/mongoid/errors/callback.rb +1 -3
  167. data/lib/mongoid/errors/create_collection_failure.rb +34 -0
  168. data/lib/mongoid/errors/criteria_argument_required.rb +1 -1
  169. data/lib/mongoid/errors/delete_restriction.rb +9 -12
  170. data/lib/mongoid/errors/document_not_destroyed.rb +3 -7
  171. data/lib/mongoid/errors/document_not_found.rb +34 -21
  172. data/lib/mongoid/errors/drop_collection_failure.rb +28 -0
  173. data/lib/mongoid/errors/empty_config_file.rb +26 -0
  174. data/lib/mongoid/errors/immutable_attribute.rb +27 -0
  175. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -3
  176. data/lib/mongoid/errors/invalid_async_query_executor.rb +26 -0
  177. data/lib/mongoid/errors/invalid_auto_encryption_configuration.rb +33 -0
  178. data/lib/mongoid/errors/invalid_collection.rb +1 -1
  179. data/lib/mongoid/errors/invalid_config_file.rb +26 -0
  180. data/lib/mongoid/errors/invalid_config_option.rb +2 -4
  181. data/lib/mongoid/errors/invalid_dependent_strategy.rb +2 -4
  182. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +1 -1
  183. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +24 -0
  184. data/lib/mongoid/errors/invalid_elem_match_operator.rb +1 -1
  185. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +6 -5
  186. data/lib/mongoid/errors/invalid_estimated_count_scoping.rb +27 -0
  187. data/lib/mongoid/errors/invalid_expression_operator.rb +1 -1
  188. data/lib/mongoid/errors/invalid_field.rb +7 -7
  189. data/lib/mongoid/errors/invalid_field_operator.rb +1 -1
  190. data/lib/mongoid/errors/invalid_field_option.rb +1 -3
  191. data/lib/mongoid/errors/invalid_field_type.rb +27 -0
  192. data/lib/mongoid/errors/invalid_find.rb +1 -3
  193. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +23 -0
  194. data/lib/mongoid/errors/invalid_includes.rb +1 -3
  195. data/lib/mongoid/errors/invalid_index.rb +1 -3
  196. data/lib/mongoid/errors/invalid_options.rb +1 -3
  197. data/lib/mongoid/errors/invalid_path.rb +1 -3
  198. data/lib/mongoid/errors/invalid_persistence_option.rb +1 -5
  199. data/lib/mongoid/errors/invalid_query.rb +1 -1
  200. data/lib/mongoid/errors/invalid_relation.rb +2 -8
  201. data/lib/mongoid/errors/invalid_relation_option.rb +2 -4
  202. data/lib/mongoid/errors/invalid_scope.rb +1 -3
  203. data/lib/mongoid/errors/invalid_session_nesting.rb +17 -0
  204. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +1 -2
  205. data/lib/mongoid/errors/invalid_storage_options.rb +2 -4
  206. data/lib/mongoid/errors/invalid_time.rb +1 -3
  207. data/lib/mongoid/errors/invalid_transaction_nesting.rb +17 -0
  208. data/lib/mongoid/errors/inverse_not_found.rb +1 -3
  209. data/lib/mongoid/errors/mixed_client_configuration.rb +1 -3
  210. data/lib/mongoid/errors/mixed_relations.rb +1 -3
  211. data/lib/mongoid/errors/mongoid_error.rb +8 -16
  212. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +2 -4
  213. data/lib/mongoid/errors/no_client_config.rb +1 -3
  214. data/lib/mongoid/errors/no_client_database.rb +2 -4
  215. data/lib/mongoid/errors/no_client_hosts.rb +2 -4
  216. data/lib/mongoid/errors/no_clients_config.rb +1 -3
  217. data/lib/mongoid/errors/no_default_client.rb +1 -3
  218. data/lib/mongoid/errors/no_environment.rb +1 -3
  219. data/lib/mongoid/errors/no_map_reduce_output.rb +1 -3
  220. data/lib/mongoid/errors/no_metadata.rb +1 -3
  221. data/lib/mongoid/errors/no_parent.rb +1 -3
  222. data/lib/mongoid/errors/readonly_attribute.rb +2 -4
  223. data/lib/mongoid/errors/readonly_document.rb +2 -6
  224. data/lib/mongoid/errors/rollback.rb +15 -0
  225. data/lib/mongoid/errors/scope_overwrite.rb +1 -1
  226. data/lib/mongoid/errors/sessions_not_supported.rb +17 -0
  227. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +2 -2
  228. data/lib/mongoid/errors/transaction_error.rb +25 -0
  229. data/lib/mongoid/errors/transactions_not_supported.rb +17 -0
  230. data/lib/mongoid/errors/unknown_attribute.rb +2 -4
  231. data/lib/mongoid/errors/unknown_model.rb +1 -3
  232. data/lib/mongoid/errors/unsaved_document.rb +2 -2
  233. data/lib/mongoid/errors/unsupported_javascript.rb +1 -3
  234. data/lib/mongoid/errors/validations.rb +1 -1
  235. data/lib/mongoid/errors.rb +18 -5
  236. data/lib/mongoid/evolvable.rb +2 -4
  237. data/lib/mongoid/extensions/array.rb +20 -58
  238. data/lib/mongoid/extensions/big_decimal.rb +44 -24
  239. data/lib/mongoid/extensions/binary.rb +45 -0
  240. data/lib/mongoid/extensions/boolean.rb +11 -6
  241. data/lib/mongoid/extensions/date.rb +31 -29
  242. data/lib/mongoid/extensions/date_time.rb +5 -16
  243. data/lib/mongoid/extensions/decimal128.rb +3 -5
  244. data/lib/mongoid/extensions/false_class.rb +8 -10
  245. data/lib/mongoid/extensions/float.rb +11 -12
  246. data/lib/mongoid/extensions/hash.rb +28 -148
  247. data/lib/mongoid/extensions/integer.rb +13 -14
  248. data/lib/mongoid/extensions/module.rb +5 -5
  249. data/lib/mongoid/extensions/nil_class.rb +5 -7
  250. data/lib/mongoid/extensions/object.rb +32 -81
  251. data/lib/mongoid/extensions/object_id.rb +3 -7
  252. data/lib/mongoid/extensions/range.rb +47 -24
  253. data/lib/mongoid/extensions/raw_value.rb +34 -0
  254. data/lib/mongoid/extensions/regexp.rb +14 -7
  255. data/lib/mongoid/extensions/set.rb +24 -13
  256. data/lib/mongoid/extensions/string.rb +30 -62
  257. data/lib/mongoid/extensions/symbol.rb +9 -22
  258. data/lib/mongoid/extensions/time.rb +30 -40
  259. data/lib/mongoid/extensions/time_with_zone.rb +18 -11
  260. data/lib/mongoid/extensions/true_class.rb +8 -10
  261. data/lib/mongoid/extensions.rb +3 -20
  262. data/lib/mongoid/factory.rb +178 -37
  263. data/lib/mongoid/fields/encrypted.rb +48 -0
  264. data/lib/mongoid/fields/foreign_key.rb +39 -27
  265. data/lib/mongoid/fields/localized.rb +25 -15
  266. data/lib/mongoid/fields/standard.rb +22 -40
  267. data/lib/mongoid/fields/validators/macro.rb +6 -19
  268. data/lib/mongoid/fields/validators.rb +1 -1
  269. data/lib/mongoid/fields.rb +354 -76
  270. data/lib/mongoid/findable.rb +62 -22
  271. data/lib/mongoid/indexable/specification.rb +55 -34
  272. data/lib/mongoid/indexable/validators/options.rb +7 -9
  273. data/lib/mongoid/indexable.rb +2 -18
  274. data/lib/mongoid/inspectable.rb +34 -11
  275. data/lib/mongoid/interceptable.rb +197 -41
  276. data/lib/mongoid/loadable.rb +83 -0
  277. data/lib/mongoid/loggable.rb +1 -9
  278. data/lib/mongoid/matchable.rb +2 -6
  279. data/lib/mongoid/matcher/all.rb +15 -0
  280. data/lib/mongoid/matcher/and.rb +14 -0
  281. data/lib/mongoid/matcher/bits.rb +60 -0
  282. data/lib/mongoid/matcher/bits_all_clear.rb +41 -0
  283. data/lib/mongoid/matcher/bits_all_set.rb +41 -0
  284. data/lib/mongoid/matcher/bits_any_clear.rb +41 -0
  285. data/lib/mongoid/matcher/bits_any_set.rb +41 -0
  286. data/lib/mongoid/matcher/elem_match.rb +17 -1
  287. data/lib/mongoid/matcher/elem_match_expression.rb +14 -2
  288. data/lib/mongoid/matcher/eq.rb +15 -0
  289. data/lib/mongoid/matcher/eq_impl.rb +54 -2
  290. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +18 -1
  291. data/lib/mongoid/matcher/exists.rb +15 -0
  292. data/lib/mongoid/matcher/expression.rb +22 -14
  293. data/lib/mongoid/matcher/expression_operator.rb +14 -0
  294. data/lib/mongoid/matcher/field_expression.rb +19 -5
  295. data/lib/mongoid/matcher/field_operator.rb +30 -0
  296. data/lib/mongoid/matcher/gt.rb +15 -0
  297. data/lib/mongoid/matcher/gte.rb +15 -0
  298. data/lib/mongoid/matcher/in.rb +15 -0
  299. data/lib/mongoid/matcher/lt.rb +15 -0
  300. data/lib/mongoid/matcher/lte.rb +15 -0
  301. data/lib/mongoid/matcher/mod.rb +33 -0
  302. data/lib/mongoid/matcher/ne.rb +15 -0
  303. data/lib/mongoid/matcher/nin.rb +15 -0
  304. data/lib/mongoid/matcher/nor.rb +14 -0
  305. data/lib/mongoid/matcher/not.rb +16 -0
  306. data/lib/mongoid/matcher/or.rb +14 -0
  307. data/lib/mongoid/matcher/regex.rb +24 -0
  308. data/lib/mongoid/matcher/size.rb +16 -0
  309. data/lib/mongoid/matcher/type.rb +124 -0
  310. data/lib/mongoid/matcher.rb +59 -52
  311. data/lib/mongoid/persistable/creatable.rb +25 -29
  312. data/lib/mongoid/persistable/deletable.rb +10 -23
  313. data/lib/mongoid/persistable/destroyable.rb +37 -11
  314. data/lib/mongoid/persistable/incrementable.rb +2 -6
  315. data/lib/mongoid/persistable/logical.rb +1 -5
  316. data/lib/mongoid/persistable/maxable.rb +37 -0
  317. data/lib/mongoid/persistable/minable.rb +37 -0
  318. data/lib/mongoid/persistable/multipliable.rb +36 -0
  319. data/lib/mongoid/persistable/poppable.rb +1 -5
  320. data/lib/mongoid/persistable/pullable.rb +1 -7
  321. data/lib/mongoid/persistable/pushable.rb +1 -7
  322. data/lib/mongoid/persistable/renamable.rb +1 -5
  323. data/lib/mongoid/persistable/savable.rb +14 -8
  324. data/lib/mongoid/persistable/settable.rb +1 -5
  325. data/lib/mongoid/persistable/unsettable.rb +3 -7
  326. data/lib/mongoid/persistable/updatable.rb +114 -28
  327. data/lib/mongoid/persistable/upsertable.rb +33 -8
  328. data/lib/mongoid/persistable.rb +17 -27
  329. data/lib/mongoid/persistence_context.rb +111 -43
  330. data/lib/mongoid/positional.rb +1 -5
  331. data/lib/mongoid/railtie.rb +23 -15
  332. data/lib/mongoid/railties/bson_object_id_serializer.rb +39 -0
  333. data/lib/mongoid/railties/console_sandbox.rb +42 -0
  334. data/lib/mongoid/railties/controller_runtime.rb +21 -6
  335. data/lib/mongoid/railties/database.rake +19 -2
  336. data/lib/mongoid/reloadable.rb +45 -42
  337. data/lib/mongoid/scopable.rb +25 -53
  338. data/lib/mongoid/search_indexable.rb +167 -0
  339. data/lib/mongoid/selectable.rb +6 -17
  340. data/lib/mongoid/serializable.rb +11 -21
  341. data/lib/mongoid/shardable.rb +50 -16
  342. data/lib/mongoid/stateful.rb +66 -22
  343. data/lib/mongoid/stringified_symbol.rb +19 -7
  344. data/lib/mongoid/tasks/database.rake +25 -0
  345. data/lib/mongoid/tasks/database.rb +84 -8
  346. data/lib/mongoid/tasks/encryption.rake +59 -0
  347. data/lib/mongoid/tasks/encryption.rb +108 -0
  348. data/lib/mongoid/threaded/lifecycle.rb +6 -26
  349. data/lib/mongoid/threaded.rb +131 -92
  350. data/lib/mongoid/timestamps/created/short.rb +1 -1
  351. data/lib/mongoid/timestamps/created.rb +4 -4
  352. data/lib/mongoid/timestamps/short.rb +1 -1
  353. data/lib/mongoid/timestamps/timeless.rb +29 -7
  354. data/lib/mongoid/timestamps/updated/short.rb +1 -1
  355. data/lib/mongoid/timestamps/updated.rb +3 -5
  356. data/lib/mongoid/timestamps.rb +1 -1
  357. data/lib/mongoid/touchable.rb +155 -29
  358. data/lib/mongoid/traversable.rb +180 -125
  359. data/lib/mongoid/utils.rb +52 -0
  360. data/lib/mongoid/validatable/associated.rb +97 -21
  361. data/lib/mongoid/validatable/format.rb +1 -1
  362. data/lib/mongoid/validatable/length.rb +1 -1
  363. data/lib/mongoid/validatable/localizable.rb +2 -4
  364. data/lib/mongoid/validatable/macros.rb +10 -14
  365. data/lib/mongoid/validatable/presence.rb +7 -13
  366. data/lib/mongoid/validatable/queryable.rb +9 -3
  367. data/lib/mongoid/validatable/uniqueness.rb +26 -39
  368. data/lib/mongoid/validatable.rb +20 -29
  369. data/lib/mongoid/version.rb +2 -2
  370. data/lib/mongoid/warnings.rb +37 -0
  371. data/lib/mongoid.rb +56 -22
  372. data/lib/rails/generators/mongoid/config/config_generator.rb +25 -5
  373. data/lib/rails/generators/mongoid/config/templates/mongoid.rb +25 -0
  374. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +44 -64
  375. data/lib/rails/generators/mongoid/model/model_generator.rb +4 -1
  376. data/lib/rails/generators/mongoid_generator.rb +13 -1
  377. data/lib/rails/mongoid.rb +4 -32
  378. data/spec/config/mongoid.yml +16 -1
  379. data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
  380. data/spec/integration/active_job_spec.rb +32 -0
  381. data/spec/integration/app_spec.rb +180 -89
  382. data/spec/integration/associations/belongs_to_spec.rb +19 -1
  383. data/spec/integration/associations/embedded_dirty_spec.rb +58 -0
  384. data/spec/integration/associations/embedded_spec.rb +90 -7
  385. data/spec/integration/associations/embeds_many_spec.rb +197 -1
  386. data/spec/integration/associations/embeds_one_spec.rb +19 -1
  387. data/spec/integration/associations/foreign_key_spec.rb +10 -1
  388. data/spec/integration/associations/foreign_key_spec_models.rb +1 -1
  389. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +62 -0
  390. data/spec/integration/associations/has_many_spec.rb +1 -1
  391. data/spec/integration/associations/has_one_spec.rb +145 -1
  392. data/spec/integration/associations/nested_attributes_assignment_spec.rb +1 -1
  393. data/spec/integration/associations/reverse_population_spec.rb +1 -1
  394. data/spec/integration/associations/reverse_population_spec_models.rb +1 -1
  395. data/spec/integration/associations/scope_option_spec.rb +102 -0
  396. data/spec/integration/atomic/modifiers_spec.rb +1 -1
  397. data/spec/integration/bson_regexp_raw_spec.rb +1 -1
  398. data/spec/integration/callbacks_models.rb +147 -3
  399. data/spec/integration/callbacks_spec.rb +398 -8
  400. data/spec/integration/contextual/empty_spec.rb +142 -0
  401. data/spec/integration/criteria/alias_query_spec.rb +98 -0
  402. data/spec/integration/criteria/date_field_spec.rb +2 -2
  403. data/spec/integration/criteria/default_scope_spec.rb +52 -0
  404. data/spec/integration/criteria/logical_spec.rb +12 -0
  405. data/spec/integration/criteria/range_spec.rb +358 -0
  406. data/spec/integration/criteria/raw_value_spec.rb +525 -0
  407. data/spec/integration/criteria/time_with_zone_spec.rb +126 -15
  408. data/spec/integration/discriminator_key_spec.rb +119 -81
  409. data/spec/integration/discriminator_value_spec.rb +1 -1
  410. data/spec/integration/document_spec.rb +31 -1
  411. data/spec/integration/dots_and_dollars_spec.rb +278 -0
  412. data/spec/integration/encryption_spec.rb +100 -0
  413. data/spec/integration/i18n_fallbacks_spec.rb +10 -52
  414. data/spec/integration/matcher_examples_spec.rb +21 -14
  415. data/spec/integration/matcher_operator_data/bits_all_clear.yml +144 -0
  416. data/spec/integration/matcher_operator_data/bits_all_set.yml +144 -0
  417. data/spec/integration/matcher_operator_data/bits_any_clear.yml +144 -0
  418. data/spec/integration/matcher_operator_data/bits_any_set.yml +144 -0
  419. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  420. data/spec/integration/matcher_operator_data/elem_match.yml +46 -0
  421. data/spec/integration/matcher_operator_data/implicit_traversal.yml +96 -0
  422. data/spec/integration/matcher_operator_data/in.yml +16 -0
  423. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  424. data/spec/integration/matcher_operator_data/size.yml +0 -3
  425. data/spec/integration/matcher_operator_data/type.yml +64 -0
  426. data/spec/integration/matcher_operator_data/type_array.yml +15 -0
  427. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  428. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  429. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  430. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  431. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  432. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  433. data/spec/integration/matcher_operator_data/type_decimal.yml +37 -0
  434. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  435. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  436. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  437. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  438. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  439. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  440. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  441. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  442. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  443. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  444. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  445. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  446. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  447. data/spec/integration/matcher_operator_spec.rb +26 -3
  448. data/spec/integration/matcher_spec.rb +50 -1
  449. data/spec/integration/persistence/range_field_spec.rb +351 -0
  450. data/spec/integration/server_query_spec.rb +1 -1
  451. data/spec/integration/shardable_spec.rb +1 -1
  452. data/spec/integration/stringified_symbol_field_spec.rb +17 -3
  453. data/spec/lite_spec_helper.rb +47 -14
  454. data/spec/mongoid/association/accessors_spec.rb +31 -19
  455. data/spec/mongoid/association/auto_save_spec.rb +73 -34
  456. data/spec/mongoid/association/builders_spec.rb +2 -2
  457. data/spec/mongoid/association/constrainable_spec.rb +1 -1
  458. data/spec/mongoid/association/counter_cache_spec.rb +34 -34
  459. data/spec/mongoid/association/depending_spec.rb +397 -358
  460. data/spec/mongoid/association/eager_spec.rb +56 -6
  461. data/spec/mongoid/association/embedded/cyclic_spec.rb +3 -3
  462. data/spec/mongoid/association/embedded/dirty_spec.rb +3 -3
  463. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +3 -2
  464. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +55 -1
  465. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +110 -23
  466. data/spec/mongoid/association/embedded/embedded_in_spec.rb +19 -8
  467. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +1 -1
  468. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +113 -1
  469. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +712 -203
  470. data/spec/mongoid/association/embedded/embeds_many_models.rb +189 -1
  471. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +14 -2
  472. data/spec/mongoid/association/embedded/embeds_many_spec.rb +69 -1
  473. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +1 -1
  474. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +26 -1
  475. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +37 -24
  476. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +1 -1
  477. data/spec/mongoid/association/embedded/embeds_one_models.rb +25 -2
  478. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +2 -2
  479. data/spec/mongoid/association/embedded/embeds_one_spec.rb +29 -1
  480. data/spec/mongoid/association/macros_spec.rb +10 -10
  481. data/spec/mongoid/association/nested/many_spec.rb +1 -1
  482. data/spec/mongoid/association/nested/one_spec.rb +17 -13
  483. data/spec/mongoid/association/options_spec.rb +1 -1
  484. data/spec/mongoid/association/polymorphic_spec.rb +1 -1
  485. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +3 -2
  486. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +110 -17
  487. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +51 -15
  488. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +113 -59
  489. data/spec/mongoid/association/referenced/belongs_to_models.rb +12 -0
  490. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +22 -2
  491. data/spec/mongoid/association/referenced/belongs_to_spec.rb +27 -22
  492. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +2 -2
  493. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +28 -3
  494. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +32 -3
  495. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +1 -1
  496. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +386 -376
  497. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +44 -1
  498. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +2 -2
  499. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +57 -3
  500. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +2 -2
  501. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +131 -1
  502. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +24 -7
  503. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +313 -134
  504. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +1 -1
  505. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +1313 -2109
  506. data/spec/mongoid/association/referenced/has_many_models.rb +39 -2
  507. data/spec/mongoid/association/referenced/has_many_query_spec.rb +2 -2
  508. data/spec/mongoid/association/referenced/has_many_spec.rb +47 -1
  509. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +1 -1
  510. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +54 -10
  511. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +18 -2
  512. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +134 -28
  513. data/spec/mongoid/association/referenced/has_one_models.rb +43 -1
  514. data/spec/mongoid/association/referenced/has_one_query_spec.rb +2 -2
  515. data/spec/mongoid/association/referenced/has_one_spec.rb +22 -1
  516. data/spec/mongoid/association/reflections_spec.rb +1 -1
  517. data/spec/mongoid/association/syncable_spec.rb +47 -33
  518. data/spec/mongoid/association_spec.rb +1 -1
  519. data/spec/mongoid/atomic/modifiers_spec.rb +1 -1
  520. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +1 -1
  521. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +1 -1
  522. data/spec/mongoid/atomic/paths/root_spec.rb +1 -1
  523. data/spec/mongoid/atomic/paths_spec.rb +65 -27
  524. data/spec/mongoid/atomic_spec.rb +29 -7
  525. data/spec/mongoid/atomic_update_preparer_spec.rb +83 -0
  526. data/spec/mongoid/attributes/dynamic_spec.rb +1 -1
  527. data/spec/mongoid/attributes/embedded_spec.rb +118 -0
  528. data/spec/mongoid/attributes/nested_spec.rb +147 -78
  529. data/spec/mongoid/attributes/nested_spec_models.rb +49 -0
  530. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  531. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  532. data/spec/mongoid/attributes/projector_spec.rb +41 -0
  533. data/spec/mongoid/attributes/readonly_spec.rb +23 -23
  534. data/spec/mongoid/attributes_spec.rb +921 -69
  535. data/spec/mongoid/cacheable_spec.rb +5 -5
  536. data/spec/mongoid/changeable_spec.rb +468 -76
  537. data/spec/mongoid/clients/factory_spec.rb +152 -30
  538. data/spec/mongoid/clients/options_spec.rb +24 -12
  539. data/spec/mongoid/clients/sessions_spec.rb +49 -71
  540. data/spec/mongoid/clients/transactions_spec.rb +971 -176
  541. data/spec/mongoid/clients/transactions_spec_models.rb +159 -0
  542. data/spec/mongoid/clients_spec.rb +230 -22
  543. data/spec/mongoid/collection_configurable_spec.rb +159 -0
  544. data/spec/mongoid/composable_spec.rb +1 -1
  545. data/spec/mongoid/config/defaults_spec.rb +99 -0
  546. data/spec/mongoid/config/encryption_spec.rb +152 -0
  547. data/spec/mongoid/config/environment_spec.rb +126 -39
  548. data/spec/mongoid/config/introspection_spec.rb +114 -0
  549. data/spec/mongoid/config/options_spec.rb +1 -1
  550. data/spec/mongoid/config_spec.rb +375 -43
  551. data/spec/mongoid/contextual/aggregable/memory_spec.rb +432 -154
  552. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  553. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +63 -0
  554. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +95 -20
  555. data/spec/mongoid/contextual/aggregable/none_spec.rb +49 -0
  556. data/spec/mongoid/contextual/atomic_spec.rb +329 -87
  557. data/spec/mongoid/contextual/map_reduce_spec.rb +5 -19
  558. data/spec/mongoid/contextual/memory_spec.rb +1479 -127
  559. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +194 -0
  560. data/spec/mongoid/contextual/mongo_spec.rb +3374 -1254
  561. data/spec/mongoid/contextual/none_spec.rb +79 -68
  562. data/spec/mongoid/copyable_spec.rb +465 -23
  563. data/spec/mongoid/copyable_spec_models.rb +1 -1
  564. data/spec/mongoid/criteria/findable_spec.rb +295 -229
  565. data/spec/mongoid/criteria/includable_spec.rb +1493 -0
  566. data/spec/mongoid/criteria/includable_spec_models.rb +55 -0
  567. data/spec/mongoid/criteria/inspectable_spec.rb +1 -1
  568. data/spec/mongoid/criteria/marshalable_spec.rb +19 -2
  569. data/spec/mongoid/criteria/modifiable_spec.rb +38 -38
  570. data/spec/mongoid/criteria/options_spec.rb +1 -1
  571. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +2 -2
  572. data/spec/mongoid/criteria/queryable/expandable_spec.rb +1 -74
  573. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +8 -20
  574. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +135 -27
  575. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +2 -2
  576. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +32 -12
  577. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +12 -1
  578. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +1 -1
  579. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +1 -16
  580. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +1 -1
  581. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +1 -1
  582. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +74 -8
  583. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +1 -1
  584. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +238 -179
  585. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -12
  586. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +1 -12
  587. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +1 -1
  588. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +48 -132
  589. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +5 -60
  590. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +12 -1
  591. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +12 -1
  592. data/spec/mongoid/criteria/queryable/key_spec.rb +1 -1
  593. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +106 -8
  594. data/spec/mongoid/criteria/queryable/optional_spec.rb +17 -486
  595. data/spec/mongoid/criteria/queryable/options_spec.rb +2 -2
  596. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +1 -1
  597. data/spec/mongoid/criteria/queryable/queryable_spec.rb +2 -2
  598. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +700 -26
  599. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +39 -0
  600. data/spec/mongoid/criteria/queryable/selectable_spec.rb +149 -683
  601. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +590 -0
  602. data/spec/mongoid/criteria/queryable/selector_spec.rb +186 -6
  603. data/spec/mongoid/criteria/queryable/smash_spec.rb +1 -1
  604. data/spec/mongoid/criteria/queryable/storable_spec.rb +87 -1
  605. data/spec/mongoid/criteria/scopable_spec.rb +128 -1
  606. data/spec/mongoid/criteria/translator_spec.rb +133 -0
  607. data/spec/mongoid/criteria_projection_spec.rb +407 -0
  608. data/spec/mongoid/criteria_spec.rb +1029 -1806
  609. data/spec/mongoid/document_fields_spec.rb +180 -5
  610. data/spec/mongoid/document_persistence_context_spec.rb +77 -1
  611. data/spec/mongoid/document_query_spec.rb +55 -4
  612. data/spec/mongoid/document_spec.rb +43 -172
  613. data/spec/mongoid/equality_spec.rb +7 -8
  614. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +1 -1
  615. data/spec/mongoid/errors/attribute_not_loaded_spec.rb +32 -0
  616. data/spec/mongoid/errors/callback_spec.rb +1 -1
  617. data/spec/mongoid/errors/delete_restriction_spec.rb +2 -2
  618. data/spec/mongoid/errors/document_not_destroyed_spec.rb +1 -1
  619. data/spec/mongoid/errors/document_not_found_spec.rb +77 -1
  620. data/spec/mongoid/errors/invalid_collection_spec.rb +1 -1
  621. data/spec/mongoid/errors/{eager_load_spec.rb → invalid_config_file_spec.rb} +6 -6
  622. data/spec/mongoid/errors/invalid_config_option_spec.rb +1 -1
  623. data/spec/mongoid/errors/invalid_field_option_spec.rb +1 -1
  624. data/spec/mongoid/errors/invalid_field_spec.rb +2 -2
  625. data/spec/mongoid/errors/invalid_field_type_spec.rb +56 -0
  626. data/spec/mongoid/errors/invalid_find_spec.rb +1 -1
  627. data/spec/mongoid/errors/invalid_includes_spec.rb +1 -1
  628. data/spec/mongoid/errors/invalid_index_spec.rb +1 -1
  629. data/spec/mongoid/errors/invalid_options_spec.rb +1 -1
  630. data/spec/mongoid/errors/invalid_path_spec.rb +1 -1
  631. data/spec/mongoid/errors/invalid_relation_spec.rb +1 -1
  632. data/spec/mongoid/errors/invalid_scope_spec.rb +2 -2
  633. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +1 -1
  634. data/spec/mongoid/errors/invalid_storage_options_spec.rb +1 -1
  635. data/spec/mongoid/errors/invalid_time_spec.rb +1 -1
  636. data/spec/mongoid/errors/inverse_not_found_spec.rb +1 -1
  637. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +1 -1
  638. data/spec/mongoid/errors/mixed_relations_spec.rb +1 -1
  639. data/spec/mongoid/errors/mongoid_error_spec.rb +4 -4
  640. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +1 -1
  641. data/spec/mongoid/errors/no_client_config_spec.rb +1 -1
  642. data/spec/mongoid/errors/no_client_database_spec.rb +1 -1
  643. data/spec/mongoid/errors/no_client_hosts_spec.rb +1 -1
  644. data/spec/mongoid/errors/no_clients_config_spec.rb +1 -1
  645. data/spec/mongoid/errors/no_environment_spec.rb +4 -4
  646. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +1 -1
  647. data/spec/mongoid/errors/no_metadata_spec.rb +1 -1
  648. data/spec/mongoid/errors/no_parent_spec.rb +1 -1
  649. data/spec/mongoid/errors/readonly_attribute_spec.rb +1 -1
  650. data/spec/mongoid/errors/readonly_document_spec.rb +3 -3
  651. data/spec/mongoid/errors/scope_overwrite_spec.rb +1 -1
  652. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +2 -2
  653. data/spec/mongoid/errors/unknown_attribute_spec.rb +3 -3
  654. data/spec/mongoid/errors/unsaved_document_spec.rb +1 -1
  655. data/spec/mongoid/errors/unsupported_javascript_spec.rb +1 -1
  656. data/spec/mongoid/errors/validations_spec.rb +1 -1
  657. data/spec/mongoid/extensions/array_spec.rb +19 -265
  658. data/spec/mongoid/extensions/big_decimal_spec.rb +713 -213
  659. data/spec/mongoid/extensions/binary_spec.rb +45 -10
  660. data/spec/mongoid/extensions/boolean_spec.rb +69 -83
  661. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +15 -11
  662. data/spec/mongoid/extensions/date_spec.rb +74 -22
  663. data/spec/mongoid/extensions/date_time_spec.rb +18 -19
  664. data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
  665. data/spec/mongoid/extensions/false_class_spec.rb +2 -9
  666. data/spec/mongoid/extensions/float_spec.rb +56 -84
  667. data/spec/mongoid/extensions/hash_spec.rb +45 -219
  668. data/spec/mongoid/extensions/integer_spec.rb +53 -73
  669. data/spec/mongoid/extensions/module_spec.rb +1 -1
  670. data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
  671. data/spec/mongoid/extensions/object_id_spec.rb +1 -1
  672. data/spec/mongoid/extensions/object_spec.rb +1 -177
  673. data/spec/mongoid/extensions/range_spec.rb +254 -64
  674. data/spec/mongoid/extensions/raw_value_spec.rb +67 -0
  675. data/spec/mongoid/extensions/regexp_spec.rb +59 -34
  676. data/spec/mongoid/extensions/set_spec.rb +105 -1
  677. data/spec/mongoid/extensions/string_spec.rb +21 -104
  678. data/spec/mongoid/extensions/stringified_symbol_spec.rb +1 -1
  679. data/spec/mongoid/extensions/symbol_spec.rb +15 -53
  680. data/spec/mongoid/extensions/time_spec.rb +345 -131
  681. data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -107
  682. data/spec/mongoid/extensions/true_class_spec.rb +2 -9
  683. data/spec/mongoid/factory_spec.rb +63 -2
  684. data/spec/mongoid/fields/foreign_key_spec.rb +282 -120
  685. data/spec/mongoid/fields/localized_spec.rb +85 -42
  686. data/spec/mongoid/fields/standard_spec.rb +1 -1
  687. data/spec/mongoid/fields_spec.rb +826 -121
  688. data/spec/mongoid/findable_spec.rb +442 -80
  689. data/spec/mongoid/indexable/specification_spec.rb +132 -14
  690. data/spec/mongoid/indexable_spec.rb +361 -23
  691. data/spec/mongoid/inspectable_spec.rb +93 -5
  692. data/spec/mongoid/interceptable_spec.rb +926 -116
  693. data/spec/mongoid/interceptable_spec_models.rb +236 -4
  694. data/spec/mongoid/loading_spec.rb +110 -0
  695. data/spec/mongoid/loggable_spec.rb +1 -1
  696. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  697. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +68 -88
  698. data/spec/mongoid/matcher/extract_attribute_spec.rb +5 -15
  699. data/spec/mongoid/mongoizable_spec.rb +286 -0
  700. data/spec/mongoid/monkey_patches_spec.rb +211 -0
  701. data/spec/mongoid/persistable/creatable_spec.rb +5 -5
  702. data/spec/mongoid/persistable/deletable_spec.rb +267 -27
  703. data/spec/mongoid/persistable/destroyable_spec.rb +409 -24
  704. data/spec/mongoid/persistable/incrementable_spec.rb +46 -9
  705. data/spec/mongoid/persistable/logical_spec.rb +42 -5
  706. data/spec/mongoid/persistable/maxable_spec.rb +147 -0
  707. data/spec/mongoid/persistable/minable_spec.rb +147 -0
  708. data/spec/mongoid/persistable/multipliable_spec.rb +227 -0
  709. data/spec/mongoid/persistable/poppable_spec.rb +41 -5
  710. data/spec/mongoid/persistable/pullable_spec.rb +81 -9
  711. data/spec/mongoid/persistable/pushable_spec.rb +81 -9
  712. data/spec/mongoid/persistable/renamable_spec.rb +40 -4
  713. data/spec/mongoid/persistable/savable_spec.rb +114 -20
  714. data/spec/mongoid/persistable/settable_spec.rb +77 -10
  715. data/spec/mongoid/persistable/unsettable_spec.rb +41 -5
  716. data/spec/mongoid/persistable/updatable_spec.rb +64 -52
  717. data/spec/mongoid/persistable/upsertable_spec.rb +124 -4
  718. data/spec/mongoid/persistable_spec.rb +4 -4
  719. data/spec/mongoid/persistence_context_spec.rb +58 -59
  720. data/spec/mongoid/positional_spec.rb +1 -1
  721. data/spec/mongoid/railties/bson_object_id_serializer_spec.rb +24 -0
  722. data/spec/mongoid/railties/console_sandbox_spec.rb +44 -0
  723. data/spec/mongoid/relations/proxy_spec.rb +7 -7
  724. data/spec/mongoid/reloadable_spec.rb +255 -30
  725. data/spec/mongoid/scopable_spec.rb +198 -58
  726. data/spec/mongoid/search_indexable_spec.rb +147 -0
  727. data/spec/mongoid/selectable_spec.rb +7 -7
  728. data/spec/mongoid/serializable_spec.rb +19 -40
  729. data/spec/mongoid/shardable_models.rb +15 -0
  730. data/spec/mongoid/shardable_spec.rb +181 -31
  731. data/spec/mongoid/stateful_spec.rb +152 -10
  732. data/spec/mongoid/tasks/database_rake_spec.rb +193 -42
  733. data/spec/mongoid/tasks/database_spec.rb +175 -2
  734. data/spec/mongoid/tasks/encryption_spec.rb +187 -0
  735. data/spec/mongoid/threaded_spec.rb +40 -3
  736. data/spec/mongoid/timestamps/created/short_spec.rb +2 -2
  737. data/spec/mongoid/timestamps/created_spec.rb +2 -2
  738. data/spec/mongoid/timestamps/timeless_spec.rb +3 -3
  739. data/spec/mongoid/timestamps/updated/short_spec.rb +4 -4
  740. data/spec/mongoid/timestamps/updated_spec.rb +4 -4
  741. data/spec/mongoid/timestamps_spec.rb +399 -11
  742. data/spec/mongoid/timestamps_spec_models.rb +68 -0
  743. data/spec/mongoid/touchable_spec.rb +971 -54
  744. data/spec/mongoid/touchable_spec_models.rb +154 -0
  745. data/spec/mongoid/traversable_spec.rb +79 -37
  746. data/spec/mongoid/validatable/associated_spec.rb +14 -31
  747. data/spec/mongoid/validatable/format_spec.rb +1 -1
  748. data/spec/mongoid/validatable/length_spec.rb +1 -1
  749. data/spec/mongoid/validatable/numericality_spec.rb +1 -1
  750. data/spec/mongoid/validatable/presence_spec.rb +27 -23
  751. data/spec/mongoid/validatable/uniqueness_spec.rb +170 -99
  752. data/spec/mongoid/validatable_spec.rb +4 -4
  753. data/spec/mongoid/warnings_spec.rb +36 -0
  754. data/spec/mongoid_spec.rb +61 -11
  755. data/spec/rails/controller_extension/controller_runtime_spec.rb +3 -3
  756. data/spec/rails/mongoid_spec.rb +28 -132
  757. data/spec/shared/bin/get-mongodb-download-url +17 -0
  758. data/spec/shared/bin/s3-copy +45 -0
  759. data/spec/shared/bin/s3-upload +69 -0
  760. data/spec/shared/lib/mrss/cluster_config.rb +24 -4
  761. data/spec/shared/lib/mrss/constraints.rb +77 -29
  762. data/spec/shared/lib/mrss/docker_runner.rb +40 -4
  763. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  764. data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
  765. data/spec/shared/lib/mrss/lite_constraints.rb +64 -1
  766. data/spec/shared/lib/mrss/server_version_registry.rb +78 -34
  767. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  768. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  769. data/spec/shared/lib/mrss/spec_organizer.rb +32 -2
  770. data/spec/shared/lib/mrss/utils.rb +37 -0
  771. data/spec/shared/share/Dockerfile.erb +123 -71
  772. data/spec/shared/share/haproxy-1.conf +16 -0
  773. data/spec/shared/share/haproxy-2.conf +17 -0
  774. data/spec/shared/shlib/config.sh +27 -0
  775. data/spec/shared/shlib/distro.sh +2 -1
  776. data/spec/shared/shlib/server.sh +187 -40
  777. data/spec/shared/shlib/set_env.sh +49 -31
  778. data/spec/spec_helper.rb +46 -49
  779. data/spec/support/authorization.rb +1 -1
  780. data/spec/support/client_registry.rb +10 -0
  781. data/spec/support/constraints.rb +25 -1
  782. data/spec/support/crypt/models.rb +50 -0
  783. data/spec/support/crypt.rb +80 -0
  784. data/spec/support/expectations.rb +1 -1
  785. data/spec/support/feature_sandbox.rb +72 -0
  786. data/spec/support/helpers.rb +1 -0
  787. data/spec/support/immutable_ids.rb +119 -0
  788. data/spec/support/macros.rb +107 -1
  789. data/spec/support/models/account.rb +2 -2
  790. data/spec/support/models/acolyte.rb +1 -1
  791. data/spec/support/models/actor.rb +1 -1
  792. data/spec/support/models/actress.rb +1 -1
  793. data/spec/support/models/address.rb +7 -1
  794. data/spec/support/models/address_component.rb +1 -1
  795. data/spec/support/models/address_number.rb +1 -1
  796. data/spec/support/models/agency.rb +1 -1
  797. data/spec/support/models/agent.rb +1 -1
  798. data/spec/support/models/album.rb +1 -1
  799. data/spec/support/models/alert.rb +1 -1
  800. data/spec/support/models/animal.rb +1 -1
  801. data/spec/support/models/answer.rb +1 -1
  802. data/spec/support/models/appointment.rb +1 -1
  803. data/spec/support/models/armrest.rb +1 -1
  804. data/spec/support/models/array_field.rb +1 -1
  805. data/spec/support/models/article.rb +1 -1
  806. data/spec/support/models/artist.rb +3 -2
  807. data/spec/support/models/artwork.rb +1 -1
  808. data/spec/support/models/audible_sound.rb +4 -0
  809. data/spec/support/models/audio.rb +1 -1
  810. data/spec/support/models/augmentation.rb +13 -1
  811. data/spec/support/models/author.rb +1 -1
  812. data/spec/support/models/baby.rb +1 -1
  813. data/spec/support/models/band.rb +13 -1
  814. data/spec/support/models/bar.rb +1 -1
  815. data/spec/support/models/basic.rb +1 -1
  816. data/spec/support/models/bed.rb +1 -1
  817. data/spec/support/models/big_palette.rb +1 -1
  818. data/spec/support/models/birthday.rb +1 -1
  819. data/spec/support/models/bolt.rb +8 -0
  820. data/spec/support/models/bomb.rb +1 -1
  821. data/spec/support/models/book.rb +2 -1
  822. data/spec/support/models/breed.rb +1 -1
  823. data/spec/support/models/browser.rb +1 -1
  824. data/spec/support/models/building.rb +3 -1
  825. data/spec/support/models/building_address.rb +1 -1
  826. data/spec/support/models/bus.rb +1 -1
  827. data/spec/support/models/business.rb +1 -1
  828. data/spec/support/models/callback_test.rb +1 -1
  829. data/spec/support/models/canvas.rb +1 -1
  830. data/spec/support/models/car.rb +1 -1
  831. data/spec/support/models/cat.rb +1 -1
  832. data/spec/support/models/catalog.rb +25 -0
  833. data/spec/support/models/category.rb +1 -1
  834. data/spec/support/models/child.rb +1 -1
  835. data/spec/support/models/child_doc.rb +4 -4
  836. data/spec/support/models/church.rb +1 -1
  837. data/spec/support/models/circle.rb +1 -1
  838. data/spec/support/models/circuit.rb +1 -1
  839. data/spec/support/models/circus.rb +4 -1
  840. data/spec/support/models/code.rb +3 -1
  841. data/spec/support/models/coding/pull_request.rb +1 -1
  842. data/spec/support/models/coding.rb +1 -1
  843. data/spec/support/models/comment.rb +1 -1
  844. data/spec/support/models/company.rb +1 -1
  845. data/spec/support/models/consumption_period.rb +1 -1
  846. data/spec/support/models/contextable_item.rb +1 -1
  847. data/spec/support/models/contractor.rb +1 -1
  848. data/spec/support/models/cookie.rb +1 -1
  849. data/spec/support/models/country_code.rb +3 -1
  850. data/spec/support/models/courier_job.rb +1 -1
  851. data/spec/support/models/cover.rb +11 -0
  852. data/spec/support/models/crate.rb +1 -1
  853. data/spec/support/models/customer.rb +1 -1
  854. data/spec/support/models/customer_address.rb +1 -1
  855. data/spec/support/models/deed.rb +1 -1
  856. data/spec/support/models/definition.rb +1 -1
  857. data/spec/support/models/delegating_patient.rb +1 -1
  858. data/spec/support/models/description.rb +1 -1
  859. data/spec/support/models/dictionary.rb +1 -1
  860. data/spec/support/models/division.rb +1 -1
  861. data/spec/support/models/doctor.rb +1 -1
  862. data/spec/support/models/dog.rb +1 -1
  863. data/spec/support/models/dokument.rb +1 -1
  864. data/spec/support/models/draft.rb +1 -1
  865. data/spec/support/models/dragon.rb +1 -1
  866. data/spec/support/models/driver.rb +1 -1
  867. data/spec/support/models/drug.rb +1 -1
  868. data/spec/support/models/dungeon.rb +1 -1
  869. data/spec/support/models/edit.rb +1 -1
  870. data/spec/support/models/email.rb +1 -1
  871. data/spec/support/models/employer.rb +1 -1
  872. data/spec/support/models/entry.rb +1 -1
  873. data/spec/support/models/eraser.rb +1 -1
  874. data/spec/support/models/even.rb +1 -1
  875. data/spec/support/models/event.rb +1 -1
  876. data/spec/support/models/exhibition.rb +1 -1
  877. data/spec/support/models/exhibitor.rb +1 -1
  878. data/spec/support/models/explosion.rb +1 -1
  879. data/spec/support/models/eye.rb +1 -1
  880. data/spec/support/models/eye_bowl.rb +1 -1
  881. data/spec/support/models/face.rb +1 -1
  882. data/spec/support/models/fanatic.rb +9 -0
  883. data/spec/support/models/favorite.rb +8 -2
  884. data/spec/support/models/filesystem.rb +1 -1
  885. data/spec/support/models/fire_hydrant.rb +1 -1
  886. data/spec/support/models/firefox.rb +1 -1
  887. data/spec/support/models/fish.rb +1 -1
  888. data/spec/support/models/folder.rb +1 -1
  889. data/spec/support/models/folder_item.rb +1 -1
  890. data/spec/support/models/fruits.rb +1 -1
  891. data/spec/support/models/game.rb +1 -1
  892. data/spec/support/models/ghost.rb +1 -1
  893. data/spec/support/models/guitar.rb +1 -1
  894. data/spec/support/models/hole.rb +13 -0
  895. data/spec/support/models/home.rb +1 -1
  896. data/spec/support/models/house.rb +1 -1
  897. data/spec/support/models/html_writer.rb +1 -1
  898. data/spec/support/models/id_key.rb +1 -1
  899. data/spec/support/models/idnodef.rb +1 -1
  900. data/spec/support/models/image.rb +1 -1
  901. data/spec/support/models/implant.rb +10 -1
  902. data/spec/support/models/instrument.rb +1 -1
  903. data/spec/support/models/item.rb +1 -1
  904. data/spec/support/models/jar.rb +1 -1
  905. data/spec/support/models/kaleidoscope.rb +1 -1
  906. data/spec/support/models/kangaroo.rb +1 -1
  907. data/spec/support/models/label.rb +5 -2
  908. data/spec/support/models/language.rb +1 -1
  909. data/spec/support/models/lat_lng.rb +1 -1
  910. data/spec/support/models/league.rb +1 -1
  911. data/spec/support/models/learner.rb +1 -1
  912. data/spec/support/models/line_item.rb +1 -1
  913. data/spec/support/models/location.rb +1 -1
  914. data/spec/support/models/login.rb +1 -1
  915. data/spec/support/models/manufacturer.rb +1 -1
  916. data/spec/support/models/meat.rb +1 -1
  917. data/spec/support/models/membership.rb +2 -1
  918. data/spec/support/models/message.rb +1 -1
  919. data/spec/support/models/minim.rb +1 -1
  920. data/spec/support/models/mixed_drink.rb +1 -1
  921. data/spec/support/models/mop.rb +10 -1
  922. data/spec/support/models/movie.rb +1 -1
  923. data/spec/support/models/my_hash.rb +1 -1
  924. data/spec/support/models/name.rb +11 -1
  925. data/spec/support/models/name_only.rb +1 -1
  926. data/spec/support/models/node.rb +1 -1
  927. data/spec/support/models/note.rb +1 -1
  928. data/spec/support/models/nut.rb +8 -0
  929. data/spec/support/models/odd.rb +1 -1
  930. data/spec/support/models/order.rb +3 -1
  931. data/spec/support/models/ordered_post.rb +2 -2
  932. data/spec/support/models/ordered_preference.rb +1 -1
  933. data/spec/support/models/oscar.rb +1 -1
  934. data/spec/support/models/other_owner_object.rb +1 -1
  935. data/spec/support/models/override.rb +1 -1
  936. data/spec/support/models/ownable.rb +1 -1
  937. data/spec/support/models/owner.rb +1 -1
  938. data/spec/support/models/pack.rb +1 -1
  939. data/spec/support/models/page.rb +1 -1
  940. data/spec/support/models/page_question.rb +1 -1
  941. data/spec/support/models/palette.rb +1 -1
  942. data/spec/support/models/parent.rb +1 -1
  943. data/spec/support/models/parent_doc.rb +1 -1
  944. data/spec/support/models/passport.rb +15 -1
  945. data/spec/support/models/patient.rb +1 -1
  946. data/spec/support/models/pdf_writer.rb +1 -1
  947. data/spec/support/models/pencil.rb +1 -1
  948. data/spec/support/models/person.rb +19 -1
  949. data/spec/support/models/pet.rb +1 -1
  950. data/spec/support/models/pet_owner.rb +1 -1
  951. data/spec/support/models/phone.rb +3 -2
  952. data/spec/support/models/piano.rb +1 -1
  953. data/spec/support/models/pizza.rb +1 -1
  954. data/spec/support/models/player.rb +3 -1
  955. data/spec/support/models/post.rb +1 -1
  956. data/spec/support/models/post_genre.rb +1 -1
  957. data/spec/support/models/powerup.rb +13 -1
  958. data/spec/support/models/preference.rb +1 -1
  959. data/spec/support/models/princess.rb +1 -1
  960. data/spec/support/models/product.rb +2 -1
  961. data/spec/support/models/profile.rb +1 -1
  962. data/spec/support/models/pronunciation.rb +1 -1
  963. data/spec/support/models/pub.rb +1 -1
  964. data/spec/support/models/publication/encyclopedia.rb +1 -1
  965. data/spec/support/models/publication/review.rb +1 -1
  966. data/spec/support/models/publication.rb +1 -1
  967. data/spec/support/models/purchase.rb +1 -1
  968. data/spec/support/models/purchased_item.rb +11 -0
  969. data/spec/support/models/purse.rb +9 -0
  970. data/spec/support/models/question.rb +1 -1
  971. data/spec/support/models/quiz.rb +1 -1
  972. data/spec/support/models/rating.rb +1 -1
  973. data/spec/support/models/record.rb +1 -1
  974. data/spec/support/models/registry.rb +2 -1
  975. data/spec/support/models/role.rb +1 -1
  976. data/spec/support/models/root_category.rb +1 -1
  977. data/spec/support/models/sandbox/app/models/app_models_message.rb +4 -0
  978. data/spec/support/models/sandbox/lib/models/lib_models_message.rb +4 -0
  979. data/spec/support/models/sandbox/sandbox_message.rb +4 -0
  980. data/spec/support/models/sandbox/sandbox_user.rb +4 -0
  981. data/spec/support/models/sandbox/subdir/sandbox_comment.rb +4 -0
  982. data/spec/support/models/sandwich.rb +1 -1
  983. data/spec/support/models/scheduler.rb +1 -1
  984. data/spec/support/models/school.rb +15 -0
  985. data/spec/support/models/scribe.rb +1 -1
  986. data/spec/support/models/sealer.rb +8 -0
  987. data/spec/support/models/seat.rb +1 -1
  988. data/spec/support/models/seo.rb +1 -1
  989. data/spec/support/models/series.rb +1 -1
  990. data/spec/support/models/server.rb +1 -1
  991. data/spec/support/models/service.rb +1 -1
  992. data/spec/support/models/shape.rb +1 -1
  993. data/spec/support/models/shelf.rb +1 -1
  994. data/spec/support/models/shield.rb +19 -0
  995. data/spec/support/models/shipment_address.rb +1 -1
  996. data/spec/support/models/shipping_container.rb +1 -1
  997. data/spec/support/models/shipping_pack.rb +1 -1
  998. data/spec/support/models/shirt.rb +12 -0
  999. data/spec/support/models/shop.rb +1 -1
  1000. data/spec/support/models/short_agent.rb +1 -1
  1001. data/spec/support/models/short_quiz.rb +1 -1
  1002. data/spec/support/models/simple.rb +1 -1
  1003. data/spec/support/models/slave.rb +1 -1
  1004. data/spec/support/models/song.rb +1 -1
  1005. data/spec/support/models/sound.rb +1 -1
  1006. data/spec/support/models/spacer.rb +8 -0
  1007. data/spec/support/models/square.rb +1 -1
  1008. data/spec/support/models/staff.rb +1 -1
  1009. data/spec/support/models/store_as_dup_test1.rb +1 -1
  1010. data/spec/support/models/store_as_dup_test2.rb +1 -1
  1011. data/spec/support/models/store_as_dup_test3.rb +1 -1
  1012. data/spec/support/models/store_as_dup_test4.rb +1 -1
  1013. data/spec/support/models/strategy.rb +1 -1
  1014. data/spec/support/models/student.rb +15 -0
  1015. data/spec/support/models/sub_item.rb +1 -1
  1016. data/spec/support/models/subscription.rb +1 -1
  1017. data/spec/support/models/survey.rb +1 -1
  1018. data/spec/support/models/symptom.rb +1 -1
  1019. data/spec/support/models/system_role.rb +1 -0
  1020. data/spec/support/models/tag.rb +1 -1
  1021. data/spec/support/models/target.rb +1 -1
  1022. data/spec/support/models/template.rb +1 -1
  1023. data/spec/support/models/thing.rb +1 -1
  1024. data/spec/support/models/threadlocker.rb +8 -0
  1025. data/spec/support/models/title.rb +1 -1
  1026. data/spec/support/models/tool.rb +1 -1
  1027. data/spec/support/models/topping.rb +1 -1
  1028. data/spec/support/models/toy.rb +1 -1
  1029. data/spec/support/models/track.rb +1 -1
  1030. data/spec/support/models/translation.rb +1 -1
  1031. data/spec/support/models/tree.rb +1 -1
  1032. data/spec/support/models/truck.rb +1 -1
  1033. data/spec/support/models/updatable.rb +1 -1
  1034. data/spec/support/models/user.rb +1 -1
  1035. data/spec/support/models/user_account.rb +1 -1
  1036. data/spec/support/models/validation_callback.rb +1 -1
  1037. data/spec/support/models/vehicle.rb +1 -1
  1038. data/spec/support/models/version.rb +1 -1
  1039. data/spec/support/models/vertex.rb +1 -1
  1040. data/spec/support/models/vet_visit.rb +1 -1
  1041. data/spec/support/models/video.rb +1 -1
  1042. data/spec/support/models/video_game.rb +1 -1
  1043. data/spec/support/models/washer.rb +8 -0
  1044. data/spec/support/models/weapon.rb +13 -1
  1045. data/spec/support/models/wiki_page.rb +1 -1
  1046. data/spec/support/models/word.rb +1 -1
  1047. data/spec/support/models/word_origin.rb +1 -1
  1048. data/spec/support/models/writer.rb +1 -1
  1049. data/spec/support/rails_mock.rb +32 -0
  1050. data/spec/support/schema_maps/schema_map_aws.json +17 -0
  1051. data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  1052. data/spec/support/schema_maps/schema_map_azure.json +17 -0
  1053. data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  1054. data/spec/support/schema_maps/schema_map_gcp.json +17 -0
  1055. data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  1056. data/spec/support/schema_maps/schema_map_kmip.json +17 -0
  1057. data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  1058. data/spec/support/schema_maps/schema_map_local.json +18 -0
  1059. data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
  1060. data/spec/support/shared/time.rb +3 -22
  1061. data/spec/support/sinatra_mock.rb +7 -0
  1062. data/spec/support/spec_config.rb +42 -7
  1063. data.tar.gz.sig +0 -0
  1064. metadata +883 -562
  1065. metadata.gz.sig +0 -0
  1066. data/lib/mongoid/association/referenced/eager.rb +0 -184
  1067. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +0 -128
  1068. data/lib/mongoid/contextual/geo_near.rb +0 -269
  1069. data/lib/mongoid/errors/eager_load.rb +0 -26
  1070. data/lib/mongoid/errors/invalid_session_use.rb +0 -26
  1071. data/lib/mongoid/errors/invalid_storage_parent.rb +0 -28
  1072. data/lib/mongoid/errors/invalid_value.rb +0 -18
  1073. data/lib/mongoid/query_cache.rb +0 -333
  1074. data/lib/support/ruby_version.rb +0 -29
  1075. data/spec/mongoid/contextual/geo_near_spec.rb +0 -472
  1076. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -61
  1077. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -61
  1078. data/spec/mongoid/extensions_spec.rb +0 -32
  1079. data/spec/mongoid/query_cache_middleware_spec.rb +0 -61
  1080. data/spec/mongoid/query_cache_spec.rb +0 -978
  1081. data/spec/support/cluster_config.rb +0 -158
  1082. data/spec/support/session_registry.rb +0 -50
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
- # encoding: utf-8
2
+ # rubocop:todo all
3
3
 
4
4
  require "spec_helper"
5
+ require_relative './selectable_shared_examples'
5
6
 
6
7
  class FieldWithSerializer
7
8
  def evolve(object)
@@ -19,43 +20,6 @@ describe Mongoid::Criteria::Queryable::Selectable do
19
20
  Mongoid::Query.new("id" => "_id")
20
21
  end
21
22
 
22
- shared_examples_for "returns a cloned query" do
23
-
24
- it "returns a cloned query" do
25
- expect(selection).to_not equal(query)
26
- end
27
- end
28
-
29
- shared_examples_for 'requires an argument' do
30
- context "when provided no argument" do
31
-
32
- let(:selection) do
33
- query.send(query_method)
34
- end
35
-
36
- it "raises ArgumentError" do
37
- expect do
38
- selection.selector
39
- end.to raise_error(ArgumentError)
40
- end
41
- end
42
- end
43
-
44
- shared_examples_for 'requires a non-nil argument' do
45
- context "when provided nil" do
46
-
47
- let(:selection) do
48
- query.send(query_method, nil)
49
- end
50
-
51
- it "raises CriteriaArgumentRequired" do
52
- expect do
53
- selection.selector
54
- end.to raise_error(Mongoid::Errors::CriteriaArgumentRequired, /#{query_method}/)
55
- end
56
- end
57
- end
58
-
59
23
  shared_examples_for 'supports merge strategies' do
60
24
 
61
25
  context 'when the field is not aliased' do
@@ -518,7 +482,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
518
482
 
519
483
  it "adds the $elemMatch expression" do
520
484
  expect(selection.selector).to eq({
521
- "users" => { "$elemMatch" => { name: "value" }}
485
+ "users" => { "$elemMatch" => { "name" => "value" }}
522
486
  })
523
487
  end
524
488
 
@@ -562,8 +526,8 @@ describe Mongoid::Criteria::Queryable::Selectable do
562
526
 
563
527
  it "adds the $elemMatch expression" do
564
528
  expect(selection.selector).to eq({
565
- "users" => { "$elemMatch" => { name: "value" }},
566
- "comments" => { "$elemMatch" => { text: "value" }}
529
+ "users" => { "$elemMatch" => { "name" => "value" }},
530
+ "comments" => { "$elemMatch" => { "text" => "value" }}
567
531
  })
568
532
  end
569
533
 
@@ -585,8 +549,8 @@ describe Mongoid::Criteria::Queryable::Selectable do
585
549
 
586
550
  it "adds the $elemMatch expression" do
587
551
  expect(selection.selector).to eq({
588
- "users" => { "$elemMatch" => { name: "value" }},
589
- "comments" => { "$elemMatch" => { text: "value" }}
552
+ "users" => { "$elemMatch" => { "name" => "value" }},
553
+ "comments" => { "$elemMatch" => { "text" => "value" }}
590
554
  })
591
555
  end
592
556
 
@@ -603,9 +567,10 @@ describe Mongoid::Criteria::Queryable::Selectable do
603
567
  elem_match(users: { state: "new" })
604
568
  end
605
569
 
606
- it "overrides the $elemMatch expression" do
570
+ it "adds an $elemMatch expression" do
607
571
  expect(selection.selector).to eq({
608
- "users" => { "$elemMatch" => { state: "new" }}
572
+ "users" => { "$elemMatch" => { "name" => "value" } },
573
+ "$and" => [ { "users" => { "$elemMatch" => { "state" => "new" } } } ],
609
574
  })
610
575
  end
611
576
 
@@ -732,127 +697,119 @@ describe Mongoid::Criteria::Queryable::Selectable do
732
697
  end
733
698
  end
734
699
 
735
- %i(geo_spatial geo_spacial).each do |meth|
736
- describe "#geo_spacial" do
700
+ describe "#geo_spatial" do
737
701
 
738
- let(:query_method) { meth }
702
+ let(:query_method) { :geo_spatial }
739
703
 
740
- it_behaves_like 'requires an argument'
741
- it_behaves_like 'requires a non-nil argument'
704
+ it_behaves_like 'requires an argument'
705
+ it_behaves_like 'requires a non-nil argument'
742
706
 
743
- context "when provided a criterion" do
707
+ context "when provided a criterion" do
744
708
 
745
- context "when the geometry is a point intersection" do
709
+ context "when the geometry is a point intersection" do
746
710
 
747
- let(:selection) do
748
- query.public_send(query_method, :location.intersects_point => [ 1, 10 ])
749
- end
711
+ let(:selection) do
712
+ query.geo_spatial(:location.intersects_point => [ 1, 10 ])
713
+ end
750
714
 
751
- it "adds the $geoIntersects expression" do
752
- expect(selection.selector).to eq({
753
- "location" => {
754
- "$geoIntersects" => {
755
- "$geometry" => {
756
- "type" => "Point",
757
- "coordinates" => [ 1, 10 ]
758
- }
715
+ it "adds the $geoIntersects expression" do
716
+ expect(selection.selector).to eq({
717
+ "location" => {
718
+ "$geoIntersects" => {
719
+ "$geometry" => {
720
+ "type" => "Point",
721
+ "coordinates" => [ 1, 10 ]
759
722
  }
760
723
  }
761
- })
762
- end
763
-
764
- it_behaves_like "returns a cloned query"
724
+ }
725
+ })
765
726
  end
766
727
 
767
- context "when the geometry is a line intersection" do
728
+ it_behaves_like "returns a cloned query"
729
+ end
768
730
 
769
- let(:selection) do
770
- query.public_send(query_method, :location.intersects_line => [[ 1, 10 ], [ 2, 10 ]])
771
- end
731
+ context "when the geometry is a line intersection" do
772
732
 
773
- it "adds the $geoIntersects expression" do
774
- expect(selection.selector).to eq({
775
- "location" => {
776
- "$geoIntersects" => {
777
- "$geometry" => {
778
- "type" => "LineString",
779
- "coordinates" => [[ 1, 10 ], [ 2, 10 ]]
780
- }
733
+ let(:selection) do
734
+ query.geo_spatial(:location.intersects_line => [[ 1, 10 ], [ 2, 10 ]])
735
+ end
736
+
737
+ it "adds the $geoIntersects expression" do
738
+ expect(selection.selector).to eq({
739
+ "location" => {
740
+ "$geoIntersects" => {
741
+ "$geometry" => {
742
+ "type" => "LineString",
743
+ "coordinates" => [[ 1, 10 ], [ 2, 10 ]]
781
744
  }
782
745
  }
783
- })
784
- end
785
-
786
- it_behaves_like "returns a cloned query"
746
+ }
747
+ })
787
748
  end
788
749
 
789
- context "when the geometry is a polygon intersection" do
750
+ it_behaves_like "returns a cloned query"
751
+ end
790
752
 
791
- let(:selection) do
792
- query.public_send(query_method,
793
- :location.intersects_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
794
- )
795
- end
753
+ context "when the geometry is a polygon intersection" do
796
754
 
797
- it "adds the $geoIntersects expression" do
798
- expect(selection.selector).to eq({
799
- "location" => {
800
- "$geoIntersects" => {
801
- "$geometry" => {
802
- "type" => "Polygon",
803
- "coordinates" => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
804
- }
755
+ let(:selection) do
756
+ query.geo_spatial(:location.intersects_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]])
757
+ end
758
+
759
+ it "adds the $geoIntersects expression" do
760
+ expect(selection.selector).to eq({
761
+ "location" => {
762
+ "$geoIntersects" => {
763
+ "$geometry" => {
764
+ "type" => "Polygon",
765
+ "coordinates" => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
805
766
  }
806
767
  }
807
- })
808
- end
768
+ }
769
+ })
770
+ end
809
771
 
810
- it_behaves_like "returns a cloned query"
772
+ it_behaves_like "returns a cloned query"
773
+ end
774
+
775
+ context "when the geometry is within a polygon" do
776
+
777
+ let(:selection) do
778
+ query.geo_spatial(:location.within_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]])
811
779
  end
812
780
 
813
- context "when the geometry is within a polygon" do
781
+ it "adds the $geoIntersects expression" do
782
+ expect(selection.selector).to eq({
783
+ "location" => {
784
+ "$geoWithin" => {
785
+ "$geometry" => {
786
+ "type" => "Polygon",
787
+ "coordinates" => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
788
+ }
789
+ }
790
+ }
791
+ })
792
+ end
814
793
 
794
+ context "when used with the $box operator ($geoWithin query) " do
815
795
  let(:selection) do
816
- query.public_send(query_method,
817
- :location.within_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
818
- )
796
+ query.geo_spatial(:location.within_box => [[ 1, 10 ], [ 2, 10 ]])
819
797
  end
820
798
 
821
799
  it "adds the $geoIntersects expression" do
822
800
  expect(selection.selector).to eq({
823
801
  "location" => {
824
802
  "$geoWithin" => {
825
- "$geometry" => {
826
- "type" => "Polygon",
827
- "coordinates" => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
828
- }
803
+ "$box" => [
804
+ [ 1, 10 ], [ 2, 10 ]
805
+ ]
829
806
  }
830
807
  }
831
808
  })
832
809
  end
833
-
834
- context "when used with the $box operator ($geoWithin query) " do
835
- let(:selection) do
836
- query.public_send(query_method,
837
- :location.within_box => [[ 1, 10 ], [ 2, 10 ]]
838
- )
839
- end
840
-
841
- it "adds the $geoIntersects expression" do
842
- expect(selection.selector).to eq({
843
- "location" => {
844
- "$geoWithin" => {
845
- "$box" => [
846
- [ 1, 10 ], [ 2, 10 ]
847
- ]
848
- }
849
- }
850
- })
851
- end
852
- end
853
-
854
- it_behaves_like "returns a cloned query"
855
810
  end
811
+
812
+ it_behaves_like "returns a cloned query"
856
813
  end
857
814
  end
858
815
  end
@@ -928,10 +885,11 @@ describe Mongoid::Criteria::Queryable::Selectable do
928
885
  query.gt(first: 10).gt(first: 15)
929
886
  end
930
887
 
931
- it "overwrites the first $gt selector" do
888
+ it "adds a second $gt selector" do
932
889
  expect(selection.selector).to eq({
933
- "first" => { "$gt" => 15 }
934
- })
890
+ "first" => { "$gt" => 10 },
891
+ "$and" => [{ "first" => { "$gt" => 15 } }]
892
+ })
935
893
  end
936
894
 
937
895
  it "returns a cloned query" do
@@ -1012,9 +970,10 @@ describe Mongoid::Criteria::Queryable::Selectable do
1012
970
  query.gte(first: 10).gte(first: 15)
1013
971
  end
1014
972
 
1015
- it "overwrites the first $gte selector" do
973
+ it "adds a second $gte selector" do
1016
974
  expect(selection.selector).to eq({
1017
- "first" => { "$gte" => 15 }
975
+ "first" => { "$gte" => 10 },
976
+ "$and" => [ { "first" => { "$gte" => 15 } } ]
1018
977
  })
1019
978
  end
1020
979
 
@@ -1189,9 +1148,10 @@ describe Mongoid::Criteria::Queryable::Selectable do
1189
1148
  query.lt(first: 10).lt(first: 15)
1190
1149
  end
1191
1150
 
1192
- it "overwrites the first $lt selector" do
1151
+ it "adds a second $lt selector" do
1193
1152
  expect(selection.selector).to eq({
1194
- "first" => { "$lt" => 15 }
1153
+ "first" => { "$lt" => 10 },
1154
+ "$and" => [ { "first" => { "$lt" => 15 } } ]
1195
1155
  })
1196
1156
  end
1197
1157
 
@@ -1273,9 +1233,10 @@ describe Mongoid::Criteria::Queryable::Selectable do
1273
1233
  query.lte(first: 10).lte(first: 15)
1274
1234
  end
1275
1235
 
1276
- it "overwrites the first $lte selector" do
1236
+ it "adds a second $lte selector" do
1277
1237
  expect(selection.selector).to eq({
1278
- "first" => { "$lte" => 15 }
1238
+ "first" => { "$lte" => 10 },
1239
+ "$and" => [ { "first" => { "$lte" => 15 } } ]
1279
1240
  })
1280
1241
  end
1281
1242
 
@@ -1964,7 +1925,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
1964
1925
  end
1965
1926
 
1966
1927
  # MongoDB server can only handle one text expression at a time,
1967
- # per https://docs.mongodb.com/manual/reference/operator/query/text/.
1928
+ # per https://www.mongodb.com/docs/manual/reference/operator/query/text/.
1968
1929
  # Nonetheless we test that the query is built correctly when
1969
1930
  # a user supplies more than one text condition.
1970
1931
  it 'merges conditions' do
@@ -1978,534 +1939,6 @@ describe Mongoid::Criteria::Queryable::Selectable do
1978
1939
  end
1979
1940
  end
1980
1941
 
1981
- describe "#where" do
1982
-
1983
- let(:query_method) { :where }
1984
-
1985
- context "when provided no criterion" do
1986
-
1987
- let(:selection) do
1988
- query.where
1989
- end
1990
-
1991
- it "does not add any criterion" do
1992
- expect(selection.selector).to eq({})
1993
- end
1994
-
1995
- it "returns the query" do
1996
- expect(selection).to eq(query)
1997
- end
1998
-
1999
- it "returns a cloned query" do
2000
- expect(selection).to_not equal(query)
2001
- end
2002
- end
2003
-
2004
- it_behaves_like 'requires a non-nil argument'
2005
-
2006
- context "when provided a string" do
2007
-
2008
- let(:selection) do
2009
- query.where("this.value = 10")
2010
- end
2011
-
2012
- it "adds the $where criterion" do
2013
- expect(selection.selector).to eq({ "$where" => "this.value = 10" })
2014
- end
2015
-
2016
- it "returns a cloned query" do
2017
- expect(selection).to_not equal(query)
2018
- end
2019
-
2020
- context 'when multiple calls with string argument are made' do
2021
-
2022
- let(:selection) do
2023
- query.where("this.value = 10").where('foo.bar')
2024
- end
2025
-
2026
- it 'combines conditions' do
2027
- expect(selection.selector).to eq(
2028
- "$where" => "this.value = 10", '$and' => [{'$where' => 'foo.bar'}],
2029
- )
2030
- end
2031
- end
2032
-
2033
- context 'when called with string argument and with hash argument' do
2034
-
2035
- let(:selection) do
2036
- query.where("this.value = 10").where(foo: 'bar')
2037
- end
2038
-
2039
- it 'combines conditions' do
2040
- expect(selection.selector).to eq(
2041
- "$where" => "this.value = 10", 'foo' => 'bar',
2042
- )
2043
- end
2044
- end
2045
-
2046
- context 'when called with hash argument and with string argument' do
2047
-
2048
- let(:selection) do
2049
- query.where(foo: 'bar').where("this.value = 10")
2050
- end
2051
-
2052
- it 'combines conditions' do
2053
- expect(selection.selector).to eq(
2054
- 'foo' => 'bar', "$where" => "this.value = 10",
2055
- )
2056
- end
2057
- end
2058
- end
2059
-
2060
- context "when provided a single criterion" do
2061
-
2062
- context "when the value needs no evolution" do
2063
-
2064
- let(:selection) do
2065
- query.where(name: "Syd")
2066
- end
2067
-
2068
- it "adds the criterion to the selection" do
2069
- expect(selection.selector).to eq({ "name" => "Syd" })
2070
- end
2071
- end
2072
-
2073
- context "when the value must be evolved" do
2074
-
2075
- before(:all) do
2076
- class Document
2077
- def id
2078
- 13
2079
- end
2080
- def self.evolve(object)
2081
- object.id
2082
- end
2083
- end
2084
- end
2085
-
2086
- after(:all) do
2087
- Object.send(:remove_const, :Document)
2088
- end
2089
-
2090
- context "when the key needs evolution" do
2091
-
2092
- let(:query) do
2093
- Mongoid::Query.new({ "user" => "user_id" })
2094
- end
2095
-
2096
- let(:document) do
2097
- Document.new
2098
- end
2099
-
2100
- let(:selection) do
2101
- query.where(user: document)
2102
- end
2103
-
2104
- it "alters the key and value" do
2105
- expect(selection.selector).to eq({ "user_id" => document.id })
2106
- end
2107
- end
2108
-
2109
- context 'when the field is a String and the value is a BSON::Regexp::Raw' do
2110
-
2111
- let(:raw_regexp) do
2112
- BSON::Regexp::Raw.new('^Em')
2113
- end
2114
-
2115
- let(:selection) do
2116
- Login.where(_id: raw_regexp)
2117
- end
2118
-
2119
- it 'does not convert the bson raw regexp object to a String' do
2120
- expect(selection.selector).to eq({ "_id" => raw_regexp })
2121
- end
2122
- end
2123
- end
2124
- end
2125
-
2126
- context "when provided complex criterion" do
2127
-
2128
- context "when performing an $all" do
2129
-
2130
- context "when performing a single query" do
2131
-
2132
- let(:selection) do
2133
- query.where(:field.all => [ 1, 2 ])
2134
- end
2135
-
2136
- it "adds the $all criterion" do
2137
- expect(selection.selector).to eq({ "field" => { "$all" => [ 1, 2 ] }})
2138
- end
2139
-
2140
- it "returns a cloned query" do
2141
- expect(selection).to_not eq(query)
2142
- end
2143
- end
2144
- end
2145
-
2146
- context "when performing an $elemMatch" do
2147
-
2148
- context "when the value is not complex" do
2149
-
2150
- let(:selection) do
2151
- query.where(:field.elem_match => { key: 1 })
2152
- end
2153
-
2154
- it "adds the $elemMatch criterion" do
2155
- expect(selection.selector).to eq(
2156
- { "field" => { "$elemMatch" => { key: 1 } }}
2157
- )
2158
- end
2159
-
2160
- it "returns a cloned query" do
2161
- expect(selection).to_not eq(query)
2162
- end
2163
- end
2164
-
2165
- context "when the value is complex" do
2166
-
2167
- let(:selection) do
2168
- query.where(:field.elem_match => { :key.gt => 1 })
2169
- end
2170
-
2171
- it "adds the $elemMatch criterion" do
2172
- expect(selection.selector).to eq(
2173
- { "field" => { "$elemMatch" => { "key" => { "$gt" => 1 }}}}
2174
- )
2175
- end
2176
-
2177
- it "returns a cloned query" do
2178
- expect(selection).to_not eq(query)
2179
- end
2180
- end
2181
- end
2182
-
2183
- context "when performing an $exists" do
2184
-
2185
- context "when providing boolean values" do
2186
-
2187
- let(:selection) do
2188
- query.where(:field.exists => true)
2189
- end
2190
-
2191
- it "adds the $exists criterion" do
2192
- expect(selection.selector).to eq(
2193
- { "field" => { "$exists" => true }}
2194
- )
2195
- end
2196
-
2197
- it "returns a cloned query" do
2198
- expect(selection).to_not eq(query)
2199
- end
2200
- end
2201
-
2202
- context "when providing string values" do
2203
-
2204
- let(:selection) do
2205
- query.where(:field.exists => "t")
2206
- end
2207
-
2208
- it "adds the $exists criterion" do
2209
- expect(selection.selector).to eq(
2210
- { "field" => { "$exists" => true }}
2211
- )
2212
- end
2213
-
2214
- it "returns a cloned query" do
2215
- expect(selection).to_not eq(query)
2216
- end
2217
- end
2218
- end
2219
-
2220
- context "when performing a $gt" do
2221
-
2222
- let(:selection) do
2223
- query.where(:field.gt => 10)
2224
- end
2225
-
2226
- it "adds the $gt criterion" do
2227
- expect(selection.selector).to eq(
2228
- { "field" => { "$gt" => 10 }}
2229
- )
2230
- end
2231
-
2232
- it "returns a cloned query" do
2233
- expect(selection).to_not eq(query)
2234
- end
2235
- end
2236
-
2237
- context "when performing a $gte" do
2238
-
2239
- let(:selection) do
2240
- query.where(:field.gte => 10)
2241
- end
2242
-
2243
- it "adds the $gte criterion" do
2244
- expect(selection.selector).to eq(
2245
- { "field" => { "$gte" => 10 }}
2246
- )
2247
- end
2248
-
2249
- it "returns a cloned query" do
2250
- expect(selection).to_not eq(query)
2251
- end
2252
- end
2253
-
2254
- context "when performing an $in" do
2255
-
2256
- let(:selection) do
2257
- query.where(:field.in => [ 1, 2 ])
2258
- end
2259
-
2260
- it "adds the $in criterion" do
2261
- expect(selection.selector).to eq({ "field" => { "$in" => [ 1, 2 ] }})
2262
- end
2263
-
2264
- it "returns a cloned query" do
2265
- expect(selection).to_not eq(query)
2266
- end
2267
- end
2268
-
2269
- context "when performing a $lt" do
2270
-
2271
- let(:selection) do
2272
- query.where(:field.lt => 10)
2273
- end
2274
-
2275
- it "adds the $lt criterion" do
2276
- expect(selection.selector).to eq(
2277
- { "field" => { "$lt" => 10 }}
2278
- )
2279
- end
2280
-
2281
- it "returns a cloned query" do
2282
- expect(selection).to_not eq(query)
2283
- end
2284
- end
2285
-
2286
- context "when performing a $lte" do
2287
-
2288
- let(:selection) do
2289
- query.where(:field.lte => 10)
2290
- end
2291
-
2292
- it "adds the $lte criterion" do
2293
- expect(selection.selector).to eq(
2294
- { "field" => { "$lte" => 10 }}
2295
- )
2296
- end
2297
-
2298
- it "returns a cloned query" do
2299
- expect(selection).to_not eq(query)
2300
- end
2301
- end
2302
-
2303
- context "when performing a $mod" do
2304
-
2305
- let(:selection) do
2306
- query.where(:field.mod => [ 10, 1 ])
2307
- end
2308
-
2309
- it "adds the $lte criterion" do
2310
- expect(selection.selector).to eq(
2311
- { "field" => { "$mod" => [ 10, 1 ]}}
2312
- )
2313
- end
2314
-
2315
- it "returns a cloned query" do
2316
- expect(selection).to_not eq(query)
2317
- end
2318
- end
2319
-
2320
- context "when performing a $ne" do
2321
-
2322
- let(:selection) do
2323
- query.where(:field.ne => 10)
2324
- end
2325
-
2326
- it "adds the $ne criterion" do
2327
- expect(selection.selector).to eq(
2328
- { "field" => { "$ne" => 10 }}
2329
- )
2330
- end
2331
-
2332
- it "returns a cloned query" do
2333
- expect(selection).to_not eq(query)
2334
- end
2335
- end
2336
-
2337
- context "when performing a $near" do
2338
-
2339
- let(:selection) do
2340
- query.where(:field.near => [ 1, 1 ])
2341
- end
2342
-
2343
- it "adds the $near criterion" do
2344
- expect(selection.selector).to eq(
2345
- { "field" => { "$near" => [ 1, 1 ] }}
2346
- )
2347
- end
2348
-
2349
- it "returns a cloned query" do
2350
- expect(selection).to_not eq(query)
2351
- end
2352
- end
2353
-
2354
- context "when performing a $nearSphere" do
2355
-
2356
- let(:selection) do
2357
- query.where(:field.near_sphere => [ 1, 1 ])
2358
- end
2359
-
2360
- it "adds the $nearSphere criterion" do
2361
- expect(selection.selector).to eq(
2362
- { "field" => { "$nearSphere" => [ 1, 1 ] }}
2363
- )
2364
- end
2365
-
2366
- it "returns a cloned query" do
2367
- expect(selection).to_not eq(query)
2368
- end
2369
- end
2370
-
2371
- context "when performing a $nin" do
2372
-
2373
- let(:selection) do
2374
- query.where(:field.nin => [ 1, 2 ])
2375
- end
2376
-
2377
- it "adds the $nin criterion" do
2378
- expect(selection.selector).to eq({ "field" => { "$nin" => [ 1, 2 ] }})
2379
- end
2380
-
2381
- it "returns a cloned query" do
2382
- expect(selection).to_not eq(query)
2383
- end
2384
- end
2385
-
2386
- context "when performing a $not" do
2387
-
2388
- let(:selection) do
2389
- query.where(:field.not => /test/)
2390
- end
2391
-
2392
- it "adds the $not criterion" do
2393
- expect(selection.selector).to eq({ "field" => { "$not" => /test/ }})
2394
- end
2395
-
2396
- it "returns a cloned query" do
2397
- expect(selection).to_not eq(query)
2398
- end
2399
- end
2400
-
2401
- context "when performing a $size" do
2402
-
2403
- context "when providing an integer" do
2404
-
2405
- let(:selection) do
2406
- query.where(:field.with_size => 10)
2407
- end
2408
-
2409
- it "adds the $size criterion" do
2410
- expect(selection.selector).to eq(
2411
- { "field" => { "$size" => 10 }}
2412
- )
2413
- end
2414
-
2415
- it "returns a cloned query" do
2416
- expect(selection).to_not eq(query)
2417
- end
2418
- end
2419
-
2420
- context "when providing a string" do
2421
-
2422
- let(:selection) do
2423
- query.where(:field.with_size => "10")
2424
- end
2425
-
2426
- it "adds the $size criterion" do
2427
- expect(selection.selector).to eq(
2428
- { "field" => { "$size" => 10 }}
2429
- )
2430
- end
2431
-
2432
- it "returns a cloned query" do
2433
- expect(selection).to_not eq(query)
2434
- end
2435
- end
2436
- end
2437
-
2438
- context "when performing a $type" do
2439
-
2440
- let(:selection) do
2441
- query.where(:field.with_type => 10)
2442
- end
2443
-
2444
- it "adds the $type criterion" do
2445
- expect(selection.selector).to eq(
2446
- { "field" => { "$type" => 10 }}
2447
- )
2448
- end
2449
-
2450
- it "returns a cloned query" do
2451
- expect(selection).to_not eq(query)
2452
- end
2453
- end
2454
- end
2455
-
2456
- context 'when using an MQL logical operator manually' do
2457
- let(:base_query) do
2458
- query.where(test: 1)
2459
- end
2460
-
2461
- let(:selection) do
2462
- base_query.where(mql_operator => ['hello' => 'world'])
2463
- end
2464
-
2465
- shared_examples_for 'adds conditions to existing query' do
2466
- it 'adds conditions to existing query' do
2467
- selection.selector.should == {
2468
- 'test' => 1,
2469
- mql_operator => ['hello' => 'world'],
2470
- }
2471
- end
2472
- end
2473
-
2474
- shared_examples_for 'adds conditions to existing query with an extra $and' do
2475
- it 'adds conditions to existing query' do
2476
- selection.selector.should == {
2477
- 'test' => 1,
2478
- mql_operator => ['hello' => 'world'],
2479
- }
2480
- end
2481
- end
2482
-
2483
- context '$or' do
2484
- let(:mql_operator) { '$or' }
2485
-
2486
- it_behaves_like 'adds conditions to existing query with an extra $and'
2487
- end
2488
-
2489
- context '$nor' do
2490
- let(:mql_operator) { '$nor' }
2491
-
2492
- it_behaves_like 'adds conditions to existing query with an extra $and'
2493
- end
2494
-
2495
- context '$not' do
2496
- let(:mql_operator) { '$not' }
2497
-
2498
- it_behaves_like 'adds conditions to existing query'
2499
- end
2500
-
2501
- context '$and' do
2502
- let(:mql_operator) { '$and' }
2503
-
2504
- it_behaves_like 'adds conditions to existing query'
2505
- end
2506
- end
2507
- end
2508
-
2509
1942
  describe Symbol do
2510
1943
 
2511
1944
  describe "#all" do
@@ -2514,7 +1947,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
2514
1947
  :field.all
2515
1948
  end
2516
1949
 
2517
- it "returns a selecton key" do
1950
+ it "returns a selection key" do
2518
1951
  expect(key).to be_a(Mongoid::Criteria::Queryable::Key)
2519
1952
  end
2520
1953
 
@@ -2533,7 +1966,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
2533
1966
  :field.elem_match
2534
1967
  end
2535
1968
 
2536
- it "returns a selecton key" do
1969
+ it "returns a selection key" do
2537
1970
  expect(key).to be_a(Mongoid::Criteria::Queryable::Key)
2538
1971
  end
2539
1972
 
@@ -2552,7 +1985,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
2552
1985
  :field.exists
2553
1986
  end
2554
1987
 
2555
- it "returns a selecton key" do
1988
+ it "returns a selection key" do
2556
1989
  expect(key).to be_a(Mongoid::Criteria::Queryable::Key)
2557
1990
  end
2558
1991
 
@@ -2571,7 +2004,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
2571
2004
  :field.gt
2572
2005
  end
2573
2006
 
2574
- it "returns a selecton key" do
2007
+ it "returns a selection key" do
2575
2008
  expect(key).to be_a(Mongoid::Criteria::Queryable::Key)
2576
2009
  end
2577
2010
 
@@ -2590,7 +2023,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
2590
2023
  :field.gte
2591
2024
  end
2592
2025
 
2593
- it "returns a selecton key" do
2026
+ it "returns a selection key" do
2594
2027
  expect(key).to be_a(Mongoid::Criteria::Queryable::Key)
2595
2028
  end
2596
2029
 
@@ -2609,7 +2042,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
2609
2042
  :field.in
2610
2043
  end
2611
2044
 
2612
- it "returns a selecton key" do
2045
+ it "returns a selection key" do
2613
2046
  expect(key).to be_a(Mongoid::Criteria::Queryable::Key)
2614
2047
  end
2615
2048
 
@@ -2628,7 +2061,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
2628
2061
  :field.lt
2629
2062
  end
2630
2063
 
2631
- it "returns a selecton key" do
2064
+ it "returns a selection key" do
2632
2065
  expect(key).to be_a(Mongoid::Criteria::Queryable::Key)
2633
2066
  end
2634
2067
 
@@ -2647,7 +2080,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
2647
2080
  :field.lte
2648
2081
  end
2649
2082
 
2650
- it "returns a selecton key" do
2083
+ it "returns a selection key" do
2651
2084
  expect(key).to be_a(Mongoid::Criteria::Queryable::Key)
2652
2085
  end
2653
2086
 
@@ -2666,7 +2099,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
2666
2099
  :field.mod
2667
2100
  end
2668
2101
 
2669
- it "returns a selecton key" do
2102
+ it "returns a selection key" do
2670
2103
  expect(key).to be_a(Mongoid::Criteria::Queryable::Key)
2671
2104
  end
2672
2105
 
@@ -2685,7 +2118,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
2685
2118
  :field.ne
2686
2119
  end
2687
2120
 
2688
- it "returns a selecton key" do
2121
+ it "returns a selection key" do
2689
2122
  expect(key).to be_a(Mongoid::Criteria::Queryable::Key)
2690
2123
  end
2691
2124
 
@@ -2704,7 +2137,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
2704
2137
  :field.near
2705
2138
  end
2706
2139
 
2707
- it "returns a selecton key" do
2140
+ it "returns a selection key" do
2708
2141
  expect(key).to be_a(Mongoid::Criteria::Queryable::Key)
2709
2142
  end
2710
2143
 
@@ -2723,7 +2156,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
2723
2156
  :field.near_sphere
2724
2157
  end
2725
2158
 
2726
- it "returns a selecton key" do
2159
+ it "returns a selection key" do
2727
2160
  expect(key).to be_a(Mongoid::Criteria::Queryable::Key)
2728
2161
  end
2729
2162
 
@@ -2742,7 +2175,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
2742
2175
  :field.nin
2743
2176
  end
2744
2177
 
2745
- it "returns a selecton key" do
2178
+ it "returns a selection key" do
2746
2179
  expect(key).to be_a(Mongoid::Criteria::Queryable::Key)
2747
2180
  end
2748
2181
 
@@ -2781,7 +2214,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
2781
2214
  :field.with_size
2782
2215
  end
2783
2216
 
2784
- it "returns a selecton key" do
2217
+ it "returns a selection key" do
2785
2218
  expect(key).to be_a(Mongoid::Criteria::Queryable::Key)
2786
2219
  end
2787
2220
 
@@ -2800,7 +2233,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
2800
2233
  :field.with_type
2801
2234
  end
2802
2235
 
2803
- it "returns a selecton key" do
2236
+ it "returns a selection key" do
2804
2237
  expect(key).to be_a(Mongoid::Criteria::Queryable::Key)
2805
2238
  end
2806
2239
 
@@ -2859,4 +2292,37 @@ describe Mongoid::Criteria::Queryable::Selectable do
2859
2292
  end
2860
2293
  end
2861
2294
  end
2295
+
2296
+ describe "chained operators" do
2297
+ [ :eq, :elem_match, :gt, :gte, :lt, :lte, :mod, :ne, :near, :near_sphere ].each do |meth|
2298
+
2299
+ context "when chaining the #{meth} method when using the same field" do
2300
+ let(:op) do
2301
+ {
2302
+ eq: "$eq",
2303
+ elem_match: "$elemMatch",
2304
+ gt: "$gt",
2305
+ gte: "$gte",
2306
+ lt: "$lt",
2307
+ lte: "$lte",
2308
+ mod: "$mod",
2309
+ ne: "$ne",
2310
+ near: "$near",
2311
+ near_sphere: "$nearSphere"
2312
+ }[meth]
2313
+ end
2314
+
2315
+ let(:criteria) do
2316
+ Band.send(meth, {views: 1}).send(meth, {views:2})
2317
+ end
2318
+
2319
+ it "is and-ed with the previous operators" do
2320
+ expect(criteria.selector).to eq({
2321
+ "views" => { op => 1 },
2322
+ "$and" => [{ "views" => { op => 2 } }]
2323
+ })
2324
+ end
2325
+ end
2326
+ end
2327
+ end
2862
2328
  end