mongoid_rails4 4.0.0

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 (659) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +3213 -0
  3. data/LICENSE +20 -0
  4. data/README.md +62 -0
  5. data/Rakefile +35 -0
  6. data/lib/config/locales/en.yml +448 -0
  7. data/lib/mongoid.rb +104 -0
  8. data/lib/mongoid/atomic.rb +384 -0
  9. data/lib/mongoid/atomic/modifiers.rb +317 -0
  10. data/lib/mongoid/atomic/paths.rb +3 -0
  11. data/lib/mongoid/atomic/paths/embedded.rb +28 -0
  12. data/lib/mongoid/atomic/paths/embedded/many.rb +44 -0
  13. data/lib/mongoid/atomic/paths/embedded/one.rb +43 -0
  14. data/lib/mongoid/atomic/paths/root.rb +39 -0
  15. data/lib/mongoid/attributes.rb +284 -0
  16. data/lib/mongoid/attributes/dynamic.rb +154 -0
  17. data/lib/mongoid/attributes/nested.rb +82 -0
  18. data/lib/mongoid/attributes/processing.rb +147 -0
  19. data/lib/mongoid/attributes/readonly.rb +56 -0
  20. data/lib/mongoid/changeable.rb +379 -0
  21. data/lib/mongoid/composable.rb +104 -0
  22. data/lib/mongoid/config.rb +263 -0
  23. data/lib/mongoid/config/environment.rb +44 -0
  24. data/lib/mongoid/config/options.rb +74 -0
  25. data/lib/mongoid/config/validators.rb +3 -0
  26. data/lib/mongoid/config/validators/option.rb +25 -0
  27. data/lib/mongoid/config/validators/session.rb +140 -0
  28. data/lib/mongoid/contextual.rb +54 -0
  29. data/lib/mongoid/contextual/aggregable/memory.rb +109 -0
  30. data/lib/mongoid/contextual/aggregable/mongo.rb +147 -0
  31. data/lib/mongoid/contextual/atomic.rb +180 -0
  32. data/lib/mongoid/contextual/command.rb +61 -0
  33. data/lib/mongoid/contextual/eager.rb +158 -0
  34. data/lib/mongoid/contextual/find_and_modify.rb +69 -0
  35. data/lib/mongoid/contextual/geo_near.rb +238 -0
  36. data/lib/mongoid/contextual/map_reduce.rb +324 -0
  37. data/lib/mongoid/contextual/memory.rb +440 -0
  38. data/lib/mongoid/contextual/mongo.rb +676 -0
  39. data/lib/mongoid/contextual/queryable.rb +25 -0
  40. data/lib/mongoid/contextual/text_search.rb +180 -0
  41. data/lib/mongoid/copyable.rb +67 -0
  42. data/lib/mongoid/criteria.rb +562 -0
  43. data/lib/mongoid/criteria/findable.rb +179 -0
  44. data/lib/mongoid/criteria/inspectable.rb +25 -0
  45. data/lib/mongoid/criteria/marshalable.rb +50 -0
  46. data/lib/mongoid/criteria/modifiable.rb +189 -0
  47. data/lib/mongoid/criteria/scopable.rb +158 -0
  48. data/lib/mongoid/document.rb +361 -0
  49. data/lib/mongoid/equality.rb +66 -0
  50. data/lib/mongoid/errors.rb +40 -0
  51. data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
  52. data/lib/mongoid/errors/callback.rb +25 -0
  53. data/lib/mongoid/errors/delete_restriction.rb +29 -0
  54. data/lib/mongoid/errors/document_not_found.rb +111 -0
  55. data/lib/mongoid/errors/eager_load.rb +22 -0
  56. data/lib/mongoid/errors/invalid_collection.rb +18 -0
  57. data/lib/mongoid/errors/invalid_config_option.rb +27 -0
  58. data/lib/mongoid/errors/invalid_field.rb +64 -0
  59. data/lib/mongoid/errors/invalid_field_option.rb +35 -0
  60. data/lib/mongoid/errors/invalid_find.rb +19 -0
  61. data/lib/mongoid/errors/invalid_includes.rb +32 -0
  62. data/lib/mongoid/errors/invalid_index.rb +28 -0
  63. data/lib/mongoid/errors/invalid_options.rb +28 -0
  64. data/lib/mongoid/errors/invalid_path.rb +21 -0
  65. data/lib/mongoid/errors/invalid_scope.rb +24 -0
  66. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
  67. data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
  68. data/lib/mongoid/errors/invalid_time.rb +22 -0
  69. data/lib/mongoid/errors/inverse_not_found.rb +29 -0
  70. data/lib/mongoid/errors/mixed_relations.rb +32 -0
  71. data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
  72. data/lib/mongoid/errors/mongoid_error.rb +92 -0
  73. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
  74. data/lib/mongoid/errors/no_default_session.rb +23 -0
  75. data/lib/mongoid/errors/no_environment.rb +19 -0
  76. data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
  77. data/lib/mongoid/errors/no_metadata.rb +21 -0
  78. data/lib/mongoid/errors/no_parent.rb +24 -0
  79. data/lib/mongoid/errors/no_session_config.rb +22 -0
  80. data/lib/mongoid/errors/no_session_database.rb +27 -0
  81. data/lib/mongoid/errors/no_session_hosts.rb +27 -0
  82. data/lib/mongoid/errors/no_sessions_config.rb +20 -0
  83. data/lib/mongoid/errors/readonly_attribute.rb +25 -0
  84. data/lib/mongoid/errors/scope_overwrite.rb +21 -0
  85. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +20 -0
  86. data/lib/mongoid/errors/unknown_attribute.rb +25 -0
  87. data/lib/mongoid/errors/unsaved_document.rb +19 -0
  88. data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
  89. data/lib/mongoid/errors/validations.rb +29 -0
  90. data/lib/mongoid/evolvable.rb +19 -0
  91. data/lib/mongoid/extensions.rb +35 -0
  92. data/lib/mongoid/extensions/array.rb +180 -0
  93. data/lib/mongoid/extensions/big_decimal.rb +69 -0
  94. data/lib/mongoid/extensions/boolean.rb +21 -0
  95. data/lib/mongoid/extensions/date.rb +77 -0
  96. data/lib/mongoid/extensions/date_time.rb +73 -0
  97. data/lib/mongoid/extensions/false_class.rb +38 -0
  98. data/lib/mongoid/extensions/float.rb +56 -0
  99. data/lib/mongoid/extensions/hash.rb +209 -0
  100. data/lib/mongoid/extensions/integer.rb +67 -0
  101. data/lib/mongoid/extensions/module.rb +28 -0
  102. data/lib/mongoid/extensions/nil_class.rb +33 -0
  103. data/lib/mongoid/extensions/object.rb +274 -0
  104. data/lib/mongoid/extensions/object_id.rb +54 -0
  105. data/lib/mongoid/extensions/range.rb +79 -0
  106. data/lib/mongoid/extensions/regexp.rb +27 -0
  107. data/lib/mongoid/extensions/set.rb +55 -0
  108. data/lib/mongoid/extensions/string.rb +199 -0
  109. data/lib/mongoid/extensions/symbol.rb +54 -0
  110. data/lib/mongoid/extensions/time.rb +88 -0
  111. data/lib/mongoid/extensions/time_with_zone.rb +56 -0
  112. data/lib/mongoid/extensions/true_class.rb +38 -0
  113. data/lib/mongoid/factory.rb +46 -0
  114. data/lib/mongoid/fields.rb +542 -0
  115. data/lib/mongoid/fields/foreign_key.rb +174 -0
  116. data/lib/mongoid/fields/localized.rb +73 -0
  117. data/lib/mongoid/fields/standard.rb +273 -0
  118. data/lib/mongoid/fields/validators.rb +2 -0
  119. data/lib/mongoid/fields/validators/macro.rb +92 -0
  120. data/lib/mongoid/findable.rb +133 -0
  121. data/lib/mongoid/identity_map.rb +163 -0
  122. data/lib/mongoid/indexable.rb +147 -0
  123. data/lib/mongoid/indexable/specification.rb +115 -0
  124. data/lib/mongoid/indexable/validators/options.rb +103 -0
  125. data/lib/mongoid/inspectable.rb +59 -0
  126. data/lib/mongoid/interceptable.rb +265 -0
  127. data/lib/mongoid/loggable.rb +69 -0
  128. data/lib/mongoid/matchable.rb +152 -0
  129. data/lib/mongoid/matchable/all.rb +27 -0
  130. data/lib/mongoid/matchable/and.rb +30 -0
  131. data/lib/mongoid/matchable/default.rb +72 -0
  132. data/lib/mongoid/matchable/exists.rb +23 -0
  133. data/lib/mongoid/matchable/gt.rb +21 -0
  134. data/lib/mongoid/matchable/gte.rb +21 -0
  135. data/lib/mongoid/matchable/in.rb +24 -0
  136. data/lib/mongoid/matchable/lt.rb +21 -0
  137. data/lib/mongoid/matchable/lte.rb +21 -0
  138. data/lib/mongoid/matchable/ne.rb +21 -0
  139. data/lib/mongoid/matchable/nin.rb +21 -0
  140. data/lib/mongoid/matchable/or.rb +33 -0
  141. data/lib/mongoid/matchable/size.rb +21 -0
  142. data/lib/mongoid/persistable.rb +207 -0
  143. data/lib/mongoid/persistable/creatable.rb +189 -0
  144. data/lib/mongoid/persistable/deletable.rb +149 -0
  145. data/lib/mongoid/persistable/destroyable.rb +55 -0
  146. data/lib/mongoid/persistable/incrementable.rb +36 -0
  147. data/lib/mongoid/persistable/logical.rb +38 -0
  148. data/lib/mongoid/persistable/poppable.rb +39 -0
  149. data/lib/mongoid/persistable/pullable.rb +55 -0
  150. data/lib/mongoid/persistable/pushable.rb +62 -0
  151. data/lib/mongoid/persistable/renamable.rb +35 -0
  152. data/lib/mongoid/persistable/savable.rb +52 -0
  153. data/lib/mongoid/persistable/settable.rb +33 -0
  154. data/lib/mongoid/persistable/unsettable.rb +36 -0
  155. data/lib/mongoid/persistable/updatable.rb +151 -0
  156. data/lib/mongoid/persistable/upsertable.rb +55 -0
  157. data/lib/mongoid/positional.rb +71 -0
  158. data/lib/mongoid/railtie.rb +156 -0
  159. data/lib/mongoid/railties/database.rake +97 -0
  160. data/lib/mongoid/railties/document.rb +12 -0
  161. data/lib/mongoid/relations.rb +162 -0
  162. data/lib/mongoid/relations/accessors.rb +299 -0
  163. data/lib/mongoid/relations/auto_save.rb +106 -0
  164. data/lib/mongoid/relations/binding.rb +218 -0
  165. data/lib/mongoid/relations/bindings.rb +9 -0
  166. data/lib/mongoid/relations/bindings/embedded/in.rb +63 -0
  167. data/lib/mongoid/relations/bindings/embedded/many.rb +50 -0
  168. data/lib/mongoid/relations/bindings/embedded/one.rb +55 -0
  169. data/lib/mongoid/relations/bindings/referenced/in.rb +65 -0
  170. data/lib/mongoid/relations/bindings/referenced/many.rb +42 -0
  171. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +67 -0
  172. data/lib/mongoid/relations/bindings/referenced/one.rb +44 -0
  173. data/lib/mongoid/relations/builder.rb +57 -0
  174. data/lib/mongoid/relations/builders.rb +104 -0
  175. data/lib/mongoid/relations/builders/embedded/in.rb +29 -0
  176. data/lib/mongoid/relations/builders/embedded/many.rb +36 -0
  177. data/lib/mongoid/relations/builders/embedded/one.rb +30 -0
  178. data/lib/mongoid/relations/builders/nested_attributes/many.rb +174 -0
  179. data/lib/mongoid/relations/builders/nested_attributes/one.rb +126 -0
  180. data/lib/mongoid/relations/builders/referenced/in.rb +26 -0
  181. data/lib/mongoid/relations/builders/referenced/many.rb +27 -0
  182. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +40 -0
  183. data/lib/mongoid/relations/builders/referenced/one.rb +26 -0
  184. data/lib/mongoid/relations/cascading.rb +56 -0
  185. data/lib/mongoid/relations/cascading/delete.rb +44 -0
  186. data/lib/mongoid/relations/cascading/destroy.rb +43 -0
  187. data/lib/mongoid/relations/cascading/nullify.rb +35 -0
  188. data/lib/mongoid/relations/cascading/restrict.rb +39 -0
  189. data/lib/mongoid/relations/constraint.rb +49 -0
  190. data/lib/mongoid/relations/conversions.rb +34 -0
  191. data/lib/mongoid/relations/counter_cache.rb +105 -0
  192. data/lib/mongoid/relations/cyclic.rb +107 -0
  193. data/lib/mongoid/relations/embedded/batchable.rb +355 -0
  194. data/lib/mongoid/relations/embedded/in.rb +231 -0
  195. data/lib/mongoid/relations/embedded/many.rb +639 -0
  196. data/lib/mongoid/relations/embedded/one.rb +223 -0
  197. data/lib/mongoid/relations/macros.rb +356 -0
  198. data/lib/mongoid/relations/many.rb +208 -0
  199. data/lib/mongoid/relations/marshalable.rb +32 -0
  200. data/lib/mongoid/relations/metadata.rb +1174 -0
  201. data/lib/mongoid/relations/nested_builder.rb +74 -0
  202. data/lib/mongoid/relations/one.rb +48 -0
  203. data/lib/mongoid/relations/options.rb +48 -0
  204. data/lib/mongoid/relations/polymorphic.rb +39 -0
  205. data/lib/mongoid/relations/proxy.rb +270 -0
  206. data/lib/mongoid/relations/referenced/in.rb +297 -0
  207. data/lib/mongoid/relations/referenced/many.rb +787 -0
  208. data/lib/mongoid/relations/referenced/many_to_many.rb +486 -0
  209. data/lib/mongoid/relations/referenced/one.rb +290 -0
  210. data/lib/mongoid/relations/reflections.rb +62 -0
  211. data/lib/mongoid/relations/synchronization.rb +169 -0
  212. data/lib/mongoid/relations/targets.rb +2 -0
  213. data/lib/mongoid/relations/targets/enumerable.rb +473 -0
  214. data/lib/mongoid/relations/touchable.rb +94 -0
  215. data/lib/mongoid/reloadable.rb +95 -0
  216. data/lib/mongoid/scopable.rb +379 -0
  217. data/lib/mongoid/selectable.rb +59 -0
  218. data/lib/mongoid/serializable.rb +170 -0
  219. data/lib/mongoid/sessions.rb +330 -0
  220. data/lib/mongoid/sessions/factory.rb +129 -0
  221. data/lib/mongoid/sessions/mongo_uri.rb +93 -0
  222. data/lib/mongoid/sessions/options.rb +141 -0
  223. data/lib/mongoid/sessions/validators.rb +2 -0
  224. data/lib/mongoid/sessions/validators/storage.rb +49 -0
  225. data/lib/mongoid/shardable.rb +65 -0
  226. data/lib/mongoid/state.rb +97 -0
  227. data/lib/mongoid/threaded.rb +383 -0
  228. data/lib/mongoid/threaded/lifecycle.rb +164 -0
  229. data/lib/mongoid/timestamps.rb +15 -0
  230. data/lib/mongoid/timestamps/created.rb +30 -0
  231. data/lib/mongoid/timestamps/created/short.rb +19 -0
  232. data/lib/mongoid/timestamps/short.rb +10 -0
  233. data/lib/mongoid/timestamps/updated.rb +39 -0
  234. data/lib/mongoid/timestamps/updated/short.rb +19 -0
  235. data/lib/mongoid/traversable.rb +192 -0
  236. data/lib/mongoid/unit_of_work.rb +61 -0
  237. data/lib/mongoid/validatable.rb +180 -0
  238. data/lib/mongoid/validatable/associated.rb +48 -0
  239. data/lib/mongoid/validatable/format.rb +20 -0
  240. data/lib/mongoid/validatable/length.rb +20 -0
  241. data/lib/mongoid/validatable/localizable.rb +30 -0
  242. data/lib/mongoid/validatable/macros.rb +94 -0
  243. data/lib/mongoid/validatable/presence.rb +86 -0
  244. data/lib/mongoid/validatable/queryable.rb +30 -0
  245. data/lib/mongoid/validatable/uniqueness.rb +330 -0
  246. data/lib/mongoid/version.rb +4 -0
  247. data/lib/rack/mongoid.rb +2 -0
  248. data/lib/rack/mongoid/middleware/identity_map.rb +39 -0
  249. data/lib/rails/generators/mongoid/config/config_generator.rb +25 -0
  250. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +76 -0
  251. data/lib/rails/generators/mongoid/model/model_generator.rb +25 -0
  252. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +19 -0
  253. data/lib/rails/generators/mongoid/observer/observer_generator.rb +17 -0
  254. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +4 -0
  255. data/lib/rails/generators/mongoid_generator.rb +65 -0
  256. data/lib/rails/mongoid.rb +180 -0
  257. data/lib/support/ruby_version.rb +26 -0
  258. data/spec/app/models/account.rb +28 -0
  259. data/spec/app/models/acolyte.rb +17 -0
  260. data/spec/app/models/actor.rb +18 -0
  261. data/spec/app/models/actress.rb +2 -0
  262. data/spec/app/models/address.rb +77 -0
  263. data/spec/app/models/address_component.rb +5 -0
  264. data/spec/app/models/address_number.rb +6 -0
  265. data/spec/app/models/agency.rb +5 -0
  266. data/spec/app/models/agent.rb +12 -0
  267. data/spec/app/models/album.rb +14 -0
  268. data/spec/app/models/alert.rb +5 -0
  269. data/spec/app/models/animal.rb +25 -0
  270. data/spec/app/models/answer.rb +4 -0
  271. data/spec/app/models/appointment.rb +7 -0
  272. data/spec/app/models/article.rb +10 -0
  273. data/spec/app/models/artist.rb +66 -0
  274. data/spec/app/models/artwork.rb +4 -0
  275. data/spec/app/models/audio.rb +5 -0
  276. data/spec/app/models/augmentation.rb +11 -0
  277. data/spec/app/models/author.rb +4 -0
  278. data/spec/app/models/band.rb +26 -0
  279. data/spec/app/models/bar.rb +10 -0
  280. data/spec/app/models/basic.rb +6 -0
  281. data/spec/app/models/bed.rb +1 -0
  282. data/spec/app/models/big_palette.rb +2 -0
  283. data/spec/app/models/birthday.rb +13 -0
  284. data/spec/app/models/book.rb +13 -0
  285. data/spec/app/models/breed.rb +4 -0
  286. data/spec/app/models/browser.rb +6 -0
  287. data/spec/app/models/building.rb +5 -0
  288. data/spec/app/models/building_address.rb +5 -0
  289. data/spec/app/models/bus.rb +7 -0
  290. data/spec/app/models/business.rb +5 -0
  291. data/spec/app/models/callback_recorder.rb +25 -0
  292. data/spec/app/models/callback_test.rb +9 -0
  293. data/spec/app/models/canvas.rb +25 -0
  294. data/spec/app/models/car.rb +1 -0
  295. data/spec/app/models/cat.rb +8 -0
  296. data/spec/app/models/category.rb +8 -0
  297. data/spec/app/models/child.rb +4 -0
  298. data/spec/app/models/child_doc.rb +22 -0
  299. data/spec/app/models/church.rb +4 -0
  300. data/spec/app/models/circle.rb +3 -0
  301. data/spec/app/models/circuit.rb +4 -0
  302. data/spec/app/models/circus.rb +7 -0
  303. data/spec/app/models/code.rb +5 -0
  304. data/spec/app/models/comment.rb +16 -0
  305. data/spec/app/models/contractor.rb +5 -0
  306. data/spec/app/models/cookie.rb +6 -0
  307. data/spec/app/models/country_code.rb +8 -0
  308. data/spec/app/models/definition.rb +7 -0
  309. data/spec/app/models/description.rb +11 -0
  310. data/spec/app/models/dictionary.rb +10 -0
  311. data/spec/app/models/division.rb +10 -0
  312. data/spec/app/models/doctor.rb +12 -0
  313. data/spec/app/models/dog.rb +7 -0
  314. data/spec/app/models/dokument.rb +5 -0
  315. data/spec/app/models/dragon.rb +4 -0
  316. data/spec/app/models/driver.rb +7 -0
  317. data/spec/app/models/drug.rb +6 -0
  318. data/spec/app/models/dungeon.rb +4 -0
  319. data/spec/app/models/email.rb +6 -0
  320. data/spec/app/models/employer.rb +5 -0
  321. data/spec/app/models/entry.rb +6 -0
  322. data/spec/app/models/eraser.rb +1 -0
  323. data/spec/app/models/event.rb +22 -0
  324. data/spec/app/models/exhibition.rb +4 -0
  325. data/spec/app/models/exhibitor.rb +5 -0
  326. data/spec/app/models/eye.rb +9 -0
  327. data/spec/app/models/eye_bowl.rb +9 -0
  328. data/spec/app/models/face.rb +8 -0
  329. data/spec/app/models/favorite.rb +6 -0
  330. data/spec/app/models/filesystem.rb +5 -0
  331. data/spec/app/models/fire_hydrant.rb +6 -0
  332. data/spec/app/models/firefox.rb +4 -0
  333. data/spec/app/models/fish.rb +7 -0
  334. data/spec/app/models/folder.rb +7 -0
  335. data/spec/app/models/folder_item.rb +9 -0
  336. data/spec/app/models/fruits.rb +28 -0
  337. data/spec/app/models/game.rb +19 -0
  338. data/spec/app/models/ghost.rb +7 -0
  339. data/spec/app/models/home.rb +4 -0
  340. data/spec/app/models/house.rb +6 -0
  341. data/spec/app/models/html_writer.rb +3 -0
  342. data/spec/app/models/image.rb +22 -0
  343. data/spec/app/models/implant.rb +16 -0
  344. data/spec/app/models/item.rb +8 -0
  345. data/spec/app/models/jar.rb +7 -0
  346. data/spec/app/models/label.rb +40 -0
  347. data/spec/app/models/language.rb +5 -0
  348. data/spec/app/models/lat_lng.rb +15 -0
  349. data/spec/app/models/league.rb +11 -0
  350. data/spec/app/models/learner.rb +2 -0
  351. data/spec/app/models/line_item.rb +6 -0
  352. data/spec/app/models/location.rb +8 -0
  353. data/spec/app/models/login.rb +8 -0
  354. data/spec/app/models/manufacturer.rb +7 -0
  355. data/spec/app/models/meat.rb +4 -0
  356. data/spec/app/models/membership.rb +4 -0
  357. data/spec/app/models/mixed_drink.rb +4 -0
  358. data/spec/app/models/movie.rb +13 -0
  359. data/spec/app/models/my_hash.rb +2 -0
  360. data/spec/app/models/name.rb +23 -0
  361. data/spec/app/models/node.rb +5 -0
  362. data/spec/app/models/note.rb +12 -0
  363. data/spec/app/models/ordered_post.rb +6 -0
  364. data/spec/app/models/ordered_preference.rb +6 -0
  365. data/spec/app/models/oscar.rb +15 -0
  366. data/spec/app/models/override.rb +16 -0
  367. data/spec/app/models/ownable.rb +6 -0
  368. data/spec/app/models/owner.rb +6 -0
  369. data/spec/app/models/pack.rb +3 -0
  370. data/spec/app/models/page.rb +5 -0
  371. data/spec/app/models/page_question.rb +4 -0
  372. data/spec/app/models/palette.rb +7 -0
  373. data/spec/app/models/parent.rb +5 -0
  374. data/spec/app/models/parent_doc.rb +6 -0
  375. data/spec/app/models/passport.rb +5 -0
  376. data/spec/app/models/patient.rb +9 -0
  377. data/spec/app/models/pdf_writer.rb +3 -0
  378. data/spec/app/models/pencil.rb +1 -0
  379. data/spec/app/models/person.rb +205 -0
  380. data/spec/app/models/pet.rb +23 -0
  381. data/spec/app/models/pet_owner.rb +6 -0
  382. data/spec/app/models/phone.rb +11 -0
  383. data/spec/app/models/pizza.rb +7 -0
  384. data/spec/app/models/player.rb +35 -0
  385. data/spec/app/models/post.rb +44 -0
  386. data/spec/app/models/powerup.rb +11 -0
  387. data/spec/app/models/preference.rb +9 -0
  388. data/spec/app/models/princess.rb +8 -0
  389. data/spec/app/models/product.rb +15 -0
  390. data/spec/app/models/profile.rb +5 -0
  391. data/spec/app/models/pronunciation.rb +5 -0
  392. data/spec/app/models/purchase.rb +4 -0
  393. data/spec/app/models/question.rb +8 -0
  394. data/spec/app/models/quiz.rb +7 -0
  395. data/spec/app/models/rating.rb +8 -0
  396. data/spec/app/models/record.rb +46 -0
  397. data/spec/app/models/registry.rb +4 -0
  398. data/spec/app/models/role.rb +7 -0
  399. data/spec/app/models/root_category.rb +4 -0
  400. data/spec/app/models/sandwich.rb +4 -0
  401. data/spec/app/models/scheduler.rb +7 -0
  402. data/spec/app/models/seo.rb +7 -0
  403. data/spec/app/models/series.rb +4 -0
  404. data/spec/app/models/server.rb +13 -0
  405. data/spec/app/models/service.rb +22 -0
  406. data/spec/app/models/shape.rb +12 -0
  407. data/spec/app/models/shelf.rb +5 -0
  408. data/spec/app/models/shipping_container.rb +5 -0
  409. data/spec/app/models/shipping_pack.rb +3 -0
  410. data/spec/app/models/shop.rb +6 -0
  411. data/spec/app/models/short_agent.rb +4 -0
  412. data/spec/app/models/short_quiz.rb +5 -0
  413. data/spec/app/models/slave.rb +6 -0
  414. data/spec/app/models/song.rb +8 -0
  415. data/spec/app/models/sound.rb +5 -0
  416. data/spec/app/models/square.rb +4 -0
  417. data/spec/app/models/strategy.rb +3 -0
  418. data/spec/app/models/sub_item.rb +3 -0
  419. data/spec/app/models/subscription.rb +4 -0
  420. data/spec/app/models/survey.rb +5 -0
  421. data/spec/app/models/symptom.rb +6 -0
  422. data/spec/app/models/tag.rb +8 -0
  423. data/spec/app/models/target.rb +5 -0
  424. data/spec/app/models/template.rb +5 -0
  425. data/spec/app/models/thing.rb +9 -0
  426. data/spec/app/models/title.rb +3 -0
  427. data/spec/app/models/tool.rb +8 -0
  428. data/spec/app/models/topping.rb +5 -0
  429. data/spec/app/models/track.rb +38 -0
  430. data/spec/app/models/translation.rb +5 -0
  431. data/spec/app/models/tree.rb +9 -0
  432. data/spec/app/models/truck.rb +3 -0
  433. data/spec/app/models/user.rb +21 -0
  434. data/spec/app/models/user_account.rb +10 -0
  435. data/spec/app/models/validation_callback.rb +10 -0
  436. data/spec/app/models/vehicle.rb +11 -0
  437. data/spec/app/models/version.rb +5 -0
  438. data/spec/app/models/vet_visit.rb +5 -0
  439. data/spec/app/models/video.rb +13 -0
  440. data/spec/app/models/weapon.rb +11 -0
  441. data/spec/app/models/wiki_page.rb +14 -0
  442. data/spec/app/models/word.rb +15 -0
  443. data/spec/app/models/word_origin.rb +11 -0
  444. data/spec/app/models/writer.rb +11 -0
  445. data/spec/config/mongoid.yml +38 -0
  446. data/spec/mongoid/atomic/modifiers_spec.rb +456 -0
  447. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +118 -0
  448. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +110 -0
  449. data/spec/mongoid/atomic/paths/root_spec.rb +48 -0
  450. data/spec/mongoid/atomic/paths_spec.rb +270 -0
  451. data/spec/mongoid/atomic_spec.rb +365 -0
  452. data/spec/mongoid/attributes/nested_spec.rb +4832 -0
  453. data/spec/mongoid/attributes/readonly_spec.rb +169 -0
  454. data/spec/mongoid/attributes_spec.rb +1412 -0
  455. data/spec/mongoid/changeable_spec.rb +1507 -0
  456. data/spec/mongoid/composable_spec.rb +24 -0
  457. data/spec/mongoid/config/environment_spec.rb +83 -0
  458. data/spec/mongoid/config/options_spec.rb +56 -0
  459. data/spec/mongoid/config_spec.rb +318 -0
  460. data/spec/mongoid/contextual/aggregable/memory_spec.rb +293 -0
  461. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +455 -0
  462. data/spec/mongoid/contextual/atomic_spec.rb +529 -0
  463. data/spec/mongoid/contextual/find_and_modify_spec.rb +220 -0
  464. data/spec/mongoid/contextual/geo_near_spec.rb +405 -0
  465. data/spec/mongoid/contextual/map_reduce_spec.rb +464 -0
  466. data/spec/mongoid/contextual/memory_spec.rb +1236 -0
  467. data/spec/mongoid/contextual/mongo_spec.rb +1843 -0
  468. data/spec/mongoid/contextual/text_search_spec.rb +207 -0
  469. data/spec/mongoid/copyable_spec.rb +393 -0
  470. data/spec/mongoid/criteria/findable_spec.rb +1189 -0
  471. data/spec/mongoid/criteria/inspectable_spec.rb +27 -0
  472. data/spec/mongoid/criteria/marshalable_spec.rb +28 -0
  473. data/spec/mongoid/criteria/modifiable_spec.rb +1063 -0
  474. data/spec/mongoid/criteria/scopable_spec.rb +391 -0
  475. data/spec/mongoid/criteria_spec.rb +3821 -0
  476. data/spec/mongoid/document_spec.rb +1205 -0
  477. data/spec/mongoid/equality_spec.rb +241 -0
  478. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +29 -0
  479. data/spec/mongoid/errors/callback_spec.rb +29 -0
  480. data/spec/mongoid/errors/delete_restriction_spec.rb +29 -0
  481. data/spec/mongoid/errors/document_not_found_spec.rb +104 -0
  482. data/spec/mongoid/errors/eager_load_spec.rb +29 -0
  483. data/spec/mongoid/errors/invalid_collection_spec.rb +36 -0
  484. data/spec/mongoid/errors/invalid_config_option_spec.rb +29 -0
  485. data/spec/mongoid/errors/invalid_field_option_spec.rb +29 -0
  486. data/spec/mongoid/errors/invalid_field_spec.rb +37 -0
  487. data/spec/mongoid/errors/invalid_find_spec.rb +29 -0
  488. data/spec/mongoid/errors/invalid_includes_spec.rb +40 -0
  489. data/spec/mongoid/errors/invalid_index_spec.rb +29 -0
  490. data/spec/mongoid/errors/invalid_options_spec.rb +29 -0
  491. data/spec/mongoid/errors/invalid_path_spec.rb +23 -0
  492. data/spec/mongoid/errors/invalid_scope_spec.rb +29 -0
  493. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +17 -0
  494. data/spec/mongoid/errors/invalid_storage_options_spec.rb +29 -0
  495. data/spec/mongoid/errors/invalid_time_spec.rb +29 -0
  496. data/spec/mongoid/errors/inverse_not_found_spec.rb +29 -0
  497. data/spec/mongoid/errors/mixed_relations_spec.rb +29 -0
  498. data/spec/mongoid/errors/mixed_session_configuration_spec.rb +29 -0
  499. data/spec/mongoid/errors/mongoid_error_spec.rb +48 -0
  500. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +29 -0
  501. data/spec/mongoid/errors/no_environment_spec.rb +29 -0
  502. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +29 -0
  503. data/spec/mongoid/errors/no_metadata_spec.rb +23 -0
  504. data/spec/mongoid/errors/no_parent_spec.rb +29 -0
  505. data/spec/mongoid/errors/no_session_config_spec.rb +29 -0
  506. data/spec/mongoid/errors/no_session_database_spec.rb +29 -0
  507. data/spec/mongoid/errors/no_session_hosts_spec.rb +29 -0
  508. data/spec/mongoid/errors/no_sessions_config_spec.rb +29 -0
  509. data/spec/mongoid/errors/readonly_attribute_spec.rb +29 -0
  510. data/spec/mongoid/errors/scope_overwrite_spec.rb +29 -0
  511. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +29 -0
  512. data/spec/mongoid/errors/unknown_attribute_spec.rb +29 -0
  513. data/spec/mongoid/errors/unsaved_document_spec.rb +37 -0
  514. data/spec/mongoid/errors/unsupported_javascript_spec.rb +29 -0
  515. data/spec/mongoid/errors/validations_spec.rb +45 -0
  516. data/spec/mongoid/extensions/array_spec.rb +638 -0
  517. data/spec/mongoid/extensions/big_decimal_spec.rb +104 -0
  518. data/spec/mongoid/extensions/binary_spec.rb +60 -0
  519. data/spec/mongoid/extensions/boolean_spec.rb +135 -0
  520. data/spec/mongoid/extensions/date_spec.rb +235 -0
  521. data/spec/mongoid/extensions/date_time_spec.rb +155 -0
  522. data/spec/mongoid/extensions/false_class_spec.rb +42 -0
  523. data/spec/mongoid/extensions/float_spec.rb +133 -0
  524. data/spec/mongoid/extensions/hash_spec.rb +333 -0
  525. data/spec/mongoid/extensions/integer_spec.rb +136 -0
  526. data/spec/mongoid/extensions/module_spec.rb +42 -0
  527. data/spec/mongoid/extensions/nil_class_spec.rb +11 -0
  528. data/spec/mongoid/extensions/object_id_spec.rb +946 -0
  529. data/spec/mongoid/extensions/object_spec.rb +292 -0
  530. data/spec/mongoid/extensions/range_spec.rb +105 -0
  531. data/spec/mongoid/extensions/regexp_spec.rb +47 -0
  532. data/spec/mongoid/extensions/set_spec.rb +33 -0
  533. data/spec/mongoid/extensions/string_spec.rb +357 -0
  534. data/spec/mongoid/extensions/symbol_spec.rb +76 -0
  535. data/spec/mongoid/extensions/time_spec.rb +467 -0
  536. data/spec/mongoid/extensions/time_with_zone_spec.rb +405 -0
  537. data/spec/mongoid/extensions/true_class_spec.rb +42 -0
  538. data/spec/mongoid/extensions_spec.rb +15 -0
  539. data/spec/mongoid/factory_spec.rb +185 -0
  540. data/spec/mongoid/fields/foreign_key_spec.rb +694 -0
  541. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +184 -0
  542. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +201 -0
  543. data/spec/mongoid/fields/localized_spec.rb +386 -0
  544. data/spec/mongoid/fields/standard_spec.rb +166 -0
  545. data/spec/mongoid/fields_spec.rb +1229 -0
  546. data/spec/mongoid/findable_spec.rb +342 -0
  547. data/spec/mongoid/identity_map_spec.rb +564 -0
  548. data/spec/mongoid/indexable/specification_spec.rb +87 -0
  549. data/spec/mongoid/indexable_spec.rb +504 -0
  550. data/spec/mongoid/inspectable_spec.rb +49 -0
  551. data/spec/mongoid/interceptable_spec.rb +1564 -0
  552. data/spec/mongoid/loggable_spec.rb +21 -0
  553. data/spec/mongoid/matchable/all_spec.rb +31 -0
  554. data/spec/mongoid/matchable/and_spec.rb +162 -0
  555. data/spec/mongoid/matchable/default_spec.rb +130 -0
  556. data/spec/mongoid/matchable/exists_spec.rb +57 -0
  557. data/spec/mongoid/matchable/gt_spec.rb +75 -0
  558. data/spec/mongoid/matchable/gte_spec.rb +74 -0
  559. data/spec/mongoid/matchable/in_spec.rb +25 -0
  560. data/spec/mongoid/matchable/lt_spec.rb +74 -0
  561. data/spec/mongoid/matchable/lte_spec.rb +74 -0
  562. data/spec/mongoid/matchable/ne_spec.rb +25 -0
  563. data/spec/mongoid/matchable/nin_spec.rb +25 -0
  564. data/spec/mongoid/matchable/or_spec.rb +106 -0
  565. data/spec/mongoid/matchable/size_spec.rb +25 -0
  566. data/spec/mongoid/matchable_spec.rb +532 -0
  567. data/spec/mongoid/persistable/creatable_spec.rb +512 -0
  568. data/spec/mongoid/persistable/deletable_spec.rb +205 -0
  569. data/spec/mongoid/persistable/destroyable_spec.rb +148 -0
  570. data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
  571. data/spec/mongoid/persistable/logical_spec.rb +143 -0
  572. data/spec/mongoid/persistable/poppable_spec.rb +115 -0
  573. data/spec/mongoid/persistable/pullable_spec.rb +228 -0
  574. data/spec/mongoid/persistable/pushable_spec.rb +258 -0
  575. data/spec/mongoid/persistable/renamable_spec.rb +135 -0
  576. data/spec/mongoid/persistable/savable_spec.rb +432 -0
  577. data/spec/mongoid/persistable/settable_spec.rb +139 -0
  578. data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
  579. data/spec/mongoid/persistable/updatable_spec.rb +522 -0
  580. data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
  581. data/spec/mongoid/persistable_spec.rb +206 -0
  582. data/spec/mongoid/positional_spec.rb +227 -0
  583. data/spec/mongoid/railties/document_spec.rb +24 -0
  584. data/spec/mongoid/relations/accessors_spec.rb +736 -0
  585. data/spec/mongoid/relations/auto_save_spec.rb +261 -0
  586. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +171 -0
  587. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +54 -0
  588. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +77 -0
  589. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +241 -0
  590. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +153 -0
  591. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +178 -0
  592. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +131 -0
  593. data/spec/mongoid/relations/builders/embedded/in_spec.rb +34 -0
  594. data/spec/mongoid/relations/builders/embedded/many_spec.rb +132 -0
  595. data/spec/mongoid/relations/builders/embedded/one_spec.rb +99 -0
  596. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +234 -0
  597. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +250 -0
  598. data/spec/mongoid/relations/builders/referenced/in_spec.rb +241 -0
  599. data/spec/mongoid/relations/builders/referenced/many_spec.rb +137 -0
  600. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +178 -0
  601. data/spec/mongoid/relations/builders/referenced/one_spec.rb +124 -0
  602. data/spec/mongoid/relations/builders_spec.rb +226 -0
  603. data/spec/mongoid/relations/cascading/delete_spec.rb +101 -0
  604. data/spec/mongoid/relations/cascading/destroy_spec.rb +47 -0
  605. data/spec/mongoid/relations/cascading/nullify_spec.rb +32 -0
  606. data/spec/mongoid/relations/cascading/restrict_spec.rb +68 -0
  607. data/spec/mongoid/relations/cascading_spec.rb +355 -0
  608. data/spec/mongoid/relations/constraint_spec.rb +74 -0
  609. data/spec/mongoid/relations/conversions_spec.rb +126 -0
  610. data/spec/mongoid/relations/counter_cache_spec.rb +205 -0
  611. data/spec/mongoid/relations/cyclic_spec.rb +156 -0
  612. data/spec/mongoid/relations/embedded/dirty_spec.rb +65 -0
  613. data/spec/mongoid/relations/embedded/in_spec.rb +579 -0
  614. data/spec/mongoid/relations/embedded/many_spec.rb +3781 -0
  615. data/spec/mongoid/relations/embedded/one_spec.rb +1014 -0
  616. data/spec/mongoid/relations/macros_spec.rb +613 -0
  617. data/spec/mongoid/relations/metadata_spec.rb +1917 -0
  618. data/spec/mongoid/relations/options_spec.rb +35 -0
  619. data/spec/mongoid/relations/polymorphic_spec.rb +128 -0
  620. data/spec/mongoid/relations/proxy_spec.rb +48 -0
  621. data/spec/mongoid/relations/referenced/in_spec.rb +1435 -0
  622. data/spec/mongoid/relations/referenced/many_spec.rb +3546 -0
  623. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +3556 -0
  624. data/spec/mongoid/relations/referenced/one_spec.rb +1289 -0
  625. data/spec/mongoid/relations/reflections_spec.rb +101 -0
  626. data/spec/mongoid/relations/synchronization_spec.rb +449 -0
  627. data/spec/mongoid/relations/targets/enumerable_spec.rb +1710 -0
  628. data/spec/mongoid/relations/touchable_spec.rb +296 -0
  629. data/spec/mongoid/relations_spec.rb +188 -0
  630. data/spec/mongoid/reloadable_spec.rb +305 -0
  631. data/spec/mongoid/scopable_spec.rb +926 -0
  632. data/spec/mongoid/selectable_spec.rb +134 -0
  633. data/spec/mongoid/serializable_spec.rb +862 -0
  634. data/spec/mongoid/sessions/factory_spec.rb +312 -0
  635. data/spec/mongoid/sessions/mongo_uri_spec.rb +103 -0
  636. data/spec/mongoid/sessions/options_spec.rb +71 -0
  637. data/spec/mongoid/sessions_spec.rb +1078 -0
  638. data/spec/mongoid/shardable_spec.rb +61 -0
  639. data/spec/mongoid/state_spec.rb +102 -0
  640. data/spec/mongoid/threaded_spec.rb +258 -0
  641. data/spec/mongoid/timestamps/created/short_spec.rb +51 -0
  642. data/spec/mongoid/timestamps/created_spec.rb +44 -0
  643. data/spec/mongoid/timestamps/updated/short_spec.rb +90 -0
  644. data/spec/mongoid/timestamps/updated_spec.rb +86 -0
  645. data/spec/mongoid/timestamps_spec.rb +112 -0
  646. data/spec/mongoid/traversable_spec.rb +244 -0
  647. data/spec/mongoid/unit_of_work_spec.rb +196 -0
  648. data/spec/mongoid/validatable/associated_spec.rb +183 -0
  649. data/spec/mongoid/validatable/format_spec.rb +83 -0
  650. data/spec/mongoid/validatable/length_spec.rb +119 -0
  651. data/spec/mongoid/validatable/numericality_spec.rb +30 -0
  652. data/spec/mongoid/validatable/presence_spec.rb +511 -0
  653. data/spec/mongoid/validatable/uniqueness_spec.rb +2305 -0
  654. data/spec/mongoid/validatable_spec.rb +309 -0
  655. data/spec/mongoid_spec.rb +74 -0
  656. data/spec/rack/mongoid/middleware/identity_map_spec.rb +72 -0
  657. data/spec/rails/mongoid_spec.rb +462 -0
  658. data/spec/spec_helper.rb +103 -0
  659. metadata +1159 -0
@@ -0,0 +1,258 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Persistable::Pushable do
4
+
5
+ describe "#add_to_set" do
6
+
7
+ context "when the document is a root document" do
8
+
9
+ shared_examples_for "a unique pushable root document" do
10
+
11
+ it "adds single values" do
12
+ expect(person.aliases).to eq([ 1, 2, 4 ])
13
+ end
14
+
15
+ it "does not add duplicate values" do
16
+ expect(person.array).to eq([ 4, 5 ])
17
+ end
18
+
19
+ it "sets absent values" do
20
+ expect(person.test_array).to eq([ 1 ])
21
+ end
22
+
23
+ it "returns true" do
24
+ expect(add).to be_true
25
+ end
26
+
27
+ it "resets the dirty changes" do
28
+ expect(person).to_not be_changed
29
+ end
30
+
31
+ it "persists single adds" do
32
+ expect(person.reload.aliases).to eq([ 1, 2, 4 ])
33
+ end
34
+
35
+ it "persists absent values" do
36
+ expect(person.reload.test_array).to eq([ 1 ])
37
+ end
38
+
39
+ it "flattens only 1 level" do
40
+ expect(person.reload.arrays).to eq([[ 7, 8 ]])
41
+ end
42
+ end
43
+
44
+ let(:person) do
45
+ Person.create(aliases: [ 1, 2 ], array: [ 4, 5 ])
46
+ end
47
+
48
+ context "when provided string fields" do
49
+
50
+ let!(:add) do
51
+ person.add_to_set("aliases" => 4, "array" => [4, 5], "test_array" => 1, "arrays" => [[ 7, 8 ]])
52
+ end
53
+
54
+ it_behaves_like "a unique pushable root document"
55
+ end
56
+
57
+ context "when provided symbol fields" do
58
+
59
+ let!(:add) do
60
+ person.add_to_set(aliases: 4, array: [4, 5], test_array: 1, arrays: [[ 7, 8 ]])
61
+ end
62
+
63
+ it_behaves_like "a unique pushable root document"
64
+ end
65
+ end
66
+
67
+ context "when the document is embedded" do
68
+
69
+ shared_examples_for "a unique pushable embedded document" do
70
+
71
+ it "adds single values" do
72
+ expect(address.services).to eq([ 1, 4 ])
73
+ end
74
+
75
+ it "does not add duplicate values" do
76
+ expect(address.a).to eq([ 4, 5 ])
77
+ end
78
+
79
+ it "sets absent values" do
80
+ expect(address.test).to eq([ 1 ])
81
+ end
82
+
83
+ it "returns true" do
84
+ expect(add).to be_true
85
+ end
86
+
87
+ it "resets the dirty changes" do
88
+ expect(address).to_not be_changed
89
+ end
90
+
91
+ it "persists single adds" do
92
+ expect(address.reload.services).to eq([ 1, 4 ])
93
+ end
94
+
95
+ it "persists absent values" do
96
+ expect(address.reload.test).to eq([ 1 ])
97
+ end
98
+ end
99
+
100
+ let(:person) do
101
+ Person.create
102
+ end
103
+
104
+ let(:address) do
105
+ person.addresses.create(street: "t", services: [ 1 ], a: [ 4, 5 ])
106
+ end
107
+
108
+ context "when provided string fields" do
109
+
110
+ let!(:add) do
111
+ address.add_to_set("services" => 4, "a" => 5, "test" => 1)
112
+ end
113
+
114
+ it_behaves_like "a unique pushable embedded document"
115
+ end
116
+
117
+ context "when provided symbol fields" do
118
+
119
+ let!(:add) do
120
+ address.add_to_set(services: 4, a: 5, test: 1)
121
+ end
122
+
123
+ it_behaves_like "a unique pushable embedded document"
124
+ end
125
+ end
126
+ end
127
+
128
+ describe "#push" do
129
+
130
+ context "when the document is a root document" do
131
+
132
+ shared_examples_for "a pushable root document" do
133
+
134
+ it "pushes single values" do
135
+ expect(person.aliases).to eq([ 1, 2, 3, 4 ])
136
+ end
137
+
138
+ it "pushes multiple values" do
139
+ expect(person.array).to eq([ 4, 5, 6, 7, 8 ])
140
+ end
141
+
142
+ it "sets absent values" do
143
+ expect(person.test_array).to eq([ 1 ])
144
+ end
145
+
146
+ it "returns true" do
147
+ expect(push).to be_true
148
+ end
149
+
150
+ it "resets the dirty changes" do
151
+ expect(person).to_not be_changed
152
+ end
153
+
154
+ it "persists single pushes" do
155
+ expect(person.reload.aliases).to eq([ 1, 2, 3, 4 ])
156
+ end
157
+
158
+ it "persists multiple pushes" do
159
+ expect(person.reload.array).to eq([ 4, 5, 6, 7, 8 ])
160
+ end
161
+
162
+ it "persists absent values" do
163
+ expect(person.reload.test_array).to eq([ 1 ])
164
+ end
165
+
166
+ it "flattens only 1 level" do
167
+ expect(person.reload.arrays).to eq([[ 7, 8 ]])
168
+ end
169
+ end
170
+
171
+ let(:person) do
172
+ Person.create(aliases: [ 1, 2, 3 ], array: [ 4, 5, 6 ])
173
+ end
174
+
175
+ context "when provided string fields" do
176
+
177
+ let!(:push) do
178
+ person.push("aliases" => 4, "array" => [ 7, 8 ], "test_array" => 1, "arrays" => [[ 7, 8 ]])
179
+ end
180
+
181
+ it_behaves_like "a pushable root document"
182
+ end
183
+
184
+ context "when provided symbol fields" do
185
+
186
+ let!(:push) do
187
+ person.push(aliases: 4, array: [ 7, 8 ], test_array: 1, arrays: [[ 7, 8 ]])
188
+ end
189
+
190
+ it_behaves_like "a pushable root document"
191
+ end
192
+ end
193
+
194
+ context "when the document is embedded" do
195
+
196
+ shared_examples_for "a pushable embedded document" do
197
+
198
+ it "pushes single values" do
199
+ expect(address.services).to eq([ 1, 4 ])
200
+ end
201
+
202
+ it "pushes multiple values" do
203
+ expect(address.a).to eq([ 4, 5, 6, 7 ])
204
+ end
205
+
206
+ it "sets absent values" do
207
+ expect(address.test).to eq([ 1 ])
208
+ end
209
+
210
+ it "returns true" do
211
+ expect(push).to be_true
212
+ end
213
+
214
+ it "resets the dirty changes" do
215
+ expect(address).to_not be_changed
216
+ end
217
+
218
+ it "persists single pushes" do
219
+ expect(address.reload.services).to eq([ 1, 4 ])
220
+ end
221
+
222
+ it "persists multiple pushes" do
223
+ expect(address.reload.a).to eq([ 4, 5, 6, 7 ])
224
+ end
225
+
226
+ it "persists absent values" do
227
+ expect(address.reload.test).to eq([ 1 ])
228
+ end
229
+ end
230
+
231
+ let(:person) do
232
+ Person.create
233
+ end
234
+
235
+ let(:address) do
236
+ person.addresses.create(street: "t", services: [ 1 ], a: [ 4, 5 ])
237
+ end
238
+
239
+ context "when provided string fields" do
240
+
241
+ let!(:push) do
242
+ address.push("services" => 4, "a" => [ 6, 7 ], "test" => 1)
243
+ end
244
+
245
+ it_behaves_like "a pushable embedded document"
246
+ end
247
+
248
+ context "when provided symbol fields" do
249
+
250
+ let!(:push) do
251
+ address.push(services: 4, a: [ 6, 7 ], test: 1)
252
+ end
253
+
254
+ it_behaves_like "a pushable embedded document"
255
+ end
256
+ end
257
+ end
258
+ end
@@ -0,0 +1,135 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Persistable::Renamable do
4
+
5
+ describe "#rename" do
6
+
7
+ context "when the document is a root document" do
8
+
9
+ shared_examples_for "a renamable root document" do
10
+
11
+ it "renames the first field" do
12
+ expect(person.salutation).to eq("sir")
13
+ end
14
+
15
+ it "removes the first original value" do
16
+ expect(person.title).to be_nil
17
+ end
18
+
19
+ it "renames the second field" do
20
+ expect(person.date_of_birth.to_date).to eq(date)
21
+ end
22
+
23
+ it "removes the second original value" do
24
+ expect(person.dob).to be_nil
25
+ end
26
+
27
+ it "returns true" do
28
+ expect(rename).to be_true
29
+ end
30
+
31
+ it "persists the first rename" do
32
+ expect(person.reload.salutation).to eq("sir")
33
+ end
34
+
35
+ it "persists the first original removal" do
36
+ expect(person.reload.title).to be_nil
37
+ end
38
+
39
+ it "persists the second rename" do
40
+ expect(person.reload.date_of_birth.to_date).to eq(date)
41
+ end
42
+
43
+ it "persists the second original removal" do
44
+ expect(person.reload.dob).to be_nil
45
+ end
46
+
47
+ it "clears out the dirty changes" do
48
+ expect(person).to_not be_changed
49
+ end
50
+ end
51
+
52
+ let(:date) do
53
+ Date.new(2013, 1, 1)
54
+ end
55
+
56
+ let(:person) do
57
+ Person.create(title: "sir", dob: date)
58
+ end
59
+
60
+ context "when provided symbol names" do
61
+
62
+ let!(:rename) do
63
+ person.rename(title: :salutation, dob: :date_of_birth)
64
+ end
65
+
66
+ it_behaves_like "a renamable root document"
67
+ end
68
+
69
+ context "when provided string names" do
70
+
71
+ let!(:rename) do
72
+ person.rename(title: "salutation", dob: "date_of_birth")
73
+ end
74
+
75
+ it_behaves_like "a renamable root document"
76
+ end
77
+ end
78
+
79
+ context "when the document is embedded" do
80
+
81
+ shared_examples_for "a renamable embedded document" do
82
+
83
+ it "renames the first field" do
84
+ expect(name.mi).to eq("blah")
85
+ end
86
+
87
+ it "removes the first original value" do
88
+ expect(name.middle).to be_nil
89
+ end
90
+
91
+ it "returns true" do
92
+ expect(rename).to be_true
93
+ end
94
+
95
+ it "persists the first rename" do
96
+ expect(name.reload.mi).to eq("blah")
97
+ end
98
+
99
+ it "persists the first original removal" do
100
+ expect(name.reload.middle).to be_nil
101
+ end
102
+
103
+ it "clears out the dirty changes" do
104
+ expect(name).to_not be_changed
105
+ end
106
+ end
107
+
108
+ let(:person) do
109
+ Person.create
110
+ end
111
+
112
+ let(:name) do
113
+ person.create_name(first_name: "test", last_name: "user", middle: "blah")
114
+ end
115
+
116
+ context "when provided symbol names" do
117
+
118
+ let!(:rename) do
119
+ name.rename(middle: :mi)
120
+ end
121
+
122
+ it_behaves_like "a renamable embedded document"
123
+ end
124
+
125
+ context "when provided string names" do
126
+
127
+ let!(:rename) do
128
+ name.rename(middle: "mi")
129
+ end
130
+
131
+ it_behaves_like "a renamable embedded document"
132
+ end
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,432 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Persistable::Savable do
4
+
5
+ describe "#save" do
6
+
7
+ let(:person) do
8
+ Person.create
9
+ end
10
+
11
+ context "when skipping validation" do
12
+
13
+ context "when no relations are involved" do
14
+
15
+ let(:account) do
16
+ Account.new
17
+ end
18
+
19
+ let!(:saved) do
20
+ account.save(validate: false)
21
+ end
22
+
23
+ it "returns true" do
24
+ expect(saved).to be_true
25
+ end
26
+
27
+ it "saves the document" do
28
+ expect(account).to be_persisted
29
+ end
30
+
31
+ it "does not add any validation errors" do
32
+ expect(account.errors).to be_empty
33
+ end
34
+ end
35
+
36
+ context "when saving document that is a belongs to child" do
37
+
38
+ let(:account) do
39
+ Account.create
40
+ end
41
+
42
+ let(:alert) do
43
+ Alert.new(account: account)
44
+ end
45
+
46
+ context "when validating presence of the parent" do
47
+
48
+ before do
49
+ Alert.validates(:message, :account, presence: true)
50
+ end
51
+
52
+ after do
53
+ Alert.reset_callbacks(:validate)
54
+ end
55
+
56
+ context "when the parent validates associated on the child" do
57
+
58
+ before do
59
+ alert.save(validate: false)
60
+ end
61
+
62
+ it "clears any errors off the document" do
63
+ expect(alert.errors).to be_empty
64
+ end
65
+
66
+ context "when the document is not new" do
67
+
68
+ before do
69
+ alert.save(validate: false)
70
+ end
71
+
72
+ it "clears any errors off the document" do
73
+ expect(alert.errors).to be_empty
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+
81
+ context "when the document has been instantiated with limited fields" do
82
+
83
+ before do
84
+ person.age = 20
85
+ person.save
86
+ end
87
+
88
+ context "when a default is excluded" do
89
+
90
+ let(:limited) do
91
+ Person.only(:_id).find(person.id)
92
+ end
93
+
94
+ it "does not flag the excluded fields as dirty" do
95
+ expect(limited.changes).to be_empty
96
+ end
97
+
98
+ it "does not overwrite with the default" do
99
+ limited.save
100
+ expect(limited.reload.age).to eq(20)
101
+ end
102
+ end
103
+
104
+ context "when iterating over the documents" do
105
+
106
+ let(:limited) do
107
+ Person.only(:_id)
108
+ end
109
+
110
+ it "does not flag any changes" do
111
+ limited.each do |person|
112
+ expect(person.changes).to be_empty
113
+ end
114
+ end
115
+ end
116
+ end
117
+
118
+ context "when validation passes" do
119
+
120
+ it "returns true" do
121
+ expect(person.save).to be_true
122
+ end
123
+ end
124
+
125
+ context "when validation fails" do
126
+
127
+ let(:address) do
128
+ person.addresses.create(city: "London")
129
+ end
130
+
131
+ before do
132
+ address.save
133
+ end
134
+
135
+ it "has the appropriate errors" do
136
+ expect(address.errors[:street]).to eq(["can't be blank"])
137
+ end
138
+ end
139
+
140
+ context "when modifying the entire hierarchy" do
141
+
142
+ context "when performing modification and insert ops" do
143
+
144
+ let(:person) do
145
+ Person.create(title: "Blah")
146
+ end
147
+
148
+ let!(:address) do
149
+ person.addresses.build(street: "Bond St")
150
+ end
151
+
152
+ let!(:name) do
153
+ person.create_name(first_name: "Tony")
154
+ end
155
+
156
+ let(:from_db) do
157
+ Person.find(person.id)
158
+ end
159
+
160
+ before do
161
+ person.title = "King"
162
+ name.first_name = "Ryan"
163
+ end
164
+
165
+ it "persists with proper set and push modifiers" do
166
+ expect(person.atomic_updates).to eq({
167
+ "$set" => {
168
+ "title" => "King",
169
+ "name.first_name" => "Ryan"
170
+ },
171
+ "$pushAll"=> {
172
+ "addresses" => [ { "_id" => address.id, "street" => "Bond St" } ]
173
+ }
174
+ })
175
+ end
176
+
177
+ context "when saving the document" do
178
+
179
+ it "saves the root document" do
180
+ expect(person.title).to eq("King")
181
+ end
182
+
183
+ it "saves embedded many relations" do
184
+ expect(person.addresses.first.street).to eq("Bond St")
185
+ end
186
+
187
+ it "saves embedded one relations" do
188
+ expect(person.name.first_name).to eq("Ryan")
189
+ end
190
+ end
191
+ end
192
+
193
+ context "when combining modifications and pushes" do
194
+
195
+ let!(:location) do
196
+ Location.new(name: 'Work')
197
+ end
198
+
199
+ let!(:address) do
200
+ Address.new(
201
+ number: 101,
202
+ street: 'South St',
203
+ locations: [ location ]
204
+ )
205
+ end
206
+
207
+ let!(:person) do
208
+ Person.create(
209
+ title: "Blah",
210
+ addresses: [ address ]
211
+ )
212
+ end
213
+
214
+ let(:from_db) do
215
+ Person.find(person.id)
216
+ end
217
+
218
+ before do
219
+ address.number = 102
220
+ person.addresses << Address.new(street: "North Ave")
221
+ person.save
222
+ end
223
+
224
+ it "saves modifications to existing embedded docs" do
225
+ expect(from_db.addresses[0].number).to eq(102)
226
+ end
227
+
228
+ it "saves modifications to new embedded docs" do
229
+ expect(from_db.addresses[1].street).to eq('North Ave')
230
+ end
231
+
232
+ it "saves modifications to deeply embedded docs" do
233
+ expect(from_db.addresses[0].locations.first.name).to eq('Work')
234
+ end
235
+ end
236
+
237
+ context "when removing elements without using delete or destroy" do
238
+
239
+ let!(:person) do
240
+ Person.create!(title: "Blah")
241
+ end
242
+
243
+ let(:from_db) do
244
+ Person.find(person.id)
245
+ end
246
+
247
+ before do
248
+ person.create_name(first_name: "Tony")
249
+ person.name = nil
250
+ person.save
251
+ end
252
+
253
+ it "saves the hierarchy" do
254
+ expect(person.name).to be_nil
255
+ end
256
+ end
257
+ end
258
+
259
+ context "when setting floating point numbers" do
260
+
261
+ context "when value is an empty string" do
262
+
263
+ let(:person) do
264
+ Person.new
265
+ end
266
+
267
+ before do
268
+ Person.validates_numericality_of :blood_alcohol_content, allow_blank: true
269
+ end
270
+
271
+ it "does not set the value" do
272
+ expect(person.save).to be_true
273
+ end
274
+ end
275
+ end
276
+ end
277
+
278
+ describe "save!" do
279
+
280
+ context "inserting with a field that is not unique" do
281
+
282
+ context "when a unique index exists" do
283
+
284
+ let(:person) do
285
+ Person.new(ssn: "555-55-9999")
286
+ end
287
+
288
+ before do
289
+ Person.create_indexes
290
+ Person.create!(ssn: "555-55-9999")
291
+ end
292
+
293
+ it "raises an error" do
294
+ expect { person.with(safe: true).save! }.to raise_error
295
+ end
296
+ end
297
+ end
298
+
299
+ context "with a validation error" do
300
+
301
+ let(:person) do
302
+ Person.new
303
+ end
304
+
305
+ let!(:service) do
306
+ Service.new(person: person, sid: "a")
307
+ end
308
+
309
+ it "raises an error with multiple save attempts" do
310
+ expect { subject.save! }.to raise_error
311
+ expect { subject.save! }.to raise_error
312
+ end
313
+ end
314
+
315
+ context "when a callback returns false" do
316
+
317
+ let(:oscar) do
318
+ Oscar.new
319
+ end
320
+
321
+ it "raises a callback error" do
322
+ expect { oscar.save! }.to raise_error(Mongoid::Errors::Callback)
323
+ end
324
+ end
325
+
326
+ context "when a callback destroys the document" do
327
+
328
+ let(:oscar) do
329
+ Oscar.new(:destroy_after_save => true)
330
+ end
331
+
332
+ before do
333
+ oscar.save!
334
+ end
335
+
336
+ it "flags the document as destroyed" do
337
+ expect(oscar).to be_destroyed
338
+ end
339
+ end
340
+
341
+ context "when a DateTime attribute is updated and persisted" do
342
+
343
+ let(:user) do
344
+ User.create!(last_login: 2.days.ago).tap do |u|
345
+ u.last_login = DateTime.now
346
+ end
347
+ end
348
+
349
+ it "reads for persistance as a UTC Time" do
350
+ expect(user.changes["last_login"].last.class).to eq(Time)
351
+ end
352
+
353
+ it "persists with no exceptions thrown" do
354
+ expect {
355
+ user.save!
356
+ }.not_to raise_error
357
+ end
358
+ end
359
+
360
+ context "when a Date attribute is persisted" do
361
+
362
+ let(:user) do
363
+ User.create!(account_expires: 2.years.from_now).tap do |u|
364
+ u.account_expires = "2/2/2002".to_date
365
+ end
366
+ end
367
+
368
+ it "reads for persistance as a UTC Time" do
369
+ expect(user.changes["account_expires"].last.class).to eq(Time)
370
+ end
371
+
372
+ it "persists with no exceptions thrown" do
373
+ expect {
374
+ user.save!
375
+ }.not_to raise_error
376
+ end
377
+ end
378
+
379
+ context "when the document has associations" do
380
+
381
+ let!(:firefox) do
382
+ Firefox.create(name: "firefox")
383
+ end
384
+
385
+ let!(:writer) do
386
+ HtmlWriter.new(speed: 100)
387
+ end
388
+
389
+ let!(:circle) do
390
+ Circle.new(radius: 50)
391
+ end
392
+
393
+ let!(:square) do
394
+ Square.new(width: 300, height: 150)
395
+ end
396
+
397
+ let(:from_db) do
398
+ Firefox.find(firefox.id)
399
+ end
400
+
401
+ before do
402
+ firefox.writer = writer
403
+ firefox.shapes << [ circle, square ]
404
+ firefox.save!
405
+ end
406
+
407
+ it "properly persists the one-to-one type" do
408
+ expect(from_db).to be_a_kind_of(Firefox)
409
+ end
410
+
411
+ it "properly persists the one-to-one relations" do
412
+ expect(from_db.writer).to eq(writer)
413
+ end
414
+
415
+ it "properly persists the one-to-many type" do
416
+ expect(from_db.shapes.first).to eq(circle)
417
+ end
418
+
419
+ it "properly persists the one-to-many relations" do
420
+ expect(from_db.shapes.last).to eq(square)
421
+ end
422
+
423
+ it "properly sets up the parent relation" do
424
+ expect(from_db.shapes.first).to eq(circle)
425
+ end
426
+
427
+ it "properly sets up the entire hierarchy" do
428
+ expect(from_db.shapes.first.canvas).to eq(firefox)
429
+ end
430
+ end
431
+ end
432
+ end