mongoid 7.1.8 → 7.2.3

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 (437) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +1 -3
  3. data.tar.gz.sig +0 -0
  4. data/README.md +9 -2
  5. data/lib/config/locales/en.yml +37 -1
  6. data/lib/mongoid.rb +23 -0
  7. data/lib/mongoid/association/depending.rb +1 -6
  8. data/lib/mongoid/association/many.rb +3 -3
  9. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  10. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +1 -1
  11. data/lib/mongoid/association/referenced/has_many/enumerable.rb +36 -1
  12. data/lib/mongoid/association/referenced/has_many/proxy.rb +8 -1
  13. data/lib/mongoid/association/referenced/has_one/buildable.rb +9 -1
  14. data/lib/mongoid/atomic/modifiers.rb +1 -1
  15. data/lib/mongoid/attributes/dynamic.rb +1 -1
  16. data/lib/mongoid/clients/factory.rb +17 -0
  17. data/lib/mongoid/composable.rb +1 -0
  18. data/lib/mongoid/config.rb +3 -0
  19. data/lib/mongoid/contextual/mongo.rb +23 -4
  20. data/lib/mongoid/copyable.rb +7 -3
  21. data/lib/mongoid/criteria.rb +57 -7
  22. data/lib/mongoid/criteria/queryable/key.rb +1 -1
  23. data/lib/mongoid/criteria/queryable/mergeable.rb +2 -2
  24. data/lib/mongoid/criteria/queryable/selectable.rb +21 -6
  25. data/lib/mongoid/criteria/queryable/selector.rb +3 -3
  26. data/lib/mongoid/criteria/queryable/storable.rb +3 -3
  27. data/lib/mongoid/document.rb +15 -3
  28. data/lib/mongoid/errors.rb +7 -0
  29. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +25 -0
  30. data/lib/mongoid/errors/invalid_elem_match_operator.rb +33 -0
  31. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +26 -0
  32. data/lib/mongoid/errors/invalid_expression_operator.rb +28 -0
  33. data/lib/mongoid/errors/invalid_field_operator.rb +33 -0
  34. data/lib/mongoid/errors/invalid_query.rb +41 -0
  35. data/lib/mongoid/extensions.rb +1 -0
  36. data/lib/mongoid/factory.rb +27 -10
  37. data/lib/mongoid/fields.rb +3 -0
  38. data/lib/mongoid/fields/validators/macro.rb +22 -9
  39. data/lib/mongoid/findable.rb +50 -14
  40. data/lib/mongoid/indexable.rb +2 -2
  41. data/lib/mongoid/matchable.rb +1 -149
  42. data/lib/mongoid/matcher.rb +103 -0
  43. data/lib/mongoid/matcher/all.rb +22 -0
  44. data/lib/mongoid/matcher/and.rb +21 -0
  45. data/lib/mongoid/matcher/elem_match.rb +36 -0
  46. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  47. data/lib/mongoid/matcher/eq.rb +11 -0
  48. data/lib/mongoid/matcher/eq_impl.rb +32 -0
  49. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +21 -0
  50. data/lib/mongoid/matcher/exists.rb +15 -0
  51. data/lib/mongoid/matcher/expression.rb +31 -0
  52. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  53. data/lib/mongoid/matcher/field_expression.rb +62 -0
  54. data/lib/mongoid/matcher/field_operator.rb +48 -0
  55. data/lib/mongoid/matcher/gt.rb +17 -0
  56. data/lib/mongoid/matcher/gte.rb +17 -0
  57. data/lib/mongoid/matcher/in.rb +25 -0
  58. data/lib/mongoid/matcher/lt.rb +17 -0
  59. data/lib/mongoid/matcher/lte.rb +17 -0
  60. data/lib/mongoid/matcher/ne.rb +16 -0
  61. data/lib/mongoid/matcher/nin.rb +11 -0
  62. data/lib/mongoid/matcher/nor.rb +25 -0
  63. data/lib/mongoid/matcher/not.rb +29 -0
  64. data/lib/mongoid/matcher/or.rb +21 -0
  65. data/lib/mongoid/matcher/regex.rb +41 -0
  66. data/lib/mongoid/matcher/size.rb +26 -0
  67. data/lib/mongoid/persistable/deletable.rb +1 -1
  68. data/lib/mongoid/query_cache.rb +64 -62
  69. data/lib/mongoid/reloadable.rb +2 -2
  70. data/lib/mongoid/serializable.rb +1 -1
  71. data/lib/mongoid/stringified_symbol.rb +53 -0
  72. data/lib/mongoid/traversable.rb +111 -4
  73. data/lib/mongoid/version.rb +1 -1
  74. data/spec/README.md +19 -4
  75. data/spec/integration/associations/embedded_spec.rb +94 -0
  76. data/spec/integration/associations/has_many_spec.rb +67 -14
  77. data/spec/integration/associations/has_one_spec.rb +67 -14
  78. data/spec/integration/associations/nested_attributes_assignment_spec.rb +116 -0
  79. data/spec/integration/atomic/modifiers_spec.rb +117 -0
  80. data/spec/integration/discriminator_key_spec.rb +354 -0
  81. data/spec/integration/discriminator_value_spec.rb +207 -0
  82. data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +120 -41
  83. data/spec/integration/matcher_operator_data/all.yml +140 -0
  84. data/spec/integration/matcher_operator_data/and.yml +93 -0
  85. data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
  86. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  87. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  88. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  89. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  90. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  91. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  92. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  93. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  94. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  95. data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
  96. data/spec/integration/matcher_operator_data/in.yml +194 -0
  97. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  98. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  99. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  100. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  101. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  102. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  103. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  104. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  105. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  106. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  107. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  108. data/spec/integration/matcher_operator_data/not.yml +196 -0
  109. data/spec/integration/matcher_operator_data/or.yml +137 -0
  110. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  111. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  112. data/spec/integration/matcher_operator_data/size.yml +174 -0
  113. data/spec/integration/matcher_operator_spec.rb +100 -0
  114. data/spec/integration/matcher_spec.rb +189 -0
  115. data/spec/integration/server_query_spec.rb +142 -0
  116. data/spec/integration/stringified_symbol_field_spec.rb +190 -0
  117. data/spec/mongoid/association/depending_spec.rb +78 -26
  118. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +33 -0
  119. data/spec/mongoid/association/embedded/embeds_many_models.rb +1 -0
  120. data/spec/mongoid/association/embedded/embeds_one_models.rb +1 -0
  121. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +460 -186
  122. data/spec/mongoid/association/referenced/has_many_models.rb +21 -0
  123. data/spec/mongoid/association/referenced/has_one_models.rb +21 -0
  124. data/spec/mongoid/association/referenced/has_one_spec.rb +1 -1
  125. data/spec/mongoid/atomic/modifiers_spec.rb +47 -0
  126. data/spec/mongoid/atomic_spec.rb +23 -0
  127. data/spec/mongoid/attributes/nested_spec.rb +1 -1
  128. data/spec/mongoid/clients/factory_spec.rb +37 -0
  129. data/spec/mongoid/clients/sessions_spec.rb +1 -6
  130. data/spec/mongoid/config_spec.rb +28 -0
  131. data/spec/mongoid/contextual/mongo_spec.rb +70 -16
  132. data/spec/mongoid/copyable_spec.rb +197 -18
  133. data/spec/mongoid/copyable_spec_models.rb +28 -0
  134. data/spec/mongoid/criteria/queryable/selectable_spec.rb +84 -82
  135. data/spec/mongoid/criteria_spec.rb +204 -39
  136. data/spec/mongoid/document_fields_spec.rb +26 -0
  137. data/spec/mongoid/document_spec.rb +89 -15
  138. data/spec/mongoid/equality_spec.rb +0 -1
  139. data/spec/mongoid/errors/delete_restriction_spec.rb +1 -1
  140. data/spec/mongoid/extensions/stringified_symbol_spec.rb +85 -0
  141. data/spec/mongoid/factory_spec.rb +261 -28
  142. data/spec/mongoid/fields_spec.rb +48 -2
  143. data/spec/mongoid/findable_spec.rb +32 -0
  144. data/spec/mongoid/indexable_spec.rb +28 -2
  145. data/spec/mongoid/inspectable_spec.rb +29 -2
  146. data/spec/mongoid/interceptable_spec.rb +2 -2
  147. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  148. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
  149. data/spec/mongoid/matcher/extract_attribute_spec.rb +37 -0
  150. data/spec/mongoid/persistable/creatable_spec.rb +108 -25
  151. data/spec/mongoid/persistable/deletable_spec.rb +86 -0
  152. data/spec/mongoid/persistable/savable_spec.rb +174 -16
  153. data/spec/mongoid/query_cache_middleware_spec.rb +16 -3
  154. data/spec/mongoid/query_cache_spec.rb +442 -41
  155. data/spec/mongoid/reloadable_spec.rb +72 -0
  156. data/spec/mongoid/serializable_spec.rb +21 -3
  157. data/spec/mongoid/traversable_spec.rb +1100 -0
  158. data/spec/spec_helper.rb +2 -2
  159. data/spec/support/constraints.rb +24 -0
  160. data/spec/support/helpers.rb +1 -1
  161. data/spec/{app → support}/models/account.rb +0 -0
  162. data/spec/{app → support}/models/acolyte.rb +0 -0
  163. data/spec/{app → support}/models/actor.rb +1 -1
  164. data/spec/{app → support}/models/actress.rb +0 -0
  165. data/spec/{app → support}/models/address.rb +0 -0
  166. data/spec/{app → support}/models/address_component.rb +0 -0
  167. data/spec/{app → support}/models/address_number.rb +0 -0
  168. data/spec/{app → support}/models/agency.rb +0 -0
  169. data/spec/{app → support}/models/agent.rb +0 -0
  170. data/spec/{app → support}/models/album.rb +0 -0
  171. data/spec/{app → support}/models/alert.rb +0 -0
  172. data/spec/{app → support}/models/animal.rb +0 -0
  173. data/spec/{app → support}/models/answer.rb +0 -0
  174. data/spec/{app → support}/models/appointment.rb +0 -0
  175. data/spec/support/models/armrest.rb +10 -0
  176. data/spec/{app → support}/models/array_field.rb +0 -0
  177. data/spec/{app → support}/models/article.rb +0 -0
  178. data/spec/{app → support}/models/artist.rb +0 -0
  179. data/spec/{app → support}/models/artwork.rb +0 -0
  180. data/spec/{app → support}/models/audio.rb +0 -0
  181. data/spec/{app → support}/models/augmentation.rb +0 -0
  182. data/spec/{app → support}/models/author.rb +0 -0
  183. data/spec/{app → support}/models/baby.rb +0 -0
  184. data/spec/{app → support}/models/band.rb +0 -0
  185. data/spec/{app → support}/models/bar.rb +0 -0
  186. data/spec/{app → support}/models/basic.rb +0 -0
  187. data/spec/{app → support}/models/bed.rb +0 -0
  188. data/spec/{app → support}/models/big_palette.rb +0 -0
  189. data/spec/{app → support}/models/birthday.rb +0 -0
  190. data/spec/{app → support}/models/bomb.rb +0 -0
  191. data/spec/{app → support}/models/book.rb +0 -0
  192. data/spec/{app → support}/models/breed.rb +0 -0
  193. data/spec/{app → support}/models/browser.rb +1 -1
  194. data/spec/{app → support}/models/building.rb +0 -0
  195. data/spec/{app → support}/models/building_address.rb +0 -0
  196. data/spec/{app → support}/models/bus.rb +0 -0
  197. data/spec/{app → support}/models/business.rb +0 -0
  198. data/spec/{app → support}/models/callback_test.rb +0 -0
  199. data/spec/{app → support}/models/canvas.rb +1 -1
  200. data/spec/{app → support}/models/car.rb +0 -0
  201. data/spec/{app → support}/models/cat.rb +0 -0
  202. data/spec/{app → support}/models/category.rb +0 -0
  203. data/spec/{app → support}/models/child.rb +0 -0
  204. data/spec/{app → support}/models/child_doc.rb +0 -0
  205. data/spec/{app → support}/models/church.rb +0 -0
  206. data/spec/{app → support}/models/circle.rb +0 -0
  207. data/spec/{app → support}/models/circuit.rb +0 -0
  208. data/spec/{app → support}/models/circus.rb +0 -0
  209. data/spec/{app → support}/models/code.rb +0 -0
  210. data/spec/{app → support}/models/coding.rb +1 -1
  211. data/spec/{app → support}/models/coding/pull_request.rb +0 -0
  212. data/spec/{app → support}/models/comment.rb +0 -0
  213. data/spec/{app → support}/models/company.rb +0 -0
  214. data/spec/{app → support}/models/consumption_period.rb +0 -0
  215. data/spec/{app → support}/models/contextable_item.rb +0 -0
  216. data/spec/{app → support}/models/contractor.rb +0 -0
  217. data/spec/{app → support}/models/cookie.rb +0 -0
  218. data/spec/{app → support}/models/country_code.rb +0 -0
  219. data/spec/{app → support}/models/courier_job.rb +0 -0
  220. data/spec/support/models/crate.rb +13 -0
  221. data/spec/{app → support}/models/customer.rb +0 -0
  222. data/spec/{app → support}/models/customer_address.rb +0 -0
  223. data/spec/support/models/deed.rb +8 -0
  224. data/spec/{app → support}/models/definition.rb +0 -0
  225. data/spec/{app → support}/models/delegating_patient.rb +0 -0
  226. data/spec/{app → support}/models/description.rb +0 -0
  227. data/spec/{app → support}/models/dictionary.rb +0 -0
  228. data/spec/{app → support}/models/division.rb +0 -0
  229. data/spec/{app → support}/models/doctor.rb +0 -0
  230. data/spec/{app → support}/models/dog.rb +0 -0
  231. data/spec/{app → support}/models/dokument.rb +0 -0
  232. data/spec/{app → support}/models/draft.rb +0 -0
  233. data/spec/{app → support}/models/dragon.rb +0 -0
  234. data/spec/{app → support}/models/driver.rb +1 -1
  235. data/spec/{app → support}/models/drug.rb +0 -0
  236. data/spec/{app → support}/models/dungeon.rb +0 -0
  237. data/spec/{app → support}/models/edit.rb +0 -0
  238. data/spec/{app → support}/models/email.rb +0 -0
  239. data/spec/{app → support}/models/employer.rb +0 -0
  240. data/spec/{app → support}/models/entry.rb +0 -0
  241. data/spec/{app → support}/models/eraser.rb +0 -0
  242. data/spec/{app → support}/models/even.rb +0 -0
  243. data/spec/{app → support}/models/event.rb +0 -0
  244. data/spec/{app → support}/models/exhibition.rb +0 -0
  245. data/spec/{app → support}/models/exhibitor.rb +0 -0
  246. data/spec/{app → support}/models/explosion.rb +0 -0
  247. data/spec/{app → support}/models/eye.rb +0 -0
  248. data/spec/{app → support}/models/eye_bowl.rb +0 -0
  249. data/spec/{app → support}/models/face.rb +0 -0
  250. data/spec/{app → support}/models/favorite.rb +0 -0
  251. data/spec/{app → support}/models/filesystem.rb +0 -0
  252. data/spec/{app → support}/models/fire_hydrant.rb +0 -0
  253. data/spec/{app → support}/models/firefox.rb +0 -0
  254. data/spec/{app → support}/models/fish.rb +0 -0
  255. data/spec/{app → support}/models/folder.rb +0 -0
  256. data/spec/{app → support}/models/folder_item.rb +0 -0
  257. data/spec/{app → support}/models/fruits.rb +0 -0
  258. data/spec/{app → support}/models/game.rb +0 -0
  259. data/spec/{app → support}/models/ghost.rb +0 -0
  260. data/spec/support/models/guitar.rb +5 -0
  261. data/spec/{app → support}/models/home.rb +0 -0
  262. data/spec/{app → support}/models/house.rb +0 -0
  263. data/spec/{app → support}/models/html_writer.rb +0 -0
  264. data/spec/{app → support}/models/id_key.rb +0 -0
  265. data/spec/support/models/idnodef.rb +8 -0
  266. data/spec/{app → support}/models/image.rb +0 -0
  267. data/spec/{app → support}/models/implant.rb +0 -0
  268. data/spec/support/models/instrument.rb +9 -0
  269. data/spec/{app → support}/models/item.rb +1 -1
  270. data/spec/{app → support}/models/jar.rb +0 -0
  271. data/spec/{app → support}/models/kaleidoscope.rb +0 -0
  272. data/spec/{app → support}/models/kangaroo.rb +0 -0
  273. data/spec/{app → support}/models/label.rb +0 -0
  274. data/spec/{app → support}/models/language.rb +0 -0
  275. data/spec/{app → support}/models/lat_lng.rb +0 -0
  276. data/spec/{app → support}/models/league.rb +0 -0
  277. data/spec/{app → support}/models/learner.rb +0 -0
  278. data/spec/{app → support}/models/line_item.rb +0 -0
  279. data/spec/{app → support}/models/location.rb +0 -0
  280. data/spec/{app → support}/models/login.rb +0 -0
  281. data/spec/{app → support}/models/manufacturer.rb +0 -0
  282. data/spec/{app → support}/models/meat.rb +0 -0
  283. data/spec/{app → support}/models/membership.rb +0 -0
  284. data/spec/{app → support}/models/message.rb +0 -0
  285. data/spec/{app → support}/models/minim.rb +0 -0
  286. data/spec/{app → support}/models/mixed_drink.rb +0 -0
  287. data/spec/support/models/mop.rb +26 -0
  288. data/spec/{app → support}/models/movie.rb +0 -0
  289. data/spec/{app → support}/models/my_hash.rb +0 -0
  290. data/spec/{app → support}/models/name.rb +0 -0
  291. data/spec/{app → support}/models/name_only.rb +0 -0
  292. data/spec/{app → support}/models/node.rb +0 -0
  293. data/spec/{app → support}/models/note.rb +0 -0
  294. data/spec/{app → support}/models/odd.rb +0 -0
  295. data/spec/support/models/order.rb +11 -0
  296. data/spec/{app → support}/models/ordered_post.rb +0 -0
  297. data/spec/{app → support}/models/ordered_preference.rb +0 -0
  298. data/spec/{app → support}/models/oscar.rb +0 -0
  299. data/spec/{app → support}/models/other_owner_object.rb +0 -0
  300. data/spec/{app → support}/models/override.rb +0 -0
  301. data/spec/{app → support}/models/ownable.rb +0 -0
  302. data/spec/{app → support}/models/owner.rb +2 -0
  303. data/spec/{app → support}/models/pack.rb +0 -0
  304. data/spec/{app → support}/models/page.rb +0 -0
  305. data/spec/{app → support}/models/page_question.rb +0 -0
  306. data/spec/{app → support}/models/palette.rb +1 -1
  307. data/spec/{app → support}/models/parent.rb +0 -0
  308. data/spec/{app → support}/models/parent_doc.rb +0 -0
  309. data/spec/{app → support}/models/passport.rb +0 -0
  310. data/spec/{app → support}/models/patient.rb +0 -0
  311. data/spec/{app → support}/models/pdf_writer.rb +0 -0
  312. data/spec/{app → support}/models/pencil.rb +0 -0
  313. data/spec/{app → support}/models/person.rb +1 -1
  314. data/spec/{app → support}/models/pet.rb +0 -0
  315. data/spec/{app → support}/models/pet_owner.rb +0 -0
  316. data/spec/{app → support}/models/phone.rb +0 -0
  317. data/spec/support/models/piano.rb +5 -0
  318. data/spec/{app → support}/models/pizza.rb +0 -0
  319. data/spec/{app → support}/models/player.rb +0 -0
  320. data/spec/{app → support}/models/post.rb +0 -0
  321. data/spec/{app → support}/models/post_genre.rb +0 -0
  322. data/spec/{app → support}/models/powerup.rb +0 -0
  323. data/spec/{app → support}/models/preference.rb +0 -0
  324. data/spec/{app → support}/models/princess.rb +0 -0
  325. data/spec/{app → support}/models/product.rb +0 -0
  326. data/spec/support/models/profile.rb +18 -0
  327. data/spec/{app → support}/models/pronunciation.rb +0 -0
  328. data/spec/{app → support}/models/pub.rb +0 -0
  329. data/spec/support/models/publication.rb +5 -0
  330. data/spec/{app → support}/models/publication/encyclopedia.rb +0 -0
  331. data/spec/{app → support}/models/publication/review.rb +0 -0
  332. data/spec/{app → support}/models/purchase.rb +0 -0
  333. data/spec/{app → support}/models/question.rb +0 -0
  334. data/spec/{app → support}/models/quiz.rb +0 -0
  335. data/spec/{app → support}/models/rating.rb +0 -0
  336. data/spec/{app → support}/models/record.rb +0 -0
  337. data/spec/{app → support}/models/registry.rb +0 -0
  338. data/spec/{app → support}/models/role.rb +0 -0
  339. data/spec/{app → support}/models/root_category.rb +0 -0
  340. data/spec/{app → support}/models/sandwich.rb +0 -0
  341. data/spec/{app → support}/models/scheduler.rb +0 -0
  342. data/spec/{app/models/profile.rb → support/models/scribe.rb} +2 -2
  343. data/spec/support/models/seat.rb +25 -0
  344. data/spec/{app → support}/models/seo.rb +0 -0
  345. data/spec/{app → support}/models/series.rb +0 -0
  346. data/spec/{app → support}/models/server.rb +0 -0
  347. data/spec/{app → support}/models/service.rb +0 -0
  348. data/spec/{app → support}/models/shape.rb +2 -2
  349. data/spec/{app → support}/models/shelf.rb +0 -0
  350. data/spec/{app → support}/models/shipment_address.rb +0 -0
  351. data/spec/{app → support}/models/shipping_container.rb +0 -0
  352. data/spec/{app → support}/models/shipping_pack.rb +0 -0
  353. data/spec/{app → support}/models/shop.rb +0 -0
  354. data/spec/{app → support}/models/short_agent.rb +0 -0
  355. data/spec/{app → support}/models/short_quiz.rb +0 -0
  356. data/spec/{app → support}/models/simple.rb +0 -0
  357. data/spec/{app → support}/models/slave.rb +0 -0
  358. data/spec/{app → support}/models/song.rb +0 -0
  359. data/spec/{app → support}/models/sound.rb +0 -0
  360. data/spec/{app → support}/models/square.rb +0 -0
  361. data/spec/{app → support}/models/staff.rb +0 -0
  362. data/spec/{app → support}/models/store_as_dup_test1.rb +0 -0
  363. data/spec/{app → support}/models/store_as_dup_test2.rb +0 -0
  364. data/spec/{app → support}/models/store_as_dup_test3.rb +0 -0
  365. data/spec/{app → support}/models/store_as_dup_test4.rb +0 -0
  366. data/spec/{app → support}/models/strategy.rb +0 -0
  367. data/spec/{app → support}/models/sub_item.rb +0 -0
  368. data/spec/{app → support}/models/subscription.rb +0 -0
  369. data/spec/{app → support}/models/survey.rb +0 -0
  370. data/spec/{app → support}/models/symptom.rb +0 -0
  371. data/spec/support/models/system_role.rb +7 -0
  372. data/spec/{app → support}/models/tag.rb +0 -0
  373. data/spec/{app → support}/models/target.rb +0 -0
  374. data/spec/{app → support}/models/template.rb +0 -0
  375. data/spec/{app → support}/models/thing.rb +0 -0
  376. data/spec/{app → support}/models/title.rb +0 -0
  377. data/spec/{app → support}/models/tool.rb +2 -2
  378. data/spec/{app → support}/models/topping.rb +0 -0
  379. data/spec/support/models/toy.rb +10 -0
  380. data/spec/{app → support}/models/track.rb +0 -0
  381. data/spec/{app → support}/models/translation.rb +0 -0
  382. data/spec/{app → support}/models/tree.rb +0 -0
  383. data/spec/{app → support}/models/truck.rb +2 -0
  384. data/spec/{app → support}/models/updatable.rb +0 -0
  385. data/spec/{app → support}/models/user.rb +0 -0
  386. data/spec/{app → support}/models/user_account.rb +0 -0
  387. data/spec/{app → support}/models/validation_callback.rb +0 -0
  388. data/spec/{app → support}/models/vehicle.rb +7 -2
  389. data/spec/{app → support}/models/version.rb +0 -0
  390. data/spec/{app → support}/models/vertex.rb +0 -0
  391. data/spec/{app → support}/models/vet_visit.rb +0 -0
  392. data/spec/{app → support}/models/video.rb +0 -0
  393. data/spec/{app → support}/models/video_game.rb +0 -0
  394. data/spec/{app → support}/models/weapon.rb +0 -0
  395. data/spec/{app → support}/models/wiki_page.rb +0 -0
  396. data/spec/{app → support}/models/word.rb +0 -0
  397. data/spec/{app → support}/models/word_origin.rb +0 -0
  398. data/spec/{app → support}/models/writer.rb +2 -2
  399. data/spec/support/spec_config.rb +1 -1
  400. metadata +617 -508
  401. metadata.gz.sig +3 -4
  402. data/lib/mongoid/matchable/all.rb +0 -30
  403. data/lib/mongoid/matchable/and.rb +0 -32
  404. data/lib/mongoid/matchable/default.rb +0 -121
  405. data/lib/mongoid/matchable/elem_match.rb +0 -36
  406. data/lib/mongoid/matchable/eq.rb +0 -23
  407. data/lib/mongoid/matchable/exists.rb +0 -25
  408. data/lib/mongoid/matchable/gt.rb +0 -25
  409. data/lib/mongoid/matchable/gte.rb +0 -25
  410. data/lib/mongoid/matchable/in.rb +0 -26
  411. data/lib/mongoid/matchable/lt.rb +0 -25
  412. data/lib/mongoid/matchable/lte.rb +0 -25
  413. data/lib/mongoid/matchable/ne.rb +0 -23
  414. data/lib/mongoid/matchable/nin.rb +0 -24
  415. data/lib/mongoid/matchable/nor.rb +0 -38
  416. data/lib/mongoid/matchable/or.rb +0 -35
  417. data/lib/mongoid/matchable/regexp.rb +0 -30
  418. data/lib/mongoid/matchable/size.rb +0 -23
  419. data/spec/app/models/publication.rb +0 -5
  420. data/spec/mongoid/matchable/all_spec.rb +0 -34
  421. data/spec/mongoid/matchable/and_spec.rb +0 -190
  422. data/spec/mongoid/matchable/default_spec.rb +0 -140
  423. data/spec/mongoid/matchable/elem_match_spec.rb +0 -109
  424. data/spec/mongoid/matchable/eq_spec.rb +0 -49
  425. data/spec/mongoid/matchable/exists_spec.rb +0 -60
  426. data/spec/mongoid/matchable/gt_spec.rb +0 -89
  427. data/spec/mongoid/matchable/gte_spec.rb +0 -87
  428. data/spec/mongoid/matchable/in_spec.rb +0 -52
  429. data/spec/mongoid/matchable/lt_spec.rb +0 -88
  430. data/spec/mongoid/matchable/lte_spec.rb +0 -88
  431. data/spec/mongoid/matchable/ne_spec.rb +0 -49
  432. data/spec/mongoid/matchable/nin_spec.rb +0 -51
  433. data/spec/mongoid/matchable/nor_spec.rb +0 -210
  434. data/spec/mongoid/matchable/or_spec.rb +0 -134
  435. data/spec/mongoid/matchable/regexp_spec.rb +0 -62
  436. data/spec/mongoid/matchable/size_spec.rb +0 -28
  437. data/spec/mongoid/matchable_spec.rb +0 -856
@@ -2,33 +2,86 @@
2
2
  # encoding: utf-8
3
3
 
4
4
  require 'spec_helper'
5
+ require 'mongoid/association/referenced/has_one_models'
5
6
 
6
7
  describe 'has_one associations' do
7
8
  context 'destroying parent in transaction with dependent child' do
8
9
  require_transaction_support
9
10
 
10
- let(:person) { Person.create! }
11
- let(:game) { Game.create!(person: person) }
11
+ let(:college) { HomCollege.create! }
12
+ let(:address) { HomAddress.create!(college: college) }
12
13
 
13
14
  before do
14
- Person.delete_all
15
- Game.delete_all
16
-
17
- game
15
+ HomCollege.delete_all
16
+ HomAddress.delete_all
18
17
  end
19
18
 
20
- it 'works' do
21
- Person.count.should == 1
22
- Game.count.should == 1
19
+ context 'dependent: :destroy' do
20
+ before do
21
+ HomCollege.class_eval do
22
+ has_one :address, class_name: 'HomAddress', dependent: :destroy
23
+ end
24
+ end
25
+
26
+ it 'destroys' do
27
+ address
28
+
29
+ HomCollege.count.should == 1
30
+ HomAddress.count.should == 1
23
31
 
24
- Person.with_session do |session|
25
- session.with_transaction do
26
- person.destroy
32
+ HomCollege.with_session do |session|
33
+ session.with_transaction do
34
+ college.destroy!
35
+ end
27
36
  end
37
+
38
+ HomCollege.count.should == 0
39
+ HomAddress.count.should == 0
40
+ end
41
+ end
42
+
43
+ context 'dependent: :restrict_with_error' do
44
+ before do
45
+ HomCollege.class_eval do
46
+ has_one :address, class_name: 'HomAddress', dependent: :restrict_with_error
47
+ end
48
+ end
49
+
50
+ it 'does not destroy' do
51
+ address
52
+
53
+ HomCollege.count.should == 1
54
+ HomAddress.count.should == 1
55
+
56
+ lambda do
57
+ HomCollege.with_session do |session|
58
+ session.with_transaction do
59
+ college.destroy!
60
+ end
61
+ end
62
+ end.should raise_error(Mongoid::Errors::DocumentNotDestroyed)
63
+
64
+ HomCollege.count.should == 1
65
+ HomAddress.count.should == 1
28
66
  end
67
+ end
68
+ end
29
69
 
30
- Person.count.should == 0
31
- Game.count.should == 0
70
+ context 'when child does not have parent association' do
71
+ context 'Child.new' do
72
+ it 'creates a child instance' do
73
+ HomBusDriver.new.should be_a(HomBusDriver)
74
+ end
75
+ end
76
+
77
+ context 'assignment to child in parent' do
78
+ let(:parent) { HomBus.new }
79
+
80
+ it 'raises InverseNotFound' do
81
+ lambda do
82
+ parent.driver = HomBusDriver.new
83
+ end.should raise_error(Mongoid::Errors::InverseNotFound)
84
+ end
32
85
  end
33
86
  end
34
87
 
@@ -0,0 +1,116 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require 'spec_helper'
5
+
6
+ describe 'nested attributes assignment' do
7
+ context 'when creating parent document' do
8
+ context 'when setting deeply nested attributes' do
9
+ context 'embeds_many' do
10
+ let(:truck) { Truck.new }
11
+
12
+ it 'persists all documents' do
13
+ truck.attributes = {
14
+ capacity: 1,
15
+ crates_attributes: {
16
+ '0' => {
17
+ volume: 2,
18
+ toys_attributes: {
19
+ '0' => {
20
+ name: 'Bear',
21
+ },
22
+ },
23
+ },
24
+ },
25
+ }
26
+
27
+ truck.save!
28
+
29
+ _truck = Truck.find(truck.id)
30
+ _truck.capacity.should == 1
31
+ _truck.crates.length.should == 1
32
+ _truck.crates.first.volume.should == 2
33
+ _truck.crates.first.toys.length.should == 1
34
+ _truck.crates.first.toys.first.name.should == 'Bear'
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ context 'when updating parent document' do
41
+ context 'when setting deeply nested attributes' do
42
+ context 'embeds_many' do
43
+ let(:truck) do
44
+ Truck.create!(
45
+ capacity: 1,
46
+ crates: [Crate.new(
47
+ volume: 2,
48
+ toys: [Toy.new(name: 'Bear')],
49
+ )],
50
+ )
51
+ end
52
+
53
+ context 'updating embedded documents' do
54
+
55
+ it 'persists all documents' do
56
+ truck.attributes = {
57
+ capacity: 2,
58
+ crates_attributes: {
59
+ '0' => {
60
+ id: truck.crates.first.id,
61
+ volume: 3,
62
+ toys_attributes: {
63
+ '0' => {
64
+ id: truck.crates.first.toys.first.id,
65
+ name: 'Rhino',
66
+ },
67
+ },
68
+ },
69
+ },
70
+ }
71
+
72
+ truck.save!
73
+
74
+ _truck = Truck.find(truck.id)
75
+ _truck.capacity.should == 2
76
+ _truck.crates.length.should == 1
77
+ _truck.crates.first.volume.should == 3
78
+ _truck.crates.first.toys.length.should == 1
79
+ _truck.crates.first.toys.first.name.should == 'Rhino'
80
+ end
81
+ end
82
+
83
+ context 'adding embedded documents' do
84
+
85
+ it 'persists all changes' do
86
+ truck.attributes = {
87
+ capacity: 2,
88
+ crates_attributes: {
89
+ '0' => {
90
+ volume: 3,
91
+ toys_attributes: {
92
+ '0' => {
93
+ name: 'Rhino',
94
+ },
95
+ },
96
+ },
97
+ },
98
+ }
99
+
100
+ truck.save!
101
+
102
+ _truck = Truck.find(truck.id)
103
+ _truck.capacity.should == 2
104
+ _truck.crates.length.should == 2
105
+ _truck.crates.first.volume.should == 2
106
+ _truck.crates.first.toys.length.should == 1
107
+ _truck.crates.first.toys.first.name.should == 'Bear'
108
+ _truck.crates.last.volume.should == 3
109
+ _truck.crates.last.toys.length.should == 1
110
+ _truck.crates.last.toys.last.name.should == 'Rhino'
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require "spec_helper"
5
+
6
+ describe Mongoid::Atomic::Modifiers do
7
+
8
+ let(:modifiers) do
9
+ described_class.new
10
+ end
11
+
12
+ context 'when performing multiple operations with similar keys' do
13
+
14
+ let(:pushes) do
15
+ { "addresses.0.locations" => { "street" => "Bond St" } }
16
+ end
17
+
18
+ let(:similar1) do
19
+ { "dresses" => { "color" => "red" } }
20
+ end
21
+
22
+ let(:similar2) do
23
+ { "ses.0.foo" => { "baz" => "qux" } }
24
+ end
25
+
26
+ before do
27
+ modifiers.send(operation, pushes)
28
+ modifiers.send(operation, similar1)
29
+ modifiers.send(operation, similar2)
30
+ end
31
+
32
+ context "push" do
33
+ let(:operation) { :push }
34
+
35
+ it "adds all modifiers to top level" do
36
+ expect(modifiers).to eq({ "$push" => {
37
+ "addresses.0.locations" => { '$each' => [{ "street" => "Bond St" }] },
38
+ "dresses" => { '$each' => [{ "color" => "red" }] },
39
+ "ses.0.foo" => { '$each' => [{ "baz" => "qux" }] }
40
+ } })
41
+ end
42
+ end
43
+
44
+ context "pull" do
45
+ let(:operation) { :pull }
46
+
47
+ it "adds all modifiers to top level" do
48
+ expect(modifiers).to eq({ "$pull" => {
49
+ "addresses.0.locations" => { "street" => "Bond St" },
50
+ "dresses" => { "color" => "red" },
51
+ "ses.0.foo" => { "baz" => "qux" },
52
+ } })
53
+ end
54
+ end
55
+
56
+ context "pull_all" do
57
+ let(:operation) { :pull_all }
58
+
59
+ it "adds all modifiers to top level" do
60
+ expect(modifiers).to eq({ "$pullAll" => {
61
+ "addresses.0.locations" => { "street" => "Bond St" },
62
+ "dresses" => { "color" => "red" },
63
+ "ses.0.foo" => { "baz" => "qux" },
64
+ } })
65
+ end
66
+ end
67
+
68
+ context "add_to_set" do
69
+ let(:operation) { :add_to_set }
70
+
71
+ it "adds all modifiers to top level" do
72
+ expect(modifiers).to eq({ "$addToSet" => {
73
+ "addresses.0.locations" => { '$each' => { "street" => "Bond St" } },
74
+ "dresses" => { '$each' => { "color" => "red" } },
75
+ "ses.0.foo" => { '$each' => { "baz" => "qux" } }
76
+ } })
77
+ end
78
+ end
79
+
80
+ context "set" do
81
+ let(:operation) { :set }
82
+
83
+ it "adds all modifiers to top level" do
84
+ expect(modifiers).to eq({ "$set" => {
85
+ "addresses.0.locations" => { "street" => "Bond St" },
86
+ "dresses" => { "color" => "red" },
87
+ "ses.0.foo" => { "baz" => "qux" },
88
+ } })
89
+ end
90
+ end
91
+
92
+ context "unset" do
93
+ let(:operation) { :unset }
94
+
95
+ let(:pushes) do
96
+ [:foobar]
97
+ end
98
+
99
+ let(:similar1) do
100
+ [:foo]
101
+ end
102
+
103
+ let(:similar2) do
104
+ [:bar]
105
+ end
106
+
107
+ it "adds all modifiers to top level" do
108
+ expect(modifiers).to eq("$unset" => {
109
+ foobar: true,
110
+ foo: true,
111
+ bar: true,
112
+ })
113
+ end
114
+ end
115
+ end
116
+
117
+ end
@@ -0,0 +1,354 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require 'spec_helper'
5
+
6
+ describe "#discriminator_key" do
7
+
8
+ context "when the discriminator key is not set on a class" do
9
+ let(:piano) do
10
+ Piano.new
11
+ end
12
+
13
+ let(:guitar) do
14
+ Guitar.new
15
+ end
16
+
17
+ it "sets the child discriminator key to _type: Piano" do
18
+ expect(piano._type).to eq("Piano")
19
+ end
20
+
21
+ it "sets the child discriminator key to _type: Guitar" do
22
+ expect(guitar._type).to eq("Guitar")
23
+ end
24
+ end
25
+
26
+ context "when the discriminator key is changed in the parent" do
27
+ before do
28
+ Instrument.discriminator_key = "hello2"
29
+ end
30
+
31
+ after do
32
+ Instrument.discriminator_key = nil
33
+ end
34
+
35
+ let(:piano) do
36
+ Piano.new
37
+ end
38
+
39
+ let(:guitar) do
40
+ Guitar.new
41
+ end
42
+
43
+ it "changes in the child class: Piano" do
44
+ expect(piano.hello2).to eq("Piano")
45
+ end
46
+
47
+ it "changes in the child class: Guitar" do
48
+ expect(guitar.hello2).to eq("Guitar")
49
+ end
50
+ end
51
+
52
+ context "when the discriminator key is changed at the base level" do
53
+ context "after class creation" do
54
+ before do
55
+ class GlobalIntDiscriminatorParent
56
+ include Mongoid::Document
57
+ end
58
+
59
+ class GlobalIntDiscriminatorChild < GlobalIntDiscriminatorParent
60
+ end
61
+
62
+ Mongoid.discriminator_key = "test"
63
+ end
64
+
65
+ after do
66
+ Mongoid.discriminator_key = "_type"
67
+ end
68
+
69
+ let(:child) do
70
+ GlobalIntDiscriminatorChild.new
71
+ end
72
+
73
+ it "has a discriminator key _type" do
74
+ expect(child._type).to eq("GlobalIntDiscriminatorChild")
75
+ end
76
+
77
+ it "does not have the new global value as a field" do
78
+ expect(defined?(child.test)).to be nil
79
+ end
80
+ end
81
+
82
+ context "before class creation" do
83
+ before do
84
+ Mongoid.discriminator_key = "test"
85
+
86
+ class PreGlobalIntDiscriminatorParent
87
+ include Mongoid::Document
88
+ end
89
+
90
+ class PreGlobalIntDiscriminatorChild < PreGlobalIntDiscriminatorParent
91
+ end
92
+ end
93
+
94
+ after do
95
+ Mongoid.discriminator_key = "_type"
96
+ end
97
+
98
+ let(:child) do
99
+ PreGlobalIntDiscriminatorChild.new
100
+ end
101
+
102
+ it "creates a field with new discriminator key" do
103
+ expect(child.test).to eq("PreGlobalIntDiscriminatorChild")
104
+ end
105
+
106
+ it "does not have the default value as a field" do
107
+ expect(defined?(child._type)).to be nil
108
+ end
109
+ end
110
+ end
111
+
112
+ context "when the discriminator key is changed in the parent" do
113
+ context "after child class creation" do
114
+ before do
115
+ class LocalIntDiscriminatorParent
116
+ include Mongoid::Document
117
+ end
118
+
119
+ class LocalIntDiscriminatorChild < LocalIntDiscriminatorParent
120
+ end
121
+
122
+ LocalIntDiscriminatorParent.discriminator_key = "test2"
123
+ end
124
+
125
+ let(:child) do
126
+ LocalIntDiscriminatorChild.new
127
+ end
128
+
129
+ it "still has _type field in the child" do
130
+ expect(child._type).to include("LocalIntDiscriminatorChild")
131
+ end
132
+
133
+ it "has the new field in the child" do
134
+ expect(child.test2).to include("LocalIntDiscriminatorChild")
135
+ end
136
+ end
137
+
138
+ context "before child class creation" do
139
+ before do
140
+ class PreLocalIntDiscriminatorParent
141
+ include Mongoid::Document
142
+ self.discriminator_key = "test2"
143
+ end
144
+
145
+ class PreLocalIntDiscriminatorChild < PreLocalIntDiscriminatorParent
146
+ end
147
+ end
148
+
149
+ let(:child) do
150
+ PreLocalIntDiscriminatorChild.new
151
+ end
152
+
153
+ it "creates a new field in the child" do
154
+ expect(child.test2).to include("PreLocalIntDiscriminatorChild")
155
+ end
156
+
157
+ it "does not have the default value as a field" do
158
+ expect(defined?(child._type)).to be nil
159
+ end
160
+ end
161
+ end
162
+
163
+ context "when adding to the db" do
164
+ context "when changing the discriminator_key" do
165
+ before do
166
+ class DBDiscriminatorParent
167
+ include Mongoid::Document
168
+ self.discriminator_key = "dkey"
169
+ end
170
+
171
+ class DBDiscriminatorChild < DBDiscriminatorParent
172
+ end
173
+ DBDiscriminatorChild.create!
174
+ end
175
+
176
+ it "has the correct count" do
177
+ expect(DBDiscriminatorChild.count).to eq(1)
178
+ end
179
+
180
+ it "has the correct count in the parent" do
181
+ expect(DBDiscriminatorParent.count).to eq(1)
182
+ end
183
+ end
184
+
185
+ context "when changing the discriminator_key after saving to the db" do
186
+ before do
187
+ class DBDiscriminatorParent
188
+ include Mongoid::Document
189
+ end
190
+
191
+ class DBDiscriminatorChild < DBDiscriminatorParent
192
+ end
193
+ DBDiscriminatorChild.create!
194
+ DBDiscriminatorParent.discriminator_key = "dkey2"
195
+ DBDiscriminatorChild.create!
196
+ end
197
+
198
+ it "only finds the documents with the new discriminator key" do
199
+ expect(DBDiscriminatorChild.count).to eq(1)
200
+ end
201
+
202
+ it "has the correct count in the parent" do
203
+ expect(DBDiscriminatorParent.count).to eq(2)
204
+ end
205
+ end
206
+ end
207
+
208
+ context "documentation tests" do
209
+
210
+ context "Example 1" do
211
+ before do
212
+ class Example1Shape
213
+ include Mongoid::Document
214
+ field :x, type: Integer
215
+ field :y, type: Integer
216
+ embedded_in :canvas
217
+
218
+ self.discriminator_key = "shape_type"
219
+ end
220
+
221
+ class Example1Circle < Example1Shape
222
+ field :radius, type: Float
223
+ end
224
+
225
+ class Example1Rectangle < Example1Shape
226
+ field :width, type: Float
227
+ field :height, type: Float
228
+ end
229
+ end
230
+
231
+ let(:rectangle) do
232
+ Example1Rectangle.new
233
+ end
234
+
235
+ let(:circle) do
236
+ Example1Circle.new
237
+ end
238
+
239
+ it "has the new discriminator key: Rectangle" do
240
+ expect(rectangle.shape_type).to eq("Example1Rectangle")
241
+ end
242
+
243
+ it "does not have the default discriminator key: Rectangle" do
244
+ expect(defined?(rectangle._type)).to be nil
245
+ end
246
+
247
+ it "has the new discriminator key: Circle" do
248
+ expect(circle.shape_type).to eq("Example1Circle")
249
+ end
250
+
251
+ it "does not have the default discriminator key: Circle" do
252
+ expect(defined?(circle._type)).to be nil
253
+ end
254
+ end
255
+
256
+ context "Example 2" do
257
+ before do
258
+ class Example2Shape
259
+ include Mongoid::Document
260
+ field :x, type: Integer
261
+ field :y, type: Integer
262
+ embedded_in :canvas
263
+ end
264
+
265
+ class Example2Circle < Example2Shape
266
+ field :radius, type: Float
267
+ end
268
+
269
+ class Example2Rectangle < Example2Shape
270
+ field :width, type: Float
271
+ field :height, type: Float
272
+ end
273
+
274
+ Example2Shape.discriminator_key = "shape_type"
275
+ end
276
+
277
+ let(:rectangle) do
278
+ Example2Rectangle.new
279
+ end
280
+
281
+ let(:circle) do
282
+ Example2Circle.new
283
+ end
284
+
285
+ it "has the new discriminator key: Rectangle" do
286
+ expect(rectangle.shape_type).to eq("Example2Rectangle")
287
+ end
288
+
289
+ it "has default discriminator key: Rectangle" do
290
+ expect(rectangle._type).to eq("Example2Rectangle")
291
+ end
292
+
293
+ it "has the new discriminator key: Circle" do
294
+ expect(circle.shape_type).to eq("Example2Circle")
295
+ end
296
+
297
+ it "has default discriminator key: Circle" do
298
+ expect(circle._type).to eq("Example2Circle")
299
+ end
300
+ end
301
+
302
+ context "Example 3" do
303
+ before do
304
+
305
+ Mongoid.discriminator_key = "shape_type"
306
+
307
+ class Example3Shape
308
+ include Mongoid::Document
309
+ field :x, type: Integer
310
+ field :y, type: Integer
311
+ embedded_in :canvas
312
+ end
313
+
314
+ class Example3Circle < Example3Shape
315
+ field :radius, type: Float
316
+ end
317
+
318
+ class Example3Rectangle < Example3Shape
319
+ field :width, type: Float
320
+ field :height, type: Float
321
+ end
322
+
323
+ end
324
+
325
+ after do
326
+ Mongoid.discriminator_key = "_type"
327
+ end
328
+
329
+ let(:rectangle) do
330
+ Example3Rectangle.new
331
+ end
332
+
333
+ let(:circle) do
334
+ Example3Circle.new
335
+ end
336
+
337
+ it "has the new discriminator key: Rectangle" do
338
+ expect(rectangle.shape_type).to eq("Example3Rectangle")
339
+ end
340
+
341
+ it "does not have the default discriminator key: Rectangle" do
342
+ expect(defined?(rectangle._type)).to be nil
343
+ end
344
+
345
+ it "has the new discriminator key: Circle" do
346
+ expect(circle.shape_type).to eq("Example3Circle")
347
+ end
348
+
349
+ it "does not have the default discriminator key: Circle" do
350
+ expect(defined?(circle._type)).to be nil
351
+ end
352
+ end
353
+ end
354
+ end