mongoid 7.1.10 → 7.2.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (472) 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 +10 -3
  5. data/Rakefile +11 -30
  6. data/lib/config/locales/en.yml +37 -1
  7. data/lib/mongoid.rb +23 -1
  8. data/lib/mongoid/association/depending.rb +1 -6
  9. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +1 -1
  10. data/lib/mongoid/association/many.rb +3 -3
  11. data/lib/mongoid/association/proxy.rb +1 -1
  12. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  13. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +1 -1
  14. data/lib/mongoid/association/referenced/has_many/enumerable.rb +37 -2
  15. data/lib/mongoid/association/referenced/has_many/proxy.rb +9 -2
  16. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  17. data/lib/mongoid/association/referenced/has_one/proxy.rb +1 -6
  18. data/lib/mongoid/atomic/modifiers.rb +1 -1
  19. data/lib/mongoid/attributes.rb +1 -8
  20. data/lib/mongoid/attributes/dynamic.rb +1 -1
  21. data/lib/mongoid/clients/factory.rb +17 -0
  22. data/lib/mongoid/composable.rb +1 -0
  23. data/lib/mongoid/config.rb +3 -0
  24. data/lib/mongoid/contextual/mongo.rb +23 -4
  25. data/lib/mongoid/copyable.rb +2 -2
  26. data/lib/mongoid/criteria.rb +58 -8
  27. data/lib/mongoid/criteria/queryable/key.rb +1 -1
  28. data/lib/mongoid/criteria/queryable/mergeable.rb +2 -2
  29. data/lib/mongoid/criteria/queryable/selectable.rb +21 -6
  30. data/lib/mongoid/criteria/queryable/selector.rb +7 -3
  31. data/lib/mongoid/criteria/queryable/storable.rb +3 -3
  32. data/lib/mongoid/document.rb +17 -6
  33. data/lib/mongoid/errors.rb +7 -0
  34. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +25 -0
  35. data/lib/mongoid/errors/invalid_elem_match_operator.rb +33 -0
  36. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +26 -0
  37. data/lib/mongoid/errors/invalid_expression_operator.rb +28 -0
  38. data/lib/mongoid/errors/invalid_field_operator.rb +33 -0
  39. data/lib/mongoid/errors/invalid_query.rb +41 -0
  40. data/lib/mongoid/errors/mongoid_error.rb +1 -1
  41. data/lib/mongoid/factory.rb +27 -10
  42. data/lib/mongoid/fields/validators/macro.rb +22 -9
  43. data/lib/mongoid/findable.rb +50 -14
  44. data/lib/mongoid/indexable.rb +2 -2
  45. data/lib/mongoid/interceptable.rb +2 -4
  46. data/lib/mongoid/matchable.rb +1 -149
  47. data/lib/mongoid/matcher.rb +127 -0
  48. data/lib/mongoid/matcher/all.rb +22 -0
  49. data/lib/mongoid/matcher/and.rb +21 -0
  50. data/lib/mongoid/matcher/elem_match.rb +35 -0
  51. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  52. data/lib/mongoid/matcher/eq.rb +11 -0
  53. data/lib/mongoid/matcher/eq_impl.rb +32 -0
  54. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +21 -0
  55. data/lib/mongoid/matcher/exists.rb +15 -0
  56. data/lib/mongoid/matcher/expression.rb +40 -0
  57. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  58. data/lib/mongoid/matcher/field_expression.rb +63 -0
  59. data/lib/mongoid/matcher/field_operator.rb +52 -0
  60. data/lib/mongoid/matcher/gt.rb +17 -0
  61. data/lib/mongoid/matcher/gte.rb +17 -0
  62. data/lib/mongoid/matcher/in.rb +25 -0
  63. data/lib/mongoid/matcher/lt.rb +17 -0
  64. data/lib/mongoid/matcher/lte.rb +17 -0
  65. data/lib/mongoid/matcher/ne.rb +16 -0
  66. data/lib/mongoid/matcher/nin.rb +11 -0
  67. data/lib/mongoid/matcher/nor.rb +25 -0
  68. data/lib/mongoid/matcher/not.rb +29 -0
  69. data/lib/mongoid/matcher/or.rb +21 -0
  70. data/lib/mongoid/matcher/regex.rb +41 -0
  71. data/lib/mongoid/matcher/size.rb +26 -0
  72. data/lib/mongoid/persistable/deletable.rb +1 -1
  73. data/lib/mongoid/query_cache.rb +64 -62
  74. data/lib/mongoid/reloadable.rb +2 -7
  75. data/lib/mongoid/serializable.rb +1 -1
  76. data/lib/mongoid/traversable.rb +111 -4
  77. data/lib/mongoid/validatable/associated.rb +1 -1
  78. data/lib/mongoid/validatable/presence.rb +3 -3
  79. data/lib/mongoid/validatable/uniqueness.rb +1 -1
  80. data/lib/mongoid/version.rb +1 -1
  81. data/lib/rails/generators/mongoid/config/config_generator.rb +1 -8
  82. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +1 -1
  83. data/spec/integration/app_spec.rb +88 -178
  84. data/spec/integration/associations/embedded_spec.rb +94 -0
  85. data/spec/integration/associations/has_many_spec.rb +39 -46
  86. data/spec/integration/associations/has_one_spec.rb +39 -46
  87. data/spec/integration/associations/nested_attributes_assignment_spec.rb +116 -0
  88. data/spec/integration/atomic/modifiers_spec.rb +117 -0
  89. data/spec/integration/discriminator_key_spec.rb +354 -0
  90. data/spec/integration/discriminator_value_spec.rb +207 -0
  91. data/spec/integration/document_spec.rb +0 -21
  92. data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +120 -41
  93. data/spec/integration/matcher_operator_data/all.yml +140 -0
  94. data/spec/integration/matcher_operator_data/and.yml +93 -0
  95. data/spec/integration/matcher_operator_data/elem_match.yml +363 -0
  96. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  97. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  98. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  99. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  100. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  101. data/spec/integration/matcher_operator_data/gte.yml +132 -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/lte.yml +132 -0
  109. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  110. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  111. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  112. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  113. data/spec/integration/matcher_operator_data/not.yml +196 -0
  114. data/spec/integration/matcher_operator_data/or.yml +137 -0
  115. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  116. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  117. data/spec/integration/matcher_operator_data/size.yml +174 -0
  118. data/spec/integration/matcher_operator_spec.rb +100 -0
  119. data/spec/integration/matcher_spec.rb +189 -0
  120. data/spec/integration/server_query_spec.rb +142 -0
  121. data/spec/lite_spec_helper.rb +7 -7
  122. data/spec/mongoid/association/depending_spec.rb +78 -26
  123. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +0 -50
  124. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +37 -17
  125. data/spec/mongoid/association/embedded/embeds_many_models.rb +1 -0
  126. data/spec/mongoid/association/embedded/embeds_one_models.rb +1 -0
  127. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +0 -17
  128. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +460 -186
  129. data/spec/mongoid/association/referenced/has_many_models.rb +9 -0
  130. data/spec/mongoid/association/referenced/has_one_models.rb +9 -0
  131. data/spec/mongoid/atomic/modifiers_spec.rb +47 -0
  132. data/spec/mongoid/atomic/paths_spec.rb +0 -41
  133. data/spec/mongoid/atomic_spec.rb +23 -0
  134. data/spec/mongoid/attributes/nested_spec.rb +1 -1
  135. data/spec/mongoid/attributes_spec.rb +0 -241
  136. data/spec/mongoid/clients/factory_spec.rb +37 -0
  137. data/spec/mongoid/clients/options_spec.rb +0 -2
  138. data/spec/mongoid/clients/sessions_spec.rb +1 -6
  139. data/spec/mongoid/config_spec.rb +28 -0
  140. data/spec/mongoid/contextual/atomic_spec.rb +4 -17
  141. data/spec/mongoid/contextual/mongo_spec.rb +70 -16
  142. data/spec/mongoid/copyable_spec.rb +153 -1
  143. data/spec/mongoid/copyable_spec_models.rb +14 -0
  144. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +0 -36
  145. data/spec/mongoid/criteria/queryable/selectable_spec.rb +84 -82
  146. data/spec/mongoid/criteria_spec.rb +204 -43
  147. data/spec/mongoid/document_query_spec.rb +0 -51
  148. data/spec/mongoid/document_spec.rb +89 -15
  149. data/spec/mongoid/errors/delete_restriction_spec.rb +1 -1
  150. data/spec/mongoid/errors/mongoid_error_spec.rb +8 -20
  151. data/spec/mongoid/factory_spec.rb +261 -28
  152. data/spec/mongoid/fields_spec.rb +48 -2
  153. data/spec/mongoid/findable_spec.rb +32 -0
  154. data/spec/mongoid/indexable_spec.rb +28 -2
  155. data/spec/mongoid/inspectable_spec.rb +29 -2
  156. data/spec/mongoid/interceptable_spec.rb +2 -2
  157. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +259 -0
  158. data/spec/mongoid/matcher/extract_attribute_spec.rb +47 -0
  159. data/spec/mongoid/persistable/creatable_spec.rb +108 -25
  160. data/spec/mongoid/persistable/deletable_spec.rb +86 -0
  161. data/spec/mongoid/persistable/savable_spec.rb +174 -16
  162. data/spec/mongoid/persistable/settable_spec.rb +0 -30
  163. data/spec/mongoid/persistable_spec.rb +2 -2
  164. data/spec/mongoid/query_cache_middleware_spec.rb +16 -3
  165. data/spec/mongoid/query_cache_spec.rb +442 -41
  166. data/spec/mongoid/reloadable_spec.rb +72 -0
  167. data/spec/mongoid/serializable_spec.rb +21 -3
  168. data/spec/mongoid/traversable_spec.rb +1100 -0
  169. data/spec/spec_helper.rb +3 -5
  170. data/spec/support/child_process_helper.rb +79 -0
  171. data/spec/support/constraints.rb +250 -0
  172. data/spec/support/helpers.rb +1 -1
  173. data/spec/support/lite_constraints.rb +22 -0
  174. data/spec/{app → support}/models/account.rb +0 -0
  175. data/spec/{app → support}/models/acolyte.rb +0 -0
  176. data/spec/{app → support}/models/actor.rb +1 -1
  177. data/spec/{app → support}/models/actress.rb +0 -0
  178. data/spec/{app → support}/models/address.rb +0 -4
  179. data/spec/{app → support}/models/address_component.rb +0 -0
  180. data/spec/{app → support}/models/address_number.rb +0 -0
  181. data/spec/{app → support}/models/agency.rb +0 -0
  182. data/spec/{app → support}/models/agent.rb +0 -0
  183. data/spec/{app → support}/models/album.rb +0 -0
  184. data/spec/{app → support}/models/alert.rb +0 -0
  185. data/spec/{app → support}/models/animal.rb +0 -0
  186. data/spec/{app → support}/models/answer.rb +0 -0
  187. data/spec/{app → support}/models/appointment.rb +0 -0
  188. data/spec/support/models/armrest.rb +10 -0
  189. data/spec/{app → support}/models/array_field.rb +0 -0
  190. data/spec/{app → support}/models/article.rb +0 -0
  191. data/spec/{app → support}/models/artist.rb +0 -0
  192. data/spec/{app → support}/models/artwork.rb +0 -0
  193. data/spec/{app → support}/models/audio.rb +0 -0
  194. data/spec/{app → support}/models/augmentation.rb +0 -0
  195. data/spec/{app → support}/models/author.rb +0 -0
  196. data/spec/{app → support}/models/baby.rb +0 -0
  197. data/spec/{app → support}/models/band.rb +0 -0
  198. data/spec/{app → support}/models/bar.rb +0 -0
  199. data/spec/{app → support}/models/basic.rb +0 -0
  200. data/spec/{app → support}/models/bed.rb +0 -0
  201. data/spec/{app → support}/models/big_palette.rb +0 -0
  202. data/spec/{app → support}/models/birthday.rb +0 -0
  203. data/spec/{app → support}/models/bomb.rb +0 -0
  204. data/spec/{app → support}/models/book.rb +0 -0
  205. data/spec/{app → support}/models/breed.rb +0 -0
  206. data/spec/{app → support}/models/browser.rb +1 -1
  207. data/spec/{app → support}/models/building.rb +0 -0
  208. data/spec/{app → support}/models/building_address.rb +0 -0
  209. data/spec/{app → support}/models/bus.rb +0 -0
  210. data/spec/{app → support}/models/business.rb +0 -0
  211. data/spec/{app → support}/models/callback_test.rb +0 -0
  212. data/spec/{app → support}/models/canvas.rb +1 -1
  213. data/spec/{app → support}/models/car.rb +0 -0
  214. data/spec/{app → support}/models/cat.rb +0 -0
  215. data/spec/{app → support}/models/category.rb +0 -0
  216. data/spec/{app → support}/models/child.rb +0 -0
  217. data/spec/{app → support}/models/child_doc.rb +0 -0
  218. data/spec/{app → support}/models/church.rb +0 -0
  219. data/spec/{app → support}/models/circle.rb +0 -0
  220. data/spec/{app → support}/models/circuit.rb +0 -0
  221. data/spec/{app → support}/models/circus.rb +0 -0
  222. data/spec/{app → support}/models/code.rb +0 -0
  223. data/spec/{app → support}/models/coding.rb +1 -1
  224. data/spec/{app → support}/models/coding/pull_request.rb +0 -0
  225. data/spec/{app → support}/models/comment.rb +0 -0
  226. data/spec/{app → support}/models/company.rb +0 -0
  227. data/spec/{app → support}/models/consumption_period.rb +0 -0
  228. data/spec/{app → support}/models/contextable_item.rb +0 -0
  229. data/spec/{app → support}/models/contractor.rb +0 -0
  230. data/spec/{app → support}/models/cookie.rb +0 -0
  231. data/spec/{app → support}/models/country_code.rb +0 -0
  232. data/spec/{app → support}/models/courier_job.rb +0 -0
  233. data/spec/support/models/crate.rb +13 -0
  234. data/spec/support/models/deed.rb +8 -0
  235. data/spec/{app → support}/models/definition.rb +0 -0
  236. data/spec/{app → support}/models/delegating_patient.rb +0 -0
  237. data/spec/{app → support}/models/description.rb +0 -0
  238. data/spec/{app → support}/models/dictionary.rb +0 -6
  239. data/spec/{app → support}/models/division.rb +0 -0
  240. data/spec/{app → support}/models/doctor.rb +0 -0
  241. data/spec/{app → support}/models/dog.rb +0 -0
  242. data/spec/{app → support}/models/dokument.rb +0 -0
  243. data/spec/{app → support}/models/draft.rb +0 -0
  244. data/spec/{app → support}/models/dragon.rb +0 -0
  245. data/spec/{app → support}/models/driver.rb +1 -1
  246. data/spec/{app → support}/models/drug.rb +0 -0
  247. data/spec/{app → support}/models/dungeon.rb +0 -0
  248. data/spec/{app → support}/models/edit.rb +0 -0
  249. data/spec/{app → support}/models/email.rb +0 -0
  250. data/spec/{app → support}/models/employer.rb +0 -0
  251. data/spec/{app → support}/models/entry.rb +0 -0
  252. data/spec/{app → support}/models/eraser.rb +0 -0
  253. data/spec/{app → support}/models/even.rb +0 -0
  254. data/spec/{app → support}/models/event.rb +0 -0
  255. data/spec/{app → support}/models/exhibition.rb +0 -0
  256. data/spec/{app → support}/models/exhibitor.rb +0 -0
  257. data/spec/{app → support}/models/explosion.rb +0 -0
  258. data/spec/{app → support}/models/eye.rb +0 -0
  259. data/spec/{app → support}/models/eye_bowl.rb +0 -0
  260. data/spec/{app → support}/models/face.rb +0 -0
  261. data/spec/{app → support}/models/favorite.rb +0 -0
  262. data/spec/{app → support}/models/filesystem.rb +0 -0
  263. data/spec/{app → support}/models/fire_hydrant.rb +0 -0
  264. data/spec/{app → support}/models/firefox.rb +0 -0
  265. data/spec/{app → support}/models/fish.rb +0 -0
  266. data/spec/{app → support}/models/folder.rb +0 -0
  267. data/spec/{app → support}/models/folder_item.rb +0 -0
  268. data/spec/{app → support}/models/fruits.rb +0 -0
  269. data/spec/{app → support}/models/game.rb +0 -0
  270. data/spec/{app → support}/models/ghost.rb +0 -0
  271. data/spec/support/models/guitar.rb +5 -0
  272. data/spec/{app → support}/models/home.rb +0 -0
  273. data/spec/{app → support}/models/house.rb +0 -0
  274. data/spec/{app → support}/models/html_writer.rb +0 -0
  275. data/spec/{app → support}/models/id_key.rb +0 -0
  276. data/spec/support/models/idnodef.rb +8 -0
  277. data/spec/{app → support}/models/image.rb +0 -0
  278. data/spec/{app → support}/models/implant.rb +0 -0
  279. data/spec/support/models/instrument.rb +9 -0
  280. data/spec/{app → support}/models/item.rb +1 -1
  281. data/spec/{app → support}/models/jar.rb +0 -0
  282. data/spec/{app → support}/models/kaleidoscope.rb +0 -0
  283. data/spec/{app → support}/models/kangaroo.rb +0 -0
  284. data/spec/{app → support}/models/label.rb +0 -0
  285. data/spec/{app → support}/models/language.rb +0 -0
  286. data/spec/{app → support}/models/lat_lng.rb +0 -0
  287. data/spec/{app → support}/models/league.rb +0 -0
  288. data/spec/{app → support}/models/learner.rb +0 -0
  289. data/spec/{app → support}/models/line_item.rb +0 -0
  290. data/spec/{app → support}/models/location.rb +0 -0
  291. data/spec/{app → support}/models/login.rb +0 -0
  292. data/spec/{app → support}/models/manufacturer.rb +0 -0
  293. data/spec/{app → support}/models/meat.rb +0 -0
  294. data/spec/{app → support}/models/membership.rb +0 -0
  295. data/spec/{app → support}/models/message.rb +0 -0
  296. data/spec/{app → support}/models/minim.rb +0 -0
  297. data/spec/{app → support}/models/mixed_drink.rb +0 -0
  298. data/spec/support/models/mop.rb +16 -0
  299. data/spec/{app → support}/models/movie.rb +0 -0
  300. data/spec/{app → support}/models/my_hash.rb +0 -0
  301. data/spec/{app → support}/models/name.rb +0 -0
  302. data/spec/{app → support}/models/name_only.rb +0 -0
  303. data/spec/{app → support}/models/node.rb +0 -0
  304. data/spec/{app → support}/models/note.rb +0 -0
  305. data/spec/{app → support}/models/odd.rb +0 -0
  306. data/spec/{app → support}/models/ordered_post.rb +0 -0
  307. data/spec/{app → support}/models/ordered_preference.rb +0 -0
  308. data/spec/{app → support}/models/oscar.rb +0 -0
  309. data/spec/{app → support}/models/other_owner_object.rb +0 -0
  310. data/spec/{app → support}/models/override.rb +0 -0
  311. data/spec/{app → support}/models/ownable.rb +0 -0
  312. data/spec/{app → support}/models/owner.rb +2 -0
  313. data/spec/{app → support}/models/pack.rb +0 -0
  314. data/spec/{app → support}/models/page.rb +0 -0
  315. data/spec/{app → support}/models/page_question.rb +0 -0
  316. data/spec/{app → support}/models/palette.rb +1 -1
  317. data/spec/{app → support}/models/parent.rb +0 -0
  318. data/spec/{app → support}/models/parent_doc.rb +0 -0
  319. data/spec/{app → support}/models/passport.rb +0 -0
  320. data/spec/{app → support}/models/patient.rb +0 -0
  321. data/spec/{app → support}/models/pdf_writer.rb +0 -0
  322. data/spec/{app → support}/models/pencil.rb +0 -0
  323. data/spec/{app → support}/models/person.rb +1 -12
  324. data/spec/{app → support}/models/pet.rb +0 -0
  325. data/spec/{app → support}/models/pet_owner.rb +0 -0
  326. data/spec/{app → support}/models/phone.rb +0 -0
  327. data/spec/support/models/piano.rb +5 -0
  328. data/spec/{app → support}/models/pizza.rb +0 -0
  329. data/spec/{app → support}/models/player.rb +0 -0
  330. data/spec/{app → support}/models/post.rb +0 -0
  331. data/spec/{app → support}/models/post_genre.rb +0 -0
  332. data/spec/{app → support}/models/powerup.rb +0 -0
  333. data/spec/{app → support}/models/preference.rb +0 -0
  334. data/spec/{app → support}/models/princess.rb +0 -0
  335. data/spec/{app → support}/models/product.rb +0 -0
  336. data/spec/support/models/profile.rb +18 -0
  337. data/spec/{app → support}/models/pronunciation.rb +0 -0
  338. data/spec/{app → support}/models/pub.rb +0 -0
  339. data/spec/support/models/publication.rb +5 -0
  340. data/spec/{app → support}/models/publication/encyclopedia.rb +0 -0
  341. data/spec/{app → support}/models/publication/review.rb +0 -0
  342. data/spec/{app → support}/models/purchase.rb +0 -0
  343. data/spec/{app → support}/models/question.rb +0 -0
  344. data/spec/{app → support}/models/quiz.rb +0 -0
  345. data/spec/{app → support}/models/rating.rb +0 -0
  346. data/spec/{app → support}/models/record.rb +0 -0
  347. data/spec/{app → support}/models/registry.rb +0 -0
  348. data/spec/{app → support}/models/role.rb +0 -0
  349. data/spec/{app → support}/models/root_category.rb +0 -0
  350. data/spec/{app → support}/models/sandwich.rb +0 -0
  351. data/spec/{app → support}/models/scheduler.rb +0 -0
  352. data/spec/{app/models/profile.rb → support/models/scribe.rb} +2 -2
  353. data/spec/support/models/seat.rb +25 -0
  354. data/spec/{app → support}/models/seo.rb +0 -0
  355. data/spec/{app → support}/models/series.rb +0 -1
  356. data/spec/{app → support}/models/server.rb +0 -0
  357. data/spec/{app → support}/models/service.rb +0 -0
  358. data/spec/{app → support}/models/shape.rb +2 -2
  359. data/spec/{app → support}/models/shelf.rb +0 -0
  360. data/spec/{app → support}/models/shipment_address.rb +0 -0
  361. data/spec/{app → support}/models/shipping_container.rb +0 -0
  362. data/spec/{app → support}/models/shipping_pack.rb +0 -0
  363. data/spec/{app → support}/models/shop.rb +0 -0
  364. data/spec/{app → support}/models/short_agent.rb +0 -0
  365. data/spec/{app → support}/models/short_quiz.rb +0 -0
  366. data/spec/{app → support}/models/simple.rb +0 -0
  367. data/spec/{app → support}/models/slave.rb +0 -0
  368. data/spec/{app → support}/models/song.rb +0 -0
  369. data/spec/{app → support}/models/sound.rb +0 -0
  370. data/spec/{app → support}/models/square.rb +0 -0
  371. data/spec/{app → support}/models/staff.rb +0 -0
  372. data/spec/{app → support}/models/store_as_dup_test1.rb +0 -0
  373. data/spec/{app → support}/models/store_as_dup_test2.rb +0 -0
  374. data/spec/{app → support}/models/store_as_dup_test3.rb +0 -0
  375. data/spec/{app → support}/models/store_as_dup_test4.rb +0 -0
  376. data/spec/{app → support}/models/strategy.rb +0 -0
  377. data/spec/{app → support}/models/sub_item.rb +0 -0
  378. data/spec/{app → support}/models/subscription.rb +0 -0
  379. data/spec/{app → support}/models/survey.rb +0 -0
  380. data/spec/{app → support}/models/symptom.rb +0 -0
  381. data/spec/support/models/system_role.rb +7 -0
  382. data/spec/{app → support}/models/tag.rb +0 -0
  383. data/spec/{app → support}/models/target.rb +0 -0
  384. data/spec/{app → support}/models/template.rb +0 -0
  385. data/spec/{app → support}/models/thing.rb +0 -0
  386. data/spec/{app → support}/models/title.rb +0 -0
  387. data/spec/{app → support}/models/tool.rb +2 -2
  388. data/spec/{app → support}/models/topping.rb +0 -0
  389. data/spec/support/models/toy.rb +10 -0
  390. data/spec/{app → support}/models/track.rb +0 -0
  391. data/spec/{app → support}/models/translation.rb +0 -0
  392. data/spec/{app → support}/models/tree.rb +0 -0
  393. data/spec/{app → support}/models/truck.rb +2 -0
  394. data/spec/{app → support}/models/updatable.rb +0 -0
  395. data/spec/{app → support}/models/user.rb +0 -0
  396. data/spec/{app → support}/models/user_account.rb +0 -0
  397. data/spec/{app → support}/models/validation_callback.rb +0 -0
  398. data/spec/{app → support}/models/vehicle.rb +7 -2
  399. data/spec/{app → support}/models/version.rb +0 -0
  400. data/spec/{app → support}/models/vertex.rb +0 -0
  401. data/spec/{app → support}/models/vet_visit.rb +0 -0
  402. data/spec/{app → support}/models/video.rb +0 -0
  403. data/spec/{app → support}/models/video_game.rb +0 -0
  404. data/spec/{app → support}/models/weapon.rb +0 -0
  405. data/spec/{app → support}/models/wiki_page.rb +0 -1
  406. data/spec/{app → support}/models/word.rb +0 -0
  407. data/spec/{app → support}/models/word_origin.rb +0 -0
  408. data/spec/{app → support}/models/writer.rb +2 -2
  409. data/spec/support/spec_config.rb +1 -9
  410. data/spec/support/spec_organizer.rb +130 -0
  411. metadata +841 -828
  412. metadata.gz.sig +0 -0
  413. data/lib/mongoid/matchable/all.rb +0 -30
  414. data/lib/mongoid/matchable/and.rb +0 -32
  415. data/lib/mongoid/matchable/default.rb +0 -121
  416. data/lib/mongoid/matchable/elem_match.rb +0 -36
  417. data/lib/mongoid/matchable/eq.rb +0 -23
  418. data/lib/mongoid/matchable/exists.rb +0 -25
  419. data/lib/mongoid/matchable/gt.rb +0 -25
  420. data/lib/mongoid/matchable/gte.rb +0 -25
  421. data/lib/mongoid/matchable/in.rb +0 -26
  422. data/lib/mongoid/matchable/lt.rb +0 -25
  423. data/lib/mongoid/matchable/lte.rb +0 -25
  424. data/lib/mongoid/matchable/ne.rb +0 -23
  425. data/lib/mongoid/matchable/nin.rb +0 -24
  426. data/lib/mongoid/matchable/nor.rb +0 -38
  427. data/lib/mongoid/matchable/or.rb +0 -35
  428. data/lib/mongoid/matchable/regexp.rb +0 -30
  429. data/lib/mongoid/matchable/size.rb +0 -23
  430. data/spec/app/models/customer.rb +0 -11
  431. data/spec/app/models/customer_address.rb +0 -12
  432. data/spec/app/models/publication.rb +0 -5
  433. data/spec/integration/associations/embeds_many_spec.rb +0 -24
  434. data/spec/integration/associations/embeds_one_spec.rb +0 -24
  435. data/spec/integration/callbacks_models.rb +0 -49
  436. data/spec/integration/callbacks_spec.rb +0 -216
  437. data/spec/mongoid/matchable/all_spec.rb +0 -34
  438. data/spec/mongoid/matchable/and_spec.rb +0 -190
  439. data/spec/mongoid/matchable/default_spec.rb +0 -140
  440. data/spec/mongoid/matchable/elem_match_spec.rb +0 -109
  441. data/spec/mongoid/matchable/eq_spec.rb +0 -49
  442. data/spec/mongoid/matchable/exists_spec.rb +0 -60
  443. data/spec/mongoid/matchable/gt_spec.rb +0 -89
  444. data/spec/mongoid/matchable/gte_spec.rb +0 -87
  445. data/spec/mongoid/matchable/in_spec.rb +0 -52
  446. data/spec/mongoid/matchable/lt_spec.rb +0 -88
  447. data/spec/mongoid/matchable/lte_spec.rb +0 -88
  448. data/spec/mongoid/matchable/ne_spec.rb +0 -49
  449. data/spec/mongoid/matchable/nin_spec.rb +0 -51
  450. data/spec/mongoid/matchable/nor_spec.rb +0 -210
  451. data/spec/mongoid/matchable/or_spec.rb +0 -134
  452. data/spec/mongoid/matchable/regexp_spec.rb +0 -62
  453. data/spec/mongoid/matchable/size_spec.rb +0 -28
  454. data/spec/mongoid/matchable_spec.rb +0 -856
  455. data/spec/shared/LICENSE +0 -20
  456. data/spec/shared/bin/get-mongodb-download-url +0 -17
  457. data/spec/shared/bin/s3-copy +0 -45
  458. data/spec/shared/bin/s3-upload +0 -69
  459. data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
  460. data/spec/shared/lib/mrss/cluster_config.rb +0 -226
  461. data/spec/shared/lib/mrss/constraints.rb +0 -368
  462. data/spec/shared/lib/mrss/docker_runner.rb +0 -271
  463. data/spec/shared/lib/mrss/lite_constraints.rb +0 -191
  464. data/spec/shared/lib/mrss/server_version_registry.rb +0 -115
  465. data/spec/shared/lib/mrss/spec_organizer.rb +0 -179
  466. data/spec/shared/lib/mrss/utils.rb +0 -15
  467. data/spec/shared/share/Dockerfile.erb +0 -322
  468. data/spec/shared/share/haproxy-1.conf +0 -16
  469. data/spec/shared/share/haproxy-2.conf +0 -17
  470. data/spec/shared/shlib/distro.sh +0 -73
  471. data/spec/shared/shlib/server.sh +0 -317
  472. data/spec/shared/shlib/set_env.sh +0 -131
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 99b8d31638cfb3ff2cf789177ed38778cc7ed9281b2f90eb6790a53c4e817557
4
- data.tar.gz: e4fccff34a4cc008ce1af7681cc6a5179960ab3dca7c8dada85ddbcef33d102d
3
+ metadata.gz: da086175f8b41ffc6991262225460da5577f7ea47d3c355f34e072ff5c78d5f1
4
+ data.tar.gz: 7797a83ed15fd55f0ec8aba1a43569393f99f037a7f1013aeb0770f0aa4c3000
5
5
  SHA512:
6
- metadata.gz: 1f9474eaa39877c8087d8f681a964a43943193ef43ec6e5fed05c349e9add56235e10b3959615213157514f7224e63157f90a96720bc993d15f0d2ea2112a7c3
7
- data.tar.gz: 74db9f1912c3d4029c671f72f4856984f0a0520e3d1492f2ce8b1b9ce40cfd4efc2fe89923ac695c9644913533ca63e76842a993196cfb48b5c81c715e983d5c
6
+ metadata.gz: f18e6f9ca45ce9cc406a32983d031388c5f6a76100de18fcdf036163bf08c74f4f15a1e77a02c6445e37f2824ec6ecf549514bf78447f7876b8d52d2c2fb4947
7
+ data.tar.gz: ca7b9fe36e273d4e2dab3680dbaa973450eb2b87ae58a9d462bba6ec95d27de1479255175a9d7971b32e61b5a43726d7b7855134c5ec733b75e126e6e51fb408
checksums.yaml.gz.sig CHANGED
Binary file
data.tar.gz.sig CHANGED
Binary file
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
- # Mongoid
2
- [![Code Climate](https://codeclimate.com/github/mongodb/mongoid.svg)](https://codeclimate.com/github/mongodb/mongoid)
1
+ Mongoid
2
+ [![Gem Version][rubygems-img]][rubygems-url]
3
+ [![Inline docs][inch-img]][inch-url]
4
+ ====
3
5
 
4
6
  Mongoid is an ODM (Object-Document Mapper) framework for MongoDB in Ruby.
5
7
 
@@ -17,7 +19,7 @@ Compatibility
17
19
 
18
20
  Mongoid supports and is tested against:
19
21
 
20
- - MRI 2.3-3.0
22
+ - MRI 2.3-2.7
21
23
  - JRuby 9.2
22
24
  - MongoDB server 2.6-4.4
23
25
 
@@ -63,3 +65,8 @@ Credits
63
65
  -------
64
66
 
65
67
  Durran Jordan: durran at gmail dot com
68
+
69
+ [rubygems-img]: https://badge.fury.io/rb/mongoid.svg
70
+ [rubygems-url]: http://badge.fury.io/rb/mongoid
71
+ [inch-img]: http://inch-ci.org/github/mongodb/mongoid.svg?branch=master
72
+ [inch-url]: http://inch-ci.org/github/mongodb/mongoid
data/Rakefile CHANGED
@@ -4,13 +4,8 @@ require "bundler"
4
4
  require "bundler/gem_tasks"
5
5
  Bundler.setup
6
6
 
7
- ROOT = File.expand_path(File.join(File.dirname(__FILE__)))
8
-
9
- $: << File.join(ROOT, 'spec/shared/lib')
10
-
11
7
  require "rake"
12
8
  require "rspec/core/rake_task"
13
- require 'mrss/spec_organizer'
14
9
 
15
10
  $LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
16
11
  require "mongoid/version"
@@ -27,8 +22,11 @@ task :install => :build do
27
22
  system "sudo gem install mongoid-#{Mongoid::VERSION}.gem"
28
23
  end
29
24
 
30
- task :release do
31
- raise "Please use ./release.sh to release"
25
+ task :release => :build do
26
+ system "git tag -a v#{Mongoid::VERSION} -m 'Tagging #{Mongoid::VERSION}'"
27
+ system "git push --tags"
28
+ system "gem push mongoid-#{Mongoid::VERSION}.gem"
29
+ system "rm mongoid-#{Mongoid::VERSION}.gem"
32
30
  end
33
31
 
34
32
  RSpec::Core::RakeTask.new("spec") do |spec|
@@ -40,30 +38,11 @@ RSpec::Core::RakeTask.new('spec:progress') do |spec|
40
38
  spec.pattern = "spec/**/*_spec.rb"
41
39
  end
42
40
 
43
- CLASSIFIERS = [
44
- [%r,^mongoid/attribute,, :attributes],
45
- [%r,^mongoid/association/[or],, :associations_referenced],
46
- [%r,^mongoid/association,, :associations],
47
- [%r,^mongoid,, :unit],
48
- [%r,^integration,, :integration],
49
- [%r,^rails,, :rails],
50
- ]
51
-
52
- RUN_PRIORITY = %i(
53
- unit attributes associations_referenced associations
54
- integration rails
55
- )
56
-
57
- def spec_organizer
58
- Mrss::SpecOrganizer.new(
59
- root: ROOT,
60
- classifiers: CLASSIFIERS,
61
- priority_order: RUN_PRIORITY,
62
- )
63
- end
64
-
65
41
  task :ci do
66
- spec_organizer.run
42
+ $LOAD_PATH.push File.expand_path("../spec", __FILE__)
43
+ require 'support/spec_organizer'
44
+
45
+ SpecOrganizer.new.run
67
46
  end
68
47
 
69
48
  task :default => :spec
@@ -87,3 +66,5 @@ namespace :release do
87
66
  end
88
67
  end
89
68
  end
69
+
70
+ task :release => ['release:check_private_key', 'release:do']
@@ -7,6 +7,7 @@ en:
7
7
  message_title: "message"
8
8
  summary_title: "summary"
9
9
  resolution_title: "resolution"
10
+
10
11
  ambiguous_relationship:
11
12
  message: "Ambiguous associations %{candidates} defined on %{klass}."
12
13
  summary:
@@ -43,6 +44,8 @@ en:
43
44
  resolution: "Most likely this is caused by passing parameters directly
44
45
  through to the find, and the parameter either is not present or the
45
46
  key from which it is accessed is incorrect."
47
+ destroy_restrict_with_error_dependencies_exist:
48
+ "is not empty and prevents the document from being destroyed"
46
49
  document_not_destroyed:
47
50
  message: "%{klass} with id %{id} was not destroyed."
48
51
  summary: "When calling %{klass}#destroy! and a callback halts the destroy
@@ -105,6 +108,32 @@ en:
105
108
  summary: "An invalid dependent strategy was defined for the association:
106
109
  %{association}. The valid strategies are: %{valid_strategies}."
107
110
  resolution: "Change the dependent strategy to one of the valid types."
111
+ invalid_discriminator_key_target:
112
+ message: "Setting the discriminator key on a child class is not allowed."
113
+ summary: "The discriminator key on the class %{class_name} was attempted
114
+ to be changed. Changing the discriminator key on a child class is not
115
+ allowed."
116
+ resolution: "Try setting the discriminator key on %{superclass} or one of %{class_name}'s
117
+ ancestors."
118
+ invalid_elem_match_operator:
119
+ message: "Invalid $elemMatch operator '%{operator}'."
120
+ summary: "You misspelled an operator or are using an operator that
121
+ Mongoid does not support."
122
+ resolution: "Valid field operators are: %{valid_operators}.
123
+ Ensure you are using one of these operators."
124
+ invalid_estimated_count_criteria:
125
+ message: "Invalid criteria for estimated_count."
126
+ summary: "Estimated count is strictly a collection-level operation and cannot be called
127
+ on a filtered critera."
128
+ resolution: "Try calling estimated_count directly on the class: %{class_name}.estimated_count.\n\n
129
+ \_If the class defines a default scope, use unscoped: %{class_name}.unscoped.estimated_count."
130
+ invalid_expression_operator:
131
+ message: "Invalid expression operator '%{operator}'."
132
+ summary: "You misspelled an operator, are using an operator that
133
+ Mongoid does not support, or are trying to use a field-level
134
+ operator on expression level."
135
+ resolution: "Valid expression operators are: %{valid_operators}.
136
+ Ensure you are using one of these operators."
108
137
  invalid_field:
109
138
  message: "Defining a field named '%{name}' is not allowed."
110
139
  summary: "Defining this field would override the method '%{name}',
@@ -118,6 +147,13 @@ en:
118
147
  allowed, and don't use these names. These include names that also
119
148
  conflict with core Ruby methods on Object, Module, Enumerable, or
120
149
  included gems that inject methods into these or Mongoid internals."
150
+ invalid_field_operator:
151
+ message: "Invalid field operator '%{operator}'."
152
+ summary: "You misspelled an operator, are using an operator that
153
+ Mongoid does not support, or are trying to use an expression-level
154
+ operator on field level."
155
+ resolution: "Valid field operators are: %{valid_operators}.
156
+ Ensure you are using one of these operators."
121
157
  invalid_field_option:
122
158
  message: "Invalid option :%{option} provided for field :%{name}."
123
159
  summary: "Mongoid requires that you only provide valid options on each
@@ -543,7 +579,7 @@ en:
543
579
  the validations."
544
580
  delete_restriction:
545
581
  message: "Cannot delete %{document} because of dependent '%{relation}'."
546
- summary: "When defining '%{relation}' with a :dependent => :restrict,
582
+ summary: "When defining '%{relation}' with a :dependent => :restrict_with_error,
547
583
  Mongoid will raise an error when attempting to delete the
548
584
  %{document} when the child '%{relation}' still has documents in it."
549
585
  resolution: "Don't attempt to delete the parent %{document} when
data/lib/mongoid.rb CHANGED
@@ -6,7 +6,6 @@ require "support/ruby_version"
6
6
  require "forwardable"
7
7
  require "time"
8
8
  require "set"
9
- require "ruby2_keywords"
10
9
 
11
10
  require "active_support"
12
11
  require "active_support/core_ext"
@@ -112,4 +111,27 @@ module Mongoid
112
111
  #
113
112
  # @since 1.0.0
114
113
  def_delegators Config, *(Config.public_instance_methods(false) - [ :logger=, :logger ])
114
+
115
+
116
+ # Module used to prepend the discriminator key assignment function to change
117
+ # the value assigned to the discriminator key to a string.
118
+ #
119
+ # @api private
120
+ module GlobalDiscriminatorKeyAssignment
121
+ # This class is used for obtaining the method definition location for
122
+ # Mongoid methods.
123
+ class InvalidFieldHost
124
+ include Mongoid::Document
125
+ end
126
+
127
+ def discriminator_key=(value)
128
+ Mongoid::Fields::Validators::Macro.validate_field_name(InvalidFieldHost, value)
129
+ value = value.to_s
130
+ super
131
+ end
132
+ end
133
+
134
+ class << self
135
+ prepend GlobalDiscriminatorKeyAssignment
136
+ end
115
137
  end
@@ -41,11 +41,6 @@ module Mongoid
41
41
  :restrict_with_error
42
42
  ]
43
43
 
44
- # The error message when a strategy cannot delete objects because there are associated objects.
45
- #
46
- # @since 7.0
47
- RESTRICT_ERROR_MSG = 'Cannot delete record because associated objects exist.'.freeze
48
-
49
44
  # Attempt to add the cascading information for the document to know how
50
45
  # to handle associated documents on a removal.
51
46
  #
@@ -131,7 +126,7 @@ module Mongoid
131
126
 
132
127
  def _dependent_restrict_with_error!(association)
133
128
  if (relation = send(association.name)) && !relation.blank?
134
- errors.add(association.name, RESTRICT_ERROR_MSG)
129
+ errors.add(association.name, :destroy_restrict_with_error_dependencies_exist)
135
130
  throw(:abort, false)
136
131
  end
137
132
  end
@@ -415,7 +415,7 @@ module Mongoid
415
415
  # @param [ Proc ] block Optional block to pass.
416
416
  #
417
417
  # @return [ Criteria, Object ] A Criteria or return value from the target.
418
- ruby2_keywords def method_missing(name, *args, &block)
418
+ def method_missing(name, *args, &block)
419
419
  return super if _target.respond_to?(name)
420
420
  klass.send(:with_scope, criteria) do
421
421
  criteria.public_send(name, *args, &block)
@@ -11,7 +11,7 @@ module Mongoid
11
11
  include ::Enumerable
12
12
 
13
13
  def_delegators :criteria, :avg, :max, :min, :sum
14
- def_delegators :_target, :length, :size
14
+ def_delegators :_target, :length, :size, :any?
15
15
 
16
16
  # Is the association empty?
17
17
  #
@@ -22,7 +22,7 @@ module Mongoid
22
22
  #
23
23
  # @since 2.1.0
24
24
  def blank?
25
- size == 0
25
+ !any?
26
26
  end
27
27
 
28
28
  # Creates a new document on the references many association. This will
@@ -207,7 +207,7 @@ module Mongoid
207
207
  #
208
208
  # @return [ Document ] A matching document or a new/created one.
209
209
  def find_or(method, attrs = {}, type = nil, &block)
210
- attrs["_type"] = type.to_s if type
210
+ attrs[klass.discriminator_key] = type.discriminator_value if type
211
211
  where(attrs).first || send(method, attrs, type, &block)
212
212
  end
213
213
  end
@@ -133,7 +133,7 @@ module Mongoid
133
133
  # @param [ String, Symbol ] name The name of the method.
134
134
  # @param [ Array ] args The arguments passed to the method.
135
135
  #
136
- ruby2_keywords def method_missing(name, *args, &block)
136
+ def method_missing(name, *args, &block)
137
137
  _target.send(name, *args, &block)
138
138
  end
139
139
 
@@ -31,7 +31,7 @@ module Mongoid
31
31
  private
32
32
 
33
33
  def execute_query(object, type)
34
- query_criteria(object, type).limit(-1).first(id_sort: :none)
34
+ query_criteria(object, type).limit(1).first(id_sort: :none)
35
35
  end
36
36
 
37
37
  def query_criteria(object, type)
@@ -101,7 +101,7 @@ module Mongoid
101
101
 
102
102
  # Delete the document from the association. This will set the foreign key
103
103
  # on the document to nil. If the dependent options on the association are
104
- # :delete or :destroy the appropriate removal will occur.
104
+ # :delete_all or :destroy the appropriate removal will occur.
105
105
  #
106
106
  # @example Delete the document.
107
107
  # person.posts.delete(post)
@@ -216,6 +216,40 @@ module Mongoid
216
216
  end
217
217
  end
218
218
 
219
+ # Returns whether the association has any documents, optionally
220
+ # subject to the provided filters.
221
+ #
222
+ # This method returns true if the association has any persisted
223
+ # documents and if it has any not yet persisted documents.
224
+ #
225
+ # If the association is already loaded, this method inspects the
226
+ # loaded documents and does not query the database. If the
227
+ # association is not loaded, the argument-less and block-less
228
+ # version does not load the association; the other versions
229
+ # (that delegate to Enumerable) may or may not load the association
230
+ # completely depending on whether it is iterated to completion.
231
+ #
232
+ # This method can take a parameter and a block. The behavior with
233
+ # either the paramater or the block is delegated to the standard
234
+ # library Enumerable module.
235
+ #
236
+ # Note that when Enumerable's any? method is invoked with both
237
+ # a block and a pattern, it only uses the pattern.
238
+ #
239
+ # @param [ Object ] condition The condition that documents
240
+ # must satisfy. See Enumerable documentation for details.
241
+ #
242
+ # @return [ true, false ] If the association has any documents.
243
+ def any?(*args)
244
+ return super if args.any? || block_given?
245
+
246
+ if _loaded?
247
+ in_memory.length > 0
248
+ else
249
+ _unloaded.exists? || _added.length > 0
250
+ end
251
+ end
252
+
219
253
  # Get the first document in the enumerable. Will check the persisted
220
254
  # documents first. Does not load the entire enumerable.
221
255
  #
@@ -395,7 +429,8 @@ module Mongoid
395
429
  #
396
430
  # @since 2.1.0
397
431
  def reset
398
- _loaded.clear and _added.clear
432
+ _loaded.clear
433
+ _added.clear
399
434
  @executed = false
400
435
  end
401
436
 
@@ -498,7 +533,7 @@ module Mongoid
498
533
  end
499
534
  end
500
535
 
501
- ruby2_keywords def method_missing(name, *args, &block)
536
+ def method_missing(name, *args, &block)
502
537
  entries.send(name, *args, &block)
503
538
  end
504
539
 
@@ -90,7 +90,7 @@ module Mongoid
90
90
 
91
91
  # Delete the document from the association. This will set the foreign key
92
92
  # on the document to nil. If the dependent options on the association are
93
- # :delete or :destroy the appropriate removal will occur.
93
+ # :delete_all or :destroy the appropriate removal will occur.
94
94
  #
95
95
  # @example Delete the document.
96
96
  # person.posts.delete(post)
@@ -170,6 +170,13 @@ module Mongoid
170
170
 
171
171
  # Determine if any documents in this association exist in the database.
172
172
  #
173
+ # If the association contains documents but all of the documents
174
+ # exist only in the application, i.e. have not been persisted to the
175
+ # database, this method returns false.
176
+ #
177
+ # This method queries the database on each invocation even if the
178
+ # association is already loaded into memory.
179
+ #
173
180
  # @example Are there persisted documents?
174
181
  # person.posts.exists?
175
182
  #
@@ -436,7 +443,7 @@ module Mongoid
436
443
  # @return [ Criteria, Object ] A Criteria or return value from the target.
437
444
  #
438
445
  # @since 2.0.0.beta.1
439
- ruby2_keywords def method_missing(name, *args, &block)
446
+ def method_missing(name, *args, &block)
440
447
  if _target.respond_to?(name)
441
448
  _target.send(name, *args, &block)
442
449
  else
@@ -46,7 +46,7 @@ module Mongoid
46
46
  end
47
47
 
48
48
  def execute_query(object, base)
49
- query_criteria(object, base).limit(-1).first(id_sort: :none)
49
+ query_criteria(object, base).limit(1).first(id_sort: :none)
50
50
  end
51
51
 
52
52
  def with_polymorphic_criterion(criteria, base)
@@ -54,14 +54,9 @@ module Mongoid
54
54
  #
55
55
  # @since 2.0.0.rc.1
56
56
  def substitute(replacement)
57
- # If the same object currently associated is being assigned,
58
- # rebind the association and save the target but do not destroy
59
- # the target.
60
-
61
57
  unbind_one
62
58
  if persistable?
63
- # TODO can this entire method be skipped if self == replacement?
64
- if _association.destructive? && self != replacement
59
+ if _association.destructive?
65
60
  send(_association.dependent)
66
61
  else
67
62
  save if persisted?
@@ -193,7 +193,7 @@ module Mongoid
193
193
  def push_conflict?(field)
194
194
  name = field.split(".", 2)[0]
195
195
  set_fields.has_key?(name) || pull_fields.has_key?(name) ||
196
- (push_fields.keys.count { |item| item =~ /#{name}/ } > 1)
196
+ (push_fields.keys.count { |item| item.split('.', 2).first == name } > 1)
197
197
  end
198
198
 
199
199
  # Get the conflicting pull modifications.
@@ -160,11 +160,6 @@ module Mongoid
160
160
  # @since 1.0.0
161
161
  def write_attribute(name, value)
162
162
  field_name = database_field_name(name)
163
-
164
- if attribute_missing?(field_name)
165
- raise ActiveModel::MissingAttributeError, "Missing attribute: '#{name}'"
166
- end
167
-
168
163
  if attribute_writable?(field_name)
169
164
  _assigning do
170
165
  validate_attribute_value(field_name, value)
@@ -182,8 +177,6 @@ module Mongoid
182
177
  end
183
178
  typed_value
184
179
  end
185
- else
186
- # TODO: MONGOID-5072
187
180
  end
188
181
  end
189
182
  alias :[]= :write_attribute
@@ -301,7 +294,7 @@ module Mongoid
301
294
  def read_raw_attribute(name)
302
295
  normalized = database_field_name(name.to_s)
303
296
  if attribute_missing?(normalized)
304
- raise ActiveModel::MissingAttributeError, "Missing attribute: '#{name}'"
297
+ raise ActiveModel::MissingAttributeError, "Missing attribute: '#{name}'."
305
298
  end
306
299
  if hash_dot_syntax?(normalized)
307
300
  attributes.__nested__(normalized)