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,56 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Extensions
4
+ module TimeWithZone
5
+
6
+ # Turn the object from the ruby type we deal with to a Mongo friendly
7
+ # type.
8
+ #
9
+ # @example Mongoize the object.
10
+ # date_time.mongoize
11
+ #
12
+ # @return [ Time ] The object mongoized.
13
+ #
14
+ # @since 3.0.0
15
+ def mongoize
16
+ ::ActiveSupport::TimeWithZone.mongoize(self)
17
+ end
18
+
19
+ module ClassMethods
20
+
21
+ # Convert the object from its mongo friendly ruby type to this type.
22
+ #
23
+ # @example Demongoize the object.
24
+ # TimeWithZone.demongoize(object)
25
+ #
26
+ # @param [ Time ] object The time from Mongo.
27
+ #
28
+ # @return [ TimeWithZone ] The object as a date.
29
+ #
30
+ # @since 3.0.0
31
+ def demongoize(object)
32
+ return nil if object.blank?
33
+ ::Time.demongoize(object).in_time_zone
34
+ end
35
+
36
+ # Turn the object from the ruby type we deal with to a Mongo friendly
37
+ # type.
38
+ #
39
+ # @example Mongoize the object.
40
+ # TimeWithZone.mongoize("2012-1-1")
41
+ #
42
+ # @param [ Object ] object The object to convert.
43
+ #
44
+ # @return [ Time ] The object mongoized.
45
+ #
46
+ # @since 3.0.0
47
+ def mongoize(object)
48
+ ::Time.mongoize(object)
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ ::ActiveSupport::TimeWithZone.__send__(:include, Mongoid::Extensions::TimeWithZone)
56
+ ::ActiveSupport::TimeWithZone.__send__(:extend, Mongoid::Extensions::TimeWithZone::ClassMethods)
@@ -0,0 +1,38 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Extensions
4
+ module TrueClass
5
+
6
+ # Get the value of the object as a mongo friendy sort value.
7
+ #
8
+ # @example Get the object as sort criteria.
9
+ # object.__sortable__
10
+ #
11
+ # @return [ Integer ] 1.
12
+ #
13
+ # @since 3.0.0
14
+ def __sortable__
15
+ 1
16
+ end
17
+
18
+ # Is the passed value a boolean?
19
+ #
20
+ # @example Is the value a boolean type?
21
+ # true.is_a?(Boolean)
22
+ #
23
+ # @param [ Class ] other The class to check.
24
+ #
25
+ # @return [ true, false ] If the other is a boolean.
26
+ #
27
+ # @since 1.0.0
28
+ def is_a?(other)
29
+ if other == ::Boolean || other.class == ::Boolean
30
+ return true
31
+ end
32
+ super(other)
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+ ::TrueClass.__send__(:include, Mongoid::Extensions::TrueClass)
@@ -0,0 +1,46 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+
4
+ # Instantiates documents that came from the database.
5
+ module Factory
6
+ extend self
7
+
8
+ # Builds a new +Document+ from the supplied attributes.
9
+ #
10
+ # @example Build the document.
11
+ # Mongoid::Factory.build(Person, { "name" => "Durran" })
12
+ #
13
+ # @param [ Class ] klass The class to instantiate from if _type is not present.
14
+ # @param [ Hash ] attributes The document attributes.
15
+ # @param [ Hash ] options The mass assignment scoping options.
16
+ #
17
+ # @return [ Document ] The instantiated document.
18
+ def build(klass, attributes = nil)
19
+ type = (attributes || {})["_type"]
20
+ if type && klass._types.include?(type)
21
+ type.constantize.new(attributes)
22
+ else
23
+ klass.new(attributes)
24
+ end
25
+ end
26
+
27
+ # Builds a new +Document+ from the supplied attributes loaded from the
28
+ # database.
29
+ #
30
+ # @example Build the document.
31
+ # Mongoid::Factory.from_db(Person, { "name" => "Durran" })
32
+ #
33
+ # @param [ Class ] klass The class to instantiate from if _type is not present.
34
+ # @param [ Hash ] attributes The document attributes.
35
+ #
36
+ # @return [ Document ] The instantiated document.
37
+ def from_db(klass, attributes = nil, criteria_instance_id = nil)
38
+ type = (attributes || {})["_type"]
39
+ if type.blank?
40
+ klass.instantiate(attributes, criteria_instance_id)
41
+ else
42
+ type.camelize.constantize.instantiate(attributes, criteria_instance_id)
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,542 @@
1
+ # encoding: utf-8
2
+ require "mongoid/fields/standard"
3
+ require "mongoid/fields/foreign_key"
4
+ require "mongoid/fields/localized"
5
+ require "mongoid/fields/validators"
6
+
7
+ module Mongoid
8
+
9
+ # This module defines behaviour for fields.
10
+ module Fields
11
+ extend ActiveSupport::Concern
12
+
13
+ included do
14
+ class_attribute :aliased_fields
15
+ class_attribute :localized_fields
16
+ class_attribute :fields
17
+ class_attribute :pre_processed_defaults
18
+ class_attribute :post_processed_defaults
19
+
20
+ self.aliased_fields = { "id" => "_id" }
21
+ self.fields = {}
22
+ self.localized_fields = {}
23
+ self.pre_processed_defaults = []
24
+ self.post_processed_defaults = []
25
+
26
+ field(
27
+ :_id,
28
+ default: ->{ Moped::BSON::ObjectId.new },
29
+ pre_processed: true,
30
+ type: Moped::BSON::ObjectId
31
+ )
32
+
33
+ alias :id :_id
34
+ alias :id= :_id=
35
+ end
36
+
37
+ # Apply all default values to the document which are not procs.
38
+ #
39
+ # @example Apply all the non-proc defaults.
40
+ # model.apply_pre_processed_defaults
41
+ #
42
+ # @return [ Array<String ] The names of the non-proc defaults.
43
+ #
44
+ # @since 2.4.0
45
+ def apply_pre_processed_defaults
46
+ pre_processed_defaults.each do |name|
47
+ apply_default(name)
48
+ end
49
+ end
50
+
51
+ # Apply all default values to the document which are procs.
52
+ #
53
+ # @example Apply all the proc defaults.
54
+ # model.apply_post_processed_defaults
55
+ #
56
+ # @return [ Array<String ] The names of the proc defaults.
57
+ #
58
+ # @since 2.4.0
59
+ def apply_post_processed_defaults
60
+ post_processed_defaults.each do |name|
61
+ apply_default(name)
62
+ end
63
+ end
64
+
65
+ # Applies a single default value for the given name.
66
+ #
67
+ # @example Apply a single default.
68
+ # model.apply_default("name")
69
+ #
70
+ # @param [ String ] name The name of the field.
71
+ #
72
+ # @since 2.4.0
73
+ def apply_default(name)
74
+ unless attributes.has_key?(name)
75
+ if field = fields[name]
76
+ default = field.eval_default(self)
77
+ unless default.nil? || field.lazy?
78
+ attribute_will_change!(name)
79
+ attributes[name] = default
80
+ end
81
+ end
82
+ end
83
+ end
84
+
85
+ # Apply all the defaults at once.
86
+ #
87
+ # @example Apply all the defaults.
88
+ # model.apply_defaults
89
+ #
90
+ # @since 2.4.0
91
+ def apply_defaults
92
+ apply_pre_processed_defaults
93
+ apply_post_processed_defaults
94
+ end
95
+
96
+ # Returns an array of names for the attributes available on this object.
97
+ #
98
+ # Provides the field names in an ORM-agnostic way. Rails v3.1+ uses this
99
+ # method to automatically wrap params in JSON requests.
100
+ #
101
+ # @example Get the field names
102
+ # docment.attribute_names
103
+ #
104
+ # @return [ Array<String> ] The field names
105
+ #
106
+ # @since 3.0.0
107
+ def attribute_names
108
+ self.class.attribute_names
109
+ end
110
+
111
+ # Get the name of the provided field as it is stored in the database.
112
+ # Used in determining if the field is aliased or not.
113
+ #
114
+ # @example Get the database field name.
115
+ # model.database_field_name(:authorization)
116
+ #
117
+ # @param [ String, Symbol ] name The name to get.
118
+ #
119
+ # @return [ String ] The name of the field as it's stored in the db.
120
+ #
121
+ # @since 3.0.7
122
+ def database_field_name(name)
123
+ self.class.database_field_name(name)
124
+ end
125
+
126
+ # Is the provided field a lazy evaluation?
127
+ #
128
+ # @example If the field is lazy settable.
129
+ # doc.lazy_settable?(field, nil)
130
+ #
131
+ # @param [ Field ] field The field.
132
+ # @param [ Object ] value The current value.
133
+ #
134
+ # @return [ true, false ] If we set the field lazily.
135
+ #
136
+ # @since 3.1.0
137
+ def lazy_settable?(field, value)
138
+ !frozen? && value.nil? && field.lazy?
139
+ end
140
+
141
+ # Is the document using object ids?
142
+ #
143
+ # @note Refactored from using delegate for class load performance.
144
+ #
145
+ # @example Is the document using object ids?
146
+ # model.using_object_ids?
147
+ #
148
+ # @return [ true, false ] Using object ids.
149
+ def using_object_ids?
150
+ self.class.using_object_ids?
151
+ end
152
+
153
+ class << self
154
+
155
+ # Stores the provided block to be run when the option name specified is
156
+ # defined on a field.
157
+ #
158
+ # No assumptions are made about what sort of work the handler might
159
+ # perform, so it will always be called if the `option_name` key is
160
+ # provided in the field definition -- even if it is false or nil.
161
+ #
162
+ # @example
163
+ # Mongoid::Fields.option :required do |model, field, value|
164
+ # model.validates_presence_of field if value
165
+ # end
166
+ #
167
+ # @param [ Symbol ] option_name the option name to match against
168
+ # @param [ Proc ] block the handler to execute when the option is
169
+ # provided.
170
+ #
171
+ # @since 2.1.0
172
+ def option(option_name, &block)
173
+ options[option_name] = block
174
+ end
175
+
176
+ # Return a map of custom option names to their handlers.
177
+ #
178
+ # @example
179
+ # Mongoid::Fields.options
180
+ # # => { :required => #<Proc:0x00000100976b38> }
181
+ #
182
+ # @return [ Hash ] the option map
183
+ #
184
+ # @since 2.1.0
185
+ def options
186
+ @options ||= {}
187
+ end
188
+ end
189
+
190
+ module ClassMethods
191
+
192
+ # Returns an array of names for the attributes available on this object.
193
+ #
194
+ # Provides the field names in an ORM-agnostic way. Rails v3.1+ uses this
195
+ # method to automatically wrap params in JSON requests.
196
+ #
197
+ # @example Get the field names
198
+ # Model.attribute_names
199
+ #
200
+ # @return [ Array<String> ] The field names
201
+ #
202
+ # @since 3.0.0
203
+ def attribute_names
204
+ fields.keys
205
+ end
206
+
207
+ # Get the name of the provided field as it is stored in the database.
208
+ # Used in determining if the field is aliased or not.
209
+ #
210
+ # @example Get the database field name.
211
+ # Model.database_field_name(:authorization)
212
+ #
213
+ # @param [ String, Symbol ] name The name to get.
214
+ #
215
+ # @return [ String ] The name of the field as it's stored in the db.
216
+ #
217
+ # @since 3.0.7
218
+ def database_field_name(name)
219
+ return nil unless name
220
+ normalized = name.to_s
221
+ aliased_fields[normalized] || normalized
222
+ end
223
+
224
+ # Defines all the fields that are accessible on the Document
225
+ # For each field that is defined, a getter and setter will be
226
+ # added as an instance method to the Document.
227
+ #
228
+ # @example Define a field.
229
+ # field :score, :type => Integer, :default => 0
230
+ #
231
+ # @param [ Symbol ] name The name of the field.
232
+ # @param [ Hash ] options The options to pass to the field.
233
+ #
234
+ # @option options [ Class ] :type The type of the field.
235
+ # @option options [ String ] :label The label for the field.
236
+ # @option options [ Object, Proc ] :default The field's default
237
+ #
238
+ # @return [ Field ] The generated field
239
+ def field(name, options = {})
240
+ named = name.to_s
241
+ Validators::Macro.validate(self, name, options)
242
+ added = add_field(named, options)
243
+ descendants.each do |subclass|
244
+ subclass.add_field(named, options)
245
+ end
246
+ added
247
+ end
248
+
249
+ # Replace a field with a new type.
250
+ #
251
+ # @example Replace the field.
252
+ # Model.replace_field("_id", String)
253
+ #
254
+ # @param [ String ] name The name of the field.
255
+ # @param [ Class ] type The new type of field.
256
+ #
257
+ # @return [ Serializable ] The new field.
258
+ #
259
+ # @since 2.1.0
260
+ def replace_field(name, type)
261
+ remove_defaults(name)
262
+ add_field(name, fields[name].options.merge(type: type))
263
+ end
264
+
265
+ # Convenience method for determining if we are using +Moped::BSON::ObjectIds+ as
266
+ # our id.
267
+ #
268
+ # @example Does this class use object ids?
269
+ # person.using_object_ids?
270
+ #
271
+ # @return [ true, false ] If the class uses Moped::BSON::ObjectIds for the id.
272
+ #
273
+ # @since 1.0.0
274
+ def using_object_ids?
275
+ fields["_id"].object_id_field?
276
+ end
277
+
278
+ protected
279
+
280
+ # Add the defaults to the model. This breaks them up between ones that
281
+ # are procs and ones that are not.
282
+ #
283
+ # @example Add to the defaults.
284
+ # Model.add_defaults(field)
285
+ #
286
+ # @param [ Field ] field The field to add for.
287
+ #
288
+ # @since 2.4.0
289
+ def add_defaults(field)
290
+ default, name = field.default_val, field.name.to_s
291
+ remove_defaults(name)
292
+ unless default.nil?
293
+ if field.pre_processed?
294
+ pre_processed_defaults.push(name)
295
+ else
296
+ post_processed_defaults.push(name)
297
+ end
298
+ end
299
+ end
300
+
301
+ # Define a field attribute for the +Document+.
302
+ #
303
+ # @example Set the field.
304
+ # Person.add_field(:name, :default => "Test")
305
+ #
306
+ # @param [ Symbol ] name The name of the field.
307
+ # @param [ Hash ] options The hash of options.
308
+ def add_field(name, options = {})
309
+ aliased = options[:as]
310
+ aliased_fields[aliased.to_s] = name if aliased
311
+ field = field_for(name, options)
312
+ fields[name] = field
313
+ add_defaults(field)
314
+ create_accessors(name, name, options)
315
+ create_accessors(name, aliased, options) if aliased
316
+ process_options(field)
317
+ create_dirty_methods(name, name)
318
+ create_dirty_methods(name, aliased) if aliased
319
+ field
320
+ end
321
+
322
+ # Run through all custom options stored in Mongoid::Fields.options and
323
+ # execute the handler if the option is provided.
324
+ #
325
+ # @example
326
+ # Mongoid::Fields.option :custom do
327
+ # puts "called"
328
+ # end
329
+ #
330
+ # field = Mongoid::Fields.new(:test, :custom => true)
331
+ # Person.process_options(field)
332
+ # # => "called"
333
+ #
334
+ # @param [ Field ] field the field to process
335
+ def process_options(field)
336
+ field_options = field.options
337
+
338
+ Fields.options.each_pair do |option_name, handler|
339
+ if field_options.has_key?(option_name)
340
+ handler.call(self, field, field_options[option_name])
341
+ end
342
+ end
343
+ end
344
+
345
+ # Create the field accessors.
346
+ #
347
+ # @example Generate the accessors.
348
+ # Person.create_accessors(:name, "name")
349
+ # person.name #=> returns the field
350
+ # person.name = "" #=> sets the field
351
+ # person.name? #=> Is the field present?
352
+ # person.name_before_type_cast #=> returns the field before type cast
353
+ #
354
+ # @param [ Symbol ] name The name of the field.
355
+ # @param [ Symbol ] meth The name of the accessor.
356
+ # @param [ Hash ] options The options.
357
+ #
358
+ # @since 2.0.0
359
+ def create_accessors(name, meth, options = {})
360
+ field = fields[name]
361
+
362
+ create_field_getter(name, meth, field)
363
+ create_field_getter_before_type_cast(name, meth)
364
+ create_field_setter(name, meth, field)
365
+ create_field_check(name, meth)
366
+
367
+ if options[:localize]
368
+ create_translations_getter(name, meth)
369
+ create_translations_setter(name, meth, field)
370
+ localized_fields[name] = field
371
+ end
372
+ end
373
+
374
+ # Create the getter method for the provided field.
375
+ #
376
+ # @example Create the getter.
377
+ # Model.create_field_getter("name", "name", field)
378
+ #
379
+ # @param [ String ] name The name of the attribute.
380
+ # @param [ String ] meth The name of the method.
381
+ # @param [ Field ] field The field.
382
+ #
383
+ # @since 2.4.0
384
+ def create_field_getter(name, meth, field)
385
+ generated_methods.module_eval do
386
+ re_define_method(meth) do
387
+ raw = read_attribute(name)
388
+ if lazy_settable?(field, raw)
389
+ write_attribute(name, field.eval_default(self))
390
+ else
391
+ value = field.demongoize(raw)
392
+ attribute_will_change!(name) if value.resizable?
393
+ value
394
+ end
395
+ end
396
+ end
397
+ end
398
+
399
+ # Create the getter_before_type_cast method for the provided field. If
400
+ # the attribute has been assigned, return the attribute before it was
401
+ # type cast. Otherwise, delegate to the getter.
402
+ #
403
+ # @example Create the getter_before_type_cast.
404
+ # Model.create_field_getter_before_type_cast("name", "name")
405
+ #
406
+ # @param [ String ] name The name of the attribute.
407
+ # @param [ String ] meth The name of the method.
408
+ #
409
+ # @since 3.1.0
410
+ def create_field_getter_before_type_cast(name, meth)
411
+ generated_methods.module_eval do
412
+ re_define_method("#{meth}_before_type_cast") do
413
+ if has_attribute_before_type_cast?(name)
414
+ read_attribute_before_type_cast(name)
415
+ else
416
+ send meth
417
+ end
418
+ end
419
+ end
420
+ end
421
+
422
+ # Create the setter method for the provided field.
423
+ #
424
+ # @example Create the setter.
425
+ # Model.create_field_setter("name", "name")
426
+ #
427
+ # @param [ String ] name The name of the attribute.
428
+ # @param [ String ] meth The name of the method.
429
+ # @param [ Field ] field The field.
430
+ #
431
+ # @since 2.4.0
432
+ def create_field_setter(name, meth, field)
433
+ generated_methods.module_eval do
434
+ re_define_method("#{meth}=") do |value|
435
+ val = write_attribute(name, value)
436
+ if field.foreign_key?
437
+ remove_ivar(field.metadata.name)
438
+ end
439
+ val
440
+ end
441
+ end
442
+ end
443
+
444
+ # Create the check method for the provided field.
445
+ #
446
+ # @example Create the check.
447
+ # Model.create_field_check("name", "name")
448
+ #
449
+ # @param [ String ] name The name of the attribute.
450
+ # @param [ String ] meth The name of the method.
451
+ #
452
+ # @since 2.4.0
453
+ def create_field_check(name, meth)
454
+ generated_methods.module_eval do
455
+ re_define_method("#{meth}?") do
456
+ attr = read_attribute(name)
457
+ attr == true || attr.present?
458
+ end
459
+ end
460
+ end
461
+
462
+ # Create the translation getter method for the provided field.
463
+ #
464
+ # @example Create the translation getter.
465
+ # Model.create_translations_getter("name", "name")
466
+ #
467
+ # @param [ String ] name The name of the attribute.
468
+ # @param [ String ] meth The name of the method.
469
+ #
470
+ # @since 2.4.0
471
+ def create_translations_getter(name, meth)
472
+ generated_methods.module_eval do
473
+ re_define_method("#{meth}_translations") do
474
+ (attributes[name] ||= {}).with_indifferent_access
475
+ end
476
+ alias_method :"#{meth}_t", :"#{meth}_translations"
477
+ end
478
+ end
479
+
480
+ # Create the translation setter method for the provided field.
481
+ #
482
+ # @example Create the translation setter.
483
+ # Model.create_translations_setter("name", "name")
484
+ #
485
+ # @param [ String ] name The name of the attribute.
486
+ # @param [ String ] meth The name of the method.
487
+ # @param [ Field ] field The field.
488
+ #
489
+ # @since 2.4.0
490
+ def create_translations_setter(name, meth, field)
491
+ generated_methods.module_eval do
492
+ re_define_method("#{meth}_translations=") do |value|
493
+ attribute_will_change!(name)
494
+ if value
495
+ value.update_values do |_value|
496
+ field.type.mongoize(_value)
497
+ end
498
+ end
499
+ attributes[name] = value
500
+ end
501
+ alias_method :"#{meth}_t=", :"#{meth}_translations="
502
+ end
503
+ end
504
+
505
+ # Include the field methods as a module, so they can be overridden.
506
+ #
507
+ # @example Include the fields.
508
+ # Person.generated_methods
509
+ #
510
+ # @return [ Module ] The module of generated methods.
511
+ #
512
+ # @since 2.0.0
513
+ def generated_methods
514
+ @generated_methods ||= begin
515
+ mod = Module.new
516
+ include(mod)
517
+ mod
518
+ end
519
+ end
520
+
521
+ # Remove the default keys for the provided name.
522
+ #
523
+ # @example Remove the default keys.
524
+ # Model.remove_defaults(name)
525
+ #
526
+ # @param [ String ] name The field name.
527
+ #
528
+ # @since 2.4.0
529
+ def remove_defaults(name)
530
+ pre_processed_defaults.delete_one(name)
531
+ post_processed_defaults.delete_one(name)
532
+ end
533
+
534
+ def field_for(name, options)
535
+ opts = options.merge(klass: self)
536
+ return Fields::Localized.new(name, opts) if options[:localize]
537
+ return Fields::ForeignKey.new(name, opts) if options[:identity]
538
+ Fields::Standard.new(name, opts)
539
+ end
540
+ end
541
+ end
542
+ end