mongoid 7.0.13 → 8.0.8

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 (1089) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +30 -30
  4. data/README.md +32 -19
  5. data/Rakefile +43 -0
  6. data/lib/config/locales/en.yml +178 -95
  7. data/lib/mongoid/association/accessors.rb +175 -83
  8. data/lib/mongoid/association/bindable.rb +57 -28
  9. data/lib/mongoid/association/builders.rb +8 -14
  10. data/lib/mongoid/association/constrainable.rb +5 -7
  11. data/lib/mongoid/association/depending.rb +9 -18
  12. data/lib/mongoid/association/eager_loadable.rb +31 -10
  13. data/lib/mongoid/association/embedded/batchable.rb +67 -53
  14. data/lib/mongoid/association/embedded/cyclic.rb +10 -17
  15. data/lib/mongoid/association/embedded/embedded_in/binding.rb +27 -9
  16. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +7 -4
  17. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +14 -24
  18. data/lib/mongoid/association/embedded/embedded_in.rb +9 -28
  19. data/lib/mongoid/association/embedded/embeds_many/binding.rb +5 -8
  20. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +8 -5
  21. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +143 -122
  22. data/lib/mongoid/association/embedded/embeds_many.rb +8 -36
  23. data/lib/mongoid/association/embedded/embeds_one/binding.rb +4 -8
  24. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +26 -9
  25. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +63 -29
  26. data/lib/mongoid/association/embedded/embeds_one.rb +9 -33
  27. data/lib/mongoid/association/embedded.rb +2 -0
  28. data/lib/mongoid/association/macros.rb +71 -41
  29. data/lib/mongoid/association/many.rb +25 -35
  30. data/lib/mongoid/association/marshalable.rb +3 -6
  31. data/lib/mongoid/association/nested/many.rb +22 -30
  32. data/lib/mongoid/association/nested/nested_buildable.rb +9 -15
  33. data/lib/mongoid/association/nested/one.rb +19 -30
  34. data/lib/mongoid/association/nested.rb +3 -3
  35. data/lib/mongoid/association/one.rb +5 -12
  36. data/lib/mongoid/association/options.rb +16 -46
  37. data/lib/mongoid/association/proxy.rb +37 -38
  38. data/lib/mongoid/association/referenced/auto_save.rb +9 -14
  39. data/lib/mongoid/association/referenced/belongs_to/binding.rb +5 -9
  40. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +11 -9
  41. data/lib/mongoid/association/referenced/belongs_to/eager.rb +40 -3
  42. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +19 -31
  43. data/lib/mongoid/association/referenced/belongs_to.rb +16 -38
  44. data/lib/mongoid/association/referenced/counter_cache.rb +14 -25
  45. data/lib/mongoid/association/referenced/eager.rb +41 -40
  46. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +12 -11
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +5 -5
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -1
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +105 -68
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +29 -46
  51. data/lib/mongoid/association/referenced/has_many/binding.rb +3 -6
  52. data/lib/mongoid/association/referenced/has_many/buildable.rb +5 -5
  53. data/lib/mongoid/association/referenced/has_many/eager.rb +2 -1
  54. data/lib/mongoid/association/referenced/has_many/enumerable.rb +440 -456
  55. data/lib/mongoid/association/referenced/has_many/proxy.rb +101 -124
  56. data/lib/mongoid/association/referenced/has_many.rb +21 -45
  57. data/lib/mongoid/association/referenced/has_one/binding.rb +4 -9
  58. data/lib/mongoid/association/referenced/has_one/buildable.rb +20 -6
  59. data/lib/mongoid/association/referenced/has_one/eager.rb +2 -1
  60. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +16 -29
  61. data/lib/mongoid/association/referenced/has_one/proxy.rb +25 -30
  62. data/lib/mongoid/association/referenced/has_one.rb +16 -36
  63. data/lib/mongoid/association/referenced/syncable.rb +11 -26
  64. data/lib/mongoid/association/referenced.rb +2 -0
  65. data/lib/mongoid/association/reflections.rb +7 -6
  66. data/lib/mongoid/association/relatable.rb +62 -84
  67. data/lib/mongoid/association.rb +13 -27
  68. data/lib/mongoid/atomic/modifiers.rb +29 -53
  69. data/lib/mongoid/atomic/paths/embedded/many.rb +23 -7
  70. data/lib/mongoid/atomic/paths/embedded/one.rb +4 -7
  71. data/lib/mongoid/atomic/paths/embedded.rb +2 -3
  72. data/lib/mongoid/atomic/paths/root.rb +4 -7
  73. data/lib/mongoid/atomic/paths.rb +2 -1
  74. data/lib/mongoid/atomic.rb +45 -51
  75. data/lib/mongoid/attributes/dynamic.rb +6 -21
  76. data/lib/mongoid/attributes/nested.rb +11 -14
  77. data/lib/mongoid/attributes/processing.rb +46 -30
  78. data/lib/mongoid/attributes/projector.rb +119 -0
  79. data/lib/mongoid/attributes/readonly.rb +5 -8
  80. data/lib/mongoid/attributes.rb +80 -98
  81. data/lib/mongoid/cacheable.rb +7 -10
  82. data/lib/mongoid/changeable.rb +49 -70
  83. data/lib/mongoid/clients/factory.rb +42 -17
  84. data/lib/mongoid/clients/options.rb +15 -14
  85. data/lib/mongoid/clients/sessions.rb +4 -20
  86. data/lib/mongoid/clients/storage_options.rb +7 -12
  87. data/lib/mongoid/clients/validators/storage.rb +5 -12
  88. data/lib/mongoid/clients/validators.rb +2 -1
  89. data/lib/mongoid/clients.rb +3 -10
  90. data/lib/mongoid/composable.rb +5 -9
  91. data/lib/mongoid/config/environment.rb +30 -5
  92. data/lib/mongoid/config/options.rb +23 -23
  93. data/lib/mongoid/config/validators/client.rb +8 -23
  94. data/lib/mongoid/config/validators/option.rb +2 -3
  95. data/lib/mongoid/config/validators.rb +2 -1
  96. data/lib/mongoid/config.rb +164 -48
  97. data/lib/mongoid/contextual/aggregable/memory.rb +40 -27
  98. data/lib/mongoid/contextual/aggregable/mongo.rb +32 -33
  99. data/lib/mongoid/contextual/aggregable/none.rb +65 -0
  100. data/lib/mongoid/contextual/aggregable.rb +17 -0
  101. data/lib/mongoid/contextual/atomic.rb +29 -31
  102. data/lib/mongoid/contextual/command.rb +2 -5
  103. data/lib/mongoid/contextual/geo_near.rb +13 -44
  104. data/lib/mongoid/contextual/map_reduce.rb +7 -35
  105. data/lib/mongoid/contextual/memory.rb +187 -81
  106. data/lib/mongoid/contextual/mongo.rb +360 -239
  107. data/lib/mongoid/contextual/none.rb +109 -31
  108. data/lib/mongoid/contextual/queryable.rb +3 -4
  109. data/lib/mongoid/contextual.rb +9 -11
  110. data/lib/mongoid/copyable.rb +42 -17
  111. data/lib/mongoid/criteria/findable.rb +19 -19
  112. data/lib/mongoid/criteria/includable.rb +30 -33
  113. data/lib/mongoid/criteria/inspectable.rb +2 -3
  114. data/lib/mongoid/criteria/marshalable.rb +12 -7
  115. data/lib/mongoid/criteria/modifiable.rb +2 -19
  116. data/lib/mongoid/criteria/options.rb +2 -3
  117. data/lib/mongoid/criteria/permission.rb +3 -2
  118. data/lib/mongoid/criteria/queryable/aggregable.rb +4 -15
  119. data/lib/mongoid/criteria/queryable/expandable.rb +68 -0
  120. data/lib/mongoid/criteria/queryable/extensions/array.rb +7 -41
  121. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +28 -8
  122. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +5 -6
  123. data/lib/mongoid/criteria/queryable/extensions/date.rb +9 -9
  124. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +11 -12
  125. data/lib/mongoid/criteria/queryable/extensions/hash.rb +4 -41
  126. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +3 -14
  127. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +4 -21
  128. data/lib/mongoid/criteria/queryable/extensions/object.rb +6 -30
  129. data/lib/mongoid/criteria/queryable/extensions/range.rb +49 -17
  130. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +9 -16
  131. data/lib/mongoid/criteria/queryable/extensions/set.rb +4 -5
  132. data/lib/mongoid/criteria/queryable/extensions/string.rb +7 -32
  133. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +7 -22
  134. data/lib/mongoid/criteria/queryable/extensions/time.rb +9 -9
  135. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +9 -9
  136. data/lib/mongoid/criteria/queryable/extensions.rb +1 -4
  137. data/lib/mongoid/criteria/queryable/key.rb +39 -24
  138. data/lib/mongoid/criteria/queryable/macroable.rb +3 -4
  139. data/lib/mongoid/criteria/queryable/mergeable.rb +200 -40
  140. data/lib/mongoid/criteria/queryable/optional.rb +10 -59
  141. data/lib/mongoid/criteria/queryable/options.rb +4 -21
  142. data/lib/mongoid/criteria/queryable/pipeline.rb +5 -15
  143. data/lib/mongoid/criteria/queryable/selectable.rb +417 -171
  144. data/lib/mongoid/criteria/queryable/selector.rb +127 -30
  145. data/lib/mongoid/criteria/queryable/smash.rb +42 -18
  146. data/lib/mongoid/criteria/queryable/storable.rb +237 -0
  147. data/lib/mongoid/criteria/queryable.rb +18 -15
  148. data/lib/mongoid/criteria/scopable.rb +29 -21
  149. data/lib/mongoid/criteria/translator.rb +45 -0
  150. data/lib/mongoid/criteria.rb +95 -107
  151. data/lib/mongoid/deprecable.rb +37 -0
  152. data/lib/mongoid/deprecation.rb +25 -0
  153. data/lib/mongoid/document.rb +148 -97
  154. data/lib/mongoid/equality.rb +35 -18
  155. data/lib/mongoid/errors/ambiguous_relationship.rb +4 -5
  156. data/lib/mongoid/errors/callback.rb +2 -3
  157. data/lib/mongoid/errors/criteria_argument_required.rb +18 -0
  158. data/lib/mongoid/errors/delete_restriction.rb +10 -13
  159. data/lib/mongoid/errors/document_not_destroyed.rb +4 -7
  160. data/lib/mongoid/errors/document_not_found.rb +35 -21
  161. data/lib/mongoid/errors/empty_config_file.rb +25 -0
  162. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +2 -3
  163. data/lib/mongoid/errors/invalid_collection.rb +2 -1
  164. data/lib/mongoid/errors/invalid_config_file.rb +25 -0
  165. data/lib/mongoid/errors/invalid_config_option.rb +3 -4
  166. data/lib/mongoid/errors/invalid_dependent_strategy.rb +3 -4
  167. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +24 -0
  168. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  169. data/lib/mongoid/errors/invalid_elem_match_operator.rb +32 -0
  170. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +25 -0
  171. data/lib/mongoid/errors/invalid_expression_operator.rb +27 -0
  172. data/lib/mongoid/errors/invalid_field.rb +8 -7
  173. data/lib/mongoid/errors/invalid_field_operator.rb +32 -0
  174. data/lib/mongoid/errors/invalid_field_option.rb +2 -3
  175. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  176. data/lib/mongoid/errors/invalid_find.rb +2 -3
  177. data/lib/mongoid/errors/invalid_includes.rb +2 -3
  178. data/lib/mongoid/errors/invalid_index.rb +2 -3
  179. data/lib/mongoid/errors/invalid_options.rb +4 -5
  180. data/lib/mongoid/errors/invalid_path.rb +2 -3
  181. data/lib/mongoid/errors/invalid_persistence_option.rb +2 -5
  182. data/lib/mongoid/errors/invalid_query.rb +40 -0
  183. data/lib/mongoid/errors/invalid_relation.rb +5 -10
  184. data/lib/mongoid/errors/invalid_relation_option.rb +4 -5
  185. data/lib/mongoid/errors/invalid_scope.rb +2 -3
  186. data/lib/mongoid/errors/invalid_session_use.rb +3 -6
  187. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +6 -5
  188. data/lib/mongoid/errors/invalid_storage_options.rb +3 -4
  189. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -3
  190. data/lib/mongoid/errors/invalid_time.rb +2 -3
  191. data/lib/mongoid/errors/inverse_not_found.rb +3 -4
  192. data/lib/mongoid/errors/mixed_client_configuration.rb +2 -3
  193. data/lib/mongoid/errors/mixed_relations.rb +2 -3
  194. data/lib/mongoid/errors/mongoid_error.rb +6 -13
  195. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +3 -4
  196. data/lib/mongoid/errors/no_client_config.rb +4 -5
  197. data/lib/mongoid/errors/no_client_database.rb +3 -4
  198. data/lib/mongoid/errors/no_client_hosts.rb +3 -4
  199. data/lib/mongoid/errors/no_clients_config.rb +2 -3
  200. data/lib/mongoid/errors/no_default_client.rb +3 -4
  201. data/lib/mongoid/errors/no_environment.rb +2 -3
  202. data/lib/mongoid/errors/no_map_reduce_output.rb +2 -3
  203. data/lib/mongoid/errors/no_metadata.rb +2 -3
  204. data/lib/mongoid/errors/no_parent.rb +2 -3
  205. data/lib/mongoid/errors/readonly_attribute.rb +3 -4
  206. data/lib/mongoid/errors/readonly_document.rb +3 -6
  207. data/lib/mongoid/errors/scope_overwrite.rb +2 -1
  208. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +3 -1
  209. data/lib/mongoid/errors/unknown_attribute.rb +3 -4
  210. data/lib/mongoid/errors/unknown_model.rb +2 -3
  211. data/lib/mongoid/errors/unsaved_document.rb +3 -2
  212. data/lib/mongoid/errors/unsupported_javascript.rb +2 -3
  213. data/lib/mongoid/errors/validations.rb +2 -1
  214. data/lib/mongoid/errors.rb +14 -3
  215. data/lib/mongoid/evolvable.rb +4 -5
  216. data/lib/mongoid/extensions/array.rb +37 -44
  217. data/lib/mongoid/extensions/big_decimal.rb +35 -21
  218. data/lib/mongoid/extensions/binary.rb +42 -0
  219. data/lib/mongoid/extensions/boolean.rb +10 -6
  220. data/lib/mongoid/extensions/date.rb +32 -25
  221. data/lib/mongoid/extensions/date_time.rb +5 -13
  222. data/lib/mongoid/extensions/decimal128.rb +2 -5
  223. data/lib/mongoid/extensions/false_class.rb +5 -8
  224. data/lib/mongoid/extensions/float.rb +12 -14
  225. data/lib/mongoid/extensions/hash.rb +87 -45
  226. data/lib/mongoid/extensions/integer.rb +12 -16
  227. data/lib/mongoid/extensions/module.rb +3 -4
  228. data/lib/mongoid/extensions/nil_class.rb +2 -5
  229. data/lib/mongoid/extensions/object.rb +25 -50
  230. data/lib/mongoid/extensions/object_id.rb +2 -7
  231. data/lib/mongoid/extensions/range.rb +42 -20
  232. data/lib/mongoid/extensions/regexp.rb +13 -7
  233. data/lib/mongoid/extensions/set.rb +13 -11
  234. data/lib/mongoid/extensions/string.rb +30 -61
  235. data/lib/mongoid/extensions/symbol.rb +6 -22
  236. data/lib/mongoid/extensions/time.rb +37 -23
  237. data/lib/mongoid/extensions/time_with_zone.rb +26 -9
  238. data/lib/mongoid/extensions/true_class.rb +5 -8
  239. data/lib/mongoid/extensions.rb +19 -3
  240. data/lib/mongoid/factory.rb +104 -17
  241. data/lib/mongoid/fields/foreign_key.rb +14 -26
  242. data/lib/mongoid/fields/localized.rb +11 -15
  243. data/lib/mongoid/fields/standard.rb +13 -43
  244. data/lib/mongoid/fields/validators/macro.rb +32 -20
  245. data/lib/mongoid/fields/validators.rb +2 -1
  246. data/lib/mongoid/fields.rb +328 -85
  247. data/lib/mongoid/findable.rb +90 -33
  248. data/lib/mongoid/indexable/specification.rb +5 -18
  249. data/lib/mongoid/indexable/validators/options.rb +8 -9
  250. data/lib/mongoid/indexable.rb +6 -21
  251. data/lib/mongoid/inspectable.rb +4 -11
  252. data/lib/mongoid/interceptable.rb +191 -41
  253. data/lib/mongoid/loggable.rb +13 -16
  254. data/lib/mongoid/matchable.rb +3 -154
  255. data/lib/mongoid/matcher/all.rb +22 -0
  256. data/lib/mongoid/matcher/and.rb +21 -0
  257. data/lib/mongoid/matcher/bits.rb +41 -0
  258. data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
  259. data/lib/mongoid/matcher/bits_all_set.rb +20 -0
  260. data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
  261. data/lib/mongoid/matcher/bits_any_set.rb +20 -0
  262. data/lib/mongoid/matcher/elem_match.rb +36 -0
  263. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  264. data/lib/mongoid/matcher/eq.rb +11 -0
  265. data/lib/mongoid/matcher/eq_impl.rb +67 -0
  266. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +26 -0
  267. data/lib/mongoid/matcher/exists.rb +15 -0
  268. data/lib/mongoid/matcher/expression.rb +35 -0
  269. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  270. data/lib/mongoid/matcher/field_expression.rb +62 -0
  271. data/lib/mongoid/matcher/field_operator.rb +54 -0
  272. data/lib/mongoid/matcher/gt.rb +17 -0
  273. data/lib/mongoid/matcher/gte.rb +17 -0
  274. data/lib/mongoid/matcher/in.rb +25 -0
  275. data/lib/mongoid/matcher/lt.rb +17 -0
  276. data/lib/mongoid/matcher/lte.rb +17 -0
  277. data/lib/mongoid/matcher/mod.rb +17 -0
  278. data/lib/mongoid/matcher/ne.rb +16 -0
  279. data/lib/mongoid/matcher/nin.rb +11 -0
  280. data/lib/mongoid/matcher/nor.rb +25 -0
  281. data/lib/mongoid/matcher/not.rb +29 -0
  282. data/lib/mongoid/matcher/or.rb +21 -0
  283. data/lib/mongoid/matcher/regex.rb +41 -0
  284. data/lib/mongoid/matcher/size.rb +26 -0
  285. data/lib/mongoid/matcher/type.rb +99 -0
  286. data/lib/mongoid/matcher.rb +130 -0
  287. data/lib/mongoid/persistable/creatable.rb +22 -30
  288. data/lib/mongoid/persistable/deletable.rb +6 -22
  289. data/lib/mongoid/persistable/destroyable.rb +12 -11
  290. data/lib/mongoid/persistable/incrementable.rb +6 -7
  291. data/lib/mongoid/persistable/logical.rb +4 -6
  292. data/lib/mongoid/persistable/poppable.rb +3 -6
  293. data/lib/mongoid/persistable/pullable.rb +3 -8
  294. data/lib/mongoid/persistable/pushable.rb +3 -8
  295. data/lib/mongoid/persistable/renamable.rb +10 -8
  296. data/lib/mongoid/persistable/savable.rb +5 -10
  297. data/lib/mongoid/persistable/settable.rb +3 -6
  298. data/lib/mongoid/persistable/unsettable.rb +9 -9
  299. data/lib/mongoid/persistable/updatable.rb +50 -31
  300. data/lib/mongoid/persistable/upsertable.rb +5 -10
  301. data/lib/mongoid/persistable.rb +135 -40
  302. data/lib/mongoid/persistence_context.rb +85 -45
  303. data/lib/mongoid/positional.rb +2 -5
  304. data/lib/mongoid/query_cache.rb +13 -280
  305. data/lib/mongoid/railtie.rb +3 -16
  306. data/lib/mongoid/railties/controller_runtime.rb +4 -2
  307. data/lib/mongoid/railties/database.rake +9 -0
  308. data/lib/mongoid/reloadable.rb +19 -22
  309. data/lib/mongoid/scopable.rb +34 -57
  310. data/lib/mongoid/selectable.rb +8 -18
  311. data/lib/mongoid/serializable.rb +33 -34
  312. data/lib/mongoid/shardable.rb +108 -21
  313. data/lib/mongoid/stateful.rb +38 -19
  314. data/lib/mongoid/stringified_symbol.rb +52 -0
  315. data/lib/mongoid/tasks/database.rake +12 -5
  316. data/lib/mongoid/tasks/database.rb +85 -7
  317. data/lib/mongoid/threaded/lifecycle.rb +7 -26
  318. data/lib/mongoid/threaded.rb +44 -67
  319. data/lib/mongoid/timestamps/created/short.rb +2 -1
  320. data/lib/mongoid/timestamps/created.rb +4 -3
  321. data/lib/mongoid/timestamps/short.rb +2 -1
  322. data/lib/mongoid/timestamps/timeless.rb +6 -9
  323. data/lib/mongoid/timestamps/updated/short.rb +2 -1
  324. data/lib/mongoid/timestamps/updated.rb +5 -6
  325. data/lib/mongoid/timestamps.rb +3 -2
  326. data/lib/mongoid/touchable.rb +54 -25
  327. data/lib/mongoid/traversable.rb +185 -61
  328. data/lib/mongoid/validatable/associated.rb +99 -22
  329. data/lib/mongoid/validatable/format.rb +2 -1
  330. data/lib/mongoid/validatable/length.rb +2 -1
  331. data/lib/mongoid/validatable/localizable.rb +3 -4
  332. data/lib/mongoid/validatable/macros.rb +2 -9
  333. data/lib/mongoid/validatable/presence.rb +10 -15
  334. data/lib/mongoid/validatable/queryable.rb +2 -3
  335. data/lib/mongoid/validatable/uniqueness.rb +29 -41
  336. data/lib/mongoid/validatable.rb +22 -33
  337. data/lib/mongoid/version.rb +2 -2
  338. data/lib/mongoid/warnings.rb +28 -0
  339. data/lib/mongoid.rb +34 -15
  340. data/lib/rails/generators/mongoid/config/config_generator.rb +2 -1
  341. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +53 -32
  342. data/lib/rails/generators/mongoid/model/model_generator.rb +3 -2
  343. data/lib/rails/generators/mongoid_generator.rb +2 -1
  344. data/lib/rails/mongoid.rb +4 -5
  345. data/spec/README.md +19 -4
  346. data/spec/config/mongoid.yml +17 -0
  347. data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
  348. data/spec/integration/app_spec.rb +31 -27
  349. data/spec/integration/associations/belongs_to_spec.rb +20 -0
  350. data/spec/integration/associations/embedded_dirty_spec.rb +57 -0
  351. data/spec/integration/associations/embedded_spec.rb +162 -55
  352. data/spec/integration/associations/embeds_many_spec.rb +219 -0
  353. data/spec/integration/associations/embeds_one_spec.rb +41 -0
  354. data/spec/integration/associations/foreign_key_spec.rb +107 -0
  355. data/spec/integration/associations/foreign_key_spec_models.rb +64 -0
  356. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +61 -0
  357. data/spec/integration/associations/has_many_spec.rb +128 -0
  358. data/spec/integration/associations/has_one_spec.rb +272 -0
  359. data/spec/integration/associations/nested_attributes_assignment_spec.rb +115 -0
  360. data/spec/integration/associations/reverse_population_spec.rb +34 -0
  361. data/spec/integration/associations/reverse_population_spec_models.rb +36 -0
  362. data/spec/integration/associations/scope_option_spec.rb +101 -0
  363. data/spec/integration/atomic/modifiers_spec.rb +116 -0
  364. data/spec/integration/bson_regexp_raw_spec.rb +19 -0
  365. data/spec/integration/callbacks_models.rb +107 -1
  366. data/spec/integration/callbacks_spec.rb +262 -8
  367. data/spec/integration/contextual/empty_spec.rb +141 -0
  368. data/spec/integration/criteria/alias_query_spec.rb +161 -0
  369. data/spec/integration/criteria/date_field_spec.rb +1 -2
  370. data/spec/integration/criteria/default_scope_spec.rb +72 -0
  371. data/spec/integration/criteria/logical_spec.rb +124 -0
  372. data/spec/integration/criteria/range_spec.rb +359 -0
  373. data/spec/integration/criteria/time_with_zone_spec.rb +125 -15
  374. data/spec/integration/discriminator_key_spec.rb +392 -0
  375. data/spec/integration/discriminator_value_spec.rb +206 -0
  376. data/spec/integration/document_spec.rb +30 -1
  377. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  378. data/spec/integration/i18n_fallbacks_spec.rb +73 -0
  379. data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +130 -45
  380. data/spec/integration/matcher_operator_data/all.yml +140 -0
  381. data/spec/integration/matcher_operator_data/and.yml +93 -0
  382. data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
  383. data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
  384. data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
  385. data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
  386. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  387. data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
  388. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  389. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  390. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  391. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  392. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  393. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  394. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  395. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  396. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  397. data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
  398. data/spec/integration/matcher_operator_data/in.yml +210 -0
  399. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  400. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  401. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  402. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  403. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  404. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  405. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  406. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  407. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  408. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  409. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  410. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  411. data/spec/integration/matcher_operator_data/not.yml +196 -0
  412. data/spec/integration/matcher_operator_data/or.yml +137 -0
  413. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  414. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  415. data/spec/integration/matcher_operator_data/size.yml +174 -0
  416. data/spec/integration/matcher_operator_data/type.yml +70 -0
  417. data/spec/integration/matcher_operator_data/type_array.yml +16 -0
  418. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  419. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  420. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  421. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  422. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  423. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  424. data/spec/integration/matcher_operator_data/type_decimal.yml +41 -0
  425. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  426. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  427. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  428. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  429. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  430. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  431. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  432. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  433. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  434. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  435. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  436. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  437. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  438. data/spec/integration/matcher_operator_spec.rb +122 -0
  439. data/spec/integration/matcher_spec.rb +283 -0
  440. data/spec/integration/persistence/range_field_spec.rb +350 -0
  441. data/spec/integration/server_query_spec.rb +141 -0
  442. data/spec/integration/shardable_spec.rb +148 -0
  443. data/spec/integration/stringified_symbol_field_spec.rb +203 -0
  444. data/spec/lite_spec_helper.rb +18 -6
  445. data/spec/mongoid/association/accessors_spec.rb +284 -77
  446. data/spec/mongoid/association/auto_save_spec.rb +74 -33
  447. data/spec/mongoid/association/builders_spec.rb +3 -1
  448. data/spec/mongoid/association/constrainable_spec.rb +2 -0
  449. data/spec/mongoid/association/counter_cache_spec.rb +35 -33
  450. data/spec/mongoid/association/depending_spec.rb +431 -338
  451. data/spec/mongoid/association/eager_spec.rb +8 -5
  452. data/spec/mongoid/association/embedded/cyclic_spec.rb +4 -2
  453. data/spec/mongoid/association/embedded/dirty_spec.rb +4 -2
  454. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +4 -1
  455. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +56 -0
  456. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +84 -22
  457. data/spec/mongoid/association/embedded/embedded_in_spec.rb +3 -1
  458. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +2 -0
  459. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +114 -0
  460. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +687 -173
  461. data/spec/mongoid/association/embedded/embeds_many_models.rb +174 -1
  462. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +63 -0
  463. data/spec/mongoid/association/embedded/embeds_many_spec.rb +71 -1
  464. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +2 -0
  465. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +27 -0
  466. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +23 -21
  467. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +2 -0
  468. data/spec/mongoid/association/embedded/embeds_one_models.rb +22 -0
  469. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +28 -0
  470. data/spec/mongoid/association/embedded/embeds_one_spec.rb +31 -1
  471. data/spec/mongoid/association/macros_spec.rb +11 -9
  472. data/spec/mongoid/association/nested/many_spec.rb +2 -0
  473. data/spec/mongoid/association/nested/one_spec.rb +18 -12
  474. data/spec/mongoid/association/options_spec.rb +2 -0
  475. data/spec/mongoid/association/polymorphic_spec.rb +2 -0
  476. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +4 -1
  477. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +111 -16
  478. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +242 -12
  479. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +114 -58
  480. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  481. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +57 -0
  482. data/spec/mongoid/association/referenced/belongs_to_spec.rb +26 -3
  483. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +3 -1
  484. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +28 -1
  485. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +46 -2
  486. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +25 -5
  487. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +418 -361
  488. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +68 -2
  489. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +39 -0
  490. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +81 -4
  491. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +3 -1
  492. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +132 -0
  493. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +40 -9
  494. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +314 -133
  495. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +848 -451
  496. data/spec/mongoid/association/referenced/has_many_models.rb +61 -1
  497. data/spec/mongoid/association/referenced/has_many_query_spec.rb +37 -0
  498. data/spec/mongoid/association/referenced/has_many_spec.rb +48 -0
  499. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +2 -0
  500. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +55 -9
  501. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +34 -4
  502. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +135 -27
  503. data/spec/mongoid/association/referenced/has_one_models.rb +65 -0
  504. data/spec/mongoid/association/referenced/has_one_query_spec.rb +37 -0
  505. data/spec/mongoid/association/referenced/has_one_spec.rb +24 -1
  506. data/spec/mongoid/association/reflections_spec.rb +2 -0
  507. data/spec/mongoid/association/syncable_spec.rb +47 -31
  508. data/spec/mongoid/association_spec.rb +2 -0
  509. data/spec/mongoid/atomic/modifiers_spec.rb +49 -0
  510. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +2 -0
  511. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +2 -0
  512. data/spec/mongoid/atomic/paths/root_spec.rb +2 -0
  513. data/spec/mongoid/atomic/paths_spec.rb +66 -26
  514. data/spec/mongoid/atomic_spec.rb +53 -6
  515. data/spec/mongoid/attributes/dynamic_spec.rb +0 -1
  516. data/spec/mongoid/attributes/nested_spec.rb +149 -78
  517. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  518. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  519. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  520. data/spec/mongoid/attributes/projector_spec.rb +40 -0
  521. data/spec/mongoid/attributes/readonly_spec.rb +24 -22
  522. data/spec/mongoid/attributes_spec.rb +683 -65
  523. data/spec/mongoid/cacheable_spec.rb +6 -4
  524. data/spec/mongoid/changeable_spec.rb +185 -43
  525. data/spec/mongoid/clients/factory_spec.rb +128 -28
  526. data/spec/mongoid/clients/options_spec.rb +45 -26
  527. data/spec/mongoid/clients/sessions_spec.rb +25 -66
  528. data/spec/mongoid/clients/transactions_spec.rb +54 -29
  529. data/spec/mongoid/clients_spec.rb +65 -8
  530. data/spec/mongoid/composable_spec.rb +2 -0
  531. data/spec/mongoid/config/environment_spec.rb +126 -8
  532. data/spec/mongoid/config/options_spec.rb +22 -3
  533. data/spec/mongoid/config_spec.rb +377 -1
  534. data/spec/mongoid/contextual/aggregable/memory_spec.rb +433 -153
  535. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  536. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  537. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +122 -20
  538. data/spec/mongoid/contextual/aggregable/none_spec.rb +60 -0
  539. data/spec/mongoid/contextual/atomic_spec.rb +205 -67
  540. data/spec/mongoid/contextual/geo_near_spec.rb +20 -18
  541. data/spec/mongoid/contextual/map_reduce_spec.rb +6 -18
  542. data/spec/mongoid/contextual/memory_spec.rb +1360 -91
  543. data/spec/mongoid/contextual/mongo_spec.rb +1871 -544
  544. data/spec/mongoid/contextual/none_spec.rb +39 -73
  545. data/spec/mongoid/copyable_spec.rb +657 -26
  546. data/spec/mongoid/copyable_spec_models.rb +30 -0
  547. data/spec/mongoid/criteria/findable_spec.rb +161 -228
  548. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  549. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  550. data/spec/mongoid/criteria/inspectable_spec.rb +2 -0
  551. data/spec/mongoid/criteria/marshalable_spec.rb +20 -1
  552. data/spec/mongoid/criteria/modifiable_spec.rb +43 -40
  553. data/spec/mongoid/criteria/options_spec.rb +2 -0
  554. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +3 -1
  555. data/spec/mongoid/criteria/queryable/expandable_spec.rb +61 -0
  556. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +9 -19
  557. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +136 -26
  558. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +2 -0
  559. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +3 -1
  560. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +13 -0
  561. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +46 -17
  562. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +2 -0
  563. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +2 -0
  564. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +2 -15
  565. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +2 -0
  566. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +2 -0
  567. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -8
  568. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +2 -0
  569. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +239 -178
  570. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +3 -1
  571. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +2 -0
  572. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +2 -0
  573. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +2 -59
  574. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +2 -59
  575. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +34 -16
  576. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +13 -0
  577. data/spec/mongoid/criteria/queryable/key_spec.rb +2 -0
  578. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +145 -12
  579. data/spec/mongoid/criteria/queryable/optional_spec.rb +18 -485
  580. data/spec/mongoid/criteria/queryable/options_spec.rb +2 -0
  581. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +2 -0
  582. data/spec/mongoid/criteria/queryable/queryable_spec.rb +3 -1
  583. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +1643 -286
  584. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
  585. data/spec/mongoid/criteria/queryable/selectable_spec.rb +1191 -2752
  586. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
  587. data/spec/mongoid/criteria/queryable/selector_spec.rb +91 -4
  588. data/spec/mongoid/criteria/queryable/smash_spec.rb +2 -0
  589. data/spec/mongoid/criteria/queryable/storable_spec.rb +298 -0
  590. data/spec/mongoid/criteria/scopable_spec.rb +129 -0
  591. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  592. data/spec/mongoid/criteria_projection_spec.rb +409 -0
  593. data/spec/mongoid/criteria_spec.rb +1322 -1723
  594. data/spec/mongoid/document_fields_spec.rb +179 -5
  595. data/spec/mongoid/document_persistence_context_spec.rb +0 -1
  596. data/spec/mongoid/document_query_spec.rb +89 -0
  597. data/spec/mongoid/document_spec.rb +153 -87
  598. data/spec/mongoid/equality_spec.rb +144 -41
  599. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +5 -3
  600. data/spec/mongoid/errors/callback_spec.rb +2 -0
  601. data/spec/mongoid/errors/delete_restriction_spec.rb +4 -2
  602. data/spec/mongoid/errors/document_not_destroyed_spec.rb +2 -0
  603. data/spec/mongoid/errors/document_not_found_spec.rb +78 -0
  604. data/spec/mongoid/errors/invalid_collection_spec.rb +2 -0
  605. data/spec/mongoid/errors/{eager_load_spec.rb → invalid_config_file_spec.rb} +7 -5
  606. data/spec/mongoid/errors/invalid_config_option_spec.rb +2 -0
  607. data/spec/mongoid/errors/invalid_field_option_spec.rb +2 -0
  608. data/spec/mongoid/errors/invalid_field_spec.rb +3 -1
  609. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  610. data/spec/mongoid/errors/invalid_find_spec.rb +2 -0
  611. data/spec/mongoid/errors/invalid_includes_spec.rb +2 -0
  612. data/spec/mongoid/errors/invalid_index_spec.rb +2 -0
  613. data/spec/mongoid/errors/invalid_options_spec.rb +4 -2
  614. data/spec/mongoid/errors/invalid_path_spec.rb +2 -0
  615. data/spec/mongoid/errors/invalid_relation_spec.rb +4 -2
  616. data/spec/mongoid/errors/invalid_scope_spec.rb +3 -1
  617. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +2 -0
  618. data/spec/mongoid/errors/invalid_storage_options_spec.rb +2 -0
  619. data/spec/mongoid/errors/invalid_time_spec.rb +2 -0
  620. data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -1
  621. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +2 -0
  622. data/spec/mongoid/errors/mixed_relations_spec.rb +2 -0
  623. data/spec/mongoid/errors/mongoid_error_spec.rb +24 -8
  624. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +5 -3
  625. data/spec/mongoid/errors/no_client_config_spec.rb +4 -2
  626. data/spec/mongoid/errors/no_client_database_spec.rb +5 -3
  627. data/spec/mongoid/errors/no_client_hosts_spec.rb +5 -3
  628. data/spec/mongoid/errors/no_clients_config_spec.rb +2 -0
  629. data/spec/mongoid/errors/no_environment_spec.rb +5 -3
  630. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +2 -0
  631. data/spec/mongoid/errors/no_metadata_spec.rb +4 -2
  632. data/spec/mongoid/errors/no_parent_spec.rb +3 -1
  633. data/spec/mongoid/errors/readonly_attribute_spec.rb +2 -0
  634. data/spec/mongoid/errors/readonly_document_spec.rb +2 -0
  635. data/spec/mongoid/errors/scope_overwrite_spec.rb +2 -0
  636. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -1
  637. data/spec/mongoid/errors/unknown_attribute_spec.rb +4 -2
  638. data/spec/mongoid/errors/unsaved_document_spec.rb +3 -1
  639. data/spec/mongoid/errors/unsupported_javascript_spec.rb +2 -0
  640. data/spec/mongoid/errors/validations_spec.rb +2 -0
  641. data/spec/mongoid/extensions/array_spec.rb +41 -45
  642. data/spec/mongoid/extensions/big_decimal_spec.rb +714 -212
  643. data/spec/mongoid/extensions/binary_spec.rb +46 -9
  644. data/spec/mongoid/extensions/boolean_spec.rb +70 -82
  645. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +339 -0
  646. data/spec/mongoid/extensions/date_spec.rb +58 -140
  647. data/spec/mongoid/extensions/date_time_spec.rb +32 -69
  648. data/spec/mongoid/extensions/decimal128_spec.rb +2 -0
  649. data/spec/mongoid/extensions/false_class_spec.rb +3 -1
  650. data/spec/mongoid/extensions/float_spec.rb +66 -73
  651. data/spec/mongoid/extensions/hash_spec.rb +138 -3
  652. data/spec/mongoid/extensions/integer_spec.rb +61 -63
  653. data/spec/mongoid/extensions/module_spec.rb +2 -0
  654. data/spec/mongoid/extensions/nil_class_spec.rb +2 -0
  655. data/spec/mongoid/extensions/object_id_spec.rb +2 -0
  656. data/spec/mongoid/extensions/object_spec.rb +13 -24
  657. data/spec/mongoid/extensions/range_spec.rb +257 -54
  658. data/spec/mongoid/extensions/regexp_spec.rb +60 -33
  659. data/spec/mongoid/extensions/set_spec.rb +108 -0
  660. data/spec/mongoid/extensions/string_spec.rb +111 -50
  661. data/spec/mongoid/extensions/stringified_symbol_spec.rb +84 -0
  662. data/spec/mongoid/extensions/symbol_spec.rb +20 -25
  663. data/spec/mongoid/extensions/time_spec.rb +663 -66
  664. data/spec/mongoid/extensions/time_with_zone_spec.rb +50 -31
  665. data/spec/mongoid/extensions/true_class_spec.rb +3 -1
  666. data/spec/mongoid/extensions_spec.rb +16 -2
  667. data/spec/mongoid/factory_spec.rb +347 -27
  668. data/spec/mongoid/fields/foreign_key_spec.rb +2 -0
  669. data/spec/mongoid/fields/localized_spec.rb +43 -16
  670. data/spec/mongoid/fields/standard_spec.rb +2 -0
  671. data/spec/mongoid/fields_spec.rb +776 -80
  672. data/spec/mongoid/findable_spec.rb +133 -34
  673. data/spec/mongoid/indexable/specification_spec.rb +4 -2
  674. data/spec/mongoid/indexable_spec.rb +65 -18
  675. data/spec/mongoid/inspectable_spec.rb +39 -2
  676. data/spec/mongoid/interceptable_spec.rb +955 -103
  677. data/spec/mongoid/interceptable_spec_models.rb +307 -0
  678. data/spec/mongoid/loggable_spec.rb +2 -0
  679. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  680. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
  681. data/spec/mongoid/matcher/extract_attribute_spec.rb +36 -0
  682. data/spec/mongoid/mongoizable_spec.rb +285 -0
  683. data/spec/mongoid/persistable/creatable_spec.rb +114 -29
  684. data/spec/mongoid/persistable/deletable_spec.rb +274 -12
  685. data/spec/mongoid/persistable/destroyable_spec.rb +202 -12
  686. data/spec/mongoid/persistable/incrementable_spec.rb +23 -7
  687. data/spec/mongoid/persistable/logical_spec.rb +19 -3
  688. data/spec/mongoid/persistable/poppable_spec.rb +19 -3
  689. data/spec/mongoid/persistable/pullable_spec.rb +36 -6
  690. data/spec/mongoid/persistable/pushable_spec.rb +36 -6
  691. data/spec/mongoid/persistable/renamable_spec.rb +18 -2
  692. data/spec/mongoid/persistable/savable_spec.rb +188 -25
  693. data/spec/mongoid/persistable/settable_spec.rb +24 -8
  694. data/spec/mongoid/persistable/unsettable_spec.rb +19 -3
  695. data/spec/mongoid/persistable/updatable_spec.rb +45 -23
  696. data/spec/mongoid/persistable/upsertable_spec.rb +18 -2
  697. data/spec/mongoid/persistable_spec.rb +85 -9
  698. data/spec/mongoid/persistence_context_spec.rb +52 -1
  699. data/spec/mongoid/positional_spec.rb +2 -0
  700. data/spec/mongoid/query_cache_middleware_spec.rb +50 -0
  701. data/spec/mongoid/query_cache_spec.rb +339 -87
  702. data/spec/mongoid/relations/proxy_spec.rb +8 -6
  703. data/spec/mongoid/reloadable_spec.rb +357 -22
  704. data/spec/mongoid/scopable_spec.rb +121 -37
  705. data/spec/mongoid/selectable_spec.rb +8 -6
  706. data/spec/mongoid/serializable_spec.rb +160 -29
  707. data/spec/mongoid/shardable_models.rb +75 -0
  708. data/spec/mongoid/shardable_spec.rb +239 -34
  709. data/spec/mongoid/stateful_spec.rb +31 -1
  710. data/spec/mongoid/tasks/database_rake_spec.rb +2 -0
  711. data/spec/mongoid/tasks/database_spec.rb +2 -0
  712. data/spec/mongoid/threaded_spec.rb +4 -2
  713. data/spec/mongoid/timestamps/created/short_spec.rb +3 -1
  714. data/spec/mongoid/timestamps/created_spec.rb +3 -1
  715. data/spec/mongoid/timestamps/timeless_spec.rb +4 -2
  716. data/spec/mongoid/timestamps/updated/short_spec.rb +5 -3
  717. data/spec/mongoid/timestamps/updated_spec.rb +5 -3
  718. data/spec/mongoid/timestamps_spec.rb +398 -6
  719. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  720. data/spec/mongoid/touchable_spec.rb +296 -33
  721. data/spec/mongoid/touchable_spec_models.rb +57 -0
  722. data/spec/mongoid/traversable_spec.rb +1160 -1
  723. data/spec/mongoid/validatable/associated_spec.rb +15 -30
  724. data/spec/mongoid/validatable/format_spec.rb +2 -0
  725. data/spec/mongoid/validatable/length_spec.rb +2 -0
  726. data/spec/mongoid/validatable/numericality_spec.rb +2 -0
  727. data/spec/mongoid/validatable/presence_spec.rb +28 -22
  728. data/spec/mongoid/validatable/uniqueness_spec.rb +128 -98
  729. data/spec/mongoid/validatable_spec.rb +5 -3
  730. data/spec/mongoid/warnings_spec.rb +35 -0
  731. data/spec/mongoid_spec.rb +3 -1
  732. data/spec/rails/controller_extension/controller_runtime_spec.rb +5 -3
  733. data/spec/rails/mongoid_spec.rb +8 -18
  734. data/spec/shared/bin/s3-copy +45 -0
  735. data/spec/shared/bin/s3-upload +69 -0
  736. data/spec/shared/lib/mrss/cluster_config.rb +14 -4
  737. data/spec/shared/lib/mrss/constraints.rb +51 -27
  738. data/spec/shared/lib/mrss/docker_runner.rb +37 -4
  739. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  740. data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
  741. data/spec/shared/lib/mrss/lite_constraints.rb +48 -1
  742. data/spec/shared/lib/mrss/server_version_registry.rb +16 -18
  743. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  744. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  745. data/spec/shared/lib/mrss/spec_organizer.rb +18 -1
  746. data/spec/shared/lib/mrss/utils.rb +28 -6
  747. data/spec/shared/share/Dockerfile.erb +156 -66
  748. data/spec/shared/share/haproxy-1.conf +16 -0
  749. data/spec/shared/share/haproxy-2.conf +17 -0
  750. data/spec/shared/shlib/config.sh +27 -0
  751. data/spec/shared/shlib/distro.sh +2 -1
  752. data/spec/shared/shlib/server.sh +171 -45
  753. data/spec/shared/shlib/set_env.sh +47 -6
  754. data/spec/spec_helper.rb +38 -36
  755. data/spec/support/authorization.rb +2 -0
  756. data/spec/support/client_registry.rb +9 -0
  757. data/spec/support/constraints.rb +39 -8
  758. data/spec/support/expectations.rb +5 -1
  759. data/spec/support/helpers.rb +11 -0
  760. data/spec/support/macros.rb +77 -0
  761. data/spec/{app → support}/models/account.rb +3 -1
  762. data/spec/{app → support}/models/acolyte.rb +2 -0
  763. data/spec/{app → support}/models/actor.rb +3 -1
  764. data/spec/support/models/actress.rb +4 -0
  765. data/spec/{app → support}/models/address.rb +6 -0
  766. data/spec/{app → support}/models/address_component.rb +2 -0
  767. data/spec/{app → support}/models/address_number.rb +2 -0
  768. data/spec/{app → support}/models/agency.rb +2 -0
  769. data/spec/{app → support}/models/agent.rb +2 -0
  770. data/spec/{app → support}/models/album.rb +2 -0
  771. data/spec/{app → support}/models/alert.rb +2 -0
  772. data/spec/{app → support}/models/animal.rb +2 -0
  773. data/spec/{app → support}/models/answer.rb +2 -0
  774. data/spec/{app → support}/models/appointment.rb +2 -0
  775. data/spec/support/models/armrest.rb +9 -0
  776. data/spec/{app → support}/models/article.rb +2 -0
  777. data/spec/{app → support}/models/artist.rb +4 -0
  778. data/spec/{app → support}/models/artwork.rb +2 -0
  779. data/spec/support/models/audible_sound.rb +3 -0
  780. data/spec/{app → support}/models/audio.rb +2 -0
  781. data/spec/support/models/augmentation.rb +25 -0
  782. data/spec/{app → support}/models/author.rb +2 -0
  783. data/spec/{app → support}/models/baby.rb +2 -0
  784. data/spec/{app → support}/models/band.rb +9 -0
  785. data/spec/{app → support}/models/bar.rb +2 -0
  786. data/spec/{app → support}/models/basic.rb +2 -0
  787. data/spec/support/models/bed.rb +3 -0
  788. data/spec/{app → support}/models/big_palette.rb +2 -0
  789. data/spec/{app → support}/models/birthday.rb +2 -0
  790. data/spec/support/models/bolt.rb +7 -0
  791. data/spec/{app → support}/models/bomb.rb +2 -0
  792. data/spec/{app → support}/models/book.rb +2 -0
  793. data/spec/{app → support}/models/breed.rb +2 -0
  794. data/spec/{app → support}/models/browser.rb +3 -1
  795. data/spec/{app → support}/models/building.rb +2 -0
  796. data/spec/{app → support}/models/building_address.rb +2 -0
  797. data/spec/{app → support}/models/bus.rb +2 -0
  798. data/spec/{app → support}/models/business.rb +2 -0
  799. data/spec/{app → support}/models/callback_test.rb +2 -0
  800. data/spec/{app → support}/models/canvas.rb +3 -1
  801. data/spec/support/models/car.rb +3 -0
  802. data/spec/{app → support}/models/cat.rb +2 -0
  803. data/spec/support/models/catalog.rb +24 -0
  804. data/spec/{app → support}/models/category.rb +2 -0
  805. data/spec/{app → support}/models/child.rb +2 -0
  806. data/spec/{app → support}/models/child_doc.rb +5 -3
  807. data/spec/{app → support}/models/church.rb +2 -0
  808. data/spec/{app → support}/models/circle.rb +2 -0
  809. data/spec/{app → support}/models/circuit.rb +2 -0
  810. data/spec/support/models/circus.rb +12 -0
  811. data/spec/{app → support}/models/code.rb +4 -0
  812. data/spec/support/models/coding/pull_request.rb +11 -0
  813. data/spec/support/models/coding.rb +3 -0
  814. data/spec/{app → support}/models/comment.rb +2 -0
  815. data/spec/{app → support}/models/company.rb +2 -0
  816. data/spec/{app → support}/models/consumption_period.rb +2 -0
  817. data/spec/{app → support}/models/contextable_item.rb +2 -0
  818. data/spec/{app → support}/models/contractor.rb +2 -0
  819. data/spec/{app → support}/models/cookie.rb +2 -0
  820. data/spec/{app → support}/models/country_code.rb +4 -0
  821. data/spec/{app → support}/models/courier_job.rb +2 -0
  822. data/spec/support/models/crate.rb +12 -0
  823. data/spec/{app → support}/models/customer.rb +0 -1
  824. data/spec/{app → support}/models/customer_address.rb +0 -1
  825. data/spec/support/models/deed.rb +7 -0
  826. data/spec/{app → support}/models/definition.rb +2 -0
  827. data/spec/{app → support}/models/delegating_patient.rb +0 -1
  828. data/spec/{app → support}/models/description.rb +2 -0
  829. data/spec/{app → support}/models/dictionary.rb +8 -0
  830. data/spec/{app → support}/models/division.rb +2 -0
  831. data/spec/{app → support}/models/doctor.rb +2 -0
  832. data/spec/{app → support}/models/dog.rb +2 -0
  833. data/spec/{app → support}/models/dokument.rb +2 -0
  834. data/spec/{app → support}/models/draft.rb +2 -0
  835. data/spec/{app → support}/models/dragon.rb +2 -0
  836. data/spec/{app → support}/models/driver.rb +3 -1
  837. data/spec/{app → support}/models/drug.rb +2 -0
  838. data/spec/{app → support}/models/dungeon.rb +2 -0
  839. data/spec/{app → support}/models/edit.rb +2 -0
  840. data/spec/{app → support}/models/email.rb +2 -0
  841. data/spec/{app → support}/models/employer.rb +2 -0
  842. data/spec/{app → support}/models/entry.rb +2 -0
  843. data/spec/support/models/eraser.rb +3 -0
  844. data/spec/{app → support}/models/even.rb +2 -0
  845. data/spec/{app → support}/models/event.rb +2 -0
  846. data/spec/{app → support}/models/exhibition.rb +2 -0
  847. data/spec/{app → support}/models/exhibitor.rb +2 -0
  848. data/spec/{app → support}/models/explosion.rb +2 -0
  849. data/spec/{app → support}/models/eye.rb +2 -0
  850. data/spec/{app → support}/models/eye_bowl.rb +2 -0
  851. data/spec/{app → support}/models/face.rb +2 -0
  852. data/spec/support/models/fanatic.rb +8 -0
  853. data/spec/{app → support}/models/favorite.rb +2 -0
  854. data/spec/{app → support}/models/filesystem.rb +2 -0
  855. data/spec/{app → support}/models/fire_hydrant.rb +2 -0
  856. data/spec/{app → support}/models/firefox.rb +2 -0
  857. data/spec/{app → support}/models/fish.rb +2 -0
  858. data/spec/{app → support}/models/folder.rb +2 -0
  859. data/spec/{app → support}/models/folder_item.rb +2 -0
  860. data/spec/{app → support}/models/fruits.rb +2 -0
  861. data/spec/{app → support}/models/game.rb +2 -0
  862. data/spec/{app → support}/models/ghost.rb +2 -0
  863. data/spec/support/models/guitar.rb +4 -0
  864. data/spec/support/models/hole.rb +12 -0
  865. data/spec/{app → support}/models/home.rb +2 -0
  866. data/spec/{app → support}/models/house.rb +2 -0
  867. data/spec/{app → support}/models/html_writer.rb +2 -0
  868. data/spec/{app → support}/models/id_key.rb +2 -0
  869. data/spec/support/models/idnodef.rb +7 -0
  870. data/spec/{app → support}/models/image.rb +2 -0
  871. data/spec/{app → support}/models/implant.rb +11 -0
  872. data/spec/support/models/instrument.rb +8 -0
  873. data/spec/{app → support}/models/item.rb +3 -1
  874. data/spec/{app → support}/models/jar.rb +2 -0
  875. data/spec/{app → support}/models/kaleidoscope.rb +2 -0
  876. data/spec/{app → support}/models/kangaroo.rb +3 -1
  877. data/spec/{app → support}/models/label.rb +6 -1
  878. data/spec/{app → support}/models/language.rb +2 -0
  879. data/spec/{app → support}/models/lat_lng.rb +2 -0
  880. data/spec/{app → support}/models/league.rb +2 -0
  881. data/spec/support/models/learner.rb +4 -0
  882. data/spec/{app → support}/models/line_item.rb +2 -0
  883. data/spec/{app → support}/models/location.rb +2 -0
  884. data/spec/{app → support}/models/login.rb +2 -0
  885. data/spec/{app → support}/models/manufacturer.rb +2 -0
  886. data/spec/{app → support}/models/meat.rb +2 -0
  887. data/spec/{app → support}/models/membership.rb +3 -0
  888. data/spec/{app → support}/models/message.rb +2 -0
  889. data/spec/{app → support}/models/minim.rb +0 -1
  890. data/spec/{app → support}/models/mixed_drink.rb +2 -0
  891. data/spec/support/models/mop.rb +24 -0
  892. data/spec/{app → support}/models/movie.rb +2 -0
  893. data/spec/support/models/my_hash.rb +4 -0
  894. data/spec/{app → support}/models/name.rb +12 -0
  895. data/spec/support/models/name_only.rb +8 -0
  896. data/spec/{app → support}/models/node.rb +2 -0
  897. data/spec/{app → support}/models/note.rb +2 -0
  898. data/spec/support/models/nut.rb +7 -0
  899. data/spec/{app → support}/models/odd.rb +2 -0
  900. data/spec/support/models/order.rb +12 -0
  901. data/spec/{app → support}/models/ordered_post.rb +3 -1
  902. data/spec/{app → support}/models/ordered_preference.rb +2 -0
  903. data/spec/{app → support}/models/oscar.rb +2 -0
  904. data/spec/support/models/other_owner_object.rb +4 -0
  905. data/spec/{app → support}/models/override.rb +2 -0
  906. data/spec/{app → support}/models/ownable.rb +2 -0
  907. data/spec/{app → support}/models/owner.rb +4 -0
  908. data/spec/{app → support}/models/pack.rb +2 -0
  909. data/spec/{app → support}/models/page.rb +2 -0
  910. data/spec/{app → support}/models/page_question.rb +2 -0
  911. data/spec/{app → support}/models/palette.rb +3 -1
  912. data/spec/{app → support}/models/parent.rb +2 -0
  913. data/spec/{app → support}/models/parent_doc.rb +2 -0
  914. data/spec/support/models/passport.rb +22 -0
  915. data/spec/{app → support}/models/patient.rb +2 -0
  916. data/spec/{app → support}/models/pdf_writer.rb +2 -0
  917. data/spec/support/models/pencil.rb +3 -0
  918. data/spec/{app → support}/models/person.rb +23 -1
  919. data/spec/{app → support}/models/pet.rb +2 -0
  920. data/spec/{app → support}/models/pet_owner.rb +2 -0
  921. data/spec/{app → support}/models/phone.rb +5 -1
  922. data/spec/support/models/piano.rb +4 -0
  923. data/spec/{app → support}/models/pizza.rb +2 -0
  924. data/spec/{app → support}/models/player.rb +4 -0
  925. data/spec/{app → support}/models/post.rb +2 -0
  926. data/spec/{app → support}/models/post_genre.rb +2 -0
  927. data/spec/support/models/powerup.rb +25 -0
  928. data/spec/{app → support}/models/preference.rb +2 -0
  929. data/spec/{app → support}/models/princess.rb +2 -0
  930. data/spec/{app → support}/models/product.rb +2 -0
  931. data/spec/support/models/profile.rb +17 -0
  932. data/spec/{app → support}/models/pronunciation.rb +2 -0
  933. data/spec/{app → support}/models/pub.rb +2 -0
  934. data/spec/support/models/publication/encyclopedia.rb +11 -0
  935. data/spec/support/models/publication/review.rb +13 -0
  936. data/spec/support/models/publication.rb +4 -0
  937. data/spec/{app → support}/models/purchase.rb +2 -0
  938. data/spec/support/models/purchased_item.rb +10 -0
  939. data/spec/support/models/purse.rb +9 -0
  940. data/spec/{app → support}/models/question.rb +2 -0
  941. data/spec/{app → support}/models/quiz.rb +2 -0
  942. data/spec/{app → support}/models/rating.rb +2 -0
  943. data/spec/{app → support}/models/record.rb +2 -0
  944. data/spec/{app → support}/models/registry.rb +3 -0
  945. data/spec/{app → support}/models/role.rb +2 -0
  946. data/spec/{app → support}/models/root_category.rb +2 -0
  947. data/spec/{app → support}/models/sandwich.rb +2 -0
  948. data/spec/{app → support}/models/scheduler.rb +2 -0
  949. data/spec/support/models/school.rb +14 -0
  950. data/spec/support/models/scribe.rb +7 -0
  951. data/spec/support/models/sealer.rb +7 -0
  952. data/spec/support/models/seat.rb +24 -0
  953. data/spec/{app → support}/models/seo.rb +2 -0
  954. data/spec/support/models/series.rb +7 -0
  955. data/spec/{app → support}/models/server.rb +2 -0
  956. data/spec/{app → support}/models/service.rb +2 -0
  957. data/spec/{app → support}/models/shape.rb +4 -2
  958. data/spec/{app → support}/models/shelf.rb +2 -0
  959. data/spec/support/models/shield.rb +18 -0
  960. data/spec/{app → support}/models/shipment_address.rb +2 -0
  961. data/spec/{app → support}/models/shipping_container.rb +2 -0
  962. data/spec/{app → support}/models/shipping_pack.rb +2 -0
  963. data/spec/support/models/shirt.rb +11 -0
  964. data/spec/{app → support}/models/shop.rb +2 -0
  965. data/spec/{app → support}/models/short_agent.rb +2 -0
  966. data/spec/{app → support}/models/short_quiz.rb +2 -0
  967. data/spec/{app → support}/models/simple.rb +2 -0
  968. data/spec/{app → support}/models/slave.rb +2 -0
  969. data/spec/{app → support}/models/song.rb +2 -0
  970. data/spec/{app → support}/models/sound.rb +2 -0
  971. data/spec/support/models/spacer.rb +7 -0
  972. data/spec/{app → support}/models/square.rb +2 -0
  973. data/spec/{app → support}/models/staff.rb +2 -0
  974. data/spec/{app → support}/models/store_as_dup_test1.rb +2 -0
  975. data/spec/{app → support}/models/store_as_dup_test2.rb +2 -0
  976. data/spec/{app → support}/models/strategy.rb +2 -0
  977. data/spec/support/models/student.rb +14 -0
  978. data/spec/{app → support}/models/sub_item.rb +2 -0
  979. data/spec/{app → support}/models/subscription.rb +2 -0
  980. data/spec/{app → support}/models/survey.rb +2 -0
  981. data/spec/{app → support}/models/symptom.rb +2 -0
  982. data/spec/support/models/system_role.rb +7 -0
  983. data/spec/{app → support}/models/tag.rb +2 -0
  984. data/spec/{app → support}/models/target.rb +2 -0
  985. data/spec/{app → support}/models/template.rb +2 -0
  986. data/spec/{app → support}/models/thing.rb +2 -0
  987. data/spec/support/models/threadlocker.rb +7 -0
  988. data/spec/{app → support}/models/title.rb +2 -0
  989. data/spec/{app → support}/models/tool.rb +4 -2
  990. data/spec/{app → support}/models/topping.rb +2 -0
  991. data/spec/support/models/toy.rb +9 -0
  992. data/spec/{app → support}/models/track.rb +2 -0
  993. data/spec/{app → support}/models/translation.rb +2 -0
  994. data/spec/{app → support}/models/tree.rb +2 -0
  995. data/spec/support/models/truck.rb +7 -0
  996. data/spec/{app → support}/models/user.rb +2 -0
  997. data/spec/{app → support}/models/user_account.rb +2 -0
  998. data/spec/{app → support}/models/validation_callback.rb +2 -0
  999. data/spec/support/models/vehicle.rb +18 -0
  1000. data/spec/{app → support}/models/version.rb +2 -0
  1001. data/spec/{app → support}/models/vertex.rb +3 -1
  1002. data/spec/{app → support}/models/vet_visit.rb +2 -0
  1003. data/spec/{app → support}/models/video.rb +2 -0
  1004. data/spec/support/models/video_game.rb +3 -0
  1005. data/spec/support/models/washer.rb +7 -0
  1006. data/spec/support/models/weapon.rb +25 -0
  1007. data/spec/{app → support}/models/wiki_page.rb +3 -0
  1008. data/spec/{app → support}/models/word.rb +2 -0
  1009. data/spec/{app → support}/models/word_origin.rb +2 -0
  1010. data/spec/{app → support}/models/writer.rb +4 -2
  1011. data/spec/support/schema_maps/schema_map_aws.json +17 -0
  1012. data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  1013. data/spec/support/schema_maps/schema_map_azure.json +17 -0
  1014. data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  1015. data/spec/support/schema_maps/schema_map_gcp.json +17 -0
  1016. data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  1017. data/spec/support/schema_maps/schema_map_kmip.json +17 -0
  1018. data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  1019. data/spec/support/schema_maps/schema_map_local.json +18 -0
  1020. data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
  1021. data/spec/support/shared/time.rb +53 -0
  1022. data/spec/support/spec_config.rb +12 -3
  1023. data.tar.gz.sig +0 -0
  1024. metadata +1162 -764
  1025. metadata.gz.sig +0 -0
  1026. data/lib/mongoid/criteria/queryable/forwardable.rb +0 -65
  1027. data/lib/mongoid/errors/eager_load.rb +0 -22
  1028. data/lib/mongoid/errors/invalid_value.rb +0 -16
  1029. data/lib/mongoid/matchable/all.rb +0 -28
  1030. data/lib/mongoid/matchable/and.rb +0 -30
  1031. data/lib/mongoid/matchable/default.rb +0 -119
  1032. data/lib/mongoid/matchable/elem_match.rb +0 -34
  1033. data/lib/mongoid/matchable/eq.rb +0 -22
  1034. data/lib/mongoid/matchable/exists.rb +0 -23
  1035. data/lib/mongoid/matchable/gt.rb +0 -23
  1036. data/lib/mongoid/matchable/gte.rb +0 -23
  1037. data/lib/mongoid/matchable/in.rb +0 -24
  1038. data/lib/mongoid/matchable/lt.rb +0 -23
  1039. data/lib/mongoid/matchable/lte.rb +0 -23
  1040. data/lib/mongoid/matchable/ne.rb +0 -21
  1041. data/lib/mongoid/matchable/nin.rb +0 -22
  1042. data/lib/mongoid/matchable/nor.rb +0 -37
  1043. data/lib/mongoid/matchable/or.rb +0 -33
  1044. data/lib/mongoid/matchable/regexp.rb +0 -27
  1045. data/lib/mongoid/matchable/size.rb +0 -21
  1046. data/lib/support/ruby_version.rb +0 -26
  1047. data/spec/app/models/actress.rb +0 -2
  1048. data/spec/app/models/augmentation.rb +0 -11
  1049. data/spec/app/models/bed.rb +0 -1
  1050. data/spec/app/models/car.rb +0 -1
  1051. data/spec/app/models/circus.rb +0 -7
  1052. data/spec/app/models/eraser.rb +0 -1
  1053. data/spec/app/models/learner.rb +0 -2
  1054. data/spec/app/models/my_hash.rb +0 -2
  1055. data/spec/app/models/other_owner_object.rb +0 -2
  1056. data/spec/app/models/passport.rb +0 -5
  1057. data/spec/app/models/pencil.rb +0 -1
  1058. data/spec/app/models/powerup.rb +0 -11
  1059. data/spec/app/models/profile.rb +0 -5
  1060. data/spec/app/models/series.rb +0 -4
  1061. data/spec/app/models/truck.rb +0 -3
  1062. data/spec/app/models/vehicle.rb +0 -11
  1063. data/spec/app/models/video_game.rb +0 -1
  1064. data/spec/app/models/weapon.rb +0 -11
  1065. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +0 -87
  1066. data/spec/mongoid/matchable/all_spec.rb +0 -31
  1067. data/spec/mongoid/matchable/and_spec.rb +0 -187
  1068. data/spec/mongoid/matchable/default_spec.rb +0 -137
  1069. data/spec/mongoid/matchable/elem_match_spec.rb +0 -106
  1070. data/spec/mongoid/matchable/eq_spec.rb +0 -48
  1071. data/spec/mongoid/matchable/exists_spec.rb +0 -57
  1072. data/spec/mongoid/matchable/gt_spec.rb +0 -86
  1073. data/spec/mongoid/matchable/gte_spec.rb +0 -84
  1074. data/spec/mongoid/matchable/in_spec.rb +0 -49
  1075. data/spec/mongoid/matchable/lt_spec.rb +0 -85
  1076. data/spec/mongoid/matchable/lte_spec.rb +0 -85
  1077. data/spec/mongoid/matchable/ne_spec.rb +0 -46
  1078. data/spec/mongoid/matchable/nin_spec.rb +0 -48
  1079. data/spec/mongoid/matchable/nor_spec.rb +0 -209
  1080. data/spec/mongoid/matchable/or_spec.rb +0 -131
  1081. data/spec/mongoid/matchable/regexp_spec.rb +0 -59
  1082. data/spec/mongoid/matchable/size_spec.rb +0 -25
  1083. data/spec/mongoid/matchable_spec.rb +0 -853
  1084. data/spec/support/cluster_config.rb +0 -158
  1085. data/spec/support/session_registry.rb +0 -50
  1086. /data/spec/{app → support}/models/array_field.rb +0 -0
  1087. /data/spec/{app → support}/models/store_as_dup_test3.rb +0 -0
  1088. /data/spec/{app → support}/models/store_as_dup_test4.rb +0 -0
  1089. /data/spec/{app → support}/models/updatable.rb +0 -0
@@ -1,4 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
4
+ require_relative './attributes/nested_spec_models'
2
5
 
3
6
  describe Mongoid::Attributes do
4
7
 
@@ -18,7 +21,7 @@ describe Mongoid::Attributes do
18
21
  context "when the attribute was excluded in a criteria" do
19
22
 
20
23
  let!(:person) do
21
- Person.create(title: "sir")
24
+ Person.create!(title: "sir")
22
25
  end
23
26
 
24
27
  context "when the attribute is localized" do
@@ -53,7 +56,7 @@ describe Mongoid::Attributes do
53
56
  let!(:agent) do
54
57
  agent = Agent.new(:title => title)
55
58
  agent.build_address(:city => city)
56
- agent.save()
59
+ agent.save!()
57
60
  agent
58
61
  end
59
62
  let(:from_db) do
@@ -93,6 +96,49 @@ describe Mongoid::Attributes do
93
96
  it "does not raise an error" do
94
97
  expect(from_db.map).to eq(map)
95
98
  end
99
+
100
+ context 'when only one of the hash fields is projected' do
101
+
102
+ let(:map) do
103
+ { 'dates' => { 'y' => { '2016' => 'Berlin', '2017' => 'Munich' } } }
104
+ end
105
+
106
+ let(:expected) do
107
+ { 'dates' => { 'y' => {
108
+ '2016' => 'Berlin',
109
+ } } }
110
+ end
111
+
112
+ it 'retrieves only the projected fields' do
113
+ expect(from_db.map).to eq(expected)
114
+ end
115
+ end
116
+
117
+ context 'when several of the hash fields is projected' do
118
+
119
+ let(:map) do
120
+ { 'dates' => { 'y' => {
121
+ '2016' => 'Berlin',
122
+ '2017' => 'Munich',
123
+ '2018' => 'Krakow',
124
+ } } }
125
+ end
126
+
127
+ let(:expected) do
128
+ { 'dates' => { 'y' => {
129
+ '2016' => 'Berlin',
130
+ '2018' => 'Krakow',
131
+ } } }
132
+ end
133
+
134
+ let(:from_db) do
135
+ Person.only('map.dates.y.2016', 'map.dates.y.2018').first
136
+ end
137
+
138
+ it 'retrieves only the projected fields' do
139
+ expect(from_db.map).to eq(expected)
140
+ end
141
+ end
96
142
  end
97
143
  end
98
144
 
@@ -153,7 +199,7 @@ describe Mongoid::Attributes do
153
199
  context 'when the document has a custom attribute type' do
154
200
 
155
201
  let(:bar) do
156
- Bar.create(lat_lng: LatLng.new(52.30, 13.25))
202
+ Bar.create!(lat_lng: LatLng.new(52.30, 13.25))
157
203
  end
158
204
 
159
205
  it 'returns the demongoized version of the attribute' do
@@ -210,7 +256,7 @@ describe Mongoid::Attributes do
210
256
  context "when the document is an existing record" do
211
257
 
212
258
  let!(:person) do
213
- Person.create(title: "sir")
259
+ Person.create!(title: "sir")
214
260
  end
215
261
 
216
262
  context "when the attribute was excluded in a criteria" do
@@ -284,7 +330,7 @@ describe Mongoid::Attributes do
284
330
 
285
331
  context 'when projecting with #only' do
286
332
  let!(:person) do
287
- Person.create(title: 'sir', name: { first_name: 'Jose', language: { name: 'es' } })
333
+ Person.create!(title: 'sir', name: { first_name: 'Jose', language: { name: 'es' } })
288
334
  end
289
335
 
290
336
  context 'when projecting an embedded association' do
@@ -295,16 +341,12 @@ describe Mongoid::Attributes do
295
341
  context 'when retrieving a field of the association using the dot notation' do
296
342
 
297
343
  it 'retrieves the field' do
298
- pending 'MONGOID-5032, fixed in 7.3'
299
-
300
344
  expect(from_db['name.first_name']).to eq 'Jose'
301
345
  end
302
346
  end
303
347
 
304
348
  context 'when retrieving a field of a nested association using the dot notation' do
305
349
  it 'retrieves the field' do
306
- pending 'MONGOID-5032, fixed in 7.3'
307
-
308
350
  expect(from_db['name.language.name']).to eq 'es'
309
351
  end
310
352
  end
@@ -317,8 +359,6 @@ describe Mongoid::Attributes do
317
359
 
318
360
  context 'when retrieving a field under the projected sub-association' do
319
361
  it 'retrieves the field' do
320
- pending 'MONGOID-5032, fixed in 7.3'
321
-
322
362
  expect(from_db['name.language.name']).to eq 'es'
323
363
  end
324
364
  end
@@ -375,7 +415,7 @@ describe Mongoid::Attributes do
375
415
  let(:bar) do
376
416
  Bar.new.tap do |b|
377
417
  b[:lat_lng] = LatLng.new(52.30, 13.25)
378
- b.save
418
+ b.save!
379
419
  end
380
420
  end
381
421
 
@@ -436,7 +476,7 @@ describe Mongoid::Attributes do
436
476
  context 'when writing fields on a document with projection' do
437
477
 
438
478
  let!(:person) do
439
- Person.create(title: "sir")
479
+ Person.create!(title: "sir")
440
480
  end
441
481
 
442
482
  context "when excluding with only and the field was not excluded" do
@@ -948,7 +988,7 @@ describe Mongoid::Attributes do
948
988
  context 'when the document has a custom attribute type' do
949
989
 
950
990
  let(:bar) do
951
- Bar.create(lat_lng: LatLng.new(52.30, 13.25))
991
+ Bar.create!(lat_lng: LatLng.new(52.30, 13.25))
952
992
  end
953
993
 
954
994
  it 'returns the demongoized version of the attribute' do
@@ -986,7 +1026,7 @@ describe Mongoid::Attributes do
986
1026
  context "when the document is an existing record" do
987
1027
 
988
1028
  let(:person) do
989
- Person.create
1029
+ Person.create!
990
1030
  end
991
1031
 
992
1032
  context "when the attribute does not exist" do
@@ -1025,7 +1065,7 @@ describe Mongoid::Attributes do
1025
1065
  describe "#read_attribute_before_type_cast" do
1026
1066
 
1027
1067
  let(:person) do
1028
- Person.create
1068
+ Person.create!
1029
1069
  end
1030
1070
 
1031
1071
  context "when the attribute has not yet been assigned" do
@@ -1038,15 +1078,15 @@ describe Mongoid::Attributes do
1038
1078
  context "after the attribute has been assigned" do
1039
1079
 
1040
1080
  it "returns the default value" do
1041
- person.age = "old"
1042
- expect(person.age_before_type_cast).to eq("old")
1081
+ person.age = "42"
1082
+ expect(person.age_before_type_cast).to eq("42")
1043
1083
  end
1044
1084
  end
1045
1085
 
1046
1086
  context 'when reading fields on a document with projection' do
1047
1087
 
1048
1088
  let!(:person) do
1049
- Person.create(title: "sir")
1089
+ Person.create!(title: "sir")
1050
1090
  end
1051
1091
 
1052
1092
  context "when excluding with only and the field was not excluded" do
@@ -1117,7 +1157,7 @@ describe Mongoid::Attributes do
1117
1157
  context "when the document is an existing record" do
1118
1158
 
1119
1159
  let(:person) do
1120
- Person.create
1160
+ Person.create!
1121
1161
  end
1122
1162
 
1123
1163
  context "when the attribute does not exist" do
@@ -1176,7 +1216,7 @@ describe Mongoid::Attributes do
1176
1216
 
1177
1217
  context "when the attribute is not on only list" do
1178
1218
 
1179
- before { Person.create }
1219
+ before { Person.create! }
1180
1220
  let(:person) do
1181
1221
  Person.only(:id).first
1182
1222
  end
@@ -1226,15 +1266,15 @@ describe Mongoid::Attributes do
1226
1266
 
1227
1267
  context "before the attribute has been assigned" do
1228
1268
 
1229
- it "returns false" do
1230
- expect(person.has_attribute_before_type_cast?(:age)).to be false
1269
+ it "returns true" do
1270
+ expect(person.has_attribute_before_type_cast?(:age)).to be true
1231
1271
  end
1232
1272
  end
1233
1273
 
1234
1274
  context "after the attribute has been assigned" do
1235
1275
 
1236
1276
  it "returns true" do
1237
- person.age = 'old'
1277
+ person.age = '42'
1238
1278
  expect(person.has_attribute_before_type_cast?(:age)).to be true
1239
1279
  end
1240
1280
  end
@@ -1245,7 +1285,7 @@ describe Mongoid::Attributes do
1245
1285
  context "when the attribute exists" do
1246
1286
 
1247
1287
  let(:person) do
1248
- Person.create(title: "Sir")
1288
+ Person.create!(title: "Sir")
1249
1289
  end
1250
1290
 
1251
1291
  before do
@@ -1263,7 +1303,7 @@ describe Mongoid::Attributes do
1263
1303
  context "when saving after the removal" do
1264
1304
 
1265
1305
  before do
1266
- person.save
1306
+ person.save!
1267
1307
  end
1268
1308
 
1269
1309
  it "persists the removal" do
@@ -1283,7 +1323,7 @@ describe Mongoid::Attributes do
1283
1323
  end
1284
1324
 
1285
1325
  before do
1286
- person.save
1326
+ person.save!
1287
1327
  person.pet.remove_attribute(:name)
1288
1328
  end
1289
1329
 
@@ -1298,7 +1338,7 @@ describe Mongoid::Attributes do
1298
1338
  context "when saving after the removal" do
1299
1339
 
1300
1340
  before do
1301
- person.save
1341
+ person.save!
1302
1342
  end
1303
1343
 
1304
1344
  it "persists the removal" do
@@ -1343,7 +1383,7 @@ describe Mongoid::Attributes do
1343
1383
  context 'when the database name is used' do
1344
1384
 
1345
1385
  let(:person) do
1346
- Person.create(at: Time.now)
1386
+ Person.create!(at: Time.now)
1347
1387
  end
1348
1388
 
1349
1389
  before do
@@ -1361,7 +1401,7 @@ describe Mongoid::Attributes do
1361
1401
  context "when saving after the removal" do
1362
1402
 
1363
1403
  before do
1364
- person.save
1404
+ person.save!
1365
1405
  end
1366
1406
 
1367
1407
  it "persists the removal" do
@@ -1373,7 +1413,7 @@ describe Mongoid::Attributes do
1373
1413
  context 'when the alias is used' do
1374
1414
 
1375
1415
  let(:person) do
1376
- Person.create(aliased_timestamp: Time.now)
1416
+ Person.create!(aliased_timestamp: Time.now)
1377
1417
  end
1378
1418
 
1379
1419
  before do
@@ -1391,7 +1431,7 @@ describe Mongoid::Attributes do
1391
1431
  context "when saving after the removal" do
1392
1432
 
1393
1433
  before do
1394
- person.save
1434
+ person.save!
1395
1435
  end
1396
1436
 
1397
1437
  it "persists the removal" do
@@ -1489,12 +1529,13 @@ describe Mongoid::Attributes do
1489
1529
  end
1490
1530
 
1491
1531
  context "when setting an attribute that needs type casting" do
1532
+
1492
1533
  let(:person) do
1493
- Person.new(age: "old")
1534
+ Person.new(age: "42")
1494
1535
  end
1495
1536
 
1496
1537
  it "should store the attribute before type cast" do
1497
- expect(person.age_before_type_cast).to eq("old")
1538
+ expect(person.age_before_type_cast).to eq("42")
1498
1539
  end
1499
1540
  end
1500
1541
 
@@ -1534,7 +1575,7 @@ describe Mongoid::Attributes do
1534
1575
  person.write_attribute(:test, "aliased field to test")
1535
1576
  end
1536
1577
 
1537
- it "allows the field name to be udpated" do
1578
+ it "allows the field name to be updated" do
1538
1579
  expect(person.t).to eq("aliased field to test")
1539
1580
  end
1540
1581
  end
@@ -1542,16 +1583,14 @@ describe Mongoid::Attributes do
1542
1583
  context "when attribute is a Hash" do
1543
1584
  let(:person) { Person.new map: { somekey: "somevalue" } }
1544
1585
 
1545
- it "raises an error when trying to set a value of invalid type - array" do
1546
- expect do
1547
- person.map = []
1548
- end.to raise_error(Mongoid::Errors::InvalidValue, /Value of type Array cannot be written to a field of type Hash/)
1586
+ it "writes nil when trying to set a value of invalid type - array" do
1587
+ person.map = []
1588
+ expect(person.map).to be_nil
1549
1589
  end
1550
1590
 
1551
- it "raises an error when trying to set a value of invalid type - boolean" do
1552
- expect do
1553
- person.map = false
1554
- end.to raise_error(Mongoid::Errors::InvalidValue, /Value of type FalseClass cannot be written to a field of type Hash/)
1591
+ it "writes nil when trying to set a value of invalid type - boolean" do
1592
+ person.map = false
1593
+ expect(person.map).to be_nil
1555
1594
  end
1556
1595
 
1557
1596
  it "can set a Hash value" do
@@ -1566,16 +1605,14 @@ describe Mongoid::Attributes do
1566
1605
  expect(person.aliases).to eq([ :alias_1 ])
1567
1606
  end
1568
1607
 
1569
- it "raises an error when trying to set a value of invalid type - hash" do
1570
- expect do
1571
- person.aliases = {}
1572
- end.to raise_error(Mongoid::Errors::InvalidValue, /Value of type Hash cannot be written to a field of type Array/)
1608
+ it "writes nil when trying to set a value of invalid type - hash" do
1609
+ person.aliases = {}
1610
+ expect(person.aliases).to be_nil
1573
1611
  end
1574
1612
 
1575
- it "raises an error when trying to set a value of invalid type - boolean" do
1576
- expect do
1577
- person.aliases = false
1578
- end.to raise_error(Mongoid::Errors::InvalidValue, /Value of type FalseClass cannot be written to a field of type Array/)
1613
+ it "writes nil when trying to set a value of invalid type - boolean" do
1614
+ person.aliases = false
1615
+ expect(person.aliases).to be_nil
1579
1616
  end
1580
1617
  end
1581
1618
 
@@ -1595,7 +1632,7 @@ describe Mongoid::Attributes do
1595
1632
  context 'when writing fields on a document with projection' do
1596
1633
 
1597
1634
  let!(:person) do
1598
- Person.create(title: "sir")
1635
+ Person.create!(title: "sir")
1599
1636
  end
1600
1637
 
1601
1638
  context "when excluding with only and the field was not excluded" do
@@ -1636,6 +1673,50 @@ describe Mongoid::Attributes do
1636
1673
  end
1637
1674
  end
1638
1675
  end
1676
+
1677
+ context "when comparing the object_ids of the written value" do
1678
+ config_override :legacy_attributes, false
1679
+
1680
+ before do
1681
+ Person.create!
1682
+ end
1683
+
1684
+ let(:person) do
1685
+ Person.first
1686
+ end
1687
+
1688
+ context "when the field is not resizable" do
1689
+ let(:test) do
1690
+ person.write_attribute(:test, "aliased field to test")
1691
+ end
1692
+
1693
+ it "has the same object_id as the attributes hash value" do
1694
+ expect(test.object_id).to eq(person.test.object_id)
1695
+ end
1696
+ end
1697
+
1698
+ context "when the field is resizable" do
1699
+
1700
+ let(:arrays) do
1701
+ person.write_attribute(:arrays, [])
1702
+ end
1703
+
1704
+ it "has the same object_id as the attributes hash value" do
1705
+ expect(arrays.object_id).to eq(person.arrays.object_id)
1706
+ end
1707
+ end
1708
+
1709
+ context "when the field is a HABTM foreign key array" do
1710
+
1711
+ let(:preference_ids) do
1712
+ person.write_attribute(:preference_ids, [])
1713
+ end
1714
+
1715
+ it "has the same object_id as the attributes hash value" do
1716
+ expect(preference_ids.object_id).to eq(person.preference_ids.object_id)
1717
+ end
1718
+ end
1719
+ end
1639
1720
  end
1640
1721
 
1641
1722
  describe "#typed_value_for" do
@@ -1816,11 +1897,11 @@ describe Mongoid::Attributes do
1816
1897
  end
1817
1898
 
1818
1899
  it "has 3 new entries" do
1819
- expect(pet.vet_visits.count).to eq(3)
1900
+ expect(pet.vet_visits.count).to eq 3
1820
1901
  end
1821
1902
 
1822
1903
  it "persists the changes" do
1823
- expect(pet.reload.vet_visits.count).to eq(3)
1904
+ expect(pet.reload.vet_visits.count).to eq 3
1824
1905
  end
1825
1906
  end
1826
1907
 
@@ -1889,6 +1970,61 @@ describe Mongoid::Attributes do
1889
1970
  end
1890
1971
  end
1891
1972
 
1973
+ describe '#unalias_attribute' do
1974
+ let(:shirt) { Shirt.new }
1975
+ let(:id) { '1234' }
1976
+
1977
+ context 'when creating object' do
1978
+ let(:shirt) { Shirt.new(id: id) }
1979
+
1980
+ it 'id and _id are not the same' do
1981
+ expect(shirt.id).to eq(id)
1982
+ expect(shirt._id).not_to eq(id)
1983
+ end
1984
+ end
1985
+
1986
+ context 'update' do
1987
+ before do
1988
+ shirt.update(id: id)
1989
+ end
1990
+
1991
+ it 'updates id but not_id' do
1992
+ expect(shirt.id).to eq(id)
1993
+ expect(shirt._id).not_to eq(id)
1994
+ end
1995
+ end
1996
+
1997
+ context 'id=' do
1998
+ before do
1999
+ shirt.id = id
2000
+ end
2001
+
2002
+ it 'sets id and not _id' do
2003
+ expect(shirt.id).to eq(id)
2004
+ expect(shirt._id).not_to eq(id)
2005
+ end
2006
+ end
2007
+
2008
+ context 'id?' do
2009
+ context 'with null id' do
2010
+ it 'returns false' do
2011
+ expect(shirt.id?).to be false
2012
+ expect(shirt._id?).to be true
2013
+ end
2014
+ end
2015
+
2016
+ context 'with id' do
2017
+ before do
2018
+ shirt.id = id
2019
+ end
2020
+
2021
+ it 'returns true' do
2022
+ expect(shirt.id?).to be true
2023
+ end
2024
+ end
2025
+ end
2026
+ end
2027
+
1892
2028
  describe "#alias_attribute" do
1893
2029
 
1894
2030
  let(:product) do
@@ -1935,8 +2071,8 @@ describe Mongoid::Attributes do
1935
2071
  end
1936
2072
 
1937
2073
  it "aliases *_before_type_cast" do
1938
- product.cost = "expensive"
1939
- expect(product.cost_before_type_cast).to eq("expensive")
2074
+ product.cost = "42"
2075
+ expect(product.cost_before_type_cast).to eq("42")
1940
2076
  end
1941
2077
  end
1942
2078
 
@@ -1980,7 +2116,7 @@ describe Mongoid::Attributes do
1980
2116
  context "when persisting nil attributes" do
1981
2117
 
1982
2118
  let!(:person) do
1983
- Person.create(score: nil)
2119
+ Person.create!(score: nil)
1984
2120
  end
1985
2121
 
1986
2122
  it "has an entry in the attributes" do
@@ -1995,7 +2131,7 @@ describe Mongoid::Attributes do
1995
2131
  end
1996
2132
 
1997
2133
  it "saves the default" do
1998
- expect { person.save }.to_not raise_error
2134
+ expect { person.save! }.to_not raise_error
1999
2135
  expect(person.last_drink_taken_at).to eq(1.day.ago.in_time_zone("Alaska").to_date)
2000
2136
  end
2001
2137
  end
@@ -2005,7 +2141,7 @@ describe Mongoid::Attributes do
2005
2141
  context "when no value exists in the database" do
2006
2142
 
2007
2143
  let(:person) do
2008
- Person.create
2144
+ Person.create!
2009
2145
  end
2010
2146
 
2011
2147
  it "applies the default value" do
@@ -2018,7 +2154,7 @@ describe Mongoid::Attributes do
2018
2154
  context "when the value is not nil" do
2019
2155
 
2020
2156
  let!(:person) do
2021
- Person.create(age: 50)
2157
+ Person.create!(age: 50)
2022
2158
  end
2023
2159
 
2024
2160
  let(:from_db) do
@@ -2033,7 +2169,7 @@ describe Mongoid::Attributes do
2033
2169
  context "when the value is explicitly nil" do
2034
2170
 
2035
2171
  let!(:person) do
2036
- Person.create(age: nil)
2172
+ Person.create!(age: nil)
2037
2173
  end
2038
2174
 
2039
2175
  let(:from_db) do
@@ -2048,7 +2184,7 @@ describe Mongoid::Attributes do
2048
2184
  context "when the default is a proc" do
2049
2185
 
2050
2186
  let!(:account) do
2051
- Account.create(name: "savings", balance: "100")
2187
+ Account.create!(name: "savings", balance: 100)
2052
2188
  end
2053
2189
 
2054
2190
  let(:from_db) do
@@ -2066,7 +2202,7 @@ describe Mongoid::Attributes do
2066
2202
 
2067
2203
  context 'when the attribute is blank' do
2068
2204
  let(:person) do
2069
- Person.create(title: '')
2205
+ Person.create!(title: '')
2070
2206
  end
2071
2207
 
2072
2208
  it 'returns false' do
@@ -2076,7 +2212,7 @@ describe Mongoid::Attributes do
2076
2212
 
2077
2213
  context 'when the attribute is localized' do
2078
2214
  let(:person) do
2079
- Person.create
2215
+ Person.create!
2080
2216
  end
2081
2217
 
2082
2218
  context 'after initialization when the field is nil' do
@@ -2108,7 +2244,7 @@ describe Mongoid::Attributes do
2108
2244
 
2109
2245
  context 'when the attribute is not localized' do
2110
2246
  let(:person) do
2111
- Person.create(username: 'localized')
2247
+ Person.create!(username: 'localized')
2112
2248
  end
2113
2249
 
2114
2250
  before do
@@ -2120,4 +2256,486 @@ describe Mongoid::Attributes do
2120
2256
  end
2121
2257
  end
2122
2258
  end
2259
+
2260
+ context "when an attribute is removed then set" do
2261
+ let(:cat) { Cat.create!(name: "Neil") }
2262
+
2263
+ before do
2264
+ cat.remove_attribute("name")
2265
+ cat.name = "Nissim"
2266
+ cat.save!
2267
+ cat.reload
2268
+ end
2269
+
2270
+ it "correctly sets the attribute" do
2271
+ expect(cat.name).to eq("Nissim")
2272
+ end
2273
+ end
2274
+
2275
+ describe "attributes after setting an association without reloading" do
2276
+
2277
+ context "on embeds_many" do
2278
+
2279
+ context "when not setting anything" do
2280
+ let(:doc) { NestedBook.create! }
2281
+
2282
+ it "doesn't add attributes" do
2283
+ expect(doc.attributes).to_not have_key("pages")
2284
+ end
2285
+
2286
+ it "has the same attributes after reloading" do
2287
+ expect(doc.attributes).to eq(doc.reload.attributes)
2288
+ end
2289
+ end
2290
+
2291
+ context "when using nested attributes" do
2292
+ let(:doc) { NestedBook.create! }
2293
+
2294
+ before do
2295
+ doc.update_attributes({ pages_attributes: [ {} ] })
2296
+ end
2297
+
2298
+ it "updates the attributes" do
2299
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2300
+ end
2301
+
2302
+ it "has the same attributes after reloading" do
2303
+ expect(doc.attributes).to eq(doc.reload.attributes)
2304
+ end
2305
+ end
2306
+
2307
+ context "when doing assignments" do
2308
+ let(:doc) { NestedBook.create! }
2309
+ before do
2310
+ doc.pages = [NestedPage.new]
2311
+ end
2312
+
2313
+ it "updates the attributes" do
2314
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2315
+ end
2316
+
2317
+ it "has the same attributes after reloading" do
2318
+ expect(doc.attributes).to eq(doc.reload.attributes)
2319
+ end
2320
+ end
2321
+
2322
+ context "when replacing assignments" do
2323
+ let(:doc) { NestedBook.create! }
2324
+ before do
2325
+ doc.pages = [NestedPage.new(number: 1)]
2326
+ doc.pages = [NestedPage.new(number: 2)]
2327
+ end
2328
+
2329
+ it "updates the attributes" do
2330
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id, "number" => 2 }])
2331
+ end
2332
+
2333
+ it "has the same attributes after reloading" do
2334
+ expect(doc.attributes).to eq(doc.reload.attributes)
2335
+ end
2336
+ end
2337
+
2338
+ context "when setting to nil" do
2339
+ let(:doc) { NestedBook.create! }
2340
+ before do
2341
+ doc.pages = [NestedPage.new(number: 1)]
2342
+ doc.pages = nil
2343
+ end
2344
+
2345
+ it "updates the attributes" do
2346
+ expect(doc.attributes).to_not have_key("pages")
2347
+ end
2348
+
2349
+ it "has the same attributes after reloading" do
2350
+ expect({ "pages" => [] }.merge(doc.attributes)).to eq(doc.reload.attributes)
2351
+ end
2352
+ end
2353
+
2354
+ context "when setting to nil and back" do
2355
+ let(:doc) { NestedBook.create! }
2356
+ let(:page) { NestedPage.new }
2357
+ before do
2358
+ doc.pages = [page]
2359
+ doc.pages = nil
2360
+ doc.pages = [page]
2361
+ end
2362
+
2363
+ it "updates the attributes" do
2364
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2365
+ end
2366
+
2367
+ it "has the same attributes after reloading" do
2368
+ expect(doc.attributes).to eq(doc.reload.attributes)
2369
+ end
2370
+ end
2371
+
2372
+ context "when pushing" do
2373
+ let(:doc) { NestedBook.create! }
2374
+ before do
2375
+ doc.pages << NestedPage.new
2376
+ end
2377
+
2378
+ it "updates the attributes" do
2379
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2380
+ end
2381
+
2382
+ it "has the same attributes after reloading" do
2383
+ expect(doc.attributes).to eq(doc.reload.attributes)
2384
+ end
2385
+ end
2386
+
2387
+ [:shift, :pop].each do |meth|
2388
+ context "when performing #{meth}" do
2389
+ let(:doc) { NestedBook.create! }
2390
+ before do
2391
+ doc.pages << NestedPage.new
2392
+ doc.pages << NestedPage.new
2393
+ doc.pages << NestedPage.new
2394
+
2395
+ doc.pages.send(meth, 2)
2396
+ end
2397
+
2398
+ it "updates the attributes" do
2399
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2400
+ end
2401
+
2402
+ it "has the same attributes after reloading" do
2403
+ expect(doc.attributes).to eq(doc.reload.attributes)
2404
+ end
2405
+ end
2406
+ end
2407
+
2408
+ context "when concatting" do
2409
+ let(:doc) { NestedBook.create! }
2410
+ before do
2411
+ doc.pages << NestedPage.new
2412
+ doc.pages.concat([NestedPage.new, NestedPage.new])
2413
+ end
2414
+
2415
+ it "updates the attributes" do
2416
+ expect(doc.attributes["pages"].count).to eq 3
2417
+ end
2418
+
2419
+ it "has the same attributes after reloading" do
2420
+ expect(doc.attributes).to eq(doc.reload.attributes)
2421
+ end
2422
+ end
2423
+
2424
+ [:build, :create].each do |meth|
2425
+ context "when preforming #{meth}" do
2426
+ let(:doc) { NestedBook.create! }
2427
+ before do
2428
+ doc.pages.send(meth)
2429
+ end
2430
+
2431
+ it "updates the attributes" do
2432
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2433
+ end
2434
+
2435
+ it "has the same attributes after reloading" do
2436
+ doc.pages.first.save
2437
+ expect(doc.attributes).to eq(doc.reload.attributes)
2438
+ end
2439
+ end
2440
+ end
2441
+
2442
+ context "when clearing" do
2443
+ let(:doc) { NestedBook.create! }
2444
+ before do
2445
+ doc.pages << NestedPage.new
2446
+ doc.pages << NestedPage.new
2447
+ doc.pages << NestedPage.new
2448
+
2449
+ doc.pages.clear
2450
+ end
2451
+
2452
+ it "updates the attributes" do
2453
+ expect(doc.attributes).to_not have_key("pages")
2454
+ end
2455
+
2456
+ it "has the same attributes after reloading" do
2457
+ expect(doc.attributes).to eq(doc.reload.attributes)
2458
+ end
2459
+ end
2460
+
2461
+ [:delete_all, :destroy_all, :remove_all].each do |meth|
2462
+ context "when performing: #{meth}" do
2463
+ let(:doc) { NestedBook.create! }
2464
+ before do
2465
+ doc.pages << NestedPage.new
2466
+ doc.pages << NestedPage.new
2467
+ doc.pages << NestedPage.new
2468
+
2469
+ doc.pages.send(meth)
2470
+ end
2471
+
2472
+ it "updates the attributes" do
2473
+ expect(doc.attributes).to_not have_key("pages")
2474
+ end
2475
+
2476
+ it "has the same attributes after reloading" do
2477
+ expect({ "pages" => [] }.merge(doc.attributes)).to eq(doc.reload.attributes)
2478
+ end
2479
+ end
2480
+ end
2481
+
2482
+ context "when deleting" do
2483
+ let(:doc) { NestedBook.create! }
2484
+ let(:page) { NestedPage.new }
2485
+ before do
2486
+ doc.pages << page
2487
+ doc.pages << NestedPage.new
2488
+ doc.pages << NestedPage.new
2489
+
2490
+ doc.pages.delete(page)
2491
+ end
2492
+
2493
+ it "updates the attributes" do
2494
+ expect(doc.attributes["pages"].count).to eq 2
2495
+ end
2496
+
2497
+ it "has the same attributes after reloading" do
2498
+ expect(doc.attributes).to eq(doc.reload.attributes)
2499
+ end
2500
+ end
2501
+
2502
+ context "when doing _remove" do
2503
+ let(:doc) { NestedBook.create! }
2504
+ let(:page) { NestedPage.new }
2505
+ before do
2506
+ doc.pages << page
2507
+ doc.pages << NestedPage.new
2508
+ doc.pages << NestedPage.new
2509
+
2510
+ doc.pages._remove(page)
2511
+ end
2512
+
2513
+ it "updates the attributes" do
2514
+ expect(doc.attributes["pages"].count).to eq 2
2515
+ end
2516
+ end
2517
+
2518
+ context "when assigning an array of hashes" do
2519
+ let(:doc) { NestedBook.create! }
2520
+ before do
2521
+ doc.pages = [{}]
2522
+ end
2523
+
2524
+ it "updates the attributes" do
2525
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2526
+ end
2527
+
2528
+ it "has the same attributes after reloading" do
2529
+ expect(doc.attributes).to eq(doc.reload.attributes)
2530
+ end
2531
+ end
2532
+
2533
+ context "when assigning twice" do
2534
+ let(:doc) { NestedBook.create! }
2535
+ before do
2536
+ doc.pages = [{ number: 1 }]
2537
+ doc.pages = [{}]
2538
+ end
2539
+
2540
+ it "updates the attributes" do
2541
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2542
+ end
2543
+
2544
+ it "has the same attributes after reloading" do
2545
+ expect(doc.attributes).to eq(doc.reload.attributes)
2546
+ end
2547
+ end
2548
+ end
2549
+
2550
+ context "on embeds_one" do
2551
+
2552
+ let(:attrs) { { "title" => "Title" } }
2553
+
2554
+ context "when using nested attributes" do
2555
+ let(:doc) { NestedBook.create! }
2556
+
2557
+ before do
2558
+ doc.update_attributes({ cover_attributes: attrs })
2559
+ end
2560
+
2561
+ it "updates the attributes" do
2562
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2563
+ end
2564
+
2565
+ it "has the same attributes after reloading" do
2566
+ expect(doc.attributes).to eq(doc.reload.attributes)
2567
+ end
2568
+ end
2569
+
2570
+ context "when doing assignments" do
2571
+ let(:doc) { NestedBook.create! }
2572
+ before do
2573
+ doc.cover = NestedCover.new(attrs)
2574
+ end
2575
+
2576
+ it "updates the attributes" do
2577
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2578
+ end
2579
+
2580
+ it "has the same attributes after reloading" do
2581
+ expect(doc.attributes).to eq(doc.reload.attributes)
2582
+ end
2583
+ end
2584
+
2585
+ context "when replacing assignments" do
2586
+ let(:doc) { NestedBook.create! }
2587
+ before do
2588
+ doc.cover = NestedCover.new("title" => "Title1")
2589
+ doc.cover = NestedCover.new(attrs)
2590
+ end
2591
+
2592
+ it "updates the attributes" do
2593
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2594
+ end
2595
+
2596
+ it "has the same attributes after reloading" do
2597
+ expect(doc.attributes).to eq(doc.reload.attributes)
2598
+ end
2599
+ end
2600
+
2601
+ context "when setting to nil" do
2602
+ let(:doc) { NestedBook.create! }
2603
+ before do
2604
+ doc.cover = NestedCover.new(attrs)
2605
+ doc.cover = nil
2606
+ end
2607
+
2608
+ it "updates the attributes" do
2609
+ expect(doc.attributes.key?("cover")).to be false
2610
+ end
2611
+
2612
+ it "has the same attributes after reloading" do
2613
+ expect(doc.attributes).to eq(doc.reload.attributes)
2614
+ end
2615
+ end
2616
+
2617
+ context "when setting to nil and back" do
2618
+ let(:doc) { NestedBook.create! }
2619
+ before do
2620
+ doc.cover = NestedCover.new(attrs)
2621
+ doc.cover = nil
2622
+ doc.cover = NestedCover.new(attrs)
2623
+ end
2624
+
2625
+ it "updates the attributes" do
2626
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2627
+ end
2628
+
2629
+
2630
+ it "has the same attributes after reloading" do
2631
+ expect(doc.attributes).to eq(doc.reload.attributes)
2632
+ end
2633
+ end
2634
+
2635
+ [:build, :create].each do |meth|
2636
+ context "when preforming #{meth}" do
2637
+ let(:doc) { NestedBook.create! }
2638
+ before do
2639
+ doc.send("#{meth}_cover", attrs)
2640
+ end
2641
+
2642
+ it "updates the attributes" do
2643
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2644
+ end
2645
+
2646
+ it "has the same attributes after reloading" do
2647
+ doc.cover.save
2648
+ expect(doc.attributes).to eq(doc.reload.attributes)
2649
+ end
2650
+ end
2651
+ end
2652
+
2653
+ context "when assigning a hash" do
2654
+ let(:doc) { NestedBook.create! }
2655
+ before do
2656
+ doc.cover = attrs
2657
+ end
2658
+
2659
+ it "updates the attributes" do
2660
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2661
+ end
2662
+
2663
+ it "has the same attributes after reloading" do
2664
+ expect(doc.attributes).to eq(doc.reload.attributes)
2665
+ end
2666
+ end
2667
+
2668
+ context "when assigning twice" do
2669
+ let(:doc) { NestedBook.create! }
2670
+ before do
2671
+ doc.cover = { "title" => "1984" }
2672
+ doc.cover = attrs
2673
+ end
2674
+
2675
+ it "updates the attributes" do
2676
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2677
+ end
2678
+
2679
+ it "has the same attributes after reloading" do
2680
+ expect(doc.attributes).to eq(doc.reload.attributes)
2681
+ end
2682
+ end
2683
+ end
2684
+ end
2685
+
2686
+ context "when modifiying a hash referenced with the [] notation" do
2687
+ let(:church) { Church.create!(location: { x: 1 }) }
2688
+
2689
+ before do
2690
+ church[:location].merge!(y: 2)
2691
+ church.save!
2692
+ church.reload
2693
+ end
2694
+
2695
+ it "persists the updated hash" do
2696
+ church.location.should == { "x" => 1, "y" => 2 }
2697
+ end
2698
+ end
2699
+
2700
+ context "when modifiying a set referenced with the [] notation" do
2701
+ let(:catalog) { Catalog.create!(set_field: [ 1 ].to_set) }
2702
+
2703
+ before do
2704
+ catalog[:set_field] << 2
2705
+ catalog.save!
2706
+ catalog.reload
2707
+ end
2708
+
2709
+ it "persists the updated hash" do
2710
+ pending "MONGOID-2951"
2711
+ catalog.set_field.should == Set.new([ 1, 2 ])
2712
+ end
2713
+ end
2714
+
2715
+ context 'when an embedded field has a capitalized store_as name' do
2716
+ let(:person) { Person.new(Purse: { brand: 'Gucci' }) }
2717
+
2718
+ it 'sets the value' do
2719
+ expect(person.purse.brand).to eq('Gucci')
2720
+ end
2721
+
2722
+ it 'saves successfully' do
2723
+ expect(person.save!).to eq(true)
2724
+ end
2725
+
2726
+ context 'when persisted' do
2727
+ before do
2728
+ person.save!
2729
+ person.reload
2730
+ end
2731
+
2732
+ it 'persists the value' do
2733
+ expect(person.reload.purse.brand).to eq('Gucci')
2734
+ end
2735
+
2736
+ it 'uses the correct key in the database' do
2737
+ expect(person.collection.find(_id: person.id).first['Purse']['_id']).to eq(person.purse.id)
2738
+ end
2739
+ end
2740
+ end
2123
2741
  end