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,134 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Selectable do
4
+
5
+ describe "#atomic_selector" do
6
+
7
+ context "when the document is a root document" do
8
+
9
+ context "when the document has a shard key" do
10
+
11
+ let(:profile) do
12
+ Profile.create(name: "google")
13
+ end
14
+
15
+ let!(:selector) do
16
+ profile.atomic_selector
17
+ end
18
+
19
+ it "returns the id and shard key in the hash" do
20
+ expect(selector).to eq({ "_id" => profile.id, "name" => profile.name })
21
+ end
22
+ end
23
+
24
+ context "when the document does not have a shard key" do
25
+
26
+ context "when using object ids" do
27
+
28
+ let(:band) do
29
+ Band.create
30
+ end
31
+
32
+ let(:selector) do
33
+ band.atomic_selector
34
+ end
35
+
36
+ it "returns the hash with the id" do
37
+ expect(selector).to eq({ "_id" => band.id })
38
+ end
39
+ end
40
+
41
+ context "when using a custom id" do
42
+
43
+ let(:account) do
44
+ Account.create(name: "savings")
45
+ end
46
+
47
+ let(:selector) do
48
+ account.atomic_selector
49
+ end
50
+
51
+ context "when the id has not changed" do
52
+
53
+ it "returns the hash with the key" do
54
+ expect(selector).to eq({ "_id" => "savings" })
55
+ end
56
+ end
57
+
58
+ context "when the composite key has changed" do
59
+
60
+ before do
61
+ account.new_record = false
62
+ account.name = "current"
63
+ end
64
+
65
+ it "returns the hash with the old key" do
66
+ expect(selector).to eq({ "_id" => "savings" })
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+
73
+ context "when the document is embedded" do
74
+
75
+ let(:person) do
76
+ Person.create
77
+ end
78
+
79
+ context "when the document is an embeds one" do
80
+
81
+ let(:name) do
82
+ person.create_name(first_name: "test", last_name: "user")
83
+ end
84
+
85
+ it "returns the hash with the selector" do
86
+ expect(name.atomic_selector).to eq(
87
+ { "_id" => person.id, "name._id" => name.id }
88
+ )
89
+ end
90
+ end
91
+
92
+ context "when the document is an embeds many" do
93
+
94
+ let(:address) do
95
+ person.addresses.create(street: "kreuzbergstr")
96
+ end
97
+
98
+ it "returns the hash with the selector" do
99
+ expect(address.atomic_selector).to eq(
100
+ { "_id" => person.id, "addresses._id" => address.id }
101
+ )
102
+ end
103
+
104
+ context "when the document's id changes" do
105
+
106
+ before do
107
+ address._id = "hobrecht"
108
+ end
109
+
110
+ it "returns only the parent selector" do
111
+ expect(address.atomic_selector).to eq(person.atomic_selector)
112
+ end
113
+ end
114
+
115
+ context "when the document is embedded multiple levels" do
116
+
117
+ let(:location) do
118
+ address.locations.create
119
+ end
120
+
121
+ it "returns a hash with the selector" do
122
+ expect(location.atomic_selector).to eq(
123
+ {
124
+ "_id" => person.id,
125
+ "addresses._id" => address.id,
126
+ "addresses.0.locations._id" => location.id
127
+ }
128
+ )
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,862 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Serializable do
4
+
5
+ describe "#field_names" do
6
+
7
+ let(:band) do
8
+ Band.new
9
+ end
10
+
11
+ it "does not duplicate fields" do
12
+ expect(band.send(:field_names, {})).to eq(band.fields.except("_type").keys.sort)
13
+ end
14
+ end
15
+
16
+ describe ".include_root_in_json" do
17
+
18
+ let(:person) do
19
+ Person.new
20
+ end
21
+
22
+ context "when config set to true" do
23
+
24
+ before do
25
+ Mongoid.include_root_in_json = true
26
+ end
27
+
28
+ it "returns true" do
29
+ expect(person.include_root_in_json).to be_true
30
+ end
31
+ end
32
+
33
+ context "when config set to false" do
34
+
35
+ before do
36
+ Mongoid.include_root_in_json = false
37
+ end
38
+
39
+ it "returns false" do
40
+ expect(person.include_root_in_json).to be_false
41
+ end
42
+ end
43
+ end
44
+
45
+ describe "#serializable_hash" do
46
+
47
+ let(:person) do
48
+ Person.new
49
+ end
50
+
51
+ context "when a dynamic attribute has the same name as a ruby method" do
52
+
53
+ before do
54
+ person[:loop] = "testing"
55
+ end
56
+
57
+ let(:attributes) do
58
+ person.serializable_hash
59
+ end
60
+
61
+ it "grabs the attribute direct from the hash" do
62
+ expect(attributes["loop"]).to eq("testing")
63
+ end
64
+ end
65
+
66
+ context "when the method for a declared field is overridden" do
67
+
68
+ before do
69
+ person.override_me = 1
70
+ end
71
+
72
+ let(:attributes) do
73
+ person.serializable_hash
74
+ end
75
+
76
+ it "uses the overridden method" do
77
+ expect(attributes["override_me"]).to eq("1")
78
+ end
79
+ end
80
+
81
+ context "when the model has embedded documents" do
82
+
83
+ let!(:address) do
84
+ person.addresses.build(street: "test")
85
+ end
86
+
87
+ context "when providing no custom options" do
88
+
89
+ let(:attributes) do
90
+ person.serializable_hash
91
+ end
92
+
93
+ it "includes the embedded documents" do
94
+ expect(attributes["addresses"].first).to eq(address.serializable_hash)
95
+ end
96
+ end
97
+
98
+ context "when providing options" do
99
+
100
+ let(:attributes) do
101
+ person.serializable_hash(methods: :id, except: :_id)
102
+ end
103
+
104
+ let(:address_attributes) do
105
+ attributes["addresses"].first
106
+ end
107
+
108
+ it "uses the options" do
109
+ expect(attributes["id"]).to eq(person.id)
110
+ end
111
+
112
+ it "uses the options on embedded documents" do
113
+ expect(address_attributes["id"]).to eq(address.id)
114
+ end
115
+ end
116
+
117
+ context "when nested multiple levels" do
118
+
119
+ let!(:location) do
120
+ address.locations.build(name: "home")
121
+ end
122
+
123
+ let(:attributes) do
124
+ person.serializable_hash
125
+ end
126
+
127
+ it "includes the deeply nested document" do
128
+ expect(attributes["addresses"][0]["locations"]).to_not be_empty
129
+ end
130
+ end
131
+ end
132
+
133
+ context "when the model has attributes that need conversion" do
134
+
135
+ let(:date) do
136
+ Date.new(1970, 1, 1)
137
+ end
138
+
139
+ before do
140
+ person.dob = date
141
+ end
142
+
143
+ let(:attributes) do
144
+ person.serializable_hash
145
+ end
146
+
147
+ it "converts the objects to the defined type" do
148
+ expect(attributes["dob"]).to eq(date)
149
+ end
150
+ end
151
+
152
+ context "when a model has defined fields" do
153
+
154
+ let(:attributes) do
155
+ { "title" => "President", "security_code" => "1234" }
156
+ end
157
+
158
+ before do
159
+ person.write_attributes(attributes)
160
+ end
161
+
162
+ let(:field_names) do
163
+ person.fields.keys.map(&:to_s) - ["_type"]
164
+ end
165
+
166
+ it "serializes assigned attributes" do
167
+ expect(person.serializable_hash).to include attributes
168
+ end
169
+
170
+ it "includes all defined fields except _type" do
171
+ expect(person.serializable_hash.keys).to include(*field_names)
172
+ end
173
+
174
+ it "does not include _type" do
175
+ expect(person.serializable_hash.keys).to_not include "_type"
176
+ end
177
+
178
+ context "when providing options" do
179
+
180
+ let(:options) do
181
+ { only: :name }
182
+ end
183
+
184
+ before do
185
+ person.serializable_hash(options)
186
+ end
187
+
188
+ it "does not modify the options in the argument" do
189
+ expect(options[:except]).to be_nil
190
+ end
191
+ end
192
+
193
+ context "when include_type_for_serialization is true" do
194
+
195
+ before do
196
+ Mongoid.include_type_for_serialization = true
197
+ end
198
+
199
+ after do
200
+ Mongoid.include_type_for_serialization = false
201
+ end
202
+
203
+ it "includes _type field" do
204
+ expect(person.serializable_hash.keys).to include '_type'
205
+ end
206
+ end
207
+
208
+ context "when specifying which fields to only include" do
209
+
210
+ it "only includes the specified fields" do
211
+ expect(person.serializable_hash(only: [:title])).to eq(
212
+ { "title" => attributes["title"] }
213
+ )
214
+ end
215
+ end
216
+
217
+ context "when specifying extra inclusions" do
218
+
219
+ it "includes the extra fields" do
220
+ expect(person.serializable_hash(
221
+ methods: [ :_type ]
222
+ ).has_key?("_type")).to be_true
223
+ end
224
+ end
225
+
226
+ context "when specifying which fields to exclude" do
227
+
228
+ it "excludes the specified fields" do
229
+ expect(person.serializable_hash(except: [:title])).to_not include(
230
+ "title" => attributes["title"]
231
+ )
232
+ end
233
+ end
234
+ end
235
+
236
+ context "when a model has dynamic fields" do
237
+
238
+ let(:dynamic_field_name) do
239
+ "dynamic_field_name"
240
+ end
241
+
242
+ let(:dynamic_value) do
243
+ "dynamic_value"
244
+ end
245
+
246
+ before do
247
+ person.write_attribute(dynamic_field_name, dynamic_value)
248
+ end
249
+
250
+ it "includes dynamic fields" do
251
+ expect(person.serializable_hash[dynamic_field_name]).to eq(dynamic_value)
252
+ end
253
+
254
+ context "when specifying which dynamic fields to only include" do
255
+
256
+ it "only includes the specified dynamic fields" do
257
+ expect(person.serializable_hash(only: [dynamic_field_name])).to eq(
258
+ { dynamic_field_name => dynamic_value }
259
+ )
260
+ end
261
+ end
262
+
263
+ context "when specified which dynamic fields to exclude" do
264
+
265
+ it "excludes the specified fields" do
266
+ expect(person.serializable_hash(except: [dynamic_field_name])).to_not include(
267
+ dynamic_field_name => dynamic_value
268
+ )
269
+ end
270
+ end
271
+ end
272
+
273
+ context "when a model has relations" do
274
+
275
+ let(:attributes) do
276
+ { "title" => "President", "security_code" => "1234" }
277
+ end
278
+
279
+ before do
280
+ person.write_attributes(attributes)
281
+ end
282
+
283
+ context "when the model is saved before the relation is added" do
284
+
285
+ before do
286
+ person.save
287
+ end
288
+
289
+ context "when a model has an embeds many" do
290
+
291
+ let!(:address_one) do
292
+ person.addresses.build(street: "Kudamm")
293
+ end
294
+
295
+ before do
296
+ person.save
297
+ end
298
+
299
+ it "includes the relation" do
300
+ expect(person.serializable_hash.keys).to include('addresses')
301
+ end
302
+ end
303
+
304
+ context "when a model has an embeds one" do
305
+ let!(:name) do
306
+ person.build_name(first_name: "Leo", last_name: "Marvin")
307
+ end
308
+
309
+ before do
310
+ person.save
311
+ end
312
+
313
+ it "includes the relation" do
314
+ expect(person.serializable_hash.keys).to include('name')
315
+ end
316
+ end
317
+ end
318
+
319
+ context "when the model is saved after the relation is added" do
320
+
321
+ context "when a model has an embeds many" do
322
+
323
+ let!(:address_one) do
324
+ person.addresses.build(street: "Kudamm")
325
+ end
326
+
327
+ before do
328
+ person.save
329
+ end
330
+
331
+ it "includes the relation" do
332
+ expect(person.serializable_hash.keys).to include('addresses')
333
+ end
334
+ end
335
+
336
+ context "when a model has an embeds one" do
337
+ let!(:name) do
338
+ person.build_name(first_name: "Leo", last_name: "Marvin")
339
+ end
340
+
341
+ before do
342
+ person.save
343
+ end
344
+
345
+ it "includes the relation" do
346
+ expect(person.serializable_hash.keys).to include('name')
347
+ end
348
+ end
349
+ end
350
+ end
351
+
352
+ context "when including methods" do
353
+
354
+ it "includes the method result" do
355
+ expect(person.serializable_hash(methods: [:foo])).to include(
356
+ "foo" => person.foo
357
+ )
358
+ end
359
+ end
360
+
361
+ context "when including relations" do
362
+
363
+ context "when including a single relation" do
364
+
365
+ context "when including an embeds many" do
366
+
367
+ let!(:address_one) do
368
+ person.addresses.build(street: "Kudamm")
369
+ end
370
+
371
+ let!(:address_two) do
372
+ person.addresses.build(street: "Tauentzienstr")
373
+ end
374
+
375
+ let(:relation_hash) do
376
+ hash["addresses"]
377
+ end
378
+
379
+ pending "when the ids were not loaded" do
380
+
381
+ before do
382
+ person.save
383
+ end
384
+
385
+ let(:from_db) do
386
+ Person.only("addresses.street").first
387
+ end
388
+
389
+ let(:hash) do
390
+ from_db.serializable_hash
391
+ end
392
+
393
+ it "does not generate new ids" do
394
+ expect(hash["addresses"].first["_id"]).to be_nil
395
+ end
396
+ end
397
+
398
+ context "when providing the include as a symbol" do
399
+
400
+ let(:hash) do
401
+ person.serializable_hash(include: :addresses)
402
+ end
403
+
404
+ it "includes the first relation" do
405
+ expect(relation_hash[0]).to include
406
+ { "_id" => "kudamm", "street" => "Kudamm" }
407
+ end
408
+
409
+ it "includes the second relation" do
410
+ expect(relation_hash[1]).to include
411
+ { "_id" => "tauentzienstr", "street" => "Tauentzienstr" }
412
+ end
413
+ end
414
+
415
+ context "when providing the include as an array" do
416
+
417
+ let(:hash) do
418
+ person.serializable_hash(include: [ :addresses ])
419
+ end
420
+
421
+ it "includes the first relation" do
422
+ expect(relation_hash[0]).to include
423
+ { "_id" => "kudamm", "street" => "Kudamm" }
424
+ end
425
+
426
+ it "includes the second relation" do
427
+ expect(relation_hash[1]).to include
428
+ { "_id" => "tauentzienstr", "street" => "Tauentzienstr" }
429
+ end
430
+ end
431
+
432
+ context "when providing the include as a hash" do
433
+
434
+ context "when including one level deep" do
435
+
436
+ let(:hash) do
437
+ person.serializable_hash(include: { addresses: { except: :_id } })
438
+ end
439
+
440
+ it "includes the first relation sans exceptions" do
441
+ expect(relation_hash[0]).to include({ "street" => "Kudamm" })
442
+ end
443
+
444
+ it "includes the second relation sans exceptions" do
445
+ expect(relation_hash[1]).to include({ "street" => "Tauentzienstr" })
446
+ end
447
+ end
448
+
449
+ context "when including multiple levels deep" do
450
+
451
+ let!(:location) do
452
+ address_one.locations.build(name: "Home")
453
+ end
454
+
455
+ let(:hash) do
456
+ person.serializable_hash(
457
+ include: { addresses: {
458
+ except: :_id, include: { locations: { except: :_id } }
459
+ }
460
+ })
461
+ end
462
+
463
+ it "includes the first relation" do
464
+ expect(relation_hash[0]["locations"].any? do |location|
465
+ location["name"] == "Home"
466
+ end).to be_true
467
+ end
468
+
469
+ context "after retrieved from database" do
470
+
471
+ let(:db_person) do
472
+ Person.all.last
473
+ end
474
+
475
+ let!(:second_location) do
476
+ address_two.locations.build(name: "Hotel")
477
+ end
478
+
479
+ let(:hash) do
480
+ db_person.serializable_hash(
481
+ include: { addresses: {
482
+ except: :_id, include: { locations: { except: :_id } }
483
+ }
484
+ })
485
+ end
486
+
487
+ before do
488
+ person.save
489
+ end
490
+
491
+ it "includes the specific ralations" do
492
+ expect(relation_hash[0]["locations"].map do |location|
493
+ location["name"]
494
+ end).to include "Home"
495
+ expect(relation_hash[1]["locations"].map do |location|
496
+ location["name"]
497
+ end).to include "Hotel"
498
+ end
499
+ end
500
+ end
501
+
502
+ context "when defining a default exclusion" do
503
+
504
+ let!(:name) do
505
+ person.build_name(first_name: "Sebastien")
506
+ end
507
+
508
+ let(:hash) do
509
+ person.serializable_hash(
510
+ except: :_id,
511
+ include: [ :addresses, :name ]
512
+ )
513
+ end
514
+
515
+ it "does not contain the root exclusion" do
516
+ expect(hash["_id"]).to be_nil
517
+ end
518
+
519
+ it "does not include the embedded many exclusion" do
520
+ expect(relation_hash[0]["_id"]).to be_nil
521
+ end
522
+
523
+ it "does not include the embedded one exclusion" do
524
+ expect(hash["name"]["_id"]).to be_nil
525
+ end
526
+ end
527
+ end
528
+ end
529
+
530
+ context "when including an embeds one" do
531
+
532
+ let!(:name) do
533
+ person.build_name(first_name: "Leo", last_name: "Marvin")
534
+ end
535
+
536
+ let(:relation_hash) do
537
+ hash["name"]
538
+ end
539
+
540
+ context "when providing the include as a symbol" do
541
+
542
+ let(:hash) do
543
+ person.serializable_hash(include: :name)
544
+ end
545
+
546
+ it "includes the specified relation" do
547
+ expect(relation_hash).to include
548
+ { "_id" => "leo-marvin", "first_name" => "Leo", "last_name" => "Marvin" }
549
+ end
550
+ end
551
+
552
+ context "when providing the include as an array" do
553
+
554
+ let(:hash) do
555
+ person.serializable_hash(include: [ :name ])
556
+ end
557
+
558
+ it "includes the specified relation" do
559
+ expect(relation_hash).to include
560
+ { "_id" => "leo-marvin", "first_name" => "Leo", "last_name" => "Marvin" }
561
+ end
562
+ end
563
+
564
+ context "when providing the include as a hash" do
565
+
566
+ let(:hash) do
567
+ person.serializable_hash(include: { name: { except: :_id }})
568
+ end
569
+
570
+ it "includes the specified relation sans exceptions" do
571
+ expect(relation_hash).to include
572
+ { "first_name" => "Leo", "last_name" => "Marvin" }
573
+ end
574
+ end
575
+ end
576
+
577
+ context "when including a references many" do
578
+
579
+ let!(:post_one) do
580
+ person.posts.build(title: "First")
581
+ end
582
+
583
+ let!(:post_two) do
584
+ person.posts.build(title: "Second")
585
+ end
586
+
587
+ let(:relation_hash) do
588
+ hash["posts"]
589
+ end
590
+
591
+ context "when providing the include as a symbol" do
592
+
593
+ let(:hash) do
594
+ person.serializable_hash(include: :posts)
595
+ end
596
+
597
+ it "includes the specified relation" do
598
+ expect(relation_hash).to_not be_nil
599
+ end
600
+
601
+ it "includes the first document related fields" do
602
+ expect(relation_hash[0]["title"]).to eq("First")
603
+ end
604
+
605
+ it "includes the second document related fields" do
606
+ expect(relation_hash[1]["title"]).to eq("Second")
607
+ end
608
+ end
609
+
610
+ context "when providing the include as an array" do
611
+
612
+ let(:hash) do
613
+ person.serializable_hash(include: [ :posts ])
614
+ end
615
+
616
+ it "includes the specified relation" do
617
+ expect(relation_hash).to_not be_nil
618
+ end
619
+
620
+ it "includes the first document related fields" do
621
+ expect(relation_hash[0]["title"]).to eq("First")
622
+ end
623
+
624
+ it "includes the second document related fields" do
625
+ expect(relation_hash[1]["title"]).to eq("Second")
626
+ end
627
+ end
628
+
629
+ context "when providing the include as a hash" do
630
+
631
+ let(:hash) do
632
+ person.serializable_hash(include: { posts: { except: :_id } })
633
+ end
634
+
635
+ it "includes the specified relation" do
636
+ expect(relation_hash).to_not be_nil
637
+ end
638
+
639
+ it "includes the first document related fields" do
640
+ expect(relation_hash[0]["title"]).to eq("First")
641
+ end
642
+
643
+ it "includes the second document related fields" do
644
+ expect(relation_hash[1]["title"]).to eq("Second")
645
+ end
646
+
647
+ it "does not include the first document exceptions" do
648
+ expect(relation_hash[0]["_id"]).to be_nil
649
+ end
650
+
651
+ it "does not include the second document exceptions" do
652
+ expect(relation_hash[1]["_id"]).to be_nil
653
+ end
654
+ end
655
+ end
656
+
657
+ context "when including a references many to many" do
658
+
659
+ let!(:preference_one) do
660
+ person.preferences.build(name: "First")
661
+ end
662
+
663
+ let!(:preference_two) do
664
+ person.preferences.build(name: "Second")
665
+ end
666
+
667
+ let(:relation_hash) do
668
+ hash["preferences"]
669
+ end
670
+
671
+ context "when providing the include as a symbol" do
672
+
673
+ let(:hash) do
674
+ person.serializable_hash(include: :preferences)
675
+ end
676
+
677
+ it "includes the specified relation" do
678
+ expect(relation_hash).to_not be_nil
679
+ end
680
+
681
+ it "includes the first document related fields" do
682
+ expect(relation_hash[0]["name"]).to eq("First")
683
+ end
684
+
685
+ it "includes the second document related fields" do
686
+ expect(relation_hash[1]["name"]).to eq("Second")
687
+ end
688
+ end
689
+
690
+ context "when providing the include as an array" do
691
+
692
+ let(:hash) do
693
+ person.serializable_hash(include: [ :preferences ])
694
+ end
695
+
696
+ it "includes the specified relation" do
697
+ expect(relation_hash).to_not be_nil
698
+ end
699
+
700
+ it "includes the first document related fields" do
701
+ expect(relation_hash[0]["name"]).to eq("First")
702
+ end
703
+
704
+ it "includes the second document related fields" do
705
+ expect(relation_hash[1]["name"]).to eq("Second")
706
+ end
707
+ end
708
+
709
+ context "when providing the include as a hash" do
710
+
711
+ let(:hash) do
712
+ person.serializable_hash(
713
+ include: {
714
+ preferences: {
715
+ except: :_id
716
+ }
717
+ },
718
+ except: :preference_ids
719
+ )
720
+ end
721
+
722
+ it "includes the specified relation" do
723
+ expect(relation_hash).to_not be_nil
724
+ end
725
+
726
+ it "includes the first document related fields" do
727
+ expect(relation_hash[0]["name"]).to eq("First")
728
+ end
729
+
730
+ it "includes the second document related fields" do
731
+ expect(relation_hash[1]["name"]).to eq("Second")
732
+ end
733
+
734
+ it "does not include the first document exceptions" do
735
+ expect(relation_hash[0]["_id"]).to be_nil
736
+ end
737
+
738
+ it "does not include the second document exceptions" do
739
+ expect(relation_hash[1]["_id"]).to be_nil
740
+ end
741
+
742
+ it "does not include the root exceptions" do
743
+ expect(hash["preference_ids"]).to be_nil
744
+ end
745
+ end
746
+ end
747
+ end
748
+ end
749
+ end
750
+
751
+ describe "#to_json" do
752
+
753
+ let(:person) do
754
+ Person.new
755
+ end
756
+
757
+ context "when including root in json" do
758
+
759
+ before do
760
+ Mongoid.include_root_in_json = true
761
+ end
762
+
763
+ it "uses the mongoid configuration" do
764
+ expect(person.to_json).to include("person")
765
+ end
766
+ end
767
+
768
+ context "when not including root in json" do
769
+
770
+ before do
771
+ Mongoid.include_root_in_json = false
772
+ end
773
+
774
+ it "uses the mongoid configuration" do
775
+ expect(person.to_json).to_not include("person")
776
+ end
777
+ end
778
+
779
+ context "when serializing a relation directly" do
780
+
781
+ context "when serializing an embeds many" do
782
+
783
+ let!(:address) do
784
+ person.addresses.build(street: "Kudamm")
785
+ end
786
+
787
+ let(:json) do
788
+ person.addresses.to_json
789
+ end
790
+
791
+ it "serializes only the relation" do
792
+ expect(json).to include(address.street)
793
+ end
794
+ end
795
+
796
+ context "when serializing a references many" do
797
+
798
+ let!(:post) do
799
+ person.posts.build(title: "testing")
800
+ end
801
+
802
+ let(:json) do
803
+ person.posts.to_json
804
+ end
805
+
806
+ it "serializes only the relation" do
807
+ expect(json).to include(post.title)
808
+ end
809
+ end
810
+ end
811
+ end
812
+
813
+ describe "#to_xml" do
814
+
815
+ context "Moped::BSON::ObjectId" do
816
+
817
+ let(:person) do
818
+ Person.new
819
+ end
820
+
821
+ it "serializes as string" do
822
+ expect(person.to_xml).to include("<_id>#{person.id}</_id>")
823
+ end
824
+ end
825
+
826
+ context "when an Array field is defined" do
827
+
828
+ let(:person) do
829
+ Person.new(
830
+ aliases: [ "Kelly", "Machine Gun" ]
831
+ )
832
+ end
833
+
834
+ it "properly types the array" do
835
+ expect(person.to_xml).to include("<aliases type=\"array\">")
836
+ end
837
+
838
+ it "serializes the array" do
839
+ expect(person.to_xml).to include("<alias>Kelly</alias>")
840
+ expect(person.to_xml).to include("<alias>Machine Gun</alias>")
841
+ end
842
+ end
843
+
844
+ context "when a Hash field is defined" do
845
+
846
+ let(:person) do
847
+ Person.new(
848
+ map: { lat: 24.5, long: 22.1 }
849
+ )
850
+ end
851
+
852
+ it "properly types the hash" do
853
+ expect(person.to_xml).to include("<map>")
854
+ end
855
+
856
+ it "serializes the hash" do
857
+ expect(person.to_xml).to include("<lat type=\"float\">24.5</lat>")
858
+ expect(person.to_xml).to include("<long type=\"float\">22.1</long>")
859
+ end
860
+ end
861
+ end
862
+ end