mongoid 7.0.2 → 8.1.1

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