mongoid 7.5.4 → 8.1.7

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 (442) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +3 -3
  3. data/README.md +6 -6
  4. data/Rakefile +44 -46
  5. data/lib/config/locales/en.yml +92 -43
  6. data/lib/mongoid/association/accessors.rb +44 -11
  7. data/lib/mongoid/association/bindable.rb +50 -2
  8. data/lib/mongoid/association/builders.rb +5 -3
  9. data/lib/mongoid/association/constrainable.rb +0 -1
  10. data/lib/mongoid/association/eager_loadable.rb +29 -7
  11. data/lib/mongoid/association/embedded/batchable.rb +34 -11
  12. data/lib/mongoid/association/embedded/cyclic.rb +1 -1
  13. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  14. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -2
  15. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +4 -3
  16. data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
  17. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  18. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +4 -3
  19. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +85 -46
  20. data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
  21. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +19 -5
  22. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +24 -5
  23. data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
  24. data/lib/mongoid/association/macros.rb +8 -1
  25. data/lib/mongoid/association/many.rb +11 -7
  26. data/lib/mongoid/association/nested/many.rb +5 -4
  27. data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
  28. data/lib/mongoid/association/nested/one.rb +45 -7
  29. data/lib/mongoid/association/one.rb +2 -2
  30. data/lib/mongoid/association/options.rb +9 -9
  31. data/lib/mongoid/association/proxy.rb +15 -4
  32. data/lib/mongoid/association/referenced/auto_save.rb +4 -3
  33. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  34. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  35. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
  36. data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
  37. data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
  38. data/lib/mongoid/association/referenced/eager.rb +2 -2
  39. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +70 -13
  40. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
  41. data/lib/mongoid/association/referenced/has_many/enumerable.rb +22 -30
  42. data/lib/mongoid/association/referenced/has_many/proxy.rb +40 -21
  43. data/lib/mongoid/association/referenced/has_many.rb +3 -3
  44. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  45. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
  46. data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
  47. data/lib/mongoid/association/referenced/has_one.rb +3 -3
  48. data/lib/mongoid/association/referenced/syncable.rb +4 -4
  49. data/lib/mongoid/association/reflections.rb +4 -4
  50. data/lib/mongoid/association/relatable.rb +44 -10
  51. data/lib/mongoid/association.rb +5 -5
  52. data/lib/mongoid/atomic/modifiers.rb +2 -2
  53. data/lib/mongoid/atomic.rb +16 -7
  54. data/lib/mongoid/attributes/dynamic.rb +4 -4
  55. data/lib/mongoid/attributes/nested.rb +6 -6
  56. data/lib/mongoid/attributes/processing.rb +37 -6
  57. data/lib/mongoid/attributes/projector.rb +2 -2
  58. data/lib/mongoid/attributes/readonly.rb +3 -3
  59. data/lib/mongoid/attributes.rb +51 -42
  60. data/lib/mongoid/changeable.rb +147 -14
  61. data/lib/mongoid/clients/options.rb +5 -1
  62. data/lib/mongoid/clients/sessions.rb +2 -14
  63. data/lib/mongoid/clients/storage_options.rb +2 -5
  64. data/lib/mongoid/clients/validators/storage.rb +3 -15
  65. data/lib/mongoid/collection_configurable.rb +58 -0
  66. data/lib/mongoid/composable.rb +2 -0
  67. data/lib/mongoid/config/defaults.rb +60 -0
  68. data/lib/mongoid/config/options.rb +3 -0
  69. data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
  70. data/lib/mongoid/config/validators/client.rb +6 -6
  71. data/lib/mongoid/config/validators.rb +1 -0
  72. data/lib/mongoid/config.rb +153 -18
  73. data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
  74. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
  75. data/lib/mongoid/contextual/aggregable/none.rb +1 -1
  76. data/lib/mongoid/contextual/atomic.rb +1 -1
  77. data/lib/mongoid/contextual/geo_near.rb +7 -7
  78. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  79. data/lib/mongoid/contextual/memory.rb +285 -58
  80. data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
  81. data/lib/mongoid/contextual/mongo.rb +540 -346
  82. data/lib/mongoid/contextual/none.rb +193 -20
  83. data/lib/mongoid/contextual/queryable.rb +1 -1
  84. data/lib/mongoid/contextual.rb +14 -2
  85. data/lib/mongoid/copyable.rb +32 -8
  86. data/lib/mongoid/criteria/findable.rb +8 -5
  87. data/lib/mongoid/criteria/includable.rb +27 -22
  88. data/lib/mongoid/criteria/marshalable.rb +10 -2
  89. data/lib/mongoid/criteria/permission.rb +1 -1
  90. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
  91. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -16
  92. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  93. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
  94. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  95. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  96. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -17
  97. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +15 -9
  98. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  99. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  100. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  101. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
  102. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
  103. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
  104. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  105. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  106. data/lib/mongoid/criteria/queryable/key.rb +4 -4
  107. data/lib/mongoid/criteria/queryable/mergeable.rb +1 -1
  108. data/lib/mongoid/criteria/queryable/optional.rb +11 -17
  109. data/lib/mongoid/criteria/queryable/options.rb +2 -2
  110. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
  111. data/lib/mongoid/criteria/queryable/selectable.rb +47 -38
  112. data/lib/mongoid/criteria/queryable/selector.rb +92 -7
  113. data/lib/mongoid/criteria/queryable/smash.rb +40 -7
  114. data/lib/mongoid/criteria/queryable.rb +12 -7
  115. data/lib/mongoid/criteria/scopable.rb +2 -2
  116. data/lib/mongoid/criteria/translator.rb +45 -0
  117. data/lib/mongoid/criteria.rb +20 -40
  118. data/lib/mongoid/deprecable.rb +37 -0
  119. data/lib/mongoid/deprecation.rb +25 -0
  120. data/lib/mongoid/document.rb +127 -35
  121. data/lib/mongoid/equality.rb +8 -8
  122. data/lib/mongoid/errors/create_collection_failure.rb +33 -0
  123. data/lib/mongoid/errors/document_not_found.rb +10 -6
  124. data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
  125. data/lib/mongoid/errors/immutable_attribute.rb +26 -0
  126. data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
  127. data/lib/mongoid/errors/invalid_config_option.rb +1 -1
  128. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
  129. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  130. data/lib/mongoid/errors/invalid_field.rb +6 -2
  131. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  132. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
  133. data/lib/mongoid/errors/invalid_relation.rb +1 -1
  134. data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
  135. data/lib/mongoid/errors/invalid_session_use.rb +1 -1
  136. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  137. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
  138. data/lib/mongoid/errors/mongoid_error.rb +3 -3
  139. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
  140. data/lib/mongoid/errors/no_client_database.rb +1 -1
  141. data/lib/mongoid/errors/no_client_hosts.rb +1 -1
  142. data/lib/mongoid/errors/readonly_attribute.rb +1 -1
  143. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  144. data/lib/mongoid/errors/unknown_attribute.rb +1 -1
  145. data/lib/mongoid/errors.rb +6 -3
  146. data/lib/mongoid/extensions/array.rb +9 -7
  147. data/lib/mongoid/extensions/big_decimal.rb +33 -10
  148. data/lib/mongoid/extensions/binary.rb +42 -0
  149. data/lib/mongoid/extensions/boolean.rb +8 -2
  150. data/lib/mongoid/extensions/date.rb +26 -20
  151. data/lib/mongoid/extensions/date_time.rb +1 -1
  152. data/lib/mongoid/extensions/false_class.rb +1 -1
  153. data/lib/mongoid/extensions/float.rb +7 -4
  154. data/lib/mongoid/extensions/hash.rb +38 -9
  155. data/lib/mongoid/extensions/integer.rb +7 -4
  156. data/lib/mongoid/extensions/module.rb +1 -1
  157. data/lib/mongoid/extensions/object.rb +10 -8
  158. data/lib/mongoid/extensions/range.rb +41 -10
  159. data/lib/mongoid/extensions/regexp.rb +11 -4
  160. data/lib/mongoid/extensions/set.rb +11 -4
  161. data/lib/mongoid/extensions/string.rb +11 -22
  162. data/lib/mongoid/extensions/symbol.rb +4 -15
  163. data/lib/mongoid/extensions/time.rb +29 -16
  164. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  165. data/lib/mongoid/extensions/true_class.rb +1 -1
  166. data/lib/mongoid/extensions.rb +1 -0
  167. data/lib/mongoid/factory.rb +55 -7
  168. data/lib/mongoid/fields/foreign_key.rb +11 -4
  169. data/lib/mongoid/fields/localized.rb +19 -4
  170. data/lib/mongoid/fields/standard.rb +17 -7
  171. data/lib/mongoid/fields/validators/macro.rb +3 -9
  172. data/lib/mongoid/fields.rb +142 -28
  173. data/lib/mongoid/findable.rb +54 -24
  174. data/lib/mongoid/indexable/specification.rb +2 -2
  175. data/lib/mongoid/indexable/validators/options.rb +6 -2
  176. data/lib/mongoid/interceptable.rb +186 -16
  177. data/lib/mongoid/matchable.rb +1 -1
  178. data/lib/mongoid/matcher/eq_impl.rb +1 -1
  179. data/lib/mongoid/matcher/type.rb +1 -1
  180. data/lib/mongoid/matcher.rb +48 -14
  181. data/lib/mongoid/persistable/creatable.rb +19 -9
  182. data/lib/mongoid/persistable/deletable.rb +2 -2
  183. data/lib/mongoid/persistable/destroyable.rb +1 -1
  184. data/lib/mongoid/persistable/savable.rb +14 -2
  185. data/lib/mongoid/persistable/unsettable.rb +2 -2
  186. data/lib/mongoid/persistable/updatable.rb +69 -12
  187. data/lib/mongoid/persistable/upsertable.rb +21 -2
  188. data/lib/mongoid/persistable.rb +6 -3
  189. data/lib/mongoid/persistence_context.rb +6 -4
  190. data/lib/mongoid/query_cache.rb +13 -261
  191. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  192. data/lib/mongoid/railties/database.rake +7 -2
  193. data/lib/mongoid/reloadable.rb +10 -8
  194. data/lib/mongoid/scopable.rb +15 -13
  195. data/lib/mongoid/selectable.rb +1 -2
  196. data/lib/mongoid/serializable.rb +17 -13
  197. data/lib/mongoid/stateful.rb +57 -10
  198. data/lib/mongoid/tasks/database.rake +12 -0
  199. data/lib/mongoid/tasks/database.rb +20 -2
  200. data/lib/mongoid/threaded/lifecycle.rb +5 -5
  201. data/lib/mongoid/threaded.rb +42 -12
  202. data/lib/mongoid/timestamps/created.rb +1 -1
  203. data/lib/mongoid/timestamps/updated.rb +2 -2
  204. data/lib/mongoid/touchable.rb +3 -4
  205. data/lib/mongoid/traversable.rb +10 -5
  206. data/lib/mongoid/utils.rb +22 -0
  207. data/lib/mongoid/validatable/associated.rb +98 -17
  208. data/lib/mongoid/validatable/localizable.rb +1 -1
  209. data/lib/mongoid/validatable/macros.rb +5 -7
  210. data/lib/mongoid/validatable/presence.rb +2 -2
  211. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  212. data/lib/mongoid/validatable.rb +17 -6
  213. data/lib/mongoid/version.rb +1 -1
  214. data/lib/mongoid/warnings.rb +19 -4
  215. data/lib/mongoid.rb +17 -3
  216. data/spec/config/mongoid.yml +16 -0
  217. data/spec/integration/app_spec.rb +24 -19
  218. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  219. data/spec/integration/associations/embedded_spec.rb +15 -0
  220. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  221. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  222. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  223. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +61 -0
  224. data/spec/integration/associations/has_one_spec.rb +97 -1
  225. data/spec/integration/associations/scope_option_spec.rb +1 -1
  226. data/spec/integration/callbacks_models.rb +132 -1
  227. data/spec/integration/callbacks_spec.rb +381 -4
  228. data/spec/integration/criteria/range_spec.rb +95 -1
  229. data/spec/integration/discriminator_key_spec.rb +118 -80
  230. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  231. data/spec/integration/i18n_fallbacks_spec.rb +3 -32
  232. data/spec/integration/matcher_examples_spec.rb +20 -13
  233. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  234. data/spec/integration/matcher_operator_spec.rb +3 -5
  235. data/spec/integration/persistence/range_field_spec.rb +350 -0
  236. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  237. data/spec/mongoid/association/depending_spec.rb +9 -9
  238. data/spec/mongoid/association/eager_spec.rb +2 -1
  239. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  240. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  241. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +96 -9
  242. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  243. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +290 -65
  244. data/spec/mongoid/association/embedded/embeds_many_models.rb +37 -0
  245. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +16 -0
  246. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  247. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  248. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +15 -2
  249. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  250. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  251. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  252. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  253. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +19 -0
  254. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  255. data/spec/mongoid/association/referenced/belongs_to_spec.rb +4 -20
  256. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +186 -229
  257. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  258. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  259. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  260. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  261. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +215 -177
  262. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  263. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  264. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  265. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  266. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  267. data/spec/mongoid/association/syncable_spec.rb +15 -1
  268. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  269. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  270. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  271. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  272. data/spec/mongoid/attributes_spec.rb +526 -33
  273. data/spec/mongoid/changeable_spec.rb +429 -37
  274. data/spec/mongoid/clients/factory_spec.rb +23 -30
  275. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  276. data/spec/mongoid/clients_spec.rb +149 -15
  277. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  278. data/spec/mongoid/config/defaults_spec.rb +160 -0
  279. data/spec/mongoid/config_spec.rb +214 -31
  280. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  281. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  282. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  283. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  284. data/spec/mongoid/contextual/memory_spec.rb +850 -88
  285. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  286. data/spec/mongoid/contextual/mongo_spec.rb +2256 -1005
  287. data/spec/mongoid/contextual/none_spec.rb +60 -21
  288. data/spec/mongoid/copyable_spec.rb +453 -11
  289. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  290. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  291. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  292. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  293. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  294. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  295. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  296. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  297. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  298. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  299. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
  300. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  301. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  302. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  303. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  304. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
  305. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
  306. data/spec/mongoid/criteria/queryable/selectable_spec.rb +78 -86
  307. data/spec/mongoid/criteria/queryable/selector_spec.rb +15 -3
  308. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  309. data/spec/mongoid/criteria_projection_spec.rb +1 -5
  310. data/spec/mongoid/criteria_spec.rb +469 -1205
  311. data/spec/mongoid/document_fields_spec.rb +173 -24
  312. data/spec/mongoid/document_spec.rb +32 -41
  313. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  314. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  315. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  316. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  317. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  318. data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
  319. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  320. data/spec/mongoid/extensions/array_spec.rb +16 -2
  321. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  322. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  323. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  324. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  325. data/spec/mongoid/extensions/date_spec.rb +71 -1
  326. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  327. data/spec/mongoid/extensions/float_spec.rb +53 -74
  328. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  329. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  330. data/spec/mongoid/extensions/range_spec.rb +255 -54
  331. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  332. data/spec/mongoid/extensions/set_spec.rb +106 -0
  333. data/spec/mongoid/extensions/string_spec.rb +53 -25
  334. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  335. data/spec/mongoid/extensions/time_spec.rb +639 -106
  336. data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
  337. data/spec/mongoid/factory_spec.rb +61 -1
  338. data/spec/mongoid/fields/localized_spec.rb +80 -37
  339. data/spec/mongoid/fields_spec.rb +503 -87
  340. data/spec/mongoid/findable_spec.rb +450 -58
  341. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  342. data/spec/mongoid/indexable_spec.rb +55 -30
  343. data/spec/mongoid/interceptable_spec.rb +824 -22
  344. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  345. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  346. data/spec/mongoid/mongoizable_spec.rb +285 -0
  347. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  348. data/spec/mongoid/persistable/deletable_spec.rb +28 -8
  349. data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
  350. data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
  351. data/spec/mongoid/persistable/logical_spec.rb +37 -0
  352. data/spec/mongoid/persistable/poppable_spec.rb +36 -0
  353. data/spec/mongoid/persistable/pullable_spec.rb +72 -0
  354. data/spec/mongoid/persistable/pushable_spec.rb +72 -0
  355. data/spec/mongoid/persistable/renamable_spec.rb +36 -0
  356. data/spec/mongoid/persistable/savable_spec.rb +96 -0
  357. data/spec/mongoid/persistable/settable_spec.rb +37 -0
  358. data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
  359. data/spec/mongoid/persistable/updatable_spec.rb +20 -28
  360. data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
  361. data/spec/mongoid/persistence_context_spec.rb +31 -57
  362. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  363. data/spec/mongoid/query_cache_spec.rb +56 -215
  364. data/spec/mongoid/reloadable_spec.rb +83 -6
  365. data/spec/mongoid/scopable_spec.rb +91 -1
  366. data/spec/mongoid/serializable_spec.rb +25 -39
  367. data/spec/mongoid/shardable_spec.rb +4 -4
  368. data/spec/mongoid/stateful_spec.rb +150 -8
  369. data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
  370. data/spec/mongoid/tasks/database_spec.rb +127 -0
  371. data/spec/mongoid/timestamps_spec.rb +392 -4
  372. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  373. data/spec/mongoid/touchable_spec.rb +390 -2
  374. data/spec/mongoid/touchable_spec_models.rb +14 -8
  375. data/spec/mongoid/traversable_spec.rb +13 -35
  376. data/spec/mongoid/validatable/associated_spec.rb +27 -34
  377. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  378. data/spec/mongoid/validatable/uniqueness_spec.rb +58 -31
  379. data/spec/mongoid/warnings_spec.rb +35 -0
  380. data/spec/mongoid_spec.rb +34 -16
  381. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  382. data/spec/rails/mongoid_spec.rb +4 -16
  383. data/spec/spec_helper.rb +5 -0
  384. data/spec/support/constraints.rb +24 -0
  385. data/spec/support/immutable_ids.rb +118 -0
  386. data/spec/support/macros.rb +78 -0
  387. data/spec/support/models/artist.rb +0 -1
  388. data/spec/support/models/augmentation.rb +12 -0
  389. data/spec/support/models/band.rb +5 -0
  390. data/spec/support/models/book.rb +1 -0
  391. data/spec/support/models/building.rb +2 -0
  392. data/spec/support/models/catalog.rb +24 -0
  393. data/spec/support/models/circus.rb +3 -0
  394. data/spec/support/models/cover.rb +10 -0
  395. data/spec/support/models/fanatic.rb +8 -0
  396. data/spec/support/models/implant.rb +9 -0
  397. data/spec/support/models/label.rb +2 -0
  398. data/spec/support/models/lat_lng.rb +6 -0
  399. data/spec/support/models/name.rb +10 -0
  400. data/spec/support/models/passport.rb +9 -0
  401. data/spec/support/models/person.rb +2 -0
  402. data/spec/support/models/player.rb +2 -0
  403. data/spec/support/models/powerup.rb +12 -0
  404. data/spec/support/models/product.rb +1 -0
  405. data/spec/support/models/purse.rb +9 -0
  406. data/spec/support/models/registry.rb +1 -0
  407. data/spec/support/models/school.rb +14 -0
  408. data/spec/support/models/shield.rb +18 -0
  409. data/spec/support/models/student.rb +14 -0
  410. data/spec/support/models/weapon.rb +12 -0
  411. metadata +101 -96
  412. checksums.yaml.gz.sig +0 -0
  413. data/lib/mongoid/errors/eager_load.rb +0 -23
  414. data/lib/mongoid/errors/invalid_value.rb +0 -17
  415. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -60
  416. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -60
  417. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
  418. data/spec/shared/LICENSE +0 -20
  419. data/spec/shared/bin/get-mongodb-download-url +0 -17
  420. data/spec/shared/bin/s3-copy +0 -45
  421. data/spec/shared/bin/s3-upload +0 -69
  422. data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
  423. data/spec/shared/lib/mrss/cluster_config.rb +0 -231
  424. data/spec/shared/lib/mrss/constraints.rb +0 -378
  425. data/spec/shared/lib/mrss/docker_runner.rb +0 -291
  426. data/spec/shared/lib/mrss/eg_config_utils.rb +0 -51
  427. data/spec/shared/lib/mrss/event_subscriber.rb +0 -210
  428. data/spec/shared/lib/mrss/lite_constraints.rb +0 -238
  429. data/spec/shared/lib/mrss/server_version_registry.rb +0 -120
  430. data/spec/shared/lib/mrss/session_registry.rb +0 -69
  431. data/spec/shared/lib/mrss/session_registry_legacy.rb +0 -60
  432. data/spec/shared/lib/mrss/spec_organizer.rb +0 -179
  433. data/spec/shared/lib/mrss/utils.rb +0 -15
  434. data/spec/shared/share/Dockerfile.erb +0 -325
  435. data/spec/shared/share/haproxy-1.conf +0 -16
  436. data/spec/shared/share/haproxy-2.conf +0 -17
  437. data/spec/shared/shlib/config.sh +0 -27
  438. data/spec/shared/shlib/distro.sh +0 -74
  439. data/spec/shared/shlib/server.sh +0 -392
  440. data/spec/shared/shlib/set_env.sh +0 -169
  441. data.tar.gz.sig +0 -0
  442. metadata.gz.sig +0 -3
@@ -34,7 +34,12 @@ module Mongoid
34
34
  #
35
35
  # @return [ Time ] The evolved date time.
36
36
  def evolve(object)
37
- object.__evolve_time__
37
+ res = begin
38
+ object.try(:__evolve_time__)
39
+ rescue ArgumentError
40
+ nil
41
+ end
42
+ res.nil? ? object : res
38
43
  end
39
44
  end
40
45
  end
@@ -115,7 +115,7 @@ module Mongoid
115
115
  def __sort_option__
116
116
  tap do |hash|
117
117
  hash.each_pair do |key, value|
118
- hash.store(key, value.to_direction)
118
+ hash.store(key, Mongoid::Criteria::Translator.to_direction(value))
119
119
  end
120
120
  end
121
121
  end
@@ -134,22 +134,6 @@ module Mongoid
134
134
  replacement
135
135
  end
136
136
 
137
- # Update all the values in the hash with the provided block.
138
- #
139
- # @example Update the values in place.
140
- # { field: "1" }.update_values(&:to_i)
141
- #
142
- # @param [ Proc ] block The block to execute on each value.
143
- #
144
- # @return [ Hash ] the hash.
145
- #
146
- # @deprecated
147
- def update_values(&block)
148
- each_pair do |key, value|
149
- store(key, block[value])
150
- end
151
- end
152
-
153
137
  private
154
138
 
155
139
  # Apply the provided strategy for the hash with the given object.
@@ -30,14 +30,6 @@ module Mongoid
30
30
  ::Time.at(self).utc
31
31
  end
32
32
 
33
- # Get the integer as a sort direction.
34
- #
35
- # @example Get the integer as a sort direction.
36
- # 1.to_direction
37
- #
38
- # @return [ Integer ] self.
39
- def to_direction; self; end
40
-
41
33
  module ClassMethods
42
34
 
43
35
  # Get the object as a numeric.
@@ -51,7 +43,21 @@ module Mongoid
51
43
  #
52
44
  # @return [ Object ] The converted number.
53
45
  def __numeric__(object)
54
- object.to_s =~ /(\A[-+]?[0-9]+\z)|(\.0+\z)|(\.\z)/ ? object.to_i : Float(object)
46
+ str = object.to_s
47
+ raise ArgumentError if str.empty?
48
+
49
+ # These requirements seem a bit odd, but they're explicitly specified in the tests,
50
+ # so we're obligated to keep them, for now. (This code was rewritten from a one-line
51
+ # regex, due to security concerns with a polynomial regex being used on uncontrolled
52
+ # data).
53
+
54
+ str = str.chop if str.end_with?('.')
55
+ return 0 if str.empty?
56
+
57
+ result = Integer(str) rescue Float(object)
58
+
59
+ integer = result.to_i
60
+ integer == result ? integer : result
55
61
  end
56
62
 
57
63
  # Evolve the object to an integer.
@@ -167,7 +167,8 @@ module Mongoid
167
167
  when ::Range
168
168
  object.__evolve_range__
169
169
  else
170
- yield(object)
170
+ res = yield(object)
171
+ res.nil? ? object : res
171
172
  end
172
173
  end
173
174
  end
@@ -43,13 +43,21 @@ module Mongoid
43
43
  # @example Evolve the range.
44
44
  # (11231312..213123131).__evolve_range__
45
45
  #
46
+ # @param [ Object ] serializer The optional serializer for the field.
47
+ #
46
48
  # @return [ Hash ] The $gte/$lte range query.
47
- def __evolve_range__
49
+ #
50
+ # @api private
51
+ def __evolve_range__(serializer: nil)
48
52
  __evolve_range_naive__.transform_values! do |value|
49
- case value
50
- when Time, DateTime then value.__evolve_time__
51
- when Date then value.__evolve_date__
52
- else value
53
+ if serializer
54
+ serializer.evolve(value)
55
+ else
56
+ case value
57
+ when Time, DateTime then value.__evolve_time__
58
+ when Date then value.__evolve_date__
59
+ else value
60
+ end
53
61
  end
54
62
  end
55
63
  end
@@ -23,12 +23,12 @@ module Mongoid
23
23
  # @example Evolve the object to a regex.
24
24
  # Regexp.evolve("\A[123]")
25
25
  #
26
- # @param [ Regexp, String ] object The object to evolve.
26
+ # @param [ Regexp | String ] object The object to evolve.
27
27
  #
28
28
  # @return [ Regexp ] The evolved regex.
29
29
  def evolve(object)
30
30
  __evolve__(object) do |obj|
31
- ::Regexp.new(obj)
31
+ mongoize(obj)
32
32
  end
33
33
  end
34
34
  end
@@ -50,7 +50,7 @@ module Mongoid
50
50
  # @example Evolve the object to a regex.
51
51
  # BSON::Regexp::Raw.evolve("\\A[123]")
52
52
  #
53
- # @param [ BSON::Regexp::Raw, String ] object The object to evolve.
53
+ # @param [ BSON::Regexp::Raw | String ] object The object to evolve.
54
54
  #
55
55
  # @return [ BSON::Regexp::Raw ] The evolved raw regex.
56
56
  def evolve(object)
@@ -16,7 +16,7 @@ module Mongoid
16
16
  # @example Evolve the set.
17
17
  # Set.evolve(set)
18
18
  #
19
- # @param [ Set, Object ] object The object to evolve.
19
+ # @param [ Set | Object ] object The object to evolve.
20
20
  #
21
21
  # @return [ Array ] The evolved set.
22
22
  def evolve(object)
@@ -49,7 +49,7 @@ module Mongoid
49
49
  split(/,/).inject({}) do |hash, spec|
50
50
  hash.tap do |_hash|
51
51
  field, direction = spec.strip.split(/\s/)
52
- _hash[field.to_sym] = direction.to_direction
52
+ _hash[field.to_sym] = Mongoid::Criteria::Translator.to_direction(direction)
53
53
  end
54
54
  end
55
55
  end
@@ -60,23 +60,13 @@ module Mongoid
60
60
  # "field".__expr_part__(value)
61
61
  #
62
62
  # @param [ Object ] value The value of the criteria.
63
- # @param [ true, false ] negating If the selection should be negated.
63
+ # @param [ true | false ] negating If the selection should be negated.
64
64
  #
65
65
  # @return [ Hash ] The selection.
66
66
  def __expr_part__(value, negating = false)
67
67
  ::String.__expr_part__(self, value, negating)
68
68
  end
69
69
 
70
- # Get the string as a sort direction.
71
- #
72
- # @example Get the string as a sort direction.
73
- # "1".to_direction
74
- #
75
- # @return [ Integer ] The direction.
76
- def to_direction
77
- self =~ /desc/i ? -1 : 1
78
- end
79
-
80
70
  module ClassMethods
81
71
 
82
72
  # Get the value as a expression.
@@ -84,9 +74,9 @@ module Mongoid
84
74
  # @example Get the value as an expression.
85
75
  # String.__expr_part__("field", value)
86
76
  #
87
- # @param [ String, Symbol ] key The field key.
77
+ # @param [ String | Symbol ] key The field key.
88
78
  # @param [ Object ] value The value of the criteria.
89
- # @param [ true, false ] negating If the selection should be negated.
79
+ # @param [ true | false ] negating If the selection should be negated.
90
80
  #
91
81
  # @return [ Hash ] The selection.
92
82
  def __expr_part__(key, value, negating = false)
@@ -14,23 +14,13 @@ module Mongoid
14
14
  # :field.__expr_part__(value)
15
15
  #
16
16
  # @param [ Object ] value The value of the criteria.
17
- # @param [ true, false ] negating If the selection should be negated.
17
+ # @param [ true | false ] negating If the selection should be negated.
18
18
  #
19
19
  # @return [ Hash ] The selection.
20
20
  def __expr_part__(value, negating = false)
21
21
  ::String.__expr_part__(self, value, negating)
22
22
  end
23
23
 
24
- # Get the symbol as a sort direction.
25
- #
26
- # @example Get the symbol as a sort direction.
27
- # "1".to_direction
28
- #
29
- # @return [ Integer ] The direction.
30
- def to_direction
31
- to_s.to_direction
32
- end
33
-
34
24
  module ClassMethods
35
25
 
36
26
  # Adds a method on symbol as a convenience for the MongoDB operator.
@@ -59,7 +49,9 @@ module Mongoid
59
49
  #
60
50
  # @return [ Symbol ] The value as a symbol.
61
51
  def evolve(object)
62
- __evolve__(object) { |obj| obj.to_sym }
52
+ __evolve__(object) do |obj|
53
+ obj.try(:to_sym)
54
+ end
63
55
  end
64
56
  end
65
57
  end
@@ -42,7 +42,12 @@ module Mongoid
42
42
  #
43
43
  # @return [ Time ] The evolved date time.
44
44
  def evolve(object)
45
- object.__evolve_time__
45
+ res = begin
46
+ object.try(:__evolve_time__)
47
+ rescue ArgumentError
48
+ nil
49
+ end
50
+ res.nil? ? object : res
46
51
  end
47
52
  end
48
53
  end
@@ -42,7 +42,12 @@ module Mongoid
42
42
  #
43
43
  # @return [ Time ] The evolved date time.
44
44
  def evolve(object)
45
- object.__evolve_time__
45
+ res = begin
46
+ object.try(:__evolve_time__)
47
+ rescue ArgumentError
48
+ nil
49
+ end
50
+ res.nil? ? object : res
46
51
  end
47
52
  end
48
53
  end
@@ -82,7 +82,7 @@ module Mongoid
82
82
  #
83
83
  # @param [ Object ] other The object to compare to.
84
84
  #
85
- # @return [ true, false ] If the objects are equal.
85
+ # @return [ true | false ] If the objects are equal.
86
86
  def ==(other)
87
87
  return false unless other.is_a?(Key)
88
88
  name == other.name && operator == other.operator && expanded == other.expanded
@@ -91,7 +91,7 @@ module Mongoid
91
91
 
92
92
  # Calculate the hash code for a key.
93
93
  #
94
- # @return [ Fixnum ] The hash code for the key.
94
+ # @return [ Integer ] The hash code for the key.
95
95
  def hash
96
96
  [name, operator, expanded].hash
97
97
  end
@@ -104,7 +104,7 @@ module Mongoid
104
104
  # @example Instantiate a key for sorting.
105
105
  # Key.new(:field, :__override__, 1)
106
106
  #
107
- # @param [ String, Symbol ] name The field name.
107
+ # @param [ String | Symbol ] name The field name.
108
108
  # @param [ Symbol ] strategy The name of the merge strategy.
109
109
  # @param [ String | Integer ] operator The MongoDB operator,
110
110
  # or sort direction (1 or -1).
@@ -124,7 +124,7 @@ module Mongoid
124
124
  # key.__expr_part__(50)
125
125
  #
126
126
  # @param [ Object ] object The value to be included.
127
- # @param [ true, false ] negating If the selection should be negated.
127
+ # @param [ true | false ] negating If the selection should be negated.
128
128
  #
129
129
  # @return [ Hash ] The raw MongoDB selector.
130
130
  def __expr_part__(object, negating = false)
@@ -283,7 +283,7 @@ module Mongoid
283
283
  # The new value is a simple value.
284
284
  # Transform the implicit equality to either $eq or $regexp
285
285
  # depending on the type of the argument. See
286
- # https://docs.mongodb.com/manual/reference/operator/query/eq/#std-label-eq-usage-examples
286
+ # https://www.mongodb.com/docs/manual/reference/operator/query/eq/#std-label-eq-usage-examples
287
287
  # for the description of relevant server behavior.
288
288
  op = case v
289
289
  when Regexp, BSON::Regexp::Raw
@@ -17,7 +17,7 @@ module Mongoid
17
17
  # @example Add ascending sorting.
18
18
  # optional.ascending(:first_name, :last_name)
19
19
  #
20
- # @param [ Array<Symbol> ] fields The fields to sort.
20
+ # @param [ Symbol... ] *fields The field(s) to sort.
21
21
  #
22
22
  # @return [ Optional ] The cloned optional.
23
23
  def ascending(*fields)
@@ -45,7 +45,7 @@ module Mongoid
45
45
  # @example Add descending sorting.
46
46
  # optional.descending(:first_name, :last_name)
47
47
  #
48
- # @param [ Array<Symbol> ] fields The fields to sort.
48
+ # @param [ Symbol... ] *fields The field(s) to sort.
49
49
  #
50
50
  # @return [ Optional ] The cloned optional.
51
51
  def descending(*fields)
@@ -123,7 +123,7 @@ module Mongoid
123
123
  # @example Limit the results to the provided fields.
124
124
  # optional.only(:name, :dob)
125
125
  #
126
- # @param [ Array<Symbol> ] args The fields to return.
126
+ # @param [ Symbol... ] *args The field(s) to return.
127
127
  #
128
128
  # @return [ Optional ] The cloned optional.
129
129
  def only(*args)
@@ -163,7 +163,7 @@ module Mongoid
163
163
  # @example Add sorting options via a string.
164
164
  # optional.order_by("name ASC, dob DESC")
165
165
  #
166
- # @param [ Array, Hash, String ] spec The sorting specification.
166
+ # @param [ [ Array | Hash | String ]... ] *spec The sorting specification.
167
167
  #
168
168
  # @return [ Optional ] The cloned optional.
169
169
  def order_by(*spec)
@@ -184,7 +184,7 @@ module Mongoid
184
184
  # @example Replace the ordering.
185
185
  # optional.reorder(name: :asc)
186
186
  #
187
- # @param [ Array, Hash, String ] spec The sorting specification.
187
+ # @param [ [ Array | Hash | String ]... ] *spec The sorting specification.
188
188
  #
189
189
  # @return [ Optional ] The cloned optional.
190
190
  def reorder(*spec)
@@ -245,7 +245,7 @@ module Mongoid
245
245
  # @example Limit the results to the fields not provided.
246
246
  # optional.without(:name, :dob)
247
247
  #
248
- # @param [ Array<Symbol> ] args The fields to ignore.
248
+ # @param [ Symbol... ] *args The field(s) to ignore.
249
249
  #
250
250
  # @return [ Optional ] The cloned optional.
251
251
  def without(*args)
@@ -318,15 +318,9 @@ module Mongoid
318
318
  #
319
319
  # @return [ Optional ] The cloned optional.
320
320
  def add_sort_option(options, field, direction)
321
- if driver == :mongo1x
322
- sorting = (options[:sort] || []).dup
323
- sorting.push([ field, direction ])
324
- options.store(:sort, sorting)
325
- else
326
- sorting = (options[:sort] || {}).dup
327
- sorting[field] = direction
328
- options.store(:sort, sorting)
329
- end
321
+ sorting = (options[:sort] || {}).dup
322
+ sorting[field] = direction
323
+ options.store(:sort, sorting)
330
324
  end
331
325
 
332
326
  # Take the provided criterion and store it as an option in the query
@@ -337,7 +331,7 @@ module Mongoid
337
331
  # @example Store the option.
338
332
  # optional.option({ skip: 10 })
339
333
  #
340
- # @param [ Array ] args The options.
334
+ # @param [ Object... ] *args The options.
341
335
  #
342
336
  # @return [ Queryable ] The cloned queryable.
343
337
  def option(*args)
@@ -355,7 +349,7 @@ module Mongoid
355
349
  # @example Add multiple sort options.
356
350
  # optional.sort_with_list(:name, :dob, 1)
357
351
  #
358
- # @param [ Array<String> ] fields The field names.
352
+ # @param [ [ Symbol | String ]... ] *fields The field name(s).
359
353
  # @param [ Integer ] direction The sort direction.
360
354
  #
361
355
  # @return [ Optional ] The cloned optional.
@@ -54,7 +54,7 @@ module Mongoid
54
54
  # @example Store a value in the options.
55
55
  # options.store(:key, "testing")
56
56
  #
57
- # @param [ String, Symbol ] key The name of the attribute.
57
+ # @param [ String | Symbol ] key The name of the attribute.
58
58
  # @param [ Object ] value The value to add.
59
59
  #
60
60
  # @return [ Object ] The stored object.
@@ -84,7 +84,7 @@ module Mongoid
84
84
  #
85
85
  # @return [ Options ] The copied options.
86
86
  def __deep_copy__
87
- self.class.new(aliases, serializers) do |copy|
87
+ self.class.new(aliases, serializers, associations, aliased_associations) do |copy|
88
88
  each_pair do |key, value|
89
89
  copy.merge!(key => value.__deep_copy__)
90
90
  end
@@ -67,7 +67,7 @@ module Mongoid
67
67
  # pipeline.unwind(:field)
68
68
  # pipeline.unwind(document)
69
69
  #
70
- # @param [ String, Symbol, Hash ] field_or_doc A field name or a
70
+ # @param [ String | Symbol | Hash ] field_or_doc A field name or a
71
71
  # document.
72
72
  #
73
73
  # @return [ Pipeline ] The pipeline.
@@ -31,7 +31,7 @@ module Mongoid
31
31
  # @example Execute an $all in a where query.
32
32
  # selectable.where(:field.all => [ 1, 2 ])
33
33
  #
34
- # @param [ Hash ] criterion The key value pairs for $all matching.
34
+ # @param [ Hash... ] *criteria The key value pair(s) for $all matching.
35
35
  #
36
36
  # @return [ Selectable ] The cloned selectable.
37
37
  def all(*criteria)
@@ -69,8 +69,9 @@ module Mongoid
69
69
  # @example Add the criterion.
70
70
  # selectable.and({ field: value }, { other: value })
71
71
  #
72
- # @param [ Array<Hash | Criteria> ] criteria Multiple key/value pair
73
- # matches or Criteria objects that all must match to return results.
72
+ # @param [ [ Hash | Criteria | Array<Hash | Criteria> ]... ] *criteria
73
+ # Multiple key/value pair matches or Criteria objects that all must
74
+ # match to return results.
74
75
  #
75
76
  # @return [ Selectable ] The new selectable.
76
77
  def and(*criteria)
@@ -199,7 +200,7 @@ module Mongoid
199
200
  # the upper right (north east) as the second argument.
200
201
  # Important: When latitude and longitude are passed, longitude is
201
202
  # expected as the first element of the coordinate pair.
202
- # Source: https://docs.mongodb.com/manual/reference/operator/query/box/
203
+ # Source: https://www.mongodb.com/docs/manual/reference/operator/query/box/
203
204
  #
204
205
  # @example Add a geo intersect criterion for a line.
205
206
  # query.geo_spatial(:location.intersects_line => [[ 1, 10 ], [ 2, 10 ]])
@@ -227,19 +228,6 @@ module Mongoid
227
228
  __merge__(criterion)
228
229
  end
229
230
 
230
- # Alias for +geo_spatial+.
231
- #
232
- # @deprecated
233
- def geo_spacial(criterion)
234
- # Duplicate method body so that we can raise this exception with
235
- # geo_spacial as the indicated operator rather than geo_spatial.
236
- if criterion.nil?
237
- raise Errors::CriteriaArgumentRequired, :geo_spacial
238
- end
239
-
240
- __merge__(criterion)
241
- end
242
-
243
231
  key :intersects_line, :override, "$geoIntersects", "$geometry" do |value|
244
232
  { "type" => LINE_STRING, "coordinates" => value }
245
233
  end
@@ -529,8 +517,8 @@ module Mongoid
529
517
  # @example Add the $nor selection.
530
518
  # selectable.nor(field: 1, field: 2)
531
519
  #
532
- # @param [ Array<Hash | Criteria> ] criteria Multiple key/value pair
533
- # matches or Criteria objects.
520
+ # @param [ [ Hash | Criteria | Array<Hash | Criteria> ]... ] *criteria
521
+ # Multiple key/value pair matches or Criteria objects.
534
522
  #
535
523
  # @return [ Selectable ] The new selectable.
536
524
  def nor(*criteria)
@@ -542,7 +530,7 @@ module Mongoid
542
530
  # @example Is the selectable negating?
543
531
  # selectable.negating?
544
532
  #
545
- # @return [ true, false ] If the selectable is negating.
533
+ # @return [ true | false ] If the selectable is negating.
546
534
  def negating?
547
535
  !!negating
548
536
  end
@@ -558,7 +546,7 @@ module Mongoid
558
546
  # @example Execute a $not in a where query.
559
547
  # selectable.where(:field.not => /Bob/)
560
548
  #
561
- # @param [ Array<Hash | Criteria> ] criteria Multiple key/value pair
549
+ # @param [ [ Hash | Criteria ]... ] *criteria The key/value pair
562
550
  # matches or Criteria objects to negate.
563
551
  #
564
552
  # @return [ Selectable ] The new selectable.
@@ -593,6 +581,35 @@ module Mongoid
593
581
  end
594
582
  key :not, :override, "$not"
595
583
 
584
+ # Negate the arguments, constraining the query to only those documents
585
+ # that do NOT match the arguments.
586
+ #
587
+ # @example Exclude a single criterion.
588
+ # selectable.none_of(name: /Bob/)
589
+ #
590
+ # @example Exclude multiple criteria.
591
+ # selectable.none_of(name: /Bob/, country: "USA")
592
+ #
593
+ # @example Exclude multiple criteria as an array.
594
+ # selectable.none_of([{ name: /Bob/ }, { country: "USA" }])
595
+ #
596
+ # @param [ [ Hash | Criteria ]... ] *criteria The key/value pair
597
+ # matches or Criteria objects to negate.
598
+ #
599
+ # @return [ Selectable ] The new selectable.
600
+ def none_of(*criteria)
601
+ criteria = _mongoid_flatten_arrays(criteria)
602
+ return dup if criteria.empty?
603
+
604
+ exprs = criteria.map do |criterion|
605
+ _mongoid_expand_keys(
606
+ criterion.is_a?(Selectable) ?
607
+ criterion.selector : criterion)
608
+ end
609
+
610
+ self.and('$nor' => exprs)
611
+ end
612
+
596
613
  # Creates a disjunction using $or from the existing criteria in the
597
614
  # receiver and the provided arguments.
598
615
  #
@@ -618,7 +635,7 @@ module Mongoid
618
635
  # @example Same as previous example, also deprecated.
619
636
  # selectable.or([{field: 1}], [{field: 2}])
620
637
  #
621
- # @param [ Hash | Criteria | Array<Hash | Criteria>, ... ] criteria
638
+ # @param [ [ Hash | Criteria | Array<Hash | Criteria> ]... ] *criteria
622
639
  # Multiple key/value pair matches or Criteria objects, or arrays
623
640
  # thereof. Passing arrays is deprecated.
624
641
  #
@@ -648,7 +665,7 @@ module Mongoid
648
665
  # @example Same as previous example, also deprecated.
649
666
  # selectable.any_of([{field: 1}], [{field: 2}])
650
667
  #
651
- # @param [ Hash | Criteria | Array<Hash | Criteria>, ... ] criteria
668
+ # @param [ [ Hash | Criteria | Array<Hash | Criteria> ]... ] *criteria
652
669
  # Multiple key/value pair matches or Criteria objects, or arrays
653
670
  # thereof. Passing arrays is deprecated.
654
671
  #
@@ -679,16 +696,7 @@ module Mongoid
679
696
  end]
680
697
  end
681
698
  end
682
- # Should be able to do:
683
- #where('$or' => exprs)
684
- # But since that is broken do instead:
685
- clone.tap do |query|
686
- if query.selector['$or']
687
- query.selector.store('$or', query.selector['$or'] + exprs)
688
- else
689
- query.selector.store('$or', exprs)
690
- end
691
- end
699
+ self.and('$or' => exprs)
692
700
  end
693
701
  end
694
702
 
@@ -753,12 +761,12 @@ module Mongoid
753
761
  # @example Construct a text search selector with options.
754
762
  # selectable.text_search("testing", :$language => "fr")
755
763
  #
756
- # @note Per https://docs.mongodb.com/manual/reference/operator/query/text/
764
+ # @note Per https://www.mongodb.com/docs/manual/reference/operator/query/text/
757
765
  # it is not currently possible to supply multiple text search
758
766
  # conditions in a query. Mongoid will build such a query but the
759
767
  # server will return an error when trying to execute it.
760
768
  #
761
- # @param [ String, Symbol ] terms A string of terms that MongoDB parses
769
+ # @param [ String | Symbol ] terms A string of terms that MongoDB parses
762
770
  # and uses to query the text index.
763
771
  # @param [ Hash ] opts Text search options. See MongoDB documentation
764
772
  # for options.
@@ -773,7 +781,7 @@ module Mongoid
773
781
  criterion = {'$text' => { '$search' => terms }}
774
782
  criterion['$text'].merge!(opts) if opts
775
783
  if query.selector['$text']
776
- # Per https://docs.mongodb.com/manual/reference/operator/query/text/
784
+ # Per https://www.mongodb.com/docs/manual/reference/operator/query/text/
777
785
  # multiple $text expressions are not currently supported by
778
786
  # MongoDB server, but build the query correctly instead of
779
787
  # overwriting previous text search condition with the currently
@@ -796,7 +804,8 @@ module Mongoid
796
804
  # @example Add a javascript selection.
797
805
  # selectable.where("this.name == 'syd'")
798
806
  #
799
- # @param [ String, Hash ] criterion The javascript or standard selection.
807
+ # @param [ [ Hash | String ]... ] *criterion The standard selection
808
+ # or javascript string.
800
809
  #
801
810
  # @return [ Selectable ] The cloned selectable.
802
811
  def where(*criteria)
@@ -874,7 +883,7 @@ module Mongoid
874
883
  # @param [ Hash ] criterion The criterion.
875
884
  def typed_override(criterion, operator)
876
885
  if criterion
877
- criterion.update_values do |value|
886
+ criterion.transform_values! do |value|
878
887
  yield(value)
879
888
  end
880
889
  end