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,27 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Criteria::Inspectable do
4
+
5
+ describe "#inspect" do
6
+
7
+ let(:criteria) do
8
+ Person.where(:age.gt => 10, title: "Sir")
9
+ end
10
+
11
+ it "includes the selector" do
12
+ expect(criteria.inspect).to include("selector")
13
+ end
14
+
15
+ it "includes the options" do
16
+ expect(criteria.inspect).to include("options")
17
+ end
18
+
19
+ it "includes the class" do
20
+ expect(criteria.inspect).to include("class")
21
+ end
22
+
23
+ it "includes the embedded flag" do
24
+ expect(criteria.inspect).to include("embedded")
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,28 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Criteria::Marshalable do
4
+
5
+ describe "Marshal.dump" do
6
+
7
+ let(:criteria) do
8
+ Band.where(name: "Depeche Mode")
9
+ end
10
+
11
+ it "does not error" do
12
+ expect {
13
+ Marshal.dump(criteria)
14
+ }.not_to raise_error
15
+ end
16
+ end
17
+
18
+ describe "Marshal.load" do
19
+
20
+ let(:criteria) do
21
+ Band.where(name: "Depeche Mode")
22
+ end
23
+
24
+ it "loads the proper attributes" do
25
+ expect(Marshal.load(Marshal.dump(criteria))).to eq(criteria)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,1063 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Criteria::Modifiable do
4
+
5
+ describe "#create" do
6
+
7
+ let(:criteria) do
8
+ Band.where(name: "Depeche Mode")
9
+ end
10
+
11
+ context "when provided valid attributes" do
12
+ let(:band) do
13
+ criteria.create(genres: [ "electro" ])
14
+ end
15
+
16
+ it "returns the created document" do
17
+ expect(band).to be_persisted
18
+ end
19
+
20
+ it "sets the criteria attributes" do
21
+ expect(band.name).to eq("Depeche Mode")
22
+ end
23
+
24
+ it "sets the attributes passed to build" do
25
+ expect(band.genres).to eq([ "electro" ])
26
+ end
27
+ end
28
+
29
+ context "when provided a block" do
30
+
31
+ context "when provided valid attributes & using block" do
32
+
33
+ let(:band) do
34
+ criteria.create do |c|
35
+ c.genres = [ "electro" ]
36
+ end
37
+ end
38
+
39
+ it "returns the created document" do
40
+ expect(band).to be_persisted
41
+ end
42
+
43
+ it "sets the criteria attributes" do
44
+ expect(band.name).to eq("Depeche Mode")
45
+ end
46
+
47
+ it "sets the attributes passed to build" do
48
+ expect(band.genres).to eq([ "electro" ])
49
+ end
50
+ end
51
+ end
52
+ end
53
+
54
+ describe "#create!" do
55
+
56
+ let(:criteria) do
57
+ Account.where(number: "11123213")
58
+ end
59
+
60
+ context "when provided invalid attributes" do
61
+
62
+ it "raises an error" do
63
+ expect {
64
+ criteria.create!
65
+ }.to raise_error(Mongoid::Errors::Validations)
66
+ end
67
+ end
68
+ end
69
+
70
+ [ :delete, :delete_all, :destroy, :destroy_all ].each do |method|
71
+
72
+ describe "##{method}" do
73
+
74
+ let(:name) do
75
+ Name.new(first_name: "Durran")
76
+ end
77
+
78
+ let(:address_one) do
79
+ Address.new(street: "Forsterstr")
80
+ end
81
+
82
+ let(:address_two) do
83
+ Address.new(street: "Hobrechtstr")
84
+ end
85
+
86
+ before do
87
+ Person.create(title: "Madam")
88
+ 2.times do |n|
89
+ Person.create(
90
+ title: "Sir",
91
+ name: name,
92
+ addresses: [ address_one, address_two ]
93
+ )
94
+ end
95
+ end
96
+
97
+ context "when removing root documents" do
98
+
99
+ let(:criteria) do
100
+ Person.where(title: "Sir", :age.gt => 5)
101
+ end
102
+
103
+ let!(:removed) do
104
+ criteria.send(method)
105
+ end
106
+
107
+ it "deletes the removes the documents from the database" do
108
+ expect(Person.count).to eq(1)
109
+ end
110
+
111
+ it "returns the number removed" do
112
+ expect(removed).to eq(2)
113
+ end
114
+ end
115
+
116
+ context "when removing embedded documents" do
117
+
118
+ context "when removing a single document" do
119
+
120
+ let(:person) do
121
+ Person.where(title: "Sir").first
122
+ end
123
+
124
+ let(:criteria) do
125
+ person.addresses.where(street: "Forsterstr")
126
+ end
127
+
128
+ let!(:removed) do
129
+ criteria.send(method)
130
+ end
131
+
132
+ it "deletes the removes the documents from the database" do
133
+ expect(person.addresses.count).to eq(1)
134
+ end
135
+
136
+ it "returns the number removed" do
137
+ expect(removed).to eq(1)
138
+ end
139
+ end
140
+
141
+ context "when removing multiple documents" do
142
+
143
+ let(:person) do
144
+ Person.where(title: "Sir").first
145
+ end
146
+
147
+ let(:criteria) do
148
+ person.addresses.where(city: nil)
149
+ end
150
+
151
+ let!(:removed) do
152
+ criteria.send(method)
153
+ end
154
+
155
+ it "deletes the removes the documents from the database" do
156
+ expect(person.addresses.count).to eq(0)
157
+ end
158
+
159
+ it "returns the number removed" do
160
+ expect(removed).to eq(2)
161
+ end
162
+ end
163
+ end
164
+ end
165
+ end
166
+
167
+ describe ".find_or_create_by" do
168
+
169
+ context "when the document is found" do
170
+
171
+ context "when providing an attribute" do
172
+
173
+ let!(:person) do
174
+ Person.create(title: "Senior")
175
+ end
176
+
177
+ it "returns the document" do
178
+ expect(Person.find_or_create_by(title: "Senior")).to eq(person)
179
+ end
180
+ end
181
+
182
+ context "when providing a document" do
183
+
184
+ context "with an owner with a BSON identity type" do
185
+
186
+ let!(:person) do
187
+ Person.create
188
+ end
189
+
190
+ let!(:game) do
191
+ Game.create(person: person)
192
+ end
193
+
194
+ context "when providing the object directly" do
195
+
196
+ let(:from_db) do
197
+ Game.find_or_create_by(person: person)
198
+ end
199
+
200
+ it "returns the document" do
201
+ expect(from_db).to eq(game)
202
+ end
203
+ end
204
+
205
+ context "when providing the proxy relation" do
206
+
207
+ let(:from_db) do
208
+ Game.find_or_create_by(person: game.person)
209
+ end
210
+
211
+ it "returns the document" do
212
+ expect(from_db).to eq(game)
213
+ end
214
+ end
215
+ end
216
+
217
+ context "with an owner with an Integer identity type" do
218
+
219
+ let!(:jar) do
220
+ Jar.create
221
+ end
222
+
223
+ let!(:cookie) do
224
+ Cookie.create(jar: jar)
225
+ end
226
+
227
+ let(:from_db) do
228
+ Cookie.find_or_create_by(jar: jar)
229
+ end
230
+
231
+ it "returns the document" do
232
+ expect(from_db).to eq(cookie)
233
+ end
234
+ end
235
+ end
236
+ end
237
+
238
+ context "when the document is not found" do
239
+
240
+ context "when providing a document" do
241
+
242
+ let!(:person) do
243
+ Person.create
244
+ end
245
+
246
+ let!(:game) do
247
+ Game.create
248
+ end
249
+
250
+ let(:from_db) do
251
+ Game.find_or_create_by(person: person)
252
+ end
253
+
254
+ it "returns the new document" do
255
+ expect(from_db.person).to eq(person)
256
+ end
257
+
258
+ it "does not return an existing false document" do
259
+ expect(from_db).to_not eq(game)
260
+ end
261
+ end
262
+
263
+ context "when not providing a block" do
264
+
265
+ let!(:person) do
266
+ Person.find_or_create_by(title: "Senorita")
267
+ end
268
+
269
+ it "creates a persisted document" do
270
+ expect(person).to be_persisted
271
+ end
272
+
273
+ it "sets the attributes" do
274
+ expect(person.title).to eq("Senorita")
275
+ end
276
+ end
277
+
278
+ context "when providing a block" do
279
+
280
+ let!(:person) do
281
+ Person.find_or_create_by(title: "Senorita") do |person|
282
+ person.pets = true
283
+ end
284
+ end
285
+
286
+ it "creates a persisted document" do
287
+ expect(person).to be_persisted
288
+ end
289
+
290
+ it "sets the attributes" do
291
+ expect(person.title).to eq("Senorita")
292
+ end
293
+
294
+ it "calls the block" do
295
+ expect(person.pets).to be_true
296
+ end
297
+ end
298
+ end
299
+ end
300
+
301
+ describe ".find_or_initialize_by" do
302
+
303
+ context "when the document is found" do
304
+
305
+ let!(:person) do
306
+ Person.create(title: "Senior")
307
+ end
308
+
309
+ it "returns the document" do
310
+ expect(Person.find_or_initialize_by(title: "Senior")).to eq(person)
311
+ end
312
+ end
313
+
314
+ context "when the document is not found" do
315
+
316
+ context "when not providing a block" do
317
+
318
+ let!(:person) do
319
+ Person.find_or_initialize_by(title: "Senorita")
320
+ end
321
+
322
+ it "creates a new document" do
323
+ expect(person).to be_new_record
324
+ end
325
+
326
+ it "sets the attributes" do
327
+ expect(person.title).to eq("Senorita")
328
+ end
329
+ end
330
+
331
+ context "when providing a block" do
332
+
333
+ let!(:person) do
334
+ Person.find_or_initialize_by(title: "Senorita") do |person|
335
+ person.pets = true
336
+ end
337
+ end
338
+
339
+ it "creates a new document" do
340
+ expect(person).to be_new_record
341
+ end
342
+
343
+ it "sets the attributes" do
344
+ expect(person.title).to eq("Senorita")
345
+ end
346
+
347
+ it "calls the block" do
348
+ expect(person.pets).to be_true
349
+ end
350
+ end
351
+ end
352
+ end
353
+
354
+ describe "first_or_create" do
355
+
356
+ let!(:band) do
357
+ Band.create(name: "Depeche Mode")
358
+ end
359
+
360
+ context "when the document is found" do
361
+
362
+ let(:found) do
363
+ Band.where(name: "Depeche Mode").first_or_create
364
+ end
365
+
366
+ it "returns the document" do
367
+ expect(found).to eq(band)
368
+ end
369
+ end
370
+
371
+ context "when the document is not found" do
372
+
373
+ context "when attributes are provided" do
374
+
375
+ let(:document) do
376
+ Band.where(name: "Tool").first_or_create(origin: "Essex")
377
+ end
378
+
379
+ it "returns a new document" do
380
+ expect(document.name).to eq("Tool")
381
+ end
382
+
383
+ it "returns a persisted document" do
384
+ expect(document).to be_persisted
385
+ end
386
+
387
+ it "sets the additional attributes" do
388
+ expect(document.origin).to eq("Essex")
389
+ end
390
+ end
391
+
392
+ context "when attributes are not provided" do
393
+
394
+ let(:document) do
395
+ Band.where(name: "Tool").first_or_create
396
+ end
397
+
398
+ it "returns a new document" do
399
+ expect(document.name).to eq("Tool")
400
+ end
401
+
402
+ it "returns a persisted document" do
403
+ expect(document).to be_persisted
404
+ end
405
+ end
406
+
407
+ context "when a block is provided" do
408
+
409
+ let(:document) do
410
+ Band.where(name: "Tool").first_or_create do |doc|
411
+ doc.active = false
412
+ end
413
+ end
414
+
415
+ it "returns a new document" do
416
+ expect(document.name).to eq("Tool")
417
+ end
418
+
419
+ it "returns a persisted document" do
420
+ expect(document).to be_persisted
421
+ end
422
+
423
+ it "yields to the block" do
424
+ expect(document.active).to be_false
425
+ end
426
+ end
427
+
428
+ context "when the criteria is complex" do
429
+
430
+ context "when the document is not found" do
431
+
432
+ let(:document) do
433
+ Band.in(name: [ "New Order" ]).first_or_create(active: false)
434
+ end
435
+
436
+ it "returns a new document" do
437
+ expect(document.active).to be_false
438
+ end
439
+
440
+ it "returns a persisted document" do
441
+ expect(document).to be_persisted
442
+ end
443
+ end
444
+ end
445
+ end
446
+ end
447
+
448
+ describe "first_or_create!" do
449
+
450
+ context "when validation fails on the new document" do
451
+
452
+ it "raises an error" do
453
+ expect {
454
+ Account.where(number: "12345").first_or_create!
455
+ }.to raise_error(Mongoid::Errors::Validations)
456
+ end
457
+ end
458
+
459
+ context "when passing a block" do
460
+
461
+ let(:account) do
462
+ Account.where(number: "12345").first_or_create! do |account|
463
+ account.name = "testing"
464
+ end
465
+ end
466
+
467
+ it "passes the block to the create call" do
468
+ expect(account.name).to eq("testing")
469
+ end
470
+
471
+ it "persists the new document" do
472
+ expect(account).to be_persisted
473
+ end
474
+ end
475
+
476
+ context "when the document is found" do
477
+
478
+ let!(:band) do
479
+ Band.with(safe: true).create!(name: "Depeche Mode")
480
+ end
481
+
482
+ let(:found) do
483
+ Band.where(name: "Depeche Mode").first_or_create!
484
+ end
485
+
486
+ it "returns the document" do
487
+ expect(found).to eq(band)
488
+ end
489
+ end
490
+
491
+ context "when the document is not found" do
492
+
493
+ let!(:band) do
494
+ Band.with(safe: true).create!(name: "Depeche Mode")
495
+ end
496
+
497
+ context "when attributes are provided" do
498
+
499
+ let(:document) do
500
+ Band.where(name: "Tool").first_or_create!(origin: "Essex")
501
+ end
502
+
503
+ it "returns a new document" do
504
+ expect(document.name).to eq("Tool")
505
+ end
506
+
507
+ it "returns a persisted document" do
508
+ expect(document).to be_persisted
509
+ end
510
+
511
+ it "sets the additional attributes" do
512
+ expect(document.origin).to eq("Essex")
513
+ end
514
+ end
515
+
516
+ context "when attributes are not provided" do
517
+
518
+ let(:document) do
519
+ Band.where(name: "Tool").first_or_create!
520
+ end
521
+
522
+ it "returns a new document" do
523
+ expect(document.name).to eq("Tool")
524
+ end
525
+
526
+ it "returns a persisted document" do
527
+ expect(document).to be_persisted
528
+ end
529
+ end
530
+
531
+ context "when a block is provided" do
532
+
533
+ let(:document) do
534
+ Band.where(name: "Tool").first_or_create! do |doc|
535
+ doc.active = false
536
+ end
537
+ end
538
+
539
+ it "returns a new document" do
540
+ expect(document.name).to eq("Tool")
541
+ end
542
+
543
+ it "returns a persisted document" do
544
+ expect(document).to be_persisted
545
+ end
546
+
547
+ it "yields to the block" do
548
+ expect(document.active).to be_false
549
+ end
550
+ end
551
+
552
+ context "when the criteria is complex" do
553
+
554
+ context "when the document is not found" do
555
+
556
+ let(:document) do
557
+ Band.in(name: [ "New Order" ]).first_or_create!(active: false)
558
+ end
559
+
560
+ it "returns a new document" do
561
+ expect(document.active).to be_false
562
+ end
563
+
564
+ it "returns a persisted document" do
565
+ expect(document).to be_persisted
566
+ end
567
+ end
568
+ end
569
+ end
570
+ end
571
+
572
+ describe "first_or_initialize" do
573
+
574
+ let!(:band) do
575
+ Band.create(name: "Depeche Mode")
576
+ end
577
+
578
+ context "when the document is found" do
579
+
580
+ let(:found) do
581
+ Band.where(name: "Depeche Mode").first_or_initialize
582
+ end
583
+
584
+ it "returns the document" do
585
+ expect(found).to eq(band)
586
+ end
587
+ end
588
+
589
+ context "when the document is not found" do
590
+
591
+ context "when attributes are provided" do
592
+
593
+ let(:document) do
594
+ Band.where(name: "Tool").first_or_initialize(origin: "Essex")
595
+ end
596
+
597
+ it "returns a new document" do
598
+ expect(document.name).to eq("Tool")
599
+ end
600
+
601
+ it "returns a non persisted document" do
602
+ expect(document).to_not be_persisted
603
+ end
604
+
605
+ it "sets the additional attributes" do
606
+ expect(document.origin).to eq("Essex")
607
+ end
608
+ end
609
+
610
+ context "when attributes are not provided" do
611
+
612
+ let(:document) do
613
+ Band.where(name: "Tool").first_or_initialize
614
+ end
615
+
616
+ it "returns a new document" do
617
+ expect(document.name).to eq("Tool")
618
+ end
619
+
620
+ it "returns a non persisted document" do
621
+ expect(document).to_not be_persisted
622
+ end
623
+ end
624
+
625
+ context "when a block is provided" do
626
+
627
+ let(:document) do
628
+ Band.where(name: "Tool").first_or_initialize do |doc|
629
+ doc.active = false
630
+ end
631
+ end
632
+
633
+ it "returns a new document" do
634
+ expect(document.name).to eq("Tool")
635
+ end
636
+
637
+ it "returns a non persisted document" do
638
+ expect(document).to_not be_persisted
639
+ end
640
+
641
+ it "yields to the block" do
642
+ expect(document.active).to be_false
643
+ end
644
+ end
645
+
646
+ context "when the criteria is complex" do
647
+
648
+ context "when the document is not found" do
649
+
650
+ let(:document) do
651
+ Band.in(name: [ "New Order" ]).first_or_initialize(active: false)
652
+ end
653
+
654
+ it "returns a new document" do
655
+ expect(document.active).to be_false
656
+ end
657
+
658
+ it "returns a non persisted document" do
659
+ expect(document).to_not be_persisted
660
+ end
661
+ end
662
+ end
663
+ end
664
+ end
665
+
666
+ describe "#update" do
667
+
668
+ let!(:person) do
669
+ Person.create!(title: "Sir")
670
+ end
671
+
672
+ let!(:address_one) do
673
+ person.addresses.create(street: "Oranienstr")
674
+ end
675
+
676
+ let!(:address_two) do
677
+ person.addresses.create(street: "Wienerstr")
678
+ end
679
+
680
+ context "when updating the root document" do
681
+
682
+ context "when updating with a criteria" do
683
+
684
+ before do
685
+ Person.where(title: "Sir").update(title: "Madam")
686
+ end
687
+
688
+ it "updates all the matching documents" do
689
+ expect(person.reload.title).to eq("Madam")
690
+ end
691
+ end
692
+
693
+ context "when updating all directly" do
694
+
695
+ before do
696
+ Person.update(title: "Madam")
697
+ end
698
+
699
+ it "updates all the matching documents" do
700
+ expect(person.reload.title).to eq("Madam")
701
+ end
702
+ end
703
+ end
704
+
705
+ context "when updating an embedded document" do
706
+
707
+ before do
708
+ Person.where(title: "Sir").update(
709
+ "addresses.0.city" => "Berlin"
710
+ )
711
+ end
712
+
713
+ let!(:from_db) do
714
+ Person.first
715
+ end
716
+
717
+ it "updates all the matching documents" do
718
+ expect(from_db.addresses.first.city).to eq("Berlin")
719
+ end
720
+
721
+ it "does not update non matching documents" do
722
+ expect(from_db.addresses.last.city).to be_nil
723
+ end
724
+ end
725
+
726
+ context "when updating a relation" do
727
+
728
+ context "when the relation is an embeds many" do
729
+
730
+ let(:from_db) do
731
+ Person.first
732
+ end
733
+
734
+ context "when updating the relation directly" do
735
+
736
+ before do
737
+ person.addresses.update(city: "London")
738
+ end
739
+
740
+ it "updates the first document" do
741
+ expect(from_db.addresses.first.city).to eq("London")
742
+ end
743
+
744
+ it "does not update the last document" do
745
+ expect(from_db.addresses.last.city).to be_nil
746
+ end
747
+ end
748
+
749
+ context "when updating the relation through a criteria" do
750
+
751
+ before do
752
+ person.addresses.where(street: "Oranienstr").update(city: "Berlin")
753
+ end
754
+
755
+ it "updates the matching documents" do
756
+ expect(from_db.addresses.first.city).to eq("Berlin")
757
+ end
758
+
759
+ it "does not update non matching documents" do
760
+ expect(from_db.addresses.last.city).to be_nil
761
+ end
762
+ end
763
+ end
764
+
765
+ context "when the relation is a references many" do
766
+
767
+ let!(:post_one) do
768
+ person.posts.create(title: "First")
769
+ end
770
+
771
+ let!(:post_two) do
772
+ person.posts.create(title: "Second")
773
+ end
774
+
775
+ context "when updating the relation directly" do
776
+
777
+ before do
778
+ person.posts.update(title: "London")
779
+ end
780
+
781
+ let!(:from_db) do
782
+ Person.first
783
+ end
784
+
785
+ it "updates the first document" do
786
+ expect(from_db.posts.first.title).to eq("London")
787
+ end
788
+
789
+ it "does not update the last document" do
790
+ expect(from_db.posts.last.title).to eq("Second")
791
+ end
792
+ end
793
+
794
+ context "when updating the relation through a criteria" do
795
+
796
+ before do
797
+ person.posts.where(title: "First").update(title: "Berlin")
798
+ end
799
+
800
+ let!(:from_db) do
801
+ Person.first
802
+ end
803
+
804
+ it "updates the matching documents" do
805
+ expect(from_db.posts.where(title: "Berlin").count).to eq(1)
806
+ end
807
+
808
+ it "does not update non matching documents" do
809
+ expect(from_db.posts.where(title: "Second").count).to eq(1)
810
+ end
811
+ end
812
+ end
813
+
814
+ context "when the relation is a references many to many" do
815
+
816
+ let(:from_db) do
817
+ Person.first
818
+ end
819
+
820
+ let!(:preference_one) do
821
+ person.preferences.create(name: "First")
822
+ end
823
+
824
+ let!(:preference_two) do
825
+ person.preferences.create(name: "Second")
826
+ end
827
+
828
+ context "when updating the relation directly" do
829
+
830
+ before do
831
+ person.preferences.update(name: "London")
832
+ end
833
+
834
+ it "updates the first document" do
835
+ expect(from_db.preferences.first.name).to eq("London")
836
+ end
837
+
838
+ it "does not update the last document" do
839
+ expect(from_db.preferences.last.name).to eq("Second")
840
+ end
841
+ end
842
+
843
+ context "when updating the relation through a criteria" do
844
+
845
+ before do
846
+ person.preferences.where(name: "First").update(name: "Berlin")
847
+ end
848
+
849
+ it "updates the matching documents" do
850
+ expect(from_db.preferences.first.name).to eq("Berlin")
851
+ end
852
+
853
+ it "does not update non matching documents" do
854
+ expect(from_db.preferences.last.name).to eq("Second")
855
+ end
856
+ end
857
+ end
858
+ end
859
+ end
860
+
861
+ describe "#update_all" do
862
+
863
+ let!(:person) do
864
+ Person.create(title: "Sir")
865
+ end
866
+
867
+ let!(:address_one) do
868
+ person.addresses.create(street: "Oranienstr")
869
+ end
870
+
871
+ let!(:address_two) do
872
+ person.addresses.create(street: "Wienerstr")
873
+ end
874
+
875
+ context "when updating the root document" do
876
+
877
+ context "when updating with a criteria" do
878
+
879
+ let(:from_db) do
880
+ Person.first
881
+ end
882
+
883
+ before do
884
+ Person.where(title: "Sir").update_all(title: "Madam")
885
+ end
886
+
887
+ it "updates all the matching documents" do
888
+ expect(from_db.title).to eq("Madam")
889
+ end
890
+ end
891
+
892
+ context "when updating all directly" do
893
+
894
+ let(:from_db) do
895
+ Person.first
896
+ end
897
+
898
+ before do
899
+ Person.update_all(title: "Madam")
900
+ end
901
+
902
+ it "updates all the matching documents" do
903
+ expect(from_db.title).to eq("Madam")
904
+ end
905
+ end
906
+ end
907
+
908
+ context "when updating an embedded document" do
909
+
910
+ before do
911
+ Person.where(title: "Sir").update_all(
912
+ "addresses.0.city" => "Berlin"
913
+ )
914
+ end
915
+
916
+ let!(:from_db) do
917
+ Person.first
918
+ end
919
+
920
+ it "updates all the matching documents" do
921
+ expect(from_db.addresses.first.city).to eq("Berlin")
922
+ end
923
+
924
+ it "does not update non matching documents" do
925
+ expect(from_db.addresses.last.city).to be_nil
926
+ end
927
+ end
928
+
929
+ context "when updating a relation" do
930
+
931
+ context "when the relation is an embeds many" do
932
+
933
+ let(:from_db) do
934
+ Person.first
935
+ end
936
+
937
+ context "when updating the relation directly" do
938
+
939
+ before do
940
+ person.addresses.update_all(city: "London")
941
+ end
942
+
943
+ it "updates the first document" do
944
+ expect(from_db.addresses.first.city).to eq("London")
945
+ end
946
+
947
+ it "updates the last document" do
948
+ expect(from_db.addresses.last.city).to eq("London")
949
+ end
950
+ end
951
+
952
+ context "when updating the relation through a criteria" do
953
+
954
+ before do
955
+ person.addresses.where(street: "Oranienstr").update_all(city: "Berlin")
956
+ end
957
+
958
+ it "updates the matching documents" do
959
+ expect(from_db.addresses.first.city).to eq("Berlin")
960
+ end
961
+
962
+ it "does not update non matching documents" do
963
+ expect(from_db.addresses.last.city).to be_nil
964
+ end
965
+ end
966
+ end
967
+
968
+ context "when the relation is a references many" do
969
+
970
+ let!(:post_one) do
971
+ person.posts.create(title: "First")
972
+ end
973
+
974
+ let!(:post_two) do
975
+ person.posts.create(title: "Second")
976
+ end
977
+
978
+ context "when updating the relation directly" do
979
+
980
+ before do
981
+ person.posts.update_all(title: "London")
982
+ end
983
+
984
+ let!(:from_db) do
985
+ Person.first
986
+ end
987
+
988
+ it "updates the first document" do
989
+ expect(from_db.posts.first.title).to eq("London")
990
+ end
991
+
992
+ it "updates the last document" do
993
+ expect(from_db.posts.last.title).to eq("London")
994
+ end
995
+ end
996
+
997
+ context "when updating the relation through a criteria" do
998
+
999
+ before do
1000
+ person.posts.where(title: "First").update_all(title: "Berlin")
1001
+ end
1002
+
1003
+ let!(:from_db) do
1004
+ Person.first
1005
+ end
1006
+
1007
+ it "updates the matching documents" do
1008
+ expect(from_db.posts.where(title: "Berlin").count).to eq(1)
1009
+ end
1010
+
1011
+ it "does not update non matching documents" do
1012
+ expect(from_db.posts.where(title: "Second").count).to eq(1)
1013
+ end
1014
+ end
1015
+ end
1016
+
1017
+ context "when the relation is a references many to many" do
1018
+
1019
+ let(:from_db) do
1020
+ Person.first
1021
+ end
1022
+
1023
+ let!(:preference_one) do
1024
+ person.preferences.create(name: "First")
1025
+ end
1026
+
1027
+ let!(:preference_two) do
1028
+ person.preferences.create(name: "Second")
1029
+ end
1030
+
1031
+ context "when updating the relation directly" do
1032
+
1033
+ before do
1034
+ person.preferences.update_all(name: "London")
1035
+ end
1036
+
1037
+ it "updates the first document" do
1038
+ expect(from_db.preferences.first.name).to eq("London")
1039
+ end
1040
+
1041
+ it "updates the last document" do
1042
+ expect(from_db.preferences.last.name).to eq("London")
1043
+ end
1044
+ end
1045
+
1046
+ context "when updating the relation through a criteria" do
1047
+
1048
+ before do
1049
+ person.preferences.where(name: "First").update_all(name: "Berlin")
1050
+ end
1051
+
1052
+ it "updates the matching documents" do
1053
+ expect(from_db.preferences.first.name).to eq("Berlin")
1054
+ end
1055
+
1056
+ it "does not update non matching documents" do
1057
+ expect(from_db.preferences.last.name).to eq("Second")
1058
+ end
1059
+ end
1060
+ end
1061
+ end
1062
+ end
1063
+ end