mongoid 7.5.1 → 8.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (424) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +3 -3
  4. data/README.md +6 -6
  5. data/Rakefile +25 -0
  6. data/lib/config/locales/en.yml +92 -43
  7. data/lib/mongoid/association/accessors.rb +40 -11
  8. data/lib/mongoid/association/bindable.rb +50 -2
  9. data/lib/mongoid/association/builders.rb +5 -3
  10. data/lib/mongoid/association/constrainable.rb +0 -1
  11. data/lib/mongoid/association/eager_loadable.rb +29 -7
  12. data/lib/mongoid/association/embedded/batchable.rb +54 -14
  13. data/lib/mongoid/association/embedded/cyclic.rb +1 -1
  14. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  15. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -2
  16. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +4 -3
  17. data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
  18. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  19. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +4 -3
  20. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +69 -45
  21. data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
  22. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +19 -5
  23. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +24 -5
  24. data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
  25. data/lib/mongoid/association/macros.rb +8 -1
  26. data/lib/mongoid/association/many.rb +11 -7
  27. data/lib/mongoid/association/nested/many.rb +5 -4
  28. data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
  29. data/lib/mongoid/association/nested/one.rb +45 -7
  30. data/lib/mongoid/association/one.rb +2 -2
  31. data/lib/mongoid/association/options.rb +9 -9
  32. data/lib/mongoid/association/proxy.rb +15 -4
  33. data/lib/mongoid/association/referenced/auto_save.rb +4 -3
  34. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  35. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  36. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
  37. data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
  38. data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
  39. data/lib/mongoid/association/referenced/eager.rb +2 -2
  40. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +70 -13
  41. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
  42. data/lib/mongoid/association/referenced/has_many/enumerable.rb +22 -30
  43. data/lib/mongoid/association/referenced/has_many/proxy.rb +29 -19
  44. data/lib/mongoid/association/referenced/has_many.rb +3 -3
  45. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  46. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
  47. data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
  48. data/lib/mongoid/association/referenced/has_one.rb +3 -3
  49. data/lib/mongoid/association/referenced/syncable.rb +4 -4
  50. data/lib/mongoid/association/reflections.rb +4 -4
  51. data/lib/mongoid/association/relatable.rb +44 -10
  52. data/lib/mongoid/association.rb +5 -5
  53. data/lib/mongoid/atomic/modifiers.rb +2 -2
  54. data/lib/mongoid/atomic/paths/embedded/many.rb +19 -0
  55. data/lib/mongoid/atomic.rb +7 -0
  56. data/lib/mongoid/attributes/dynamic.rb +4 -4
  57. data/lib/mongoid/attributes/nested.rb +6 -6
  58. data/lib/mongoid/attributes/processing.rb +37 -6
  59. data/lib/mongoid/attributes/projector.rb +2 -2
  60. data/lib/mongoid/attributes/readonly.rb +3 -3
  61. data/lib/mongoid/attributes.rb +51 -42
  62. data/lib/mongoid/cacheable.rb +2 -2
  63. data/lib/mongoid/changeable.rb +147 -14
  64. data/lib/mongoid/clients/options.rb +5 -1
  65. data/lib/mongoid/clients/sessions.rb +2 -14
  66. data/lib/mongoid/clients/storage_options.rb +2 -5
  67. data/lib/mongoid/clients/validators/storage.rb +3 -15
  68. data/lib/mongoid/collection_configurable.rb +58 -0
  69. data/lib/mongoid/composable.rb +2 -0
  70. data/lib/mongoid/config/defaults.rb +60 -0
  71. data/lib/mongoid/config/options.rb +3 -0
  72. data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
  73. data/lib/mongoid/config/validators/client.rb +6 -6
  74. data/lib/mongoid/config/validators.rb +1 -0
  75. data/lib/mongoid/config.rb +145 -17
  76. data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
  77. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
  78. data/lib/mongoid/contextual/aggregable/none.rb +1 -1
  79. data/lib/mongoid/contextual/atomic.rb +1 -1
  80. data/lib/mongoid/contextual/geo_near.rb +7 -7
  81. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  82. data/lib/mongoid/contextual/memory.rb +285 -58
  83. data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
  84. data/lib/mongoid/contextual/mongo.rb +521 -333
  85. data/lib/mongoid/contextual/none.rb +193 -20
  86. data/lib/mongoid/contextual/queryable.rb +1 -1
  87. data/lib/mongoid/contextual.rb +14 -2
  88. data/lib/mongoid/copyable.rb +32 -8
  89. data/lib/mongoid/criteria/findable.rb +8 -5
  90. data/lib/mongoid/criteria/includable.rb +27 -22
  91. data/lib/mongoid/criteria/marshalable.rb +10 -2
  92. data/lib/mongoid/criteria/permission.rb +1 -1
  93. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
  94. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -16
  95. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  96. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
  97. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  98. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  99. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -17
  100. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -9
  101. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  102. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  103. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  104. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
  105. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
  106. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
  107. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  108. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  109. data/lib/mongoid/criteria/queryable/key.rb +4 -4
  110. data/lib/mongoid/criteria/queryable/mergeable.rb +1 -1
  111. data/lib/mongoid/criteria/queryable/optional.rb +11 -17
  112. data/lib/mongoid/criteria/queryable/options.rb +2 -2
  113. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
  114. data/lib/mongoid/criteria/queryable/selectable.rb +47 -38
  115. data/lib/mongoid/criteria/queryable/selector.rb +93 -8
  116. data/lib/mongoid/criteria/queryable/smash.rb +40 -7
  117. data/lib/mongoid/criteria/queryable/storable.rb +1 -1
  118. data/lib/mongoid/criteria/queryable.rb +12 -7
  119. data/lib/mongoid/criteria/scopable.rb +2 -2
  120. data/lib/mongoid/criteria/translator.rb +45 -0
  121. data/lib/mongoid/criteria.rb +20 -40
  122. data/lib/mongoid/deprecable.rb +36 -0
  123. data/lib/mongoid/deprecation.rb +25 -0
  124. data/lib/mongoid/document.rb +135 -36
  125. data/lib/mongoid/equality.rb +8 -8
  126. data/lib/mongoid/errors/create_collection_failure.rb +33 -0
  127. data/lib/mongoid/errors/document_not_found.rb +10 -6
  128. data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
  129. data/lib/mongoid/errors/immutable_attribute.rb +26 -0
  130. data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
  131. data/lib/mongoid/errors/invalid_config_option.rb +1 -1
  132. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
  133. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  134. data/lib/mongoid/errors/invalid_field.rb +6 -2
  135. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  136. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
  137. data/lib/mongoid/errors/invalid_relation.rb +1 -1
  138. data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
  139. data/lib/mongoid/errors/invalid_session_use.rb +1 -1
  140. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  141. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
  142. data/lib/mongoid/errors/mongoid_error.rb +3 -3
  143. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
  144. data/lib/mongoid/errors/no_client_database.rb +1 -1
  145. data/lib/mongoid/errors/no_client_hosts.rb +1 -1
  146. data/lib/mongoid/errors/readonly_attribute.rb +1 -1
  147. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  148. data/lib/mongoid/errors/unknown_attribute.rb +1 -1
  149. data/lib/mongoid/errors.rb +6 -3
  150. data/lib/mongoid/extensions/array.rb +9 -7
  151. data/lib/mongoid/extensions/big_decimal.rb +33 -10
  152. data/lib/mongoid/extensions/binary.rb +42 -0
  153. data/lib/mongoid/extensions/boolean.rb +8 -2
  154. data/lib/mongoid/extensions/date.rb +26 -20
  155. data/lib/mongoid/extensions/date_time.rb +1 -1
  156. data/lib/mongoid/extensions/false_class.rb +1 -1
  157. data/lib/mongoid/extensions/float.rb +7 -4
  158. data/lib/mongoid/extensions/hash.rb +19 -8
  159. data/lib/mongoid/extensions/integer.rb +7 -4
  160. data/lib/mongoid/extensions/module.rb +1 -1
  161. data/lib/mongoid/extensions/object.rb +10 -8
  162. data/lib/mongoid/extensions/range.rb +41 -10
  163. data/lib/mongoid/extensions/regexp.rb +11 -4
  164. data/lib/mongoid/extensions/set.rb +11 -4
  165. data/lib/mongoid/extensions/string.rb +11 -22
  166. data/lib/mongoid/extensions/symbol.rb +4 -15
  167. data/lib/mongoid/extensions/time.rb +29 -16
  168. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  169. data/lib/mongoid/extensions/true_class.rb +1 -1
  170. data/lib/mongoid/extensions.rb +1 -0
  171. data/lib/mongoid/factory.rb +55 -7
  172. data/lib/mongoid/fields/foreign_key.rb +11 -4
  173. data/lib/mongoid/fields/localized.rb +19 -4
  174. data/lib/mongoid/fields/standard.rb +17 -7
  175. data/lib/mongoid/fields/validators/macro.rb +3 -9
  176. data/lib/mongoid/fields.rb +129 -20
  177. data/lib/mongoid/findable.rb +54 -24
  178. data/lib/mongoid/indexable/specification.rb +2 -2
  179. data/lib/mongoid/indexable/validators/options.rb +6 -2
  180. data/lib/mongoid/interceptable.rb +76 -15
  181. data/lib/mongoid/matchable.rb +1 -1
  182. data/lib/mongoid/matcher/eq_impl.rb +1 -1
  183. data/lib/mongoid/matcher/type.rb +1 -1
  184. data/lib/mongoid/matcher.rb +33 -13
  185. data/lib/mongoid/persistable/creatable.rb +19 -9
  186. data/lib/mongoid/persistable/deletable.rb +2 -2
  187. data/lib/mongoid/persistable/destroyable.rb +1 -1
  188. data/lib/mongoid/persistable/savable.rb +14 -2
  189. data/lib/mongoid/persistable/unsettable.rb +2 -2
  190. data/lib/mongoid/persistable/updatable.rb +69 -12
  191. data/lib/mongoid/persistable/upsertable.rb +21 -2
  192. data/lib/mongoid/persistable.rb +6 -3
  193. data/lib/mongoid/persistence_context.rb +63 -10
  194. data/lib/mongoid/query_cache.rb +13 -261
  195. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  196. data/lib/mongoid/railties/database.rake +7 -2
  197. data/lib/mongoid/reloadable.rb +10 -8
  198. data/lib/mongoid/scopable.rb +15 -13
  199. data/lib/mongoid/selectable.rb +1 -2
  200. data/lib/mongoid/serializable.rb +10 -6
  201. data/lib/mongoid/shardable.rb +35 -11
  202. data/lib/mongoid/stateful.rb +57 -10
  203. data/lib/mongoid/tasks/database.rake +12 -0
  204. data/lib/mongoid/tasks/database.rb +20 -2
  205. data/lib/mongoid/threaded/lifecycle.rb +5 -5
  206. data/lib/mongoid/threaded.rb +42 -12
  207. data/lib/mongoid/timestamps/created.rb +1 -1
  208. data/lib/mongoid/timestamps/updated.rb +2 -2
  209. data/lib/mongoid/touchable.rb +2 -3
  210. data/lib/mongoid/traversable.rb +5 -4
  211. data/lib/mongoid/utils.rb +22 -0
  212. data/lib/mongoid/validatable/localizable.rb +1 -1
  213. data/lib/mongoid/validatable/macros.rb +5 -7
  214. data/lib/mongoid/validatable/presence.rb +2 -2
  215. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  216. data/lib/mongoid/validatable.rb +9 -6
  217. data/lib/mongoid/version.rb +1 -1
  218. data/lib/mongoid/warnings.rb +19 -4
  219. data/lib/mongoid.rb +17 -3
  220. data/spec/config/mongoid.yml +16 -0
  221. data/spec/integration/app_spec.rb +10 -14
  222. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  223. data/spec/integration/associations/embedded_spec.rb +15 -0
  224. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  225. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  226. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  227. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  228. data/spec/integration/associations/has_one_spec.rb +97 -1
  229. data/spec/integration/associations/scope_option_spec.rb +1 -1
  230. data/spec/integration/callbacks_models.rb +132 -1
  231. data/spec/integration/callbacks_spec.rb +360 -4
  232. data/spec/integration/criteria/range_spec.rb +95 -1
  233. data/spec/integration/discriminator_key_spec.rb +118 -80
  234. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  235. data/spec/integration/i18n_fallbacks_spec.rb +3 -32
  236. data/spec/integration/matcher_examples_spec.rb +20 -13
  237. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  238. data/spec/integration/matcher_operator_spec.rb +3 -5
  239. data/spec/integration/persistence/range_field_spec.rb +350 -0
  240. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  241. data/spec/mongoid/association/depending_spec.rb +9 -9
  242. data/spec/mongoid/association/eager_spec.rb +2 -1
  243. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  244. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  245. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +96 -9
  246. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  247. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +276 -65
  248. data/spec/mongoid/association/embedded/embeds_many_models.rb +158 -0
  249. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  250. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  251. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  252. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +15 -2
  253. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  254. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  255. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  256. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  257. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  258. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  259. data/spec/mongoid/association/referenced/belongs_to_spec.rb +4 -20
  260. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +215 -228
  261. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  262. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  263. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  264. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  265. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +193 -177
  266. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  267. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  268. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  269. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  270. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  271. data/spec/mongoid/association/syncable_spec.rb +15 -1
  272. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  273. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  274. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  275. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  276. data/spec/mongoid/attributes_spec.rb +554 -33
  277. data/spec/mongoid/cacheable_spec.rb +3 -3
  278. data/spec/mongoid/changeable_spec.rb +429 -37
  279. data/spec/mongoid/clients/factory_spec.rb +23 -30
  280. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  281. data/spec/mongoid/clients_spec.rb +179 -15
  282. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  283. data/spec/mongoid/config/defaults_spec.rb +160 -0
  284. data/spec/mongoid/config_spec.rb +220 -30
  285. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  286. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  287. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  288. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  289. data/spec/mongoid/contextual/memory_spec.rb +850 -88
  290. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  291. data/spec/mongoid/contextual/mongo_spec.rb +1570 -413
  292. data/spec/mongoid/contextual/none_spec.rb +60 -21
  293. data/spec/mongoid/copyable_spec.rb +453 -11
  294. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  295. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  296. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  297. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  298. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  299. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  300. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  301. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  302. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  303. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  304. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
  305. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  306. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  307. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  308. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  309. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
  310. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
  311. data/spec/mongoid/criteria/queryable/selectable_spec.rb +78 -86
  312. data/spec/mongoid/criteria/queryable/selector_spec.rb +90 -5
  313. data/spec/mongoid/criteria/queryable/storable_spec.rb +72 -0
  314. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  315. data/spec/mongoid/criteria_projection_spec.rb +1 -5
  316. data/spec/mongoid/criteria_spec.rb +469 -1205
  317. data/spec/mongoid/document_fields_spec.rb +173 -24
  318. data/spec/mongoid/document_spec.rb +32 -41
  319. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  320. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  321. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  322. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  323. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  324. data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
  325. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  326. data/spec/mongoid/extensions/array_spec.rb +16 -2
  327. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  328. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  329. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  330. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  331. data/spec/mongoid/extensions/date_spec.rb +71 -1
  332. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  333. data/spec/mongoid/extensions/float_spec.rb +53 -74
  334. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  335. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  336. data/spec/mongoid/extensions/range_spec.rb +255 -54
  337. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  338. data/spec/mongoid/extensions/set_spec.rb +106 -0
  339. data/spec/mongoid/extensions/string_spec.rb +53 -25
  340. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  341. data/spec/mongoid/extensions/time_spec.rb +639 -106
  342. data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
  343. data/spec/mongoid/factory_spec.rb +61 -1
  344. data/spec/mongoid/fields/localized_spec.rb +80 -37
  345. data/spec/mongoid/fields_spec.rb +500 -84
  346. data/spec/mongoid/findable_spec.rb +450 -58
  347. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  348. data/spec/mongoid/indexable_spec.rb +55 -30
  349. data/spec/mongoid/interceptable_spec.rb +599 -8
  350. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  351. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  352. data/spec/mongoid/mongoizable_spec.rb +285 -0
  353. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  354. data/spec/mongoid/persistable/deletable_spec.rb +28 -8
  355. data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
  356. data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
  357. data/spec/mongoid/persistable/logical_spec.rb +37 -0
  358. data/spec/mongoid/persistable/poppable_spec.rb +36 -0
  359. data/spec/mongoid/persistable/pullable_spec.rb +72 -0
  360. data/spec/mongoid/persistable/pushable_spec.rb +72 -0
  361. data/spec/mongoid/persistable/renamable_spec.rb +36 -0
  362. data/spec/mongoid/persistable/savable_spec.rb +96 -0
  363. data/spec/mongoid/persistable/settable_spec.rb +37 -0
  364. data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
  365. data/spec/mongoid/persistable/updatable_spec.rb +20 -28
  366. data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
  367. data/spec/mongoid/persistence_context_spec.rb +57 -58
  368. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  369. data/spec/mongoid/query_cache_spec.rb +56 -215
  370. data/spec/mongoid/reloadable_spec.rb +83 -6
  371. data/spec/mongoid/scopable_spec.rb +91 -1
  372. data/spec/mongoid/serializable_spec.rb +9 -30
  373. data/spec/mongoid/shardable_models.rb +14 -0
  374. data/spec/mongoid/shardable_spec.rb +157 -51
  375. data/spec/mongoid/stateful_spec.rb +150 -8
  376. data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
  377. data/spec/mongoid/tasks/database_spec.rb +127 -0
  378. data/spec/mongoid/timestamps_spec.rb +392 -4
  379. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  380. data/spec/mongoid/touchable_spec.rb +390 -2
  381. data/spec/mongoid/touchable_spec_models.rb +14 -8
  382. data/spec/mongoid/traversable_spec.rb +13 -35
  383. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  384. data/spec/mongoid/validatable/uniqueness_spec.rb +58 -31
  385. data/spec/mongoid/warnings_spec.rb +35 -0
  386. data/spec/mongoid_spec.rb +34 -10
  387. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  388. data/spec/rails/mongoid_spec.rb +4 -16
  389. data/spec/shared/lib/mrss/lite_constraints.rb +8 -0
  390. data/spec/shared/shlib/server.sh +5 -5
  391. data/spec/spec_helper.rb +5 -0
  392. data/spec/support/constraints.rb +24 -0
  393. data/spec/support/immutable_ids.rb +118 -0
  394. data/spec/support/macros.rb +78 -0
  395. data/spec/support/models/artist.rb +0 -1
  396. data/spec/support/models/augmentation.rb +12 -0
  397. data/spec/support/models/band.rb +4 -0
  398. data/spec/support/models/book.rb +1 -0
  399. data/spec/support/models/building.rb +2 -0
  400. data/spec/support/models/catalog.rb +24 -0
  401. data/spec/support/models/circus.rb +3 -0
  402. data/spec/support/models/cover.rb +10 -0
  403. data/spec/support/models/fanatic.rb +8 -0
  404. data/spec/support/models/implant.rb +9 -0
  405. data/spec/support/models/label.rb +2 -0
  406. data/spec/support/models/passport.rb +9 -0
  407. data/spec/support/models/person.rb +2 -0
  408. data/spec/support/models/player.rb +2 -0
  409. data/spec/support/models/powerup.rb +12 -0
  410. data/spec/support/models/product.rb +1 -0
  411. data/spec/support/models/purse.rb +9 -0
  412. data/spec/support/models/registry.rb +1 -0
  413. data/spec/support/models/school.rb +14 -0
  414. data/spec/support/models/shield.rb +18 -0
  415. data/spec/support/models/student.rb +14 -0
  416. data/spec/support/models/weapon.rb +12 -0
  417. data.tar.gz.sig +0 -0
  418. metadata +720 -638
  419. metadata.gz.sig +0 -0
  420. data/lib/mongoid/errors/eager_load.rb +0 -23
  421. data/lib/mongoid/errors/invalid_value.rb +0 -17
  422. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -60
  423. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -60
  424. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
@@ -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,7 @@ 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
+ object.to_s.match?(/\A[-+]?[0-9]*[0-9.]0*\z/) ? object.to_i : Float(object)
55
47
  end
56
48
 
57
49
  # 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