mongoid 9.0.11 → 9.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 (997) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -8
  3. data/README.md +5 -11
  4. data/Rakefile +35 -38
  5. data/lib/config/locales/en.yml +11 -0
  6. data/lib/mongoid/association/accessors.rb +19 -26
  7. data/lib/mongoid/association/bindable.rb +43 -45
  8. data/lib/mongoid/association/builders.rb +18 -15
  9. data/lib/mongoid/association/constrainable.rb +3 -5
  10. data/lib/mongoid/association/depending.rb +34 -38
  11. data/lib/mongoid/association/eager.rb +47 -13
  12. data/lib/mongoid/association/eager_loadable.rb +152 -24
  13. data/lib/mongoid/association/embedded/batchable.rb +28 -30
  14. data/lib/mongoid/association/embedded/cyclic.rb +8 -11
  15. data/lib/mongoid/association/embedded/eager.rb +1 -6
  16. data/lib/mongoid/association/embedded/embedded_in/binding.rb +6 -9
  17. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -3
  18. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +2 -0
  19. data/lib/mongoid/association/embedded/embedded_in.rb +25 -22
  20. data/lib/mongoid/association/embedded/embeds_many/binding.rb +0 -2
  21. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +2 -3
  22. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +1 -1
  23. data/lib/mongoid/association/embedded/embeds_many.rb +24 -21
  24. data/lib/mongoid/association/embedded/embeds_one/binding.rb +0 -2
  25. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +2 -6
  26. data/lib/mongoid/association/embedded/embeds_one.rb +20 -18
  27. data/lib/mongoid/association/embedded.rb +0 -1
  28. data/lib/mongoid/association/macros.rb +3 -7
  29. data/lib/mongoid/association/many.rb +75 -3
  30. data/lib/mongoid/association/marshalable.rb +0 -3
  31. data/lib/mongoid/association/nested/many.rb +18 -13
  32. data/lib/mongoid/association/nested/nested_buildable.rb +6 -9
  33. data/lib/mongoid/association/nested/one.rb +4 -7
  34. data/lib/mongoid/association/nested.rb +1 -3
  35. data/lib/mongoid/association/one.rb +0 -3
  36. data/lib/mongoid/association/options.rb +8 -7
  37. data/lib/mongoid/association/referenced/auto_save.rb +0 -2
  38. data/lib/mongoid/association/referenced/belongs_to/binding.rb +11 -15
  39. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +23 -5
  40. data/lib/mongoid/association/referenced/belongs_to/eager.rb +1 -3
  41. data/lib/mongoid/association/referenced/belongs_to.rb +48 -43
  42. data/lib/mongoid/association/referenced/counter_cache.rb +5 -10
  43. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +0 -2
  44. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +8 -4
  45. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +0 -3
  46. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +52 -47
  47. data/lib/mongoid/association/referenced/has_many/binding.rb +0 -2
  48. data/lib/mongoid/association/referenced/has_many/buildable.rb +11 -5
  49. data/lib/mongoid/association/referenced/has_many/eager.rb +0 -3
  50. data/lib/mongoid/association/referenced/has_many/enumerable.rb +107 -38
  51. data/lib/mongoid/association/referenced/has_many/proxy.rb +10 -6
  52. data/lib/mongoid/association/referenced/has_many.rb +30 -24
  53. data/lib/mongoid/association/referenced/has_one/binding.rb +0 -2
  54. data/lib/mongoid/association/referenced/has_one/buildable.rb +11 -9
  55. data/lib/mongoid/association/referenced/has_one/eager.rb +0 -3
  56. data/lib/mongoid/association/referenced/has_one.rb +26 -21
  57. data/lib/mongoid/association/referenced/syncable.rb +30 -34
  58. data/lib/mongoid/association/referenced.rb +0 -1
  59. data/lib/mongoid/association/reflections.rb +0 -3
  60. data/lib/mongoid/association/relatable.rb +69 -66
  61. data/lib/mongoid/association.rb +12 -15
  62. data/lib/mongoid/atomic/modifiers.rb +65 -25
  63. data/lib/mongoid/atomic/paths/embedded/many.rb +4 -7
  64. data/lib/mongoid/atomic/paths/embedded/one.rb +2 -4
  65. data/lib/mongoid/atomic/paths/embedded.rb +3 -6
  66. data/lib/mongoid/atomic/paths/root.rb +1 -4
  67. data/lib/mongoid/atomic/paths.rb +2 -3
  68. data/lib/mongoid/atomic.rb +0 -3
  69. data/lib/mongoid/attributes/dynamic.rb +6 -7
  70. data/lib/mongoid/attributes/nested.rb +8 -10
  71. data/lib/mongoid/attributes/projector.rb +7 -20
  72. data/lib/mongoid/attributes/readonly.rb +6 -11
  73. data/lib/mongoid/attributes.rb +18 -34
  74. data/lib/mongoid/cacheable.rb +24 -6
  75. data/lib/mongoid/clients/factory.rb +12 -15
  76. data/lib/mongoid/clients/options.rb +2 -5
  77. data/lib/mongoid/clients/sessions.rb +50 -60
  78. data/lib/mongoid/clients/storage_options.rb +1 -4
  79. data/lib/mongoid/clients/validators/storage.rb +2 -3
  80. data/lib/mongoid/clients/validators.rb +1 -2
  81. data/lib/mongoid/clients.rb +8 -11
  82. data/lib/mongoid/collection_configurable.rb +10 -14
  83. data/lib/mongoid/composable.rb +30 -34
  84. data/lib/mongoid/config/defaults.rb +7 -4
  85. data/lib/mongoid/config/encryption.rb +1 -3
  86. data/lib/mongoid/config/environment.rb +7 -16
  87. data/lib/mongoid/config/introspection.rb +14 -16
  88. data/lib/mongoid/config/options.rb +16 -10
  89. data/lib/mongoid/config/validators/async_query_executor.rb +3 -6
  90. data/lib/mongoid/config/validators/client.rb +12 -15
  91. data/lib/mongoid/config/validators/option.rb +3 -5
  92. data/lib/mongoid/config/validators.rb +3 -4
  93. data/lib/mongoid/config.rb +132 -42
  94. data/lib/mongoid/contextual/aggregable/memory.rb +2 -4
  95. data/lib/mongoid/contextual/aggregable/mongo.rb +20 -22
  96. data/lib/mongoid/contextual/aggregable/none.rb +2 -4
  97. data/lib/mongoid/contextual/aggregable.rb +5 -7
  98. data/lib/mongoid/contextual/atomic.rb +20 -24
  99. data/lib/mongoid/contextual/command.rb +0 -3
  100. data/lib/mongoid/contextual/map_reduce.rb +12 -16
  101. data/lib/mongoid/contextual/memory.rb +72 -65
  102. data/lib/mongoid/contextual/mongo/documents_loader.rb +2 -3
  103. data/lib/mongoid/contextual/mongo.rb +169 -85
  104. data/lib/mongoid/contextual/none.rb +9 -9
  105. data/lib/mongoid/contextual/queryable.rb +1 -4
  106. data/lib/mongoid/contextual.rb +18 -7
  107. data/lib/mongoid/copyable.rb +7 -9
  108. data/lib/mongoid/criteria/findable.rb +5 -7
  109. data/lib/mongoid/criteria/includable.rb +37 -8
  110. data/lib/mongoid/criteria/inspectable.rb +2 -5
  111. data/lib/mongoid/criteria/marshalable.rb +4 -8
  112. data/lib/mongoid/criteria/modifiable.rb +3 -11
  113. data/lib/mongoid/criteria/options.rb +0 -3
  114. data/lib/mongoid/criteria/permission.rb +34 -37
  115. data/lib/mongoid/criteria/queryable/aggregable.rb +9 -10
  116. data/lib/mongoid/criteria/queryable/expandable.rb +4 -9
  117. data/lib/mongoid/criteria/queryable/extensions/array.rb +7 -10
  118. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +3 -5
  119. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -4
  120. data/lib/mongoid/criteria/queryable/extensions/date.rb +2 -6
  121. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +3 -7
  122. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -4
  123. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +20 -11
  124. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +15 -11
  125. data/lib/mongoid/criteria/queryable/extensions/object.rb +7 -8
  126. data/lib/mongoid/criteria/queryable/extensions/range.rb +6 -9
  127. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +10 -12
  128. data/lib/mongoid/criteria/queryable/extensions/set.rb +4 -6
  129. data/lib/mongoid/criteria/queryable/extensions/string.rb +5 -9
  130. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -7
  131. data/lib/mongoid/criteria/queryable/extensions/time.rb +2 -6
  132. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +2 -12
  133. data/lib/mongoid/criteria/queryable/extensions.rb +18 -21
  134. data/lib/mongoid/criteria/queryable/key.rb +12 -18
  135. data/lib/mongoid/criteria/queryable/macroable.rb +0 -3
  136. data/lib/mongoid/criteria/queryable/mergeable.rb +31 -39
  137. data/lib/mongoid/criteria/queryable/optional.rb +17 -18
  138. data/lib/mongoid/criteria/queryable/options.rb +20 -9
  139. data/lib/mongoid/criteria/queryable/pipeline.rb +6 -9
  140. data/lib/mongoid/criteria/queryable/selectable.rb +131 -193
  141. data/lib/mongoid/criteria/queryable/selector.rb +20 -29
  142. data/lib/mongoid/criteria/queryable/smash.rb +1 -6
  143. data/lib/mongoid/criteria/queryable/storable.rb +20 -39
  144. data/lib/mongoid/criteria/queryable.rb +25 -15
  145. data/lib/mongoid/criteria/scopable.rb +5 -11
  146. data/lib/mongoid/criteria/translator.rb +5 -8
  147. data/lib/mongoid/criteria.rb +109 -54
  148. data/lib/mongoid/deprecable.rb +1 -4
  149. data/lib/mongoid/deprecation.rb +2 -6
  150. data/lib/mongoid/document.rb +1 -1
  151. data/lib/mongoid/encryptable.rb +1 -2
  152. data/lib/mongoid/equality.rb +4 -5
  153. data/lib/mongoid/errors/ambiguous_relationship.rb +2 -5
  154. data/lib/mongoid/errors/attribute_not_loaded.rb +1 -4
  155. data/lib/mongoid/errors/callback.rb +1 -4
  156. data/lib/mongoid/errors/create_collection_failure.rb +8 -11
  157. data/lib/mongoid/errors/criteria_argument_required.rb +2 -5
  158. data/lib/mongoid/errors/delete_restriction.rb +1 -4
  159. data/lib/mongoid/errors/document_not_destroyed.rb +1 -4
  160. data/lib/mongoid/errors/document_not_found.rb +16 -21
  161. data/lib/mongoid/errors/drop_collection_failure.rb +7 -10
  162. data/lib/mongoid/errors/empty_config_file.rb +1 -4
  163. data/lib/mongoid/errors/immutable_attribute.rb +1 -4
  164. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -4
  165. data/lib/mongoid/errors/invalid_async_query_executor.rb +2 -5
  166. data/lib/mongoid/errors/invalid_auto_encryption_configuration.rb +2 -5
  167. data/lib/mongoid/errors/invalid_collection.rb +1 -3
  168. data/lib/mongoid/errors/invalid_config_file.rb +1 -4
  169. data/lib/mongoid/errors/invalid_config_option.rb +2 -5
  170. data/lib/mongoid/errors/invalid_dependent_strategy.rb +6 -10
  171. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +2 -4
  172. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +1 -4
  173. data/lib/mongoid/errors/invalid_elem_match_operator.rb +5 -9
  174. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +1 -4
  175. data/lib/mongoid/errors/invalid_estimated_count_scoping.rb +1 -4
  176. data/lib/mongoid/errors/invalid_expression_operator.rb +3 -7
  177. data/lib/mongoid/errors/invalid_field.rb +2 -5
  178. data/lib/mongoid/errors/invalid_field_operator.rb +5 -9
  179. data/lib/mongoid/errors/invalid_field_option.rb +2 -5
  180. data/lib/mongoid/errors/invalid_field_type.rb +1 -4
  181. data/lib/mongoid/errors/invalid_find.rb +1 -4
  182. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +1 -4
  183. data/lib/mongoid/errors/invalid_includes.rb +3 -6
  184. data/lib/mongoid/errors/invalid_index.rb +1 -4
  185. data/lib/mongoid/errors/invalid_options.rb +1 -4
  186. data/lib/mongoid/errors/invalid_path.rb +1 -4
  187. data/lib/mongoid/errors/invalid_persistence_option.rb +4 -7
  188. data/lib/mongoid/errors/invalid_query.rb +6 -11
  189. data/lib/mongoid/errors/invalid_relation.rb +10 -13
  190. data/lib/mongoid/errors/invalid_relation_option.rb +4 -7
  191. data/lib/mongoid/errors/invalid_scope.rb +1 -4
  192. data/lib/mongoid/errors/invalid_session_nesting.rb +0 -3
  193. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +2 -4
  194. data/lib/mongoid/errors/invalid_storage_options.rb +1 -4
  195. data/lib/mongoid/errors/invalid_time.rb +1 -4
  196. data/lib/mongoid/errors/invalid_transaction_nesting.rb +0 -3
  197. data/lib/mongoid/errors/inverse_not_found.rb +1 -4
  198. data/lib/mongoid/errors/mixed_client_configuration.rb +1 -4
  199. data/lib/mongoid/errors/mixed_relations.rb +1 -3
  200. data/lib/mongoid/errors/mongoid_error.rb +7 -11
  201. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -4
  202. data/lib/mongoid/errors/no_client_config.rb +1 -4
  203. data/lib/mongoid/errors/no_client_database.rb +1 -4
  204. data/lib/mongoid/errors/no_client_hosts.rb +1 -4
  205. data/lib/mongoid/errors/no_clients_config.rb +1 -4
  206. data/lib/mongoid/errors/no_default_client.rb +1 -4
  207. data/lib/mongoid/errors/no_environment.rb +1 -4
  208. data/lib/mongoid/errors/no_map_reduce_output.rb +1 -4
  209. data/lib/mongoid/errors/no_metadata.rb +1 -4
  210. data/lib/mongoid/errors/no_parent.rb +1 -4
  211. data/lib/mongoid/errors/readonly_attribute.rb +1 -4
  212. data/lib/mongoid/errors/readonly_document.rb +1 -4
  213. data/lib/mongoid/errors/rollback.rb +0 -2
  214. data/lib/mongoid/errors/scope_overwrite.rb +2 -4
  215. data/lib/mongoid/errors/sessions_not_supported.rb +0 -3
  216. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -3
  217. data/lib/mongoid/errors/transaction_error.rb +0 -3
  218. data/lib/mongoid/errors/transactions_not_supported.rb +0 -3
  219. data/lib/mongoid/errors/unknown_attribute.rb +1 -4
  220. data/lib/mongoid/errors/unknown_model.rb +1 -4
  221. data/lib/mongoid/errors/unregistered_class.rb +1 -1
  222. data/lib/mongoid/errors/unsaved_document.rb +1 -3
  223. data/lib/mongoid/errors/unsupported_isolation_level.rb +22 -0
  224. data/lib/mongoid/errors/unsupported_javascript.rb +1 -4
  225. data/lib/mongoid/errors/validations.rb +3 -5
  226. data/lib/mongoid/errors.rb +72 -72
  227. data/lib/mongoid/evolvable.rb +0 -3
  228. data/lib/mongoid/extensions/array.rb +5 -7
  229. data/lib/mongoid/extensions/big_decimal.rb +6 -7
  230. data/lib/mongoid/extensions/binary.rb +3 -6
  231. data/lib/mongoid/extensions/boolean.rb +4 -7
  232. data/lib/mongoid/extensions/bson_document.rb +28 -0
  233. data/lib/mongoid/extensions/date.rb +10 -14
  234. data/lib/mongoid/extensions/date_time.rb +2 -6
  235. data/lib/mongoid/extensions/decimal128.rb +1 -5
  236. data/lib/mongoid/extensions/false_class.rb +3 -5
  237. data/lib/mongoid/extensions/float.rb +5 -10
  238. data/lib/mongoid/extensions/hash.rb +5 -10
  239. data/lib/mongoid/extensions/integer.rb +5 -10
  240. data/lib/mongoid/extensions/module.rb +1 -4
  241. data/lib/mongoid/extensions/nil_class.rb +0 -1
  242. data/lib/mongoid/extensions/object.rb +9 -14
  243. data/lib/mongoid/extensions/object_id.rb +2 -6
  244. data/lib/mongoid/extensions/range.rb +14 -15
  245. data/lib/mongoid/extensions/raw_value.rb +0 -3
  246. data/lib/mongoid/extensions/regexp.rb +3 -6
  247. data/lib/mongoid/extensions/set.rb +3 -4
  248. data/lib/mongoid/extensions/string.rb +8 -12
  249. data/lib/mongoid/extensions/symbol.rb +3 -7
  250. data/lib/mongoid/extensions/time.rb +24 -26
  251. data/lib/mongoid/extensions/time_with_zone.rb +4 -7
  252. data/lib/mongoid/extensions/true_class.rb +3 -5
  253. data/lib/mongoid/extensions.rb +26 -26
  254. data/lib/mongoid/factory.rb +5 -9
  255. data/lib/mongoid/fields/encrypted.rb +0 -1
  256. data/lib/mongoid/fields/foreign_key.rb +9 -10
  257. data/lib/mongoid/fields/localized.rb +12 -12
  258. data/lib/mongoid/fields/standard.rb +5 -7
  259. data/lib/mongoid/fields/validators/macro.rb +23 -34
  260. data/lib/mongoid/fields/validators.rb +1 -2
  261. data/lib/mongoid/fields.rb +151 -58
  262. data/lib/mongoid/findable.rb +82 -53
  263. data/lib/mongoid/indexable/specification.rb +20 -6
  264. data/lib/mongoid/indexable/validators/options.rb +33 -40
  265. data/lib/mongoid/indexable.rb +26 -25
  266. data/lib/mongoid/inspectable.rb +4 -7
  267. data/lib/mongoid/interceptable.rb +41 -40
  268. data/lib/mongoid/loadable.rb +17 -18
  269. data/lib/mongoid/loggable.rb +4 -8
  270. data/lib/mongoid/matchable.rb +0 -2
  271. data/lib/mongoid/matcher/all.rb +2 -5
  272. data/lib/mongoid/matcher/and.rb +0 -3
  273. data/lib/mongoid/matcher/bits.rb +13 -8
  274. data/lib/mongoid/matcher/bits_all_clear.rb +1 -3
  275. data/lib/mongoid/matcher/bits_all_set.rb +1 -3
  276. data/lib/mongoid/matcher/bits_any_clear.rb +1 -3
  277. data/lib/mongoid/matcher/bits_any_set.rb +1 -3
  278. data/lib/mongoid/matcher/elem_match.rb +13 -15
  279. data/lib/mongoid/matcher/elem_match_expression.rb +0 -3
  280. data/lib/mongoid/matcher/eq.rb +0 -3
  281. data/lib/mongoid/matcher/eq_impl.rb +12 -17
  282. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +4 -7
  283. data/lib/mongoid/matcher/exists.rb +1 -4
  284. data/lib/mongoid/matcher/expression.rb +5 -10
  285. data/lib/mongoid/matcher/expression_operator.rb +1 -3
  286. data/lib/mongoid/matcher/field_expression.rb +10 -13
  287. data/lib/mongoid/matcher/field_operator.rb +4 -6
  288. data/lib/mongoid/matcher/gt.rb +0 -3
  289. data/lib/mongoid/matcher/gte.rb +0 -3
  290. data/lib/mongoid/matcher/in.rb +9 -12
  291. data/lib/mongoid/matcher/lt.rb +0 -3
  292. data/lib/mongoid/matcher/lte.rb +0 -3
  293. data/lib/mongoid/matcher/mod.rb +4 -8
  294. data/lib/mongoid/matcher/ne.rb +0 -3
  295. data/lib/mongoid/matcher/nin.rb +0 -3
  296. data/lib/mongoid/matcher/nor.rb +1 -6
  297. data/lib/mongoid/matcher/not.rb +0 -3
  298. data/lib/mongoid/matcher/or.rb +0 -3
  299. data/lib/mongoid/matcher/regex.rb +11 -14
  300. data/lib/mongoid/matcher/size.rb +2 -5
  301. data/lib/mongoid/matcher/type.rb +32 -37
  302. data/lib/mongoid/matcher.rb +7 -15
  303. data/lib/mongoid/model_resolver.rb +1 -0
  304. data/lib/mongoid/persistable/creatable.rb +23 -7
  305. data/lib/mongoid/persistable/deletable.rb +6 -7
  306. data/lib/mongoid/persistable/destroyable.rb +2 -6
  307. data/lib/mongoid/persistable/incrementable.rb +1 -3
  308. data/lib/mongoid/persistable/logical.rb +3 -5
  309. data/lib/mongoid/persistable/maxable.rb +2 -4
  310. data/lib/mongoid/persistable/minable.rb +2 -4
  311. data/lib/mongoid/persistable/multipliable.rb +1 -3
  312. data/lib/mongoid/persistable/poppable.rb +2 -4
  313. data/lib/mongoid/persistable/pullable.rb +3 -5
  314. data/lib/mongoid/persistable/pushable.rb +5 -7
  315. data/lib/mongoid/persistable/renamable.rb +1 -3
  316. data/lib/mongoid/persistable/savable.rb +0 -3
  317. data/lib/mongoid/persistable/settable.rb +4 -13
  318. data/lib/mongoid/persistable/unsettable.rb +1 -3
  319. data/lib/mongoid/persistable/updatable.rb +16 -24
  320. data/lib/mongoid/persistable/upsertable.rb +8 -10
  321. data/lib/mongoid/persistable.rb +28 -27
  322. data/lib/mongoid/persistence_context.rb +34 -41
  323. data/lib/mongoid/pluckable.rb +0 -2
  324. data/lib/mongoid/positional.rb +5 -11
  325. data/lib/mongoid/railtie.rb +16 -22
  326. data/lib/mongoid/railties/console_sandbox.rb +6 -8
  327. data/lib/mongoid/railties/controller_runtime.rb +7 -11
  328. data/lib/mongoid/railties/database.rake +42 -44
  329. data/lib/mongoid/scopable.rb +23 -31
  330. data/lib/mongoid/search_indexable.rb +330 -0
  331. data/lib/mongoid/selectable.rb +1 -3
  332. data/lib/mongoid/serializable.rb +6 -8
  333. data/lib/mongoid/shardable.rb +8 -17
  334. data/lib/mongoid/stateful.rb +5 -10
  335. data/lib/mongoid/stringified_symbol.rb +5 -9
  336. data/lib/mongoid/tasks/database.rake +31 -32
  337. data/lib/mongoid/tasks/database.rb +28 -30
  338. data/lib/mongoid/tasks/encryption.rb +10 -15
  339. data/lib/mongoid/threaded/lifecycle.rb +6 -9
  340. data/lib/mongoid/threaded.rb +132 -32
  341. data/lib/mongoid/timestamps/created/short.rb +2 -3
  342. data/lib/mongoid/timestamps/created.rb +1 -2
  343. data/lib/mongoid/timestamps/short.rb +0 -1
  344. data/lib/mongoid/timestamps/timeless.rb +8 -13
  345. data/lib/mongoid/timestamps/updated/short.rb +2 -3
  346. data/lib/mongoid/timestamps/updated.rb +2 -5
  347. data/lib/mongoid/timestamps.rb +4 -6
  348. data/lib/mongoid/touchable.rb +19 -11
  349. data/lib/mongoid/traversable.rb +3 -2
  350. data/lib/mongoid/validatable/associated.rb +1 -5
  351. data/lib/mongoid/validatable/format.rb +0 -2
  352. data/lib/mongoid/validatable/length.rb +0 -2
  353. data/lib/mongoid/validatable/localizable.rb +0 -3
  354. data/lib/mongoid/validatable/macros.rb +0 -2
  355. data/lib/mongoid/validatable/numericality.rb +24 -3
  356. data/lib/mongoid/validatable/presence.rb +8 -10
  357. data/lib/mongoid/validatable/queryable.rb +0 -3
  358. data/lib/mongoid/validatable/uniqueness.rb +12 -14
  359. data/lib/mongoid/validatable.rb +15 -20
  360. data/lib/mongoid/version.rb +1 -1
  361. data/lib/mongoid/warnings.rb +10 -11
  362. data/lib/mongoid.rb +30 -34
  363. data/lib/rails/generators/mongoid/config/config_generator.rb +2 -4
  364. data/lib/rails/generators/mongoid/config/templates/mongoid.rb +4 -5
  365. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +2 -2
  366. data/lib/rails/generators/mongoid/model/model_generator.rb +5 -8
  367. data/lib/rails/generators/mongoid_generator.rb +6 -10
  368. data/lib/rails/mongoid.rb +1 -3
  369. data/spec/integration/active_job_spec.rb +1 -2
  370. data/spec/integration/app_spec.rb +142 -178
  371. data/spec/integration/associations/belongs_to_spec.rb +30 -28
  372. data/spec/integration/associations/embedded_dirty_spec.rb +0 -1
  373. data/spec/integration/associations/embedded_spec.rb +41 -43
  374. data/spec/integration/associations/embeds_many_spec.rb +46 -29
  375. data/spec/integration/associations/embeds_one_spec.rb +2 -1
  376. data/spec/integration/associations/foreign_key_spec.rb +10 -11
  377. data/spec/integration/associations/foreign_key_spec_models.rb +8 -9
  378. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +16 -13
  379. data/spec/integration/associations/has_many_spec.rb +17 -18
  380. data/spec/integration/associations/has_one_spec.rb +42 -45
  381. data/spec/integration/associations/nested_attributes_assignment_spec.rb +36 -39
  382. data/spec/integration/associations/reverse_population_spec.rb +4 -5
  383. data/spec/integration/associations/reverse_population_spec_models.rb +0 -1
  384. data/spec/integration/associations/scope_option_spec.rb +18 -20
  385. data/spec/integration/atomic/modifiers_spec.rb +72 -52
  386. data/spec/integration/bson_regexp_raw_spec.rb +2 -3
  387. data/spec/integration/caching_spec.rb +68 -0
  388. data/spec/integration/callbacks_models.rb +11 -9
  389. data/spec/integration/callbacks_spec.rb +78 -80
  390. data/spec/integration/contextual/empty_spec.rb +19 -20
  391. data/spec/integration/criteria/alias_query_spec.rb +12 -19
  392. data/spec/integration/criteria/date_field_spec.rb +1 -2
  393. data/spec/integration/criteria/default_scope_spec.rb +23 -18
  394. data/spec/integration/criteria/logical_spec.rb +18 -19
  395. data/spec/integration/criteria/range_spec.rb +77 -86
  396. data/spec/integration/criteria/raw_value_spec.rb +122 -109
  397. data/spec/integration/criteria/time_with_zone_spec.rb +33 -24
  398. data/spec/integration/discriminator_key_spec.rb +85 -85
  399. data/spec/integration/discriminator_value_spec.rb +70 -73
  400. data/spec/integration/document_spec.rb +9 -10
  401. data/spec/integration/dots_and_dollars_spec.rb +104 -119
  402. data/spec/integration/encryption_spec.rb +8 -11
  403. data/spec/integration/i18n_fallbacks_spec.rb +7 -8
  404. data/spec/integration/isolation_state_spec.rb +241 -0
  405. data/spec/integration/matcher_examples_spec.rb +145 -168
  406. data/spec/integration/matcher_operator_data/in.yml +6 -6
  407. data/spec/integration/matcher_operator_spec.rb +16 -26
  408. data/spec/integration/matcher_spec.rb +31 -32
  409. data/spec/integration/persistence/collection_options_spec.rb +0 -2
  410. data/spec/integration/persistence/range_field_spec.rb +24 -2
  411. data/spec/integration/server_query_spec.rb +43 -37
  412. data/spec/integration/shardable_spec.rb +10 -11
  413. data/spec/integration/stringified_symbol_field_spec.rb +28 -43
  414. data/spec/lite_spec_helper.rb +11 -12
  415. data/spec/mongoid/association/accessors_spec.rb +197 -285
  416. data/spec/mongoid/association/auto_save_spec.rb +62 -93
  417. data/spec/mongoid/association/builders_spec.rb +121 -74
  418. data/spec/mongoid/association/constrainable_spec.rb +9 -22
  419. data/spec/mongoid/association/counter_cache_spec.rb +71 -104
  420. data/spec/mongoid/association/depending_spec.rb +166 -208
  421. data/spec/mongoid/association/eager_spec.rb +416 -80
  422. data/spec/mongoid/association/embedded/cyclic_spec.rb +36 -48
  423. data/spec/mongoid/association/embedded/dirty_spec.rb +15 -20
  424. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +36 -54
  425. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +8 -15
  426. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +135 -175
  427. data/spec/mongoid/association/embedded/embedded_in_spec.rb +25 -127
  428. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +9 -14
  429. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +38 -51
  430. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +1151 -1340
  431. data/spec/mongoid/association/embedded/embeds_many_models.rb +17 -17
  432. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +11 -11
  433. data/spec/mongoid/association/embedded/embeds_many_spec.rb +25 -138
  434. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +15 -23
  435. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +18 -26
  436. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +204 -273
  437. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +0 -1
  438. data/spec/mongoid/association/embedded/embeds_one_models.rb +0 -1
  439. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +5 -6
  440. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -143
  441. data/spec/mongoid/association/macros_spec.rb +213 -300
  442. data/spec/mongoid/association/nested/many_spec.rb +51 -73
  443. data/spec/mongoid/association/nested/one_spec.rb +56 -80
  444. data/spec/mongoid/association/options_spec.rb +187 -310
  445. data/spec/mongoid/association/polymorphic_spec.rb +35 -53
  446. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +55 -76
  447. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +36 -41
  448. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +81 -101
  449. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +258 -345
  450. data/spec/mongoid/association/referenced/belongs_to_models.rb +4 -3
  451. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +3 -4
  452. data/spec/mongoid/association/referenced/belongs_to_spec.rb +91 -294
  453. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +42 -56
  454. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +41 -32
  455. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +36 -42
  456. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +8 -9
  457. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +771 -975
  458. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +9 -9
  459. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +5 -6
  460. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +59 -177
  461. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +29 -43
  462. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +53 -53
  463. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +104 -67
  464. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +431 -675
  465. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +1 -2
  466. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +173 -11
  467. data/spec/mongoid/association/referenced/has_many_models.rb +1 -2
  468. data/spec/mongoid/association/referenced/has_many_query_spec.rb +3 -4
  469. data/spec/mongoid/association/referenced/has_many_spec.rb +44 -188
  470. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +26 -38
  471. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +28 -29
  472. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +29 -42
  473. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +270 -332
  474. data/spec/mongoid/association/referenced/has_one_models.rb +1 -2
  475. data/spec/mongoid/association/referenced/has_one_query_spec.rb +3 -4
  476. data/spec/mongoid/association/referenced/has_one_spec.rb +40 -188
  477. data/spec/mongoid/association/reflections_spec.rb +14 -24
  478. data/spec/mongoid/association/syncable_spec.rb +102 -125
  479. data/spec/mongoid/association_spec.rb +47 -70
  480. data/spec/mongoid/atomic/modifiers_spec.rb +184 -197
  481. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +39 -52
  482. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +35 -49
  483. data/spec/mongoid/atomic/paths/root_spec.rb +9 -15
  484. data/spec/mongoid/atomic/paths_spec.rb +81 -117
  485. data/spec/mongoid/atomic_spec.rb +156 -171
  486. data/spec/mongoid/attributes/dynamic_spec.rb +5 -6
  487. data/spec/mongoid/attributes/nested_spec.rb +1219 -1692
  488. data/spec/mongoid/attributes/nested_spec_models.rb +8 -9
  489. data/spec/mongoid/attributes/projector_spec.rb +2 -6
  490. data/spec/mongoid/attributes/readonly_spec.rb +73 -97
  491. data/spec/mongoid/attributes_spec.rb +669 -826
  492. data/spec/mongoid/cacheable_spec.rb +74 -44
  493. data/spec/mongoid/changeable_spec.rb +591 -733
  494. data/spec/mongoid/clients/factory_spec.rb +122 -154
  495. data/spec/mongoid/clients/options_spec.rb +40 -59
  496. data/spec/mongoid/clients/sessions_spec.rb +25 -44
  497. data/spec/mongoid/clients/transactions_spec.rb +33 -50
  498. data/spec/mongoid/clients/transactions_spec_models.rb +3 -4
  499. data/spec/mongoid/clients_spec.rb +265 -355
  500. data/spec/mongoid/collection_configurable_spec.rb +9 -12
  501. data/spec/mongoid/composable_spec.rb +2 -9
  502. data/spec/mongoid/config/defaults_spec.rb +24 -31
  503. data/spec/mongoid/config/encryption_spec.rb +54 -57
  504. data/spec/mongoid/config/environment_spec.rb +30 -40
  505. data/spec/mongoid/config/introspection_spec.rb +42 -37
  506. data/spec/mongoid/config/options_spec.rb +14 -21
  507. data/spec/mongoid/config_spec.rb +145 -195
  508. data/spec/mongoid/contextual/aggregable/memory_spec.rb +98 -135
  509. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +4 -7
  510. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +149 -187
  511. data/spec/mongoid/contextual/aggregable/none_spec.rb +14 -16
  512. data/spec/mongoid/contextual/atomic_spec.rb +223 -271
  513. data/spec/mongoid/contextual/map_reduce_spec.rb +110 -138
  514. data/spec/mongoid/contextual/memory_spec.rb +706 -854
  515. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +12 -13
  516. data/spec/mongoid/contextual/mongo_spec.rb +1008 -1213
  517. data/spec/mongoid/contextual/none_spec.rb +54 -59
  518. data/spec/mongoid/contextual/short_circuit_spec.rb +139 -0
  519. data/spec/mongoid/copyable_spec.rb +254 -300
  520. data/spec/mongoid/copyable_spec_models.rb +0 -1
  521. data/spec/mongoid/criteria/findable_spec.rb +322 -387
  522. data/spec/mongoid/criteria/includable_spec.rb +421 -372
  523. data/spec/mongoid/criteria/includable_spec_models.rb +16 -7
  524. data/spec/mongoid/criteria/inspectable_spec.rb +11 -14
  525. data/spec/mongoid/criteria/marshalable_spec.rb +11 -14
  526. data/spec/mongoid/criteria/modifiable_spec.rb +366 -512
  527. data/spec/mongoid/criteria/options_spec.rb +2 -7
  528. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +112 -141
  529. data/spec/mongoid/criteria/queryable/expandable_spec.rb +8 -11
  530. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +127 -184
  531. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +123 -60
  532. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +84 -117
  533. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +44 -65
  534. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +86 -108
  535. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +94 -33
  536. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +103 -138
  537. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +95 -34
  538. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +25 -38
  539. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +26 -28
  540. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +32 -54
  541. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +136 -130
  542. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +16 -24
  543. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +15 -24
  544. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +12 -19
  545. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +46 -63
  546. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +28 -42
  547. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +73 -96
  548. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +71 -92
  549. data/spec/mongoid/criteria/queryable/key_spec.rb +32 -36
  550. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +44 -49
  551. data/spec/mongoid/criteria/queryable/optional_spec.rb +373 -486
  552. data/spec/mongoid/criteria/queryable/options_spec.rb +172 -123
  553. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +65 -87
  554. data/spec/mongoid/criteria/queryable/queryable_spec.rb +41 -53
  555. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +576 -680
  556. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +7 -11
  557. data/spec/mongoid/criteria/queryable/selectable_spec.rb +807 -998
  558. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +154 -191
  559. data/spec/mongoid/criteria/queryable/selector_spec.rb +294 -390
  560. data/spec/mongoid/criteria/queryable/smash_spec.rb +6 -11
  561. data/spec/mongoid/criteria/queryable/storable_spec.rb +54 -81
  562. data/spec/mongoid/criteria/queryable_mql_spec.rb +92 -0
  563. data/spec/mongoid/criteria/scopable_spec.rb +102 -138
  564. data/spec/mongoid/criteria/translator_spec.rb +59 -60
  565. data/spec/mongoid/criteria_projection_spec.rb +81 -99
  566. data/spec/mongoid/criteria_spec.rb +935 -950
  567. data/spec/mongoid/document_fields_spec.rb +28 -30
  568. data/spec/mongoid/document_persistence_context_spec.rb +13 -15
  569. data/spec/mongoid/document_query_spec.rb +9 -12
  570. data/spec/mongoid/document_spec.rb +317 -409
  571. data/spec/mongoid/equality_spec.rb +69 -102
  572. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +8 -11
  573. data/spec/mongoid/errors/attribute_not_loaded_spec.rb +7 -10
  574. data/spec/mongoid/errors/callback_spec.rb +8 -11
  575. data/spec/mongoid/errors/delete_restriction_spec.rb +5 -8
  576. data/spec/mongoid/errors/document_not_destroyed_spec.rb +7 -10
  577. data/spec/mongoid/errors/document_not_found_spec.rb +51 -61
  578. data/spec/mongoid/errors/invalid_collection_spec.rb +9 -13
  579. data/spec/mongoid/errors/invalid_config_file_spec.rb +8 -11
  580. data/spec/mongoid/errors/invalid_config_option_spec.rb +8 -11
  581. data/spec/mongoid/errors/invalid_field_option_spec.rb +7 -10
  582. data/spec/mongoid/errors/invalid_field_spec.rb +10 -11
  583. data/spec/mongoid/errors/invalid_field_type_spec.rb +9 -12
  584. data/spec/mongoid/errors/invalid_find_spec.rb +8 -11
  585. data/spec/mongoid/errors/invalid_includes_spec.rb +9 -13
  586. data/spec/mongoid/errors/invalid_index_spec.rb +8 -11
  587. data/spec/mongoid/errors/invalid_options_spec.rb +8 -11
  588. data/spec/mongoid/errors/invalid_path_spec.rb +7 -10
  589. data/spec/mongoid/errors/invalid_relation_spec.rb +15 -16
  590. data/spec/mongoid/errors/invalid_scope_spec.rb +8 -11
  591. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -6
  592. data/spec/mongoid/errors/invalid_storage_options_spec.rb +8 -11
  593. data/spec/mongoid/errors/invalid_time_spec.rb +8 -11
  594. data/spec/mongoid/errors/inverse_not_found_spec.rb +9 -12
  595. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +9 -12
  596. data/spec/mongoid/errors/mixed_relations_spec.rb +8 -11
  597. data/spec/mongoid/errors/mongoid_error_spec.rb +21 -24
  598. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +6 -9
  599. data/spec/mongoid/errors/no_client_config_spec.rb +7 -10
  600. data/spec/mongoid/errors/no_client_database_spec.rb +9 -12
  601. data/spec/mongoid/errors/no_client_hosts_spec.rb +9 -12
  602. data/spec/mongoid/errors/no_clients_config_spec.rb +7 -10
  603. data/spec/mongoid/errors/no_environment_spec.rb +8 -11
  604. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +8 -11
  605. data/spec/mongoid/errors/no_metadata_spec.rb +7 -10
  606. data/spec/mongoid/errors/no_parent_spec.rb +7 -10
  607. data/spec/mongoid/errors/readonly_attribute_spec.rb +7 -10
  608. data/spec/mongoid/errors/readonly_document_spec.rb +6 -9
  609. data/spec/mongoid/errors/scope_overwrite_spec.rb +9 -12
  610. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +9 -12
  611. data/spec/mongoid/errors/unknown_attribute_spec.rb +5 -8
  612. data/spec/mongoid/errors/unsaved_document_spec.rb +8 -11
  613. data/spec/mongoid/errors/unsupported_javascript_spec.rb +9 -12
  614. data/spec/mongoid/errors/validations_spec.rb +11 -14
  615. data/spec/mongoid/extensions/array_spec.rb +70 -92
  616. data/spec/mongoid/extensions/big_decimal_spec.rb +233 -313
  617. data/spec/mongoid/extensions/binary_spec.rb +21 -32
  618. data/spec/mongoid/extensions/boolean_spec.rb +52 -75
  619. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +43 -54
  620. data/spec/mongoid/extensions/date_spec.rb +26 -38
  621. data/spec/mongoid/extensions/date_time_spec.rb +22 -32
  622. data/spec/mongoid/extensions/decimal128_spec.rb +12 -18
  623. data/spec/mongoid/extensions/false_class_spec.rb +10 -17
  624. data/spec/mongoid/extensions/float_spec.rb +40 -61
  625. data/spec/mongoid/extensions/hash_spec.rb +46 -64
  626. data/spec/mongoid/extensions/integer_spec.rb +40 -61
  627. data/spec/mongoid/extensions/module_spec.rb +13 -18
  628. data/spec/mongoid/extensions/nil_class_spec.rb +2 -5
  629. data/spec/mongoid/extensions/object_id_spec.rb +159 -247
  630. data/spec/mongoid/extensions/object_spec.rb +31 -47
  631. data/spec/mongoid/extensions/range_spec.rb +112 -115
  632. data/spec/mongoid/extensions/raw_value_spec.rb +10 -12
  633. data/spec/mongoid/extensions/regexp_spec.rb +23 -36
  634. data/spec/mongoid/extensions/set_spec.rb +38 -49
  635. data/spec/mongoid/extensions/string_spec.rb +118 -167
  636. data/spec/mongoid/extensions/stringified_symbol_spec.rb +29 -43
  637. data/spec/mongoid/extensions/symbol_spec.rb +12 -20
  638. data/spec/mongoid/extensions/time_spec.rb +160 -202
  639. data/spec/mongoid/extensions/time_with_zone_spec.rb +79 -105
  640. data/spec/mongoid/extensions/true_class_spec.rb +10 -17
  641. data/spec/mongoid/factory_spec.rb +125 -148
  642. data/spec/mongoid/fields/foreign_key_spec.rb +124 -169
  643. data/spec/mongoid/fields/localized_spec.rb +140 -185
  644. data/spec/mongoid/fields/standard_spec.rb +43 -59
  645. data/spec/mongoid/fields_spec.rb +751 -620
  646. data/spec/mongoid/findable_spec.rb +260 -228
  647. data/spec/mongoid/indexable/specification_spec.rb +42 -58
  648. data/spec/mongoid/indexable_spec.rb +260 -264
  649. data/spec/mongoid/inspectable_spec.rb +45 -55
  650. data/spec/mongoid/interceptable_spec.rb +784 -922
  651. data/spec/mongoid/interceptable_spec_models.rb +35 -35
  652. data/spec/mongoid/loading_spec.rb +47 -43
  653. data/spec/mongoid/loggable_spec.rb +3 -6
  654. data/spec/mongoid/matcher/extract_attribute_spec.rb +2 -6
  655. data/spec/mongoid/mongoizable_spec.rb +81 -90
  656. data/spec/mongoid/monkey_patches_spec.rb +4 -0
  657. data/spec/mongoid/persistable/creatable_spec.rb +181 -220
  658. data/spec/mongoid/persistable/deletable_spec.rb +139 -179
  659. data/spec/mongoid/persistable/destroyable_spec.rb +135 -164
  660. data/spec/mongoid/persistable/incrementable_spec.rb +65 -84
  661. data/spec/mongoid/persistable/logical_spec.rb +48 -61
  662. data/spec/mongoid/persistable/maxable_spec.rb +45 -44
  663. data/spec/mongoid/persistable/minable_spec.rb +45 -44
  664. data/spec/mongoid/persistable/multipliable_spec.rb +54 -69
  665. data/spec/mongoid/persistable/poppable_spec.rb +47 -60
  666. data/spec/mongoid/persistable/pullable_spec.rb +79 -103
  667. data/spec/mongoid/persistable/pushable_spec.rb +106 -131
  668. data/spec/mongoid/persistable/renamable_spec.rb +52 -65
  669. data/spec/mongoid/persistable/savable_spec.rb +152 -189
  670. data/spec/mongoid/persistable/settable_spec.rb +121 -145
  671. data/spec/mongoid/persistable/unsettable_spec.rb +56 -73
  672. data/spec/mongoid/persistable/updatable_spec.rb +185 -232
  673. data/spec/mongoid/persistable/upsertable_spec.rb +66 -77
  674. data/spec/mongoid/persistable_spec.rb +132 -139
  675. data/spec/mongoid/persistence_context_spec.rb +31 -89
  676. data/spec/mongoid/positional_spec.rb +67 -79
  677. data/spec/mongoid/railties/bson_object_id_serializer_spec.rb +0 -3
  678. data/spec/mongoid/railties/console_sandbox_spec.rb +0 -1
  679. data/spec/mongoid/relations/proxy_spec.rb +0 -1
  680. data/spec/mongoid/reloadable_spec.rb +250 -145
  681. data/spec/mongoid/scopable_spec.rb +319 -398
  682. data/spec/mongoid/search_indexable_spec.rb +446 -41
  683. data/spec/mongoid/selectable_spec.rb +36 -51
  684. data/spec/mongoid/serializable_spec.rb +269 -312
  685. data/spec/mongoid/shardable_models.rb +5 -5
  686. data/spec/mongoid/shardable_spec.rb +44 -46
  687. data/spec/mongoid/stateful_spec.rb +55 -75
  688. data/spec/mongoid/tasks/database_rake_spec.rb +138 -141
  689. data/spec/mongoid/tasks/database_spec.rb +80 -80
  690. data/spec/mongoid/tasks/encryption_spec.rb +22 -20
  691. data/spec/mongoid/threaded_spec.rb +57 -83
  692. data/spec/mongoid/timestamps/created/short_spec.rb +12 -16
  693. data/spec/mongoid/timestamps/created_spec.rb +16 -20
  694. data/spec/mongoid/timestamps/timeless_spec.rb +31 -43
  695. data/spec/mongoid/timestamps/updated/short_spec.rb +21 -28
  696. data/spec/mongoid/timestamps/updated_spec.rb +18 -25
  697. data/spec/mongoid/timestamps_spec.rb +171 -188
  698. data/spec/mongoid/timestamps_spec_models.rb +12 -13
  699. data/spec/mongoid/touchable_spec.rb +330 -294
  700. data/spec/mongoid/touchable_spec_models.rb +35 -37
  701. data/spec/mongoid/traversable_spec.rb +435 -471
  702. data/spec/mongoid/validatable/associated_spec.rb +42 -60
  703. data/spec/mongoid/validatable/format_spec.rb +24 -34
  704. data/spec/mongoid/validatable/length_spec.rb +62 -86
  705. data/spec/mongoid/validatable/numericality_spec.rb +114 -23
  706. data/spec/mongoid/validatable/presence_spec.rb +149 -203
  707. data/spec/mongoid/validatable/uniqueness_spec.rb +632 -830
  708. data/spec/mongoid/validatable_spec.rb +71 -103
  709. data/spec/mongoid/warnings_spec.rb +5 -9
  710. data/spec/mongoid_spec.rb +25 -41
  711. data/spec/rails/controller_extension/controller_runtime_spec.rb +45 -49
  712. data/spec/rails/mongoid_spec.rb +15 -15
  713. data/spec/shared/lib/mrss/cluster_config.rb +5 -40
  714. data/spec/shared/lib/mrss/constraints.rb +7 -46
  715. data/spec/shared/lib/mrss/docker_runner.rb +10 -21
  716. data/spec/shared/lib/mrss/eg_config_utils.rb +0 -31
  717. data/spec/shared/lib/mrss/release/candidate.rb +18 -12
  718. data/spec/shared/lib/mrss/server_version_registry.rb +1 -5
  719. data/spec/shared/share/Dockerfile.erb +6 -8
  720. data/spec/shared/shlib/server.sh +0 -50
  721. data/spec/shared/shlib/set_env.sh +4 -10
  722. data/spec/spec_helper.rb +54 -31
  723. data/spec/support/authorization.rb +0 -1
  724. data/spec/support/client_registry.rb +1 -2
  725. data/spec/support/constraints.rb +8 -25
  726. data/spec/support/crypt/models.rb +7 -8
  727. data/spec/support/crypt.rb +6 -9
  728. data/spec/support/expectations.rb +21 -7
  729. data/spec/support/feature_sandbox.rb +1 -4
  730. data/spec/support/helpers.rb +0 -1
  731. data/spec/support/immutable_ids.rb +20 -21
  732. data/spec/support/macros.rb +1 -3
  733. data/spec/support/models/account.rb +4 -5
  734. data/spec/support/models/acolyte.rb +5 -5
  735. data/spec/support/models/actor.rb +3 -3
  736. data/spec/support/models/actress.rb +0 -1
  737. data/spec/support/models/address.rb +11 -11
  738. data/spec/support/models/address_component.rb +1 -1
  739. data/spec/support/models/address_number.rb +1 -1
  740. data/spec/support/models/agency.rb +1 -1
  741. data/spec/support/models/agent.rb +1 -1
  742. data/spec/support/models/album.rb +1 -2
  743. data/spec/support/models/alert.rb +1 -1
  744. data/spec/support/models/animal.rb +4 -5
  745. data/spec/support/models/answer.rb +1 -1
  746. data/spec/support/models/appointment.rb +2 -2
  747. data/spec/support/models/armrest.rb +0 -1
  748. data/spec/support/models/array_field.rb +0 -1
  749. data/spec/support/models/article.rb +0 -1
  750. data/spec/support/models/artist.rb +16 -12
  751. data/spec/support/models/artwork.rb +1 -1
  752. data/spec/support/models/audible_sound.rb +0 -1
  753. data/spec/support/models/audio.rb +2 -2
  754. data/spec/support/models/augmentation.rb +1 -2
  755. data/spec/support/models/author.rb +1 -1
  756. data/spec/support/models/baby.rb +1 -1
  757. data/spec/support/models/band.rb +0 -1
  758. data/spec/support/models/bar.rb +2 -2
  759. data/spec/support/models/basic.rb +0 -1
  760. data/spec/support/models/bed.rb +0 -1
  761. data/spec/support/models/big_palette.rb +0 -1
  762. data/spec/support/models/birthday.rb +3 -5
  763. data/spec/support/models/bolt.rb +0 -1
  764. data/spec/support/models/bomb.rb +1 -1
  765. data/spec/support/models/book.rb +1 -1
  766. data/spec/support/models/breed.rb +1 -1
  767. data/spec/support/models/browser.rb +1 -2
  768. data/spec/support/models/building.rb +0 -1
  769. data/spec/support/models/building_address.rb +1 -1
  770. data/spec/support/models/bus.rb +1 -1
  771. data/spec/support/models/business.rb +2 -2
  772. data/spec/support/models/callback_test.rb +1 -1
  773. data/spec/support/models/canvas.rb +5 -6
  774. data/spec/support/models/car.rb +0 -1
  775. data/spec/support/models/cat.rb +0 -2
  776. data/spec/support/models/catalog.rb +0 -1
  777. data/spec/support/models/category.rb +1 -1
  778. data/spec/support/models/child.rb +1 -1
  779. data/spec/support/models/child_doc.rb +5 -6
  780. data/spec/support/models/church.rb +1 -1
  781. data/spec/support/models/circle.rb +0 -1
  782. data/spec/support/models/circuit.rb +2 -2
  783. data/spec/support/models/circus.rb +0 -1
  784. data/spec/support/models/code.rb +2 -1
  785. data/spec/support/models/coding/pull_request.rb +0 -1
  786. data/spec/support/models/coding.rb +0 -1
  787. data/spec/support/models/comment.rb +0 -1
  788. data/spec/support/models/company.rb +0 -1
  789. data/spec/support/models/consumption_period.rb +0 -1
  790. data/spec/support/models/contextable_item.rb +1 -1
  791. data/spec/support/models/contractor.rb +1 -1
  792. data/spec/support/models/cookie.rb +0 -1
  793. data/spec/support/models/country_code.rb +2 -3
  794. data/spec/support/models/courier_job.rb +2 -2
  795. data/spec/support/models/cover.rb +0 -1
  796. data/spec/support/models/crate.rb +0 -1
  797. data/spec/support/models/customer.rb +0 -1
  798. data/spec/support/models/customer_address.rb +0 -1
  799. data/spec/support/models/deed.rb +1 -1
  800. data/spec/support/models/definition.rb +1 -1
  801. data/spec/support/models/delegating_patient.rb +0 -1
  802. data/spec/support/models/description.rb +0 -1
  803. data/spec/support/models/dictionary.rb +1 -1
  804. data/spec/support/models/division.rb +2 -2
  805. data/spec/support/models/doctor.rb +0 -1
  806. data/spec/support/models/dog.rb +2 -2
  807. data/spec/support/models/dokument.rb +1 -1
  808. data/spec/support/models/draft.rb +0 -1
  809. data/spec/support/models/dragon.rb +1 -1
  810. data/spec/support/models/driver.rb +2 -2
  811. data/spec/support/models/drug.rb +1 -1
  812. data/spec/support/models/dungeon.rb +1 -1
  813. data/spec/support/models/edit.rb +1 -1
  814. data/spec/support/models/email.rb +1 -1
  815. data/spec/support/models/employer.rb +1 -2
  816. data/spec/support/models/entry.rb +1 -1
  817. data/spec/support/models/eraser.rb +0 -1
  818. data/spec/support/models/even.rb +1 -1
  819. data/spec/support/models/event.rb +3 -4
  820. data/spec/support/models/exhibition.rb +1 -1
  821. data/spec/support/models/exhibitor.rb +1 -1
  822. data/spec/support/models/explosion.rb +1 -1
  823. data/spec/support/models/eye.rb +0 -1
  824. data/spec/support/models/eye_bowl.rb +2 -3
  825. data/spec/support/models/face.rb +2 -3
  826. data/spec/support/models/fanatic.rb +1 -1
  827. data/spec/support/models/favorite.rb +1 -1
  828. data/spec/support/models/filesystem.rb +1 -1
  829. data/spec/support/models/fire_hydrant.rb +1 -1
  830. data/spec/support/models/firefox.rb +0 -1
  831. data/spec/support/models/fish.rb +0 -1
  832. data/spec/support/models/folder.rb +0 -2
  833. data/spec/support/models/folder_item.rb +1 -3
  834. data/spec/support/models/fruits.rb +9 -5
  835. data/spec/support/models/game.rb +3 -4
  836. data/spec/support/models/ghost.rb +0 -1
  837. data/spec/support/models/guitar.rb +0 -1
  838. data/spec/support/models/hole.rb +0 -1
  839. data/spec/support/models/home.rb +1 -1
  840. data/spec/support/models/house.rb +2 -2
  841. data/spec/support/models/html_writer.rb +0 -1
  842. data/spec/support/models/id_key.rb +3 -3
  843. data/spec/support/models/idnodef.rb +0 -1
  844. data/spec/support/models/image.rb +0 -1
  845. data/spec/support/models/implant.rb +1 -2
  846. data/spec/support/models/instrument.rb +2 -3
  847. data/spec/support/models/item.rb +2 -2
  848. data/spec/support/models/jar.rb +1 -2
  849. data/spec/support/models/kaleidoscope.rb +1 -1
  850. data/spec/support/models/kangaroo.rb +1 -1
  851. data/spec/support/models/label.rb +2 -2
  852. data/spec/support/models/language.rb +1 -1
  853. data/spec/support/models/lat_lng.rb +0 -1
  854. data/spec/support/models/league.rb +1 -1
  855. data/spec/support/models/learner.rb +0 -1
  856. data/spec/support/models/line_item.rb +1 -1
  857. data/spec/support/models/location.rb +1 -1
  858. data/spec/support/models/login.rb +1 -2
  859. data/spec/support/models/manufacturer.rb +0 -1
  860. data/spec/support/models/meat.rb +1 -1
  861. data/spec/support/models/membership.rb +1 -1
  862. data/spec/support/models/message.rb +1 -2
  863. data/spec/support/models/minim.rb +0 -1
  864. data/spec/support/models/mixed_drink.rb +1 -1
  865. data/spec/support/models/modifier_models.rb +25 -0
  866. data/spec/support/models/mop.rb +0 -1
  867. data/spec/support/models/movie.rb +1 -1
  868. data/spec/support/models/my_hash.rb +1 -2
  869. data/spec/support/models/name.rb +4 -5
  870. data/spec/support/models/name_only.rb +0 -1
  871. data/spec/support/models/node.rb +1 -1
  872. data/spec/support/models/note.rb +3 -3
  873. data/spec/support/models/nut.rb +0 -1
  874. data/spec/support/models/odd.rb +1 -1
  875. data/spec/support/models/order.rb +1 -1
  876. data/spec/support/models/ordered_post.rb +1 -1
  877. data/spec/support/models/ordered_preference.rb +1 -1
  878. data/spec/support/models/oscar.rb +1 -1
  879. data/spec/support/models/other_owner_object.rb +0 -1
  880. data/spec/support/models/override.rb +3 -11
  881. data/spec/support/models/ownable.rb +1 -1
  882. data/spec/support/models/owner.rb +1 -1
  883. data/spec/support/models/pack.rb +0 -1
  884. data/spec/support/models/page.rb +3 -3
  885. data/spec/support/models/page_question.rb +1 -1
  886. data/spec/support/models/palette.rb +2 -2
  887. data/spec/support/models/parent.rb +2 -2
  888. data/spec/support/models/parent_doc.rb +1 -1
  889. data/spec/support/models/passport.rb +0 -1
  890. data/spec/support/models/patient.rb +2 -2
  891. data/spec/support/models/pdf_writer.rb +0 -1
  892. data/spec/support/models/pencil.rb +0 -1
  893. data/spec/support/models/person.rb +32 -28
  894. data/spec/support/models/pet.rb +1 -1
  895. data/spec/support/models/pet_owner.rb +1 -1
  896. data/spec/support/models/phone.rb +1 -2
  897. data/spec/support/models/piano.rb +0 -1
  898. data/spec/support/models/pizza.rb +1 -1
  899. data/spec/support/models/player.rb +5 -5
  900. data/spec/support/models/post.rb +12 -12
  901. data/spec/support/models/post_genre.rb +1 -1
  902. data/spec/support/models/powerup.rb +1 -2
  903. data/spec/support/models/preference.rb +2 -2
  904. data/spec/support/models/princess.rb +1 -1
  905. data/spec/support/models/product.rb +3 -3
  906. data/spec/support/models/profile.rb +2 -1
  907. data/spec/support/models/pronunciation.rb +1 -1
  908. data/spec/support/models/pub.rb +2 -2
  909. data/spec/support/models/publication/encyclopedia.rb +0 -1
  910. data/spec/support/models/publication/review.rb +0 -1
  911. data/spec/support/models/publication.rb +0 -1
  912. data/spec/support/models/purchase.rb +1 -1
  913. data/spec/support/models/purchased_item.rb +1 -1
  914. data/spec/support/models/question.rb +2 -2
  915. data/spec/support/models/quiz.rb +1 -1
  916. data/spec/support/models/rating.rb +1 -1
  917. data/spec/support/models/record.rb +2 -3
  918. data/spec/support/models/registry.rb +1 -1
  919. data/spec/support/models/role.rb +1 -1
  920. data/spec/support/models/root_category.rb +1 -1
  921. data/spec/support/models/sandbox/app/models/app_models_message.rb +0 -1
  922. data/spec/support/models/sandbox/lib/models/lib_models_message.rb +0 -1
  923. data/spec/support/models/sandbox/sandbox_message.rb +0 -1
  924. data/spec/support/models/sandbox/sandbox_user.rb +0 -1
  925. data/spec/support/models/sandbox/subdir/sandbox_comment.rb +0 -1
  926. data/spec/support/models/sandwich.rb +1 -1
  927. data/spec/support/models/scheduler.rb +0 -1
  928. data/spec/support/models/school.rb +0 -1
  929. data/spec/support/models/scribe.rb +1 -1
  930. data/spec/support/models/sealer.rb +0 -1
  931. data/spec/support/models/seat.rb +0 -1
  932. data/spec/support/models/seo.rb +1 -1
  933. data/spec/support/models/series.rb +1 -1
  934. data/spec/support/models/server.rb +1 -1
  935. data/spec/support/models/service.rb +2 -2
  936. data/spec/support/models/shape.rb +3 -3
  937. data/spec/support/models/shelf.rb +1 -1
  938. data/spec/support/models/shield.rb +2 -2
  939. data/spec/support/models/shipment_address.rb +0 -1
  940. data/spec/support/models/shipping_container.rb +1 -1
  941. data/spec/support/models/shipping_pack.rb +0 -1
  942. data/spec/support/models/shirt.rb +0 -1
  943. data/spec/support/models/shop.rb +2 -2
  944. data/spec/support/models/short_agent.rb +0 -1
  945. data/spec/support/models/short_quiz.rb +1 -1
  946. data/spec/support/models/simple.rb +1 -1
  947. data/spec/support/models/slave.rb +1 -1
  948. data/spec/support/models/song.rb +1 -2
  949. data/spec/support/models/sound.rb +2 -2
  950. data/spec/support/models/spacer.rb +0 -1
  951. data/spec/support/models/square.rb +0 -1
  952. data/spec/support/models/staff.rb +0 -1
  953. data/spec/support/models/store_as_dup_test1.rb +2 -2
  954. data/spec/support/models/store_as_dup_test2.rb +1 -1
  955. data/spec/support/models/store_as_dup_test3.rb +2 -2
  956. data/spec/support/models/store_as_dup_test4.rb +1 -1
  957. data/spec/support/models/strategy.rb +0 -1
  958. data/spec/support/models/student.rb +1 -2
  959. data/spec/support/models/sub_item.rb +0 -1
  960. data/spec/support/models/subscription.rb +2 -2
  961. data/spec/support/models/survey.rb +2 -2
  962. data/spec/support/models/symptom.rb +2 -2
  963. data/spec/support/models/system_role.rb +2 -3
  964. data/spec/support/models/tag.rb +2 -2
  965. data/spec/support/models/target.rb +1 -1
  966. data/spec/support/models/template.rb +1 -1
  967. data/spec/support/models/thing.rb +1 -1
  968. data/spec/support/models/threadlocker.rb +0 -1
  969. data/spec/support/models/title.rb +0 -1
  970. data/spec/support/models/tool.rb +3 -3
  971. data/spec/support/models/topping.rb +1 -1
  972. data/spec/support/models/toy.rb +0 -1
  973. data/spec/support/models/track.rb +1 -1
  974. data/spec/support/models/translation.rb +1 -1
  975. data/spec/support/models/tree.rb +2 -3
  976. data/spec/support/models/truck.rb +0 -1
  977. data/spec/support/models/updatable.rb +0 -1
  978. data/spec/support/models/user.rb +3 -4
  979. data/spec/support/models/user_account.rb +3 -3
  980. data/spec/support/models/validation_callback.rb +4 -4
  981. data/spec/support/models/vehicle.rb +2 -3
  982. data/spec/support/models/version.rb +1 -1
  983. data/spec/support/models/vertex.rb +0 -1
  984. data/spec/support/models/vet_visit.rb +1 -1
  985. data/spec/support/models/video.rb +2 -2
  986. data/spec/support/models/video_game.rb +0 -1
  987. data/spec/support/models/washer.rb +0 -1
  988. data/spec/support/models/weapon.rb +1 -2
  989. data/spec/support/models/wiki_page.rb +2 -3
  990. data/spec/support/models/word.rb +2 -2
  991. data/spec/support/models/word_origin.rb +1 -2
  992. data/spec/support/models/writer.rb +3 -3
  993. data/spec/support/rails_mock.rb +7 -12
  994. data/spec/support/shared/time.rb +0 -1
  995. data/spec/support/sinatra_mock.rb +4 -2
  996. data/spec/support/spec_config.rb +19 -18
  997. metadata +14 -2
@@ -1,35 +1,30 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
- require "spec_helper"
3
+ require 'spec_helper'
5
4
 
6
5
  describe Mongoid::Indexable do
7
-
8
6
  after do
9
7
  Person.collection.drop
10
8
  end
11
9
 
12
- describe ".included" do
13
-
10
+ describe '.included' do
14
11
  let(:klass) do
15
12
  Class.new do
16
13
  include Mongoid::Indexable
17
14
  end
18
15
  end
19
16
 
20
- it "adds an index_specifications accessor" do
17
+ it 'adds an index_specifications accessor' do
21
18
  expect(klass).to respond_to(:index_specifications)
22
19
  end
23
20
 
24
- it "defaults index_specifications to empty array" do
21
+ it 'defaults index_specifications to empty array' do
25
22
  expect(klass.index_specifications).to be_empty
26
23
  end
27
24
  end
28
25
 
29
- describe ".remove_indexes" do
30
-
31
- context "when no database specific options exist" do
32
-
26
+ describe '.remove_indexes' do
27
+ context 'when no database specific options exist' do
33
28
  let(:klass) do
34
29
  Person
35
30
  end
@@ -43,47 +38,45 @@ describe Mongoid::Indexable do
43
38
  klass.remove_indexes
44
39
  end
45
40
 
46
- it "removes the indexes" do
47
- expect(collection.indexes.reject{ |doc| doc["name"] == "_id_" }).to be_empty
41
+ it 'removes the indexes' do
42
+ expect(collection.indexes.reject { |doc| doc['name'] == '_id_' }).to be_empty
48
43
  end
49
44
  end
50
45
 
51
- context "when database specific options exist" do
52
-
46
+ context 'when database specific options exist' do
53
47
  let(:klass) do
54
48
  Class.new do
55
49
  include Mongoid::Document
56
- store_in collection: "test_db_remove"
57
- index({ test: 1 }, { database: "mongoid_optional" })
50
+
51
+ store_in collection: 'test_db_remove'
52
+ index({ test: 1 }, { database: 'mongoid_optional' })
58
53
  index({ name: 1 }, { background: true })
59
54
  end
60
55
  end
56
+ let(:indexes) do
57
+ klass.with(database: 'mongoid_optional') do |klass|
58
+ klass.collection.indexes
59
+ end
60
+ end
61
61
 
62
62
  before do
63
63
  klass.create_indexes
64
64
  klass.remove_indexes
65
65
  end
66
66
 
67
- let(:indexes) do
68
- klass.with(database: "mongoid_optional") do |klass|
69
- klass.collection.indexes
70
- end
71
- end
72
-
73
- it "creates the indexes" do
74
- expect(indexes.reject{ |doc| doc["name"] == "_id_" }).to be_empty
67
+ it 'creates the indexes' do
68
+ expect(indexes.reject { |doc| doc['name'] == '_id_' }).to be_empty
75
69
  end
76
70
  end
77
71
  end
78
72
 
79
- describe ".create_indexes" do
80
-
81
- context "when no database options are specified" do
82
-
73
+ describe '.create_indexes' do
74
+ context 'when no database options are specified' do
83
75
  let(:klass) do
84
76
  Class.new do
85
77
  include Mongoid::Document
86
- store_in collection: "test_class"
78
+
79
+ store_in collection: 'test_class'
87
80
  index({ _type: 1 }, unique: false, background: true)
88
81
  end
89
82
  end
@@ -92,36 +85,35 @@ describe Mongoid::Indexable do
92
85
  klass.create_indexes
93
86
  end
94
87
 
95
- it "creates the indexes by using specified background option" do
88
+ it 'creates the indexes by using specified background option' do
96
89
  index = klass.collection.indexes.get(_type: 1)
97
90
  expect(index[:background]).to eq(true)
98
91
  end
99
92
  end
100
93
 
101
- context "when database options are specified" do
102
-
94
+ context 'when database options are specified' do
103
95
  let(:klass) do
104
96
  Class.new do
105
97
  include Mongoid::Document
106
- store_in collection: "test_db_indexes"
107
- index({ _type: 1 }, { database: "mongoid_optional" })
108
- end
109
- end
110
98
 
111
- after do
112
- klass.remove_indexes
99
+ store_in collection: 'test_db_indexes'
100
+ index({ _type: 1 }, { database: 'mongoid_optional' })
101
+ end
113
102
  end
114
-
115
103
  let(:indexes) do
116
- klass.with(database: "mongoid_optional") do |klass|
104
+ klass.with(database: 'mongoid_optional') do |klass|
117
105
  klass.collection.indexes
118
106
  end
119
107
  end
120
108
 
121
- context "when the background_indexing option is false" do
109
+ after do
110
+ klass.remove_indexes
111
+ end
112
+
113
+ context 'when the background_indexing option is false' do
122
114
  config_override :background_indexing, false
123
115
 
124
- it "creates the indexes correctly" do
116
+ it 'creates the indexes correctly' do
125
117
  klass.create_indexes
126
118
 
127
119
  index = indexes.get(_type: 1)
@@ -129,11 +121,10 @@ describe Mongoid::Indexable do
129
121
  end
130
122
  end
131
123
 
132
- context "when the background_indexing option is true" do
124
+ context 'when the background_indexing option is true' do
133
125
  config_override :background_indexing, true
134
126
 
135
- it "creates the indexes correctly" do
136
-
127
+ it 'creates the indexes correctly' do
137
128
  klass.create_indexes
138
129
 
139
130
  index = indexes.get(_type: 1)
@@ -142,16 +133,20 @@ describe Mongoid::Indexable do
142
133
  end
143
134
  end
144
135
 
145
- context "when a collation option is specified" do
136
+ context 'when a collation option is specified' do
146
137
  min_server_version '3.4'
147
138
 
148
139
  let(:klass) do
149
140
  Class.new do
150
141
  include Mongoid::Document
151
- store_in collection: "test_db_indexes"
152
- index({ name: 1 }, { collation: { locale: 'en_US', strength: 2 }})
142
+
143
+ store_in collection: 'test_db_indexes'
144
+ index({ name: 1 }, { collation: { locale: 'en_US', strength: 2 } })
153
145
  end
154
146
  end
147
+ let(:indexes) do
148
+ klass.collection.indexes
149
+ end
155
150
 
156
151
  before do
157
152
  klass.create_indexes
@@ -161,72 +156,65 @@ describe Mongoid::Indexable do
161
156
  klass.remove_indexes
162
157
  end
163
158
 
164
- let(:indexes) do
165
- klass.collection.indexes
166
- end
167
-
168
- it "creates the indexes" do
169
- expect(indexes.get("name_1")["collation"]).to_not be_nil
170
- expect(indexes.get("name_1")["collation"]["locale"]).to eq('en_US')
159
+ it 'creates the indexes' do
160
+ expect(indexes.get('name_1')['collation']).not_to be_nil
161
+ expect(indexes.get('name_1')['collation']['locale']).to eq('en_US')
171
162
  end
172
163
  end
173
164
  end
174
165
 
175
- describe ".add_indexes" do
176
-
177
- context "when indexes have not been added" do
178
-
166
+ describe '.add_indexes' do
167
+ context 'when indexes have not been added' do
179
168
  let(:klass) do
180
169
  Class.new do
181
170
  include Mongoid::Document
171
+
182
172
  def self.hereditary?
183
173
  true
184
174
  end
185
175
  end
186
176
  end
177
+ let(:spec) do
178
+ klass.index_specification(_type: 1)
179
+ end
187
180
 
188
181
  before do
189
182
  klass.add_indexes
190
183
  end
191
184
 
192
- let(:spec) do
193
- klass.index_specification(_type: 1)
194
- end
195
-
196
- it "adds the _type index" do
185
+ it 'adds the _type index' do
197
186
  expect(spec.options).to eq(unique: false, background: true)
198
187
  end
199
188
  end
200
189
 
201
- context "when using a custom discriminator_key" do
202
- context "when indexes have not been added" do
190
+ context 'when using a custom discriminator_key' do
191
+ context 'when indexes have not been added' do
203
192
  let(:klass) do
204
193
  Class.new do
205
194
  include Mongoid::Document
206
- self.discriminator_key = "dkey"
195
+
196
+ self.discriminator_key = 'dkey'
207
197
  def self.hereditary?
208
198
  true
209
199
  end
210
200
  end
211
201
  end
202
+ let(:spec) do
203
+ klass.index_specification(dkey: 1)
204
+ end
212
205
 
213
206
  before do
214
207
  klass.add_indexes
215
208
  end
216
209
 
217
- let(:spec) do
218
- klass.index_specification(dkey: 1)
219
- end
220
-
221
- it "adds the _type index" do
210
+ it 'adds the _type index' do
222
211
  expect(spec.options).to eq(unique: false, background: true)
223
212
  end
224
213
  end
225
214
  end
226
215
  end
227
216
 
228
- describe ".index" do
229
-
217
+ describe '.index' do
230
218
  let(:klass) do
231
219
  Class.new do
232
220
  include Mongoid::Document
@@ -246,8 +234,7 @@ describe Mongoid::Indexable do
246
234
  klass.collection.drop
247
235
  end
248
236
 
249
- context "when indexing a field that is aliased" do
250
-
237
+ context 'when indexing a field that is aliased' do
251
238
  before do
252
239
  klass.index({ authentication_token: 1 }, unique: true)
253
240
  end
@@ -256,13 +243,12 @@ describe Mongoid::Indexable do
256
243
  klass.index_specification(a: 1).options
257
244
  end
258
245
 
259
- it "sets the index with unique options" do
246
+ it 'sets the index with unique options' do
260
247
  expect(options).to eq(unique: true)
261
248
  end
262
249
  end
263
250
 
264
- context "when indexing a field that is embedded" do
265
-
251
+ context 'when indexing a field that is embedded' do
266
252
  before do
267
253
  klass.index({ 'addresses.house' => 1 }, unique: true)
268
254
  end
@@ -271,13 +257,12 @@ describe Mongoid::Indexable do
271
257
  klass.index_specification('adrs.h': 1).options
272
258
  end
273
259
 
274
- it "sets the index with unique options" do
260
+ it 'sets the index with unique options' do
275
261
  expect(options).to eq(unique: true)
276
262
  end
277
263
  end
278
264
 
279
- context "when providing unique options" do
280
-
265
+ context 'when providing unique options' do
281
266
  before do
282
267
  klass.index({ name: 1 }, unique: true)
283
268
  end
@@ -286,13 +271,12 @@ describe Mongoid::Indexable do
286
271
  klass.index_specification(name: 1).options
287
272
  end
288
273
 
289
- it "sets the index with unique options" do
274
+ it 'sets the index with unique options' do
290
275
  expect(options).to eq(unique: true)
291
276
  end
292
277
  end
293
278
 
294
- context "when providing a sparse option" do
295
-
279
+ context 'when providing a sparse option' do
296
280
  before do
297
281
  klass.index({ name: 1 }, sparse: true)
298
282
  end
@@ -301,43 +285,40 @@ describe Mongoid::Indexable do
301
285
  klass.index_specification(name: 1).options
302
286
  end
303
287
 
304
- it "sets the index with sparse options" do
288
+ it 'sets the index with sparse options' do
305
289
  expect(options).to eq(sparse: true)
306
290
  end
307
291
  end
308
292
 
309
- context "when providing a name option" do
310
-
293
+ context 'when providing a name option' do
311
294
  before do
312
- klass.index({ name: 1 }, name: "index_name")
295
+ klass.index({ name: 1 }, name: 'index_name')
313
296
  end
314
297
 
315
298
  let(:options) do
316
299
  klass.index_specification(name: 1).options
317
300
  end
318
301
 
319
- it "sets the index with name options" do
320
- expect(options).to eq(name: "index_name")
302
+ it 'sets the index with name options' do
303
+ expect(options).to eq(name: 'index_name')
321
304
  end
322
305
  end
323
306
 
324
- context "when providing database options" do
325
-
307
+ context 'when providing database options' do
326
308
  before do
327
- klass.index({ name: 1 }, database: "mongoid_index_alt")
309
+ klass.index({ name: 1 }, database: 'mongoid_index_alt')
328
310
  end
329
311
 
330
312
  let(:options) do
331
313
  klass.index_specification(name: 1).options
332
314
  end
333
315
 
334
- it "sets the index with background options" do
335
- expect(options).to eq(database: "mongoid_index_alt")
316
+ it 'sets the index with background options' do
317
+ expect(options).to eq(database: 'mongoid_index_alt')
336
318
  end
337
319
  end
338
320
 
339
- context "when providing a background option" do
340
-
321
+ context 'when providing a background option' do
341
322
  before do
342
323
  klass.index({ name: 1 }, background: true)
343
324
  end
@@ -346,12 +327,12 @@ describe Mongoid::Indexable do
346
327
  klass.index_specification(name: 1).options
347
328
  end
348
329
 
349
- it "sets the index with background options" do
330
+ it 'sets the index with background options' do
350
331
  expect(options).to eq(background: true)
351
332
  end
352
333
  end
353
334
 
354
- context "when providing a collation option" do
335
+ context 'when providing a collation option' do
355
336
  min_server_version '3.4'
356
337
 
357
338
  before do
@@ -362,13 +343,12 @@ describe Mongoid::Indexable do
362
343
  klass.index_specification(name: 1).options
363
344
  end
364
345
 
365
- it "sets the index with a collation option" do
346
+ it 'sets the index with a collation option' do
366
347
  expect(options).to eq(collation: { locale: 'en_US', strength: 2 })
367
348
  end
368
349
  end
369
350
 
370
- context "when providing a compound index" do
371
-
351
+ context 'when providing a compound index' do
372
352
  before do
373
353
  klass.index({ name: 1, title: -1 })
374
354
  end
@@ -377,13 +357,12 @@ describe Mongoid::Indexable do
377
357
  klass.index_specification(name: 1, title: -1).options
378
358
  end
379
359
 
380
- it "sets the compound key index" do
360
+ it 'sets the compound key index' do
381
361
  expect(options).to be_empty
382
362
  end
383
363
  end
384
364
 
385
- context "when providing multiple inverse compound indexes" do
386
-
365
+ context 'when providing multiple inverse compound indexes' do
387
366
  before do
388
367
  klass.index({ name: 1, title: -1 })
389
368
  klass.index({ title: -1, name: 1 })
@@ -397,13 +376,12 @@ describe Mongoid::Indexable do
397
376
  klass.index_specification(title: -1, name: 1)
398
377
  end
399
378
 
400
- it "does not overwrite the index options" do
401
- expect(first_spec).to_not eq(second_spec)
379
+ it 'does not overwrite the index options' do
380
+ expect(first_spec).not_to eq(second_spec)
402
381
  end
403
382
  end
404
383
 
405
- context "when providing multiple compound indexes with different order" do
406
-
384
+ context 'when providing multiple compound indexes with different order' do
407
385
  before do
408
386
  klass.index({ name: 1, title: -1 })
409
387
  klass.index({ name: 1, title: 1 })
@@ -417,193 +395,179 @@ describe Mongoid::Indexable do
417
395
  klass.index_specification(name: 1, title: 1)
418
396
  end
419
397
 
420
- it "does not overwrite the index options" do
421
- expect(first_spec).to_not eq(second_spec)
398
+ it 'does not overwrite the index options' do
399
+ expect(first_spec).not_to eq(second_spec)
422
400
  end
423
401
  end
424
402
 
425
- context "when providing a geospatial index" do
426
-
403
+ context 'when providing a geospatial index' do
427
404
  before do
428
- klass.index({ location: "2d" }, { min: -200, max: 200, bits: 32 })
405
+ klass.index({ location: '2d' }, { min: -200, max: 200, bits: 32 })
429
406
  end
430
407
 
431
408
  let(:options) do
432
- klass.index_specification(location: "2d").options
409
+ klass.index_specification(location: '2d').options
433
410
  end
434
411
 
435
- it "sets the geospatial index" do
412
+ it 'sets the geospatial index' do
436
413
  expect(options).to eq({ min: -200, max: 200, bits: 32 })
437
414
  end
438
415
  end
439
416
 
440
- context "when providing a geo haystack index with a bucket_size" do
441
-
417
+ context 'when providing a geo haystack index with a bucket_size' do
442
418
  before do
443
- klass.index({ location: "geoHaystack" }, { min: -200, max: 200, bucket_size: 0.5 })
419
+ klass.index({ location: 'geoHaystack' }, { min: -200, max: 200, bucket_size: 0.5 })
444
420
  end
445
421
 
446
422
  let(:options) do
447
- klass.index_specification(location: "geoHaystack").options
423
+ klass.index_specification(location: 'geoHaystack').options
448
424
  end
449
425
 
450
- it "sets the geo haystack index with the bucket_size option" do
426
+ it 'sets the geo haystack index with the bucket_size option' do
451
427
  expect(options).to eq({ min: -200, max: 200, bucket_size: 0.5 })
452
428
  end
453
429
  end
454
430
 
455
- context "when providing a geo haystack index with a bucket_size" do
456
-
431
+ context 'when providing a geo haystack index with a bucket_size' do
457
432
  let(:message) do
458
433
  'The geoHaystack type is deprecated.'
459
434
  end
460
435
 
461
- it "logs a deprecation warning" do
436
+ it 'logs a deprecation warning' do
462
437
  expect(Mongoid::Warnings).to receive(:warn_geo_haystack_deprecated)
463
- klass.index({ location: "geoHaystack" }, { min: -200, max: 200, bucket_size: 0.5 })
438
+ klass.index({ location: 'geoHaystack' }, { min: -200, max: 200, bucket_size: 0.5 })
464
439
  end
465
440
  end
466
441
 
467
- context "when providing a Spherical Geospatial index" do
468
-
442
+ context 'when providing a Spherical Geospatial index' do
469
443
  before do
470
- klass.index({ location: "2dsphere" })
444
+ klass.index({ location: '2dsphere' })
471
445
  end
472
446
 
473
447
  let(:options) do
474
- klass.index_specification(location: "2dsphere").options
448
+ klass.index_specification(location: '2dsphere').options
475
449
  end
476
450
 
477
- it "sets the spherical geospatial index" do
451
+ it 'sets the spherical geospatial index' do
478
452
  expect(options).to be_empty
479
453
  end
480
454
  end
481
455
 
482
- context "when providing a text index" do
483
-
484
- context "when the index is a single field" do
485
-
456
+ context 'when providing a text index' do
457
+ context 'when the index is a single field' do
486
458
  before do
487
- klass.index({ description: "text" })
459
+ klass.index({ description: 'text' })
488
460
  end
489
461
 
490
462
  let(:options) do
491
- klass.index_specification(description: "text").options
463
+ klass.index_specification(description: 'text').options
492
464
  end
493
465
 
494
- it "allows the set of the text index" do
466
+ it 'allows the set of the text index' do
495
467
  expect(options).to be_empty
496
468
  end
497
469
  end
498
470
 
499
- context "when the index is multiple fields" do
500
-
471
+ context 'when the index is multiple fields' do
501
472
  before do
502
- klass.index({ description: "text", name: "text" })
473
+ klass.index({ description: 'text', name: 'text' })
503
474
  end
504
475
 
505
476
  let(:options) do
506
- klass.index_specification(description: "text", name: "text").options
477
+ klass.index_specification(description: 'text', name: 'text').options
507
478
  end
508
479
 
509
- it "allows the set of the text index" do
480
+ it 'allows the set of the text index' do
510
481
  expect(options).to be_empty
511
482
  end
512
483
  end
513
484
 
514
- context "when the index is all string fields" do
515
-
485
+ context 'when the index is all string fields' do
516
486
  before do
517
- klass.index({ "$**" => "text" })
487
+ klass.index({ '$**' => 'text' })
518
488
  end
519
489
 
520
490
  let(:options) do
521
- klass.index_specification(:"$**" => "text").options
491
+ klass.index_specification('$**': 'text').options
522
492
  end
523
493
 
524
- it "allows the set of the text index" do
494
+ it 'allows the set of the text index' do
525
495
  expect(options).to be_empty
526
496
  end
527
497
  end
528
498
 
529
- context "when providing a default language" do
530
-
499
+ context 'when providing a default language' do
531
500
  before do
532
- klass.index({ description: "text" }, default_language: "english")
501
+ klass.index({ description: 'text' }, default_language: 'english')
533
502
  end
534
503
 
535
504
  let(:options) do
536
- klass.index_specification(description: "text").options
505
+ klass.index_specification(description: 'text').options
537
506
  end
538
507
 
539
- it "allows the set of the text index" do
540
- expect(options).to eq(default_language: "english")
508
+ it 'allows the set of the text index' do
509
+ expect(options).to eq(default_language: 'english')
541
510
  end
542
511
  end
543
512
 
544
- context "when providing a name" do
545
-
513
+ context 'when providing a name' do
546
514
  before do
547
- klass.index({ description: "text" }, name: "text_index")
515
+ klass.index({ description: 'text' }, name: 'text_index')
548
516
  end
549
517
 
550
518
  let(:options) do
551
- klass.index_specification(description: "text").options
519
+ klass.index_specification(description: 'text').options
552
520
  end
553
521
 
554
- it "allows the set of the text index" do
555
- expect(options).to eq(name: "text_index")
522
+ it 'allows the set of the text index' do
523
+ expect(options).to eq(name: 'text_index')
556
524
  end
557
525
  end
558
526
  end
559
527
 
560
- context "when providing a hashed index" do
561
-
528
+ context 'when providing a hashed index' do
562
529
  before do
563
- klass.index({ a: "hashed" })
530
+ klass.index({ a: 'hashed' })
564
531
  end
565
532
 
566
533
  let(:options) do
567
- klass.index_specification(a: "hashed").options
534
+ klass.index_specification(a: 'hashed').options
568
535
  end
569
536
 
570
- it "sets the hashed index" do
537
+ it 'sets the hashed index' do
571
538
  expect(options).to be_empty
572
539
  end
573
540
  end
574
541
 
575
- context "when providing a text index" do
576
-
542
+ context 'when providing a text index' do
577
543
  before do
578
- klass.index({ content: "text" })
544
+ klass.index({ content: 'text' })
579
545
  end
580
546
 
581
547
  let(:options) do
582
- klass.index_specification(content: "text").options
548
+ klass.index_specification(content: 'text').options
583
549
  end
584
550
 
585
- it "sets the text index" do
551
+ it 'sets the text index' do
586
552
  expect(options).to be_empty
587
553
  end
588
554
  end
589
555
 
590
- context "when providing a compound text index" do
591
-
556
+ context 'when providing a compound text index' do
592
557
  before do
593
- klass.index({ content: "text", title: "text" }, { weights: { content: 1, title: 2 } })
558
+ klass.index({ content: 'text', title: 'text' }, { weights: { content: 1, title: 2 } })
594
559
  end
595
560
 
596
561
  let(:options) do
597
- klass.index_specification(content: "text", title: "text").options
562
+ klass.index_specification(content: 'text', title: 'text').options
598
563
  end
599
564
 
600
- it "sets the compound text index" do
565
+ it 'sets the compound text index' do
601
566
  expect(options).to eq(weights: { content: 1, title: 2 })
602
567
  end
603
568
  end
604
569
 
605
- context "when providing an expire_after_seconds option" do
606
-
570
+ context 'when providing an expire_after_seconds option' do
607
571
  before do
608
572
  klass.index({ name: 1 }, { expire_after_seconds: 3600 })
609
573
  end
@@ -612,15 +576,13 @@ describe Mongoid::Indexable do
612
576
  klass.index_specification(name: 1).options
613
577
  end
614
578
 
615
- it "sets the index with expire_after option" do
579
+ it 'sets the index with expire_after option' do
616
580
  expect(options).to eq(expire_after: 3600)
617
581
  end
618
582
  end
619
583
 
620
- context "when using partial_filter_expression option" do
621
-
584
+ context 'when using partial_filter_expression option' do
622
585
  context 'when not using an alias' do
623
-
624
586
  before do
625
587
  klass.index({ authentication_token: 1 }, partial_filter_expression: { username: { '$exists' => true } })
626
588
  end
@@ -629,28 +591,27 @@ describe Mongoid::Indexable do
629
591
  klass.index_specification(a: 1).options
630
592
  end
631
593
 
632
- it "sets the index with correct options" do
594
+ it 'sets the index with correct options' do
633
595
  expect(options).to eq(partial_filter_expression: { username: { '$exists' => true } })
634
596
  end
635
597
  end
636
598
 
637
599
  context 'when using an alias via field :as option' do
638
-
639
600
  before do
640
- klass.index({ authentication_token: 1 }, partial_filter_expression: { authentication_token: { '$exists' => true } })
601
+ klass.index({ authentication_token: 1 },
602
+ partial_filter_expression: { authentication_token: { '$exists' => true } })
641
603
  end
642
604
 
643
605
  let(:options) do
644
606
  klass.index_specification(a: 1).options
645
607
  end
646
608
 
647
- it "sets the index with correct options" do
609
+ it 'sets the index with correct options' do
648
610
  expect(options).to eq(partial_filter_expression: { a: { '$exists' => true } })
649
611
  end
650
612
  end
651
613
 
652
614
  context 'when using an alias via alias_attribute' do
653
-
654
615
  before do
655
616
  klass.index({ u: 1 }, partial_filter_expression: { u: { '$exists' => true } })
656
617
  end
@@ -659,22 +620,22 @@ describe Mongoid::Indexable do
659
620
  klass.index_specification(username: 1).options
660
621
  end
661
622
 
662
- it "sets the index with correct options" do
623
+ it 'sets the index with correct options' do
663
624
  expect(options).to eq(partial_filter_expression: { username: { '$exists' => true } })
664
625
  end
665
626
  end
666
627
 
667
628
  context 'when using an embedded field' do
668
-
669
629
  before do
670
- klass.index({ authentication_token: 1 }, partial_filter_expression: { 'addresses.house' => { '$exists' => true } })
630
+ klass.index({ authentication_token: 1 },
631
+ partial_filter_expression: { 'addresses.house' => { '$exists' => true } })
671
632
  end
672
633
 
673
634
  let(:options) do
674
635
  klass.index_specification(a: 1).options
675
636
  end
676
637
 
677
- it "sets the index with correct options" do
638
+ it 'sets the index with correct options' do
678
639
  expect(options).to eq(partial_filter_expression: { 'adrs.h': { '$exists' => true } })
679
640
  end
680
641
  end
@@ -688,25 +649,23 @@ describe Mongoid::Indexable do
688
649
  ]
689
650
  }
690
651
  end
691
-
692
- before do
693
- klass.index({ authentication_token: 1 }, partial_filter_expression: partial_filter_expression)
694
- end
695
-
696
652
  let(:options) do
697
653
  klass.index_specification(a: 1).options
698
654
  end
699
-
700
655
  let(:expected) do
701
656
  {
702
657
  '$and': [
703
- { 'a': { '$gte' => 0 } },
704
- { 'a': { '$type' => 16 } }
658
+ { a: { '$gte' => 0 } },
659
+ { a: { '$type' => 16 } }
705
660
  ]
706
661
  }
707
662
  end
708
663
 
709
- it "resolves alias on $and option" do
664
+ before do
665
+ klass.index({ authentication_token: 1 }, partial_filter_expression: partial_filter_expression)
666
+ end
667
+
668
+ it 'resolves alias on $and option' do
710
669
  expect(options[:partial_filter_expression]).to eq(expected)
711
670
  end
712
671
  end
@@ -718,15 +677,9 @@ describe Mongoid::Indexable do
718
677
  'addresses.house' => { '$exists' => true }
719
678
  }
720
679
  end
721
-
722
- before do
723
- klass.index({ authentication_token: 1 }, partial_filter_expression: partial_filter_expression)
724
- end
725
-
726
680
  let(:options) do
727
681
  klass.index_specification(a: 1).options
728
682
  end
729
-
730
683
  let(:expected) do
731
684
  {
732
685
  username: { '$eq' => 'authentication_token' },
@@ -734,7 +687,11 @@ describe Mongoid::Indexable do
734
687
  }
735
688
  end
736
689
 
737
- it "preserves other operators" do
690
+ before do
691
+ klass.index({ authentication_token: 1 }, partial_filter_expression: partial_filter_expression)
692
+ end
693
+
694
+ it 'preserves other operators' do
738
695
  expect(options[:partial_filter_expression]).to eq(expected)
739
696
  end
740
697
  end
@@ -750,27 +707,25 @@ describe Mongoid::Indexable do
750
707
  ]
751
708
  }
752
709
  end
753
-
754
- before do
755
- klass.index({ authentication_token: 1 }, partial_filter_expression: partial_filter_expression)
756
- end
757
-
758
710
  let(:options) do
759
711
  klass.index_specification(a: 1).options
760
712
  end
761
-
762
713
  let(:expected) do
763
714
  {
764
715
  username: { '$eq' => 'authentication_token' },
765
716
  'adrs.h': { '$exists' => true },
766
717
  '$and': [
767
- { 'a': { '$gte' => 0 } },
768
- { 'a': { '$type' => 16 } }
718
+ { a: { '$gte' => 0 } },
719
+ { a: { '$type' => 16 } }
769
720
  ]
770
721
  }
771
722
  end
772
723
 
773
- it "resolves aliases on $ operators" do
724
+ before do
725
+ klass.index({ authentication_token: 1 }, partial_filter_expression: partial_filter_expression)
726
+ end
727
+
728
+ it 'resolves aliases on $ operators' do
774
729
  expect(options[:partial_filter_expression]).to eq(expected)
775
730
  end
776
731
  end
@@ -779,53 +734,49 @@ describe Mongoid::Indexable do
779
734
  let(:partial_filter_expression) do
780
735
  {
781
736
  '$foo' => {
782
- '$eq' => [{
737
+ '$eq' => [ {
783
738
  '$bar' => {
784
739
  '$and' => [
785
740
  { 'authentication_token' => { '$gte' => { 'aliased_timestamp' => 16 } } },
786
741
  { 'authentication_token' => { 'aliased_timestamp' => 16 } },
787
- { 'addresses.house' => { 'authentication_token' => [{ 'aliased_timestamp' => 16 }] } }
742
+ { 'addresses.house' => { 'authentication_token' => [ { 'aliased_timestamp' => 16 } ] } }
788
743
  ]
789
744
  }
790
- }]
745
+ } ]
791
746
  }
792
747
  }
793
748
  end
794
-
795
- before do
796
- klass.index({ authentication_token: 1 }, partial_filter_expression: partial_filter_expression)
797
- end
798
-
799
749
  let(:options) do
800
750
  klass.index_specification(a: 1).options
801
751
  end
802
-
803
752
  let(:expected) do
804
753
  {
805
754
  '$foo': {
806
- '$eq': [{
755
+ '$eq': [ {
807
756
  '$bar': {
808
757
  '$and': [
809
758
  { a: { '$gte' => { 'aliased_timestamp' => 16 } } },
810
759
  { a: { 'aliased_timestamp' => 16 } },
811
- { 'adrs.h': { 'authentication_token' => [{ 'aliased_timestamp' => 16 }] } }
760
+ { 'adrs.h': { 'authentication_token' => [ { 'aliased_timestamp' => 16 } ] } }
812
761
  ]
813
762
  }
814
- }]
763
+ } ]
815
764
  }
816
765
  }
817
766
  end
818
767
 
819
- it "resolves aliases recursively only on $ operators" do
768
+ before do
769
+ klass.index({ authentication_token: 1 }, partial_filter_expression: partial_filter_expression)
770
+ end
771
+
772
+ it 'resolves aliases recursively only on $ operators' do
820
773
  expect(options[:partial_filter_expression]).to eq(expected)
821
774
  end
822
775
  end
823
776
  end
824
777
 
825
- context "when using weights option" do
826
-
778
+ context 'when using weights option' do
827
779
  context 'when not using aliases' do
828
-
829
780
  before do
830
781
  klass.index({ authentication_token: 1 }, weights: { a: 1, username: 2 })
831
782
  end
@@ -834,13 +785,12 @@ describe Mongoid::Indexable do
834
785
  klass.index_specification(a: 1).options
835
786
  end
836
787
 
837
- it "sets the index with correct options" do
788
+ it 'sets the index with correct options' do
838
789
  expect(options).to eq(weights: { a: 1, username: 2 })
839
790
  end
840
791
  end
841
792
 
842
793
  context 'when using aliases via field :as option' do
843
-
844
794
  before do
845
795
  klass.index({ authentication_token: 1 }, weights: { 'addresses.house' => 1, authentication_token: 2 })
846
796
  end
@@ -849,13 +799,12 @@ describe Mongoid::Indexable do
849
799
  klass.index_specification(a: 1).options
850
800
  end
851
801
 
852
- it "sets the index with correct options" do
802
+ it 'sets the index with correct options' do
853
803
  expect(options).to eq(weights: { 'adrs.h': 1, a: 2 })
854
804
  end
855
805
  end
856
806
 
857
807
  context 'when using aliases via alias_attribute' do
858
-
859
808
  before do
860
809
  klass.index({ u: 1 }, weights: { 'addresses.n' => 1, u: 2 })
861
810
  end
@@ -864,16 +813,14 @@ describe Mongoid::Indexable do
864
813
  klass.index_specification(username: 1).options
865
814
  end
866
815
 
867
- it "sets the index with correct options" do
816
+ it 'sets the index with correct options' do
868
817
  expect(options).to eq(weights: { 'adrs.name': 1, username: 2 })
869
818
  end
870
819
  end
871
820
  end
872
821
 
873
- context "when using wildcard indexes" do
874
-
822
+ context 'when using wildcard indexes' do
875
823
  context 'when not using an alias' do
876
-
877
824
  before do
878
825
  klass.index({ '$**': 1 }, wildcard_projection: { _id: 1, username: 0 })
879
826
  end
@@ -882,17 +829,16 @@ describe Mongoid::Indexable do
882
829
  klass.index_specification('$**': 1)
883
830
  end
884
831
 
885
- it "creates the index" do
832
+ it 'creates the index' do
886
833
  expect(spec).to be_a(Mongoid::Indexable::Specification)
887
834
  end
888
835
 
889
- it "sets the index with correct options" do
836
+ it 'sets the index with correct options' do
890
837
  expect(spec.options).to eq(wildcard_projection: { _id: 1, username: 0 })
891
838
  end
892
839
  end
893
840
 
894
841
  context 'when using an alias via field :as option' do
895
-
896
842
  before do
897
843
  klass.index({ 'addresses.$**': 1 }, wildcard_projection: { 'addresses.house' => 1 })
898
844
  end
@@ -901,17 +847,16 @@ describe Mongoid::Indexable do
901
847
  klass.index_specification('adrs.$**': 1)
902
848
  end
903
849
 
904
- it "creates the index" do
850
+ it 'creates the index' do
905
851
  expect(spec).to be_a(Mongoid::Indexable::Specification)
906
852
  end
907
853
 
908
- it "sets the index with correct options" do
854
+ it 'sets the index with correct options' do
909
855
  expect(spec.options).to eq(wildcard_projection: { 'adrs.h': 1 })
910
856
  end
911
857
  end
912
858
 
913
859
  context 'when using aliases via alias_attribute' do
914
-
915
860
  before do
916
861
  klass.index({ 'addresses.$**': 1 }, wildcard_projection: { 'addresses.n' => 1 })
917
862
  end
@@ -920,42 +865,93 @@ describe Mongoid::Indexable do
920
865
  klass.index_specification('adrs.$**': 1)
921
866
  end
922
867
 
923
- it "creates the index" do
868
+ it 'creates the index' do
924
869
  expect(spec).to be_a(Mongoid::Indexable::Specification)
925
870
  end
926
871
 
927
- it "sets the index with correct options" do
872
+ it 'sets the index with correct options' do
928
873
  expect(spec.options).to eq(wildcard_projection: { 'adrs.name': 1 })
929
874
  end
930
875
  end
931
876
  end
932
877
 
933
- context "when providing an invalid option" do
934
-
935
- it "raises an error" do
936
- expect {
878
+ context 'when providing an invalid option' do
879
+ it 'raises an error' do
880
+ expect do
937
881
  klass.index({ name: 1 }, { invalid: true })
938
- }.to raise_error(Mongoid::Errors::InvalidIndex)
882
+ end.to raise_error(Mongoid::Errors::InvalidIndex)
883
+ end
884
+ end
885
+
886
+ context 'when providing an invalid spec' do
887
+ context 'when the spec is not a hash' do
888
+ it 'raises an error' do
889
+ expect do
890
+ klass.index(:name)
891
+ end.to raise_error(Mongoid::Errors::InvalidIndex)
892
+ end
893
+ end
894
+
895
+ context 'when the spec key is invalid' do
896
+ it 'raises an error' do
897
+ expect do
898
+ klass.index({ name: 'something' })
899
+ end.to raise_error(Mongoid::Errors::InvalidIndex)
900
+ end
939
901
  end
940
902
  end
941
903
 
942
- context "when providing an invalid spec" do
904
+ context 'when declaring a duplicate index with different options' do
905
+ def declare_duplicate_indexes!
906
+ klass.index({ name: 1 }, { partial_filter_expression: { name: 'a' } })
907
+ klass.index({ name: 1 }, { partial_filter_expression: { name: 'b' } })
908
+ klass.create_indexes
909
+ end
910
+
911
+ context 'when allow_duplicate_index_declarations is false' do
912
+ config_override :allow_duplicate_index_declarations, false
943
913
 
944
- context "when the spec is not a hash" do
914
+ it 'silently ignores the duplicate definition' do
915
+ expect { declare_duplicate_indexes! }.not_to raise_exception
916
+ end
917
+ end
945
918
 
946
- it "raises an error" do
947
- expect {
948
- klass.index(:name)
949
- }.to raise_error(Mongoid::Errors::InvalidIndex)
919
+ context 'when allow_duplicate_index_declarations is true' do
920
+ config_override :allow_duplicate_index_declarations, true
921
+
922
+ it 'raises a server error' do
923
+ expect { declare_duplicate_indexes! }.to raise_exception
950
924
  end
951
925
  end
926
+ end
927
+
928
+ context 'when declaring a duplicate index with different names' do
929
+ def declare_duplicate_indexes!
930
+ klass.index({ name: 1 }, { partial_filter_expression: { name: 'a' } })
931
+ klass.index({ name: 1 }, { name: 'alt_name', partial_filter_expression: { name: 'b' } })
932
+ klass.create_indexes
933
+ end
934
+
935
+ let(:index_count) { klass.collection.indexes.count }
936
+
937
+ context 'when allow_duplicate_index_declarations is false' do
938
+ config_override :allow_duplicate_index_declarations, false
939
+
940
+ it 'silently ignores the duplicate definition' do
941
+ expect { declare_duplicate_indexes! }.not_to raise_exception
942
+ expect(index_count).to eq 2 # _id and name
943
+ end
944
+ end
945
+
946
+ context 'when allow_duplicate_index_declarations is true' do
947
+ # 4.4 apparently doesn't recognize :name option for indexes?
948
+ min_server_version '5.0'
952
949
 
953
- context "when the spec key is invalid" do
950
+ config_override :allow_duplicate_index_declarations, true
954
951
 
955
- it "raises an error" do
956
- expect {
957
- klass.index({ name: "something" })
958
- }.to raise_error(Mongoid::Errors::InvalidIndex)
952
+ it 'creates both indexes' do
953
+ expect { declare_duplicate_indexes! }.not_to raise_exception
954
+ expect(index_count).to eq 3 # _id, name, alt_name
959
955
  end
960
956
  end
961
957
  end