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
@@ -85,4 +85,30 @@ describe Mongoid::Document do
85
85
  end
86
86
  end
87
87
  end
88
+
89
+ context 'Regexp field' do
90
+ shared_examples "persists strings as regexp" do |type|
91
+ it 'persists strings as regexp' do
92
+ mop = Mop.create!(regexp_field: 'foo')
93
+ expect(mop.regexp_field).to be_a Regexp
94
+ expect(Mop.find(mop.id).regexp_field).to be_a BSON::Regexp::Raw
95
+ expect(
96
+ Mop.collection.find(
97
+ "_id" => mop.id,
98
+ "regexp_field" => { "$type" => type }
99
+ ).count
100
+ ).to be == 1
101
+ end
102
+ end
103
+
104
+ context "< 3.2" do
105
+ max_server_version("3.1")
106
+ include_examples "persists strings as regexp", 11
107
+ end
108
+
109
+ context ">= 3.2" do
110
+ min_server_version("3.2")
111
+ it_behaves_like "persists strings as regexp", "regex"
112
+ end
113
+ end
88
114
  end
@@ -116,7 +116,50 @@ describe Mongoid::Document do
116
116
  end
117
117
 
118
118
  it "should clear descendants' cache" do
119
- expect(Person._types).to include(descendant.to_s)
119
+ expect(Person._types).to include(descendant.discriminator_value)
120
+ end
121
+ end
122
+ end
123
+
124
+ describe "._mongoid_clear_types" do
125
+
126
+ context "when changing the discriminator_value" do
127
+
128
+ before do
129
+ Kangaroo._types
130
+ Kangaroo.discriminator_value = "dvalue"
131
+ end
132
+
133
+ after do
134
+ Kangaroo.discriminator_value = nil
135
+ end
136
+
137
+ it "has the correct _types" do
138
+ expect(Kangaroo._types).to eq(["dvalue"])
139
+ end
140
+ end
141
+
142
+ context "when changing the discriminator_value in child" do
143
+
144
+ before do
145
+ Shape._types
146
+ Circle.discriminator_value = "dvalue"
147
+ end
148
+
149
+ after do
150
+ Circle.discriminator_value = nil
151
+ end
152
+
153
+ it "has the correct _types" do
154
+ expect(Circle._types).to eq(["dvalue"])
155
+ end
156
+
157
+ it "has the new Circle discriminator value" do
158
+ expect(Shape._types).to include("dvalue")
159
+ end
160
+
161
+ it "doesn't have the old Circle discriminator value" do
162
+ expect(Shape._types).to_not include("Cirlce")
120
163
  end
121
164
  end
122
165
  end
@@ -881,27 +924,58 @@ describe Mongoid::Document do
881
924
  end
882
925
 
883
926
  context "when no embedded documents are present" do
927
+ context "when using the default discriminator key" do
928
+ let(:person) do
929
+ manager.becomes(Person)
930
+ end
884
931
 
885
- let(:person) do
886
- manager.becomes(Person)
887
- end
932
+ it "copies attributes" do
933
+ expect(person.title).to eq('Sir')
934
+ end
888
935
 
889
- it "copies attributes" do
890
- expect(person.title).to eq('Sir')
891
- end
936
+ it "keeps the same object id" do
937
+ expect(person.id).to eq(manager.id)
938
+ end
892
939
 
893
- it "keeps the same object id" do
894
- expect(person.id).to eq(manager.id)
940
+ it "sets the class type" do
941
+ expect(person._type).to eq("Person")
942
+ end
943
+
944
+ it "raises an error when inappropriate class is provided" do
945
+ expect {
946
+ manager.becomes(String)
947
+ }.to raise_error(ArgumentError, /A class which includes Mongoid::Document is expected/)
948
+ end
895
949
  end
896
950
 
897
- it "sets the class type" do
898
- expect(person._type).to eq("Person")
951
+ context "when using a custom discriminator key" do
952
+ before do
953
+ Person.discriminator_key = "dkey"
954
+ end
955
+
956
+ after do
957
+ Person.discriminator_key = nil
958
+ end
959
+
960
+ it "sets the class type with new discriminator key" do
961
+ expect(person.dkey).to eq("Person")
962
+ end
899
963
  end
900
964
 
901
- it "raises an error when inappropriate class is provided" do
902
- expect {
903
- manager.becomes(String)
904
- }.to raise_error(ArgumentError)
965
+ context "when using a custom discriminator key and discriminator value" do
966
+ before do
967
+ Person.discriminator_key = "dkey"
968
+ Person.discriminator_value = "dvalue"
969
+ end
970
+
971
+ after do
972
+ Person.discriminator_key = nil
973
+ Person.discriminator_value = nil
974
+ end
975
+
976
+ it "sets the class type with new discriminator key" do
977
+ expect(person.dkey).to eq("dvalue")
978
+ end
905
979
  end
906
980
  end
907
981
 
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  # encoding: utf-8
3
3
 
4
- # -*- coding: utf-8 -*-
5
4
  require "spec_helper"
6
5
 
7
6
  describe Mongoid::Equality do
@@ -19,7 +19,7 @@ describe Mongoid::Errors::DeleteRestriction do
19
19
 
20
20
  it "contains the summary in the message" do
21
21
  expect(error.message).to include(
22
- "When defining 'drugs' with a :dependent => :restrict,"
22
+ "When defining 'drugs' with a :dependent => :restrict_with_error,"
23
23
  )
24
24
  end
25
25
 
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require "spec_helper"
5
+
6
+ describe Mongoid::StringifiedSymbol do
7
+
8
+ describe ".demongoize" do
9
+
10
+ context "when the object is not a symbol" do
11
+
12
+ it "returns the symbol" do
13
+ expect(Mongoid::StringifiedSymbol.demongoize("test")).to eq(:test)
14
+ end
15
+ end
16
+
17
+ context "when the object is a symbol" do
18
+
19
+ it "returns the symbol" do
20
+ expect(Mongoid::StringifiedSymbol.demongoize(:test)).to eq(:test)
21
+ end
22
+ end
23
+
24
+ context "when the object is a BSON Symbol" do
25
+
26
+ it "returns a symbol" do
27
+ expect(Mongoid::StringifiedSymbol.demongoize(BSON::Symbol::Raw.new(:test))).to eq(:test)
28
+ end
29
+ end
30
+
31
+
32
+ context "when the object is an integer" do
33
+
34
+ it "returns a symbol" do
35
+ expect(Mongoid::StringifiedSymbol.demongoize(14)).to eq(:"14")
36
+ end
37
+ end
38
+
39
+ context "when the object is nil" do
40
+
41
+ it "returns nil" do
42
+ expect(Mongoid::StringifiedSymbol.demongoize(nil)).to be_nil
43
+ end
44
+ end
45
+ end
46
+
47
+ describe ".mongoize" do
48
+
49
+ context "when the object is not a symbol" do
50
+
51
+ it "returns the object" do
52
+ expect(Mongoid::StringifiedSymbol.mongoize("test")).to eq("test")
53
+ end
54
+
55
+ it "returns the string" do
56
+ expect(Mongoid::StringifiedSymbol.mongoize([0,1,2])).to eq("[0, 1, 2]")
57
+ end
58
+
59
+ it "returns the string" do
60
+ expect(Mongoid::StringifiedSymbol.mongoize(2)).to eq("2")
61
+ end
62
+ end
63
+
64
+ context "when the object is a symbol" do
65
+
66
+ it "returns a string" do
67
+ expect(Mongoid::StringifiedSymbol.mongoize(:test)).to eq("test")
68
+ end
69
+ end
70
+
71
+ context "when the object is nil" do
72
+
73
+ it "returns nil" do
74
+ expect(Mongoid::StringifiedSymbol.mongoize(nil)).to be_nil
75
+ end
76
+ end
77
+ end
78
+
79
+ describe "#mongoize" do
80
+
81
+ it "returns self" do
82
+ expect(:test.mongoize).to eq(:test)
83
+ end
84
+ end
85
+ end
@@ -78,28 +78,98 @@ describe Mongoid::Factory do
78
78
  end
79
79
 
80
80
  context "when type is not preset" do
81
+ context "when using the default discriminator key" do
82
+ let(:attributes) do
83
+ { "title" => "Sir" }
84
+ end
81
85
 
82
- let(:attributes) do
83
- { "title" => "Sir" }
84
- end
86
+ let(:person) do
87
+ described_class.build(Person, attributes)
88
+ end
85
89
 
86
- let(:person) do
87
- described_class.build(Person, attributes)
88
- end
90
+ it "instantiates based on the provided class" do
91
+ expect(person.title).to eq("Sir")
92
+ end
89
93
 
90
- it "instantiates based on the provided class" do
91
- expect(person.title).to eq("Sir")
94
+ context "when the type is a symbol" do
95
+
96
+ let(:person) do
97
+ described_class.build(Person, { :_type => "Doctor" })
98
+ end
99
+
100
+ it "instantiates the subclass" do
101
+ expect(person.class).to eq(Doctor)
102
+ end
103
+ end
92
104
  end
93
- end
94
105
 
95
- context "when the type is a symbol" do
106
+ context "when using a custom discriminator key" do
107
+ before do
108
+ Person.discriminator_key = "dkey"
109
+ end
96
110
 
97
- let(:person) do
98
- described_class.build(Person, { :_type => "Doctor" })
111
+ after do
112
+ Person.discriminator_key = nil
113
+ end
114
+
115
+ let(:attributes) do
116
+ { "title" => "Sir" }
117
+ end
118
+
119
+ let(:person) do
120
+ described_class.build(Person, attributes)
121
+ end
122
+
123
+ it "instantiates based on the provided class" do
124
+ expect(person.title).to eq("Sir")
125
+ end
126
+
127
+ context "when the type is a symbol" do
128
+
129
+ let(:person) do
130
+ described_class.build(Person, { :dkey => "Doctor" })
131
+ end
132
+
133
+ it "instantiates the subclass" do
134
+ expect(person.class).to eq(Doctor)
135
+ end
136
+ end
99
137
  end
100
138
 
101
- it "instantiates the subclass" do
102
- expect(person.class).to eq(Doctor)
139
+ context "when using a custom discriminator key and value" do
140
+ before do
141
+ Person.discriminator_key = "dkey"
142
+ Doctor.discriminator_value = "dvalue"
143
+ end
144
+
145
+ after do
146
+ Person.discriminator_key = nil
147
+ Doctor.discriminator_value = nil
148
+ end
149
+
150
+ let(:attributes) do
151
+ { "title" => "Sir", "dkey" => "dvalue" }
152
+ end
153
+
154
+ let(:doctor) do
155
+ described_class.build(Person, attributes)
156
+ end
157
+
158
+ it "instantiates based on the provided class" do
159
+ expect(doctor.title).to eq("Sir")
160
+ end
161
+
162
+ it "generates based on the provided class" do
163
+ expect(doctor).to be_a(Person)
164
+ end
165
+
166
+ it "sets the attributes" do
167
+ expect(doctor.title).to eq("Sir")
168
+ end
169
+
170
+ it "has the correct discriminator key/value" do
171
+ expect(doctor.dkey).to eq("dvalue")
172
+ end
103
173
  end
104
174
  end
105
175
  end
@@ -109,15 +179,64 @@ describe Mongoid::Factory do
109
179
  context "when the attributes are nil" do
110
180
 
111
181
  let(:document) do
112
- described_class.from_db(Animal, nil)
182
+ described_class.from_db(model_cls, nil)
113
183
  end
114
184
 
115
- it "generates based on the provided class" do
116
- expect(document).to be_a(Animal)
185
+ context 'when model class does not use inheritance' do
186
+ context 'when model overwrites _id field to not have a default' do
187
+ let(:model_cls) { Idnodef }
188
+
189
+ it "generates based on the provided class" do
190
+ expect(document).to be_a(model_cls)
191
+ end
192
+
193
+ it "sets the attributes to empty" do
194
+ expect(document.attributes).to be_empty
195
+ end
196
+ end
197
+
198
+ context 'with default _id auto-assignment behavior' do
199
+ let(:model_cls) { Agency }
200
+
201
+ it "generates based on the provided class" do
202
+ expect(document).to be_a(model_cls)
203
+ end
204
+
205
+ it "sets the attributes to generated _id only" do
206
+ document.attributes.should == {'_id' => document.id}
207
+ end
208
+ end
209
+ end
210
+
211
+ context 'when model class is an inheritance root' do
212
+ let(:model_cls) { Address }
213
+
214
+ before do
215
+ # Ensure a child is defined
216
+ ShipmentAddress.superclass.should be model_cls
217
+ end
218
+
219
+ it "generates based on the provided class" do
220
+ expect(document).to be_a(model_cls)
221
+ end
222
+
223
+ it "sets the attributes to _type only" do
224
+ # Note that Address provides the _id override.
225
+ document.attributes.should == {'_type' => 'Address'}
226
+ end
117
227
  end
118
228
 
119
- it "sets the attributes to empty" do
120
- expect(document.attributes).to be_empty
229
+ context 'when model class is an inheritance leaf' do
230
+ let(:model_cls) { ShipmentAddress }
231
+
232
+ it "generates based on the provided class" do
233
+ expect(document).to be_a(model_cls)
234
+ end
235
+
236
+ it "sets the attributes to empty" do
237
+ # Note that Address provides the _id override.
238
+ document.attributes.should == {'_type' => 'ShipmentAddress'}
239
+ end
121
240
  end
122
241
  end
123
242
 
@@ -179,20 +298,80 @@ describe Mongoid::Factory do
179
298
 
180
299
  context "when a type is not in the attributes" do
181
300
 
182
- let(:attributes) do
183
- { "title" => "Sir" }
184
- end
301
+ context "when using the default discriminator key" do
302
+ let(:attributes) do
303
+ { "title" => "Sir" }
304
+ end
185
305
 
186
- let(:document) do
187
- described_class.from_db(Person, attributes)
306
+ let(:document) do
307
+ described_class.from_db(Person, attributes)
308
+ end
309
+
310
+ it "generates based on the provided class" do
311
+ expect(document).to be_a(Person)
312
+ end
313
+
314
+ it "sets the attributes" do
315
+ expect(document.title).to eq("Sir")
316
+ end
188
317
  end
189
318
 
190
- it "generates based on the provided class" do
191
- expect(document).to be_a(Person)
319
+ context "when using a custom discriminator key" do
320
+ before do
321
+ Person.discriminator_key = "dkey"
322
+ end
323
+
324
+ after do
325
+ Person.discriminator_key = nil
326
+ end
327
+
328
+ let(:attributes) do
329
+ { "title" => "Sir" }
330
+ end
331
+
332
+ let(:document) do
333
+ described_class.from_db(Person, attributes)
334
+ end
335
+
336
+ it "generates based on the provided class" do
337
+ expect(document).to be_a(Person)
338
+ end
339
+
340
+ it "sets the attributes" do
341
+ expect(document.title).to eq("Sir")
342
+ end
192
343
  end
193
344
 
194
- it "sets the attributes" do
195
- expect(document.title).to eq("Sir")
345
+ context "when using a custom discriminator key and discriminator value" do
346
+ before do
347
+ Person.discriminator_key = "dkey"
348
+ Person.discriminator_value = "dvalue"
349
+ end
350
+
351
+ after do
352
+ Person.discriminator_key = nil
353
+ Person.discriminator_value = nil
354
+ end
355
+
356
+ let(:attributes) do
357
+ { "title" => "Sir" }
358
+ end
359
+
360
+ let(:document) do
361
+ described_class.from_db(Person, attributes)
362
+ end
363
+
364
+ it "generates based on the provided class" do
365
+ expect(document).to be_a(Person)
366
+ end
367
+
368
+ it "sets the attributes" do
369
+ expect(document.title).to eq("Sir")
370
+ end
371
+
372
+ it "has the correct discriminator key/value" do
373
+ expect(document.dkey).to eq("dvalue")
374
+ end
196
375
  end
197
376
  end
198
377
 
@@ -211,7 +390,61 @@ describe Mongoid::Factory do
211
390
  person
212
391
  }.to raise_exception(Mongoid::Errors::UnknownModel)
213
392
  end
393
+ end
394
+
395
+ context 'when type does not correspond to a Class name with custom discriminator key' do
396
+
397
+ before do
398
+ Person.discriminator_key = "dkey"
399
+ end
400
+
401
+ after do
402
+ Person.discriminator_key = nil
403
+ end
404
+
405
+ let(:attributes) do
406
+ { "title" => "Sir", "dkey" => "invalid_class_name" }
407
+ end
408
+
409
+ let(:person) do
410
+ described_class.from_db(Person, attributes)
411
+ end
412
+
413
+ it 'raises a exception' do
414
+ expect {
415
+ person
416
+ }.to raise_exception(Mongoid::Errors::UnknownModel)
417
+ end
418
+ end
419
+
420
+ context 'when type does not correspond to a custom discriminator_value' do
421
+ before do
422
+ Person.discriminator_value = "dvalue"
423
+ end
424
+
425
+ after do
426
+ Person.discriminator_value = nil
427
+ end
214
428
 
429
+ let(:attributes) do
430
+ { "title" => "Sir", "_type" => "dvalue" }
431
+ end
432
+
433
+ let(:person) do
434
+ described_class.from_db(Person, attributes)
435
+ end
436
+
437
+ it "generates based on the provided class" do
438
+ expect(person).to be_a(Person)
439
+ end
440
+
441
+ it "sets the attributes" do
442
+ expect(person.title).to eq("Sir")
443
+ end
444
+
445
+ it "has the correct discriminator key/value" do
446
+ expect(person._type).to eq("dvalue")
447
+ end
215
448
  end
216
449
 
217
450
  context 'when type is correct but the instantiation raises a NoMethodError' do