mongoid 3.1.4 → 3.1.5

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 (429) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +34 -0
  3. data/lib/mongoid/contextual.rb +3 -0
  4. data/lib/mongoid/criteria.rb +10 -2
  5. data/lib/mongoid/document.rb +1 -1
  6. data/lib/mongoid/paranoia.rb +4 -0
  7. data/lib/mongoid/persistence/upsertion.rb +1 -0
  8. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +16 -2
  9. data/lib/mongoid/relations/macros.rb +1 -1
  10. data/lib/mongoid/relations/one.rb +12 -0
  11. data/lib/mongoid/relations/referenced/in.rb +18 -1
  12. data/lib/mongoid/relations/referenced/many_to_many.rb +2 -2
  13. data/lib/mongoid/validations.rb +1 -1
  14. data/lib/mongoid/validations/localizable.rb +1 -1
  15. data/lib/mongoid/validations/presence.rb +1 -1
  16. data/lib/mongoid/validations/uniqueness.rb +1 -1
  17. data/lib/mongoid/version.rb +1 -1
  18. data/lib/support/ruby_version.rb +1 -1
  19. data/spec/app/models/account.rb +32 -0
  20. data/spec/app/models/acolyte.rb +16 -0
  21. data/spec/app/models/actor.rb +19 -0
  22. data/spec/app/models/actor_observer.rb +15 -0
  23. data/spec/app/models/actress.rb +2 -0
  24. data/spec/app/models/address.rb +72 -0
  25. data/spec/app/models/address_component.rb +5 -0
  26. data/spec/app/models/address_number.rb +6 -0
  27. data/spec/app/models/agency.rb +5 -0
  28. data/spec/app/models/agent.rb +12 -0
  29. data/spec/app/models/album.rb +14 -0
  30. data/spec/app/models/alert.rb +5 -0
  31. data/spec/app/models/animal.rb +25 -0
  32. data/spec/app/models/answer.rb +4 -0
  33. data/spec/app/models/appointment.rb +7 -0
  34. data/spec/app/models/article.rb +13 -0
  35. data/spec/app/models/artist.rb +66 -0
  36. data/spec/app/models/artwork.rb +4 -0
  37. data/spec/app/models/augmentation.rb +11 -0
  38. data/spec/app/models/author.rb +6 -0
  39. data/spec/app/models/band.rb +25 -0
  40. data/spec/app/models/bar.rb +9 -0
  41. data/spec/app/models/basic.rb +6 -0
  42. data/spec/app/models/bed.rb +1 -0
  43. data/spec/app/models/big_palette.rb +2 -0
  44. data/spec/app/models/birthday.rb +13 -0
  45. data/spec/app/models/book.rb +12 -0
  46. data/spec/app/models/breed.rb +4 -0
  47. data/spec/app/models/browser.rb +6 -0
  48. data/spec/app/models/building.rb +7 -0
  49. data/spec/app/models/building_address.rb +7 -0
  50. data/spec/app/models/bus.rb +7 -0
  51. data/spec/app/models/business.rb +5 -0
  52. data/spec/app/models/callback_recorder.rb +25 -0
  53. data/spec/app/models/callback_test.rb +9 -0
  54. data/spec/app/models/canvas.rb +25 -0
  55. data/spec/app/models/car.rb +1 -0
  56. data/spec/app/models/cat.rb +8 -0
  57. data/spec/app/models/category.rb +8 -0
  58. data/spec/app/models/child.rb +4 -0
  59. data/spec/app/models/child_doc.rb +22 -0
  60. data/spec/app/models/church.rb +4 -0
  61. data/spec/app/models/circle.rb +3 -0
  62. data/spec/app/models/circuit.rb +4 -0
  63. data/spec/app/models/circus.rb +7 -0
  64. data/spec/app/models/code.rb +5 -0
  65. data/spec/app/models/comment.rb +16 -0
  66. data/spec/app/models/contractor.rb +7 -0
  67. data/spec/app/models/cookie.rb +6 -0
  68. data/spec/app/models/country_code.rb +8 -0
  69. data/spec/app/models/definition.rb +8 -0
  70. data/spec/app/models/description.rb +11 -0
  71. data/spec/app/models/dictionary.rb +10 -0
  72. data/spec/app/models/division.rb +10 -0
  73. data/spec/app/models/doctor.rb +12 -0
  74. data/spec/app/models/dog.rb +7 -0
  75. data/spec/app/models/dokument.rb +5 -0
  76. data/spec/app/models/driver.rb +7 -0
  77. data/spec/app/models/drug.rb +8 -0
  78. data/spec/app/models/email.rb +6 -0
  79. data/spec/app/models/employer.rb +5 -0
  80. data/spec/app/models/entry.rb +6 -0
  81. data/spec/app/models/eraser.rb +1 -0
  82. data/spec/app/models/event.rb +22 -0
  83. data/spec/app/models/exhibition.rb +4 -0
  84. data/spec/app/models/exhibitor.rb +5 -0
  85. data/spec/app/models/eye.rb +9 -0
  86. data/spec/app/models/eye_bowl.rb +9 -0
  87. data/spec/app/models/face.rb +8 -0
  88. data/spec/app/models/favorite.rb +6 -0
  89. data/spec/app/models/filesystem.rb +4 -0
  90. data/spec/app/models/fire_hydrant.rb +6 -0
  91. data/spec/app/models/firefox.rb +4 -0
  92. data/spec/app/models/fish.rb +8 -0
  93. data/spec/app/models/folder.rb +7 -0
  94. data/spec/app/models/folder_item.rb +9 -0
  95. data/spec/app/models/fruits.rb +28 -0
  96. data/spec/app/models/game.rb +21 -0
  97. data/spec/app/models/ghost.rb +7 -0
  98. data/spec/app/models/home.rb +4 -0
  99. data/spec/app/models/house.rb +8 -0
  100. data/spec/app/models/html_writer.rb +3 -0
  101. data/spec/app/models/image.rb +22 -0
  102. data/spec/app/models/implant.rb +16 -0
  103. data/spec/app/models/item.rb +12 -0
  104. data/spec/app/models/jar.rb +7 -0
  105. data/spec/app/models/label.rb +40 -0
  106. data/spec/app/models/language.rb +5 -0
  107. data/spec/app/models/lat_lng.rb +15 -0
  108. data/spec/app/models/league.rb +11 -0
  109. data/spec/app/models/learner.rb +2 -0
  110. data/spec/app/models/line_item.rb +6 -0
  111. data/spec/app/models/location.rb +8 -0
  112. data/spec/app/models/login.rb +8 -0
  113. data/spec/app/models/manufacturer.rb +7 -0
  114. data/spec/app/models/meat.rb +4 -0
  115. data/spec/app/models/membership.rb +4 -0
  116. data/spec/app/models/mixed_drink.rb +4 -0
  117. data/spec/app/models/movie.rb +12 -0
  118. data/spec/app/models/my_hash.rb +2 -0
  119. data/spec/app/models/name.rb +23 -0
  120. data/spec/app/models/node.rb +5 -0
  121. data/spec/app/models/note.rb +12 -0
  122. data/spec/app/models/ordered_post.rb +6 -0
  123. data/spec/app/models/ordered_preference.rb +6 -0
  124. data/spec/app/models/oscar.rb +15 -0
  125. data/spec/app/models/override.rb +16 -0
  126. data/spec/app/models/ownable.rb +6 -0
  127. data/spec/app/models/owner.rb +6 -0
  128. data/spec/app/models/pack.rb +3 -0
  129. data/spec/app/models/page.rb +5 -0
  130. data/spec/app/models/page_question.rb +4 -0
  131. data/spec/app/models/palette.rb +7 -0
  132. data/spec/app/models/paranoid_phone.rb +25 -0
  133. data/spec/app/models/paranoid_post.rb +36 -0
  134. data/spec/app/models/parent.rb +5 -0
  135. data/spec/app/models/parent_doc.rb +6 -0
  136. data/spec/app/models/passport.rb +5 -0
  137. data/spec/app/models/patient.rb +9 -0
  138. data/spec/app/models/pdf_writer.rb +3 -0
  139. data/spec/app/models/pencil.rb +1 -0
  140. data/spec/app/models/person.rb +201 -0
  141. data/spec/app/models/pet.rb +23 -0
  142. data/spec/app/models/pet_owner.rb +6 -0
  143. data/spec/app/models/phone.rb +11 -0
  144. data/spec/app/models/phone_observer.rb +6 -0
  145. data/spec/app/models/pizza.rb +7 -0
  146. data/spec/app/models/player.rb +35 -0
  147. data/spec/app/models/post.rb +43 -0
  148. data/spec/app/models/powerup.rb +11 -0
  149. data/spec/app/models/preference.rb +9 -0
  150. data/spec/app/models/princess.rb +8 -0
  151. data/spec/app/models/product.rb +17 -0
  152. data/spec/app/models/profile.rb +5 -0
  153. data/spec/app/models/pronunciation.rb +5 -0
  154. data/spec/app/models/purchase.rb +4 -0
  155. data/spec/app/models/question.rb +8 -0
  156. data/spec/app/models/quiz.rb +10 -0
  157. data/spec/app/models/rating.rb +8 -0
  158. data/spec/app/models/record.rb +46 -0
  159. data/spec/app/models/registry.rb +4 -0
  160. data/spec/app/models/role.rb +7 -0
  161. data/spec/app/models/root_category.rb +4 -0
  162. data/spec/app/models/sandwich.rb +4 -0
  163. data/spec/app/models/scheduler.rb +7 -0
  164. data/spec/app/models/seo.rb +7 -0
  165. data/spec/app/models/series.rb +4 -0
  166. data/spec/app/models/server.rb +13 -0
  167. data/spec/app/models/service.rb +22 -0
  168. data/spec/app/models/shape.rb +12 -0
  169. data/spec/app/models/shelf.rb +5 -0
  170. data/spec/app/models/shipping_container.rb +5 -0
  171. data/spec/app/models/shipping_pack.rb +3 -0
  172. data/spec/app/models/shop.rb +6 -0
  173. data/spec/app/models/short_agent.rb +4 -0
  174. data/spec/app/models/short_quiz.rb +5 -0
  175. data/spec/app/models/slave.rb +6 -0
  176. data/spec/app/models/song.rb +8 -0
  177. data/spec/app/models/square.rb +4 -0
  178. data/spec/app/models/strategy.rb +3 -0
  179. data/spec/app/models/sub_item.rb +3 -0
  180. data/spec/app/models/subscription.rb +4 -0
  181. data/spec/app/models/survey.rb +5 -0
  182. data/spec/app/models/symptom.rb +6 -0
  183. data/spec/app/models/tag.rb +8 -0
  184. data/spec/app/models/target.rb +5 -0
  185. data/spec/app/models/template.rb +5 -0
  186. data/spec/app/models/thing.rb +9 -0
  187. data/spec/app/models/title.rb +4 -0
  188. data/spec/app/models/tool.rb +8 -0
  189. data/spec/app/models/topping.rb +5 -0
  190. data/spec/app/models/track.rb +38 -0
  191. data/spec/app/models/translation.rb +5 -0
  192. data/spec/app/models/tree.rb +9 -0
  193. data/spec/app/models/truck.rb +3 -0
  194. data/spec/app/models/user.rb +21 -0
  195. data/spec/app/models/user_account.rb +10 -0
  196. data/spec/app/models/validation_callback.rb +10 -0
  197. data/spec/app/models/vehicle.rb +11 -0
  198. data/spec/app/models/version.rb +5 -0
  199. data/spec/app/models/vet_visit.rb +5 -0
  200. data/spec/app/models/video.rb +17 -0
  201. data/spec/app/models/video_game.rb +1 -0
  202. data/spec/app/models/weapon.rb +11 -0
  203. data/spec/app/models/wiki_page.rb +17 -0
  204. data/spec/app/models/word.rb +12 -0
  205. data/spec/app/models/word_origin.rb +11 -0
  206. data/spec/app/models/writer.rb +11 -0
  207. data/spec/config/mongoid.yml +40 -0
  208. data/spec/mongoid/atomic/modifiers_spec.rb +456 -0
  209. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +159 -0
  210. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +152 -0
  211. data/spec/mongoid/atomic/paths/root_spec.rb +106 -0
  212. data/spec/mongoid/atomic/paths_spec.rb +270 -0
  213. data/spec/mongoid/atomic/positionable_spec.rb +227 -0
  214. data/spec/mongoid/atomic_spec.rb +365 -0
  215. data/spec/mongoid/attributes/processing_spec.rb +149 -0
  216. data/spec/mongoid/attributes/readonly_spec.rb +169 -0
  217. data/spec/mongoid/attributes_spec.rb +1705 -0
  218. data/spec/mongoid/callbacks_spec.rb +1564 -0
  219. data/spec/mongoid/components_spec.rb +24 -0
  220. data/spec/mongoid/config/environment_spec.rb +83 -0
  221. data/spec/mongoid/config/options_spec.rb +56 -0
  222. data/spec/mongoid/config_spec.rb +334 -0
  223. data/spec/mongoid/contextual/aggregable/memory_spec.rb +293 -0
  224. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +455 -0
  225. data/spec/mongoid/contextual/atomic_spec.rb +525 -0
  226. data/spec/mongoid/contextual/find_and_modify_spec.rb +220 -0
  227. data/spec/mongoid/contextual/geo_near_spec.rb +405 -0
  228. data/spec/mongoid/contextual/map_reduce_spec.rb +464 -0
  229. data/spec/mongoid/contextual/memory_spec.rb +1236 -0
  230. data/spec/mongoid/contextual/mongo_spec.rb +1757 -0
  231. data/spec/mongoid/copyable_spec.rb +393 -0
  232. data/spec/mongoid/criteria_spec.rb +5140 -0
  233. data/spec/mongoid/criterion/destructive_spec.rb +101 -0
  234. data/spec/mongoid/criterion/inspection_spec.rb +27 -0
  235. data/spec/mongoid/criterion/marshalable_spec.rb +28 -0
  236. data/spec/mongoid/criterion/modifiable_spec.rb +409 -0
  237. data/spec/mongoid/criterion/modification_spec.rb +402 -0
  238. data/spec/mongoid/criterion/scoping_spec.rb +391 -0
  239. data/spec/mongoid/dirty_spec.rb +1508 -0
  240. data/spec/mongoid/document_spec.rb +1146 -0
  241. data/spec/mongoid/equality_spec.rb +241 -0
  242. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +29 -0
  243. data/spec/mongoid/errors/callback_spec.rb +29 -0
  244. data/spec/mongoid/errors/delete_restriction_spec.rb +29 -0
  245. data/spec/mongoid/errors/document_not_found_spec.rb +104 -0
  246. data/spec/mongoid/errors/eager_load_spec.rb +29 -0
  247. data/spec/mongoid/errors/invalid_collection_spec.rb +36 -0
  248. data/spec/mongoid/errors/invalid_config_option_spec.rb +29 -0
  249. data/spec/mongoid/errors/invalid_field_option_spec.rb +29 -0
  250. data/spec/mongoid/errors/invalid_field_spec.rb +37 -0
  251. data/spec/mongoid/errors/invalid_find_spec.rb +29 -0
  252. data/spec/mongoid/errors/invalid_includes_spec.rb +40 -0
  253. data/spec/mongoid/errors/invalid_index_spec.rb +29 -0
  254. data/spec/mongoid/errors/invalid_options_spec.rb +29 -0
  255. data/spec/mongoid/errors/invalid_path_spec.rb +23 -0
  256. data/spec/mongoid/errors/invalid_scope_spec.rb +29 -0
  257. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +17 -0
  258. data/spec/mongoid/errors/invalid_storage_options_spec.rb +29 -0
  259. data/spec/mongoid/errors/invalid_time_spec.rb +29 -0
  260. data/spec/mongoid/errors/inverse_not_found_spec.rb +29 -0
  261. data/spec/mongoid/errors/mixed_relations_spec.rb +29 -0
  262. data/spec/mongoid/errors/mixed_session_configuration_spec.rb +29 -0
  263. data/spec/mongoid/errors/mongoid_error_spec.rb +48 -0
  264. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +29 -0
  265. data/spec/mongoid/errors/no_environment_spec.rb +29 -0
  266. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +29 -0
  267. data/spec/mongoid/errors/no_metadata_spec.rb +23 -0
  268. data/spec/mongoid/errors/no_parent_spec.rb +29 -0
  269. data/spec/mongoid/errors/no_session_config_spec.rb +29 -0
  270. data/spec/mongoid/errors/no_session_database_spec.rb +29 -0
  271. data/spec/mongoid/errors/no_session_hosts_spec.rb +29 -0
  272. data/spec/mongoid/errors/no_sessions_config_spec.rb +29 -0
  273. data/spec/mongoid/errors/readonly_attribute_spec.rb +29 -0
  274. data/spec/mongoid/errors/scope_overwrite_spec.rb +29 -0
  275. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +29 -0
  276. data/spec/mongoid/errors/unknown_attribute_spec.rb +29 -0
  277. data/spec/mongoid/errors/unsaved_document_spec.rb +37 -0
  278. data/spec/mongoid/errors/unsupported_javascript_spec.rb +29 -0
  279. data/spec/mongoid/errors/validations_spec.rb +45 -0
  280. data/spec/mongoid/errors/versioning_not_on_root_spec.rb +29 -0
  281. data/spec/mongoid/extensions/array_spec.rb +638 -0
  282. data/spec/mongoid/extensions/big_decimal_spec.rb +104 -0
  283. data/spec/mongoid/extensions/binary_spec.rb +60 -0
  284. data/spec/mongoid/extensions/boolean_spec.rb +135 -0
  285. data/spec/mongoid/extensions/date_spec.rb +235 -0
  286. data/spec/mongoid/extensions/date_time_spec.rb +155 -0
  287. data/spec/mongoid/extensions/false_class_spec.rb +42 -0
  288. data/spec/mongoid/extensions/float_spec.rb +133 -0
  289. data/spec/mongoid/extensions/hash_spec.rb +333 -0
  290. data/spec/mongoid/extensions/integer_spec.rb +136 -0
  291. data/spec/mongoid/extensions/module_spec.rb +42 -0
  292. data/spec/mongoid/extensions/nil_class_spec.rb +11 -0
  293. data/spec/mongoid/extensions/object_id_spec.rb +946 -0
  294. data/spec/mongoid/extensions/object_spec.rb +292 -0
  295. data/spec/mongoid/extensions/range_spec.rb +105 -0
  296. data/spec/mongoid/extensions/regexp_spec.rb +47 -0
  297. data/spec/mongoid/extensions/set_spec.rb +33 -0
  298. data/spec/mongoid/extensions/string_spec.rb +368 -0
  299. data/spec/mongoid/extensions/symbol_spec.rb +76 -0
  300. data/spec/mongoid/extensions/time_spec.rb +467 -0
  301. data/spec/mongoid/extensions/time_with_zone_spec.rb +405 -0
  302. data/spec/mongoid/extensions/true_class_spec.rb +42 -0
  303. data/spec/mongoid/factory_spec.rb +185 -0
  304. data/spec/mongoid/fields/foreign_key_spec.rb +694 -0
  305. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +184 -0
  306. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +201 -0
  307. data/spec/mongoid/fields/localized_spec.rb +386 -0
  308. data/spec/mongoid/fields/standard_spec.rb +166 -0
  309. data/spec/mongoid/fields_spec.rb +1253 -0
  310. data/spec/mongoid/finders_spec.rb +321 -0
  311. data/spec/mongoid/hierarchy_spec.rb +244 -0
  312. data/spec/mongoid/identity_map_spec.rb +564 -0
  313. data/spec/mongoid/indexes_spec.rb +404 -0
  314. data/spec/mongoid/inspection_spec.rb +57 -0
  315. data/spec/mongoid/json_spec.rb +33 -0
  316. data/spec/mongoid/loggable_spec.rb +21 -0
  317. data/spec/mongoid/matchers/all_spec.rb +31 -0
  318. data/spec/mongoid/matchers/and_spec.rb +162 -0
  319. data/spec/mongoid/matchers/default_spec.rb +130 -0
  320. data/spec/mongoid/matchers/exists_spec.rb +57 -0
  321. data/spec/mongoid/matchers/gt_spec.rb +74 -0
  322. data/spec/mongoid/matchers/gte_spec.rb +74 -0
  323. data/spec/mongoid/matchers/in_spec.rb +25 -0
  324. data/spec/mongoid/matchers/lt_spec.rb +74 -0
  325. data/spec/mongoid/matchers/lte_spec.rb +74 -0
  326. data/spec/mongoid/matchers/ne_spec.rb +25 -0
  327. data/spec/mongoid/matchers/nin_spec.rb +25 -0
  328. data/spec/mongoid/matchers/or_spec.rb +106 -0
  329. data/spec/mongoid/matchers/size_spec.rb +25 -0
  330. data/spec/mongoid/matchers_spec.rb +532 -0
  331. data/spec/mongoid/multi_parameter_attributes_spec.rb +128 -0
  332. data/spec/mongoid/nested_attributes_spec.rb +4945 -0
  333. data/spec/mongoid/observer_spec.rb +290 -0
  334. data/spec/mongoid/paranoia_spec.rb +759 -0
  335. data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +262 -0
  336. data/spec/mongoid/persistence/atomic/bit_spec.rb +88 -0
  337. data/spec/mongoid/persistence/atomic/inc_spec.rb +133 -0
  338. data/spec/mongoid/persistence/atomic/pop_spec.rb +111 -0
  339. data/spec/mongoid/persistence/atomic/pull_all_spec.rb +77 -0
  340. data/spec/mongoid/persistence/atomic/pull_spec.rb +80 -0
  341. data/spec/mongoid/persistence/atomic/push_all_spec.rb +77 -0
  342. data/spec/mongoid/persistence/atomic/push_spec.rb +77 -0
  343. data/spec/mongoid/persistence/atomic/rename_spec.rb +42 -0
  344. data/spec/mongoid/persistence/atomic/sets_spec.rb +154 -0
  345. data/spec/mongoid/persistence/atomic/unset_spec.rb +65 -0
  346. data/spec/mongoid/persistence/atomic_spec.rb +216 -0
  347. data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +191 -0
  348. data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +8 -0
  349. data/spec/mongoid/persistence/operations/insert_spec.rb +149 -0
  350. data/spec/mongoid/persistence/operations/remove_spec.rb +113 -0
  351. data/spec/mongoid/persistence/operations/update_spec.rb +141 -0
  352. data/spec/mongoid/persistence/operations/upsert_spec.rb +59 -0
  353. data/spec/mongoid/persistence/operations_spec.rb +313 -0
  354. data/spec/mongoid/persistence_spec.rb +2279 -0
  355. data/spec/mongoid/railties/document_spec.rb +24 -0
  356. data/spec/mongoid/relations/accessors_spec.rb +844 -0
  357. data/spec/mongoid/relations/auto_save_spec.rb +261 -0
  358. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +171 -0
  359. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +54 -0
  360. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +77 -0
  361. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +241 -0
  362. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +153 -0
  363. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +178 -0
  364. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +131 -0
  365. data/spec/mongoid/relations/builders/embedded/in_spec.rb +34 -0
  366. data/spec/mongoid/relations/builders/embedded/many_spec.rb +132 -0
  367. data/spec/mongoid/relations/builders/embedded/one_spec.rb +99 -0
  368. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +234 -0
  369. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +250 -0
  370. data/spec/mongoid/relations/builders/referenced/in_spec.rb +241 -0
  371. data/spec/mongoid/relations/builders/referenced/many_spec.rb +137 -0
  372. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +178 -0
  373. data/spec/mongoid/relations/builders/referenced/one_spec.rb +124 -0
  374. data/spec/mongoid/relations/builders_spec.rb +226 -0
  375. data/spec/mongoid/relations/cascading/delete_spec.rb +101 -0
  376. data/spec/mongoid/relations/cascading/destroy_spec.rb +47 -0
  377. data/spec/mongoid/relations/cascading/nullify_spec.rb +32 -0
  378. data/spec/mongoid/relations/cascading/restrict_spec.rb +68 -0
  379. data/spec/mongoid/relations/cascading_spec.rb +355 -0
  380. data/spec/mongoid/relations/constraint_spec.rb +74 -0
  381. data/spec/mongoid/relations/conversions_spec.rb +126 -0
  382. data/spec/mongoid/relations/counter_cache_spec.rb +205 -0
  383. data/spec/mongoid/relations/cyclic_spec.rb +156 -0
  384. data/spec/mongoid/relations/embedded/dirty_spec.rb +65 -0
  385. data/spec/mongoid/relations/embedded/in_spec.rb +580 -0
  386. data/spec/mongoid/relations/embedded/many_spec.rb +3841 -0
  387. data/spec/mongoid/relations/embedded/one_spec.rb +1055 -0
  388. data/spec/mongoid/relations/macros_spec.rb +625 -0
  389. data/spec/mongoid/relations/metadata_spec.rb +2030 -0
  390. data/spec/mongoid/relations/options_spec.rb +35 -0
  391. data/spec/mongoid/relations/polymorphic_spec.rb +132 -0
  392. data/spec/mongoid/relations/proxy_spec.rb +48 -0
  393. data/spec/mongoid/relations/referenced/in_spec.rb +1501 -0
  394. data/spec/mongoid/relations/referenced/many_spec.rb +3632 -0
  395. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +3561 -0
  396. data/spec/mongoid/relations/referenced/one_spec.rb +1331 -0
  397. data/spec/mongoid/relations/reflections_spec.rb +101 -0
  398. data/spec/mongoid/relations/synchronization_spec.rb +453 -0
  399. data/spec/mongoid/relations/targets/enumerable_spec.rb +1710 -0
  400. data/spec/mongoid/relations_spec.rb +188 -0
  401. data/spec/mongoid/reloading_spec.rb +305 -0
  402. data/spec/mongoid/scoping_spec.rb +978 -0
  403. data/spec/mongoid/serialization_spec.rb +833 -0
  404. data/spec/mongoid/sessions/factory_spec.rb +312 -0
  405. data/spec/mongoid/sessions/mongo_uri_spec.rb +103 -0
  406. data/spec/mongoid/sessions_spec.rb +1111 -0
  407. data/spec/mongoid/sharding_spec.rb +61 -0
  408. data/spec/mongoid/state_spec.rb +102 -0
  409. data/spec/mongoid/threaded_spec.rb +296 -0
  410. data/spec/mongoid/timestamps/created/short_spec.rb +51 -0
  411. data/spec/mongoid/timestamps/created_spec.rb +44 -0
  412. data/spec/mongoid/timestamps/timeless_spec.rb +130 -0
  413. data/spec/mongoid/timestamps/updated/short_spec.rb +90 -0
  414. data/spec/mongoid/timestamps/updated_spec.rb +86 -0
  415. data/spec/mongoid/timestamps_spec.rb +112 -0
  416. data/spec/mongoid/unit_of_work_spec.rb +196 -0
  417. data/spec/mongoid/validations/associated_spec.rb +183 -0
  418. data/spec/mongoid/validations/format_spec.rb +83 -0
  419. data/spec/mongoid/validations/length_spec.rb +223 -0
  420. data/spec/mongoid/validations/numericality_spec.rb +30 -0
  421. data/spec/mongoid/validations/presence_spec.rb +592 -0
  422. data/spec/mongoid/validations/uniqueness_spec.rb +2399 -0
  423. data/spec/mongoid/validations_spec.rb +309 -0
  424. data/spec/mongoid/versioning_spec.rb +540 -0
  425. data/spec/mongoid_spec.rb +74 -0
  426. data/spec/rack/mongoid/middleware/identity_map_spec.rb +72 -0
  427. data/spec/rails/mongoid_spec.rb +462 -0
  428. data/spec/spec_helper.rb +93 -0
  429. metadata +826 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e112d2050bea71c9b4ec085c77518391924fd579
4
- data.tar.gz: 7b83e17ffe01d545d5a08833d1a07e8ef120a2bb
3
+ metadata.gz: 45a87057b0667e0b764ac4cd7816d93ecbbacbed
4
+ data.tar.gz: 7ca89da136c467233031ddec0c17eb77cb103019
5
5
  SHA512:
6
- metadata.gz: 0344a52659debedd1ed969e05676a35c65edd806471bdcb9d8045e8404293b27451449d434d9f1d6c2174f3dc8475a9eff978bcbbaabd3f54f0a53f980b8a625
7
- data.tar.gz: e196f3ebc85543dc36a9e6f49f1f024c993d626ab4990604ad5061961ed3e8a0cfecbfd6f3a18c048127819d9897b1f0eb25d588ed141dc4d9f8b96d7c38fbaf
6
+ metadata.gz: ebbee26a46ea97357737bdccad4cf96a1f6e57d815a8d68f1bac91d5c62c40b3c31812e90266860d5da23b65cccc540a62f5aba0d728ab64ba604405925cf8d2
7
+ data.tar.gz: 3abd08faeb591bd9cf71cd976f5d8e99063fed8f2830ea916fb720464eebf4e0525b6135963f0a9c0f674fbf154091b185f0372285c9980e088dc63b1e271f56
@@ -3,6 +3,40 @@
3
3
  For instructions on upgrading to newer versions, visit
4
4
  [mongoid.org](http://mongoid.org/en/mongoid/docs/upgrading.html).
5
5
 
6
+ ## 3.1.5
7
+
8
+ ### Resolved Issues
9
+
10
+ * \#3231 Allow evolution of proxy documents to work in criteria.
11
+
12
+ * \#3247 Bump dependency on tzinfo to 0.3.29.
13
+
14
+ * \#3203 Fixed `index: true` specification for polymorphic relations.
15
+
16
+ * \#3192 Fixed aliased fields + localized fields combinations with
17
+ validation. (Johnny Shields)
18
+
19
+ * \#3173 Fixed issues around many to many relations with custom primary keys.
20
+ (Bowen Sun)
21
+
22
+ * \#3159 Upserting now properly flags documents as persisted.
23
+
24
+ * \#3137 Allow multiple `belongs_to` sets in a row with ids.
25
+
26
+ * \#3079 Embbed docs with paranoia parents, were losing the _id when
27
+ reloading from db, as they didnt have the right persisted? value. (Arthur Neves)
28
+
29
+ * \#3081 Criteria's `method_missing` now checks if an array responds to the provided
30
+ method before calling entries in order to not hit the database if a `NoMethodError`
31
+ was to get raised.
32
+
33
+ * \#3068 Fixed spec runs on non standard MongoDB ports if `MONGOID_SPEC_PORT` is
34
+ set.
35
+
36
+ * \#3047 Ensure `blank?` and `empty?` don't fall through method missing on criteria.
37
+
38
+ * Include updated_at on cache_key even when is a short timestamp (Arthur Neves)
39
+
6
40
  ## 3.1.4
7
41
 
8
42
  ### Resolved Issues
@@ -18,6 +18,9 @@ module Mongoid
18
18
  # including destructive, modification, and optional methods.
19
19
  delegate(*(Mongo.public_instance_methods(false) - [ :skip, :limit ]), to: :context)
20
20
 
21
+ # This gets blank and empty included.
22
+ delegate(*Queryable.public_instance_methods(false), to: :context)
23
+
21
24
  # Get the context in which criteria queries should execute. This is either
22
25
  # in memory (for embedded documents) or mongo (for root level documents.)
23
26
  #
@@ -23,6 +23,12 @@ module Mongoid
23
23
  include Criterion::Modifiable
24
24
  include Criterion::Scoping
25
25
 
26
+ # Static array used to check with method missing - we only need to ever
27
+ # instantiate once.
28
+ #
29
+ # @since 4.0.0
30
+ CHECK = []
31
+
26
32
  attr_accessor :embedded, :klass
27
33
 
28
34
  # Returns true if the supplied +Enumerable+ or +Criteria+ is equal to the results
@@ -322,7 +328,7 @@ module Mongoid
322
328
  #
323
329
  # @return [ true, false ] If the criteria responds to the method.
324
330
  def respond_to?(name, include_private = false)
325
- super || klass.respond_to?(name) || entries.respond_to?(name, include_private)
331
+ super || klass.respond_to?(name) || CHECK.respond_to?(name, include_private)
326
332
  end
327
333
 
328
334
  alias :to_ary :to_a
@@ -506,8 +512,10 @@ module Mongoid
506
512
  klass.send(:with_scope, self) do
507
513
  klass.send(name, *args, &block)
508
514
  end
509
- else
515
+ elsif CHECK.respond_to?(name)
510
516
  return entries.send(name, *args, &block)
517
+ else
518
+ super
511
519
  end
512
520
  end
513
521
 
@@ -222,7 +222,7 @@ module Mongoid
222
222
  # @since 2.4.0
223
223
  def cache_key
224
224
  return "#{model_key}/new" if new_record?
225
- return "#{model_key}/#{id}-#{updated_at.utc.to_s(:number)}" unless self[:updated_at].nil?
225
+ return "#{model_key}/#{id}-#{updated_at.utc.to_s(:number)}" if do_or_do_not(:updated_at)
226
226
  "#{model_key}/#{id}"
227
227
  end
228
228
 
@@ -82,6 +82,10 @@ module Mongoid
82
82
  end
83
83
  alias :deleted? :destroyed?
84
84
 
85
+ def persisted?
86
+ !new_record? && !(@destroyed ||= false)
87
+ end
88
+
85
89
  # Restores a previously soft-deleted document. Handles this by removing the
86
90
  # deleted_at flag.
87
91
  #
@@ -23,6 +23,7 @@ module Mongoid
23
23
  yield(document); true
24
24
  end
25
25
  document.post_persist unless result == false
26
+ document.new_record = false
26
27
  result
27
28
  end
28
29
  end
@@ -20,7 +20,7 @@ module Mongoid
20
20
  binding do
21
21
  inverse_keys = doc.you_must(metadata.inverse_foreign_key)
22
22
  if inverse_keys
23
- inverse_keys.push(record_id(base))
23
+ inverse_keys.push(inverse_record_id(doc))
24
24
  doc.reset_relation_criteria(metadata.inverse)
25
25
  end
26
26
  base.synced[metadata.foreign_key] = true
@@ -39,13 +39,27 @@ module Mongoid
39
39
  base.send(metadata.foreign_key).delete_one(record_id(doc))
40
40
  inverse_keys = doc.you_must(metadata.inverse_foreign_key)
41
41
  if inverse_keys
42
- inverse_keys.delete_one(record_id(base))
42
+ inverse_keys.delete_one(inverse_record_id(doc))
43
43
  doc.reset_relation_criteria(metadata.inverse)
44
44
  end
45
45
  base.synced[metadata.foreign_key] = true
46
46
  doc.synced[metadata.inverse_foreign_key] = true
47
47
  end
48
48
  end
49
+
50
+ # Find the inverse id referenced by inverse_keys
51
+ def inverse_record_id(doc)
52
+ inverse_metadata = determine_inverse_metadata(doc)
53
+ if inverse_metadata
54
+ base.__send__(inverse_metadata.primary_key)
55
+ else
56
+ base.id
57
+ end
58
+ end
59
+
60
+ def determine_inverse_metadata(doc)
61
+ doc.relations[base.class.name.demodulize.underscore.pluralize]
62
+ end
49
63
  end
50
64
  end
51
65
  end
@@ -311,7 +311,7 @@ module Mongoid
311
311
  )
312
312
  if metadata.indexed?
313
313
  if metadata.polymorphic?
314
- index({ key => 1, metadata.type => 1 }, { background: true })
314
+ index({ key => 1, metadata.inverse_type => 1 }, { background: true })
315
315
  else
316
316
  index({ key => 1 }, { background: true })
317
317
  end
@@ -43,6 +43,18 @@ module Mongoid
43
43
  def respond_to?(name, include_private = false)
44
44
  target.respond_to?(name, include_private) || super
45
45
  end
46
+
47
+ # Evolve the proxy document into an object id.
48
+ #
49
+ # @example Evolve the proxy document.
50
+ # proxy.__evolve_object_id__
51
+ #
52
+ # @return [ Object ] The proxy document's id.
53
+ #
54
+ # @since 4.0.0
55
+ def __evolve_object_id__
56
+ target.id
57
+ end
46
58
  end
47
59
  end
48
60
  end
@@ -53,7 +53,7 @@ module Mongoid
53
53
  def substitute(replacement)
54
54
  unbind_one
55
55
  return nil unless replacement
56
- self.target = replacement
56
+ self.target = normalize(replacement)
57
57
  bind_one
58
58
  self
59
59
  end
@@ -74,6 +74,23 @@ module Mongoid
74
74
  Bindings::Referenced::In.new(base, target, metadata)
75
75
  end
76
76
 
77
+ # Normalize the value provided as a replacement for substitution.
78
+ #
79
+ # @api private
80
+ #
81
+ # @example Normalize the substitute.
82
+ # proxy.normalize(id)
83
+ #
84
+ # @param [ Document, Object ] replacement The replacement object.
85
+ #
86
+ # @return [ Document ] The document.
87
+ #
88
+ # @since 3.1.5
89
+ def normalize(replacement)
90
+ return replacement if replacement.is_a?(Document)
91
+ metadata.builder(klass, replacement).build
92
+ end
93
+
77
94
  # Are we able to persist this relation?
78
95
  #
79
96
  # @example Can we persist the relation?
@@ -29,7 +29,7 @@ module Mongoid
29
29
  return concat(docs) if docs.size > 1
30
30
  if doc = docs.first
31
31
  append(doc)
32
- base.add_to_set(foreign_key, doc.id)
32
+ base.add_to_set(foreign_key, doc.send(metadata.primary_key))
33
33
  if child_persistable?(doc)
34
34
  doc.save
35
35
  end
@@ -120,7 +120,7 @@ module Mongoid
120
120
  def delete(document)
121
121
  doc = super
122
122
  if doc && persistable?
123
- base.pull(foreign_key, doc.id)
123
+ base.pull(foreign_key, doc.send(metadata.primary_key))
124
124
  target._unloaded = criteria
125
125
  unsynced(base, foreign_key)
126
126
  end
@@ -54,7 +54,7 @@ module Mongoid
54
54
  #
55
55
  # @since 2.0.0.rc.1
56
56
  def read_attribute_for_validation(attr)
57
- attribute = attr.to_s
57
+ attribute = database_field_name(attr)
58
58
  if relations.has_key?(attribute)
59
59
  begin_validate
60
60
  relation = without_autobuild { send(attr) }
@@ -16,7 +16,7 @@ module Mongoid
16
16
  #
17
17
  # @since 2.4.2
18
18
  def validate_each(document, attribute, value)
19
- field = document.fields[attribute.to_s]
19
+ field = document.fields[document.database_field_name(attribute)]
20
20
  if field.try(:localized?) && !value.blank?
21
21
  value.values.each do |_value|
22
22
  super(document, attribute, _value)
@@ -26,7 +26,7 @@ module Mongoid
26
26
  #
27
27
  # @since 2.4.0
28
28
  def validate_each(document, attribute, value)
29
- field = document.fields[attribute.to_s]
29
+ field = document.fields[document.database_field_name(attribute)]
30
30
  if field.try(:localized?) && !value.blank?
31
31
  value.each_pair do |_locale, _value|
32
32
  document.errors.add(
@@ -323,7 +323,7 @@ module Mongoid
323
323
  #
324
324
  # @since 4.0.0
325
325
  def localized?(document, attribute)
326
- document.fields[attribute.to_s].try(:localized?)
326
+ document.fields[document.database_field_name(attribute)].try(:localized?)
327
327
  end
328
328
  end
329
329
  end
@@ -1,4 +1,4 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- VERSION = "3.1.4"
3
+ VERSION = "3.1.5"
4
4
  end
@@ -2,7 +2,7 @@
2
2
  # squarm for answers
3
3
  def raise_version_error(message)
4
4
  puts message
5
- Rails.logger.info(message) if defined?(Rails)
5
+ Rails.logger.info(message) if defined?(Rails) && Rails.logger
6
6
  raise
7
7
  end
8
8
 
@@ -0,0 +1,32 @@
1
+ class Account
2
+ include Mongoid::Document
3
+
4
+ field :_id, type: String, default: ->{ name.try(:parameterize) }
5
+
6
+ field :number, type: String
7
+ field :balance, type: String
8
+ field :nickname, type: String
9
+ field :name, type: String
10
+ field :balanced, type: Boolean, default: ->{ balance? ? true : false }
11
+
12
+ field :overridden, type: String
13
+
14
+ embeds_many :memberships
15
+ belongs_to :creator, class_name: "User", foreign_key: :creator_id
16
+ belongs_to :person
17
+ has_many :alerts, autosave: false
18
+ has_and_belongs_to_many :agents
19
+ has_one :comment, validate: false
20
+
21
+ attr_accessible :nickname, as: [ :default, :admin ]
22
+ attr_accessible :name, as: [ :default, :admin ]
23
+ attr_accessible :balance, as: :default
24
+
25
+ validates_presence_of :name
26
+ validates_presence_of :nickname, on: :upsert
27
+ validates_length_of :name, maximum: 10, on: :create
28
+
29
+ def overridden
30
+ self[:overridden] = "not recommended"
31
+ end
32
+ end
@@ -0,0 +1,16 @@
1
+ class Acolyte
2
+ include Mongoid::Document
3
+ field :status
4
+ field :name
5
+
6
+ embeds_many :versions, as: :memorable
7
+ belongs_to :church
8
+
9
+ default_scope asc(:name)
10
+ scope :active, ->{ where(status: "active") }
11
+ scope :named, ->{ where(:name.exists => true) }
12
+
13
+ def callback_test?
14
+ name == "callback-test"
15
+ end
16
+ end
@@ -0,0 +1,19 @@
1
+ class Actor
2
+ include Mongoid::Document
3
+ field :name
4
+ field :after_custom_count, type: Integer, default: 0
5
+ has_and_belongs_to_many :tags
6
+ embeds_many :things, validate: false, cascade_callbacks: true
7
+ accepts_nested_attributes_for :things, allow_destroy: true
8
+
9
+ define_model_callbacks :custom
10
+ observable :custom
11
+
12
+ def do_something
13
+ run_callbacks(:custom) do
14
+ self.name = "custom"
15
+ end
16
+ end
17
+ end
18
+
19
+ require "app/models/actress"
@@ -0,0 +1,15 @@
1
+ class ActorObserver < Mongoid::Observer
2
+ attr_reader :last_after_create_record
3
+
4
+ def after_create(record)
5
+ @last_after_create_record = record
6
+ end
7
+
8
+ def after_custom(record)
9
+ record.after_custom_count += 1
10
+ end
11
+
12
+ def before_custom(record)
13
+ @after_custom_called = true
14
+ end
15
+ end
@@ -0,0 +1,2 @@
1
+ class Actress < Actor
2
+ end
@@ -0,0 +1,72 @@
1
+ class Address
2
+ include Mongoid::Document
3
+
4
+ field :_id, type: String, default: ->{ street.try(:parameterize) }
5
+
6
+ attr_accessor :mode
7
+
8
+ field :address_type
9
+ field :number, type: Integer
10
+ field :street
11
+ field :city
12
+ field :state
13
+ field :post_code
14
+ field :parent_title
15
+ field :services, type: Array
16
+ field :latlng, type: Array
17
+ field :map, type: Hash
18
+ field :move_in, type: DateTime
19
+ field :s, type: String, as: :suite
20
+ field :name, localize: true
21
+
22
+ embeds_many :locations, validate: false
23
+ embeds_one :code, validate: false
24
+ embeds_one :target, as: :targetable, validate: false
25
+
26
+ embedded_in :addressable, polymorphic: true do
27
+ def extension
28
+ "Testing"
29
+ end
30
+ def doctor?
31
+ title == "Dr"
32
+ end
33
+ end
34
+
35
+ accepts_nested_attributes_for :code, :target
36
+ accepts_nested_attributes_for :locations, allow_destroy: true
37
+
38
+ belongs_to :account
39
+ belongs_to :band
40
+
41
+ scope :without_postcode, where(postcode: nil)
42
+ scope :rodeo, where(street: "Rodeo Dr") do
43
+ def mansion?
44
+ all? { |address| address.street == "Rodeo Dr" }
45
+ end
46
+ end
47
+
48
+ validates_presence_of :street, on: :update
49
+ validates_format_of :street, with: /\D/, allow_nil: true
50
+
51
+ def set_parent=(set = false)
52
+ self.parent_title = addressable.title if set
53
+ end
54
+
55
+ def <=>(other)
56
+ street <=> other.street
57
+ end
58
+
59
+ class << self
60
+ def california
61
+ where(state: "CA")
62
+ end
63
+
64
+ def homes
65
+ where(address_type: "Home")
66
+ end
67
+
68
+ def streets
69
+ all.map(&:street)
70
+ end
71
+ end
72
+ end