mongoid 7.1.1 → 8.1.0

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