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
@@ -143,29 +143,84 @@ describe Mongoid::Persistable::Creatable do
143
143
  end
144
144
 
145
145
  context "when the document is a subclass of a root class" do
146
+ context "when using the default discriminator key" do
147
+ let!(:browser) do
148
+ Browser.create(version: 3, name: "Test")
149
+ end
146
150
 
147
- let!(:browser) do
148
- Browser.create(version: 3, name: "Test")
149
- end
151
+ let(:collection) do
152
+ Canvas.collection
153
+ end
150
154
 
151
- let(:collection) do
152
- Canvas.collection
153
- end
155
+ let(:attributes) do
156
+ collection.find({ name: "Test"}).first
157
+ end
154
158
 
155
- let(:attributes) do
156
- collection.find({ name: "Test"}).first
157
- end
159
+ it "persists the versions" do
160
+ expect(attributes["version"]).to eq(3)
161
+ end
158
162
 
159
- it "persists the versions" do
160
- expect(attributes["version"]).to eq(3)
163
+ it "persists the type" do
164
+ expect(attributes["_type"]).to eq("Browser")
165
+ end
166
+
167
+ it "persists the attributes" do
168
+ expect(attributes["name"]).to eq("Test")
169
+ end
161
170
  end
162
171
 
163
- it "persists the type" do
164
- expect(attributes["_type"]).to eq("Browser")
172
+ context "when using a custom discriminator key" do
173
+ before do
174
+ Canvas.discriminator_key = "dkey"
175
+ end
176
+
177
+ after do
178
+ Canvas.discriminator_key = nil
179
+ end
180
+
181
+ let!(:browser) do
182
+ Browser.create(version: 3, name: "Test")
183
+ end
184
+
185
+ let(:collection) do
186
+ Canvas.collection
187
+ end
188
+
189
+ let(:attributes) do
190
+ collection.find({ name: "Test"}).first
191
+ end
192
+
193
+ it "persists the new discriminator key" do
194
+ expect(attributes["dkey"]).to eq("Browser")
195
+ end
165
196
  end
166
197
 
167
- it "persists the attributes" do
168
- expect(attributes["name"]).to eq("Test")
198
+ context "when using a custom discriminator key and discriminator value" do
199
+ before do
200
+ Canvas.discriminator_key = "dkey"
201
+ Browser.discriminator_value = "dvalue"
202
+ end
203
+
204
+ after do
205
+ Canvas.discriminator_key = nil
206
+ Browser.discriminator_value = nil
207
+ end
208
+
209
+ let!(:browser) do
210
+ Browser.create(version: 3, name: "Test")
211
+ end
212
+
213
+ let(:collection) do
214
+ Canvas.collection
215
+ end
216
+
217
+ let(:attributes) do
218
+ collection.find({ name: "Test"}).first
219
+ end
220
+
221
+ it "persists the new discriminator key" do
222
+ expect(attributes["dkey"]).to eq("dvalue")
223
+ end
169
224
  end
170
225
  end
171
226
 
@@ -207,7 +262,7 @@ describe Mongoid::Persistable::Creatable do
207
262
  expect(Canvas.where(name: "Testy").first).to eq(firefox)
208
263
  end
209
264
 
210
- it "returnss on of this subclasses if you find by _type" do
265
+ it "returns on of this subclasses if you find by _type" do
211
266
  expect(Canvas.where(:_type.in => ['Firefox']).count).to eq(1)
212
267
  end
213
268
  end
@@ -266,8 +321,8 @@ describe Mongoid::Persistable::Creatable do
266
321
  end
267
322
 
268
323
  it "does not bleed relations from one subclass to another" do
269
- expect(Truck.relations.keys).to eq(%w/ shipping_container driver bed /)
270
- expect(Car.relations.keys).to eq(%w/ shipping_container driver /)
324
+ expect(Truck.relations.keys).to eq(%w/ shipping_container driver crates seats bed /)
325
+ expect(Car.relations.keys).to eq(%w/ shipping_container driver crates seats /)
271
326
  end
272
327
 
273
328
  context "when appending new documents" do
@@ -343,17 +398,45 @@ describe Mongoid::Persistable::Creatable do
343
398
  end
344
399
 
345
400
  context "#find_or_initialize_by" do
401
+ context "when using the default discriminator key" do
402
+ before do
403
+ container.vehicles.find_or_initialize_by({ driver_id: driver.id }, Car)
404
+ end
346
405
 
347
- before do
348
- container.vehicles.find_or_initialize_by({ driver_id: driver.id }, Car)
349
- end
406
+ it "initializes the given type document" do
407
+ expect(container.vehicles.map(&:class)).to eq([ Car ])
408
+ end
350
409
 
351
- it "initializes the given type document" do
352
- expect(container.vehicles.map(&:class)).to eq([ Car ])
410
+ it "initializes with the given attributes" do
411
+ expect(container.vehicles.map(&:driver)).to eq([ driver ])
412
+ end
413
+
414
+ it "initializes with a type field that equals the class" do
415
+ expect(
416
+ container.vehicles.first.attributes["_type"]
417
+ ).to eq("Car")
418
+ end
353
419
  end
354
420
 
355
- it "initializes with the given attributes" do
356
- expect(container.vehicles.map(&:driver)).to eq([ driver ])
421
+ context "when using a custom discriminator key" do
422
+ before do
423
+ Vehicle.discriminator_key = "dkey"
424
+ container.vehicles.find_or_initialize_by({ driver_id: driver.id }, Car)
425
+ end
426
+
427
+ it "initializes the given type document" do
428
+ expect(container.vehicles.map(&:class)).to eq([ Car ])
429
+ end
430
+
431
+ it "initializes with the given attributes" do
432
+ expect(container.vehicles.map(&:driver)).to eq([ driver ])
433
+ end
434
+
435
+ it "initializes with a dkey field that equals the class" do
436
+ expect(
437
+ container.vehicles.first.attributes["dkey"]
438
+ ).to eq("Car")
439
+ end
357
440
  end
358
441
  end
359
442
 
@@ -173,6 +173,92 @@ describe Mongoid::Persistable::Deletable do
173
173
  end
174
174
  end
175
175
  end
176
+
177
+ context "when deleting all documents with a custom discriminator key" do
178
+ before do
179
+ Canvas.discriminator_key = "dkey"
180
+ end
181
+
182
+ after do
183
+ Canvas.discriminator_key = nil
184
+ end
185
+
186
+ let!(:firefox) do
187
+ Firefox.create(name: "firefox")
188
+ end
189
+
190
+ let!(:firefox2) do
191
+ Firefox.create(name: "firefox 2")
192
+ end
193
+
194
+ let!(:browser) do
195
+ Browser.create(name: "browser")
196
+ end
197
+
198
+ let!(:canvas) do
199
+ Canvas.create(name: "canvas")
200
+ end
201
+
202
+ before do
203
+ Firefox.delete_all
204
+ end
205
+
206
+ it "deletes from the parent class collection" do
207
+ expect(Canvas.count).to eq(2)
208
+ end
209
+
210
+ it "returns correct counts for child classes" do
211
+ expect(Firefox.count).to eq(0)
212
+ end
213
+
214
+ it "returns correct counts for root subclasses" do
215
+ expect(Browser.count).to eq(1)
216
+ end
217
+ end
218
+
219
+ context "when deleting all documents with a custom discriminator value" do
220
+ before do
221
+ Canvas.discriminator_key = "dkey"
222
+ Firefox.discriminator_value = "dvalue"
223
+ end
224
+
225
+ after do
226
+ Canvas.discriminator_key = nil
227
+ Firefox.discriminator_value = nil
228
+ end
229
+
230
+ let!(:firefox) do
231
+ Firefox.create(name: "firefox")
232
+ end
233
+
234
+ let!(:firefox2) do
235
+ Firefox.create(name: "firefox 2")
236
+ end
237
+
238
+ let!(:browser) do
239
+ Browser.create(name: "browser")
240
+ end
241
+
242
+ let!(:canvas) do
243
+ Canvas.create(name: "canvas")
244
+ end
245
+
246
+ before do
247
+ Firefox.delete_all
248
+ end
249
+
250
+ it "deletes from the parent class collection" do
251
+ expect(Canvas.count).to eq(2)
252
+ end
253
+
254
+ it "returns correct counts for child classes" do
255
+ expect(Firefox.count).to eq(0)
256
+ end
257
+
258
+ it "returns correct counts for root subclasses" do
259
+ expect(Browser.count).to eq(1)
260
+ end
261
+ end
176
262
  end
177
263
 
178
264
  describe "#delete_all" do
@@ -165,35 +165,35 @@ describe Mongoid::Persistable::Savable do
165
165
 
166
166
  context "when performing modification and insert ops" do
167
167
 
168
- let(:person) do
169
- Person.create(title: "Blah")
168
+ let(:owner) do
169
+ Owner.create(name: "Blah")
170
170
  end
171
171
 
172
- let!(:address) do
173
- person.addresses.build(street: "Bond St")
172
+ let!(:birthday) do
173
+ owner.birthdays.build(title: "First")
174
174
  end
175
175
 
176
- let!(:name) do
177
- person.create_name(first_name: "Tony")
176
+ let!(:scribe) do
177
+ owner.create_scribe(name: "Josh")
178
178
  end
179
179
 
180
180
  let(:from_db) do
181
- Person.find(person.id)
181
+ Owner.find(owner.id)
182
182
  end
183
183
 
184
184
  before do
185
- person.title = "King"
186
- name.first_name = "Ryan"
185
+ owner.name = "King"
186
+ scribe.name = "Tosh"
187
187
  end
188
188
 
189
189
  it "persists with proper set and push modifiers" do
190
- expect(person.atomic_updates).to eq({
190
+ expect(owner.atomic_updates).to eq({
191
191
  "$set" => {
192
- "title" => "King",
193
- "name.first_name" => "Ryan"
192
+ "name" => "King",
193
+ "scribe.name" => "Tosh"
194
194
  },
195
195
  "$push"=> {
196
- "addresses" => { '$each' => [ { "_id" => address.id, "street" => "Bond St" } ] }
196
+ "birthdays" => { '$each' => [ { "_id" => birthday.id, "title" => "First" } ] }
197
197
  }
198
198
  })
199
199
  end
@@ -201,15 +201,15 @@ describe Mongoid::Persistable::Savable do
201
201
  context "when saving the document" do
202
202
 
203
203
  it "saves the root document" do
204
- expect(person.title).to eq("King")
204
+ expect(owner.name).to eq("King")
205
205
  end
206
206
 
207
207
  it "saves embedded many relations" do
208
- expect(person.addresses.first.street).to eq("Bond St")
208
+ expect(owner.birthdays.first.title).to eq("First")
209
209
  end
210
210
 
211
211
  it "saves embedded one relations" do
212
- expect(person.name.first_name).to eq("Ryan")
212
+ expect(owner.scribe.name).to eq("Tosh")
213
213
  end
214
214
  end
215
215
  end
@@ -258,6 +258,164 @@ describe Mongoid::Persistable::Savable do
258
258
  end
259
259
  end
260
260
 
261
+ context 'when adding documents to embedded associations on multiple levels' do
262
+ let!(:truck) { Truck.create! }
263
+ let!(:crate) { truck.crates.create!(volume: 0.4) }
264
+
265
+ it 'persists the new documents' do
266
+ expect(truck.crates.size).to eq 1
267
+ expect(truck.crates[0].volume).to eq 0.4
268
+ expect(truck.crates[0].toys.size).to eq 0
269
+
270
+ truck.crates.first.toys.build(name: "Teddy bear")
271
+ truck.crates.build(volume: 0.8)
272
+
273
+ # The following is equivalent to the two lines above:
274
+ #
275
+ # truck.crates_attributes = {
276
+ # '0' => {
277
+ # "toys_attributes" => {
278
+ # "0" => {
279
+ # "name" => "Teddy bear"
280
+ # }
281
+ # },
282
+ # "id" => crate.id.to_s
283
+ # },
284
+ # "1" => {
285
+ # "volume" => 0.8
286
+ # }
287
+ # }
288
+
289
+ expect(truck.crates.size).to eq 2
290
+ expect(truck.crates[0].volume).to eq 0.4
291
+ expect(truck.crates[0].toys.size).to eq 1
292
+ expect(truck.crates[0].toys[0].name).to eq "Teddy bear"
293
+ expect(truck.crates[1].volume).to eq 0.8
294
+ expect(truck.crates[1].toys.size).to eq 0
295
+
296
+ #expect(truck.atomic_updates[:conflicts]).to eq nil
297
+
298
+ expect { truck.save! }.not_to raise_error
299
+
300
+ _truck = Truck.find(truck.id)
301
+ expect(_truck.crates.size).to eq 2
302
+ expect(_truck.crates[0].volume).to eq 0.4
303
+ expect(_truck.crates[0].toys.size).to eq 1
304
+ expect(_truck.crates[0].toys[0].name).to eq "Teddy bear"
305
+ expect(_truck.crates[1].volume).to eq 0.8
306
+ expect(_truck.crates[1].toys.size).to eq 0
307
+ end
308
+ end
309
+
310
+ context 'when adding documents to embedded association and updating parent fields' do
311
+ let!(:truck) { Truck.create! }
312
+ let!(:crate) { truck.crates.create!(volume: 0.4) }
313
+
314
+ it 'performs all writes' do
315
+ truck.crates.build(volume: 1)
316
+ truck.crates.first.volume = 2
317
+
318
+ truck.save!
319
+
320
+ _truck = Truck.find(truck.id)
321
+ _truck.crates.length.should == 2
322
+ _truck.crates.first.volume.should == 2
323
+ _truck.crates.last.volume.should == 1
324
+ end
325
+ end
326
+
327
+ context 'when adding documents to nested embedded association and updating first association fields' do
328
+ let!(:truck) { Truck.create! }
329
+ let!(:seat) { truck.seats.create!(rating: 1) }
330
+
331
+ it 'performs all writes' do
332
+ truck.seats.first.armrests.build(side: 'left')
333
+ truck.seats.first.rating = 2
334
+
335
+ truck.save!
336
+
337
+ _truck = Truck.find(truck.id)
338
+ _truck.seats.length.should == 1
339
+ _truck.seats.first.armrests.length.should == 1
340
+ _truck.seats.first.armrests.first.side.should == 'left'
341
+ end
342
+ end
343
+
344
+ context 'when adding documents to nested embedded association and adding another top level association' do
345
+ let!(:truck) { Truck.create! }
346
+ let!(:crate) { truck.crates.create!(volume: 1) }
347
+
348
+ it 'performs all writes' do
349
+ truck.crates.first.toys.build(name: 'Bear')
350
+ truck.crates.build
351
+
352
+ truck.save!
353
+
354
+ _truck = Truck.find(truck.id)
355
+ _truck.crates.length.should == 2
356
+ _truck.crates.first.toys.length.should == 1
357
+ _truck.crates.first.toys.first.name.should == 'Bear'
358
+ _truck.crates.last.toys.length.should == 0
359
+ end
360
+
361
+ context 'when also updating first embedded top level association' do
362
+ it 'performs all writes' do
363
+ pending 'https://jira.mongodb.org/browse/MONGOID-4982'
364
+
365
+ truck.crates.first.volume = 2
366
+ truck.crates.first.toys.build(name: 'Bear')
367
+ truck.crates.build
368
+
369
+ truck.save!
370
+
371
+ _truck = Truck.find(truck.id)
372
+ _truck.crates.length.should == 2
373
+ _truck.crates.first.toys.length.should == 1
374
+ _truck.crates.first.toys.first.name.should == 'Bear'
375
+ _truck.crates.last.toys.length.should == 0
376
+ end
377
+ end
378
+ end
379
+
380
+ context 'when adding documents to embedded associations with cascaded callbacks on update' do
381
+ let!(:truck) { Truck.create! }
382
+ let!(:seat) { truck.seats.create!(rating: 1) }
383
+
384
+ it 'persists the new documents' do
385
+ expect(truck.seats.size).to eq 1
386
+ expect(truck.seats[0].rating).to eq 1
387
+
388
+ truck.seats.build
389
+
390
+ expect { truck.save! }.not_to raise_error
391
+
392
+ _truck = Truck.find(truck.id)
393
+ expect(_truck.seats.size).to eq 2
394
+ expect(_truck.seats[0].rating).to eq 1
395
+ expect(_truck.seats[1].rating).to eq 100
396
+ end
397
+
398
+ context 'when embedded association embeds another association' do
399
+ it 'persists the new documents' do
400
+ pending 'https://jira.mongodb.org/browse/MONGOID-4982'
401
+
402
+ expect(truck.seats.size).to eq 1
403
+ expect(truck.seats[0].rating).to eq 1
404
+
405
+ truck.seats.first.armrests.build
406
+ truck.seats.build
407
+
408
+ expect { truck.save! }.not_to raise_error
409
+
410
+ _truck = Truck.find(truck.id)
411
+ expect(_truck.seats.size).to eq 2
412
+ expect(_truck.seats[0].rating).to eq 1
413
+ expect(_truck.seats[0].armrests.length).to eq 1
414
+ expect(_truck.seats[1].rating).to eq 100
415
+ end
416
+ end
417
+ end
418
+
261
419
  context "when removing elements without using delete or destroy" do
262
420
 
263
421
  let!(:person) do