mongoid 7.0.0 → 7.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1046) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +30 -30
  4. data/LICENSE +1 -0
  5. data/README.md +34 -20
  6. data/Rakefile +75 -5
  7. data/lib/config/locales/en.yml +129 -70
  8. data/lib/mongoid/association/accessors.rb +143 -80
  9. data/lib/mongoid/association/bindable.rb +7 -26
  10. data/lib/mongoid/association/builders.rb +4 -12
  11. data/lib/mongoid/association/constrainable.rb +5 -6
  12. data/lib/mongoid/association/depending.rb +31 -19
  13. data/lib/mongoid/association/eager_loadable.rb +2 -3
  14. data/lib/mongoid/association/embedded/batchable.rb +19 -45
  15. data/lib/mongoid/association/embedded/cyclic.rb +10 -17
  16. data/lib/mongoid/association/embedded/embedded_in/binding.rb +3 -7
  17. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +7 -4
  18. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +14 -24
  19. data/lib/mongoid/association/embedded/embedded_in.rb +6 -26
  20. data/lib/mongoid/association/embedded/embeds_many/binding.rb +4 -8
  21. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +8 -5
  22. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +113 -93
  23. data/lib/mongoid/association/embedded/embeds_many.rb +8 -35
  24. data/lib/mongoid/association/embedded/embeds_one/binding.rb +4 -8
  25. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +9 -6
  26. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +45 -30
  27. data/lib/mongoid/association/embedded/embeds_one.rb +8 -31
  28. data/lib/mongoid/association/embedded.rb +2 -0
  29. data/lib/mongoid/association/macros.rb +44 -41
  30. data/lib/mongoid/association/many.rb +18 -32
  31. data/lib/mongoid/association/marshalable.rb +3 -6
  32. data/lib/mongoid/association/nested/many.rb +18 -27
  33. data/lib/mongoid/association/nested/nested_buildable.rb +5 -11
  34. data/lib/mongoid/association/nested/one.rb +16 -27
  35. data/lib/mongoid/association/nested.rb +3 -3
  36. data/lib/mongoid/association/one.rb +4 -11
  37. data/lib/mongoid/association/options.rb +8 -38
  38. data/lib/mongoid/association/proxy.rb +37 -36
  39. data/lib/mongoid/association/referenced/auto_save.rb +5 -11
  40. data/lib/mongoid/association/referenced/belongs_to/binding.rb +4 -9
  41. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +11 -9
  42. data/lib/mongoid/association/referenced/belongs_to/eager.rb +40 -3
  43. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +16 -27
  44. data/lib/mongoid/association/referenced/belongs_to.rb +14 -36
  45. data/lib/mongoid/association/referenced/counter_cache.rb +4 -15
  46. data/lib/mongoid/association/referenced/eager.rb +40 -36
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +12 -11
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +5 -5
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -1
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +38 -56
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +23 -43
  52. data/lib/mongoid/association/referenced/has_many/binding.rb +3 -6
  53. data/lib/mongoid/association/referenced/has_many/buildable.rb +5 -5
  54. data/lib/mongoid/association/referenced/has_many/eager.rb +2 -1
  55. data/lib/mongoid/association/referenced/has_many/enumerable.rb +444 -456
  56. data/lib/mongoid/association/referenced/has_many/proxy.rb +78 -111
  57. data/lib/mongoid/association/referenced/has_many.rb +18 -42
  58. data/lib/mongoid/association/referenced/has_one/binding.rb +4 -9
  59. data/lib/mongoid/association/referenced/has_one/buildable.rb +20 -6
  60. data/lib/mongoid/association/referenced/has_one/eager.rb +2 -1
  61. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +13 -26
  62. data/lib/mongoid/association/referenced/has_one/proxy.rb +23 -25
  63. data/lib/mongoid/association/referenced/has_one.rb +13 -33
  64. data/lib/mongoid/association/referenced/syncable.rb +7 -22
  65. data/lib/mongoid/association/referenced.rb +2 -0
  66. data/lib/mongoid/association/reflections.rb +7 -6
  67. data/lib/mongoid/association/relatable.rb +118 -78
  68. data/lib/mongoid/association.rb +8 -23
  69. data/lib/mongoid/atomic/modifiers.rb +27 -51
  70. data/lib/mongoid/atomic/paths/embedded/many.rb +4 -7
  71. data/lib/mongoid/atomic/paths/embedded/one.rb +4 -7
  72. data/lib/mongoid/atomic/paths/embedded.rb +3 -4
  73. data/lib/mongoid/atomic/paths/root.rb +4 -7
  74. data/lib/mongoid/atomic/paths.rb +2 -1
  75. data/lib/mongoid/atomic.rb +42 -47
  76. data/lib/mongoid/attributes/dynamic.rb +18 -32
  77. data/lib/mongoid/attributes/nested.rb +21 -13
  78. data/lib/mongoid/attributes/processing.rb +9 -24
  79. data/lib/mongoid/attributes/projector.rb +119 -0
  80. data/lib/mongoid/attributes/readonly.rb +3 -6
  81. data/lib/mongoid/attributes.rb +75 -81
  82. data/lib/mongoid/cacheable.rb +6 -9
  83. data/lib/mongoid/changeable.rb +6 -60
  84. data/lib/mongoid/clients/factory.rb +42 -17
  85. data/lib/mongoid/clients/options.rb +16 -17
  86. data/lib/mongoid/clients/sessions.rb +24 -12
  87. data/lib/mongoid/clients/storage_options.rb +7 -12
  88. data/lib/mongoid/clients/validators/storage.rb +2 -9
  89. data/lib/mongoid/clients/validators.rb +2 -1
  90. data/lib/mongoid/clients.rb +3 -10
  91. data/lib/mongoid/composable.rb +5 -9
  92. data/lib/mongoid/config/environment.rb +36 -14
  93. data/lib/mongoid/config/options.rb +20 -23
  94. data/lib/mongoid/config/validators/client.rb +2 -17
  95. data/lib/mongoid/config/validators/option.rb +2 -3
  96. data/lib/mongoid/config/validators.rb +2 -1
  97. data/lib/mongoid/config.rb +112 -41
  98. data/lib/mongoid/contextual/aggregable/memory.rb +17 -12
  99. data/lib/mongoid/contextual/aggregable/mongo.rb +26 -27
  100. data/lib/mongoid/contextual/aggregable/none.rb +65 -0
  101. data/lib/mongoid/contextual/aggregable.rb +17 -0
  102. data/lib/mongoid/contextual/atomic.rb +29 -31
  103. data/lib/mongoid/contextual/command.rb +2 -5
  104. data/lib/mongoid/contextual/geo_near.rb +6 -37
  105. data/lib/mongoid/contextual/map_reduce.rb +9 -37
  106. data/lib/mongoid/contextual/memory.rb +12 -65
  107. data/lib/mongoid/contextual/mongo.rb +163 -85
  108. data/lib/mongoid/contextual/none.rb +44 -28
  109. data/lib/mongoid/contextual/queryable.rb +2 -3
  110. data/lib/mongoid/contextual.rb +7 -9
  111. data/lib/mongoid/copyable.rb +16 -10
  112. data/lib/mongoid/criteria/findable.rb +12 -15
  113. data/lib/mongoid/criteria/includable.rb +8 -15
  114. data/lib/mongoid/criteria/inspectable.rb +2 -3
  115. data/lib/mongoid/criteria/marshalable.rb +2 -5
  116. data/lib/mongoid/criteria/modifiable.rb +15 -21
  117. data/lib/mongoid/criteria/options.rb +4 -5
  118. data/lib/mongoid/criteria/permission.rb +2 -1
  119. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -13
  120. data/lib/mongoid/criteria/queryable/expandable.rb +68 -0
  121. data/lib/mongoid/criteria/queryable/extensions/array.rb +4 -27
  122. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +3 -4
  123. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +3 -4
  124. data/lib/mongoid/criteria/queryable/extensions/date.rb +3 -8
  125. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +5 -11
  126. data/lib/mongoid/criteria/queryable/extensions/hash.rb +3 -26
  127. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +3 -14
  128. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +4 -13
  129. data/lib/mongoid/criteria/queryable/extensions/object.rb +4 -29
  130. data/lib/mongoid/criteria/queryable/extensions/range.rb +41 -17
  131. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +9 -16
  132. data/lib/mongoid/criteria/queryable/extensions/set.rb +3 -4
  133. data/lib/mongoid/criteria/queryable/extensions/string.rb +3 -18
  134. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -10
  135. data/lib/mongoid/criteria/queryable/extensions/time.rb +4 -9
  136. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +13 -6
  137. data/lib/mongoid/criteria/queryable/extensions.rb +1 -4
  138. data/lib/mongoid/criteria/queryable/key.rb +101 -27
  139. data/lib/mongoid/criteria/queryable/macroable.rb +3 -4
  140. data/lib/mongoid/criteria/queryable/mergeable.rb +184 -44
  141. data/lib/mongoid/criteria/queryable/optional.rb +5 -48
  142. data/lib/mongoid/criteria/queryable/options.rb +2 -19
  143. data/lib/mongoid/criteria/queryable/pipeline.rb +5 -15
  144. data/lib/mongoid/criteria/queryable/selectable.rb +436 -158
  145. data/lib/mongoid/criteria/queryable/selector.rb +45 -55
  146. data/lib/mongoid/criteria/queryable/smash.rb +2 -11
  147. data/lib/mongoid/criteria/queryable/storable.rb +237 -0
  148. data/lib/mongoid/criteria/queryable.rb +7 -9
  149. data/lib/mongoid/criteria/scopable.rb +27 -19
  150. data/lib/mongoid/criteria.rb +86 -73
  151. data/lib/mongoid/document.rb +37 -77
  152. data/lib/mongoid/equality.rb +29 -12
  153. data/lib/mongoid/errors/ambiguous_relationship.rb +4 -5
  154. data/lib/mongoid/errors/callback.rb +2 -3
  155. data/lib/mongoid/errors/criteria_argument_required.rb +18 -0
  156. data/lib/mongoid/errors/delete_restriction.rb +10 -13
  157. data/lib/mongoid/errors/document_not_destroyed.rb +4 -7
  158. data/lib/mongoid/errors/document_not_found.rb +2 -9
  159. data/lib/mongoid/errors/eager_load.rb +6 -5
  160. data/lib/mongoid/errors/empty_config_file.rb +25 -0
  161. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +2 -3
  162. data/lib/mongoid/errors/invalid_collection.rb +2 -1
  163. data/lib/mongoid/errors/invalid_config_file.rb +25 -0
  164. data/lib/mongoid/errors/invalid_config_option.rb +2 -3
  165. data/lib/mongoid/errors/invalid_dependent_strategy.rb +2 -3
  166. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +24 -0
  167. data/lib/mongoid/errors/invalid_elem_match_operator.rb +32 -0
  168. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +25 -0
  169. data/lib/mongoid/errors/invalid_expression_operator.rb +27 -0
  170. data/lib/mongoid/errors/invalid_field.rb +2 -5
  171. data/lib/mongoid/errors/invalid_field_operator.rb +32 -0
  172. data/lib/mongoid/errors/invalid_field_option.rb +2 -3
  173. data/lib/mongoid/errors/invalid_find.rb +2 -3
  174. data/lib/mongoid/errors/invalid_includes.rb +2 -3
  175. data/lib/mongoid/errors/invalid_index.rb +2 -3
  176. data/lib/mongoid/errors/invalid_options.rb +4 -5
  177. data/lib/mongoid/errors/invalid_path.rb +2 -3
  178. data/lib/mongoid/errors/invalid_persistence_option.rb +2 -5
  179. data/lib/mongoid/errors/invalid_query.rb +40 -0
  180. data/lib/mongoid/errors/invalid_relation.rb +4 -9
  181. data/lib/mongoid/errors/invalid_relation_option.rb +4 -5
  182. data/lib/mongoid/errors/invalid_scope.rb +2 -3
  183. data/lib/mongoid/errors/invalid_session_use.rb +3 -6
  184. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +6 -5
  185. data/lib/mongoid/errors/invalid_storage_options.rb +2 -3
  186. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -3
  187. data/lib/mongoid/errors/invalid_time.rb +2 -3
  188. data/lib/mongoid/errors/invalid_value.rb +2 -1
  189. data/lib/mongoid/errors/inverse_not_found.rb +3 -4
  190. data/lib/mongoid/errors/mixed_client_configuration.rb +2 -3
  191. data/lib/mongoid/errors/mixed_relations.rb +2 -3
  192. data/lib/mongoid/errors/mongoid_error.rb +3 -10
  193. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +3 -4
  194. data/lib/mongoid/errors/no_client_config.rb +4 -5
  195. data/lib/mongoid/errors/no_client_database.rb +2 -3
  196. data/lib/mongoid/errors/no_client_hosts.rb +2 -3
  197. data/lib/mongoid/errors/no_clients_config.rb +2 -3
  198. data/lib/mongoid/errors/no_default_client.rb +3 -4
  199. data/lib/mongoid/errors/no_environment.rb +2 -3
  200. data/lib/mongoid/errors/no_map_reduce_output.rb +2 -3
  201. data/lib/mongoid/errors/no_metadata.rb +2 -3
  202. data/lib/mongoid/errors/no_parent.rb +2 -3
  203. data/lib/mongoid/errors/readonly_attribute.rb +2 -3
  204. data/lib/mongoid/errors/readonly_document.rb +3 -6
  205. data/lib/mongoid/errors/scope_overwrite.rb +2 -1
  206. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +2 -0
  207. data/lib/mongoid/errors/unknown_attribute.rb +2 -3
  208. data/lib/mongoid/errors/unknown_model.rb +2 -3
  209. data/lib/mongoid/errors/unsaved_document.rb +3 -2
  210. data/lib/mongoid/errors/unsupported_javascript.rb +2 -3
  211. data/lib/mongoid/errors/validations.rb +2 -1
  212. data/lib/mongoid/errors.rb +12 -1
  213. data/lib/mongoid/evolvable.rb +4 -5
  214. data/lib/mongoid/extensions/array.rb +28 -37
  215. data/lib/mongoid/extensions/big_decimal.rb +3 -12
  216. data/lib/mongoid/extensions/boolean.rb +3 -5
  217. data/lib/mongoid/extensions/date.rb +13 -12
  218. data/lib/mongoid/extensions/date_time.rb +4 -12
  219. data/lib/mongoid/extensions/decimal128.rb +2 -5
  220. data/lib/mongoid/extensions/false_class.rb +4 -7
  221. data/lib/mongoid/extensions/float.rb +5 -10
  222. data/lib/mongoid/extensions/hash.rb +51 -36
  223. data/lib/mongoid/extensions/integer.rb +5 -12
  224. data/lib/mongoid/extensions/module.rb +2 -3
  225. data/lib/mongoid/extensions/nil_class.rb +2 -5
  226. data/lib/mongoid/extensions/object.rb +17 -44
  227. data/lib/mongoid/extensions/object_id.rb +2 -7
  228. data/lib/mongoid/extensions/range.rb +2 -11
  229. data/lib/mongoid/extensions/regexp.rb +4 -4
  230. data/lib/mongoid/extensions/set.rb +2 -7
  231. data/lib/mongoid/extensions/string.rb +24 -42
  232. data/lib/mongoid/extensions/symbol.rb +2 -7
  233. data/lib/mongoid/extensions/time.rb +12 -9
  234. data/lib/mongoid/extensions/time_with_zone.rb +25 -7
  235. data/lib/mongoid/extensions/true_class.rb +4 -7
  236. data/lib/mongoid/extensions.rb +18 -3
  237. data/lib/mongoid/factory.rb +52 -13
  238. data/lib/mongoid/fields/foreign_key.rb +3 -22
  239. data/lib/mongoid/fields/localized.rb +2 -11
  240. data/lib/mongoid/fields/standard.rb +6 -36
  241. data/lib/mongoid/fields/validators/macro.rb +36 -18
  242. data/lib/mongoid/fields/validators.rb +2 -1
  243. data/lib/mongoid/fields.rb +115 -64
  244. data/lib/mongoid/findable.rb +59 -23
  245. data/lib/mongoid/indexable/specification.rb +3 -16
  246. data/lib/mongoid/indexable/validators/options.rb +2 -7
  247. data/lib/mongoid/indexable.rb +10 -25
  248. data/lib/mongoid/inspectable.rb +4 -11
  249. data/lib/mongoid/interceptable.rb +13 -30
  250. data/lib/mongoid/loggable.rb +13 -16
  251. data/lib/mongoid/matchable.rb +3 -150
  252. data/lib/mongoid/matcher/all.rb +22 -0
  253. data/lib/mongoid/matcher/and.rb +21 -0
  254. data/lib/mongoid/matcher/bits.rb +41 -0
  255. data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
  256. data/lib/mongoid/matcher/bits_all_set.rb +20 -0
  257. data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
  258. data/lib/mongoid/matcher/bits_any_set.rb +20 -0
  259. data/lib/mongoid/matcher/elem_match.rb +36 -0
  260. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  261. data/lib/mongoid/matcher/eq.rb +11 -0
  262. data/lib/mongoid/matcher/eq_impl.rb +67 -0
  263. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +26 -0
  264. data/lib/mongoid/matcher/exists.rb +15 -0
  265. data/lib/mongoid/matcher/expression.rb +35 -0
  266. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  267. data/lib/mongoid/matcher/field_expression.rb +62 -0
  268. data/lib/mongoid/matcher/field_operator.rb +54 -0
  269. data/lib/mongoid/matcher/gt.rb +17 -0
  270. data/lib/mongoid/matcher/gte.rb +17 -0
  271. data/lib/mongoid/matcher/in.rb +25 -0
  272. data/lib/mongoid/matcher/lt.rb +17 -0
  273. data/lib/mongoid/matcher/lte.rb +17 -0
  274. data/lib/mongoid/matcher/mod.rb +17 -0
  275. data/lib/mongoid/matcher/ne.rb +16 -0
  276. data/lib/mongoid/matcher/nin.rb +11 -0
  277. data/lib/mongoid/matcher/nor.rb +25 -0
  278. data/lib/mongoid/matcher/not.rb +29 -0
  279. data/lib/mongoid/matcher/or.rb +21 -0
  280. data/lib/mongoid/matcher/regex.rb +41 -0
  281. data/lib/mongoid/matcher/size.rb +26 -0
  282. data/lib/mongoid/matcher/type.rb +99 -0
  283. data/lib/mongoid/matcher.rb +110 -0
  284. data/lib/mongoid/persistable/creatable.rb +6 -23
  285. data/lib/mongoid/persistable/deletable.rb +7 -23
  286. data/lib/mongoid/persistable/destroyable.rb +11 -10
  287. data/lib/mongoid/persistable/incrementable.rb +6 -7
  288. data/lib/mongoid/persistable/logical.rb +4 -6
  289. data/lib/mongoid/persistable/poppable.rb +3 -6
  290. data/lib/mongoid/persistable/pullable.rb +3 -8
  291. data/lib/mongoid/persistable/pushable.rb +14 -10
  292. data/lib/mongoid/persistable/renamable.rb +10 -8
  293. data/lib/mongoid/persistable/savable.rb +3 -8
  294. data/lib/mongoid/persistable/settable.rb +61 -19
  295. data/lib/mongoid/persistable/unsettable.rb +8 -8
  296. data/lib/mongoid/persistable/updatable.rb +33 -21
  297. data/lib/mongoid/persistable/upsertable.rb +4 -9
  298. data/lib/mongoid/persistable.rb +134 -39
  299. data/lib/mongoid/persistence_context.rb +51 -45
  300. data/lib/mongoid/positional.rb +3 -6
  301. data/lib/mongoid/query_cache.rb +138 -106
  302. data/lib/mongoid/railtie.rb +20 -16
  303. data/lib/mongoid/railties/controller_runtime.rb +88 -0
  304. data/lib/mongoid/railties/database.rake +9 -0
  305. data/lib/mongoid/reloadable.rb +14 -19
  306. data/lib/mongoid/scopable.rb +11 -38
  307. data/lib/mongoid/selectable.rb +8 -17
  308. data/lib/mongoid/serializable.rb +24 -29
  309. data/lib/mongoid/shardable.rb +80 -17
  310. data/lib/mongoid/stateful.rb +3 -10
  311. data/lib/mongoid/stringified_symbol.rb +52 -0
  312. data/lib/mongoid/tasks/database.rake +12 -5
  313. data/lib/mongoid/tasks/database.rb +87 -7
  314. data/lib/mongoid/threaded/lifecycle.rb +2 -21
  315. data/lib/mongoid/threaded.rb +38 -55
  316. data/lib/mongoid/timestamps/created/short.rb +2 -1
  317. data/lib/mongoid/timestamps/created.rb +3 -2
  318. data/lib/mongoid/timestamps/short.rb +2 -1
  319. data/lib/mongoid/timestamps/timeless.rb +6 -9
  320. data/lib/mongoid/timestamps/updated/short.rb +2 -1
  321. data/lib/mongoid/timestamps/updated.rb +3 -4
  322. data/lib/mongoid/timestamps.rb +3 -2
  323. data/lib/mongoid/touchable.rb +132 -0
  324. data/lib/mongoid/traversable.rb +177 -57
  325. data/lib/mongoid/validatable/associated.rb +5 -6
  326. data/lib/mongoid/validatable/format.rb +2 -1
  327. data/lib/mongoid/validatable/length.rb +2 -1
  328. data/lib/mongoid/validatable/localizable.rb +2 -3
  329. data/lib/mongoid/validatable/macros.rb +3 -8
  330. data/lib/mongoid/validatable/presence.rb +8 -13
  331. data/lib/mongoid/validatable/queryable.rb +2 -3
  332. data/lib/mongoid/validatable/uniqueness.rb +21 -34
  333. data/lib/mongoid/validatable.rb +8 -27
  334. data/lib/mongoid/version.rb +3 -2
  335. data/lib/mongoid.rb +33 -15
  336. data/lib/rails/generators/mongoid/config/config_generator.rb +10 -2
  337. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +45 -30
  338. data/lib/rails/generators/mongoid/model/model_generator.rb +3 -2
  339. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  340. data/lib/rails/generators/mongoid_generator.rb +2 -1
  341. data/lib/rails/mongoid.rb +4 -5
  342. data/spec/README.md +33 -0
  343. data/spec/config/mongoid.yml +13 -3
  344. data/spec/integration/app_spec.rb +343 -0
  345. data/spec/integration/associations/belongs_to_spec.rb +15 -0
  346. data/spec/integration/associations/embedded_dirty_spec.rb +29 -0
  347. data/spec/integration/associations/embedded_spec.rb +268 -0
  348. data/spec/integration/associations/embeds_many_spec.rb +206 -0
  349. data/spec/integration/associations/embeds_one_spec.rb +23 -0
  350. data/spec/integration/associations/foreign_key_spec.rb +98 -0
  351. data/spec/integration/associations/foreign_key_spec_models.rb +64 -0
  352. data/spec/integration/associations/has_many_spec.rb +128 -0
  353. data/spec/integration/associations/has_one_spec.rb +176 -0
  354. data/spec/integration/associations/nested_attributes_assignment_spec.rb +115 -0
  355. data/spec/integration/associations/reverse_population_spec.rb +34 -0
  356. data/spec/integration/associations/reverse_population_spec_models.rb +36 -0
  357. data/spec/integration/associations/scope_option_spec.rb +101 -0
  358. data/spec/integration/atomic/modifiers_spec.rb +116 -0
  359. data/spec/integration/bson_regexp_raw_spec.rb +19 -0
  360. data/spec/integration/callbacks_models.rb +61 -0
  361. data/spec/integration/callbacks_spec.rb +228 -0
  362. data/spec/integration/contextual/empty_spec.rb +141 -0
  363. data/spec/integration/criteria/alias_query_spec.rb +161 -0
  364. data/spec/integration/criteria/date_field_spec.rb +40 -0
  365. data/spec/integration/criteria/default_scope_spec.rb +72 -0
  366. data/spec/integration/criteria/logical_spec.rb +124 -0
  367. data/spec/integration/criteria/range_spec.rb +265 -0
  368. data/spec/integration/criteria/time_with_zone_spec.rb +142 -0
  369. data/spec/integration/discriminator_key_spec.rb +353 -0
  370. data/spec/integration/discriminator_value_spec.rb +206 -0
  371. data/spec/integration/document_spec.rb +51 -0
  372. data/spec/integration/i18n_fallbacks_spec.rb +89 -0
  373. data/spec/integration/matcher_examples_spec.rb +758 -0
  374. data/spec/integration/matcher_operator_data/all.yml +140 -0
  375. data/spec/integration/matcher_operator_data/and.yml +93 -0
  376. data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
  377. data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
  378. data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
  379. data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
  380. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  381. data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
  382. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  383. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  384. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  385. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  386. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  387. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  388. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  389. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  390. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  391. data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
  392. data/spec/integration/matcher_operator_data/in.yml +210 -0
  393. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  394. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  395. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  396. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  397. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  398. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  399. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  400. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  401. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  402. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  403. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  404. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  405. data/spec/integration/matcher_operator_data/not.yml +196 -0
  406. data/spec/integration/matcher_operator_data/or.yml +137 -0
  407. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  408. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  409. data/spec/integration/matcher_operator_data/size.yml +174 -0
  410. data/spec/integration/matcher_operator_data/type.yml +70 -0
  411. data/spec/integration/matcher_operator_data/type_array.yml +16 -0
  412. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  413. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  414. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  415. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  416. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  417. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  418. data/spec/integration/matcher_operator_data/type_decimal.yml +40 -0
  419. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  420. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  421. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  422. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  423. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  424. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  425. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  426. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  427. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  428. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  429. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  430. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  431. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  432. data/spec/integration/matcher_operator_spec.rb +124 -0
  433. data/spec/integration/matcher_spec.rb +283 -0
  434. data/spec/integration/server_query_spec.rb +141 -0
  435. data/spec/integration/shardable_spec.rb +148 -0
  436. data/spec/integration/stringified_symbol_field_spec.rb +203 -0
  437. data/spec/lite_spec_helper.rb +83 -0
  438. data/spec/mongoid/association/accessors_spec.rb +323 -77
  439. data/spec/mongoid/association/auto_save_spec.rb +74 -33
  440. data/spec/mongoid/association/builders_spec.rb +3 -1
  441. data/spec/mongoid/association/constrainable_spec.rb +2 -0
  442. data/spec/mongoid/association/counter_cache_spec.rb +34 -32
  443. data/spec/mongoid/association/depending_spec.rb +678 -332
  444. data/spec/mongoid/association/eager_spec.rb +6 -4
  445. data/spec/mongoid/association/embedded/cyclic_spec.rb +4 -2
  446. data/spec/mongoid/association/embedded/dirty_spec.rb +4 -2
  447. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -0
  448. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +2 -0
  449. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +65 -13
  450. data/spec/mongoid/association/embedded/embedded_in_spec.rb +61 -1
  451. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +2 -0
  452. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +2 -0
  453. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +672 -144
  454. data/spec/mongoid/association/embedded/embeds_many_models.rb +69 -0
  455. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +51 -0
  456. data/spec/mongoid/association/embedded/embeds_many_spec.rb +13 -1
  457. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +2 -0
  458. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +2 -0
  459. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +23 -21
  460. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +8 -0
  461. data/spec/mongoid/association/embedded/embeds_one_models.rb +54 -0
  462. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +28 -0
  463. data/spec/mongoid/association/embedded/embeds_one_spec.rb +49 -1
  464. data/spec/mongoid/association/macros_spec.rb +11 -9
  465. data/spec/mongoid/association/nested/many_spec.rb +2 -0
  466. data/spec/mongoid/association/nested/one_spec.rb +18 -12
  467. data/spec/mongoid/association/options_spec.rb +2 -0
  468. data/spec/mongoid/association/polymorphic_spec.rb +61 -0
  469. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -0
  470. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +57 -16
  471. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +266 -17
  472. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +99 -58
  473. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +57 -0
  474. data/spec/mongoid/association/referenced/belongs_to_spec.rb +95 -12
  475. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +3 -1
  476. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +28 -1
  477. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +67 -4
  478. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +76 -0
  479. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +351 -164
  480. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +67 -0
  481. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +39 -0
  482. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +49 -5
  483. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +3 -1
  484. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +23 -0
  485. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +40 -9
  486. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +407 -121
  487. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
  488. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +681 -340
  489. data/spec/mongoid/association/referenced/has_many_models.rb +95 -0
  490. data/spec/mongoid/association/referenced/has_many_query_spec.rb +37 -0
  491. data/spec/mongoid/association/referenced/has_many_spec.rb +26 -3
  492. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +2 -0
  493. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +53 -7
  494. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +34 -4
  495. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +28 -26
  496. data/spec/mongoid/association/referenced/has_one_models.rb +97 -0
  497. data/spec/mongoid/association/referenced/has_one_query_spec.rb +37 -0
  498. data/spec/mongoid/association/referenced/has_one_spec.rb +144 -5
  499. data/spec/mongoid/association/reflections_spec.rb +2 -0
  500. data/spec/mongoid/association/syncable_spec.rb +33 -31
  501. data/spec/mongoid/association_spec.rb +2 -0
  502. data/spec/mongoid/atomic/modifiers_spec.rb +49 -0
  503. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +2 -0
  504. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +2 -0
  505. data/spec/mongoid/atomic/paths/root_spec.rb +2 -0
  506. data/spec/mongoid/atomic/paths_spec.rb +107 -12
  507. data/spec/mongoid/atomic_spec.rb +31 -6
  508. data/spec/mongoid/attributes/dynamic_spec.rb +152 -0
  509. data/spec/mongoid/attributes/nested_spec.rb +87 -69
  510. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  511. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  512. data/spec/mongoid/attributes/projector_spec.rb +44 -0
  513. data/spec/mongoid/attributes/readonly_spec.rb +24 -22
  514. data/spec/mongoid/attributes_spec.rb +382 -35
  515. data/spec/mongoid/cacheable_spec.rb +3 -1
  516. data/spec/mongoid/changeable_spec.rb +60 -35
  517. data/spec/mongoid/clients/factory_spec.rb +148 -34
  518. data/spec/mongoid/clients/options_spec.rb +102 -66
  519. data/spec/mongoid/clients/sessions_spec.rb +39 -29
  520. data/spec/mongoid/clients/transactions_spec.rb +415 -0
  521. data/spec/mongoid/clients_spec.rb +78 -16
  522. data/spec/mongoid/composable_spec.rb +2 -0
  523. data/spec/mongoid/config/environment_spec.rb +88 -8
  524. data/spec/mongoid/config/options_spec.rb +22 -3
  525. data/spec/mongoid/config_spec.rb +280 -2
  526. data/spec/mongoid/contextual/aggregable/memory_spec.rb +53 -11
  527. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +122 -20
  528. data/spec/mongoid/contextual/aggregable/none_spec.rb +60 -0
  529. data/spec/mongoid/contextual/atomic_spec.rb +242 -81
  530. data/spec/mongoid/contextual/geo_near_spec.rb +31 -19
  531. data/spec/mongoid/contextual/map_reduce_spec.rb +24 -7
  532. data/spec/mongoid/contextual/memory_spec.rb +25 -23
  533. data/spec/mongoid/contextual/mongo_spec.rb +491 -144
  534. data/spec/mongoid/contextual/none_spec.rb +9 -81
  535. data/spec/mongoid/copyable_spec.rb +261 -30
  536. data/spec/mongoid/copyable_spec_models.rb +47 -0
  537. data/spec/mongoid/criteria/findable_spec.rb +77 -20
  538. data/spec/mongoid/criteria/inspectable_spec.rb +2 -0
  539. data/spec/mongoid/criteria/marshalable_spec.rb +2 -0
  540. data/spec/mongoid/criteria/modifiable_spec.rb +100 -48
  541. data/spec/mongoid/criteria/options_spec.rb +2 -0
  542. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +3 -1
  543. data/spec/mongoid/criteria/queryable/expandable_spec.rb +61 -0
  544. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +2 -0
  545. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +5 -3
  546. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +2 -0
  547. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +3 -1
  548. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +2 -0
  549. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +35 -17
  550. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +2 -0
  551. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +2 -0
  552. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +2 -0
  553. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +2 -0
  554. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +2 -0
  555. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +53 -0
  556. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +2 -0
  557. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +239 -178
  558. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +3 -1
  559. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +9 -7
  560. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +2 -0
  561. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +3 -1
  562. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +2 -0
  563. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +42 -23
  564. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +30 -1
  565. data/spec/mongoid/criteria/queryable/key_spec.rb +50 -6
  566. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +145 -12
  567. data/spec/mongoid/criteria/queryable/optional_spec.rb +3 -1
  568. data/spec/mongoid/criteria/queryable/options_spec.rb +2 -0
  569. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +2 -0
  570. data/spec/mongoid/criteria/queryable/queryable_spec.rb +3 -1
  571. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +2069 -0
  572. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
  573. data/spec/mongoid/criteria/queryable/selectable_spec.rb +994 -2900
  574. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
  575. data/spec/mongoid/criteria/queryable/selector_spec.rb +41 -2
  576. data/spec/mongoid/criteria/queryable/smash_spec.rb +2 -0
  577. data/spec/mongoid/criteria/queryable/storable_spec.rb +226 -0
  578. data/spec/mongoid/criteria/scopable_spec.rb +210 -0
  579. data/spec/mongoid/criteria_projection_spec.rb +410 -0
  580. data/spec/mongoid/criteria_spec.rb +807 -464
  581. data/spec/mongoid/document_fields_spec.rb +113 -0
  582. data/spec/mongoid/document_persistence_context_spec.rb +32 -0
  583. data/spec/mongoid/document_query_spec.rb +89 -0
  584. data/spec/mongoid/document_spec.rb +182 -28
  585. data/spec/mongoid/equality_spec.rb +144 -41
  586. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +5 -3
  587. data/spec/mongoid/errors/callback_spec.rb +2 -0
  588. data/spec/mongoid/errors/delete_restriction_spec.rb +4 -2
  589. data/spec/mongoid/errors/document_not_destroyed_spec.rb +2 -0
  590. data/spec/mongoid/errors/document_not_found_spec.rb +2 -0
  591. data/spec/mongoid/errors/eager_load_spec.rb +2 -0
  592. data/spec/mongoid/errors/invalid_collection_spec.rb +2 -0
  593. data/spec/mongoid/errors/invalid_config_file_spec.rb +31 -0
  594. data/spec/mongoid/errors/invalid_config_option_spec.rb +2 -0
  595. data/spec/mongoid/errors/invalid_field_option_spec.rb +2 -0
  596. data/spec/mongoid/errors/invalid_field_spec.rb +2 -0
  597. data/spec/mongoid/errors/invalid_find_spec.rb +2 -0
  598. data/spec/mongoid/errors/invalid_includes_spec.rb +2 -0
  599. data/spec/mongoid/errors/invalid_index_spec.rb +2 -0
  600. data/spec/mongoid/errors/invalid_options_spec.rb +4 -2
  601. data/spec/mongoid/errors/invalid_path_spec.rb +2 -0
  602. data/spec/mongoid/errors/invalid_relation_spec.rb +4 -2
  603. data/spec/mongoid/errors/invalid_scope_spec.rb +3 -1
  604. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +2 -0
  605. data/spec/mongoid/errors/invalid_storage_options_spec.rb +2 -0
  606. data/spec/mongoid/errors/invalid_time_spec.rb +2 -0
  607. data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -1
  608. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +2 -0
  609. data/spec/mongoid/errors/mixed_relations_spec.rb +2 -0
  610. data/spec/mongoid/errors/mongoid_error_spec.rb +22 -8
  611. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +5 -3
  612. data/spec/mongoid/errors/no_client_config_spec.rb +4 -2
  613. data/spec/mongoid/errors/no_client_database_spec.rb +5 -3
  614. data/spec/mongoid/errors/no_client_hosts_spec.rb +5 -3
  615. data/spec/mongoid/errors/no_clients_config_spec.rb +2 -0
  616. data/spec/mongoid/errors/no_environment_spec.rb +2 -0
  617. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +2 -0
  618. data/spec/mongoid/errors/no_metadata_spec.rb +4 -2
  619. data/spec/mongoid/errors/no_parent_spec.rb +3 -1
  620. data/spec/mongoid/errors/readonly_attribute_spec.rb +2 -0
  621. data/spec/mongoid/errors/readonly_document_spec.rb +2 -0
  622. data/spec/mongoid/errors/scope_overwrite_spec.rb +2 -0
  623. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +2 -0
  624. data/spec/mongoid/errors/unknown_attribute_spec.rb +4 -2
  625. data/spec/mongoid/errors/unsaved_document_spec.rb +3 -1
  626. data/spec/mongoid/errors/unsupported_javascript_spec.rb +2 -0
  627. data/spec/mongoid/errors/validations_spec.rb +2 -0
  628. data/spec/mongoid/extensions/array_spec.rb +25 -43
  629. data/spec/mongoid/extensions/big_decimal_spec.rb +11 -9
  630. data/spec/mongoid/extensions/binary_spec.rb +2 -0
  631. data/spec/mongoid/extensions/boolean_spec.rb +2 -0
  632. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +335 -0
  633. data/spec/mongoid/extensions/date_spec.rb +8 -160
  634. data/spec/mongoid/extensions/date_time_spec.rb +17 -60
  635. data/spec/mongoid/extensions/decimal128_spec.rb +2 -0
  636. data/spec/mongoid/extensions/false_class_spec.rb +3 -1
  637. data/spec/mongoid/extensions/float_spec.rb +17 -3
  638. data/spec/mongoid/extensions/hash_spec.rb +105 -0
  639. data/spec/mongoid/extensions/integer_spec.rb +14 -2
  640. data/spec/mongoid/extensions/module_spec.rb +2 -0
  641. data/spec/mongoid/extensions/nil_class_spec.rb +2 -0
  642. data/spec/mongoid/extensions/object_id_spec.rb +2 -0
  643. data/spec/mongoid/extensions/object_spec.rb +13 -24
  644. data/spec/mongoid/extensions/range_spec.rb +2 -0
  645. data/spec/mongoid/extensions/regexp_spec.rb +25 -0
  646. data/spec/mongoid/extensions/set_spec.rb +2 -0
  647. data/spec/mongoid/extensions/string_spec.rb +95 -34
  648. data/spec/mongoid/extensions/stringified_symbol_spec.rb +84 -0
  649. data/spec/mongoid/extensions/symbol_spec.rb +2 -0
  650. data/spec/mongoid/extensions/time_spec.rb +29 -0
  651. data/spec/mongoid/extensions/time_with_zone_spec.rb +33 -0
  652. data/spec/mongoid/extensions/true_class_spec.rb +3 -1
  653. data/spec/mongoid/extensions_spec.rb +16 -2
  654. data/spec/mongoid/factory_spec.rb +287 -27
  655. data/spec/mongoid/fields/foreign_key_spec.rb +2 -0
  656. data/spec/mongoid/fields/localized_spec.rb +6 -4
  657. data/spec/mongoid/fields/standard_spec.rb +2 -0
  658. data/spec/mongoid/fields_spec.rb +419 -37
  659. data/spec/mongoid/findable_spec.rb +54 -20
  660. data/spec/mongoid/indexable/specification_spec.rb +2 -0
  661. data/spec/mongoid/indexable_spec.rb +36 -6
  662. data/spec/mongoid/inspectable_spec.rb +39 -2
  663. data/spec/mongoid/interceptable_spec.rb +168 -96
  664. data/spec/mongoid/interceptable_spec_models.rb +76 -0
  665. data/spec/mongoid/loggable_spec.rb +2 -0
  666. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  667. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
  668. data/spec/mongoid/matcher/extract_attribute_spec.rb +40 -0
  669. data/spec/mongoid/persistable/creatable_spec.rb +112 -27
  670. data/spec/mongoid/persistable/deletable_spec.rb +273 -11
  671. data/spec/mongoid/persistable/destroyable_spec.rb +201 -11
  672. data/spec/mongoid/persistable/incrementable_spec.rb +29 -13
  673. data/spec/mongoid/persistable/logical_spec.rb +19 -3
  674. data/spec/mongoid/persistable/poppable_spec.rb +19 -3
  675. data/spec/mongoid/persistable/pullable_spec.rb +36 -6
  676. data/spec/mongoid/persistable/pushable_spec.rb +91 -7
  677. data/spec/mongoid/persistable/renamable_spec.rb +18 -2
  678. data/spec/mongoid/persistable/savable_spec.rb +188 -25
  679. data/spec/mongoid/persistable/settable_spec.rb +182 -17
  680. data/spec/mongoid/persistable/unsettable_spec.rb +19 -3
  681. data/spec/mongoid/persistable/updatable_spec.rb +45 -23
  682. data/spec/mongoid/persistable/upsertable_spec.rb +4 -2
  683. data/spec/mongoid/persistable_spec.rb +85 -9
  684. data/spec/mongoid/persistence_context_spec.rb +3 -1
  685. data/spec/mongoid/positional_spec.rb +2 -0
  686. data/spec/mongoid/query_cache_middleware_spec.rb +68 -0
  687. data/spec/mongoid/query_cache_spec.rb +575 -48
  688. data/spec/mongoid/relations/proxy_spec.rb +9 -7
  689. data/spec/mongoid/reloadable_spec.rb +298 -20
  690. data/spec/mongoid/scopable_spec.rb +82 -22
  691. data/spec/mongoid/selectable_spec.rb +8 -6
  692. data/spec/mongoid/serializable_spec.rb +160 -29
  693. data/spec/mongoid/shardable_models.rb +61 -0
  694. data/spec/mongoid/shardable_spec.rb +116 -17
  695. data/spec/mongoid/stateful_spec.rb +3 -1
  696. data/spec/mongoid/tasks/database_rake_spec.rb +15 -13
  697. data/spec/mongoid/tasks/database_spec.rb +3 -1
  698. data/spec/mongoid/threaded_spec.rb +72 -2
  699. data/spec/mongoid/timestamps/created/short_spec.rb +3 -1
  700. data/spec/mongoid/timestamps/created_spec.rb +3 -1
  701. data/spec/mongoid/timestamps/timeless_spec.rb +4 -2
  702. data/spec/mongoid/timestamps/updated/short_spec.rb +5 -3
  703. data/spec/mongoid/timestamps/updated_spec.rb +5 -3
  704. data/spec/mongoid/timestamps_spec.rb +8 -6
  705. data/spec/mongoid/{association/touchable_spec.rb → touchable_spec.rb} +206 -38
  706. data/spec/mongoid/touchable_spec_models.rb +53 -0
  707. data/spec/mongoid/traversable_spec.rb +1167 -1
  708. data/spec/mongoid/validatable/associated_spec.rb +2 -0
  709. data/spec/mongoid/validatable/format_spec.rb +2 -0
  710. data/spec/mongoid/validatable/length_spec.rb +2 -0
  711. data/spec/mongoid/validatable/numericality_spec.rb +2 -0
  712. data/spec/mongoid/validatable/presence_spec.rb +28 -22
  713. data/spec/mongoid/validatable/uniqueness_spec.rb +102 -73
  714. data/spec/mongoid/validatable_spec.rb +5 -3
  715. data/spec/mongoid_spec.rb +2 -0
  716. data/spec/rails/controller_extension/controller_runtime_spec.rb +112 -0
  717. data/spec/rails/mongoid_spec.rb +4 -2
  718. data/spec/shared/LICENSE +20 -0
  719. data/spec/shared/bin/get-mongodb-download-url +17 -0
  720. data/spec/shared/bin/s3-copy +45 -0
  721. data/spec/shared/bin/s3-upload +69 -0
  722. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  723. data/spec/shared/lib/mrss/cluster_config.rb +231 -0
  724. data/spec/shared/lib/mrss/constraints.rb +386 -0
  725. data/spec/shared/lib/mrss/docker_runner.rb +271 -0
  726. data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
  727. data/spec/shared/lib/mrss/lite_constraints.rb +199 -0
  728. data/spec/shared/lib/mrss/server_version_registry.rb +120 -0
  729. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  730. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  731. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  732. data/spec/shared/lib/mrss/utils.rb +15 -0
  733. data/spec/shared/share/Dockerfile.erb +339 -0
  734. data/spec/shared/share/haproxy-1.conf +16 -0
  735. data/spec/shared/share/haproxy-2.conf +17 -0
  736. data/spec/shared/shlib/distro.sh +74 -0
  737. data/spec/shared/shlib/server.sh +379 -0
  738. data/spec/shared/shlib/set_env.sh +132 -0
  739. data/spec/spec_helper.rb +69 -80
  740. data/spec/support/authorization.rb +2 -0
  741. data/spec/support/client_registry.rb +9 -0
  742. data/spec/support/constraints.rb +53 -0
  743. data/spec/support/expectations.rb +21 -3
  744. data/spec/support/helpers.rb +11 -0
  745. data/spec/support/macros.rb +42 -0
  746. data/spec/{app → support}/models/account.rb +3 -1
  747. data/spec/{app → support}/models/acolyte.rb +2 -0
  748. data/spec/{app → support}/models/actor.rb +3 -1
  749. data/spec/support/models/actress.rb +4 -0
  750. data/spec/{app → support}/models/address.rb +6 -0
  751. data/spec/{app → support}/models/address_component.rb +2 -0
  752. data/spec/{app → support}/models/address_number.rb +2 -0
  753. data/spec/{app → support}/models/agency.rb +2 -0
  754. data/spec/{app → support}/models/agent.rb +2 -0
  755. data/spec/{app → support}/models/album.rb +2 -0
  756. data/spec/{app → support}/models/alert.rb +2 -0
  757. data/spec/{app → support}/models/animal.rb +2 -0
  758. data/spec/{app → support}/models/answer.rb +2 -0
  759. data/spec/{app → support}/models/appointment.rb +2 -0
  760. data/spec/support/models/armrest.rb +9 -0
  761. data/spec/support/models/array_field.rb +7 -0
  762. data/spec/{app → support}/models/article.rb +2 -0
  763. data/spec/{app → support}/models/artist.rb +4 -0
  764. data/spec/{app → support}/models/artwork.rb +2 -0
  765. data/spec/support/models/audible_sound.rb +3 -0
  766. data/spec/{app → support}/models/audio.rb +2 -0
  767. data/spec/{app → support}/models/augmentation.rb +2 -0
  768. data/spec/{app → support}/models/author.rb +2 -0
  769. data/spec/{app → support}/models/baby.rb +2 -0
  770. data/spec/{app → support}/models/band.rb +6 -0
  771. data/spec/{app → support}/models/bar.rb +2 -0
  772. data/spec/{app → support}/models/basic.rb +2 -0
  773. data/spec/support/models/bed.rb +3 -0
  774. data/spec/{app → support}/models/big_palette.rb +2 -0
  775. data/spec/{app → support}/models/birthday.rb +2 -0
  776. data/spec/support/models/bolt.rb +7 -0
  777. data/spec/{app → support}/models/bomb.rb +2 -0
  778. data/spec/{app → support}/models/book.rb +2 -0
  779. data/spec/{app → support}/models/breed.rb +2 -0
  780. data/spec/{app → support}/models/browser.rb +3 -1
  781. data/spec/{app → support}/models/building.rb +2 -0
  782. data/spec/{app → support}/models/building_address.rb +2 -0
  783. data/spec/{app → support}/models/bus.rb +2 -0
  784. data/spec/{app → support}/models/business.rb +2 -0
  785. data/spec/{app → support}/models/callback_test.rb +2 -0
  786. data/spec/{app → support}/models/canvas.rb +3 -1
  787. data/spec/support/models/car.rb +3 -0
  788. data/spec/{app → support}/models/cat.rb +2 -0
  789. data/spec/{app → support}/models/category.rb +2 -0
  790. data/spec/{app → support}/models/child.rb +2 -0
  791. data/spec/{app → support}/models/child_doc.rb +5 -3
  792. data/spec/{app → support}/models/church.rb +2 -0
  793. data/spec/{app → support}/models/circle.rb +2 -0
  794. data/spec/{app → support}/models/circuit.rb +2 -0
  795. data/spec/{app → support}/models/circus.rb +2 -0
  796. data/spec/{app → support}/models/code.rb +2 -0
  797. data/spec/support/models/coding/pull_request.rb +11 -0
  798. data/spec/support/models/coding.rb +3 -0
  799. data/spec/{app → support}/models/comment.rb +2 -0
  800. data/spec/{app → support}/models/company.rb +2 -0
  801. data/spec/{app → support}/models/consumption_period.rb +2 -0
  802. data/spec/{app → support}/models/contextable_item.rb +2 -0
  803. data/spec/{app → support}/models/contractor.rb +2 -0
  804. data/spec/{app → support}/models/cookie.rb +2 -0
  805. data/spec/{app → support}/models/country_code.rb +4 -0
  806. data/spec/{app → support}/models/courier_job.rb +2 -0
  807. data/spec/support/models/crate.rb +12 -0
  808. data/spec/support/models/customer.rb +10 -0
  809. data/spec/support/models/customer_address.rb +11 -0
  810. data/spec/support/models/deed.rb +7 -0
  811. data/spec/{app → support}/models/definition.rb +2 -0
  812. data/spec/support/models/delegating_patient.rb +15 -0
  813. data/spec/{app → support}/models/description.rb +2 -0
  814. data/spec/{app → support}/models/dictionary.rb +8 -0
  815. data/spec/{app → support}/models/division.rb +2 -0
  816. data/spec/{app → support}/models/doctor.rb +2 -0
  817. data/spec/{app → support}/models/dog.rb +2 -0
  818. data/spec/{app → support}/models/dokument.rb +2 -0
  819. data/spec/{app → support}/models/draft.rb +2 -0
  820. data/spec/{app → support}/models/dragon.rb +2 -0
  821. data/spec/{app → support}/models/driver.rb +3 -1
  822. data/spec/{app → support}/models/drug.rb +2 -0
  823. data/spec/{app → support}/models/dungeon.rb +2 -0
  824. data/spec/{app → support}/models/edit.rb +2 -0
  825. data/spec/{app → support}/models/email.rb +2 -0
  826. data/spec/{app → support}/models/employer.rb +2 -0
  827. data/spec/{app → support}/models/entry.rb +2 -0
  828. data/spec/support/models/eraser.rb +3 -0
  829. data/spec/{app → support}/models/even.rb +2 -0
  830. data/spec/{app → support}/models/event.rb +2 -0
  831. data/spec/{app → support}/models/exhibition.rb +2 -0
  832. data/spec/{app → support}/models/exhibitor.rb +2 -0
  833. data/spec/{app → support}/models/explosion.rb +2 -0
  834. data/spec/{app → support}/models/eye.rb +2 -0
  835. data/spec/{app → support}/models/eye_bowl.rb +2 -0
  836. data/spec/{app → support}/models/face.rb +2 -0
  837. data/spec/{app → support}/models/favorite.rb +2 -0
  838. data/spec/{app → support}/models/filesystem.rb +2 -0
  839. data/spec/{app → support}/models/fire_hydrant.rb +2 -0
  840. data/spec/{app → support}/models/firefox.rb +2 -0
  841. data/spec/{app → support}/models/fish.rb +2 -0
  842. data/spec/{app → support}/models/folder.rb +2 -0
  843. data/spec/{app → support}/models/folder_item.rb +2 -0
  844. data/spec/{app → support}/models/fruits.rb +2 -0
  845. data/spec/{app → support}/models/game.rb +2 -0
  846. data/spec/{app → support}/models/ghost.rb +2 -0
  847. data/spec/support/models/guitar.rb +4 -0
  848. data/spec/support/models/hole.rb +12 -0
  849. data/spec/{app → support}/models/home.rb +2 -0
  850. data/spec/{app → support}/models/house.rb +2 -0
  851. data/spec/{app → support}/models/html_writer.rb +2 -0
  852. data/spec/{app → support}/models/id_key.rb +2 -0
  853. data/spec/support/models/idnodef.rb +7 -0
  854. data/spec/{app → support}/models/image.rb +2 -0
  855. data/spec/{app → support}/models/implant.rb +2 -0
  856. data/spec/support/models/instrument.rb +8 -0
  857. data/spec/{app → support}/models/item.rb +3 -1
  858. data/spec/{app → support}/models/jar.rb +2 -0
  859. data/spec/{app → support}/models/kaleidoscope.rb +2 -0
  860. data/spec/{app → support}/models/kangaroo.rb +3 -1
  861. data/spec/{app → support}/models/label.rb +4 -1
  862. data/spec/{app → support}/models/language.rb +2 -0
  863. data/spec/{app → support}/models/lat_lng.rb +2 -0
  864. data/spec/{app → support}/models/league.rb +2 -0
  865. data/spec/support/models/learner.rb +4 -0
  866. data/spec/{app → support}/models/line_item.rb +2 -0
  867. data/spec/{app → support}/models/location.rb +2 -0
  868. data/spec/{app → support}/models/login.rb +2 -0
  869. data/spec/{app → support}/models/manufacturer.rb +2 -0
  870. data/spec/{app → support}/models/meat.rb +2 -0
  871. data/spec/{app → support}/models/membership.rb +2 -0
  872. data/spec/{app → support}/models/message.rb +2 -0
  873. data/spec/support/models/minim.rb +6 -0
  874. data/spec/{app → support}/models/mixed_drink.rb +2 -0
  875. data/spec/support/models/mop.rb +24 -0
  876. data/spec/{app → support}/models/movie.rb +2 -0
  877. data/spec/support/models/my_hash.rb +4 -0
  878. data/spec/{app → support}/models/name.rb +2 -0
  879. data/spec/support/models/name_only.rb +8 -0
  880. data/spec/{app → support}/models/node.rb +2 -0
  881. data/spec/{app → support}/models/note.rb +2 -0
  882. data/spec/support/models/nut.rb +7 -0
  883. data/spec/{app → support}/models/odd.rb +2 -0
  884. data/spec/support/models/order.rb +12 -0
  885. data/spec/{app → support}/models/ordered_post.rb +3 -1
  886. data/spec/{app → support}/models/ordered_preference.rb +2 -0
  887. data/spec/{app → support}/models/oscar.rb +2 -0
  888. data/spec/support/models/other_owner_object.rb +4 -0
  889. data/spec/{app → support}/models/override.rb +2 -0
  890. data/spec/{app → support}/models/ownable.rb +2 -0
  891. data/spec/{app → support}/models/owner.rb +4 -0
  892. data/spec/{app → support}/models/pack.rb +2 -0
  893. data/spec/{app → support}/models/page.rb +2 -0
  894. data/spec/{app → support}/models/page_question.rb +2 -0
  895. data/spec/{app → support}/models/palette.rb +3 -1
  896. data/spec/{app → support}/models/parent.rb +2 -0
  897. data/spec/{app → support}/models/parent_doc.rb +2 -0
  898. data/spec/support/models/passport.rb +13 -0
  899. data/spec/{app → support}/models/patient.rb +2 -0
  900. data/spec/{app → support}/models/pdf_writer.rb +2 -0
  901. data/spec/support/models/pencil.rb +3 -0
  902. data/spec/{app → support}/models/person.rb +21 -1
  903. data/spec/{app → support}/models/pet.rb +2 -0
  904. data/spec/{app → support}/models/pet_owner.rb +2 -0
  905. data/spec/{app → support}/models/phone.rb +5 -1
  906. data/spec/support/models/piano.rb +4 -0
  907. data/spec/{app → support}/models/pizza.rb +2 -0
  908. data/spec/{app → support}/models/player.rb +2 -0
  909. data/spec/{app → support}/models/post.rb +2 -0
  910. data/spec/{app → support}/models/post_genre.rb +2 -0
  911. data/spec/{app → support}/models/powerup.rb +2 -0
  912. data/spec/{app → support}/models/preference.rb +2 -0
  913. data/spec/{app → support}/models/princess.rb +2 -0
  914. data/spec/{app → support}/models/product.rb +2 -0
  915. data/spec/support/models/profile.rb +17 -0
  916. data/spec/{app → support}/models/pronunciation.rb +2 -0
  917. data/spec/{app → support}/models/pub.rb +2 -0
  918. data/spec/support/models/publication/encyclopedia.rb +11 -0
  919. data/spec/support/models/publication/review.rb +13 -0
  920. data/spec/support/models/publication.rb +4 -0
  921. data/spec/{app → support}/models/purchase.rb +2 -0
  922. data/spec/support/models/purchased_item.rb +10 -0
  923. data/spec/{app → support}/models/question.rb +2 -0
  924. data/spec/{app → support}/models/quiz.rb +2 -0
  925. data/spec/{app → support}/models/rating.rb +2 -0
  926. data/spec/{app → support}/models/record.rb +2 -0
  927. data/spec/{app → support}/models/registry.rb +2 -0
  928. data/spec/{app → support}/models/role.rb +2 -0
  929. data/spec/{app → support}/models/root_category.rb +2 -0
  930. data/spec/{app → support}/models/sandwich.rb +2 -0
  931. data/spec/{app → support}/models/scheduler.rb +2 -0
  932. data/spec/support/models/scribe.rb +7 -0
  933. data/spec/support/models/sealer.rb +7 -0
  934. data/spec/support/models/seat.rb +24 -0
  935. data/spec/{app → support}/models/seo.rb +2 -0
  936. data/spec/support/models/series.rb +7 -0
  937. data/spec/{app → support}/models/server.rb +2 -0
  938. data/spec/{app → support}/models/service.rb +2 -0
  939. data/spec/{app → support}/models/shape.rb +4 -2
  940. data/spec/{app → support}/models/shelf.rb +2 -0
  941. data/spec/{app → support}/models/shipment_address.rb +2 -0
  942. data/spec/{app → support}/models/shipping_container.rb +2 -0
  943. data/spec/{app → support}/models/shipping_pack.rb +2 -0
  944. data/spec/support/models/shirt.rb +11 -0
  945. data/spec/{app → support}/models/shop.rb +2 -0
  946. data/spec/{app → support}/models/short_agent.rb +2 -0
  947. data/spec/{app → support}/models/short_quiz.rb +2 -0
  948. data/spec/{app → support}/models/simple.rb +2 -0
  949. data/spec/{app → support}/models/slave.rb +2 -0
  950. data/spec/{app → support}/models/song.rb +2 -0
  951. data/spec/{app → support}/models/sound.rb +2 -0
  952. data/spec/support/models/spacer.rb +7 -0
  953. data/spec/{app → support}/models/square.rb +2 -0
  954. data/spec/{app → support}/models/staff.rb +2 -0
  955. data/spec/{app → support}/models/store_as_dup_test1.rb +2 -0
  956. data/spec/{app → support}/models/store_as_dup_test2.rb +2 -0
  957. data/spec/support/models/store_as_dup_test3.rb +7 -0
  958. data/spec/support/models/store_as_dup_test4.rb +7 -0
  959. data/spec/{app → support}/models/strategy.rb +2 -0
  960. data/spec/{app → support}/models/sub_item.rb +2 -0
  961. data/spec/{app → support}/models/subscription.rb +2 -0
  962. data/spec/{app → support}/models/survey.rb +2 -0
  963. data/spec/{app → support}/models/symptom.rb +2 -0
  964. data/spec/support/models/system_role.rb +7 -0
  965. data/spec/{app → support}/models/tag.rb +2 -0
  966. data/spec/{app → support}/models/target.rb +2 -0
  967. data/spec/{app → support}/models/template.rb +2 -0
  968. data/spec/{app → support}/models/thing.rb +2 -0
  969. data/spec/support/models/threadlocker.rb +7 -0
  970. data/spec/{app → support}/models/title.rb +2 -0
  971. data/spec/{app → support}/models/tool.rb +4 -2
  972. data/spec/{app → support}/models/topping.rb +2 -0
  973. data/spec/support/models/toy.rb +9 -0
  974. data/spec/{app → support}/models/track.rb +2 -0
  975. data/spec/{app → support}/models/translation.rb +2 -0
  976. data/spec/{app → support}/models/tree.rb +2 -0
  977. data/spec/support/models/truck.rb +7 -0
  978. data/spec/support/models/updatable.rb +7 -0
  979. data/spec/{app → support}/models/user.rb +2 -0
  980. data/spec/{app → support}/models/user_account.rb +2 -0
  981. data/spec/{app → support}/models/validation_callback.rb +2 -0
  982. data/spec/support/models/vehicle.rb +18 -0
  983. data/spec/{app → support}/models/version.rb +2 -0
  984. data/spec/{app → support}/models/vertex.rb +3 -1
  985. data/spec/{app → support}/models/vet_visit.rb +2 -0
  986. data/spec/{app → support}/models/video.rb +2 -0
  987. data/spec/support/models/video_game.rb +3 -0
  988. data/spec/support/models/washer.rb +7 -0
  989. data/spec/{app → support}/models/weapon.rb +2 -0
  990. data/spec/{app → support}/models/wiki_page.rb +3 -0
  991. data/spec/{app → support}/models/word.rb +2 -0
  992. data/spec/{app → support}/models/word_origin.rb +2 -0
  993. data/spec/{app → support}/models/writer.rb +4 -2
  994. data/spec/support/shared/time.rb +53 -0
  995. data/spec/support/spec_config.rb +60 -0
  996. data.tar.gz.sig +0 -0
  997. metadata +1131 -686
  998. metadata.gz.sig +0 -0
  999. data/lib/mongoid/association/touchable.rb +0 -97
  1000. data/lib/mongoid/criteria/queryable/forwardable.rb +0 -65
  1001. data/lib/mongoid/matchable/all.rb +0 -27
  1002. data/lib/mongoid/matchable/and.rb +0 -30
  1003. data/lib/mongoid/matchable/default.rb +0 -72
  1004. data/lib/mongoid/matchable/elem_match.rb +0 -34
  1005. data/lib/mongoid/matchable/exists.rb +0 -23
  1006. data/lib/mongoid/matchable/gt.rb +0 -23
  1007. data/lib/mongoid/matchable/gte.rb +0 -23
  1008. data/lib/mongoid/matchable/in.rb +0 -24
  1009. data/lib/mongoid/matchable/lt.rb +0 -23
  1010. data/lib/mongoid/matchable/lte.rb +0 -23
  1011. data/lib/mongoid/matchable/ne.rb +0 -21
  1012. data/lib/mongoid/matchable/nin.rb +0 -22
  1013. data/lib/mongoid/matchable/or.rb +0 -33
  1014. data/lib/mongoid/matchable/regexp.rb +0 -27
  1015. data/lib/mongoid/matchable/size.rb +0 -21
  1016. data/lib/support/ruby_version.rb +0 -26
  1017. data/spec/app/models/actress.rb +0 -2
  1018. data/spec/app/models/bed.rb +0 -1
  1019. data/spec/app/models/car.rb +0 -1
  1020. data/spec/app/models/eraser.rb +0 -1
  1021. data/spec/app/models/learner.rb +0 -2
  1022. data/spec/app/models/my_hash.rb +0 -2
  1023. data/spec/app/models/passport.rb +0 -5
  1024. data/spec/app/models/pencil.rb +0 -1
  1025. data/spec/app/models/profile.rb +0 -5
  1026. data/spec/app/models/series.rb +0 -4
  1027. data/spec/app/models/truck.rb +0 -3
  1028. data/spec/app/models/vehicle.rb +0 -11
  1029. data/spec/app/models/video_game.rb +0 -1
  1030. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +0 -87
  1031. data/spec/mongoid/matchable/all_spec.rb +0 -31
  1032. data/spec/mongoid/matchable/and_spec.rb +0 -187
  1033. data/spec/mongoid/matchable/default_spec.rb +0 -130
  1034. data/spec/mongoid/matchable/elem_match_spec.rb +0 -106
  1035. data/spec/mongoid/matchable/exists_spec.rb +0 -57
  1036. data/spec/mongoid/matchable/gt_spec.rb +0 -86
  1037. data/spec/mongoid/matchable/gte_spec.rb +0 -84
  1038. data/spec/mongoid/matchable/in_spec.rb +0 -49
  1039. data/spec/mongoid/matchable/lt_spec.rb +0 -85
  1040. data/spec/mongoid/matchable/lte_spec.rb +0 -85
  1041. data/spec/mongoid/matchable/ne_spec.rb +0 -46
  1042. data/spec/mongoid/matchable/nin_spec.rb +0 -48
  1043. data/spec/mongoid/matchable/or_spec.rb +0 -131
  1044. data/spec/mongoid/matchable/regexp_spec.rb +0 -59
  1045. data/spec/mongoid/matchable/size_spec.rb +0 -25
  1046. data/spec/mongoid/matchable_spec.rb +0 -828
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
@@ -112,7 +114,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
112
114
  context "when the parent is not a new record" do
113
115
 
114
116
  let(:person) do
115
- Person.create
117
+ Person.create!
116
118
  end
117
119
 
118
120
  let(:address) do
@@ -131,7 +133,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
131
133
  context "when appending more than one document at once" do
132
134
 
133
135
  let(:person) do
134
- Person.create
136
+ Person.create!
135
137
  end
136
138
 
137
139
  let(:address_one) do
@@ -207,7 +209,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
207
209
  context "when the parent is not a new record" do
208
210
 
209
211
  let(:parent_role) do
210
- Role.create(name: "CEO")
212
+ Role.create!(name: "CEO")
211
213
  end
212
214
 
213
215
  let(:child_role) do
@@ -226,7 +228,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
226
228
 
227
229
  context "when the child has one sided many to many relation" do
228
230
  let(:person) do
229
- Person.create
231
+ Person.create!
230
232
  end
231
233
 
232
234
  let(:message) do
@@ -309,7 +311,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
309
311
  context "when the parent is not a new record" do
310
312
 
311
313
  let(:person) do
312
- Person.create
314
+ Person.create!
313
315
  end
314
316
 
315
317
  let(:address) do
@@ -330,11 +332,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
330
332
  context "when setting via an overridden method from the parent" do
331
333
 
332
334
  let!(:person) do
333
- Person.create
335
+ Person.create!
334
336
  end
335
337
 
336
338
  let!(:address) do
337
- person.addresses.create(street: "Alt Treptow")
339
+ person.addresses.create!(street: "Alt Treptow")
338
340
  end
339
341
 
340
342
  let!(:new_address) do
@@ -342,7 +344,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
342
344
  end
343
345
 
344
346
  before do
345
- person.update_attributes(set_addresses: [ new_address ])
347
+ person.update_attributes!(set_addresses: [ new_address ])
346
348
  end
347
349
 
348
350
  it "overwrites the existing addresses" do
@@ -372,7 +374,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
372
374
 
373
375
  before do
374
376
  person.addresses = [ address_two ]
375
- person.save
377
+ person.save!
376
378
  end
377
379
 
378
380
  it "sets the new documents" do
@@ -406,7 +408,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
406
408
 
407
409
  before do
408
410
  doctor.addresses = [ address_one ]
409
- doctor.save
411
+ doctor.save!
410
412
  end
411
413
 
412
414
  it "sets the documents" do
@@ -425,7 +427,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
425
427
 
426
428
  before do
427
429
  doctor.addresses = [ address_two ]
428
- doctor.save
430
+ doctor.save!
429
431
  end
430
432
 
431
433
  it "sets the new documents" do
@@ -443,7 +445,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
443
445
  context "when replacing an existing relation" do
444
446
 
445
447
  let(:person) do
446
- Person.create(addresses: addresses)
448
+ Person.create!(addresses: addresses)
447
449
  end
448
450
 
449
451
  let(:addresses) do
@@ -504,7 +506,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
504
506
  end
505
507
 
506
508
  let(:tracking_id) do
507
- MyCompany::Model::TrackingId.create
509
+ MyCompany::Model::TrackingId.create!
508
510
  end
509
511
 
510
512
  let(:history) do
@@ -539,7 +541,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
539
541
  inflect.singular("address_numbers", "address_number")
540
542
  end
541
543
  slave.address_numbers << AddressNumber.new(country_code: 1)
542
- slave.save
544
+ slave.save!
543
545
  end
544
546
 
545
547
  it "requires an inflection to determine the class" do
@@ -550,15 +552,15 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
550
552
  context "when setting the entire tree via a hash" do
551
553
 
552
554
  let(:person) do
553
- Person.create
555
+ Person.create!
554
556
  end
555
557
 
556
558
  let!(:address_one) do
557
- person.addresses.create(street: "Tauentzienstr")
559
+ person.addresses.create!(street: "Tauentzienstr")
558
560
  end
559
561
 
560
562
  let!(:address_two) do
561
- person.addresses.create(street: "Kudamm")
563
+ person.addresses.create!(street: "Kudamm")
562
564
  end
563
565
 
564
566
  let(:attributes) do
@@ -569,7 +571,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
569
571
 
570
572
  before do
571
573
  attributes["addresses"][0]["city"] = "Berlin"
572
- person.update_attributes(attributes)
574
+ person.update_attributes!(attributes)
573
575
  end
574
576
 
575
577
  it "sets the new attributes" do
@@ -585,15 +587,15 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
585
587
  context "when setting an embedded sub-document tree via a hash" do
586
588
 
587
589
  let(:person) do
588
- Person.create
590
+ Person.create!
589
591
  end
590
592
 
591
593
  let!(:address_one) do
592
- person.addresses.create(street: "Tauentzienstr")
594
+ person.addresses.create!(street: "Tauentzienstr")
593
595
  end
594
596
 
595
597
  let!(:location_one) do
596
- person.addresses.first.locations.create(name: "Work")
598
+ person.addresses.first.locations.create!(name: "Work")
597
599
  end
598
600
 
599
601
  let(:attributes) do
@@ -605,7 +607,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
605
607
  before do
606
608
  attributes["city"] = "Berlin"
607
609
  attributes["locations"][0]["name"] = "Home"
608
- person.addresses.first.update_attributes(attributes)
610
+ person.addresses.first.update_attributes!(attributes)
609
611
  end
610
612
 
611
613
  it "sets the new attributes on the address" do
@@ -678,7 +680,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
678
680
  context "when the parent is not a new record" do
679
681
 
680
682
  let(:parent_role) do
681
- Role.create(name: "CTO")
683
+ Role.create!(name: "CTO")
682
684
  end
683
685
 
684
686
  let(:child_role) do
@@ -746,7 +748,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
746
748
  context "when the parent is persisted" do
747
749
 
748
750
  let(:person) do
749
- Person.create
751
+ Person.create!
750
752
  end
751
753
 
752
754
  let(:address) do
@@ -795,7 +797,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
795
797
  context "when saving the parent" do
796
798
 
797
799
  before do
798
- person.save
800
+ person.save!
799
801
  person.reload
800
802
  end
801
803
 
@@ -809,7 +811,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
809
811
  context "when setting on a reload" do
810
812
 
811
813
  let(:person) do
812
- Person.create
814
+ Person.create!
813
815
  end
814
816
 
815
817
  let(:address) do
@@ -879,7 +881,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
879
881
  context "when the documents are not new records" do
880
882
 
881
883
  let(:parent_role) do
882
- Role.create
884
+ Role.create!
883
885
  end
884
886
 
885
887
  let(:child_role) do
@@ -909,13 +911,13 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
909
911
  describe "#as_document" do
910
912
 
911
913
  let!(:person) do
912
- Person.create
914
+ Person.create!
913
915
  end
914
916
 
915
917
  context 'when a string is used to access an attribute' do
916
918
 
917
919
  let!(:address) do
918
- person.addresses.create(street: "one")
920
+ person.addresses.create!(street: "one")
919
921
  end
920
922
 
921
923
  let(:document) do
@@ -930,7 +932,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
930
932
  context 'when a symbol is used to access an attribute' do
931
933
 
932
934
  let!(:address) do
933
- person.addresses.create(street: "one")
935
+ person.addresses.create!(street: "one")
934
936
  end
935
937
 
936
938
  let(:document) do
@@ -945,7 +947,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
945
947
  context "when the relation has no default scope" do
946
948
 
947
949
  let!(:address) do
948
- person.addresses.create(street: "one")
950
+ person.addresses.create!(street: "one")
949
951
  end
950
952
 
951
953
  let(:document) do
@@ -1102,7 +1104,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1102
1104
  context "when providing nested attributes" do
1103
1105
 
1104
1106
  let(:person) do
1105
- Person.create
1107
+ Person.create!
1106
1108
  end
1107
1109
 
1108
1110
  let(:address) do
@@ -1116,7 +1118,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1116
1118
  context "when followed by a save" do
1117
1119
 
1118
1120
  before do
1119
- address.save
1121
+ address.save!
1120
1122
  end
1121
1123
 
1122
1124
  let(:location) do
@@ -1136,13 +1138,13 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1136
1138
  context "when the parent has been persisted" do
1137
1139
 
1138
1140
  let(:person) do
1139
- Person.create
1141
+ Person.create!
1140
1142
  end
1141
1143
 
1142
1144
  context "when the children are persisted" do
1143
1145
 
1144
1146
  let!(:address) do
1145
- person.addresses.create(street: "High St")
1147
+ person.addresses.create!(street: "High St")
1146
1148
  end
1147
1149
 
1148
1150
  let!(:relation) do
@@ -1258,7 +1260,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1258
1260
  context "when the parent is not a new record" do
1259
1261
 
1260
1262
  let(:person) do
1261
- Person.create
1263
+ Person.create!
1262
1264
  end
1263
1265
 
1264
1266
  let(:address) do
@@ -1277,7 +1279,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1277
1279
  context "when concatenating an empty array" do
1278
1280
 
1279
1281
  let(:person) do
1280
- Person.create
1282
+ Person.create!
1281
1283
  end
1282
1284
 
1283
1285
  before do
@@ -1293,7 +1295,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1293
1295
  context "when appending more than one document at once" do
1294
1296
 
1295
1297
  let(:person) do
1296
- Person.create
1298
+ Person.create!
1297
1299
  end
1298
1300
 
1299
1301
  let(:address_one) do
@@ -1365,7 +1367,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1365
1367
  context "when the parent is not a new record" do
1366
1368
 
1367
1369
  let(:parent_role) do
1368
- Role.create(name: "CEO")
1370
+ Role.create!(name: "CEO")
1369
1371
  end
1370
1372
 
1371
1373
  let(:child_role) do
@@ -1386,17 +1388,262 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1386
1388
  describe "#count" do
1387
1389
 
1388
1390
  let(:person) do
1389
- Person.create
1391
+ Person.create!
1390
1392
  end
1391
1393
 
1392
1394
  before do
1393
- person.addresses.create(street: "Upper")
1395
+ person.addresses.create!(street: "Upper")
1394
1396
  person.addresses.build(street: "Bond")
1397
+ person.addresses.build(street: "Lower")
1395
1398
  end
1396
1399
 
1397
1400
  it "returns the number of persisted documents" do
1398
1401
  expect(person.addresses.count).to eq(1)
1399
1402
  end
1403
+
1404
+ context 'block form' do
1405
+ it "iterates across all documents" do
1406
+ expect(person.addresses.count {|a| a.persisted? }).to eq(1)
1407
+ expect(person.addresses.count {|a| !a.persisted? }).to eq(2)
1408
+ expect(person.addresses.count {|a| a.street.include?('on') }).to eq(1)
1409
+ expect(person.addresses.count {|a| a.street.ends_with?('er') }).to eq(2)
1410
+ end
1411
+ end
1412
+
1413
+ context 'argument form' do
1414
+ it "behaves correctly when given a model instance" do
1415
+ expect(person.addresses.count(person.addresses.first)).to eq(1)
1416
+ end
1417
+
1418
+ it "behaves correctly when given a non-model instance" do
1419
+ expect(person.addresses.count(1)).to eq(0)
1420
+ end
1421
+ end
1422
+ end
1423
+
1424
+ describe "#any?" do
1425
+
1426
+ let(:person) do
1427
+ Person.create!
1428
+ end
1429
+
1430
+ context "when documents are persisted" do
1431
+ before do
1432
+ person.addresses.create!(street: "Upper")
1433
+ end
1434
+
1435
+ it "returns true" do
1436
+ expect(person.addresses.any?).to be true
1437
+ end
1438
+
1439
+ it "block form iterates across all documents" do
1440
+ expect(person.addresses.any? {|a| a.street == "Upper" }).to be true
1441
+ expect(person.addresses.any? {|a| a.street == "Bond" }).to be false
1442
+ end
1443
+
1444
+ context 'argument form' do
1445
+ it "behaves correctly when given a model instance" do
1446
+ expect(person.addresses.any?(person.addresses.first)).to be true
1447
+ end
1448
+
1449
+ it "behaves correctly when given a non-model instance" do
1450
+ expect(person.addresses.any?(1)).to be false
1451
+ end
1452
+ end
1453
+ end
1454
+
1455
+ context "when documents are not persisted" do
1456
+ before do
1457
+ person.addresses.build(street: "Bond")
1458
+ end
1459
+
1460
+ it "returns true" do
1461
+ expect(person.addresses.any?).to be true
1462
+ end
1463
+
1464
+ it "block form iterates across all documents" do
1465
+ expect(person.addresses.any? {|a| a.street == "Upper" }).to be false
1466
+ expect(person.addresses.any? {|a| a.street == "Bond" }).to be true
1467
+ end
1468
+
1469
+ context 'argument form' do
1470
+ it "behaves correctly when given a model instance" do
1471
+ expect(person.addresses.any?(person.addresses.first)).to be true
1472
+ end
1473
+
1474
+ it "behaves correctly when given a non-model instance" do
1475
+ expect(person.addresses.any?(1)).to be false
1476
+ end
1477
+ end
1478
+ end
1479
+
1480
+ context "when documents are not present" do
1481
+ it "returns false" do
1482
+ expect(person.addresses.any?).to be false
1483
+ end
1484
+
1485
+ it "block form iterates across all documents" do
1486
+ expect(person.addresses.any?(&:a)).to be false
1487
+ end
1488
+
1489
+ it "argument form is supported" do
1490
+ expect(person.addresses.any?(1)).to be false
1491
+ end
1492
+ end
1493
+ end
1494
+
1495
+ describe "#all?" do
1496
+
1497
+ let(:person) do
1498
+ Person.create!
1499
+ end
1500
+
1501
+ context "when documents are persisted" do
1502
+ before do
1503
+ person.addresses.create!(street: "Upper")
1504
+ end
1505
+
1506
+ it "returns true" do
1507
+ expect(person.addresses.all?).to be true
1508
+ end
1509
+
1510
+ it "block form iterates across all documents" do
1511
+ expect(person.addresses.all? {|a| a.street == "Upper" }).to be true
1512
+ expect(person.addresses.all? {|a| a.street == "Bond" }).to be false
1513
+ end
1514
+
1515
+ context 'argument form' do
1516
+ it "behaves correctly when given a model instance" do
1517
+ expect(person.addresses.all?(person.addresses.first)).to be true
1518
+ end
1519
+
1520
+ it "behaves correctly when given a non-model instance" do
1521
+ expect(person.addresses.all?(1)).to be false
1522
+ end
1523
+ end
1524
+ end
1525
+
1526
+ context "when documents are not persisted" do
1527
+ before do
1528
+ person.addresses.build(street: "Bond")
1529
+ end
1530
+
1531
+ it "returns true" do
1532
+ expect(person.addresses.all?).to be true
1533
+ end
1534
+
1535
+ it "block form iterates across all documents" do
1536
+ expect(person.addresses.all? {|a| a.street == "Upper" }).to be false
1537
+ expect(person.addresses.all? {|a| a.street == "Bond" }).to be true
1538
+ end
1539
+
1540
+ context 'argument form' do
1541
+ it "behaves correctly when given a model instance" do
1542
+ expect(person.addresses.all?(person.addresses.first)).to be true
1543
+ end
1544
+
1545
+ it "behaves correctly when given a non-model instance" do
1546
+ expect(person.addresses.all?(1)).to be false
1547
+ end
1548
+ end
1549
+ end
1550
+
1551
+ context "when documents are not present" do
1552
+ it "returns false" do
1553
+ expect(person.addresses.all?).to be true
1554
+ end
1555
+
1556
+ it "block form iterates across all documents" do
1557
+ expect(person.addresses.all?(&:foo)).to be true
1558
+ end
1559
+
1560
+ context 'argument form' do
1561
+ it "behaves correctly when given nil" do
1562
+ expect(person.addresses.all?(nil)).to be true
1563
+ end
1564
+
1565
+ it "behaves correctly when given a non-model instance" do
1566
+ expect(person.addresses.all?(1)).to be true
1567
+ end
1568
+ end
1569
+ end
1570
+ end
1571
+
1572
+ describe "#none?" do
1573
+
1574
+ let(:person) do
1575
+ Person.create!
1576
+ end
1577
+
1578
+ context "when documents are persisted" do
1579
+ before do
1580
+ person.addresses.create!(street: "Upper")
1581
+ end
1582
+
1583
+ it "returns true" do
1584
+ expect(person.addresses.none?).to be false
1585
+ end
1586
+
1587
+ it "block form iterates across all documents" do
1588
+ expect(person.addresses.none? {|a| a.street == "Upper" }).to be false
1589
+ expect(person.addresses.none? {|a| a.street == "Bond" }).to be true
1590
+ end
1591
+
1592
+ context 'argument form' do
1593
+ it "behaves correctly when given a model instance" do
1594
+ expect(person.addresses.none?(person.addresses.first)).to be false
1595
+ end
1596
+
1597
+ it "behaves correctly when given a non-model instance" do
1598
+ expect(person.addresses.none?(1)).to be true
1599
+ end
1600
+ end
1601
+ end
1602
+
1603
+ context "when documents are not persisted" do
1604
+ before do
1605
+ person.addresses.build(street: "Bond")
1606
+ end
1607
+
1608
+ it "returns true" do
1609
+ expect(person.addresses.none?).to be false
1610
+ end
1611
+
1612
+ it "block form iterates across all documents" do
1613
+ expect(person.addresses.none? {|a| a.street == "Upper" }).to be true
1614
+ expect(person.addresses.none? {|a| a.street == "Bond" }).to be false
1615
+ end
1616
+
1617
+ context 'argument form' do
1618
+ it "behaves correctly when given a model instance" do
1619
+ expect(person.addresses.none?(person.addresses.first)).to be false
1620
+ end
1621
+
1622
+ it "behaves correctly when given a non-model instance" do
1623
+ expect(person.addresses.none?(1)).to be true
1624
+ end
1625
+ end
1626
+ end
1627
+
1628
+ context "when documents are not present" do
1629
+ it "returns false" do
1630
+ expect(person.addresses.none?).to be true
1631
+ end
1632
+
1633
+ it "block form iterates across all documents" do
1634
+ expect(person.addresses.none?(&:a)).to be true
1635
+ end
1636
+
1637
+ context 'argument form' do
1638
+ it "behaves correctly when given nil" do
1639
+ expect(person.addresses.none?(nil)).to be true
1640
+ end
1641
+
1642
+ it "behaves correctly when given a non-model instance" do
1643
+ expect(person.addresses.none?(1)).to be true
1644
+ end
1645
+ end
1646
+ end
1400
1647
  end
1401
1648
 
1402
1649
  describe "#create" do
@@ -1404,11 +1651,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1404
1651
  context "when providing multiple attributes" do
1405
1652
 
1406
1653
  let(:person) do
1407
- Person.create
1654
+ Person.create!
1408
1655
  end
1409
1656
 
1410
1657
  let!(:addresses) do
1411
- person.addresses.create([{ street: "Bond" }, { street: "Upper" }])
1658
+ person.addresses.create!([{ street: "Bond" }, { street: "Upper" }])
1412
1659
  end
1413
1660
 
1414
1661
  it "creates multiple documents" do
@@ -1431,11 +1678,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1431
1678
  context "when the relation is not cyclic" do
1432
1679
 
1433
1680
  let(:person) do
1434
- Person.create
1681
+ Person.create!
1435
1682
  end
1436
1683
 
1437
1684
  let!(:address) do
1438
- person.addresses.create(street: "Bond") do |address|
1685
+ person.addresses.create!(street: "Bond") do |address|
1439
1686
  address.state = "CA"
1440
1687
  end
1441
1688
  end
@@ -1479,7 +1726,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1479
1726
  context "when embedding a multi word named document" do
1480
1727
 
1481
1728
  let!(:component) do
1482
- person.address_components.create(street: "Test")
1729
+ person.address_components.create!(street: "Test")
1483
1730
  end
1484
1731
 
1485
1732
  it "saves the embedded document" do
@@ -1491,11 +1738,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1491
1738
  context "when the relation is cyclic" do
1492
1739
 
1493
1740
  let!(:entry) do
1494
- Entry.create(title: "hi")
1741
+ Entry.create!(title: "hi")
1495
1742
  end
1496
1743
 
1497
1744
  let!(:child_entry) do
1498
- entry.child_entries.create(title: "hello")
1745
+ entry.child_entries.create!(title: "hello")
1499
1746
  end
1500
1747
 
1501
1748
  it "creates a new child" do
@@ -1507,7 +1754,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1507
1754
  describe "#create!" do
1508
1755
 
1509
1756
  let(:person) do
1510
- Person.create
1757
+ Person.create!
1511
1758
  end
1512
1759
 
1513
1760
  context "when providing multiple attributes" do
@@ -1666,7 +1913,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1666
1913
  describe "#delete_if" do
1667
1914
 
1668
1915
  let(:person) do
1669
- Person.create
1916
+ Person.create!
1670
1917
  end
1671
1918
 
1672
1919
  context "when the documents are new" do
@@ -1715,11 +1962,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1715
1962
  context "when the documents persisted" do
1716
1963
 
1717
1964
  let!(:address_one) do
1718
- person.addresses.create(street: "Bond")
1965
+ person.addresses.create!(street: "Bond")
1719
1966
  end
1720
1967
 
1721
1968
  let!(:address_two) do
1722
- person.addresses.create(street: "Upper")
1969
+ person.addresses.create!(street: "Upper")
1723
1970
  end
1724
1971
 
1725
1972
  context "when a block is provided" do
@@ -1774,7 +2021,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1774
2021
  describe "##{method}" do
1775
2022
 
1776
2023
  let(:person) do
1777
- Person.create
2024
+ Person.create!
1778
2025
  end
1779
2026
 
1780
2027
  context "when the documents are new" do
@@ -1828,11 +2075,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1828
2075
  context "when the documents persisted" do
1829
2076
 
1830
2077
  let!(:address_one) do
1831
- person.addresses.create(street: "Bond")
2078
+ person.addresses.create!(street: "Bond")
1832
2079
  end
1833
2080
 
1834
2081
  let!(:address_two) do
1835
- person.addresses.create(street: "Upper")
2082
+ person.addresses.create!(street: "Upper")
1836
2083
  end
1837
2084
 
1838
2085
  context "when conditions are provided" do
@@ -1879,7 +2126,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1879
2126
  context "when removing and resaving" do
1880
2127
 
1881
2128
  let(:owner) do
1882
- PetOwner.create(title: "AKC")
2129
+ PetOwner.create!(title: "AKC")
1883
2130
  end
1884
2131
 
1885
2132
  before do
@@ -1975,13 +2222,13 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1975
2222
  describe "#exists?" do
1976
2223
 
1977
2224
  let!(:person) do
1978
- Person.create
2225
+ Person.create!
1979
2226
  end
1980
2227
 
1981
2228
  context "when documents exist in the database" do
1982
2229
 
1983
2230
  before do
1984
- person.addresses.create(street: "Bond St")
2231
+ person.addresses.create!(street: "Bond St")
1985
2232
  end
1986
2233
 
1987
2234
  it "returns true" do
@@ -2112,12 +2359,50 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2112
2359
  end
2113
2360
  end
2114
2361
  end
2362
+
2363
+ context "with block" do
2364
+ let!(:author) do
2365
+ Person.create!(title: 'Person')
2366
+ end
2367
+
2368
+ let!(:video_one) do
2369
+ author.videos.create!(title: 'video one')
2370
+ end
2371
+
2372
+ let!(:video_two) do
2373
+ author.videos.create!(title: 'video two')
2374
+ end
2375
+
2376
+ it "finds one" do
2377
+ expect(
2378
+ author.videos.find do |video|
2379
+ video.title == 'video one'
2380
+ end
2381
+ ).to eq(video_one)
2382
+ end
2383
+
2384
+ it "returns first match of multiple" do
2385
+ expect(
2386
+ author.videos.find do |video|
2387
+ ['video one', 'video two'].include?(video.title)
2388
+ end
2389
+ ).to be_a(Video)
2390
+ end
2391
+
2392
+ it "returns nil when not found" do
2393
+ expect(
2394
+ author.videos.find do |video|
2395
+ video.title == 'non exiting one'
2396
+ end
2397
+ ).to be_nil
2398
+ end
2399
+ end
2115
2400
  end
2116
2401
 
2117
2402
  describe "#find_or_create_by" do
2118
2403
 
2119
2404
  let(:person) do
2120
- Person.create
2405
+ Person.create!
2121
2406
  end
2122
2407
 
2123
2408
  let!(:address) do
@@ -2160,11 +2445,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2160
2445
  # context "when the child belongs to another document" do
2161
2446
  #
2162
2447
  # let(:product) do
2163
- # Product.create
2448
+ # Product.create!
2164
2449
  # end
2165
2450
  #
2166
2451
  # let(:purchase) do
2167
- # Purchase.create
2452
+ # Purchase.create!
2168
2453
  # end
2169
2454
  #
2170
2455
  # let(:line_item) do
@@ -2183,7 +2468,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2183
2468
  describe "#find_or_create_by!" do
2184
2469
 
2185
2470
  let(:person) do
2186
- Person.create
2471
+ Person.create!
2187
2472
  end
2188
2473
 
2189
2474
  let!(:address) do
@@ -2235,11 +2520,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2235
2520
  # context "when the child belongs to another document" do
2236
2521
  #
2237
2522
  # let(:product) do
2238
- # Product.create
2523
+ # Product.create!
2239
2524
  # end
2240
2525
  #
2241
2526
  # let(:purchase) do
2242
- # Purchase.create
2527
+ # Purchase.create!
2243
2528
  # end
2244
2529
  #
2245
2530
  # let(:line_item) do
@@ -2357,11 +2642,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2357
2642
  describe "#method_missing" do
2358
2643
 
2359
2644
  let!(:person) do
2360
- Person.create
2645
+ Person.create!
2361
2646
  end
2362
2647
 
2363
2648
  let!(:address_one) do
2364
- person.addresses.create(
2649
+ person.addresses.create!(
2365
2650
  street: "Market",
2366
2651
  state: "CA",
2367
2652
  services: [ "1", "2" ]
@@ -2369,7 +2654,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2369
2654
  end
2370
2655
 
2371
2656
  let!(:address_two) do
2372
- person.addresses.create(
2657
+ person.addresses.create!(
2373
2658
  street: "Madison",
2374
2659
  state: "NY",
2375
2660
  services: [ "1", "2" ]
@@ -2413,13 +2698,26 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2413
2698
  end
2414
2699
 
2415
2700
  context "when providing a criteria class method" do
2701
+ context "without keyword arguments" do
2416
2702
 
2417
- let(:addresses) do
2418
- person.addresses.california
2703
+ let(:addresses) do
2704
+ person.addresses.california
2705
+ end
2706
+
2707
+ it "applies the criteria to the documents" do
2708
+ expect(addresses).to eq([ address_one ])
2709
+ end
2419
2710
  end
2420
2711
 
2421
- it "applies the criteria to the documents" do
2422
- expect(addresses).to eq([ address_one ])
2712
+ context "with keyword arguments" do
2713
+
2714
+ let(:addresses) do
2715
+ person.addresses.city_and_state(city: "Sacramento", state: "CA")
2716
+ end
2717
+
2718
+ it "applies the criteria to the documents" do
2719
+ expect(addresses).to eq([])
2720
+ end
2423
2721
  end
2424
2722
  end
2425
2723
 
@@ -2504,17 +2802,17 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2504
2802
  describe "#pop" do
2505
2803
 
2506
2804
  let(:person) do
2507
- Person.create
2805
+ Person.create!
2508
2806
  end
2509
2807
 
2510
2808
  context "when no argument is provided" do
2511
2809
 
2512
2810
  let!(:address_one) do
2513
- person.addresses.create(street: "sonnenallee")
2811
+ person.addresses.create!(street: "sonnenallee")
2514
2812
  end
2515
2813
 
2516
2814
  let!(:address_two) do
2517
- person.addresses.create(street: "hermannstr")
2815
+ person.addresses.create!(street: "hermannstr")
2518
2816
  end
2519
2817
 
2520
2818
  let!(:popped) do
@@ -2537,11 +2835,30 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2537
2835
  context "when an integer is provided" do
2538
2836
 
2539
2837
  let!(:address_one) do
2540
- person.addresses.create(street: "sonnenallee")
2838
+ person.addresses.create!(street: "sonnenallee")
2541
2839
  end
2542
2840
 
2543
2841
  let!(:address_two) do
2544
- person.addresses.create(street: "hermannstr")
2842
+ person.addresses.create!(street: "hermannstr")
2843
+ end
2844
+
2845
+ context "when the number is zero" do
2846
+
2847
+ let!(:popped) do
2848
+ person.addresses.pop(0)
2849
+ end
2850
+
2851
+ it "returns an empty array" do
2852
+ expect(popped).to eq([])
2853
+ end
2854
+
2855
+ it "does not remove the document from the relation" do
2856
+ expect(person.addresses).to eq([ address_one, address_two ])
2857
+ end
2858
+
2859
+ it "does not persist the pop" do
2860
+ expect(person.reload.addresses).to eq([ address_one, address_two ])
2861
+ end
2545
2862
  end
2546
2863
 
2547
2864
  context "when the number is not larger than the relation" do
@@ -2601,6 +2918,125 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2601
2918
  end
2602
2919
  end
2603
2920
 
2921
+ describe "#shift" do
2922
+
2923
+ let(:person) do
2924
+ Person.create!
2925
+ end
2926
+
2927
+ context "when no argument is provided" do
2928
+
2929
+ let!(:address_one) do
2930
+ person.addresses.create!(street: "sonnenallee")
2931
+ end
2932
+
2933
+ let!(:address_two) do
2934
+ person.addresses.create!(street: "hermannstr")
2935
+ end
2936
+
2937
+ let!(:shifted) do
2938
+ person.addresses.shift
2939
+ end
2940
+
2941
+ it "returns the shifted document" do
2942
+ expect(shifted).to eq(address_one)
2943
+ end
2944
+
2945
+ it "removes the document from the relation" do
2946
+ expect(person.addresses).to eq([ address_two ])
2947
+ end
2948
+
2949
+ it "persists the shift" do
2950
+ expect(person.reload.addresses).to eq([ address_two ])
2951
+ end
2952
+ end
2953
+
2954
+ context "when an integer is provided" do
2955
+
2956
+ let!(:address_one) do
2957
+ person.addresses.create!(street: "sonnenallee")
2958
+ end
2959
+
2960
+ let!(:address_two) do
2961
+ person.addresses.create!(street: "hermannstr")
2962
+ end
2963
+
2964
+ context "when the number is zero" do
2965
+
2966
+ let!(:shifted) do
2967
+ person.addresses.shift(0)
2968
+ end
2969
+
2970
+ it "returns an empty array" do
2971
+ expect(shifted).to eq([])
2972
+ end
2973
+
2974
+ it "does not remove the document from the relation" do
2975
+ expect(person.addresses).to eq([ address_one, address_two ])
2976
+ end
2977
+
2978
+ it "does not persist the shift" do
2979
+ expect(person.reload.addresses).to eq([ address_one, address_two ])
2980
+ end
2981
+ end
2982
+
2983
+ context "when the number is not larger than the relation" do
2984
+
2985
+ let!(:shifted) do
2986
+ person.addresses.shift(2)
2987
+ end
2988
+
2989
+ it "returns the shifted documents" do
2990
+ expect(shifted).to eq([ address_one, address_two ])
2991
+ end
2992
+
2993
+ it "removes the document from the relation" do
2994
+ expect(person.addresses).to be_empty
2995
+ end
2996
+
2997
+ it "persists the shift" do
2998
+ expect(person.reload.addresses).to be_empty
2999
+ end
3000
+ end
3001
+
3002
+ context "when the number is larger than the relation" do
3003
+
3004
+ let!(:shifted) do
3005
+ person.addresses.shift(4)
3006
+ end
3007
+
3008
+ it "returns the shifted documents" do
3009
+ expect(shifted).to eq([ address_one, address_two ])
3010
+ end
3011
+
3012
+ it "removes the document from the relation" do
3013
+ expect(person.addresses).to be_empty
3014
+ end
3015
+
3016
+ it "persists the shift" do
3017
+ expect(person.reload.addresses).to be_empty
3018
+ end
3019
+ end
3020
+ end
3021
+
3022
+ context "when the relation is empty" do
3023
+
3024
+ context "when providing no number" do
3025
+
3026
+ it "returns nil" do
3027
+ expect(person.addresses.shift).to be_nil
3028
+ end
3029
+ end
3030
+
3031
+ context "when providing a number" do
3032
+
3033
+ it "returns nil" do
3034
+ expect(person.addresses.shift(2)).to be_nil
3035
+ end
3036
+ end
3037
+ end
3038
+ end
3039
+
2604
3040
  describe "#scoped" do
2605
3041
 
2606
3042
  let(:person) do
@@ -2670,11 +3106,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2670
3106
  describe "##{method}" do
2671
3107
 
2672
3108
  let(:person) do
2673
- Person.create
3109
+ Person.create!
2674
3110
  end
2675
3111
 
2676
3112
  before do
2677
- person.addresses.create(street: "Upper")
3113
+ person.addresses.create!(street: "Upper")
2678
3114
  person.addresses.build(street: "Bond")
2679
3115
  end
2680
3116
 
@@ -2712,7 +3148,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2712
3148
  context "when there are no documents present" do
2713
3149
 
2714
3150
  let(:person) do
2715
- Person.create
3151
+ Person.create!
2716
3152
  end
2717
3153
 
2718
3154
  it "updates nothing" do
@@ -2723,11 +3159,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2723
3159
  context "when documents are present" do
2724
3160
 
2725
3161
  let(:person) do
2726
- Person.create
3162
+ Person.create!
2727
3163
  end
2728
3164
 
2729
3165
  let!(:address) do
2730
- person.addresses.create(street: "Hobrecht", number: 27)
3166
+ person.addresses.create!(street: "Hobrecht", number: 27)
2731
3167
  end
2732
3168
 
2733
3169
  context "when updating with a where clause" do
@@ -2762,16 +3198,16 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2762
3198
  context "when updating the bottom level" do
2763
3199
 
2764
3200
  let!(:person) do
2765
- Person.create
3201
+ Person.create!
2766
3202
  end
2767
3203
 
2768
3204
  let!(:address) do
2769
- person.addresses.create(street: "Joachimstr")
3205
+ person.addresses.create!(street: "Joachimstr")
2770
3206
  end
2771
3207
 
2772
3208
  let!(:location) do
2773
- address.locations.create(name: "vacation", number: 0)
2774
- address.locations.create(name: "work", number: 3)
3209
+ address.locations.create!(name: "vacation", number: 0)
3210
+ address.locations.create!(name: "work", number: 3)
2775
3211
  end
2776
3212
 
2777
3213
  context "when updating with replacement of embedded array" do
@@ -2779,7 +3215,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2779
3215
  context "when updating with a hash" do
2780
3216
 
2781
3217
  before do
2782
- address.update_attributes(locations: [{ name: "home" }])
3218
+ address.update_attributes!(locations: [{ name: "home" }])
2783
3219
  end
2784
3220
 
2785
3221
  it "updates the attributes" do
@@ -2800,7 +3236,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2800
3236
 
2801
3237
  before do
2802
3238
  location.number = 7
2803
- location.save
3239
+ location.save!
2804
3240
  end
2805
3241
 
2806
3242
  let(:updated_location_number) do
@@ -2933,7 +3369,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2933
3369
  context "when creating a persisted tree" do
2934
3370
 
2935
3371
  let(:quiz) do
2936
- Quiz.create
3372
+ Quiz.create!
2937
3373
  end
2938
3374
 
2939
3375
  let(:page) do
@@ -2998,7 +3434,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2998
3434
  context "when saving the root" do
2999
3435
 
3000
3436
  before do
3001
- person.save
3437
+ person.save!
3002
3438
  end
3003
3439
 
3004
3440
  it "persists the first level document" do
@@ -3152,11 +3588,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3152
3588
  context "when accessing the parent in a destroy callback" do
3153
3589
 
3154
3590
  let!(:league) do
3155
- League.create
3591
+ League.create!
3156
3592
  end
3157
3593
 
3158
3594
  let!(:division) do
3159
- league.divisions.create
3595
+ league.divisions.create!
3160
3596
  end
3161
3597
 
3162
3598
  before do
@@ -3171,15 +3607,15 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3171
3607
  context "when updating the parent with all attributes" do
3172
3608
 
3173
3609
  let!(:person) do
3174
- Person.create
3610
+ Person.create!
3175
3611
  end
3176
3612
 
3177
3613
  let!(:address) do
3178
- person.addresses.create
3614
+ person.addresses.create!
3179
3615
  end
3180
3616
 
3181
3617
  before do
3182
- person.update_attributes(person.attributes)
3618
+ person.update_attributes!(person.attributes)
3183
3619
  end
3184
3620
 
3185
3621
  it "does not duplicate the embedded documents" do
@@ -3194,13 +3630,13 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3194
3630
  context "when embedding children named versions" do
3195
3631
 
3196
3632
  let(:acolyte) do
3197
- Acolyte.create(name: "test")
3633
+ Acolyte.create!(name: "test")
3198
3634
  end
3199
3635
 
3200
3636
  context "when creating a child" do
3201
3637
 
3202
3638
  let(:version) do
3203
- acolyte.versions.create(number: 1)
3639
+ acolyte.versions.create!(number: 1)
3204
3640
  end
3205
3641
 
3206
3642
  it "allows the operation" do
@@ -3225,7 +3661,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3225
3661
  let!(:account) do
3226
3662
  Account.new(name: "Testing").tap do |acct|
3227
3663
  acct.memberships.build
3228
- acct.save
3664
+ acct.save!
3229
3665
  end
3230
3666
  end
3231
3667
 
@@ -3237,10 +3673,10 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3237
3673
 
3238
3674
  before do
3239
3675
  account.name = ""
3240
- account.save
3241
3676
  end
3242
3677
 
3243
3678
  it "does not lose the parent reference" do
3679
+ expect(account.save).to eq false
3244
3680
  expect(from_db.memberships.first.account).to eq(account)
3245
3681
  end
3246
3682
  end
@@ -3260,15 +3696,15 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3260
3696
  context "when moving an embedded document from one parent to another" do
3261
3697
 
3262
3698
  let!(:person_one) do
3263
- Person.create
3699
+ Person.create!
3264
3700
  end
3265
3701
 
3266
3702
  let!(:person_two) do
3267
- Person.create
3703
+ Person.create!
3268
3704
  end
3269
3705
 
3270
3706
  let!(:address) do
3271
- person_one.addresses.create(street: "Kudamm")
3707
+ person_one.addresses.create!(street: "Kudamm")
3272
3708
  end
3273
3709
 
3274
3710
  before do
@@ -3303,7 +3739,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3303
3739
  context "when the relation has a default scope" do
3304
3740
 
3305
3741
  let!(:person) do
3306
- Person.create
3742
+ Person.create!
3307
3743
  end
3308
3744
 
3309
3745
  context "when the default scope is a sort" do
@@ -3373,7 +3809,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3373
3809
  context "when indexing the documents" do
3374
3810
 
3375
3811
  let!(:person) do
3376
- Person.create
3812
+ Person.create!
3377
3813
  end
3378
3814
 
3379
3815
  context "when the documents have a limiting default scope" do
@@ -3422,18 +3858,18 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3422
3858
  context "when the embedded document has an array field" do
3423
3859
 
3424
3860
  let!(:person) do
3425
- Person.create
3861
+ Person.create!
3426
3862
  end
3427
3863
 
3428
3864
  let!(:video) do
3429
- person.videos.create
3865
+ person.videos.create!
3430
3866
  end
3431
3867
 
3432
3868
  context "when saving the array on a persisted document" do
3433
3869
 
3434
3870
  before do
3435
3871
  video.genres = [ "horror", "scifi" ]
3436
- video.save
3872
+ video.save!
3437
3873
  end
3438
3874
 
3439
3875
  it "sets the value" do
@@ -3458,7 +3894,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3458
3894
 
3459
3895
  before do
3460
3896
  loaded_video.genres = [ "comedy" ]
3461
- loaded_video.save
3897
+ loaded_video.save!
3462
3898
  end
3463
3899
 
3464
3900
  it "sets the new value" do
@@ -3476,15 +3912,15 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3476
3912
  context "when destroying an embedded document" do
3477
3913
 
3478
3914
  let(:person) do
3479
- Person.create
3915
+ Person.create!
3480
3916
  end
3481
3917
 
3482
3918
  let!(:address_one) do
3483
- person.addresses.create(street: "hobrecht")
3919
+ person.addresses.create!(street: "hobrecht")
3484
3920
  end
3485
3921
 
3486
3922
  let!(:address_two) do
3487
- person.addresses.create(street: "maybachufer")
3923
+ person.addresses.create!(street: "maybachufer")
3488
3924
  end
3489
3925
 
3490
3926
  before do
@@ -3556,7 +3992,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3556
3992
  context "when the association has an order defined" do
3557
3993
 
3558
3994
  let(:person) do
3559
- Person.create
3995
+ Person.create!
3560
3996
  end
3561
3997
 
3562
3998
  let(:message_one) do
@@ -3587,11 +4023,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3587
4023
 
3588
4024
  before do
3589
4025
  person.aliases = [ { name: "A", priority: 3 }, { name: "B", priority: 4 }]
3590
- person.save
4026
+ person.save!
3591
4027
  end
3592
4028
 
3593
4029
  let!(:person2) do
3594
- Person.create( aliases: [ { name: "C", priority: 1 }, { name: "D", priority: 2 }])
4030
+ Person.create!( aliases: [ { name: "C", priority: 1 }, { name: "D", priority: 2 }])
3595
4031
  end
3596
4032
 
3597
4033
  it "allows ordering on a key of an embedded document" do
@@ -3626,7 +4062,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3626
4062
  context "when updating multiple levels in one update" do
3627
4063
 
3628
4064
  let!(:person) do
3629
- Person.create(
4065
+ Person.create!(
3630
4066
  addresses: [
3631
4067
  { locations: [{ name: "home" }]}
3632
4068
  ]
@@ -3640,7 +4076,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3640
4076
  end
3641
4077
 
3642
4078
  before do
3643
- from_db.update_attributes(
4079
+ from_db.update_attributes!(
3644
4080
  addresses: [
3645
4081
  { locations: [{ name: "work" }]}
3646
4082
  ]
@@ -3660,15 +4096,15 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3660
4096
  context "when the embedded relation sorts on a boolean" do
3661
4097
 
3662
4098
  let(:circuit) do
3663
- Circuit.create
4099
+ Circuit.create!
3664
4100
  end
3665
4101
 
3666
4102
  let!(:bus_one) do
3667
- circuit.buses.create(saturday: true)
4103
+ circuit.buses.create!(saturday: true)
3668
4104
  end
3669
4105
 
3670
4106
  let!(:bus_two) do
3671
- circuit.buses.create(saturday: false)
4107
+ circuit.buses.create!(saturday: false)
3672
4108
  end
3673
4109
 
3674
4110
  it "orders properly with the boolean" do
@@ -3679,7 +4115,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3679
4115
  context "when batch replacing multiple relations in a single update" do
3680
4116
 
3681
4117
  let(:document) do
3682
- Person.create
4118
+ Person.create!
3683
4119
  end
3684
4120
 
3685
4121
  let(:person) do
@@ -3687,23 +4123,23 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3687
4123
  end
3688
4124
 
3689
4125
  let!(:symptom_one) do
3690
- person.symptoms.create
4126
+ person.symptoms.create!
3691
4127
  end
3692
4128
 
3693
4129
  let!(:symptom_two) do
3694
- person.symptoms.create
4130
+ person.symptoms.create!
3695
4131
  end
3696
4132
 
3697
4133
  let!(:appointment_one) do
3698
- person.appointments.create
4134
+ person.appointments.create!
3699
4135
  end
3700
4136
 
3701
4137
  let!(:appointment_two) do
3702
- person.appointments.create
4138
+ person.appointments.create!
3703
4139
  end
3704
4140
 
3705
4141
  before do
3706
- person.update_attributes(
4142
+ person.update_attributes!(
3707
4143
  appointments: [ appointment_one.as_document, appointment_two.as_document ],
3708
4144
  symptoms: [ symptom_one.as_document, symptom_two.as_document ]
3709
4145
  )
@@ -3788,7 +4224,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3788
4224
  end
3789
4225
  end
3790
4226
 
3791
- context "#delete or #clear with before_remove callback" do
4227
+ context "#delete, or #clear, or #pop, or #shift with before_remove callback" do
3792
4228
 
3793
4229
  let(:artist) do
3794
4230
  Artist.new
@@ -3834,35 +4270,81 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3834
4270
  end
3835
4271
  end
3836
4272
 
3837
- context "when errors are raised" do
4273
+ describe "#pop" do
3838
4274
 
3839
4275
  before do
3840
- expect(artist).to receive(:before_remove_song).and_raise
4276
+ artist.songs.pop
3841
4277
  end
3842
4278
 
3843
- describe "#delete" do
4279
+ it "executes the callback" do
4280
+ artist.songs.pop
4281
+ expect(artist.before_remove_embedded_called).to be true
4282
+ end
4283
+ end
3844
4284
 
3845
- it "does not remove the document from the relation" do
3846
- begin; artist.songs.delete(song); rescue; end
3847
- expect(artist.songs).to eq([ song ])
3848
- end
4285
+ describe "#shift" do
4286
+
4287
+ before do
4288
+ artist.songs.shift
3849
4289
  end
3850
4290
 
3851
- describe "#clear" do
4291
+ it "executes the callback" do
4292
+ artist.songs.shift
4293
+ expect(artist.before_remove_embedded_called).to be true
4294
+ end
4295
+ end
4296
+ end
3852
4297
 
3853
- before do
3854
- begin; artist.songs.clear; rescue; end
3855
- end
4298
+ context "when errors are raised" do
3856
4299
 
3857
- it "removes the documents from the relation" do
3858
- expect(artist.songs).to eq([ song ])
3859
- end
4300
+ before do
4301
+ expect(artist).to receive(:before_remove_song).and_raise
4302
+ end
4303
+
4304
+ describe "#delete" do
4305
+
4306
+ it "does not remove the document from the relation" do
4307
+ begin; artist.songs.delete(song); rescue; end
4308
+ expect(artist.songs).to eq([ song ])
4309
+ end
4310
+ end
4311
+
4312
+ describe "#clear" do
4313
+
4314
+ before do
4315
+ begin; artist.songs.clear; rescue; end
4316
+ end
4317
+
4318
+ it "removes the documents from the relation" do
4319
+ expect(artist.songs).to eq([ song ])
4320
+ end
4321
+ end
4322
+
4323
+ describe "#pop" do
4324
+
4325
+ before do
4326
+ begin; artist.songs.pop; rescue; end
4327
+ end
4328
+
4329
+ it "should remove from collection" do
4330
+ expect(artist.songs).to eq([ song ])
4331
+ end
4332
+ end
4333
+
4334
+ describe "#shift" do
4335
+
4336
+ before do
4337
+ begin; artist.songs.shift; rescue; end
4338
+ end
4339
+
4340
+ it "should remove from collection" do
4341
+ expect(artist.songs).to eq([ song ])
3860
4342
  end
3861
4343
  end
3862
4344
  end
3863
4345
  end
3864
4346
 
3865
- context "#delete or #clear with after_remove callback" do
4347
+ context "#delete, or #clear, or #pop, or #shift with after_remove callback" do
3866
4348
 
3867
4349
  let(:artist) do
3868
4350
  Artist.new
@@ -3899,6 +4381,30 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3899
4381
  expect(artist.after_remove_embedded_called).to be true
3900
4382
  end
3901
4383
  end
4384
+
4385
+ describe "#pop" do
4386
+
4387
+ before do
4388
+ artist.labels.pop
4389
+ end
4390
+
4391
+ it "executes the callback" do
4392
+ artist.labels.pop
4393
+ expect(artist.after_remove_embedded_called).to be true
4394
+ end
4395
+ end
4396
+
4397
+ describe "#shift" do
4398
+
4399
+ before do
4400
+ artist.labels.shift
4401
+ end
4402
+
4403
+ it "executes the callback" do
4404
+ artist.labels.shift
4405
+ expect(artist.after_remove_embedded_called).to be true
4406
+ end
4407
+ end
3902
4408
  end
3903
4409
 
3904
4410
  context "when errors are raised" do
@@ -3928,6 +4434,28 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3928
4434
  expect(artist.labels).to be_empty
3929
4435
  end
3930
4436
  end
4437
+
4438
+ describe "#pop" do
4439
+
4440
+ before do
4441
+ begin; artist.labels.pop; rescue; end
4442
+ end
4443
+
4444
+ it "should remove from collection" do
4445
+ expect(artist.labels).to be_empty
4446
+ end
4447
+ end
4448
+
4449
+ describe "#shift" do
4450
+
4451
+ before do
4452
+ begin; artist.labels.shift; rescue; end
4453
+ end
4454
+
4455
+ it "should remove from collection" do
4456
+ expect(artist.labels).to be_empty
4457
+ end
4458
+ end
3931
4459
  end
3932
4460
  end
3933
4461
 
@@ -3944,7 +4472,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3944
4472
  context "when the parent has an after create callback" do
3945
4473
 
3946
4474
  before do
3947
- server.save
4475
+ server.save!
3948
4476
  end
3949
4477
 
3950
4478
  it "does not push the embedded documents twice" do
@@ -3956,7 +4484,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3956
4484
  context "when embedded documents are stored without ids" do
3957
4485
 
3958
4486
  let!(:band) do
3959
- Band.create(name: "Moderat")
4487
+ Band.create!(name: "Moderat")
3960
4488
  end
3961
4489
 
3962
4490
  before do
@@ -4006,7 +4534,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
4006
4534
  company = Company.new
4007
4535
  4.times { |i| company.staffs << Staff.new(age: 50 + i)}
4008
4536
  2.times { |i| company.staffs << Staff.new(age: 40)}
4009
- company.save
4537
+ company.save!
4010
4538
  company.staffs.delete_if {|x| x.age >= 50}
4011
4539
  expect(company.staffs.count).to eq(2)
4012
4540
  end
@@ -4083,7 +4611,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
4083
4611
  context "when the parent is persisted" do
4084
4612
 
4085
4613
  let(:zone) do
4086
- DNS::Zone.create
4614
+ DNS::Zone.create!
4087
4615
  end
4088
4616
 
4089
4617
  let(:soa_1) do