mongoid 7.2.1 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1082) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +20 -20
  4. data/LICENSE +1 -1
  5. data/README.md +7 -12
  6. data/Rakefile +58 -1
  7. data/lib/config/locales/en.yml +191 -60
  8. data/lib/mongoid/association/accessors.rb +67 -53
  9. data/lib/mongoid/association/bindable.rb +77 -31
  10. data/lib/mongoid/association/builders.rb +8 -14
  11. data/lib/mongoid/association/constrainable.rb +2 -5
  12. data/lib/mongoid/association/depending.rb +20 -12
  13. data/lib/mongoid/association/eager.rb +160 -0
  14. data/lib/mongoid/association/eager_loadable.rb +41 -11
  15. data/lib/mongoid/association/embedded/batchable.rb +63 -52
  16. data/lib/mongoid/association/embedded/cyclic.rb +4 -12
  17. data/lib/mongoid/association/embedded/eager.rb +23 -0
  18. data/lib/mongoid/association/embedded/embedded_in/binding.rb +29 -13
  19. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +3 -5
  20. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +25 -23
  21. data/lib/mongoid/association/embedded/embedded_in.rb +11 -26
  22. data/lib/mongoid/association/embedded/embeds_many/binding.rb +4 -9
  23. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +5 -6
  24. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +226 -203
  25. data/lib/mongoid/association/embedded/embeds_many.rb +3 -33
  26. data/lib/mongoid/association/embedded/embeds_one/binding.rb +3 -9
  27. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +20 -8
  28. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +131 -42
  29. data/lib/mongoid/association/embedded/embeds_one.rb +4 -30
  30. data/lib/mongoid/association/embedded.rb +2 -1
  31. data/lib/mongoid/association/macros.rb +47 -16
  32. data/lib/mongoid/association/many.rb +12 -24
  33. data/lib/mongoid/association/marshalable.rb +4 -5
  34. data/lib/mongoid/association/nested/many.rb +14 -19
  35. data/lib/mongoid/association/nested/nested_buildable.rb +36 -13
  36. data/lib/mongoid/association/nested/one.rb +54 -26
  37. data/lib/mongoid/association/nested.rb +1 -3
  38. data/lib/mongoid/association/one.rb +3 -11
  39. data/lib/mongoid/association/options.rb +18 -44
  40. data/lib/mongoid/association/proxy.rb +49 -42
  41. data/lib/mongoid/association/referenced/auto_save.rb +11 -15
  42. data/lib/mongoid/association/referenced/belongs_to/binding.rb +2 -7
  43. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +6 -6
  44. data/lib/mongoid/association/referenced/belongs_to/eager.rb +2 -2
  45. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +23 -32
  46. data/lib/mongoid/association/referenced/belongs_to.rb +13 -37
  47. data/lib/mongoid/association/referenced/counter_cache.rb +18 -26
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +15 -8
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +1 -3
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -2
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +191 -123
  52. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +23 -42
  53. data/lib/mongoid/association/referenced/has_many/binding.rb +1 -5
  54. data/lib/mongoid/association/referenced/has_many/buildable.rb +1 -3
  55. data/lib/mongoid/association/referenced/has_many/eager.rb +2 -2
  56. data/lib/mongoid/association/referenced/has_many/enumerable.rb +471 -496
  57. data/lib/mongoid/association/referenced/has_many/proxy.rb +182 -179
  58. data/lib/mongoid/association/referenced/has_many.rb +17 -43
  59. data/lib/mongoid/association/referenced/has_one/binding.rb +1 -7
  60. data/lib/mongoid/association/referenced/has_one/buildable.rb +5 -5
  61. data/lib/mongoid/association/referenced/has_one/eager.rb +3 -4
  62. data/lib/mongoid/association/referenced/has_one/proxy.rb +38 -41
  63. data/lib/mongoid/association/referenced/has_one.rb +17 -36
  64. data/lib/mongoid/association/referenced/syncable.rb +11 -27
  65. data/lib/mongoid/association/referenced.rb +1 -1
  66. data/lib/mongoid/association/reflections.rb +9 -9
  67. data/lib/mongoid/association/relatable.rb +55 -74
  68. data/lib/mongoid/association.rb +10 -22
  69. data/lib/mongoid/atomic/modifiers.rb +7 -53
  70. data/lib/mongoid/atomic/paths/embedded/many.rb +20 -5
  71. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -5
  72. data/lib/mongoid/atomic/paths/embedded.rb +1 -3
  73. data/lib/mongoid/atomic/paths/root.rb +1 -5
  74. data/lib/mongoid/atomic/paths.rb +1 -1
  75. data/lib/mongoid/atomic.rb +39 -86
  76. data/lib/mongoid/atomic_update_preparer.rb +88 -0
  77. data/lib/mongoid/attributes/dynamic.rb +5 -21
  78. data/lib/mongoid/attributes/embedded.rb +34 -0
  79. data/lib/mongoid/attributes/nested.rb +9 -13
  80. data/lib/mongoid/attributes/processing.rb +43 -28
  81. data/lib/mongoid/attributes/projector.rb +120 -0
  82. data/lib/mongoid/attributes/readonly.rb +4 -8
  83. data/lib/mongoid/attributes.rb +85 -89
  84. data/lib/mongoid/cacheable.rb +5 -9
  85. data/lib/mongoid/changeable.rb +183 -97
  86. data/lib/mongoid/clients/factory.rb +58 -15
  87. data/lib/mongoid/clients/options.rb +117 -8
  88. data/lib/mongoid/clients/sessions.rb +246 -84
  89. data/lib/mongoid/clients/storage_options.rb +37 -11
  90. data/lib/mongoid/clients/validators/storage.rb +4 -24
  91. data/lib/mongoid/clients/validators.rb +1 -1
  92. data/lib/mongoid/clients.rb +37 -14
  93. data/lib/mongoid/collection_configurable.rb +59 -0
  94. data/lib/mongoid/composable.rb +7 -7
  95. data/lib/mongoid/config/defaults.rb +40 -0
  96. data/lib/mongoid/config/encryption.rb +213 -0
  97. data/lib/mongoid/config/environment.rb +25 -5
  98. data/lib/mongoid/config/introspection.rb +152 -0
  99. data/lib/mongoid/config/options.rb +11 -14
  100. data/lib/mongoid/config/validators/async_query_executor.rb +34 -0
  101. data/lib/mongoid/config/validators/client.rb +7 -23
  102. data/lib/mongoid/config/validators/option.rb +1 -3
  103. data/lib/mongoid/config/validators.rb +2 -1
  104. data/lib/mongoid/config.rb +183 -46
  105. data/lib/mongoid/contextual/aggregable/memory.rb +38 -26
  106. data/lib/mongoid/contextual/aggregable/mongo.rb +26 -32
  107. data/lib/mongoid/contextual/aggregable/none.rb +66 -0
  108. data/lib/mongoid/contextual/aggregable.rb +18 -0
  109. data/lib/mongoid/contextual/atomic.rb +97 -30
  110. data/lib/mongoid/contextual/command.rb +3 -5
  111. data/lib/mongoid/contextual/map_reduce.rb +8 -33
  112. data/lib/mongoid/contextual/memory.rb +396 -89
  113. data/lib/mongoid/contextual/mongo/documents_loader.rb +178 -0
  114. data/lib/mongoid/contextual/mongo.rb +640 -311
  115. data/lib/mongoid/contextual/none.rb +244 -30
  116. data/lib/mongoid/contextual/queryable.rb +5 -4
  117. data/lib/mongoid/contextual.rb +18 -7
  118. data/lib/mongoid/copyable.rb +34 -14
  119. data/lib/mongoid/criteria/findable.rb +52 -22
  120. data/lib/mongoid/criteria/includable.rb +31 -34
  121. data/lib/mongoid/criteria/inspectable.rb +4 -3
  122. data/lib/mongoid/criteria/marshalable.rb +14 -7
  123. data/lib/mongoid/criteria/modifiable.rb +5 -19
  124. data/lib/mongoid/criteria/options.rb +1 -3
  125. data/lib/mongoid/criteria/permission.rb +6 -2
  126. data/lib/mongoid/criteria/queryable/aggregable.rb +3 -15
  127. data/lib/mongoid/criteria/queryable/expandable.rb +1 -25
  128. data/lib/mongoid/criteria/queryable/extensions/array.rb +6 -41
  129. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -9
  130. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +5 -7
  131. data/lib/mongoid/criteria/queryable/extensions/date.rb +10 -11
  132. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +8 -7
  133. data/lib/mongoid/criteria/queryable/extensions/hash.rb +3 -41
  134. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +2 -14
  135. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +3 -21
  136. data/lib/mongoid/criteria/queryable/extensions/object.rb +7 -30
  137. data/lib/mongoid/criteria/queryable/extensions/range.rb +48 -17
  138. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +10 -13
  139. data/lib/mongoid/criteria/queryable/extensions/set.rb +3 -5
  140. data/lib/mongoid/criteria/queryable/extensions/string.rb +19 -34
  141. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +6 -22
  142. data/lib/mongoid/criteria/queryable/extensions/time.rb +8 -9
  143. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +9 -9
  144. data/lib/mongoid/criteria/queryable/extensions.rb +1 -5
  145. data/lib/mongoid/criteria/queryable/key.rb +15 -18
  146. data/lib/mongoid/criteria/queryable/macroable.rb +1 -3
  147. data/lib/mongoid/criteria/queryable/mergeable.rb +69 -50
  148. data/lib/mongoid/criteria/queryable/optional.rb +12 -62
  149. data/lib/mongoid/criteria/queryable/options.rb +3 -21
  150. data/lib/mongoid/criteria/queryable/pipeline.rb +2 -14
  151. data/lib/mongoid/criteria/queryable/selectable.rb +87 -124
  152. data/lib/mongoid/criteria/queryable/selector.rb +96 -25
  153. data/lib/mongoid/criteria/queryable/smash.rb +41 -18
  154. data/lib/mongoid/criteria/queryable/storable.rb +14 -9
  155. data/lib/mongoid/criteria/queryable.rb +12 -13
  156. data/lib/mongoid/criteria/scopable.rb +32 -21
  157. data/lib/mongoid/criteria/translator.rb +46 -0
  158. data/lib/mongoid/criteria.rb +60 -109
  159. data/lib/mongoid/deprecable.rb +38 -0
  160. data/lib/mongoid/deprecation.rb +29 -0
  161. data/lib/mongoid/document.rb +263 -173
  162. data/lib/mongoid/encryptable.rb +53 -0
  163. data/lib/mongoid/equality.rb +22 -25
  164. data/lib/mongoid/errors/ambiguous_relationship.rb +3 -5
  165. data/lib/mongoid/errors/attribute_not_loaded.rb +34 -0
  166. data/lib/mongoid/errors/callback.rb +1 -3
  167. data/lib/mongoid/errors/create_collection_failure.rb +34 -0
  168. data/lib/mongoid/errors/criteria_argument_required.rb +1 -1
  169. data/lib/mongoid/errors/delete_restriction.rb +9 -12
  170. data/lib/mongoid/errors/document_not_destroyed.rb +3 -7
  171. data/lib/mongoid/errors/document_not_found.rb +34 -21
  172. data/lib/mongoid/errors/drop_collection_failure.rb +28 -0
  173. data/lib/mongoid/errors/empty_config_file.rb +26 -0
  174. data/lib/mongoid/errors/immutable_attribute.rb +27 -0
  175. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -3
  176. data/lib/mongoid/errors/invalid_async_query_executor.rb +26 -0
  177. data/lib/mongoid/errors/invalid_auto_encryption_configuration.rb +33 -0
  178. data/lib/mongoid/errors/invalid_collection.rb +1 -1
  179. data/lib/mongoid/errors/invalid_config_file.rb +26 -0
  180. data/lib/mongoid/errors/invalid_config_option.rb +2 -4
  181. data/lib/mongoid/errors/invalid_dependent_strategy.rb +2 -4
  182. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +1 -1
  183. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +24 -0
  184. data/lib/mongoid/errors/invalid_elem_match_operator.rb +1 -1
  185. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +6 -5
  186. data/lib/mongoid/errors/invalid_estimated_count_scoping.rb +27 -0
  187. data/lib/mongoid/errors/invalid_expression_operator.rb +1 -1
  188. data/lib/mongoid/errors/invalid_field.rb +7 -7
  189. data/lib/mongoid/errors/invalid_field_operator.rb +1 -1
  190. data/lib/mongoid/errors/invalid_field_option.rb +1 -3
  191. data/lib/mongoid/errors/invalid_field_type.rb +27 -0
  192. data/lib/mongoid/errors/invalid_find.rb +1 -3
  193. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +23 -0
  194. data/lib/mongoid/errors/invalid_includes.rb +1 -3
  195. data/lib/mongoid/errors/invalid_index.rb +1 -3
  196. data/lib/mongoid/errors/invalid_options.rb +1 -3
  197. data/lib/mongoid/errors/invalid_path.rb +1 -3
  198. data/lib/mongoid/errors/invalid_persistence_option.rb +1 -5
  199. data/lib/mongoid/errors/invalid_query.rb +1 -1
  200. data/lib/mongoid/errors/invalid_relation.rb +2 -8
  201. data/lib/mongoid/errors/invalid_relation_option.rb +2 -4
  202. data/lib/mongoid/errors/invalid_scope.rb +1 -3
  203. data/lib/mongoid/errors/invalid_session_nesting.rb +17 -0
  204. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +1 -2
  205. data/lib/mongoid/errors/invalid_storage_options.rb +2 -4
  206. data/lib/mongoid/errors/invalid_time.rb +1 -3
  207. data/lib/mongoid/errors/invalid_transaction_nesting.rb +17 -0
  208. data/lib/mongoid/errors/inverse_not_found.rb +1 -3
  209. data/lib/mongoid/errors/mixed_client_configuration.rb +1 -3
  210. data/lib/mongoid/errors/mixed_relations.rb +1 -3
  211. data/lib/mongoid/errors/mongoid_error.rb +8 -16
  212. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +2 -4
  213. data/lib/mongoid/errors/no_client_config.rb +1 -3
  214. data/lib/mongoid/errors/no_client_database.rb +2 -4
  215. data/lib/mongoid/errors/no_client_hosts.rb +2 -4
  216. data/lib/mongoid/errors/no_clients_config.rb +1 -3
  217. data/lib/mongoid/errors/no_default_client.rb +1 -3
  218. data/lib/mongoid/errors/no_environment.rb +1 -3
  219. data/lib/mongoid/errors/no_map_reduce_output.rb +1 -3
  220. data/lib/mongoid/errors/no_metadata.rb +1 -3
  221. data/lib/mongoid/errors/no_parent.rb +1 -3
  222. data/lib/mongoid/errors/readonly_attribute.rb +2 -4
  223. data/lib/mongoid/errors/readonly_document.rb +2 -6
  224. data/lib/mongoid/errors/rollback.rb +15 -0
  225. data/lib/mongoid/errors/scope_overwrite.rb +1 -1
  226. data/lib/mongoid/errors/sessions_not_supported.rb +17 -0
  227. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +2 -2
  228. data/lib/mongoid/errors/transaction_error.rb +25 -0
  229. data/lib/mongoid/errors/transactions_not_supported.rb +17 -0
  230. data/lib/mongoid/errors/unknown_attribute.rb +2 -4
  231. data/lib/mongoid/errors/unknown_model.rb +1 -3
  232. data/lib/mongoid/errors/unsaved_document.rb +2 -2
  233. data/lib/mongoid/errors/unsupported_javascript.rb +1 -3
  234. data/lib/mongoid/errors/validations.rb +1 -1
  235. data/lib/mongoid/errors.rb +18 -5
  236. data/lib/mongoid/evolvable.rb +2 -4
  237. data/lib/mongoid/extensions/array.rb +20 -58
  238. data/lib/mongoid/extensions/big_decimal.rb +44 -24
  239. data/lib/mongoid/extensions/binary.rb +45 -0
  240. data/lib/mongoid/extensions/boolean.rb +11 -6
  241. data/lib/mongoid/extensions/date.rb +31 -29
  242. data/lib/mongoid/extensions/date_time.rb +5 -16
  243. data/lib/mongoid/extensions/decimal128.rb +3 -5
  244. data/lib/mongoid/extensions/false_class.rb +8 -10
  245. data/lib/mongoid/extensions/float.rb +11 -12
  246. data/lib/mongoid/extensions/hash.rb +28 -148
  247. data/lib/mongoid/extensions/integer.rb +13 -14
  248. data/lib/mongoid/extensions/module.rb +5 -5
  249. data/lib/mongoid/extensions/nil_class.rb +5 -7
  250. data/lib/mongoid/extensions/object.rb +32 -81
  251. data/lib/mongoid/extensions/object_id.rb +3 -7
  252. data/lib/mongoid/extensions/range.rb +47 -24
  253. data/lib/mongoid/extensions/raw_value.rb +34 -0
  254. data/lib/mongoid/extensions/regexp.rb +14 -7
  255. data/lib/mongoid/extensions/set.rb +24 -13
  256. data/lib/mongoid/extensions/string.rb +30 -62
  257. data/lib/mongoid/extensions/symbol.rb +9 -22
  258. data/lib/mongoid/extensions/time.rb +30 -40
  259. data/lib/mongoid/extensions/time_with_zone.rb +18 -11
  260. data/lib/mongoid/extensions/true_class.rb +8 -10
  261. data/lib/mongoid/extensions.rb +3 -20
  262. data/lib/mongoid/factory.rb +178 -37
  263. data/lib/mongoid/fields/encrypted.rb +48 -0
  264. data/lib/mongoid/fields/foreign_key.rb +39 -27
  265. data/lib/mongoid/fields/localized.rb +25 -15
  266. data/lib/mongoid/fields/standard.rb +22 -40
  267. data/lib/mongoid/fields/validators/macro.rb +6 -19
  268. data/lib/mongoid/fields/validators.rb +1 -1
  269. data/lib/mongoid/fields.rb +354 -76
  270. data/lib/mongoid/findable.rb +62 -22
  271. data/lib/mongoid/indexable/specification.rb +55 -34
  272. data/lib/mongoid/indexable/validators/options.rb +7 -9
  273. data/lib/mongoid/indexable.rb +2 -18
  274. data/lib/mongoid/inspectable.rb +34 -11
  275. data/lib/mongoid/interceptable.rb +197 -41
  276. data/lib/mongoid/loadable.rb +83 -0
  277. data/lib/mongoid/loggable.rb +1 -9
  278. data/lib/mongoid/matchable.rb +2 -6
  279. data/lib/mongoid/matcher/all.rb +15 -0
  280. data/lib/mongoid/matcher/and.rb +14 -0
  281. data/lib/mongoid/matcher/bits.rb +60 -0
  282. data/lib/mongoid/matcher/bits_all_clear.rb +41 -0
  283. data/lib/mongoid/matcher/bits_all_set.rb +41 -0
  284. data/lib/mongoid/matcher/bits_any_clear.rb +41 -0
  285. data/lib/mongoid/matcher/bits_any_set.rb +41 -0
  286. data/lib/mongoid/matcher/elem_match.rb +17 -1
  287. data/lib/mongoid/matcher/elem_match_expression.rb +14 -2
  288. data/lib/mongoid/matcher/eq.rb +15 -0
  289. data/lib/mongoid/matcher/eq_impl.rb +54 -2
  290. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +18 -1
  291. data/lib/mongoid/matcher/exists.rb +15 -0
  292. data/lib/mongoid/matcher/expression.rb +22 -14
  293. data/lib/mongoid/matcher/expression_operator.rb +14 -0
  294. data/lib/mongoid/matcher/field_expression.rb +19 -5
  295. data/lib/mongoid/matcher/field_operator.rb +30 -0
  296. data/lib/mongoid/matcher/gt.rb +15 -0
  297. data/lib/mongoid/matcher/gte.rb +15 -0
  298. data/lib/mongoid/matcher/in.rb +15 -0
  299. data/lib/mongoid/matcher/lt.rb +15 -0
  300. data/lib/mongoid/matcher/lte.rb +15 -0
  301. data/lib/mongoid/matcher/mod.rb +33 -0
  302. data/lib/mongoid/matcher/ne.rb +15 -0
  303. data/lib/mongoid/matcher/nin.rb +15 -0
  304. data/lib/mongoid/matcher/nor.rb +14 -0
  305. data/lib/mongoid/matcher/not.rb +16 -0
  306. data/lib/mongoid/matcher/or.rb +14 -0
  307. data/lib/mongoid/matcher/regex.rb +24 -0
  308. data/lib/mongoid/matcher/size.rb +16 -0
  309. data/lib/mongoid/matcher/type.rb +124 -0
  310. data/lib/mongoid/matcher.rb +59 -52
  311. data/lib/mongoid/persistable/creatable.rb +25 -29
  312. data/lib/mongoid/persistable/deletable.rb +10 -23
  313. data/lib/mongoid/persistable/destroyable.rb +37 -11
  314. data/lib/mongoid/persistable/incrementable.rb +2 -6
  315. data/lib/mongoid/persistable/logical.rb +1 -5
  316. data/lib/mongoid/persistable/maxable.rb +37 -0
  317. data/lib/mongoid/persistable/minable.rb +37 -0
  318. data/lib/mongoid/persistable/multipliable.rb +36 -0
  319. data/lib/mongoid/persistable/poppable.rb +1 -5
  320. data/lib/mongoid/persistable/pullable.rb +1 -7
  321. data/lib/mongoid/persistable/pushable.rb +1 -7
  322. data/lib/mongoid/persistable/renamable.rb +1 -5
  323. data/lib/mongoid/persistable/savable.rb +14 -8
  324. data/lib/mongoid/persistable/settable.rb +1 -5
  325. data/lib/mongoid/persistable/unsettable.rb +3 -7
  326. data/lib/mongoid/persistable/updatable.rb +114 -28
  327. data/lib/mongoid/persistable/upsertable.rb +33 -8
  328. data/lib/mongoid/persistable.rb +17 -27
  329. data/lib/mongoid/persistence_context.rb +111 -43
  330. data/lib/mongoid/positional.rb +1 -5
  331. data/lib/mongoid/railtie.rb +23 -15
  332. data/lib/mongoid/railties/bson_object_id_serializer.rb +39 -0
  333. data/lib/mongoid/railties/console_sandbox.rb +42 -0
  334. data/lib/mongoid/railties/controller_runtime.rb +21 -6
  335. data/lib/mongoid/railties/database.rake +19 -2
  336. data/lib/mongoid/reloadable.rb +45 -42
  337. data/lib/mongoid/scopable.rb +25 -53
  338. data/lib/mongoid/search_indexable.rb +167 -0
  339. data/lib/mongoid/selectable.rb +6 -17
  340. data/lib/mongoid/serializable.rb +11 -21
  341. data/lib/mongoid/shardable.rb +50 -16
  342. data/lib/mongoid/stateful.rb +66 -22
  343. data/lib/mongoid/stringified_symbol.rb +19 -7
  344. data/lib/mongoid/tasks/database.rake +25 -0
  345. data/lib/mongoid/tasks/database.rb +84 -8
  346. data/lib/mongoid/tasks/encryption.rake +59 -0
  347. data/lib/mongoid/tasks/encryption.rb +108 -0
  348. data/lib/mongoid/threaded/lifecycle.rb +6 -26
  349. data/lib/mongoid/threaded.rb +131 -92
  350. data/lib/mongoid/timestamps/created/short.rb +1 -1
  351. data/lib/mongoid/timestamps/created.rb +4 -4
  352. data/lib/mongoid/timestamps/short.rb +1 -1
  353. data/lib/mongoid/timestamps/timeless.rb +29 -7
  354. data/lib/mongoid/timestamps/updated/short.rb +1 -1
  355. data/lib/mongoid/timestamps/updated.rb +3 -5
  356. data/lib/mongoid/timestamps.rb +1 -1
  357. data/lib/mongoid/touchable.rb +155 -29
  358. data/lib/mongoid/traversable.rb +180 -125
  359. data/lib/mongoid/utils.rb +52 -0
  360. data/lib/mongoid/validatable/associated.rb +97 -21
  361. data/lib/mongoid/validatable/format.rb +1 -1
  362. data/lib/mongoid/validatable/length.rb +1 -1
  363. data/lib/mongoid/validatable/localizable.rb +2 -4
  364. data/lib/mongoid/validatable/macros.rb +10 -14
  365. data/lib/mongoid/validatable/presence.rb +7 -13
  366. data/lib/mongoid/validatable/queryable.rb +9 -3
  367. data/lib/mongoid/validatable/uniqueness.rb +26 -39
  368. data/lib/mongoid/validatable.rb +20 -29
  369. data/lib/mongoid/version.rb +2 -2
  370. data/lib/mongoid/warnings.rb +37 -0
  371. data/lib/mongoid.rb +56 -22
  372. data/lib/rails/generators/mongoid/config/config_generator.rb +25 -5
  373. data/lib/rails/generators/mongoid/config/templates/mongoid.rb +25 -0
  374. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +44 -64
  375. data/lib/rails/generators/mongoid/model/model_generator.rb +4 -1
  376. data/lib/rails/generators/mongoid_generator.rb +13 -1
  377. data/lib/rails/mongoid.rb +4 -32
  378. data/spec/config/mongoid.yml +16 -1
  379. data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
  380. data/spec/integration/active_job_spec.rb +32 -0
  381. data/spec/integration/app_spec.rb +180 -89
  382. data/spec/integration/associations/belongs_to_spec.rb +19 -1
  383. data/spec/integration/associations/embedded_dirty_spec.rb +58 -0
  384. data/spec/integration/associations/embedded_spec.rb +90 -7
  385. data/spec/integration/associations/embeds_many_spec.rb +197 -1
  386. data/spec/integration/associations/embeds_one_spec.rb +19 -1
  387. data/spec/integration/associations/foreign_key_spec.rb +10 -1
  388. data/spec/integration/associations/foreign_key_spec_models.rb +1 -1
  389. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +62 -0
  390. data/spec/integration/associations/has_many_spec.rb +1 -1
  391. data/spec/integration/associations/has_one_spec.rb +145 -1
  392. data/spec/integration/associations/nested_attributes_assignment_spec.rb +1 -1
  393. data/spec/integration/associations/reverse_population_spec.rb +1 -1
  394. data/spec/integration/associations/reverse_population_spec_models.rb +1 -1
  395. data/spec/integration/associations/scope_option_spec.rb +102 -0
  396. data/spec/integration/atomic/modifiers_spec.rb +1 -1
  397. data/spec/integration/bson_regexp_raw_spec.rb +1 -1
  398. data/spec/integration/callbacks_models.rb +147 -3
  399. data/spec/integration/callbacks_spec.rb +398 -8
  400. data/spec/integration/contextual/empty_spec.rb +142 -0
  401. data/spec/integration/criteria/alias_query_spec.rb +98 -0
  402. data/spec/integration/criteria/date_field_spec.rb +2 -2
  403. data/spec/integration/criteria/default_scope_spec.rb +52 -0
  404. data/spec/integration/criteria/logical_spec.rb +12 -0
  405. data/spec/integration/criteria/range_spec.rb +358 -0
  406. data/spec/integration/criteria/raw_value_spec.rb +525 -0
  407. data/spec/integration/criteria/time_with_zone_spec.rb +126 -15
  408. data/spec/integration/discriminator_key_spec.rb +119 -81
  409. data/spec/integration/discriminator_value_spec.rb +1 -1
  410. data/spec/integration/document_spec.rb +31 -1
  411. data/spec/integration/dots_and_dollars_spec.rb +278 -0
  412. data/spec/integration/encryption_spec.rb +100 -0
  413. data/spec/integration/i18n_fallbacks_spec.rb +10 -52
  414. data/spec/integration/matcher_examples_spec.rb +21 -14
  415. data/spec/integration/matcher_operator_data/bits_all_clear.yml +144 -0
  416. data/spec/integration/matcher_operator_data/bits_all_set.yml +144 -0
  417. data/spec/integration/matcher_operator_data/bits_any_clear.yml +144 -0
  418. data/spec/integration/matcher_operator_data/bits_any_set.yml +144 -0
  419. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  420. data/spec/integration/matcher_operator_data/elem_match.yml +46 -0
  421. data/spec/integration/matcher_operator_data/implicit_traversal.yml +96 -0
  422. data/spec/integration/matcher_operator_data/in.yml +16 -0
  423. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  424. data/spec/integration/matcher_operator_data/size.yml +0 -3
  425. data/spec/integration/matcher_operator_data/type.yml +64 -0
  426. data/spec/integration/matcher_operator_data/type_array.yml +15 -0
  427. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  428. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  429. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  430. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  431. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  432. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  433. data/spec/integration/matcher_operator_data/type_decimal.yml +37 -0
  434. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  435. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  436. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  437. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  438. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  439. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  440. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  441. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  442. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  443. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  444. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  445. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  446. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  447. data/spec/integration/matcher_operator_spec.rb +26 -3
  448. data/spec/integration/matcher_spec.rb +50 -1
  449. data/spec/integration/persistence/range_field_spec.rb +351 -0
  450. data/spec/integration/server_query_spec.rb +1 -1
  451. data/spec/integration/shardable_spec.rb +1 -1
  452. data/spec/integration/stringified_symbol_field_spec.rb +17 -3
  453. data/spec/lite_spec_helper.rb +47 -14
  454. data/spec/mongoid/association/accessors_spec.rb +31 -19
  455. data/spec/mongoid/association/auto_save_spec.rb +73 -34
  456. data/spec/mongoid/association/builders_spec.rb +2 -2
  457. data/spec/mongoid/association/constrainable_spec.rb +1 -1
  458. data/spec/mongoid/association/counter_cache_spec.rb +34 -34
  459. data/spec/mongoid/association/depending_spec.rb +397 -358
  460. data/spec/mongoid/association/eager_spec.rb +56 -6
  461. data/spec/mongoid/association/embedded/cyclic_spec.rb +3 -3
  462. data/spec/mongoid/association/embedded/dirty_spec.rb +3 -3
  463. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +3 -2
  464. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +55 -1
  465. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +110 -23
  466. data/spec/mongoid/association/embedded/embedded_in_spec.rb +19 -8
  467. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +1 -1
  468. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +113 -1
  469. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +712 -203
  470. data/spec/mongoid/association/embedded/embeds_many_models.rb +189 -1
  471. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +14 -2
  472. data/spec/mongoid/association/embedded/embeds_many_spec.rb +69 -1
  473. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +1 -1
  474. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +26 -1
  475. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +37 -24
  476. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +1 -1
  477. data/spec/mongoid/association/embedded/embeds_one_models.rb +25 -2
  478. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +2 -2
  479. data/spec/mongoid/association/embedded/embeds_one_spec.rb +29 -1
  480. data/spec/mongoid/association/macros_spec.rb +10 -10
  481. data/spec/mongoid/association/nested/many_spec.rb +1 -1
  482. data/spec/mongoid/association/nested/one_spec.rb +17 -13
  483. data/spec/mongoid/association/options_spec.rb +1 -1
  484. data/spec/mongoid/association/polymorphic_spec.rb +1 -1
  485. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +3 -2
  486. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +110 -17
  487. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +51 -15
  488. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +113 -59
  489. data/spec/mongoid/association/referenced/belongs_to_models.rb +12 -0
  490. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +22 -2
  491. data/spec/mongoid/association/referenced/belongs_to_spec.rb +27 -22
  492. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +2 -2
  493. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +28 -3
  494. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +32 -3
  495. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +1 -1
  496. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +386 -376
  497. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +44 -1
  498. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +2 -2
  499. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +57 -3
  500. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +2 -2
  501. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +131 -1
  502. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +24 -7
  503. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +313 -134
  504. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +1 -1
  505. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +1313 -2109
  506. data/spec/mongoid/association/referenced/has_many_models.rb +39 -2
  507. data/spec/mongoid/association/referenced/has_many_query_spec.rb +2 -2
  508. data/spec/mongoid/association/referenced/has_many_spec.rb +47 -1
  509. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +1 -1
  510. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +54 -10
  511. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +18 -2
  512. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +134 -28
  513. data/spec/mongoid/association/referenced/has_one_models.rb +43 -1
  514. data/spec/mongoid/association/referenced/has_one_query_spec.rb +2 -2
  515. data/spec/mongoid/association/referenced/has_one_spec.rb +22 -1
  516. data/spec/mongoid/association/reflections_spec.rb +1 -1
  517. data/spec/mongoid/association/syncable_spec.rb +47 -33
  518. data/spec/mongoid/association_spec.rb +1 -1
  519. data/spec/mongoid/atomic/modifiers_spec.rb +1 -1
  520. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +1 -1
  521. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +1 -1
  522. data/spec/mongoid/atomic/paths/root_spec.rb +1 -1
  523. data/spec/mongoid/atomic/paths_spec.rb +65 -27
  524. data/spec/mongoid/atomic_spec.rb +29 -7
  525. data/spec/mongoid/atomic_update_preparer_spec.rb +83 -0
  526. data/spec/mongoid/attributes/dynamic_spec.rb +1 -1
  527. data/spec/mongoid/attributes/embedded_spec.rb +118 -0
  528. data/spec/mongoid/attributes/nested_spec.rb +147 -78
  529. data/spec/mongoid/attributes/nested_spec_models.rb +49 -0
  530. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  531. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  532. data/spec/mongoid/attributes/projector_spec.rb +41 -0
  533. data/spec/mongoid/attributes/readonly_spec.rb +23 -23
  534. data/spec/mongoid/attributes_spec.rb +921 -69
  535. data/spec/mongoid/cacheable_spec.rb +5 -5
  536. data/spec/mongoid/changeable_spec.rb +468 -76
  537. data/spec/mongoid/clients/factory_spec.rb +152 -30
  538. data/spec/mongoid/clients/options_spec.rb +24 -12
  539. data/spec/mongoid/clients/sessions_spec.rb +49 -71
  540. data/spec/mongoid/clients/transactions_spec.rb +971 -176
  541. data/spec/mongoid/clients/transactions_spec_models.rb +159 -0
  542. data/spec/mongoid/clients_spec.rb +230 -22
  543. data/spec/mongoid/collection_configurable_spec.rb +159 -0
  544. data/spec/mongoid/composable_spec.rb +1 -1
  545. data/spec/mongoid/config/defaults_spec.rb +99 -0
  546. data/spec/mongoid/config/encryption_spec.rb +152 -0
  547. data/spec/mongoid/config/environment_spec.rb +126 -39
  548. data/spec/mongoid/config/introspection_spec.rb +114 -0
  549. data/spec/mongoid/config/options_spec.rb +1 -1
  550. data/spec/mongoid/config_spec.rb +375 -43
  551. data/spec/mongoid/contextual/aggregable/memory_spec.rb +432 -154
  552. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  553. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +63 -0
  554. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +95 -20
  555. data/spec/mongoid/contextual/aggregable/none_spec.rb +49 -0
  556. data/spec/mongoid/contextual/atomic_spec.rb +329 -87
  557. data/spec/mongoid/contextual/map_reduce_spec.rb +5 -19
  558. data/spec/mongoid/contextual/memory_spec.rb +1479 -127
  559. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +194 -0
  560. data/spec/mongoid/contextual/mongo_spec.rb +3374 -1254
  561. data/spec/mongoid/contextual/none_spec.rb +79 -68
  562. data/spec/mongoid/copyable_spec.rb +465 -23
  563. data/spec/mongoid/copyable_spec_models.rb +1 -1
  564. data/spec/mongoid/criteria/findable_spec.rb +295 -229
  565. data/spec/mongoid/criteria/includable_spec.rb +1493 -0
  566. data/spec/mongoid/criteria/includable_spec_models.rb +55 -0
  567. data/spec/mongoid/criteria/inspectable_spec.rb +1 -1
  568. data/spec/mongoid/criteria/marshalable_spec.rb +19 -2
  569. data/spec/mongoid/criteria/modifiable_spec.rb +38 -38
  570. data/spec/mongoid/criteria/options_spec.rb +1 -1
  571. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +2 -2
  572. data/spec/mongoid/criteria/queryable/expandable_spec.rb +1 -74
  573. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +8 -20
  574. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +135 -27
  575. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +2 -2
  576. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +32 -12
  577. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +12 -1
  578. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +1 -1
  579. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +1 -16
  580. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +1 -1
  581. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +1 -1
  582. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +74 -8
  583. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +1 -1
  584. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +238 -179
  585. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -12
  586. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +1 -12
  587. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +1 -1
  588. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +48 -132
  589. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +5 -60
  590. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +12 -1
  591. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +12 -1
  592. data/spec/mongoid/criteria/queryable/key_spec.rb +1 -1
  593. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +106 -8
  594. data/spec/mongoid/criteria/queryable/optional_spec.rb +17 -486
  595. data/spec/mongoid/criteria/queryable/options_spec.rb +2 -2
  596. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +1 -1
  597. data/spec/mongoid/criteria/queryable/queryable_spec.rb +2 -2
  598. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +700 -26
  599. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +39 -0
  600. data/spec/mongoid/criteria/queryable/selectable_spec.rb +149 -683
  601. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +590 -0
  602. data/spec/mongoid/criteria/queryable/selector_spec.rb +186 -6
  603. data/spec/mongoid/criteria/queryable/smash_spec.rb +1 -1
  604. data/spec/mongoid/criteria/queryable/storable_spec.rb +87 -1
  605. data/spec/mongoid/criteria/scopable_spec.rb +128 -1
  606. data/spec/mongoid/criteria/translator_spec.rb +133 -0
  607. data/spec/mongoid/criteria_projection_spec.rb +407 -0
  608. data/spec/mongoid/criteria_spec.rb +1029 -1806
  609. data/spec/mongoid/document_fields_spec.rb +180 -5
  610. data/spec/mongoid/document_persistence_context_spec.rb +77 -1
  611. data/spec/mongoid/document_query_spec.rb +55 -4
  612. data/spec/mongoid/document_spec.rb +43 -172
  613. data/spec/mongoid/equality_spec.rb +7 -8
  614. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +1 -1
  615. data/spec/mongoid/errors/attribute_not_loaded_spec.rb +32 -0
  616. data/spec/mongoid/errors/callback_spec.rb +1 -1
  617. data/spec/mongoid/errors/delete_restriction_spec.rb +2 -2
  618. data/spec/mongoid/errors/document_not_destroyed_spec.rb +1 -1
  619. data/spec/mongoid/errors/document_not_found_spec.rb +77 -1
  620. data/spec/mongoid/errors/invalid_collection_spec.rb +1 -1
  621. data/spec/mongoid/errors/{eager_load_spec.rb → invalid_config_file_spec.rb} +6 -6
  622. data/spec/mongoid/errors/invalid_config_option_spec.rb +1 -1
  623. data/spec/mongoid/errors/invalid_field_option_spec.rb +1 -1
  624. data/spec/mongoid/errors/invalid_field_spec.rb +2 -2
  625. data/spec/mongoid/errors/invalid_field_type_spec.rb +56 -0
  626. data/spec/mongoid/errors/invalid_find_spec.rb +1 -1
  627. data/spec/mongoid/errors/invalid_includes_spec.rb +1 -1
  628. data/spec/mongoid/errors/invalid_index_spec.rb +1 -1
  629. data/spec/mongoid/errors/invalid_options_spec.rb +1 -1
  630. data/spec/mongoid/errors/invalid_path_spec.rb +1 -1
  631. data/spec/mongoid/errors/invalid_relation_spec.rb +1 -1
  632. data/spec/mongoid/errors/invalid_scope_spec.rb +2 -2
  633. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +1 -1
  634. data/spec/mongoid/errors/invalid_storage_options_spec.rb +1 -1
  635. data/spec/mongoid/errors/invalid_time_spec.rb +1 -1
  636. data/spec/mongoid/errors/inverse_not_found_spec.rb +1 -1
  637. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +1 -1
  638. data/spec/mongoid/errors/mixed_relations_spec.rb +1 -1
  639. data/spec/mongoid/errors/mongoid_error_spec.rb +4 -4
  640. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +1 -1
  641. data/spec/mongoid/errors/no_client_config_spec.rb +1 -1
  642. data/spec/mongoid/errors/no_client_database_spec.rb +1 -1
  643. data/spec/mongoid/errors/no_client_hosts_spec.rb +1 -1
  644. data/spec/mongoid/errors/no_clients_config_spec.rb +1 -1
  645. data/spec/mongoid/errors/no_environment_spec.rb +4 -4
  646. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +1 -1
  647. data/spec/mongoid/errors/no_metadata_spec.rb +1 -1
  648. data/spec/mongoid/errors/no_parent_spec.rb +1 -1
  649. data/spec/mongoid/errors/readonly_attribute_spec.rb +1 -1
  650. data/spec/mongoid/errors/readonly_document_spec.rb +3 -3
  651. data/spec/mongoid/errors/scope_overwrite_spec.rb +1 -1
  652. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +2 -2
  653. data/spec/mongoid/errors/unknown_attribute_spec.rb +3 -3
  654. data/spec/mongoid/errors/unsaved_document_spec.rb +1 -1
  655. data/spec/mongoid/errors/unsupported_javascript_spec.rb +1 -1
  656. data/spec/mongoid/errors/validations_spec.rb +1 -1
  657. data/spec/mongoid/extensions/array_spec.rb +19 -265
  658. data/spec/mongoid/extensions/big_decimal_spec.rb +713 -213
  659. data/spec/mongoid/extensions/binary_spec.rb +45 -10
  660. data/spec/mongoid/extensions/boolean_spec.rb +69 -83
  661. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +15 -11
  662. data/spec/mongoid/extensions/date_spec.rb +74 -22
  663. data/spec/mongoid/extensions/date_time_spec.rb +18 -19
  664. data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
  665. data/spec/mongoid/extensions/false_class_spec.rb +2 -9
  666. data/spec/mongoid/extensions/float_spec.rb +56 -84
  667. data/spec/mongoid/extensions/hash_spec.rb +45 -219
  668. data/spec/mongoid/extensions/integer_spec.rb +53 -73
  669. data/spec/mongoid/extensions/module_spec.rb +1 -1
  670. data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
  671. data/spec/mongoid/extensions/object_id_spec.rb +1 -1
  672. data/spec/mongoid/extensions/object_spec.rb +1 -177
  673. data/spec/mongoid/extensions/range_spec.rb +254 -64
  674. data/spec/mongoid/extensions/raw_value_spec.rb +67 -0
  675. data/spec/mongoid/extensions/regexp_spec.rb +59 -34
  676. data/spec/mongoid/extensions/set_spec.rb +105 -1
  677. data/spec/mongoid/extensions/string_spec.rb +21 -104
  678. data/spec/mongoid/extensions/stringified_symbol_spec.rb +1 -1
  679. data/spec/mongoid/extensions/symbol_spec.rb +15 -53
  680. data/spec/mongoid/extensions/time_spec.rb +345 -131
  681. data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -107
  682. data/spec/mongoid/extensions/true_class_spec.rb +2 -9
  683. data/spec/mongoid/factory_spec.rb +63 -2
  684. data/spec/mongoid/fields/foreign_key_spec.rb +282 -120
  685. data/spec/mongoid/fields/localized_spec.rb +85 -42
  686. data/spec/mongoid/fields/standard_spec.rb +1 -1
  687. data/spec/mongoid/fields_spec.rb +826 -121
  688. data/spec/mongoid/findable_spec.rb +442 -80
  689. data/spec/mongoid/indexable/specification_spec.rb +132 -14
  690. data/spec/mongoid/indexable_spec.rb +361 -23
  691. data/spec/mongoid/inspectable_spec.rb +93 -5
  692. data/spec/mongoid/interceptable_spec.rb +926 -116
  693. data/spec/mongoid/interceptable_spec_models.rb +236 -4
  694. data/spec/mongoid/loading_spec.rb +110 -0
  695. data/spec/mongoid/loggable_spec.rb +1 -1
  696. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  697. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +68 -88
  698. data/spec/mongoid/matcher/extract_attribute_spec.rb +5 -15
  699. data/spec/mongoid/mongoizable_spec.rb +286 -0
  700. data/spec/mongoid/monkey_patches_spec.rb +211 -0
  701. data/spec/mongoid/persistable/creatable_spec.rb +5 -5
  702. data/spec/mongoid/persistable/deletable_spec.rb +267 -27
  703. data/spec/mongoid/persistable/destroyable_spec.rb +409 -24
  704. data/spec/mongoid/persistable/incrementable_spec.rb +46 -9
  705. data/spec/mongoid/persistable/logical_spec.rb +42 -5
  706. data/spec/mongoid/persistable/maxable_spec.rb +147 -0
  707. data/spec/mongoid/persistable/minable_spec.rb +147 -0
  708. data/spec/mongoid/persistable/multipliable_spec.rb +227 -0
  709. data/spec/mongoid/persistable/poppable_spec.rb +41 -5
  710. data/spec/mongoid/persistable/pullable_spec.rb +81 -9
  711. data/spec/mongoid/persistable/pushable_spec.rb +81 -9
  712. data/spec/mongoid/persistable/renamable_spec.rb +40 -4
  713. data/spec/mongoid/persistable/savable_spec.rb +114 -20
  714. data/spec/mongoid/persistable/settable_spec.rb +77 -10
  715. data/spec/mongoid/persistable/unsettable_spec.rb +41 -5
  716. data/spec/mongoid/persistable/updatable_spec.rb +64 -52
  717. data/spec/mongoid/persistable/upsertable_spec.rb +124 -4
  718. data/spec/mongoid/persistable_spec.rb +4 -4
  719. data/spec/mongoid/persistence_context_spec.rb +58 -59
  720. data/spec/mongoid/positional_spec.rb +1 -1
  721. data/spec/mongoid/railties/bson_object_id_serializer_spec.rb +24 -0
  722. data/spec/mongoid/railties/console_sandbox_spec.rb +44 -0
  723. data/spec/mongoid/relations/proxy_spec.rb +7 -7
  724. data/spec/mongoid/reloadable_spec.rb +255 -30
  725. data/spec/mongoid/scopable_spec.rb +198 -58
  726. data/spec/mongoid/search_indexable_spec.rb +147 -0
  727. data/spec/mongoid/selectable_spec.rb +7 -7
  728. data/spec/mongoid/serializable_spec.rb +19 -40
  729. data/spec/mongoid/shardable_models.rb +15 -0
  730. data/spec/mongoid/shardable_spec.rb +181 -31
  731. data/spec/mongoid/stateful_spec.rb +152 -10
  732. data/spec/mongoid/tasks/database_rake_spec.rb +193 -42
  733. data/spec/mongoid/tasks/database_spec.rb +175 -2
  734. data/spec/mongoid/tasks/encryption_spec.rb +187 -0
  735. data/spec/mongoid/threaded_spec.rb +40 -3
  736. data/spec/mongoid/timestamps/created/short_spec.rb +2 -2
  737. data/spec/mongoid/timestamps/created_spec.rb +2 -2
  738. data/spec/mongoid/timestamps/timeless_spec.rb +3 -3
  739. data/spec/mongoid/timestamps/updated/short_spec.rb +4 -4
  740. data/spec/mongoid/timestamps/updated_spec.rb +4 -4
  741. data/spec/mongoid/timestamps_spec.rb +399 -11
  742. data/spec/mongoid/timestamps_spec_models.rb +68 -0
  743. data/spec/mongoid/touchable_spec.rb +971 -54
  744. data/spec/mongoid/touchable_spec_models.rb +154 -0
  745. data/spec/mongoid/traversable_spec.rb +79 -37
  746. data/spec/mongoid/validatable/associated_spec.rb +14 -31
  747. data/spec/mongoid/validatable/format_spec.rb +1 -1
  748. data/spec/mongoid/validatable/length_spec.rb +1 -1
  749. data/spec/mongoid/validatable/numericality_spec.rb +1 -1
  750. data/spec/mongoid/validatable/presence_spec.rb +27 -23
  751. data/spec/mongoid/validatable/uniqueness_spec.rb +170 -99
  752. data/spec/mongoid/validatable_spec.rb +4 -4
  753. data/spec/mongoid/warnings_spec.rb +36 -0
  754. data/spec/mongoid_spec.rb +61 -11
  755. data/spec/rails/controller_extension/controller_runtime_spec.rb +3 -3
  756. data/spec/rails/mongoid_spec.rb +28 -132
  757. data/spec/shared/bin/get-mongodb-download-url +17 -0
  758. data/spec/shared/bin/s3-copy +45 -0
  759. data/spec/shared/bin/s3-upload +69 -0
  760. data/spec/shared/lib/mrss/cluster_config.rb +24 -4
  761. data/spec/shared/lib/mrss/constraints.rb +77 -29
  762. data/spec/shared/lib/mrss/docker_runner.rb +40 -4
  763. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  764. data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
  765. data/spec/shared/lib/mrss/lite_constraints.rb +64 -1
  766. data/spec/shared/lib/mrss/server_version_registry.rb +78 -34
  767. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  768. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  769. data/spec/shared/lib/mrss/spec_organizer.rb +32 -2
  770. data/spec/shared/lib/mrss/utils.rb +37 -0
  771. data/spec/shared/share/Dockerfile.erb +123 -71
  772. data/spec/shared/share/haproxy-1.conf +16 -0
  773. data/spec/shared/share/haproxy-2.conf +17 -0
  774. data/spec/shared/shlib/config.sh +27 -0
  775. data/spec/shared/shlib/distro.sh +2 -1
  776. data/spec/shared/shlib/server.sh +187 -40
  777. data/spec/shared/shlib/set_env.sh +49 -31
  778. data/spec/spec_helper.rb +46 -49
  779. data/spec/support/authorization.rb +1 -1
  780. data/spec/support/client_registry.rb +10 -0
  781. data/spec/support/constraints.rb +25 -1
  782. data/spec/support/crypt/models.rb +50 -0
  783. data/spec/support/crypt.rb +80 -0
  784. data/spec/support/expectations.rb +1 -1
  785. data/spec/support/feature_sandbox.rb +72 -0
  786. data/spec/support/helpers.rb +1 -0
  787. data/spec/support/immutable_ids.rb +119 -0
  788. data/spec/support/macros.rb +107 -1
  789. data/spec/support/models/account.rb +2 -2
  790. data/spec/support/models/acolyte.rb +1 -1
  791. data/spec/support/models/actor.rb +1 -1
  792. data/spec/support/models/actress.rb +1 -1
  793. data/spec/support/models/address.rb +7 -1
  794. data/spec/support/models/address_component.rb +1 -1
  795. data/spec/support/models/address_number.rb +1 -1
  796. data/spec/support/models/agency.rb +1 -1
  797. data/spec/support/models/agent.rb +1 -1
  798. data/spec/support/models/album.rb +1 -1
  799. data/spec/support/models/alert.rb +1 -1
  800. data/spec/support/models/animal.rb +1 -1
  801. data/spec/support/models/answer.rb +1 -1
  802. data/spec/support/models/appointment.rb +1 -1
  803. data/spec/support/models/armrest.rb +1 -1
  804. data/spec/support/models/array_field.rb +1 -1
  805. data/spec/support/models/article.rb +1 -1
  806. data/spec/support/models/artist.rb +3 -2
  807. data/spec/support/models/artwork.rb +1 -1
  808. data/spec/support/models/audible_sound.rb +4 -0
  809. data/spec/support/models/audio.rb +1 -1
  810. data/spec/support/models/augmentation.rb +13 -1
  811. data/spec/support/models/author.rb +1 -1
  812. data/spec/support/models/baby.rb +1 -1
  813. data/spec/support/models/band.rb +13 -1
  814. data/spec/support/models/bar.rb +1 -1
  815. data/spec/support/models/basic.rb +1 -1
  816. data/spec/support/models/bed.rb +1 -1
  817. data/spec/support/models/big_palette.rb +1 -1
  818. data/spec/support/models/birthday.rb +1 -1
  819. data/spec/support/models/bolt.rb +8 -0
  820. data/spec/support/models/bomb.rb +1 -1
  821. data/spec/support/models/book.rb +2 -1
  822. data/spec/support/models/breed.rb +1 -1
  823. data/spec/support/models/browser.rb +1 -1
  824. data/spec/support/models/building.rb +3 -1
  825. data/spec/support/models/building_address.rb +1 -1
  826. data/spec/support/models/bus.rb +1 -1
  827. data/spec/support/models/business.rb +1 -1
  828. data/spec/support/models/callback_test.rb +1 -1
  829. data/spec/support/models/canvas.rb +1 -1
  830. data/spec/support/models/car.rb +1 -1
  831. data/spec/support/models/cat.rb +1 -1
  832. data/spec/support/models/catalog.rb +25 -0
  833. data/spec/support/models/category.rb +1 -1
  834. data/spec/support/models/child.rb +1 -1
  835. data/spec/support/models/child_doc.rb +4 -4
  836. data/spec/support/models/church.rb +1 -1
  837. data/spec/support/models/circle.rb +1 -1
  838. data/spec/support/models/circuit.rb +1 -1
  839. data/spec/support/models/circus.rb +4 -1
  840. data/spec/support/models/code.rb +3 -1
  841. data/spec/support/models/coding/pull_request.rb +1 -1
  842. data/spec/support/models/coding.rb +1 -1
  843. data/spec/support/models/comment.rb +1 -1
  844. data/spec/support/models/company.rb +1 -1
  845. data/spec/support/models/consumption_period.rb +1 -1
  846. data/spec/support/models/contextable_item.rb +1 -1
  847. data/spec/support/models/contractor.rb +1 -1
  848. data/spec/support/models/cookie.rb +1 -1
  849. data/spec/support/models/country_code.rb +3 -1
  850. data/spec/support/models/courier_job.rb +1 -1
  851. data/spec/support/models/cover.rb +11 -0
  852. data/spec/support/models/crate.rb +1 -1
  853. data/spec/support/models/customer.rb +1 -1
  854. data/spec/support/models/customer_address.rb +1 -1
  855. data/spec/support/models/deed.rb +1 -1
  856. data/spec/support/models/definition.rb +1 -1
  857. data/spec/support/models/delegating_patient.rb +1 -1
  858. data/spec/support/models/description.rb +1 -1
  859. data/spec/support/models/dictionary.rb +1 -1
  860. data/spec/support/models/division.rb +1 -1
  861. data/spec/support/models/doctor.rb +1 -1
  862. data/spec/support/models/dog.rb +1 -1
  863. data/spec/support/models/dokument.rb +1 -1
  864. data/spec/support/models/draft.rb +1 -1
  865. data/spec/support/models/dragon.rb +1 -1
  866. data/spec/support/models/driver.rb +1 -1
  867. data/spec/support/models/drug.rb +1 -1
  868. data/spec/support/models/dungeon.rb +1 -1
  869. data/spec/support/models/edit.rb +1 -1
  870. data/spec/support/models/email.rb +1 -1
  871. data/spec/support/models/employer.rb +1 -1
  872. data/spec/support/models/entry.rb +1 -1
  873. data/spec/support/models/eraser.rb +1 -1
  874. data/spec/support/models/even.rb +1 -1
  875. data/spec/support/models/event.rb +1 -1
  876. data/spec/support/models/exhibition.rb +1 -1
  877. data/spec/support/models/exhibitor.rb +1 -1
  878. data/spec/support/models/explosion.rb +1 -1
  879. data/spec/support/models/eye.rb +1 -1
  880. data/spec/support/models/eye_bowl.rb +1 -1
  881. data/spec/support/models/face.rb +1 -1
  882. data/spec/support/models/fanatic.rb +9 -0
  883. data/spec/support/models/favorite.rb +8 -2
  884. data/spec/support/models/filesystem.rb +1 -1
  885. data/spec/support/models/fire_hydrant.rb +1 -1
  886. data/spec/support/models/firefox.rb +1 -1
  887. data/spec/support/models/fish.rb +1 -1
  888. data/spec/support/models/folder.rb +1 -1
  889. data/spec/support/models/folder_item.rb +1 -1
  890. data/spec/support/models/fruits.rb +1 -1
  891. data/spec/support/models/game.rb +1 -1
  892. data/spec/support/models/ghost.rb +1 -1
  893. data/spec/support/models/guitar.rb +1 -1
  894. data/spec/support/models/hole.rb +13 -0
  895. data/spec/support/models/home.rb +1 -1
  896. data/spec/support/models/house.rb +1 -1
  897. data/spec/support/models/html_writer.rb +1 -1
  898. data/spec/support/models/id_key.rb +1 -1
  899. data/spec/support/models/idnodef.rb +1 -1
  900. data/spec/support/models/image.rb +1 -1
  901. data/spec/support/models/implant.rb +10 -1
  902. data/spec/support/models/instrument.rb +1 -1
  903. data/spec/support/models/item.rb +1 -1
  904. data/spec/support/models/jar.rb +1 -1
  905. data/spec/support/models/kaleidoscope.rb +1 -1
  906. data/spec/support/models/kangaroo.rb +1 -1
  907. data/spec/support/models/label.rb +5 -2
  908. data/spec/support/models/language.rb +1 -1
  909. data/spec/support/models/lat_lng.rb +1 -1
  910. data/spec/support/models/league.rb +1 -1
  911. data/spec/support/models/learner.rb +1 -1
  912. data/spec/support/models/line_item.rb +1 -1
  913. data/spec/support/models/location.rb +1 -1
  914. data/spec/support/models/login.rb +1 -1
  915. data/spec/support/models/manufacturer.rb +1 -1
  916. data/spec/support/models/meat.rb +1 -1
  917. data/spec/support/models/membership.rb +2 -1
  918. data/spec/support/models/message.rb +1 -1
  919. data/spec/support/models/minim.rb +1 -1
  920. data/spec/support/models/mixed_drink.rb +1 -1
  921. data/spec/support/models/mop.rb +10 -1
  922. data/spec/support/models/movie.rb +1 -1
  923. data/spec/support/models/my_hash.rb +1 -1
  924. data/spec/support/models/name.rb +11 -1
  925. data/spec/support/models/name_only.rb +1 -1
  926. data/spec/support/models/node.rb +1 -1
  927. data/spec/support/models/note.rb +1 -1
  928. data/spec/support/models/nut.rb +8 -0
  929. data/spec/support/models/odd.rb +1 -1
  930. data/spec/support/models/order.rb +3 -1
  931. data/spec/support/models/ordered_post.rb +2 -2
  932. data/spec/support/models/ordered_preference.rb +1 -1
  933. data/spec/support/models/oscar.rb +1 -1
  934. data/spec/support/models/other_owner_object.rb +1 -1
  935. data/spec/support/models/override.rb +1 -1
  936. data/spec/support/models/ownable.rb +1 -1
  937. data/spec/support/models/owner.rb +1 -1
  938. data/spec/support/models/pack.rb +1 -1
  939. data/spec/support/models/page.rb +1 -1
  940. data/spec/support/models/page_question.rb +1 -1
  941. data/spec/support/models/palette.rb +1 -1
  942. data/spec/support/models/parent.rb +1 -1
  943. data/spec/support/models/parent_doc.rb +1 -1
  944. data/spec/support/models/passport.rb +15 -1
  945. data/spec/support/models/patient.rb +1 -1
  946. data/spec/support/models/pdf_writer.rb +1 -1
  947. data/spec/support/models/pencil.rb +1 -1
  948. data/spec/support/models/person.rb +19 -1
  949. data/spec/support/models/pet.rb +1 -1
  950. data/spec/support/models/pet_owner.rb +1 -1
  951. data/spec/support/models/phone.rb +3 -2
  952. data/spec/support/models/piano.rb +1 -1
  953. data/spec/support/models/pizza.rb +1 -1
  954. data/spec/support/models/player.rb +3 -1
  955. data/spec/support/models/post.rb +1 -1
  956. data/spec/support/models/post_genre.rb +1 -1
  957. data/spec/support/models/powerup.rb +13 -1
  958. data/spec/support/models/preference.rb +1 -1
  959. data/spec/support/models/princess.rb +1 -1
  960. data/spec/support/models/product.rb +2 -1
  961. data/spec/support/models/profile.rb +1 -1
  962. data/spec/support/models/pronunciation.rb +1 -1
  963. data/spec/support/models/pub.rb +1 -1
  964. data/spec/support/models/publication/encyclopedia.rb +1 -1
  965. data/spec/support/models/publication/review.rb +1 -1
  966. data/spec/support/models/publication.rb +1 -1
  967. data/spec/support/models/purchase.rb +1 -1
  968. data/spec/support/models/purchased_item.rb +11 -0
  969. data/spec/support/models/purse.rb +9 -0
  970. data/spec/support/models/question.rb +1 -1
  971. data/spec/support/models/quiz.rb +1 -1
  972. data/spec/support/models/rating.rb +1 -1
  973. data/spec/support/models/record.rb +1 -1
  974. data/spec/support/models/registry.rb +2 -1
  975. data/spec/support/models/role.rb +1 -1
  976. data/spec/support/models/root_category.rb +1 -1
  977. data/spec/support/models/sandbox/app/models/app_models_message.rb +4 -0
  978. data/spec/support/models/sandbox/lib/models/lib_models_message.rb +4 -0
  979. data/spec/support/models/sandbox/sandbox_message.rb +4 -0
  980. data/spec/support/models/sandbox/sandbox_user.rb +4 -0
  981. data/spec/support/models/sandbox/subdir/sandbox_comment.rb +4 -0
  982. data/spec/support/models/sandwich.rb +1 -1
  983. data/spec/support/models/scheduler.rb +1 -1
  984. data/spec/support/models/school.rb +15 -0
  985. data/spec/support/models/scribe.rb +1 -1
  986. data/spec/support/models/sealer.rb +8 -0
  987. data/spec/support/models/seat.rb +1 -1
  988. data/spec/support/models/seo.rb +1 -1
  989. data/spec/support/models/series.rb +1 -1
  990. data/spec/support/models/server.rb +1 -1
  991. data/spec/support/models/service.rb +1 -1
  992. data/spec/support/models/shape.rb +1 -1
  993. data/spec/support/models/shelf.rb +1 -1
  994. data/spec/support/models/shield.rb +19 -0
  995. data/spec/support/models/shipment_address.rb +1 -1
  996. data/spec/support/models/shipping_container.rb +1 -1
  997. data/spec/support/models/shipping_pack.rb +1 -1
  998. data/spec/support/models/shirt.rb +12 -0
  999. data/spec/support/models/shop.rb +1 -1
  1000. data/spec/support/models/short_agent.rb +1 -1
  1001. data/spec/support/models/short_quiz.rb +1 -1
  1002. data/spec/support/models/simple.rb +1 -1
  1003. data/spec/support/models/slave.rb +1 -1
  1004. data/spec/support/models/song.rb +1 -1
  1005. data/spec/support/models/sound.rb +1 -1
  1006. data/spec/support/models/spacer.rb +8 -0
  1007. data/spec/support/models/square.rb +1 -1
  1008. data/spec/support/models/staff.rb +1 -1
  1009. data/spec/support/models/store_as_dup_test1.rb +1 -1
  1010. data/spec/support/models/store_as_dup_test2.rb +1 -1
  1011. data/spec/support/models/store_as_dup_test3.rb +1 -1
  1012. data/spec/support/models/store_as_dup_test4.rb +1 -1
  1013. data/spec/support/models/strategy.rb +1 -1
  1014. data/spec/support/models/student.rb +15 -0
  1015. data/spec/support/models/sub_item.rb +1 -1
  1016. data/spec/support/models/subscription.rb +1 -1
  1017. data/spec/support/models/survey.rb +1 -1
  1018. data/spec/support/models/symptom.rb +1 -1
  1019. data/spec/support/models/system_role.rb +1 -0
  1020. data/spec/support/models/tag.rb +1 -1
  1021. data/spec/support/models/target.rb +1 -1
  1022. data/spec/support/models/template.rb +1 -1
  1023. data/spec/support/models/thing.rb +1 -1
  1024. data/spec/support/models/threadlocker.rb +8 -0
  1025. data/spec/support/models/title.rb +1 -1
  1026. data/spec/support/models/tool.rb +1 -1
  1027. data/spec/support/models/topping.rb +1 -1
  1028. data/spec/support/models/toy.rb +1 -1
  1029. data/spec/support/models/track.rb +1 -1
  1030. data/spec/support/models/translation.rb +1 -1
  1031. data/spec/support/models/tree.rb +1 -1
  1032. data/spec/support/models/truck.rb +1 -1
  1033. data/spec/support/models/updatable.rb +1 -1
  1034. data/spec/support/models/user.rb +1 -1
  1035. data/spec/support/models/user_account.rb +1 -1
  1036. data/spec/support/models/validation_callback.rb +1 -1
  1037. data/spec/support/models/vehicle.rb +1 -1
  1038. data/spec/support/models/version.rb +1 -1
  1039. data/spec/support/models/vertex.rb +1 -1
  1040. data/spec/support/models/vet_visit.rb +1 -1
  1041. data/spec/support/models/video.rb +1 -1
  1042. data/spec/support/models/video_game.rb +1 -1
  1043. data/spec/support/models/washer.rb +8 -0
  1044. data/spec/support/models/weapon.rb +13 -1
  1045. data/spec/support/models/wiki_page.rb +1 -1
  1046. data/spec/support/models/word.rb +1 -1
  1047. data/spec/support/models/word_origin.rb +1 -1
  1048. data/spec/support/models/writer.rb +1 -1
  1049. data/spec/support/rails_mock.rb +32 -0
  1050. data/spec/support/schema_maps/schema_map_aws.json +17 -0
  1051. data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  1052. data/spec/support/schema_maps/schema_map_azure.json +17 -0
  1053. data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  1054. data/spec/support/schema_maps/schema_map_gcp.json +17 -0
  1055. data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  1056. data/spec/support/schema_maps/schema_map_kmip.json +17 -0
  1057. data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  1058. data/spec/support/schema_maps/schema_map_local.json +18 -0
  1059. data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
  1060. data/spec/support/shared/time.rb +3 -22
  1061. data/spec/support/sinatra_mock.rb +7 -0
  1062. data/spec/support/spec_config.rb +42 -7
  1063. data.tar.gz.sig +0 -0
  1064. metadata +883 -562
  1065. metadata.gz.sig +0 -0
  1066. data/lib/mongoid/association/referenced/eager.rb +0 -184
  1067. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +0 -128
  1068. data/lib/mongoid/contextual/geo_near.rb +0 -269
  1069. data/lib/mongoid/errors/eager_load.rb +0 -26
  1070. data/lib/mongoid/errors/invalid_session_use.rb +0 -26
  1071. data/lib/mongoid/errors/invalid_storage_parent.rb +0 -28
  1072. data/lib/mongoid/errors/invalid_value.rb +0 -18
  1073. data/lib/mongoid/query_cache.rb +0 -333
  1074. data/lib/support/ruby_version.rb +0 -29
  1075. data/spec/mongoid/contextual/geo_near_spec.rb +0 -472
  1076. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -61
  1077. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -61
  1078. data/spec/mongoid/extensions_spec.rb +0 -32
  1079. data/spec/mongoid/query_cache_middleware_spec.rb +0 -61
  1080. data/spec/mongoid/query_cache_spec.rb +0 -978
  1081. data/spec/support/cluster_config.rb +0 -158
  1082. data/spec/support/session_registry.rb +0 -50
@@ -1,14 +1,10 @@
1
1
  # frozen_string_literal: true
2
- # encoding: utf-8
2
+ # rubocop:todo all
3
3
 
4
4
  require "spec_helper"
5
5
 
6
6
  describe Mongoid::Fields do
7
7
 
8
- before(:all) do
9
- Mongoid.use_activesupport_time_zone = false
10
- end
11
-
12
8
  describe "#\{field}_translations" do
13
9
 
14
10
  let(:product) do
@@ -18,18 +14,15 @@ describe Mongoid::Fields do
18
14
  context "when the field is localized" do
19
15
 
20
16
  context "when translations exist" do
17
+ with_default_i18n_configs
21
18
 
22
19
  before do
20
+ I18n.locale = :en
23
21
  product.description = "test"
24
- I18n.enforce_available_locales = false
25
- ::I18n.locale = :de
22
+ I18n.locale = :de
26
23
  product.description = "The best"
27
24
  end
28
25
 
29
- after do
30
- ::I18n.locale = :en
31
- end
32
-
33
26
  let(:translations) do
34
27
  product.description_translations
35
28
  end
@@ -110,7 +103,7 @@ describe Mongoid::Fields do
110
103
  context "when saving the new translations" do
111
104
 
112
105
  before do
113
- product.save
106
+ product.save!
114
107
  end
115
108
 
116
109
  it "persists the changes" do
@@ -121,7 +114,7 @@ describe Mongoid::Fields do
121
114
 
122
115
  before do
123
116
  product.description_translations = { "en" => "overwritten" }
124
- product.save
117
+ product.save!
125
118
  end
126
119
 
127
120
  it "persists the changes" do
@@ -152,7 +145,7 @@ describe Mongoid::Fields do
152
145
  context "when saving the new translations" do
153
146
 
154
147
  before do
155
- dictionary.save
148
+ dictionary.save!
156
149
  end
157
150
 
158
151
  it "persists the changes" do
@@ -165,7 +158,7 @@ describe Mongoid::Fields do
165
158
 
166
159
  before do
167
160
  dictionary.description_translations = { "en" => "overwritten" }
168
- dictionary.save
161
+ dictionary.save!
169
162
  end
170
163
 
171
164
  it "persists the changes" do
@@ -322,7 +315,7 @@ describe Mongoid::Fields do
322
315
  end
323
316
 
324
317
  it "converts to Mongoid::Boolean" do
325
- expect(klass.field(:test, type: Boolean).type).to be(Mongoid::Boolean)
318
+ expect(klass.field(:test, type: Mongoid::Boolean).type).to be(Mongoid::Boolean)
326
319
  end
327
320
  end
328
321
 
@@ -397,6 +390,22 @@ describe Mongoid::Fields do
397
390
  it "converts :time to Time" do
398
391
  expect(klass.field(:test, type: :time).type).to be(Time)
399
392
  end
393
+
394
+ context 'when using an unknown symbol' do
395
+ it 'raises InvalidFieldType' do
396
+ lambda do
397
+ klass.field(:test, type: :bogus)
398
+ end.should raise_error(Mongoid::Errors::InvalidFieldType, /defines a field 'test' with an unknown type value :bogus/)
399
+ end
400
+ end
401
+
402
+ context 'when using an unknown string' do
403
+ it 'raises InvalidFieldType' do
404
+ lambda do
405
+ klass.field(:test, type: 'bogus')
406
+ end.should raise_error(Mongoid::Errors::InvalidFieldType, /defines a field 'test' with an unknown type value "bogus"/)
407
+ end
408
+ end
400
409
  end
401
410
 
402
411
  context "when the options are valid" do
@@ -404,7 +413,7 @@ describe Mongoid::Fields do
404
413
  context "when the options are all standard" do
405
414
 
406
415
  before do
407
- Band.field :acceptable, type: Boolean
416
+ Band.field :acceptable, type: Mongoid::Boolean
408
417
  end
409
418
 
410
419
  after do
@@ -419,7 +428,7 @@ describe Mongoid::Fields do
419
428
  context "when a custom option is provided" do
420
429
 
421
430
  before do
422
- Band.field :acceptable, type: Boolean, custom: true
431
+ Band.field :acceptable, type: Mongoid::Boolean, custom: true
423
432
  end
424
433
 
425
434
  it "adds the field to the model" do
@@ -431,25 +440,25 @@ describe Mongoid::Fields do
431
440
  context "when the Symbol type is used" do
432
441
 
433
442
  before do
434
- Mongoid::Fields::Validators::Macro.class_eval do
435
- @field_type_is_symbol_warned = false
443
+ Mongoid::Warnings.class_eval do
444
+ @symbol_type_deprecated = false
436
445
  end
437
446
  end
438
447
 
439
448
  after do
440
- Band.fields.delete("should_warn")
449
+ Label.fields.delete("should_warn")
441
450
  end
442
451
 
443
452
  it "warns that the BSON symbol type is deprecated" do
444
453
  expect(Mongoid.logger).to receive(:warn)
445
454
 
446
- Band.field :should_warn, type: Symbol
455
+ Label.field :should_warn, type: Symbol
447
456
  end
448
457
 
449
458
  it "warns on first use of Symbol type only" do
450
459
  expect(Mongoid.logger).to receive(:warn).once
451
460
 
452
- Band.field :should_warn, type: Symbol
461
+ Label.field :should_warn, type: Symbol
453
462
  end
454
463
 
455
464
  context 'when using Symbol field type in multiple classes' do
@@ -460,7 +469,7 @@ describe Mongoid::Fields do
460
469
  it "warns on first use of Symbol type only" do
461
470
  expect(Mongoid.logger).to receive(:warn).once
462
471
 
463
- Band.field :should_warn, type: Symbol
472
+ Label.field :should_warn, type: Symbol
464
473
  Truck.field :should_warn, type: Symbol
465
474
  end
466
475
  end
@@ -470,7 +479,7 @@ describe Mongoid::Fields do
470
479
 
471
480
  it "raises an error" do
472
481
  expect {
473
- Band.field :unacceptable, bad: true
482
+ Label.field :unacceptable, bad: true
474
483
  }.to raise_error(Mongoid::Errors::InvalidFieldOption)
475
484
  end
476
485
  end
@@ -515,16 +524,13 @@ describe Mongoid::Fields do
515
524
  end
516
525
 
517
526
  context "when a single locale is set" do
527
+ with_default_i18n_configs
518
528
 
519
529
  before do
520
- ::I18n.locale = :de
530
+ I18n.locale = :de
521
531
  product.description = "The best"
522
532
  end
523
533
 
524
- after do
525
- ::I18n.locale = :en
526
- end
527
-
528
534
  let(:description) do
529
535
  product.description
530
536
  end
@@ -535,17 +541,15 @@ describe Mongoid::Fields do
535
541
  end
536
542
 
537
543
  context "when multiple locales are set" do
544
+ with_default_i18n_configs
538
545
 
539
546
  before do
547
+ I18n.locale = :end
540
548
  product.description = "Cheap drinks"
541
- ::I18n.locale = :de
549
+ I18n.locale = :de
542
550
  product.description = "Cheaper drinks"
543
551
  end
544
552
 
545
- after do
546
- ::I18n.locale = :en
547
- end
548
-
549
553
  let(:description) do
550
554
  product.description
551
555
  end
@@ -555,6 +559,49 @@ describe Mongoid::Fields do
555
559
  end
556
560
  end
557
561
  end
562
+
563
+ context 'when the field is declared as BSON::Decimal128' do
564
+ let(:document) { Mop.create!(decimal128_field: BSON::Decimal128.new(Math::PI.to_s)).reload }
565
+
566
+ shared_context 'BSON::Decimal128 is BigDecimal' do
567
+ it 'should return a BigDecimal' do
568
+ expect(document.decimal128_field).to be_a BigDecimal
569
+ end
570
+ end
571
+
572
+ shared_context 'BSON::Decimal128 is BSON::Decimal128' do
573
+ it 'should return a BSON::Decimal128' do
574
+ expect(document.decimal128_field).to be_a BSON::Decimal128
575
+ end
576
+ end
577
+
578
+ it 'is declared as BSON::Decimal128' do
579
+ expect(Mop.fields['decimal128_field'].type).to be == BSON::Decimal128
580
+ end
581
+
582
+ context 'when BSON version <= 4' do
583
+ max_bson_version '4.99.99'
584
+ it_behaves_like 'BSON::Decimal128 is BSON::Decimal128'
585
+ end
586
+
587
+ context 'when BSON version >= 5' do
588
+ min_bson_version '5.0.0'
589
+
590
+ context 'when allow_bson5_decimal128 is false' do
591
+ config_override :allow_bson5_decimal128, false
592
+ it_behaves_like 'BSON::Decimal128 is BigDecimal'
593
+ end
594
+
595
+ context 'when allow_bson5_decimal128 is true' do
596
+ config_override :allow_bson5_decimal128, true
597
+ it_behaves_like 'BSON::Decimal128 is BSON::Decimal128'
598
+ end
599
+
600
+ context 'when allow_bson5_decimal128 is default' do
601
+ it_behaves_like 'BSON::Decimal128 is BigDecimal'
602
+ end
603
+ end
604
+ end
558
605
  end
559
606
 
560
607
  describe "#getter_before_type_cast" do
@@ -572,8 +619,144 @@ describe Mongoid::Fields do
572
619
  context "when the attribute has been assigned" do
573
620
 
574
621
  it "returns the attribute before type cast" do
575
- person.age = "old"
576
- expect(person.age_before_type_cast).to eq("old")
622
+ person.age = "42"
623
+ expect(person.age_before_type_cast).to eq("42")
624
+ end
625
+ end
626
+
627
+ context "when reloading" do
628
+
629
+ let(:product) do
630
+ Product.create!(price: '1')
631
+ end
632
+
633
+ before do
634
+ product.reload
635
+ end
636
+
637
+ it "resets the attributes_before_type_cast to the attributes hash" do
638
+ expect(product.attributes_before_type_cast).to eq(product.attributes)
639
+ end
640
+
641
+ it "the *_before_type_cast method returns the demongoized value" do
642
+ expect(product.price_before_type_cast).to eq(1)
643
+ end
644
+ end
645
+
646
+ context "when reloading and writing a demongoizable value" do
647
+
648
+ let(:product) do
649
+ Product.create!.tap do |product|
650
+ Product.collection.update_one({ _id: product.id }, { :$set => { price: '1' }})
651
+ end
652
+ end
653
+
654
+ before do
655
+ product.reload
656
+ end
657
+
658
+ it "resets the attributes_before_type_cast to the attributes hash" do
659
+ expect(product.attributes_before_type_cast).to eq(product.attributes)
660
+ end
661
+
662
+ it "the *_before_type_cast method returns the mongoized value" do
663
+ expect(product.price_before_type_cast).to eq('1')
664
+ end
665
+ end
666
+
667
+ context "when reading from the db" do
668
+
669
+ let(:product) do
670
+ Product.create!(price: '1')
671
+ end
672
+
673
+ let(:from_db) do
674
+ Product.find(product.id)
675
+ end
676
+
677
+ it "resets the attributes_before_type_cast to the attributes hash" do
678
+ expect(from_db.attributes_before_type_cast).to eq(from_db.attributes)
679
+ end
680
+
681
+ it "the *_before_type_cast method returns the demongoized value" do
682
+ expect(from_db.price_before_type_cast).to eq(1)
683
+ end
684
+ end
685
+
686
+ context "when reading from the db after writing a demongoizable value" do
687
+
688
+ let(:product) do
689
+ Product.create!.tap do |product|
690
+ Product.collection.update_one({ _id: product.id }, { :$set => { price: '1' }})
691
+ end
692
+ end
693
+
694
+ let(:from_db) do
695
+ Product.find(product.id)
696
+ end
697
+
698
+ it "resets the attributes_before_type_cast to the attributes hash" do
699
+ expect(from_db.attributes_before_type_cast).to eq(from_db.attributes)
700
+ end
701
+
702
+ it "the *_before_type_cast method returns the mongoized value" do
703
+ expect(from_db.price_before_type_cast).to eq('1')
704
+ end
705
+ end
706
+
707
+ context "when making a new model" do
708
+
709
+ context "when using new with no options" do
710
+ let(:product) { Product.new }
711
+
712
+ it "sets the attributes_before_type_cast to the attributes hash" do
713
+ expect(product.attributes_before_type_cast).to eq(product.attributes)
714
+ end
715
+ end
716
+
717
+ context "when using new with options" do
718
+ let(:product) { Product.new(price: '1') }
719
+
720
+ let(:abtc) do
721
+ product.attributes.merge('price' => '1')
722
+ end
723
+
724
+ it "has the attributes before type cast" do
725
+ expect(product.attributes_before_type_cast).to eq(abtc)
726
+ end
727
+ end
728
+
729
+ context "when persisting the model" do
730
+ let(:product) { Product.new(price: '1') }
731
+
732
+ let(:abtc) do
733
+ product.attributes.merge('price' => '1')
734
+ end
735
+
736
+ before do
737
+ expect(product.attributes_before_type_cast).to eq(abtc)
738
+ product.save!
739
+ end
740
+
741
+ it "resets the attributes_before_type_cast to the attributes" do
742
+ expect(product.attributes_before_type_cast).to eq(product.attributes)
743
+ end
744
+ end
745
+
746
+ context "when using create! without options" do
747
+ let(:product) { Product.create! }
748
+
749
+ it "resets the attributes_before_type_cast to the attributes" do
750
+ expect(product.attributes_before_type_cast).to eq(product.attributes)
751
+ end
752
+ end
753
+
754
+ context "when using create! with options" do
755
+ let(:product) { Product.create!(price: '1') }
756
+
757
+ it "resets the attributes_before_type_cast to the attributes" do
758
+ expect(product.attributes_before_type_cast).to eq(product.attributes)
759
+ end
577
760
  end
578
761
  end
579
762
  end
@@ -621,14 +804,14 @@ describe Mongoid::Fields do
621
804
 
622
805
  before do
623
806
  product.stores = [ "kadewe", "karstadt" ]
624
- product.save
807
+ product.save!
625
808
  end
626
809
 
627
810
  context "when setting the value to nil" do
628
811
 
629
812
  before do
630
813
  product.stores = nil
631
- product.save
814
+ product.save!
632
815
  end
633
816
 
634
817
  it "allows the set" do
@@ -640,7 +823,7 @@ describe Mongoid::Fields do
640
823
 
641
824
  before do
642
825
  product.stores = [ "kadewe", nil ]
643
- product.save
826
+ product.save!
644
827
  end
645
828
 
646
829
  it "allows the set of nil values" do
@@ -656,7 +839,7 @@ describe Mongoid::Fields do
656
839
 
657
840
  before do
658
841
  product.stores = [ "karstadt", "kadewe" ]
659
- product.save
842
+ product.save!
660
843
  end
661
844
 
662
845
  it "reverses the values" do
@@ -687,16 +870,13 @@ describe Mongoid::Fields do
687
870
  end
688
871
 
689
872
  context "when a locale is set" do
873
+ with_default_i18n_configs
690
874
 
691
875
  before do
692
- ::I18n.locale = :de
876
+ I18n.locale = :de
693
877
  product.description = "Cheaper drinks"
694
878
  end
695
879
 
696
- after do
697
- ::I18n.locale = :en
698
- end
699
-
700
880
  let(:description) do
701
881
  product.attributes["description"]
702
882
  end
@@ -707,17 +887,15 @@ describe Mongoid::Fields do
707
887
  end
708
888
 
709
889
  context "when having multiple locales" do
890
+ with_default_i18n_configs
710
891
 
711
892
  before do
893
+ I18n.locale = :en
712
894
  product.description = "Cheap drinks"
713
- ::I18n.locale = :de
895
+ I18n.locale = :de
714
896
  product.description = "Cheaper drinks"
715
897
  end
716
898
 
717
- after do
718
- ::I18n.locale = :en
719
- end
720
-
721
899
  let(:description) do
722
900
  product.attributes["description"]
723
901
  end
@@ -729,6 +907,50 @@ describe Mongoid::Fields do
729
907
  end
730
908
  end
731
909
  end
910
+
911
+ context "when the field needs to be mongoized" do
912
+
913
+ before do
914
+ product.price = "1"
915
+ product.save!
916
+ end
917
+
918
+ it "mongoizes the value" do
919
+ expect(product.price).to eq(1)
920
+ end
921
+
922
+ it "stores the value in the mongoized form" do
923
+ expect(product.attributes_before_type_cast["price"]).to eq(1)
924
+ end
925
+ end
926
+
927
+ context "when assigning a hash" do
928
+ let(:person) { Person.create!(map: { x: 1 }) }
929
+
930
+ it "is a BSON::Document" do
931
+ expect(person.map).to be_a(BSON::Document)
932
+ end
933
+
934
+ it "has the correct contents" do
935
+ expect(person.map).to eq({ "x" => 1 })
936
+ end
937
+ end
938
+
939
+ context "when loading a hash from the db" do
940
+ before do
941
+ Person.create!(map: { x: 1 })
942
+ end
943
+
944
+ let(:person) { Person.first }
945
+
946
+ it "is a BSON::Document" do
947
+ expect(person.map).to be_a(BSON::Document)
948
+ end
949
+
950
+ it "has the correct contents" do
951
+ expect(person.map).to eq({ "x" => 1 })
952
+ end
953
+ end
732
954
  end
733
955
 
734
956
  describe "#defaults" do
@@ -865,39 +1087,37 @@ describe Mongoid::Fields do
865
1087
  it "raises an error" do
866
1088
  expect {
867
1089
  Person.field(meth)
868
- }.to raise_error(Mongoid::Errors::InvalidField)
1090
+ }.to raise_error(Mongoid::Errors::InvalidField, /Defining a field named '#{meth}' is not allowed/)
869
1091
  end
870
1092
  end
871
1093
  end
872
1094
  end
873
1095
 
874
1096
  context "when field already exist and validate_duplicate is enable" do
1097
+ context 'when exception is enabled' do
1098
+ config_override :duplicate_fields_exception, true
875
1099
 
876
- before do
877
- Mongoid.duplicate_fields_exception = true
878
- end
879
-
880
- after do
881
- Mongoid.duplicate_fields_exception = false
882
- end
883
-
884
- it "raises an error" do
885
- expect {
886
- Person.field(:title)
887
- }.to raise_error(Mongoid::Errors::InvalidField)
1100
+ it "raises an error" do
1101
+ expect {
1102
+ Person.field(:title)
1103
+ }.to raise_error(Mongoid::Errors::InvalidField)
1104
+ end
888
1105
  end
889
1106
 
890
- it "doesn't raise an error" do
891
- expect {
892
- Class.new(Person)
893
- }.to_not raise_error
1107
+ context 'when exception is disabled' do
1108
+ config_override :duplicate_fields_exception, false
1109
+ it "doesn't raise an error" do
1110
+ expect {
1111
+ Class.new(Person)
1112
+ }.to_not raise_error
1113
+ end
894
1114
  end
895
1115
  end
896
1116
 
897
1117
  context "when the field is a time" do
898
1118
 
899
1119
  let!(:time) do
900
- Time.now
1120
+ Time.find_zone('UTC').parse('2023-03-03 10:30:53')
901
1121
  end
902
1122
 
903
1123
  let!(:person) do
@@ -905,17 +1125,11 @@ describe Mongoid::Fields do
905
1125
  end
906
1126
 
907
1127
  context "when reading the field" do
908
-
909
- before do
910
- Time.zone = "Berlin"
911
- end
912
-
913
- after do
914
- Time.zone = nil
915
- end
1128
+ time_zone_override 'Europe/Berlin'
916
1129
 
917
1130
  it "performs the necessary time conversions" do
918
- expect(person.lunch_time.to_s).to eq(time.getlocal.to_s)
1131
+ expect(person.lunch_time.to_s).to eq('2023-03-03 11:30:53 +0100')
1132
+ expect(person.lunch_time.time_zone.name).to eq('Europe/Berlin')
919
1133
  end
920
1134
  end
921
1135
  end
@@ -990,11 +1204,11 @@ describe Mongoid::Fields do
990
1204
  end
991
1205
 
992
1206
  before do
993
- Person.field :aliased, as: :alias, type: Boolean, overwrite: true
1207
+ Person.field :aliased, as: :alias, type: Mongoid::Boolean, overwrite: true
994
1208
  end
995
1209
 
996
1210
  it "uses the alias to write the attribute" do
997
- (person.alias = expect(true)).to be true
1211
+ expect(person.alias = true).to be true
998
1212
  end
999
1213
 
1000
1214
  it "uses the alias to read the attribute" do
@@ -1006,7 +1220,7 @@ describe Mongoid::Fields do
1006
1220
  end
1007
1221
 
1008
1222
  it "uses the name to write the attribute" do
1009
- (person.aliased = expect(true)).to be true
1223
+ expect(person.aliased = true).to be true
1010
1224
  end
1011
1225
 
1012
1226
  it "uses the name to read the attribute" do
@@ -1235,71 +1449,147 @@ describe Mongoid::Fields do
1235
1449
 
1236
1450
  context "when a field is defined as a big decimal" do
1237
1451
 
1238
- let(:band) do
1239
- Band.new(name: "Tool")
1240
- end
1452
+ context 'when Mongoid.map_big_decimal_to_decimal128 is false' do
1453
+ config_override :map_big_decimal_to_decimal128, false
1241
1454
 
1242
- let(:decimal) do
1243
- BigDecimal("1000000.00")
1244
- end
1245
-
1246
- context "when setting to a big decimal" do
1247
-
1248
- before do
1249
- band.sales = decimal
1455
+ let(:band) do
1456
+ Band.new(name: "Tool")
1250
1457
  end
1251
1458
 
1252
- it "properly persists as a string" do
1253
- expect(band.attributes["sales"]).to eq(decimal.to_s)
1459
+ let(:decimal) do
1460
+ BigDecimal("1000000.00")
1254
1461
  end
1255
1462
 
1256
- it "returns the proper big decimal" do
1257
- expect(band.sales).to eq(decimal)
1463
+ context "when setting to a big decimal" do
1464
+
1465
+ before do
1466
+ band.sales = decimal
1467
+ end
1468
+
1469
+ it "properly persists as a string" do
1470
+ expect(band.attributes["sales"]).to eq(decimal.to_s)
1471
+ end
1472
+
1473
+ it "returns the proper big decimal" do
1474
+ expect(band.sales).to eq(decimal)
1475
+ end
1258
1476
  end
1259
- end
1260
1477
 
1261
- context "when setting to a string" do
1478
+ context "when setting to a string" do
1262
1479
 
1263
- before do
1264
- band.sales = decimal.to_s
1480
+ before do
1481
+ band.sales = decimal.to_s
1482
+ end
1483
+
1484
+ it "properly persists as a string" do
1485
+ expect(band.attributes["sales"]).to eq(decimal.to_s)
1486
+ end
1487
+
1488
+ it "returns the proper big decimal" do
1489
+ expect(band.sales).to eq(decimal)
1490
+ end
1265
1491
  end
1266
1492
 
1267
- it "properly persists as a string" do
1268
- expect(band.attributes["sales"]).to eq(decimal.to_s)
1493
+ context "when setting to an integer" do
1494
+
1495
+ before do
1496
+ band.sales = decimal.to_i
1497
+ end
1498
+
1499
+ it "properly persists as a string" do
1500
+ expect(band.attributes["sales"]).to eq("1000000")
1501
+ end
1502
+
1503
+ it "returns the proper big decimal" do
1504
+ expect(band.sales).to eq(decimal)
1505
+ end
1269
1506
  end
1270
1507
 
1271
- it "returns the proper big decimal" do
1272
- expect(band.sales).to eq(decimal)
1508
+ context "when setting to a float" do
1509
+
1510
+ before do
1511
+ band.sales = decimal.to_f
1512
+ end
1513
+
1514
+ it "properly persists as a string" do
1515
+ expect(band.attributes["sales"]).to eq(decimal.to_s)
1516
+ end
1517
+
1518
+ it "returns the proper big decimal" do
1519
+ expect(band.sales).to eq(decimal)
1520
+ end
1273
1521
  end
1274
1522
  end
1275
1523
 
1276
- context "when setting to an integer" do
1524
+ context 'when Mongoid.map_big_decimal_to_decimal128 is true' do
1525
+ config_override :map_big_decimal_to_decimal128, true
1277
1526
 
1278
- before do
1279
- band.sales = decimal.to_i
1527
+ let(:band) do
1528
+ Band.new(name: "Tool")
1280
1529
  end
1281
1530
 
1282
- it "properly persists as a string" do
1283
- expect(band.attributes["sales"]).to eq("1000000")
1531
+ let(:decimal) do
1532
+ BigDecimal("1000000.00")
1284
1533
  end
1285
1534
 
1286
- it "returns the proper big decimal" do
1287
- expect(band.sales).to eq(decimal)
1535
+ context "when setting to a big decimal" do
1536
+
1537
+ before do
1538
+ band.sales = decimal
1539
+ end
1540
+
1541
+ it "properly persists as a BSON::Decimal128" do
1542
+ expect(band.attributes["sales"]).to eq(BSON::Decimal128.new(decimal))
1543
+ end
1544
+
1545
+ it "returns the proper big decimal" do
1546
+ expect(band.sales).to eq(decimal)
1547
+ end
1288
1548
  end
1289
- end
1290
1549
 
1291
- context "when setting to a float" do
1550
+ context "when setting to a string" do
1292
1551
 
1293
- before do
1294
- band.sales = decimal.to_f
1552
+ before do
1553
+ band.sales = decimal.to_s
1554
+ end
1555
+
1556
+ it "persists as a BSON::Decimal128" do
1557
+ expect(band.attributes["sales"]).to eq(BSON::Decimal128.new(decimal.to_s))
1558
+ end
1559
+
1560
+ it "returns the proper big decimal" do
1561
+ expect(band.sales).to eq(decimal)
1562
+ end
1295
1563
  end
1296
1564
 
1297
- it "properly persists as a string" do
1298
- expect(band.attributes["sales"]).to eq(decimal.to_s)
1565
+ context "when setting to an integer" do
1566
+
1567
+ before do
1568
+ band.sales = decimal.to_i
1569
+ end
1570
+
1571
+ it "persists as a BSON::Decimal128" do
1572
+ expect(band.attributes["sales"]).to eq(BSON::Decimal128.new(decimal.to_i.to_s))
1573
+ end
1574
+
1575
+ it "returns the proper big decimal" do
1576
+ expect(band.sales).to eq(decimal)
1577
+ end
1299
1578
  end
1300
1579
 
1301
- it "returns the proper big decimal" do
1302
- expect(band.sales).to eq(decimal)
1580
+ context "when setting to a float" do
1581
+
1582
+ before do
1583
+ band.sales = decimal.to_f
1584
+ end
1585
+
1586
+ it "properly persists as a BSON::Decimal128" do
1587
+ expect(band.attributes["sales"]).to eq(BSON::Decimal128.new(decimal.to_f.to_s))
1588
+ end
1589
+
1590
+ it "returns the proper big decimal" do
1591
+ expect(band.sales).to eq(decimal)
1592
+ end
1303
1593
  end
1304
1594
  end
1305
1595
  end
@@ -1307,7 +1597,7 @@ describe Mongoid::Fields do
1307
1597
  context "when the field is a hash of arrays" do
1308
1598
 
1309
1599
  let(:person) do
1310
- Person.create
1600
+ Person.create!
1311
1601
  end
1312
1602
 
1313
1603
  let(:map) do
@@ -1321,7 +1611,7 @@ describe Mongoid::Fields do
1321
1611
  before do
1322
1612
  person.map = map
1323
1613
  person.map["stack1"].reverse!
1324
- person.save
1614
+ person.save!
1325
1615
  end
1326
1616
 
1327
1617
  it "properly updates the hash" do
@@ -1398,4 +1688,419 @@ describe Mongoid::Fields do
1398
1688
  end
1399
1689
  end
1400
1690
  end
1691
+
1692
+ describe '.database_field_name' do
1693
+
1694
+ shared_examples_for 'database_field_name' do
1695
+ subject { Person.database_field_name(key) }
1696
+
1697
+ context 'non-aliased field name' do
1698
+ let(:key) { 't' }
1699
+ it { is_expected.to eq 't' }
1700
+ end
1701
+
1702
+ context 'aliased field name' do
1703
+ let(:key) { 'test' }
1704
+ it { is_expected.to eq 't' }
1705
+ end
1706
+
1707
+ context 'non-aliased embeds one relation' do
1708
+ let(:key) { 'pass' }
1709
+ it { is_expected.to eq 'pass' }
1710
+ end
1711
+
1712
+ context 'aliased embeds one relation' do
1713
+ let(:key) { 'passport' }
1714
+ it { is_expected.to eq 'pass' }
1715
+ end
1716
+
1717
+ context 'non-aliased embeds many relation' do
1718
+ let(:key) { 'mobile_phones' }
1719
+ it { is_expected.to eq 'mobile_phones' }
1720
+ end
1721
+
1722
+ context 'aliased embeds many relation' do
1723
+ let(:key) { 'phones' }
1724
+ it { is_expected.to eq 'mobile_phones' }
1725
+ end
1726
+
1727
+ context 'non-aliased embeds one field' do
1728
+ let(:key) { 'pass.exp' }
1729
+ it { is_expected.to eq 'pass.exp' }
1730
+ end
1731
+
1732
+ context 'aliased embeds one field' do
1733
+ let(:key) { 'passport.expiration_date' }
1734
+ it { is_expected.to eq 'pass.exp' }
1735
+ end
1736
+
1737
+ context 'non-aliased embeds many field' do
1738
+ let(:key) { 'mobile_phones.landline' }
1739
+ it { is_expected.to eq 'mobile_phones.landline' }
1740
+ end
1741
+
1742
+ context 'aliased embeds many field' do
1743
+ let(:key) { 'phones.extension' }
1744
+ it { is_expected.to eq 'mobile_phones.ext' }
1745
+ end
1746
+
1747
+ context 'aliased multi-level embedded document' do
1748
+ let(:key) { 'phones.extension' }
1749
+ it { is_expected.to eq 'mobile_phones.ext' }
1750
+ end
1751
+
1752
+ context 'non-aliased multi-level embedded document' do
1753
+ let(:key) { 'phones.extension' }
1754
+ it { is_expected.to eq 'mobile_phones.ext' }
1755
+ end
1756
+
1757
+ context 'aliased multi-level embedded document field' do
1758
+ let(:key) { 'mobile_phones.country_code.code' }
1759
+ it { is_expected.to eq 'mobile_phones.country_code.code' }
1760
+ end
1761
+
1762
+ context 'non-aliased multi-level embedded document field' do
1763
+ let(:key) { 'phones.country_code.iso_alpha2_code' }
1764
+ it { is_expected.to eq 'mobile_phones.country_code.iso' }
1765
+ end
1766
+
1767
+ context 'when field is unknown' do
1768
+ let(:key) { 'shenanigans' }
1769
+ it { is_expected.to eq 'shenanigans' }
1770
+ end
1771
+
1772
+ context 'when embedded field is unknown' do
1773
+ let(:key) { 'phones.bamboozle' }
1774
+ it { is_expected.to eq 'mobile_phones.bamboozle' }
1775
+ end
1776
+
1777
+ context 'when multi-level embedded field is unknown' do
1778
+ let(:key) { 'phones.bamboozle.brouhaha' }
1779
+ it { is_expected.to eq 'mobile_phones.bamboozle.brouhaha' }
1780
+ end
1781
+ end
1782
+
1783
+ shared_examples_for 'pre-fix database_field_name' do
1784
+ subject { Person.database_field_name(key) }
1785
+
1786
+ context 'non-aliased field name' do
1787
+ let(:key) { 't' }
1788
+ it { is_expected.to eq 't' }
1789
+ end
1790
+
1791
+ context 'aliased field name' do
1792
+ let(:key) { 'test' }
1793
+ it { is_expected.to eq 't' }
1794
+ end
1795
+
1796
+ context 'non-aliased embeds one relation' do
1797
+ let(:key) { 'pass' }
1798
+ it { is_expected.to eq 'pass' }
1799
+ end
1800
+
1801
+ context 'aliased embeds one relation' do
1802
+ let(:key) { 'passport' }
1803
+ it { is_expected.to eq 'pass' }
1804
+ end
1805
+
1806
+ context 'non-aliased embeds many relation' do
1807
+ let(:key) { 'mobile_phones' }
1808
+ it { is_expected.to eq 'mobile_phones' }
1809
+ end
1810
+
1811
+ context 'aliased embeds many relation' do
1812
+ let(:key) { 'phones' }
1813
+ it { is_expected.to eq 'mobile_phones' }
1814
+ end
1815
+
1816
+ context 'non-aliased embeds one field' do
1817
+ let(:key) { 'pass.exp' }
1818
+ it { is_expected.to eq 'pass.exp' }
1819
+ end
1820
+
1821
+ context 'aliased embeds one field' do
1822
+ let(:key) { 'passport.expiration_date' }
1823
+ it { is_expected.to eq 'passport.expiration_date' }
1824
+ end
1825
+
1826
+ context 'non-aliased embeds many field' do
1827
+ let(:key) { 'mobile_phones.landline' }
1828
+ it { is_expected.to eq 'mobile_phones.landline' }
1829
+ end
1830
+
1831
+ context 'aliased embeds many field' do
1832
+ let(:key) { 'phones.extension' }
1833
+ it { is_expected.to eq 'phones.extension' }
1834
+ end
1835
+
1836
+ context 'aliased multi-level embedded document' do
1837
+ let(:key) { 'phones.extension' }
1838
+ it { is_expected.to eq 'phones.extension' }
1839
+ end
1840
+
1841
+ context 'non-aliased multi-level embedded document' do
1842
+ let(:key) { 'phones.extension' }
1843
+ it { is_expected.to eq 'phones.extension' }
1844
+ end
1845
+
1846
+ context 'aliased multi-level embedded document field' do
1847
+ let(:key) { 'mobile_phones.country_code.code' }
1848
+ it { is_expected.to eq 'mobile_phones.country_code.code' }
1849
+ end
1850
+
1851
+ context 'non-aliased multi-level embedded document field' do
1852
+ let(:key) { 'phones.country_code.iso_alpha2_code' }
1853
+ it { is_expected.to eq 'phones.country_code.iso_alpha2_code' }
1854
+ end
1855
+
1856
+ context 'when field is unknown' do
1857
+ let(:key) { 'shenanigans' }
1858
+ it { is_expected.to eq 'shenanigans' }
1859
+ end
1860
+
1861
+ context 'when embedded field is unknown' do
1862
+ let(:key) { 'phones.bamboozle' }
1863
+ it { is_expected.to eq 'phones.bamboozle' }
1864
+ end
1865
+
1866
+ context 'when multi-level embedded field is unknown' do
1867
+ let(:key) { 'phones.bamboozle.brouhaha' }
1868
+ it { is_expected.to eq 'phones.bamboozle.brouhaha' }
1869
+ end
1870
+ end
1871
+
1872
+ context 'given nil' do
1873
+ subject { Person.database_field_name(nil) }
1874
+ it { is_expected.to eq nil }
1875
+ end
1876
+
1877
+ context 'given an empty String' do
1878
+ subject { Person.database_field_name('') }
1879
+ it { is_expected.to eq nil }
1880
+ end
1881
+
1882
+ context 'given a String' do
1883
+ subject { Person.database_field_name(key.to_s) }
1884
+ it_behaves_like 'database_field_name'
1885
+ end
1886
+
1887
+ context 'given a Symbol' do
1888
+ subject { Person.database_field_name(key.to_sym) }
1889
+ it_behaves_like 'database_field_name'
1890
+ end
1891
+
1892
+ context 'when getting the database field name of a belongs_to associations' do
1893
+
1894
+ context "when the association is the last item" do
1895
+ let(:name) do
1896
+ Game.database_field_name("person")
1897
+ end
1898
+
1899
+ it "gets the alias" do
1900
+ expect(name).to eq("person_id")
1901
+ end
1902
+ end
1903
+
1904
+ context "when the association is not the last item" do
1905
+ let(:name) do
1906
+ Game.database_field_name("person.name")
1907
+ end
1908
+
1909
+ it "gets the alias" do
1910
+ expect(name).to eq("person.name")
1911
+ end
1912
+ end
1913
+ end
1914
+ end
1915
+
1916
+ describe "#get_field" do
1917
+
1918
+ let(:klass) { Person }
1919
+ let(:field) { klass.cleanse_localized_field_names(field_name) }
1920
+
1921
+ context "when cleansing a field" do
1922
+ let(:field_name) { "employer_id" }
1923
+ it "returns the correct field name" do
1924
+ expect(field).to eq(field_name)
1925
+ end
1926
+ end
1927
+
1928
+ context "when cleansing a localized field" do
1929
+ let(:field_name) { "desc" }
1930
+ it "returns the correct field name" do
1931
+ expect(field).to eq(field_name)
1932
+ end
1933
+ end
1934
+
1935
+ context "when cleansing a translation field" do
1936
+ let(:field_name) { "desc_translations" }
1937
+ it "returns the correct field name" do
1938
+ expect(field).to eq("desc")
1939
+ end
1940
+ end
1941
+
1942
+ context "when cleansing an existing translation field" do
1943
+ let(:field_name) { "localized_translations" }
1944
+ it "returns the correct field name" do
1945
+ expect(field).to eq(field_name)
1946
+ end
1947
+ end
1948
+
1949
+ context "when cleansing an existing translation field with a _translations" do
1950
+ let(:field_name) { "localized_translations_translations" }
1951
+ it "returns the correct field name" do
1952
+ expect(field).to eq("localized_translations")
1953
+ end
1954
+ end
1955
+
1956
+ context "when cleansing dotted translation field" do
1957
+ let(:field_name) { "passport.name_translations.asd" }
1958
+ it "returns the correct field name" do
1959
+ expect(field).to eq("pass.name.asd")
1960
+ end
1961
+ end
1962
+
1963
+ context "when cleansing dotted translation field as a symbol" do
1964
+ let(:field_name) { "passport.name_translations.asd".to_sym }
1965
+ it "returns the correct field name" do
1966
+ expect(field).to eq("pass.name.asd")
1967
+ end
1968
+ end
1969
+
1970
+ context "when cleansing dotted existing translation field" do
1971
+ let(:field_name) { "passport.localized_translations.asd" }
1972
+ it "returns the correct field name" do
1973
+ expect(field).to eq("pass.localized_translations.asd")
1974
+ end
1975
+ end
1976
+
1977
+ context "when cleansing aliased dotted translation field" do
1978
+ let(:field_name) { "pass.name_translations.asd" }
1979
+ it "returns the correct field name" do
1980
+ expect(field).to eq("pass.name.asd")
1981
+ end
1982
+ end
1983
+ end
1984
+
1985
+ describe "localize: :present" do
1986
+
1987
+ let(:product) do
1988
+ Product.new
1989
+ end
1990
+
1991
+ context "when assigning a non blank value" do
1992
+
1993
+ before do
1994
+ product.title = "hello"
1995
+ end
1996
+
1997
+ it "assigns the value" do
1998
+ expect(product.title).to eq("hello")
1999
+ end
2000
+
2001
+ it "populates the translations hash" do
2002
+ expect(product.title_translations).to eq({ "en" => "hello" })
2003
+ end
2004
+ end
2005
+
2006
+ context "when assigning an empty string" do
2007
+ with_default_i18n_configs
2008
+
2009
+ before do
2010
+ I18n.locale = :en
2011
+ product.title = "hello"
2012
+ I18n.locale = :de
2013
+ product.title = "hello there!"
2014
+ product.title = ""
2015
+ end
2016
+
2017
+ it "assigns the value" do
2018
+ expect(product.title).to eq(nil)
2019
+ end
2020
+
2021
+ it "populates the translations hash" do
2022
+ expect(product.title_translations).to eq({ "en" => "hello" })
2023
+ end
2024
+ end
2025
+
2026
+ context "when assigning nil" do
2027
+ with_default_i18n_configs
2028
+
2029
+ before do
2030
+ I18n.locale = :en
2031
+ product.title = "hello"
2032
+ I18n.locale = :de
2033
+ product.title = "hello there!"
2034
+ product.title = nil
2035
+ end
2036
+
2037
+ it "assigns the value" do
2038
+ expect(product.title).to eq(nil)
2039
+ end
2040
+
2041
+ it "populates the translations hash" do
2042
+ expect(product.title_translations).to eq({ "en" => "hello" })
2043
+ end
2044
+ end
2045
+
2046
+ context "when assigning an empty array" do
2047
+ with_default_i18n_configs
2048
+
2049
+ before do
2050
+ I18n.locale = :en
2051
+ product.title = "hello"
2052
+ I18n.locale = :de
2053
+ product.title = "hello there!"
2054
+ product.title = []
2055
+ end
2056
+
2057
+ it "assigns the value" do
2058
+ expect(product.title).to eq(nil)
2059
+ end
2060
+
2061
+ it "populates the translations hash" do
2062
+ expect(product.title_translations).to eq({ "en" => "hello" })
2063
+ end
2064
+ end
2065
+
2066
+ context "when assigning an empty string first" do
2067
+ with_default_i18n_configs
2068
+
2069
+ before do
2070
+ product.title = ""
2071
+ end
2072
+
2073
+ it "assigns the value" do
2074
+ expect(product.title).to eq(nil)
2075
+ end
2076
+
2077
+ it "populates the translations hash" do
2078
+ expect(product.title_translations).to eq({})
2079
+ end
2080
+ end
2081
+
2082
+ context "when assigning an empty string with only one translation" do
2083
+ with_default_i18n_configs
2084
+
2085
+ before do
2086
+ product.title = "Hello"
2087
+ product.title = ""
2088
+ product.save!
2089
+ end
2090
+
2091
+ let(:from_db) { Product.first }
2092
+
2093
+ it "assigns the value" do
2094
+ expect(product.title).to eq(nil)
2095
+ end
2096
+
2097
+ it "populates the translations hash" do
2098
+ expect(product.title_translations).to eq({})
2099
+ end
2100
+
2101
+ it "round trips an empty hash" do
2102
+ expect(from_db.title_translations).to eq({})
2103
+ end
2104
+ end
2105
+ end
1401
2106
  end