mongoid 7.1.5 → 7.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (461) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/README.md +9 -2
  5. data/Rakefile +33 -7
  6. data/lib/config/locales/en.yml +37 -1
  7. data/lib/mongoid.rb +23 -0
  8. data/lib/mongoid/association/depending.rb +1 -6
  9. data/lib/mongoid/association/many.rb +3 -3
  10. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  11. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +1 -1
  12. data/lib/mongoid/association/referenced/has_many/enumerable.rb +36 -1
  13. data/lib/mongoid/association/referenced/has_many/proxy.rb +8 -1
  14. data/lib/mongoid/association/referenced/has_one/buildable.rb +9 -1
  15. data/lib/mongoid/association/referenced/has_one/proxy.rb +6 -1
  16. data/lib/mongoid/atomic/modifiers.rb +1 -1
  17. data/lib/mongoid/attributes/dynamic.rb +1 -1
  18. data/lib/mongoid/clients/factory.rb +17 -0
  19. data/lib/mongoid/composable.rb +1 -0
  20. data/lib/mongoid/config.rb +3 -0
  21. data/lib/mongoid/contextual/mongo.rb +23 -4
  22. data/lib/mongoid/copyable.rb +7 -3
  23. data/lib/mongoid/criteria.rb +57 -7
  24. data/lib/mongoid/criteria/queryable/key.rb +1 -1
  25. data/lib/mongoid/criteria/queryable/mergeable.rb +2 -2
  26. data/lib/mongoid/criteria/queryable/selectable.rb +21 -6
  27. data/lib/mongoid/criteria/queryable/selector.rb +3 -7
  28. data/lib/mongoid/criteria/queryable/storable.rb +3 -3
  29. data/lib/mongoid/document.rb +18 -5
  30. data/lib/mongoid/errors.rb +7 -0
  31. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +25 -0
  32. data/lib/mongoid/errors/invalid_elem_match_operator.rb +33 -0
  33. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +26 -0
  34. data/lib/mongoid/errors/invalid_expression_operator.rb +28 -0
  35. data/lib/mongoid/errors/invalid_field_operator.rb +33 -0
  36. data/lib/mongoid/errors/invalid_query.rb +41 -0
  37. data/lib/mongoid/extensions.rb +1 -0
  38. data/lib/mongoid/factory.rb +27 -10
  39. data/lib/mongoid/fields.rb +3 -0
  40. data/lib/mongoid/fields/validators/macro.rb +22 -9
  41. data/lib/mongoid/findable.rb +50 -14
  42. data/lib/mongoid/indexable.rb +2 -2
  43. data/lib/mongoid/interceptable.rb +3 -1
  44. data/lib/mongoid/matchable.rb +1 -149
  45. data/lib/mongoid/matcher.rb +127 -0
  46. data/lib/mongoid/matcher/all.rb +22 -0
  47. data/lib/mongoid/matcher/and.rb +21 -0
  48. data/lib/mongoid/matcher/elem_match.rb +35 -0
  49. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  50. data/lib/mongoid/matcher/eq.rb +11 -0
  51. data/lib/mongoid/matcher/eq_impl.rb +32 -0
  52. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +21 -0
  53. data/lib/mongoid/matcher/exists.rb +15 -0
  54. data/lib/mongoid/matcher/expression.rb +40 -0
  55. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  56. data/lib/mongoid/matcher/field_expression.rb +63 -0
  57. data/lib/mongoid/matcher/field_operator.rb +48 -0
  58. data/lib/mongoid/matcher/gt.rb +17 -0
  59. data/lib/mongoid/matcher/gte.rb +17 -0
  60. data/lib/mongoid/matcher/in.rb +25 -0
  61. data/lib/mongoid/matcher/lt.rb +17 -0
  62. data/lib/mongoid/matcher/lte.rb +17 -0
  63. data/lib/mongoid/matcher/ne.rb +16 -0
  64. data/lib/mongoid/matcher/nin.rb +11 -0
  65. data/lib/mongoid/matcher/nor.rb +25 -0
  66. data/lib/mongoid/matcher/not.rb +29 -0
  67. data/lib/mongoid/matcher/or.rb +21 -0
  68. data/lib/mongoid/matcher/regex.rb +41 -0
  69. data/lib/mongoid/matcher/size.rb +26 -0
  70. data/lib/mongoid/persistable/deletable.rb +1 -1
  71. data/lib/mongoid/query_cache.rb +64 -62
  72. data/lib/mongoid/reloadable.rb +2 -2
  73. data/lib/mongoid/serializable.rb +1 -1
  74. data/lib/mongoid/stringified_symbol.rb +53 -0
  75. data/lib/mongoid/traversable.rb +111 -4
  76. data/lib/mongoid/version.rb +1 -1
  77. data/spec/README.md +19 -4
  78. data/spec/integration/app_spec.rb +46 -13
  79. data/spec/integration/associations/embedded_spec.rb +94 -0
  80. data/spec/integration/associations/embeds_many_spec.rb +24 -0
  81. data/spec/integration/associations/embeds_one_spec.rb +24 -0
  82. data/spec/integration/associations/has_many_spec.rb +108 -13
  83. data/spec/integration/associations/has_one_spec.rb +108 -13
  84. data/spec/integration/associations/nested_attributes_assignment_spec.rb +116 -0
  85. data/spec/integration/atomic/modifiers_spec.rb +117 -0
  86. data/spec/integration/callbacks_models.rb +49 -0
  87. data/spec/integration/callbacks_spec.rb +216 -0
  88. data/spec/integration/discriminator_key_spec.rb +354 -0
  89. data/spec/integration/discriminator_value_spec.rb +207 -0
  90. data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +120 -41
  91. data/spec/integration/matcher_operator_data/all.yml +140 -0
  92. data/spec/integration/matcher_operator_data/and.yml +93 -0
  93. data/spec/integration/matcher_operator_data/elem_match.yml +363 -0
  94. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  95. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  96. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  97. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  98. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  99. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  100. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  101. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  102. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  103. data/spec/integration/matcher_operator_data/implicit_traversal.yml +16 -0
  104. data/spec/integration/matcher_operator_data/in.yml +194 -0
  105. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  106. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  107. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  108. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  109. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  110. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  111. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  112. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  113. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  114. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  115. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  116. data/spec/integration/matcher_operator_data/not.yml +196 -0
  117. data/spec/integration/matcher_operator_data/or.yml +137 -0
  118. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  119. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  120. data/spec/integration/matcher_operator_data/size.yml +174 -0
  121. data/spec/integration/matcher_operator_spec.rb +100 -0
  122. data/spec/integration/matcher_spec.rb +189 -0
  123. data/spec/integration/server_query_spec.rb +142 -0
  124. data/spec/integration/stringified_symbol_field_spec.rb +190 -0
  125. data/spec/lite_spec_helper.rb +4 -3
  126. data/spec/mongoid/association/depending_spec.rb +78 -26
  127. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +50 -0
  128. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +33 -0
  129. data/spec/mongoid/association/embedded/embeds_many_models.rb +1 -0
  130. data/spec/mongoid/association/embedded/embeds_one_models.rb +1 -0
  131. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +460 -186
  132. data/spec/mongoid/association/referenced/has_many_models.rb +21 -0
  133. data/spec/mongoid/association/referenced/has_one_models.rb +21 -0
  134. data/spec/mongoid/association/referenced/has_one_spec.rb +1 -1
  135. data/spec/mongoid/atomic/modifiers_spec.rb +47 -0
  136. data/spec/mongoid/atomic/paths_spec.rb +41 -0
  137. data/spec/mongoid/atomic_spec.rb +23 -0
  138. data/spec/mongoid/attributes/nested_spec.rb +1 -1
  139. data/spec/mongoid/clients/factory_spec.rb +37 -0
  140. data/spec/mongoid/clients/sessions_spec.rb +1 -6
  141. data/spec/mongoid/config_spec.rb +28 -0
  142. data/spec/mongoid/contextual/mongo_spec.rb +70 -16
  143. data/spec/mongoid/copyable_spec.rb +197 -18
  144. data/spec/mongoid/copyable_spec_models.rb +28 -0
  145. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +36 -0
  146. data/spec/mongoid/criteria/queryable/selectable_spec.rb +84 -82
  147. data/spec/mongoid/criteria_spec.rb +204 -39
  148. data/spec/mongoid/document_spec.rb +89 -15
  149. data/spec/mongoid/equality_spec.rb +0 -1
  150. data/spec/mongoid/errors/delete_restriction_spec.rb +1 -1
  151. data/spec/mongoid/extensions/stringified_symbol_spec.rb +85 -0
  152. data/spec/mongoid/factory_spec.rb +261 -28
  153. data/spec/mongoid/fields_spec.rb +48 -2
  154. data/spec/mongoid/findable_spec.rb +32 -0
  155. data/spec/mongoid/indexable_spec.rb +28 -2
  156. data/spec/mongoid/inspectable_spec.rb +29 -2
  157. data/spec/mongoid/interceptable_spec.rb +2 -2
  158. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +259 -0
  159. data/spec/mongoid/matcher/extract_attribute_spec.rb +47 -0
  160. data/spec/mongoid/persistable/creatable_spec.rb +108 -25
  161. data/spec/mongoid/persistable/deletable_spec.rb +86 -0
  162. data/spec/mongoid/persistable/savable_spec.rb +174 -16
  163. data/spec/mongoid/query_cache_middleware_spec.rb +16 -3
  164. data/spec/mongoid/query_cache_spec.rb +442 -41
  165. data/spec/mongoid/reloadable_spec.rb +72 -0
  166. data/spec/mongoid/serializable_spec.rb +21 -3
  167. data/spec/mongoid/traversable_spec.rb +1100 -0
  168. data/spec/shared/LICENSE +20 -0
  169. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  170. data/spec/shared/lib/mrss/cluster_config.rb +211 -0
  171. data/spec/shared/lib/mrss/constraints.rb +330 -0
  172. data/spec/shared/lib/mrss/docker_runner.rb +262 -0
  173. data/spec/shared/lib/mrss/lite_constraints.rb +175 -0
  174. data/spec/shared/lib/mrss/server_version_registry.rb +69 -0
  175. data/spec/shared/lib/mrss/spec_organizer.rb +149 -0
  176. data/spec/shared/share/Dockerfile.erb +229 -0
  177. data/spec/shared/shlib/distro.sh +73 -0
  178. data/spec/shared/shlib/server.sh +270 -0
  179. data/spec/shared/shlib/set_env.sh +128 -0
  180. data/spec/spec_helper.rb +4 -2
  181. data/spec/support/constraints.rb +20 -222
  182. data/spec/support/helpers.rb +1 -1
  183. data/spec/{app → support}/models/account.rb +0 -0
  184. data/spec/{app → support}/models/acolyte.rb +0 -0
  185. data/spec/{app → support}/models/actor.rb +1 -1
  186. data/spec/{app → support}/models/actress.rb +0 -0
  187. data/spec/{app → support}/models/address.rb +0 -0
  188. data/spec/{app → support}/models/address_component.rb +0 -0
  189. data/spec/{app → support}/models/address_number.rb +0 -0
  190. data/spec/{app → support}/models/agency.rb +0 -0
  191. data/spec/{app → support}/models/agent.rb +0 -0
  192. data/spec/{app → support}/models/album.rb +0 -0
  193. data/spec/{app → support}/models/alert.rb +0 -0
  194. data/spec/{app → support}/models/animal.rb +0 -0
  195. data/spec/{app → support}/models/answer.rb +0 -0
  196. data/spec/{app → support}/models/appointment.rb +0 -0
  197. data/spec/support/models/armrest.rb +10 -0
  198. data/spec/{app → support}/models/array_field.rb +0 -0
  199. data/spec/{app → support}/models/article.rb +0 -0
  200. data/spec/{app → support}/models/artist.rb +0 -0
  201. data/spec/{app → support}/models/artwork.rb +0 -0
  202. data/spec/{app → support}/models/audio.rb +0 -0
  203. data/spec/{app → support}/models/augmentation.rb +0 -0
  204. data/spec/{app → support}/models/author.rb +0 -0
  205. data/spec/{app → support}/models/baby.rb +0 -0
  206. data/spec/{app → support}/models/band.rb +0 -0
  207. data/spec/{app → support}/models/bar.rb +0 -0
  208. data/spec/{app → support}/models/basic.rb +0 -0
  209. data/spec/{app → support}/models/bed.rb +0 -0
  210. data/spec/{app → support}/models/big_palette.rb +0 -0
  211. data/spec/{app → support}/models/birthday.rb +0 -0
  212. data/spec/{app → support}/models/bomb.rb +0 -0
  213. data/spec/{app → support}/models/book.rb +0 -0
  214. data/spec/{app → support}/models/breed.rb +0 -0
  215. data/spec/{app → support}/models/browser.rb +1 -1
  216. data/spec/{app → support}/models/building.rb +0 -0
  217. data/spec/{app → support}/models/building_address.rb +0 -0
  218. data/spec/{app → support}/models/bus.rb +0 -0
  219. data/spec/{app → support}/models/business.rb +0 -0
  220. data/spec/{app → support}/models/callback_test.rb +0 -0
  221. data/spec/{app → support}/models/canvas.rb +1 -1
  222. data/spec/{app → support}/models/car.rb +0 -0
  223. data/spec/{app → support}/models/cat.rb +0 -0
  224. data/spec/{app → support}/models/category.rb +0 -0
  225. data/spec/{app → support}/models/child.rb +0 -0
  226. data/spec/{app → support}/models/child_doc.rb +0 -0
  227. data/spec/{app → support}/models/church.rb +0 -0
  228. data/spec/{app → support}/models/circle.rb +0 -0
  229. data/spec/{app → support}/models/circuit.rb +0 -0
  230. data/spec/{app → support}/models/circus.rb +0 -0
  231. data/spec/{app → support}/models/code.rb +0 -0
  232. data/spec/{app → support}/models/coding.rb +1 -1
  233. data/spec/{app → support}/models/coding/pull_request.rb +0 -0
  234. data/spec/{app → support}/models/comment.rb +0 -0
  235. data/spec/{app → support}/models/company.rb +0 -0
  236. data/spec/{app → support}/models/consumption_period.rb +0 -0
  237. data/spec/{app → support}/models/contextable_item.rb +0 -0
  238. data/spec/{app → support}/models/contractor.rb +0 -0
  239. data/spec/{app → support}/models/cookie.rb +0 -0
  240. data/spec/{app → support}/models/country_code.rb +0 -0
  241. data/spec/{app → support}/models/courier_job.rb +0 -0
  242. data/spec/support/models/crate.rb +13 -0
  243. data/spec/support/models/customer.rb +11 -0
  244. data/spec/support/models/customer_address.rb +12 -0
  245. data/spec/support/models/deed.rb +8 -0
  246. data/spec/{app → support}/models/definition.rb +0 -0
  247. data/spec/{app → support}/models/delegating_patient.rb +0 -0
  248. data/spec/{app → support}/models/description.rb +0 -0
  249. data/spec/{app → support}/models/dictionary.rb +6 -0
  250. data/spec/{app → support}/models/division.rb +0 -0
  251. data/spec/{app → support}/models/doctor.rb +0 -0
  252. data/spec/{app → support}/models/dog.rb +0 -0
  253. data/spec/{app → support}/models/dokument.rb +0 -0
  254. data/spec/{app → support}/models/draft.rb +0 -0
  255. data/spec/{app → support}/models/dragon.rb +0 -0
  256. data/spec/{app → support}/models/driver.rb +1 -1
  257. data/spec/{app → support}/models/drug.rb +0 -0
  258. data/spec/{app → support}/models/dungeon.rb +0 -0
  259. data/spec/{app → support}/models/edit.rb +0 -0
  260. data/spec/{app → support}/models/email.rb +0 -0
  261. data/spec/{app → support}/models/employer.rb +0 -0
  262. data/spec/{app → support}/models/entry.rb +0 -0
  263. data/spec/{app → support}/models/eraser.rb +0 -0
  264. data/spec/{app → support}/models/even.rb +0 -0
  265. data/spec/{app → support}/models/event.rb +0 -0
  266. data/spec/{app → support}/models/exhibition.rb +0 -0
  267. data/spec/{app → support}/models/exhibitor.rb +0 -0
  268. data/spec/{app → support}/models/explosion.rb +0 -0
  269. data/spec/{app → support}/models/eye.rb +0 -0
  270. data/spec/{app → support}/models/eye_bowl.rb +0 -0
  271. data/spec/{app → support}/models/face.rb +0 -0
  272. data/spec/{app → support}/models/favorite.rb +0 -0
  273. data/spec/{app → support}/models/filesystem.rb +0 -0
  274. data/spec/{app → support}/models/fire_hydrant.rb +0 -0
  275. data/spec/{app → support}/models/firefox.rb +0 -0
  276. data/spec/{app → support}/models/fish.rb +0 -0
  277. data/spec/{app → support}/models/folder.rb +0 -0
  278. data/spec/{app → support}/models/folder_item.rb +0 -0
  279. data/spec/{app → support}/models/fruits.rb +0 -0
  280. data/spec/{app → support}/models/game.rb +0 -0
  281. data/spec/{app → support}/models/ghost.rb +0 -0
  282. data/spec/support/models/guitar.rb +5 -0
  283. data/spec/{app → support}/models/home.rb +0 -0
  284. data/spec/{app → support}/models/house.rb +0 -0
  285. data/spec/{app → support}/models/html_writer.rb +0 -0
  286. data/spec/{app → support}/models/id_key.rb +0 -0
  287. data/spec/support/models/idnodef.rb +8 -0
  288. data/spec/{app → support}/models/image.rb +0 -0
  289. data/spec/{app → support}/models/implant.rb +0 -0
  290. data/spec/support/models/instrument.rb +9 -0
  291. data/spec/{app → support}/models/item.rb +1 -1
  292. data/spec/{app → support}/models/jar.rb +0 -0
  293. data/spec/{app → support}/models/kaleidoscope.rb +0 -0
  294. data/spec/{app → support}/models/kangaroo.rb +0 -0
  295. data/spec/{app → support}/models/label.rb +0 -0
  296. data/spec/{app → support}/models/language.rb +0 -0
  297. data/spec/{app → support}/models/lat_lng.rb +0 -0
  298. data/spec/{app → support}/models/league.rb +0 -0
  299. data/spec/{app → support}/models/learner.rb +0 -0
  300. data/spec/{app → support}/models/line_item.rb +0 -0
  301. data/spec/{app → support}/models/location.rb +0 -0
  302. data/spec/{app → support}/models/login.rb +0 -0
  303. data/spec/{app → support}/models/manufacturer.rb +0 -0
  304. data/spec/{app → support}/models/meat.rb +0 -0
  305. data/spec/{app → support}/models/membership.rb +0 -0
  306. data/spec/{app → support}/models/message.rb +0 -0
  307. data/spec/{app → support}/models/minim.rb +0 -0
  308. data/spec/{app → support}/models/mixed_drink.rb +0 -0
  309. data/spec/support/models/mop.rb +16 -0
  310. data/spec/{app → support}/models/movie.rb +0 -0
  311. data/spec/{app → support}/models/my_hash.rb +0 -0
  312. data/spec/{app → support}/models/name.rb +0 -0
  313. data/spec/{app → support}/models/name_only.rb +0 -0
  314. data/spec/{app → support}/models/node.rb +0 -0
  315. data/spec/{app → support}/models/note.rb +0 -0
  316. data/spec/{app → support}/models/odd.rb +0 -0
  317. data/spec/support/models/order.rb +11 -0
  318. data/spec/{app → support}/models/ordered_post.rb +0 -0
  319. data/spec/{app → support}/models/ordered_preference.rb +0 -0
  320. data/spec/{app → support}/models/oscar.rb +0 -0
  321. data/spec/{app → support}/models/other_owner_object.rb +0 -0
  322. data/spec/{app → support}/models/override.rb +0 -0
  323. data/spec/{app → support}/models/ownable.rb +0 -0
  324. data/spec/{app → support}/models/owner.rb +2 -0
  325. data/spec/{app → support}/models/pack.rb +0 -0
  326. data/spec/{app → support}/models/page.rb +0 -0
  327. data/spec/{app → support}/models/page_question.rb +0 -0
  328. data/spec/{app → support}/models/palette.rb +1 -1
  329. data/spec/{app → support}/models/parent.rb +0 -0
  330. data/spec/{app → support}/models/parent_doc.rb +0 -0
  331. data/spec/{app → support}/models/passport.rb +0 -0
  332. data/spec/{app → support}/models/patient.rb +0 -0
  333. data/spec/{app → support}/models/pdf_writer.rb +0 -0
  334. data/spec/{app → support}/models/pencil.rb +0 -0
  335. data/spec/{app → support}/models/person.rb +3 -1
  336. data/spec/{app → support}/models/pet.rb +0 -0
  337. data/spec/{app → support}/models/pet_owner.rb +0 -0
  338. data/spec/{app → support}/models/phone.rb +0 -0
  339. data/spec/support/models/piano.rb +5 -0
  340. data/spec/{app → support}/models/pizza.rb +0 -0
  341. data/spec/{app → support}/models/player.rb +0 -0
  342. data/spec/{app → support}/models/post.rb +0 -0
  343. data/spec/{app → support}/models/post_genre.rb +0 -0
  344. data/spec/{app → support}/models/powerup.rb +0 -0
  345. data/spec/{app → support}/models/preference.rb +0 -0
  346. data/spec/{app → support}/models/princess.rb +0 -0
  347. data/spec/{app → support}/models/product.rb +0 -0
  348. data/spec/support/models/profile.rb +18 -0
  349. data/spec/{app → support}/models/pronunciation.rb +0 -0
  350. data/spec/{app → support}/models/pub.rb +0 -0
  351. data/spec/support/models/publication.rb +5 -0
  352. data/spec/{app → support}/models/publication/encyclopedia.rb +0 -0
  353. data/spec/{app → support}/models/publication/review.rb +0 -0
  354. data/spec/{app → support}/models/purchase.rb +0 -0
  355. data/spec/{app → support}/models/question.rb +0 -0
  356. data/spec/{app → support}/models/quiz.rb +0 -0
  357. data/spec/{app → support}/models/rating.rb +0 -0
  358. data/spec/{app → support}/models/record.rb +0 -0
  359. data/spec/{app → support}/models/registry.rb +0 -0
  360. data/spec/{app → support}/models/role.rb +0 -0
  361. data/spec/{app → support}/models/root_category.rb +0 -0
  362. data/spec/{app → support}/models/sandwich.rb +0 -0
  363. data/spec/{app → support}/models/scheduler.rb +0 -0
  364. data/spec/{app/models/profile.rb → support/models/scribe.rb} +2 -2
  365. data/spec/support/models/seat.rb +25 -0
  366. data/spec/{app → support}/models/seo.rb +0 -0
  367. data/spec/{app → support}/models/series.rb +1 -0
  368. data/spec/{app → support}/models/server.rb +0 -0
  369. data/spec/{app → support}/models/service.rb +0 -0
  370. data/spec/{app → support}/models/shape.rb +2 -2
  371. data/spec/{app → support}/models/shelf.rb +0 -0
  372. data/spec/{app → support}/models/shipment_address.rb +0 -0
  373. data/spec/{app → support}/models/shipping_container.rb +0 -0
  374. data/spec/{app → support}/models/shipping_pack.rb +0 -0
  375. data/spec/{app → support}/models/shop.rb +0 -0
  376. data/spec/{app → support}/models/short_agent.rb +0 -0
  377. data/spec/{app → support}/models/short_quiz.rb +0 -0
  378. data/spec/{app → support}/models/simple.rb +0 -0
  379. data/spec/{app → support}/models/slave.rb +0 -0
  380. data/spec/{app → support}/models/song.rb +0 -0
  381. data/spec/{app → support}/models/sound.rb +0 -0
  382. data/spec/{app → support}/models/square.rb +0 -0
  383. data/spec/{app → support}/models/staff.rb +0 -0
  384. data/spec/{app → support}/models/store_as_dup_test1.rb +0 -0
  385. data/spec/{app → support}/models/store_as_dup_test2.rb +0 -0
  386. data/spec/{app → support}/models/store_as_dup_test3.rb +0 -0
  387. data/spec/{app → support}/models/store_as_dup_test4.rb +0 -0
  388. data/spec/{app → support}/models/strategy.rb +0 -0
  389. data/spec/{app → support}/models/sub_item.rb +0 -0
  390. data/spec/{app → support}/models/subscription.rb +0 -0
  391. data/spec/{app → support}/models/survey.rb +0 -0
  392. data/spec/{app → support}/models/symptom.rb +0 -0
  393. data/spec/support/models/system_role.rb +7 -0
  394. data/spec/{app → support}/models/tag.rb +0 -0
  395. data/spec/{app → support}/models/target.rb +0 -0
  396. data/spec/{app → support}/models/template.rb +0 -0
  397. data/spec/{app → support}/models/thing.rb +0 -0
  398. data/spec/{app → support}/models/title.rb +0 -0
  399. data/spec/{app → support}/models/tool.rb +2 -2
  400. data/spec/{app → support}/models/topping.rb +0 -0
  401. data/spec/support/models/toy.rb +10 -0
  402. data/spec/{app → support}/models/track.rb +0 -0
  403. data/spec/{app → support}/models/translation.rb +0 -0
  404. data/spec/{app → support}/models/tree.rb +0 -0
  405. data/spec/{app → support}/models/truck.rb +2 -0
  406. data/spec/{app → support}/models/updatable.rb +0 -0
  407. data/spec/{app → support}/models/user.rb +0 -0
  408. data/spec/{app → support}/models/user_account.rb +0 -0
  409. data/spec/{app → support}/models/validation_callback.rb +0 -0
  410. data/spec/{app → support}/models/vehicle.rb +7 -2
  411. data/spec/{app → support}/models/version.rb +0 -0
  412. data/spec/{app → support}/models/vertex.rb +0 -0
  413. data/spec/{app → support}/models/vet_visit.rb +0 -0
  414. data/spec/{app → support}/models/video.rb +0 -0
  415. data/spec/{app → support}/models/video_game.rb +0 -0
  416. data/spec/{app → support}/models/weapon.rb +0 -0
  417. data/spec/{app → support}/models/wiki_page.rb +1 -0
  418. data/spec/{app → support}/models/word.rb +0 -0
  419. data/spec/{app → support}/models/word_origin.rb +0 -0
  420. data/spec/{app → support}/models/writer.rb +2 -2
  421. data/spec/support/spec_config.rb +1 -1
  422. metadata +895 -755
  423. metadata.gz.sig +0 -0
  424. data/lib/mongoid/matchable/all.rb +0 -30
  425. data/lib/mongoid/matchable/and.rb +0 -32
  426. data/lib/mongoid/matchable/default.rb +0 -121
  427. data/lib/mongoid/matchable/elem_match.rb +0 -36
  428. data/lib/mongoid/matchable/eq.rb +0 -23
  429. data/lib/mongoid/matchable/exists.rb +0 -25
  430. data/lib/mongoid/matchable/gt.rb +0 -25
  431. data/lib/mongoid/matchable/gte.rb +0 -25
  432. data/lib/mongoid/matchable/in.rb +0 -26
  433. data/lib/mongoid/matchable/lt.rb +0 -25
  434. data/lib/mongoid/matchable/lte.rb +0 -25
  435. data/lib/mongoid/matchable/ne.rb +0 -23
  436. data/lib/mongoid/matchable/nin.rb +0 -24
  437. data/lib/mongoid/matchable/nor.rb +0 -38
  438. data/lib/mongoid/matchable/or.rb +0 -35
  439. data/lib/mongoid/matchable/regexp.rb +0 -30
  440. data/lib/mongoid/matchable/size.rb +0 -23
  441. data/spec/app/models/publication.rb +0 -5
  442. data/spec/mongoid/matchable/all_spec.rb +0 -34
  443. data/spec/mongoid/matchable/and_spec.rb +0 -190
  444. data/spec/mongoid/matchable/default_spec.rb +0 -140
  445. data/spec/mongoid/matchable/elem_match_spec.rb +0 -109
  446. data/spec/mongoid/matchable/eq_spec.rb +0 -49
  447. data/spec/mongoid/matchable/exists_spec.rb +0 -60
  448. data/spec/mongoid/matchable/gt_spec.rb +0 -89
  449. data/spec/mongoid/matchable/gte_spec.rb +0 -87
  450. data/spec/mongoid/matchable/in_spec.rb +0 -52
  451. data/spec/mongoid/matchable/lt_spec.rb +0 -88
  452. data/spec/mongoid/matchable/lte_spec.rb +0 -88
  453. data/spec/mongoid/matchable/ne_spec.rb +0 -49
  454. data/spec/mongoid/matchable/nin_spec.rb +0 -51
  455. data/spec/mongoid/matchable/nor_spec.rb +0 -210
  456. data/spec/mongoid/matchable/or_spec.rb +0 -134
  457. data/spec/mongoid/matchable/regexp_spec.rb +0 -62
  458. data/spec/mongoid/matchable/size_spec.rb +0 -28
  459. data/spec/mongoid/matchable_spec.rb +0 -856
  460. data/spec/support/child_process_helper.rb +0 -76
  461. data/spec/support/lite_constraints.rb +0 -22
@@ -60,7 +60,7 @@ module Mongoid
60
60
  #
61
61
  # @since 2.3.2
62
62
  def reload_root_document
63
- {}.merge(collection.find({ _id: _id }, session: _session).read(mode: :primary).first || {})
63
+ {}.merge(collection.find(atomic_selector, session: _session).read(mode: :primary).first || {})
64
64
  end
65
65
 
66
66
  # Reload the embedded document.
@@ -73,7 +73,7 @@ module Mongoid
73
73
  # @since 2.3.2
74
74
  def reload_embedded_document
75
75
  extract_embedded_attributes({}.merge(
76
- collection(_root).find(_id: _root._id).read(mode: :primary).first
76
+ collection(_root).find(_root.atomic_selector).read(mode: :primary).first
77
77
  ))
78
78
  end
79
79
 
@@ -80,7 +80,7 @@ module Mongoid
80
80
 
81
81
  only = Array.wrap(options[:only]).map(&:to_s)
82
82
  except = Array.wrap(options[:except]).map(&:to_s)
83
- except |= ['_type'] unless Mongoid.include_type_for_serialization
83
+ except |= [self.class.discriminator_key] unless Mongoid.include_type_for_serialization
84
84
 
85
85
  if !only.empty?
86
86
  names &= only
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ # A class which sends values to the database as Strings but returns them to the user as Symbols.
5
+ module Mongoid
6
+ class StringifiedSymbol
7
+
8
+ class << self
9
+
10
+ # Convert the object from its mongo friendly ruby type to this type.
11
+ #
12
+ # @example Demongoize the object.
13
+ # Symbol.demongoize(object)
14
+ #
15
+ # @param [ Object ] object The object to demongoize.
16
+ #
17
+ # @return [ Symbol ] The object.
18
+ #
19
+ # @api private
20
+ def demongoize(object)
21
+ if object.nil?
22
+ object
23
+ else
24
+ object.to_s.to_sym
25
+ end
26
+ end
27
+
28
+ # Turn the object from the ruby type we deal with to a Mongo friendly
29
+ # type.
30
+ #
31
+ # @example Mongoize the object.
32
+ # Symbol.mongoize("123.11")
33
+ #
34
+ # @param [ Object ] object The object to mongoize.
35
+ #
36
+ # @return [ Symbol ] The object mongoized.
37
+ #
38
+ # @api private
39
+ def mongoize(object)
40
+ if object.nil?
41
+ object
42
+ else
43
+ object.to_s
44
+ end
45
+ end
46
+
47
+ # @api private
48
+ def evolve(object)
49
+ mongoize(object)
50
+ end
51
+ end
52
+ end
53
+ end
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
  # encoding: utf-8
3
3
 
4
+ require "mongoid/fields/validators/macro"
5
+
4
6
  module Mongoid
5
7
 
6
8
  # Provides behavior around traversing the document graph.
@@ -17,6 +19,105 @@ module Mongoid
17
19
  @__parent = p
18
20
  end
19
21
 
22
+ # Module used for prepending to the various discriminator_*= methods
23
+ #
24
+ # @api private
25
+ module DiscriminatorAssignment
26
+ def discriminator_key=(value)
27
+ if hereditary?
28
+ raise Errors::InvalidDiscriminatorKeyTarget.new(self, self.superclass)
29
+ end
30
+
31
+ _mongoid_clear_types
32
+
33
+ if value
34
+ Mongoid::Fields::Validators::Macro.validate_field_name(self, value)
35
+ value = value.to_s
36
+ super
37
+ else
38
+ # When discriminator key is set to nil, replace the class's definition
39
+ # of the discriminator key reader (provided by class_attribute earlier)
40
+ # and re-delegate to Mongoid.
41
+ class << self
42
+ delegate :discriminator_key, to: ::Mongoid
43
+ end
44
+ end
45
+
46
+ # This condition checks if the new discriminator key would overwrite
47
+ # an existing field.
48
+ # This condition also checks if the class has any descendants, because
49
+ # if it doesn't then it doesn't need a discriminator key.
50
+ if !fields.has_key?(self.discriminator_key) && !descendants.empty?
51
+ default_proc = lambda { self.class.discriminator_value }
52
+ field(self.discriminator_key, default: default_proc, type: String)
53
+ end
54
+ end
55
+
56
+ def discriminator_value=(value)
57
+ value ||= self.name
58
+ _mongoid_clear_types
59
+ add_discriminator_mapping(value)
60
+ @discriminator_value = value
61
+ end
62
+ end
63
+
64
+ # Module used for prepending the discriminator_value method.
65
+ #
66
+ # A separate module was needed because the subclasses of this class
67
+ # need to be manually prepended with the discriminator_value and can't
68
+ # rely on being a class_attribute because the .discriminator_value
69
+ # method is overriden by every subclass in the inherited method.
70
+ #
71
+ # @api private
72
+ module DiscriminatorRetrieval
73
+
74
+ # Get the name on the reading side if the discriminator_value is nil
75
+ def discriminator_value
76
+ @discriminator_value || self.name
77
+ end
78
+ end
79
+
80
+ included do
81
+ class_attribute :discriminator_key, instance_accessor: false
82
+
83
+ class << self
84
+ delegate :discriminator_key, to: ::Mongoid
85
+ prepend DiscriminatorAssignment
86
+ include DiscriminatorRetrieval
87
+
88
+ # @api private
89
+ #
90
+ # @return [ Hash<String, Class> ] The current mapping of discriminator_values to classes
91
+ attr_accessor :discriminator_mapping
92
+ end
93
+
94
+ # Add a discriminator mapping to the parent class. This mapping is used when
95
+ # receiving a document to identify its class.
96
+ #
97
+ # @param [ String ] value The discriminator_value that was just set
98
+ # @param [ Class ] The class the discriminator_value was set on
99
+ #
100
+ # @api private
101
+ def self.add_discriminator_mapping(value, klass=self)
102
+ self.discriminator_mapping ||= {}
103
+ self.discriminator_mapping[value] = klass
104
+ superclass.add_discriminator_mapping(value, klass) if hereditary?
105
+ end
106
+
107
+ # Get the discriminator mapping from the parent class. This method returns nil if there
108
+ # is no mapping for the given value.
109
+ #
110
+ # @param [ String ] value The discriminator_value to retrieve
111
+ #
112
+ # @return [ Class | nil ] klass The class corresponding to the given discriminator_value. If
113
+ # the value is not in the mapping, this method returns nil.
114
+ #
115
+ # @api private
116
+ def self.get_discriminator_mapping(value)
117
+ self.discriminator_mapping[value] if self.discriminator_mapping
118
+ end
119
+ end
120
+
20
121
  # Get all child +Documents+ to this +Document+, going n levels deep if
21
122
  # necessary. This is used when calling update persistence operations from
22
123
  # the root document, where changes in the entire tree need to be
@@ -201,14 +302,20 @@ module Mongoid
201
302
  subclass.pre_processed_defaults = pre_processed_defaults.dup
202
303
  subclass.post_processed_defaults = post_processed_defaults.dup
203
304
  subclass._declared_scopes = Hash.new { |hash,key| self._declared_scopes[key] }
305
+ subclass.discriminator_value = subclass.name
306
+
307
+ # We need to do this here because the discriminator_value method is
308
+ # overriden in the subclass above.
309
+ class << subclass
310
+ include DiscriminatorRetrieval
311
+ end
204
312
 
205
313
  # We only need the _type field if inheritance is in play, but need to
206
314
  # add to the root class as well for backwards compatibility.
207
- unless fields.has_key?("_type")
208
- field(:_type, default: self.name, type: String)
315
+ unless fields.has_key?(self.discriminator_key)
316
+ default_proc = lambda { self.class.discriminator_value }
317
+ field(self.discriminator_key, default: default_proc, type: String)
209
318
  end
210
- subclass_default = subclass.name || ->{ self.class.name }
211
- subclass.field(:_type, default: subclass_default, type: String, overwrite: true)
212
319
  end
213
320
  end
214
321
  end
@@ -2,5 +2,5 @@
2
2
  # encoding: utf-8
3
3
 
4
4
  module Mongoid
5
- VERSION = "7.1.5"
5
+ VERSION = "7.2.1"
6
6
  end
data/spec/README.md CHANGED
@@ -1,8 +1,17 @@
1
1
  # Running Mongoid Tests
2
2
 
3
- ## Overview
4
- ### Quick Start
5
- Spin up a MongoDB deployment against which to run the Mongoid specs. Mongoid specs support a variety of MongoDB topologies, but the simplest is a single MongoDB instance:
3
+ ## Quick Start
4
+
5
+ The test suite requires shared tooling that is stored in a separate repository
6
+ and is referenced as a submodule. After checking out the desired driver
7
+ branch, check out the matching submodules:
8
+
9
+ git submodule init
10
+ git submodule update
11
+
12
+ Spin up a MongoDB deployment against which to run the Mongoid specs.
13
+ Mongoid specs support a variety of MongoDB topologies, but the simplest is
14
+ a single MongoDB instance:
6
15
 
7
16
  # Launch mongod in one terminal
8
17
  mkdir /tmp/mdb
@@ -14,5 +23,11 @@ Run the test suite in a separate terminal:
14
23
 
15
24
 
16
25
  ## Caveats
26
+
17
27
  ### "Too many open files" error
18
- On MacOS, you may encounter a "Too many open files" error on the MongoDB server when running the tests. If this happens, stop the server, run the command `ulimit -n 10000` in the same terminal session as the server, and restart the server. This will increase the number of files that can be opened. Then, re-run the tests.
28
+
29
+ On MacOS, you may encounter a "Too many open files" error on the MongoDB server
30
+ when running the tests. If this happens, stop the server, run the command
31
+ `ulimit -n 10000` in the same terminal session as the server, and restart
32
+ the server. This will increase the number of files that can be opened.
33
+ Then, re-run the tests.
@@ -13,7 +13,7 @@ describe 'Mongoid application tests' do
13
13
  end
14
14
 
15
15
  require 'fileutils'
16
- require 'support/child_process_helper'
16
+ require 'mrss/child_process_helper'
17
17
  require 'open-uri'
18
18
 
19
19
  FileUtils.mkdir_p(TMP_BASE)
@@ -91,19 +91,19 @@ describe 'Mongoid application tests' do
91
91
  ['~> 5.1.0', '~> 5.2.0', '~> 6.0.0'].each do |rails_version|
92
92
  context "with rails #{rails_version}" do
93
93
  it 'creates' do
94
- ChildProcessHelper.check_call(%w(gem uni rails -a))
95
- ChildProcessHelper.check_call(%w(gem install rails --no-document -v) + [rails_version])
94
+ Mrss::ChildProcessHelper.check_call(%w(gem uni rails -a))
95
+ Mrss::ChildProcessHelper.check_call(%w(gem install rails --no-document -v) + [rails_version])
96
96
 
97
97
  Dir.chdir(TMP_BASE) do
98
98
  FileUtils.rm_rf('mongoid-test')
99
- ChildProcessHelper.check_call(%w(rails new mongoid-test --skip-spring --skip-active-record), env: clean_env)
99
+ Mrss::ChildProcessHelper.check_call(%w(rails new mongoid-test --skip-spring --skip-active-record), env: clean_env)
100
100
 
101
101
  Dir.chdir('mongoid-test') do
102
102
  adjust_app_gemfile
103
- ChildProcessHelper.check_call(%w(bundle install), env: clean_env)
103
+ Mrss::ChildProcessHelper.check_call(%w(bundle install), env: clean_env)
104
104
 
105
- ChildProcessHelper.check_call(%w(rails g model post), env: clean_env)
106
- ChildProcessHelper.check_call(%w(rails g model comment post:belongs_to), env: clean_env)
105
+ Mrss::ChildProcessHelper.check_call(%w(rails g model post), env: clean_env)
106
+ Mrss::ChildProcessHelper.check_call(%w(rails g model comment post:belongs_to), env: clean_env)
107
107
 
108
108
  # https://jira.mongodb.org/browse/MONGOID-4885
109
109
  comment_text = File.read('app/models/comment.rb')
@@ -136,7 +136,7 @@ describe 'Mongoid application tests' do
136
136
  before do
137
137
  Dir.chdir(APP_PATH) do
138
138
  remove_bundler_req
139
- ChildProcessHelper.check_call(%w(bundle install), env: env)
139
+ Mrss::ChildProcessHelper.check_call(%w(bundle install), env: env)
140
140
  write_mongoid_yml
141
141
  end
142
142
 
@@ -150,7 +150,7 @@ describe 'Mongoid application tests' do
150
150
  end
151
151
  index.should be nil
152
152
 
153
- ChildProcessHelper.check_call(%w(rake db:mongoid:create_indexes),
153
+ Mrss::ChildProcessHelper.check_call(%w(bundle exec rake db:mongoid:create_indexes),
154
154
  cwd: APP_PATH, env: env)
155
155
 
156
156
  index = client['posts'].indexes.detect do |index|
@@ -168,10 +168,10 @@ describe 'Mongoid application tests' do
168
168
  def clone_application(repo_url, subdir: nil, rails_version: nil)
169
169
  Dir.chdir(TMP_BASE) do
170
170
  FileUtils.rm_rf(File.basename(repo_url))
171
- ChildProcessHelper.check_call(%w(git clone) + [repo_url])
171
+ Mrss::ChildProcessHelper.check_call(%w(git clone) + [repo_url])
172
172
  Dir.chdir(File.join(*[File.basename(repo_url), subdir].compact)) do
173
173
  adjust_app_gemfile(rails_version: rails_version)
174
- ChildProcessHelper.check_call(%w(bundle install), env: clean_env)
174
+ Mrss::ChildProcessHelper.check_call(%w(bundle install), env: clean_env)
175
175
  puts `git diff`
176
176
 
177
177
  write_mongoid_yml
@@ -181,11 +181,44 @@ describe 'Mongoid application tests' do
181
181
  end
182
182
  end
183
183
 
184
+ def parse_mongodb_uri(uri)
185
+ pre, query = uri.split('?', 2)
186
+ if pre =~ %r,\A(mongodb(?:.*?))://([^/]+)(?:/(.*))?\z,
187
+ protocol = $1
188
+ hosts = $2
189
+ database = $3
190
+ if database == ''
191
+ database = nil
192
+ end
193
+ else
194
+ raise ArgumentError, "Invalid MongoDB URI: #{uri}"
195
+ end
196
+ if query == ''
197
+ query = nil
198
+ end
199
+ {
200
+ protocol: protocol,
201
+ hosts: hosts,
202
+ database: database,
203
+ query: query,
204
+ }
205
+ end
206
+
207
+ def build_mongodb_uri(parts)
208
+ "#{parts.fetch(:protocol)}://#{parts.fetch(:hosts)}/#{parts[:database]}?#{parts[:query]}"
209
+ end
210
+
184
211
  def write_mongoid_yml
212
+ # HACK: the driver does not provide a MongoDB URI parser and assembler,
213
+ # and the Ruby standard library URI module doesn't handle multiple hosts.
214
+ parts = parse_mongodb_uri(SpecConfig.instance.uri_str)
215
+ parts[:database] = 'mongoid_test'
216
+ uri = build_mongodb_uri(parts)
217
+ p uri
185
218
  env_config = {'clients' => {'default' => {
186
219
  # TODO massive hack, will fail if uri specifies a database name or
187
220
  # any uri options
188
- 'uri' => "#{SpecConfig.instance.uri_str}/mongoid_test",
221
+ 'uri' => uri,
189
222
  }}}
190
223
  config = {'development' => env_config, 'production' => env_config}
191
224
  File.open('config/mongoid.yml', 'w') do |f|
@@ -230,7 +263,7 @@ describe 'Mongoid application tests' do
230
263
  # in `initialize': too long unix socket path (126bytes given but 108bytes max) (ArgumentError)
231
264
  # Is it trying to create unix sockets in current directory?
232
265
  # https://stackoverflow.com/questions/30302021/rails-runner-without-spring
233
- ChildProcessHelper.check_call(%w(bin/spring binstub --remove --all), env: clean_env)
266
+ Mrss::ChildProcessHelper.check_call(%w(bin/spring binstub --remove --all), env: clean_env)
234
267
  end
235
268
 
236
269
  def clean_env
@@ -172,4 +172,98 @@ describe 'embedded associations' do
172
172
  end
173
173
  end
174
174
  end
175
+
176
+ describe 'updated_at on parent' do
177
+ context 'when child is added' do
178
+ context 'embeds_one' do
179
+ let(:parent) { EomParent.create! }
180
+
181
+ it 'updates' do
182
+ pending 'https://jira.mongodb.org/browse/MONGOID-3252'
183
+
184
+ first_updated_at = parent.updated_at
185
+
186
+ parent.child = EomChild.new
187
+ parent.save!
188
+
189
+ parent.updated_at.should > first_updated_at
190
+ end
191
+ end
192
+
193
+ context 'embeds_many' do
194
+ let(:parent) { EmmCongress.create! }
195
+
196
+ it 'updates' do
197
+ pending 'https://jira.mongodb.org/browse/MONGOID-3252'
198
+
199
+ first_updated_at = parent.updated_at
200
+
201
+ parent.legislators << EmmLegislator.new
202
+ parent.save!
203
+
204
+ parent.updated_at.should > first_updated_at
205
+ end
206
+ end
207
+ end
208
+
209
+ context 'when child is updated' do
210
+ context 'embeds_one' do
211
+ let(:parent) { EomParent.create!(child: EomChild.new) }
212
+
213
+ it 'updates' do
214
+ first_updated_at = parent.updated_at
215
+
216
+ parent.child.a = 42
217
+ parent.save!
218
+
219
+ parent.updated_at.should > first_updated_at
220
+ end
221
+ end
222
+
223
+ context 'embeds_many' do
224
+ let(:parent) { EmmCongress.create!(legislators: [EmmLegislator.new]) }
225
+
226
+ it 'updates' do
227
+ first_updated_at = parent.updated_at
228
+
229
+ parent.legislators.first.a = 42
230
+ parent.save!
231
+
232
+ parent.updated_at.should > first_updated_at
233
+ end
234
+ end
235
+ end
236
+
237
+ context 'when child is removed' do
238
+ context 'embeds_one' do
239
+ let(:parent) { EomParent.create!(child: EomChild.new) }
240
+
241
+ it 'updates' do
242
+ pending 'https://jira.mongodb.org/browse/MONGOID-3252'
243
+
244
+ first_updated_at = parent.updated_at
245
+
246
+ parent.child = nil
247
+ parent.save!
248
+
249
+ parent.updated_at.should > first_updated_at
250
+ end
251
+ end
252
+
253
+ context 'embeds_many' do
254
+ let(:parent) { EmmCongress.create!(legislators: [EmmLegislator.new]) }
255
+
256
+ it 'updates' do
257
+ pending 'https://jira.mongodb.org/browse/MONGOID-3252'
258
+
259
+ first_updated_at = parent.updated_at
260
+
261
+ parent.legislators.clear
262
+ parent.save!
263
+
264
+ parent.updated_at.should > first_updated_at
265
+ end
266
+ end
267
+ end
268
+ end
175
269
  end