mongoid 7.1.6 → 7.2.2

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 (465) 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 +31 -0
  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/atomic/modifiers.rb +1 -1
  16. data/lib/mongoid/attributes.rb +8 -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 +103 -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 +36 -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 +31 -0
  55. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  56. data/lib/mongoid/matcher/field_expression.rb +62 -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 +7 -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/lib/rails/generators/mongoid/config/config_generator.rb +8 -1
  78. data/spec/README.md +19 -4
  79. data/spec/integration/app_spec.rb +175 -88
  80. data/spec/integration/associations/embedded_spec.rb +94 -0
  81. data/spec/integration/associations/has_many_spec.rb +67 -14
  82. data/spec/integration/associations/has_one_spec.rb +67 -14
  83. data/spec/integration/associations/nested_attributes_assignment_spec.rb +116 -0
  84. data/spec/integration/atomic/modifiers_spec.rb +117 -0
  85. data/spec/integration/callbacks_models.rb +49 -0
  86. data/spec/integration/callbacks_spec.rb +216 -0
  87. data/spec/integration/discriminator_key_spec.rb +354 -0
  88. data/spec/integration/discriminator_value_spec.rb +207 -0
  89. data/spec/integration/document_spec.rb +21 -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 +409 -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 +112 -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 +6 -6
  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/attributes_spec.rb +241 -0
  140. data/spec/mongoid/clients/factory_spec.rb +37 -0
  141. data/spec/mongoid/clients/sessions_spec.rb +1 -6
  142. data/spec/mongoid/config_spec.rb +28 -0
  143. data/spec/mongoid/contextual/atomic_spec.rb +17 -4
  144. data/spec/mongoid/contextual/mongo_spec.rb +70 -16
  145. data/spec/mongoid/copyable_spec.rb +197 -18
  146. data/spec/mongoid/copyable_spec_models.rb +28 -0
  147. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +36 -0
  148. data/spec/mongoid/criteria/queryable/selectable_spec.rb +84 -82
  149. data/spec/mongoid/criteria_spec.rb +204 -39
  150. data/spec/mongoid/document_spec.rb +89 -15
  151. data/spec/mongoid/equality_spec.rb +0 -1
  152. data/spec/mongoid/errors/delete_restriction_spec.rb +1 -1
  153. data/spec/mongoid/extensions/stringified_symbol_spec.rb +85 -0
  154. data/spec/mongoid/factory_spec.rb +261 -28
  155. data/spec/mongoid/fields_spec.rb +48 -2
  156. data/spec/mongoid/findable_spec.rb +32 -0
  157. data/spec/mongoid/indexable_spec.rb +28 -2
  158. data/spec/mongoid/inspectable_spec.rb +29 -2
  159. data/spec/mongoid/interceptable_spec.rb +2 -2
  160. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  161. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
  162. data/spec/mongoid/matcher/extract_attribute_spec.rb +37 -0
  163. data/spec/mongoid/persistable/creatable_spec.rb +108 -25
  164. data/spec/mongoid/persistable/deletable_spec.rb +86 -0
  165. data/spec/mongoid/persistable/savable_spec.rb +174 -16
  166. data/spec/mongoid/persistable/settable_spec.rb +30 -0
  167. data/spec/mongoid/query_cache_middleware_spec.rb +16 -3
  168. data/spec/mongoid/query_cache_spec.rb +442 -41
  169. data/spec/mongoid/reloadable_spec.rb +72 -0
  170. data/spec/mongoid/serializable_spec.rb +21 -3
  171. data/spec/mongoid/traversable_spec.rb +1100 -0
  172. data/spec/shared/bin/get-mongodb-download-url +17 -0
  173. data/spec/shared/lib/mrss/cluster_config.rb +11 -1
  174. data/spec/shared/lib/mrss/constraints.rb +34 -0
  175. data/spec/shared/lib/mrss/docker_runner.rb +265 -0
  176. data/spec/shared/lib/mrss/lite_constraints.rb +16 -0
  177. data/spec/shared/lib/mrss/server_version_registry.rb +115 -0
  178. data/spec/shared/lib/mrss/spec_organizer.rb +3 -0
  179. data/spec/shared/lib/mrss/utils.rb +15 -0
  180. data/spec/shared/share/Dockerfile.erb +231 -0
  181. data/spec/shared/shlib/distro.sh +73 -0
  182. data/spec/shared/shlib/server.sh +290 -0
  183. data/spec/shared/shlib/set_env.sh +128 -0
  184. data/spec/spec_helper.rb +4 -2
  185. data/spec/support/constraints.rb +20 -222
  186. data/spec/support/helpers.rb +1 -1
  187. data/spec/{app → support}/models/account.rb +0 -0
  188. data/spec/{app → support}/models/acolyte.rb +0 -0
  189. data/spec/{app → support}/models/actor.rb +1 -1
  190. data/spec/{app → support}/models/actress.rb +0 -0
  191. data/spec/{app → support}/models/address.rb +0 -0
  192. data/spec/{app → support}/models/address_component.rb +0 -0
  193. data/spec/{app → support}/models/address_number.rb +0 -0
  194. data/spec/{app → support}/models/agency.rb +0 -0
  195. data/spec/{app → support}/models/agent.rb +0 -0
  196. data/spec/{app → support}/models/album.rb +0 -0
  197. data/spec/{app → support}/models/alert.rb +0 -0
  198. data/spec/{app → support}/models/animal.rb +0 -0
  199. data/spec/{app → support}/models/answer.rb +0 -0
  200. data/spec/{app → support}/models/appointment.rb +0 -0
  201. data/spec/support/models/armrest.rb +10 -0
  202. data/spec/{app → support}/models/array_field.rb +0 -0
  203. data/spec/{app → support}/models/article.rb +0 -0
  204. data/spec/{app → support}/models/artist.rb +0 -0
  205. data/spec/{app → support}/models/artwork.rb +0 -0
  206. data/spec/{app → support}/models/audio.rb +0 -0
  207. data/spec/{app → support}/models/augmentation.rb +0 -0
  208. data/spec/{app → support}/models/author.rb +0 -0
  209. data/spec/{app → support}/models/baby.rb +0 -0
  210. data/spec/{app → support}/models/band.rb +0 -0
  211. data/spec/{app → support}/models/bar.rb +0 -0
  212. data/spec/{app → support}/models/basic.rb +0 -0
  213. data/spec/{app → support}/models/bed.rb +0 -0
  214. data/spec/{app → support}/models/big_palette.rb +0 -0
  215. data/spec/{app → support}/models/birthday.rb +0 -0
  216. data/spec/{app → support}/models/bomb.rb +0 -0
  217. data/spec/{app → support}/models/book.rb +0 -0
  218. data/spec/{app → support}/models/breed.rb +0 -0
  219. data/spec/{app → support}/models/browser.rb +1 -1
  220. data/spec/{app → support}/models/building.rb +0 -0
  221. data/spec/{app → support}/models/building_address.rb +0 -0
  222. data/spec/{app → support}/models/bus.rb +0 -0
  223. data/spec/{app → support}/models/business.rb +0 -0
  224. data/spec/{app → support}/models/callback_test.rb +0 -0
  225. data/spec/{app → support}/models/canvas.rb +1 -1
  226. data/spec/{app → support}/models/car.rb +0 -0
  227. data/spec/{app → support}/models/cat.rb +0 -0
  228. data/spec/{app → support}/models/category.rb +0 -0
  229. data/spec/{app → support}/models/child.rb +0 -0
  230. data/spec/{app → support}/models/child_doc.rb +0 -0
  231. data/spec/{app → support}/models/church.rb +0 -0
  232. data/spec/{app → support}/models/circle.rb +0 -0
  233. data/spec/{app → support}/models/circuit.rb +0 -0
  234. data/spec/{app → support}/models/circus.rb +0 -0
  235. data/spec/{app → support}/models/code.rb +0 -0
  236. data/spec/{app → support}/models/coding.rb +1 -1
  237. data/spec/{app → support}/models/coding/pull_request.rb +0 -0
  238. data/spec/{app → support}/models/comment.rb +0 -0
  239. data/spec/{app → support}/models/company.rb +0 -0
  240. data/spec/{app → support}/models/consumption_period.rb +0 -0
  241. data/spec/{app → support}/models/contextable_item.rb +0 -0
  242. data/spec/{app → support}/models/contractor.rb +0 -0
  243. data/spec/{app → support}/models/cookie.rb +0 -0
  244. data/spec/{app → support}/models/country_code.rb +0 -0
  245. data/spec/{app → support}/models/courier_job.rb +0 -0
  246. data/spec/support/models/crate.rb +13 -0
  247. data/spec/support/models/customer.rb +11 -0
  248. data/spec/support/models/customer_address.rb +12 -0
  249. data/spec/support/models/deed.rb +8 -0
  250. data/spec/{app → support}/models/definition.rb +0 -0
  251. data/spec/{app → support}/models/delegating_patient.rb +0 -0
  252. data/spec/{app → support}/models/description.rb +0 -0
  253. data/spec/{app → support}/models/dictionary.rb +6 -0
  254. data/spec/{app → support}/models/division.rb +0 -0
  255. data/spec/{app → support}/models/doctor.rb +0 -0
  256. data/spec/{app → support}/models/dog.rb +0 -0
  257. data/spec/{app → support}/models/dokument.rb +0 -0
  258. data/spec/{app → support}/models/draft.rb +0 -0
  259. data/spec/{app → support}/models/dragon.rb +0 -0
  260. data/spec/{app → support}/models/driver.rb +1 -1
  261. data/spec/{app → support}/models/drug.rb +0 -0
  262. data/spec/{app → support}/models/dungeon.rb +0 -0
  263. data/spec/{app → support}/models/edit.rb +0 -0
  264. data/spec/{app → support}/models/email.rb +0 -0
  265. data/spec/{app → support}/models/employer.rb +0 -0
  266. data/spec/{app → support}/models/entry.rb +0 -0
  267. data/spec/{app → support}/models/eraser.rb +0 -0
  268. data/spec/{app → support}/models/even.rb +0 -0
  269. data/spec/{app → support}/models/event.rb +0 -0
  270. data/spec/{app → support}/models/exhibition.rb +0 -0
  271. data/spec/{app → support}/models/exhibitor.rb +0 -0
  272. data/spec/{app → support}/models/explosion.rb +0 -0
  273. data/spec/{app → support}/models/eye.rb +0 -0
  274. data/spec/{app → support}/models/eye_bowl.rb +0 -0
  275. data/spec/{app → support}/models/face.rb +0 -0
  276. data/spec/{app → support}/models/favorite.rb +0 -0
  277. data/spec/{app → support}/models/filesystem.rb +0 -0
  278. data/spec/{app → support}/models/fire_hydrant.rb +0 -0
  279. data/spec/{app → support}/models/firefox.rb +0 -0
  280. data/spec/{app → support}/models/fish.rb +0 -0
  281. data/spec/{app → support}/models/folder.rb +0 -0
  282. data/spec/{app → support}/models/folder_item.rb +0 -0
  283. data/spec/{app → support}/models/fruits.rb +0 -0
  284. data/spec/{app → support}/models/game.rb +0 -0
  285. data/spec/{app → support}/models/ghost.rb +0 -0
  286. data/spec/support/models/guitar.rb +5 -0
  287. data/spec/{app → support}/models/home.rb +0 -0
  288. data/spec/{app → support}/models/house.rb +0 -0
  289. data/spec/{app → support}/models/html_writer.rb +0 -0
  290. data/spec/{app → support}/models/id_key.rb +0 -0
  291. data/spec/support/models/idnodef.rb +8 -0
  292. data/spec/{app → support}/models/image.rb +0 -0
  293. data/spec/{app → support}/models/implant.rb +0 -0
  294. data/spec/support/models/instrument.rb +9 -0
  295. data/spec/{app → support}/models/item.rb +1 -1
  296. data/spec/{app → support}/models/jar.rb +0 -0
  297. data/spec/{app → support}/models/kaleidoscope.rb +0 -0
  298. data/spec/{app → support}/models/kangaroo.rb +0 -0
  299. data/spec/{app → support}/models/label.rb +0 -0
  300. data/spec/{app → support}/models/language.rb +0 -0
  301. data/spec/{app → support}/models/lat_lng.rb +0 -0
  302. data/spec/{app → support}/models/league.rb +0 -0
  303. data/spec/{app → support}/models/learner.rb +0 -0
  304. data/spec/{app → support}/models/line_item.rb +0 -0
  305. data/spec/{app → support}/models/location.rb +0 -0
  306. data/spec/{app → support}/models/login.rb +0 -0
  307. data/spec/{app → support}/models/manufacturer.rb +0 -0
  308. data/spec/{app → support}/models/meat.rb +0 -0
  309. data/spec/{app → support}/models/membership.rb +0 -0
  310. data/spec/{app → support}/models/message.rb +0 -0
  311. data/spec/{app → support}/models/minim.rb +0 -0
  312. data/spec/{app → support}/models/mixed_drink.rb +0 -0
  313. data/spec/support/models/mop.rb +16 -0
  314. data/spec/{app → support}/models/movie.rb +0 -0
  315. data/spec/{app → support}/models/my_hash.rb +0 -0
  316. data/spec/{app → support}/models/name.rb +0 -0
  317. data/spec/{app → support}/models/name_only.rb +0 -0
  318. data/spec/{app → support}/models/node.rb +0 -0
  319. data/spec/{app → support}/models/note.rb +0 -0
  320. data/spec/{app → support}/models/odd.rb +0 -0
  321. data/spec/support/models/order.rb +11 -0
  322. data/spec/{app → support}/models/ordered_post.rb +0 -0
  323. data/spec/{app → support}/models/ordered_preference.rb +0 -0
  324. data/spec/{app → support}/models/oscar.rb +0 -0
  325. data/spec/{app → support}/models/other_owner_object.rb +0 -0
  326. data/spec/{app → support}/models/override.rb +0 -0
  327. data/spec/{app → support}/models/ownable.rb +0 -0
  328. data/spec/{app → support}/models/owner.rb +2 -0
  329. data/spec/{app → support}/models/pack.rb +0 -0
  330. data/spec/{app → support}/models/page.rb +0 -0
  331. data/spec/{app → support}/models/page_question.rb +0 -0
  332. data/spec/{app → support}/models/palette.rb +1 -1
  333. data/spec/{app → support}/models/parent.rb +0 -0
  334. data/spec/{app → support}/models/parent_doc.rb +0 -0
  335. data/spec/{app → support}/models/passport.rb +0 -0
  336. data/spec/{app → support}/models/patient.rb +0 -0
  337. data/spec/{app → support}/models/pdf_writer.rb +0 -0
  338. data/spec/{app → support}/models/pencil.rb +0 -0
  339. data/spec/{app → support}/models/person.rb +1 -1
  340. data/spec/{app → support}/models/pet.rb +0 -0
  341. data/spec/{app → support}/models/pet_owner.rb +0 -0
  342. data/spec/{app → support}/models/phone.rb +0 -0
  343. data/spec/support/models/piano.rb +5 -0
  344. data/spec/{app → support}/models/pizza.rb +0 -0
  345. data/spec/{app → support}/models/player.rb +0 -0
  346. data/spec/{app → support}/models/post.rb +0 -0
  347. data/spec/{app → support}/models/post_genre.rb +0 -0
  348. data/spec/{app → support}/models/powerup.rb +0 -0
  349. data/spec/{app → support}/models/preference.rb +0 -0
  350. data/spec/{app → support}/models/princess.rb +0 -0
  351. data/spec/{app → support}/models/product.rb +0 -0
  352. data/spec/support/models/profile.rb +18 -0
  353. data/spec/{app → support}/models/pronunciation.rb +0 -0
  354. data/spec/{app → support}/models/pub.rb +0 -0
  355. data/spec/support/models/publication.rb +5 -0
  356. data/spec/{app → support}/models/publication/encyclopedia.rb +0 -0
  357. data/spec/{app → support}/models/publication/review.rb +0 -0
  358. data/spec/{app → support}/models/purchase.rb +0 -0
  359. data/spec/{app → support}/models/question.rb +0 -0
  360. data/spec/{app → support}/models/quiz.rb +0 -0
  361. data/spec/{app → support}/models/rating.rb +0 -0
  362. data/spec/{app → support}/models/record.rb +0 -0
  363. data/spec/{app → support}/models/registry.rb +0 -0
  364. data/spec/{app → support}/models/role.rb +0 -0
  365. data/spec/{app → support}/models/root_category.rb +0 -0
  366. data/spec/{app → support}/models/sandwich.rb +0 -0
  367. data/spec/{app → support}/models/scheduler.rb +0 -0
  368. data/spec/{app/models/profile.rb → support/models/scribe.rb} +2 -2
  369. data/spec/support/models/seat.rb +25 -0
  370. data/spec/{app → support}/models/seo.rb +0 -0
  371. data/spec/{app → support}/models/series.rb +0 -0
  372. data/spec/{app → support}/models/server.rb +0 -0
  373. data/spec/{app → support}/models/service.rb +0 -0
  374. data/spec/{app → support}/models/shape.rb +2 -2
  375. data/spec/{app → support}/models/shelf.rb +0 -0
  376. data/spec/{app → support}/models/shipment_address.rb +0 -0
  377. data/spec/{app → support}/models/shipping_container.rb +0 -0
  378. data/spec/{app → support}/models/shipping_pack.rb +0 -0
  379. data/spec/{app → support}/models/shop.rb +0 -0
  380. data/spec/{app → support}/models/short_agent.rb +0 -0
  381. data/spec/{app → support}/models/short_quiz.rb +0 -0
  382. data/spec/{app → support}/models/simple.rb +0 -0
  383. data/spec/{app → support}/models/slave.rb +0 -0
  384. data/spec/{app → support}/models/song.rb +0 -0
  385. data/spec/{app → support}/models/sound.rb +0 -0
  386. data/spec/{app → support}/models/square.rb +0 -0
  387. data/spec/{app → support}/models/staff.rb +0 -0
  388. data/spec/{app → support}/models/store_as_dup_test1.rb +0 -0
  389. data/spec/{app → support}/models/store_as_dup_test2.rb +0 -0
  390. data/spec/{app → support}/models/store_as_dup_test3.rb +0 -0
  391. data/spec/{app → support}/models/store_as_dup_test4.rb +0 -0
  392. data/spec/{app → support}/models/strategy.rb +0 -0
  393. data/spec/{app → support}/models/sub_item.rb +0 -0
  394. data/spec/{app → support}/models/subscription.rb +0 -0
  395. data/spec/{app → support}/models/survey.rb +0 -0
  396. data/spec/{app → support}/models/symptom.rb +0 -0
  397. data/spec/support/models/system_role.rb +7 -0
  398. data/spec/{app → support}/models/tag.rb +0 -0
  399. data/spec/{app → support}/models/target.rb +0 -0
  400. data/spec/{app → support}/models/template.rb +0 -0
  401. data/spec/{app → support}/models/thing.rb +0 -0
  402. data/spec/{app → support}/models/title.rb +0 -0
  403. data/spec/{app → support}/models/tool.rb +2 -2
  404. data/spec/{app → support}/models/topping.rb +0 -0
  405. data/spec/support/models/toy.rb +10 -0
  406. data/spec/{app → support}/models/track.rb +0 -0
  407. data/spec/{app → support}/models/translation.rb +0 -0
  408. data/spec/{app → support}/models/tree.rb +0 -0
  409. data/spec/{app → support}/models/truck.rb +2 -0
  410. data/spec/{app → support}/models/updatable.rb +0 -0
  411. data/spec/{app → support}/models/user.rb +0 -0
  412. data/spec/{app → support}/models/user_account.rb +0 -0
  413. data/spec/{app → support}/models/validation_callback.rb +0 -0
  414. data/spec/{app → support}/models/vehicle.rb +7 -2
  415. data/spec/{app → support}/models/version.rb +0 -0
  416. data/spec/{app → support}/models/vertex.rb +0 -0
  417. data/spec/{app → support}/models/vet_visit.rb +0 -0
  418. data/spec/{app → support}/models/video.rb +0 -0
  419. data/spec/{app → support}/models/video_game.rb +0 -0
  420. data/spec/{app → support}/models/weapon.rb +0 -0
  421. data/spec/{app → support}/models/wiki_page.rb +0 -0
  422. data/spec/{app → support}/models/word.rb +0 -0
  423. data/spec/{app → support}/models/word_origin.rb +0 -0
  424. data/spec/{app → support}/models/writer.rb +2 -2
  425. data/spec/support/spec_config.rb +9 -1
  426. metadata +648 -519
  427. metadata.gz.sig +0 -0
  428. data/lib/mongoid/matchable/all.rb +0 -30
  429. data/lib/mongoid/matchable/and.rb +0 -32
  430. data/lib/mongoid/matchable/default.rb +0 -121
  431. data/lib/mongoid/matchable/elem_match.rb +0 -36
  432. data/lib/mongoid/matchable/eq.rb +0 -23
  433. data/lib/mongoid/matchable/exists.rb +0 -25
  434. data/lib/mongoid/matchable/gt.rb +0 -25
  435. data/lib/mongoid/matchable/gte.rb +0 -25
  436. data/lib/mongoid/matchable/in.rb +0 -26
  437. data/lib/mongoid/matchable/lt.rb +0 -25
  438. data/lib/mongoid/matchable/lte.rb +0 -25
  439. data/lib/mongoid/matchable/ne.rb +0 -23
  440. data/lib/mongoid/matchable/nin.rb +0 -24
  441. data/lib/mongoid/matchable/nor.rb +0 -38
  442. data/lib/mongoid/matchable/or.rb +0 -35
  443. data/lib/mongoid/matchable/regexp.rb +0 -30
  444. data/lib/mongoid/matchable/size.rb +0 -23
  445. data/spec/app/models/publication.rb +0 -5
  446. data/spec/mongoid/matchable/all_spec.rb +0 -34
  447. data/spec/mongoid/matchable/and_spec.rb +0 -190
  448. data/spec/mongoid/matchable/default_spec.rb +0 -140
  449. data/spec/mongoid/matchable/elem_match_spec.rb +0 -109
  450. data/spec/mongoid/matchable/eq_spec.rb +0 -49
  451. data/spec/mongoid/matchable/exists_spec.rb +0 -60
  452. data/spec/mongoid/matchable/gt_spec.rb +0 -89
  453. data/spec/mongoid/matchable/gte_spec.rb +0 -87
  454. data/spec/mongoid/matchable/in_spec.rb +0 -52
  455. data/spec/mongoid/matchable/lt_spec.rb +0 -88
  456. data/spec/mongoid/matchable/lte_spec.rb +0 -88
  457. data/spec/mongoid/matchable/ne_spec.rb +0 -49
  458. data/spec/mongoid/matchable/nin_spec.rb +0 -51
  459. data/spec/mongoid/matchable/nor_spec.rb +0 -210
  460. data/spec/mongoid/matchable/or_spec.rb +0 -134
  461. data/spec/mongoid/matchable/regexp_spec.rb +0 -62
  462. data/spec/mongoid/matchable/size_spec.rb +0 -28
  463. data/spec/mongoid/matchable_spec.rb +0 -856
  464. data/spec/support/child_process_helper.rb +0 -76
  465. data/spec/support/lite_constraints.rb +0 -22
@@ -6,6 +6,9 @@ class HmmCompany
6
6
 
7
7
  field :p, type: Integer
8
8
  has_many :emails, primary_key: :p, foreign_key: :f, class_name: 'HmmEmail'
9
+
10
+ # The addresses are added with different dependency mechanisms in tests:
11
+ #has_many :addresses, class_name: 'HmmAddress', dependent: :destroy
9
12
  end
10
13
 
11
14
  class HmmEmail
@@ -15,6 +18,12 @@ class HmmEmail
15
18
  belongs_to :company, primary_key: :p, foreign_key: :f, class_name: 'HmmCompany'
16
19
  end
17
20
 
21
+ class HmmAddress
22
+ include Mongoid::Document
23
+
24
+ belongs_to :company, class_name: 'HmmCompany'
25
+ end
26
+
18
27
  class HmmSchool
19
28
  include Mongoid::Document
20
29
 
@@ -38,3 +47,15 @@ class HmmTicket
38
47
 
39
48
  belongs_to :person
40
49
  end
50
+
51
+ class HmmBus
52
+ include Mongoid::Document
53
+
54
+ has_many :seats, class_name: 'HmmBusSeat'
55
+ end
56
+
57
+ class HmmBusSeat
58
+ include Mongoid::Document
59
+
60
+ # No belongs_to :bus
61
+ end
@@ -6,6 +6,9 @@ class HomCollege
6
6
 
7
7
  has_one :accreditation, class_name: 'HomAccreditation'
8
8
 
9
+ # The address is added with different dependency mechanisms in tests:
10
+ #has_one :address, class_name: 'HomAddress', dependent: :destroy
11
+
9
12
  field :state, type: String
10
13
  end
11
14
 
@@ -24,6 +27,12 @@ class HomAccreditation::Child
24
27
  belongs_to :hom_college
25
28
  end
26
29
 
30
+ class HomAddress
31
+ include Mongoid::Document
32
+
33
+ belongs_to :college, class_name: 'HomCollege'
34
+ end
35
+
27
36
  module HomNs
28
37
  class PrefixedParent
29
38
  include Mongoid::Document
@@ -49,3 +58,15 @@ class HomPolymorphicChild
49
58
 
50
59
  belongs_to :p_parent, polymorphic: true
51
60
  end
61
+
62
+ class HomBus
63
+ include Mongoid::Document
64
+
65
+ has_one :driver, class_name: 'HomBusDriver'
66
+ end
67
+
68
+ class HomBusDriver
69
+ include Mongoid::Document
70
+
71
+ # No belongs_to :bus
72
+ end
@@ -748,7 +748,7 @@ describe Mongoid::Association::Referenced::HasOne do
748
748
  end
749
749
  end
750
750
 
751
- describe '##inverse' do
751
+ describe '#inverse' do
752
752
 
753
753
  context 'when polymorphic' do
754
754
 
@@ -9,6 +9,26 @@ describe Mongoid::Atomic::Modifiers do
9
9
  described_class.new
10
10
  end
11
11
 
12
+ describe "#push_conflict?" do
13
+ let(:result) { modifiers.send(:push_conflict?, field) }
14
+
15
+ context 'for embeds many subdocument' do
16
+ context 'when another field on subdocument is being set' do
17
+ before do
18
+ modifiers.set('foo.0.a' => 1)
19
+ end
20
+
21
+ let(:field) { 'foo' }
22
+
23
+ it 'does not conflict' do
24
+ pending 'https://jira.mongodb.org/browse/MONGOID-4982'
25
+
26
+ result.should be false
27
+ end
28
+ end
29
+ end
30
+ end
31
+
12
32
  describe "#add_to_set" do
13
33
 
14
34
  context "when the unique adds are empty" do
@@ -344,6 +364,33 @@ describe Mongoid::Atomic::Modifiers do
344
364
  end
345
365
  end
346
366
  end
367
+
368
+ context 'when there is another operation on a sibling of a key which is nested' do
369
+
370
+ let(:first_op) do
371
+ { "addresses.0.name" => 'test' }
372
+ end
373
+
374
+ let(:push_op) do
375
+ { "addresses.0.locations" => { "street" => "Oxford St" } }
376
+ end
377
+
378
+ before do
379
+ modifiers.set(first_op)
380
+ modifiers.push(push_op)
381
+ end
382
+
383
+ it "does not conflict and adds push to top level" do
384
+ pending 'https://jira.mongodb.org/browse/MONGOID-4982'
385
+
386
+ modifiers.should == {
387
+ '$set' => { "addresses.0.name" => 'test' },
388
+ '$push' => {"addresses.0.locations" => {'$each' => [
389
+ { "street" => "Oxford St" },
390
+ ]}},
391
+ }
392
+ end
393
+ end
347
394
  end
348
395
 
349
396
  describe "#set" do
@@ -268,5 +268,46 @@ describe Mongoid::Atomic::Paths do
268
268
  end
269
269
  end
270
270
  end
271
+
272
+ context "when the same class is embedded in multiple associations" do
273
+
274
+ let(:customer) do
275
+ Customer.new
276
+ end
277
+
278
+ context "assignment after saving" do
279
+
280
+ it "correctly sets the association for the embedded class" do
281
+ pending 'MONGOID-5039'
282
+
283
+ customer.home_address = CustomerAddress.new
284
+ customer.work_address = CustomerAddress.new
285
+
286
+ expect(customer.home_address.atomic_path).to eq("home_address")
287
+ expect(customer.work_address.atomic_path).to eq("work_address")
288
+
289
+ customer.save!
290
+
291
+ customer.home_address = CustomerAddress.new
292
+ customer.work_address = CustomerAddress.new
293
+
294
+ expect(customer.home_address.atomic_path).to eq("home_address")
295
+ expect(customer.work_address.atomic_path).to eq("work_address")
296
+ end
297
+ end
298
+
299
+ context "inverse assignment" do
300
+
301
+ it "correctly returns the path for each embedded class" do
302
+ pending 'MONGOID-5039'
303
+
304
+ customer.work_address = CustomerAddress.new
305
+ customer.work_address.addressable = customer
306
+
307
+ expect(customer.home_address.atomic_path).to eq("home_address")
308
+ expect(customer.work_address.atomic_path).to eq("work_address")
309
+ end
310
+ end
311
+ end
271
312
  end
272
313
  end
@@ -362,6 +362,29 @@ describe Mongoid::Atomic do
362
362
  )
363
363
  end
364
364
  end
365
+
366
+ context 'when adding nested embedded docs and updating top level embedded doc' do
367
+ let!(:truck) { Truck.create! }
368
+ let!(:crate) { truck.crates.create!(volume: 1) }
369
+
370
+ before do
371
+ truck.crates.first.volume = 2
372
+ truck.crates.first.toys.build(name: 'Bear')
373
+ truck.crates.build
374
+ end
375
+
376
+ it 'correctly distributes the operations' do
377
+ pending 'https://jira.mongodb.org/browse/MONGOID-4982'
378
+
379
+ truck.atomic_updates.should == {
380
+ '$set' => {'crates.0.volume' => 2},
381
+ '$push' => {'crates.0.toys' => {'$each' => [crate.toys.first.attributes]}},
382
+ conflicts: {
383
+ '$push' => {'crates' => {'$each' => [truck.crates.last.attributes]}},
384
+ },
385
+ }
386
+ end
387
+ end
365
388
  end
366
389
  end
367
390
  end
@@ -234,7 +234,7 @@ describe Mongoid::Attributes::Nested do
234
234
  end
235
235
  end
236
236
 
237
- describe "##{name}_attributes=" do
237
+ describe "*_attributes=" do
238
238
 
239
239
  context "when the parent document is new" do
240
240
 
@@ -245,6 +245,97 @@ describe Mongoid::Attributes do
245
245
  end
246
246
  end
247
247
 
248
+ context "when the field was not explicitly defined" do
249
+
250
+ context "when excluding with only and the field was not excluded" do
251
+
252
+ let(:from_db) do
253
+ Person.only(:_id).first
254
+ end
255
+
256
+ it "raises an error" do
257
+ expect {
258
+ from_db[:undefined_field]
259
+ }.to raise_error(ActiveModel::MissingAttributeError)
260
+ end
261
+ end
262
+
263
+ context "when excluding with without and the field was excluded" do
264
+
265
+ let(:from_db) do
266
+ Person.without(:title).first
267
+ end
268
+
269
+ it "raises an error" do
270
+ expect {
271
+ from_db[:title]
272
+ }.to raise_error(ActiveModel::MissingAttributeError)
273
+ end
274
+ end
275
+
276
+ context "when excluding with without and the field was not excluded" do
277
+
278
+ let(:from_db) do
279
+ Person.without(:title).first
280
+ end
281
+
282
+ it "returns nil" do
283
+ from_db[:undefined_field].should be nil
284
+ end
285
+ end
286
+ end
287
+
288
+ context 'when projecting with #only' do
289
+ let!(:person) do
290
+ Person.create(title: 'sir', name: { first_name: 'Jose', language: { name: 'es' } })
291
+ end
292
+
293
+ context 'when projecting an embedded association' do
294
+ let(:from_db) do
295
+ Person.only(:name).first
296
+ end
297
+
298
+ context 'when retrieving a field of the association using the dot notation' do
299
+
300
+ it 'retrieves the field' do
301
+ pending 'MONGOID-5032, fixed in 7.3'
302
+
303
+ expect(from_db['name.first_name']).to eq 'Jose'
304
+ end
305
+ end
306
+
307
+ context 'when retrieving a field of a nested association using the dot notation' do
308
+ it 'retrieves the field' do
309
+ pending 'MONGOID-5032, fixed in 7.3'
310
+
311
+ expect(from_db['name.language.name']).to eq 'es'
312
+ end
313
+ end
314
+ end
315
+
316
+ context 'when projecting a sub-association of an embedded association' do
317
+ let(:from_db) do
318
+ Person.only('name.language').first
319
+ end
320
+
321
+ context 'when retrieving a field under the projected sub-association' do
322
+ it 'retrieves the field' do
323
+ pending 'MONGOID-5032, fixed in 7.3'
324
+
325
+ expect(from_db['name.language.name']).to eq 'es'
326
+ end
327
+ end
328
+
329
+ context 'when retrieving a non-projected field' do
330
+ it 'raises MissingAttributeError' do
331
+ expect do
332
+ from_db['name.first_name']
333
+ end.to raise_error(ActiveModel::MissingAttributeError)
334
+ end
335
+ end
336
+ end
337
+ end
338
+
248
339
  context "when the attribute does not exist" do
249
340
 
250
341
  before do
@@ -329,6 +420,67 @@ describe Mongoid::Attributes do
329
420
  expect(terms).to eq(true)
330
421
  end
331
422
  end
423
+
424
+ context 'when the field is not explicitly defined' do
425
+ let(:bar) { Bar.new }
426
+
427
+ before do
428
+ bar['missing_field'] = 42
429
+ end
430
+
431
+ it 'writes the value into attributes' do
432
+ bar.attributes.should == {'_id' => bar.id, 'missing_field' => 42}
433
+ end
434
+
435
+ it 'makes the attribute accessible via []' do
436
+ bar['missing_field'].should == 42
437
+ end
438
+
439
+ context 'when writing fields on a document with projection' do
440
+
441
+ let!(:person) do
442
+ Person.create(title: "sir")
443
+ end
444
+
445
+ context "when excluding with only and the field was not excluded" do
446
+
447
+ let(:from_db) do
448
+ Person.only(:_id).first
449
+ end
450
+
451
+ it "raises an error" do
452
+ expect {
453
+ from_db[:undefined_field] = 'x'
454
+ }.to raise_error(ActiveModel::MissingAttributeError)
455
+ end
456
+ end
457
+
458
+ context "when excluding with without and the field was excluded" do
459
+
460
+ let(:from_db) do
461
+ Person.without(:title).first
462
+ end
463
+
464
+ it "raises an error" do
465
+ expect {
466
+ from_db[:title] = 'x'
467
+ }.to raise_error(ActiveModel::MissingAttributeError)
468
+ end
469
+ end
470
+
471
+ context "when excluding with without and the field was not excluded" do
472
+
473
+ let(:from_db) do
474
+ Person.without(:title).first
475
+ end
476
+
477
+ it "writes the value" do
478
+ from_db[:undefined_field] = 'x'
479
+ from_db[:undefined_field].should == 'x'
480
+ end
481
+ end
482
+ end
483
+ end
332
484
  end
333
485
 
334
486
  describe "#_id" do
@@ -893,6 +1045,50 @@ describe Mongoid::Attributes do
893
1045
  expect(person.age_before_type_cast).to eq("old")
894
1046
  end
895
1047
  end
1048
+
1049
+ context 'when reading fields on a document with projection' do
1050
+
1051
+ let!(:person) do
1052
+ Person.create(title: "sir")
1053
+ end
1054
+
1055
+ context "when excluding with only and the field was not excluded" do
1056
+
1057
+ let(:from_db) do
1058
+ Person.only(:_id).first
1059
+ end
1060
+
1061
+ it "raises an error" do
1062
+ expect {
1063
+ from_db.read_attribute(:undefined_field)
1064
+ }.to raise_error(ActiveModel::MissingAttributeError)
1065
+ end
1066
+ end
1067
+
1068
+ context "when excluding with without and the field was excluded" do
1069
+
1070
+ let(:from_db) do
1071
+ Person.without(:title).first
1072
+ end
1073
+
1074
+ it "raises an error" do
1075
+ expect {
1076
+ from_db.read_attribute(:title)
1077
+ }.to raise_error(ActiveModel::MissingAttributeError)
1078
+ end
1079
+ end
1080
+
1081
+ context "when excluding with without and the field was not excluded" do
1082
+
1083
+ let(:from_db) do
1084
+ Person.without(:title).first
1085
+ end
1086
+
1087
+ it "returns nil" do
1088
+ from_db.read_attribute(:undefined_field).should be nil
1089
+ end
1090
+ end
1091
+ end
896
1092
  end
897
1093
 
898
1094
  describe "#attribute_present?" do
@@ -1398,6 +1594,51 @@ describe Mongoid::Attributes do
1398
1594
  expect(dictionary.description).to eq('foo')
1399
1595
  end
1400
1596
  end
1597
+
1598
+ context 'when writing fields on a document with projection' do
1599
+
1600
+ let!(:person) do
1601
+ Person.create(title: "sir")
1602
+ end
1603
+
1604
+ context "when excluding with only and the field was not excluded" do
1605
+
1606
+ let(:from_db) do
1607
+ Person.only(:_id).first
1608
+ end
1609
+
1610
+ it "raises an error" do
1611
+ expect {
1612
+ from_db.write_attribute(:undefined_field, 'x')
1613
+ }.to raise_error(ActiveModel::MissingAttributeError)
1614
+ end
1615
+ end
1616
+
1617
+ context "when excluding with without and the field was excluded" do
1618
+
1619
+ let(:from_db) do
1620
+ Person.without(:title).first
1621
+ end
1622
+
1623
+ it "raises an error" do
1624
+ expect {
1625
+ from_db.write_attribute(:title, 'x')
1626
+ }.to raise_error(ActiveModel::MissingAttributeError)
1627
+ end
1628
+ end
1629
+
1630
+ context "when excluding with without and the field was not excluded" do
1631
+
1632
+ let(:from_db) do
1633
+ Person.without(:title).first
1634
+ end
1635
+
1636
+ it "writes the value" do
1637
+ from_db.write_attribute(:undefined_field, 'x')
1638
+ from_db.read_attribute(:undefined_field).should == 'x'
1639
+ end
1640
+ end
1641
+ end
1401
1642
  end
1402
1643
 
1403
1644
  describe "#typed_value_for" do