mongoid 2.8.1 → 3.0.0.rc

Sign up to get free protection for your applications and to get access to all the features.
Files changed (351) hide show
  1. data/CHANGELOG.md +802 -58
  2. data/LICENSE +1 -1
  3. data/README.md +10 -11
  4. data/Rakefile +2 -8
  5. data/lib/config/locales/en.yml +441 -51
  6. data/lib/mongoid.rb +24 -39
  7. data/lib/mongoid/atomic.rb +16 -33
  8. data/lib/mongoid/atomic/modifiers.rb +2 -2
  9. data/lib/mongoid/atomic/paths/embedded.rb +4 -5
  10. data/lib/mongoid/atomic/paths/embedded/many.rb +6 -6
  11. data/lib/mongoid/atomic/paths/embedded/one.rb +5 -5
  12. data/lib/mongoid/atomic/paths/root.rb +4 -5
  13. data/lib/mongoid/attributes.rb +95 -32
  14. data/lib/mongoid/attributes/processing.rb +14 -10
  15. data/lib/mongoid/attributes/readonly.rb +56 -0
  16. data/lib/mongoid/callbacks.rb +90 -27
  17. data/lib/mongoid/collections/retry.rb +2 -3
  18. data/lib/mongoid/components.rb +11 -23
  19. data/lib/mongoid/config.rb +87 -233
  20. data/lib/mongoid/config/environment.rb +5 -6
  21. data/lib/mongoid/config/inflections.rb +6 -0
  22. data/lib/mongoid/config/options.rb +1 -1
  23. data/lib/mongoid/config/validators.rb +3 -0
  24. data/lib/mongoid/config/validators/option.rb +25 -0
  25. data/lib/mongoid/config/validators/session.rb +140 -0
  26. data/lib/mongoid/contextual.rb +50 -0
  27. data/lib/mongoid/contextual/aggregable/memory.rb +98 -0
  28. data/lib/mongoid/contextual/aggregable/mongo.rb +181 -0
  29. data/lib/mongoid/contextual/atomic.rb +179 -0
  30. data/lib/mongoid/contextual/command.rb +43 -0
  31. data/lib/mongoid/contextual/find_and_modify.rb +66 -0
  32. data/lib/mongoid/contextual/map_reduce.rb +273 -0
  33. data/lib/mongoid/contextual/memory.rb +383 -0
  34. data/lib/mongoid/contextual/mongo.rb +543 -0
  35. data/lib/mongoid/copyable.rb +3 -34
  36. data/lib/mongoid/criteria.rb +436 -250
  37. data/lib/mongoid/criterion/inspection.rb +14 -8
  38. data/lib/mongoid/criterion/scoping.rb +114 -44
  39. data/lib/mongoid/dirty.rb +152 -67
  40. data/lib/mongoid/document.rb +69 -50
  41. data/lib/mongoid/errors.rb +22 -1
  42. data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
  43. data/lib/mongoid/errors/callback.rb +5 -6
  44. data/lib/mongoid/errors/delete_restriction.rb +29 -0
  45. data/lib/mongoid/errors/document_not_found.rb +98 -17
  46. data/lib/mongoid/errors/eager_load.rb +3 -6
  47. data/lib/mongoid/errors/invalid_collection.rb +3 -3
  48. data/lib/mongoid/errors/invalid_config_option.rb +27 -0
  49. data/lib/mongoid/errors/invalid_database.rb +3 -3
  50. data/lib/mongoid/errors/invalid_field.rb +54 -8
  51. data/lib/mongoid/errors/invalid_field_option.rb +35 -0
  52. data/lib/mongoid/errors/invalid_find.rb +3 -3
  53. data/lib/mongoid/errors/invalid_index.rb +28 -0
  54. data/lib/mongoid/errors/invalid_options.rb +4 -4
  55. data/lib/mongoid/errors/invalid_scope.rb +24 -0
  56. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
  57. data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
  58. data/lib/mongoid/errors/invalid_time.rb +3 -6
  59. data/lib/mongoid/errors/inverse_not_found.rb +29 -0
  60. data/lib/mongoid/errors/mixed_relations.rb +4 -9
  61. data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
  62. data/lib/mongoid/errors/mongoid_error.rb +54 -3
  63. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
  64. data/lib/mongoid/errors/no_default_session.rb +23 -0
  65. data/lib/mongoid/errors/no_environment.rb +3 -3
  66. data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
  67. data/lib/mongoid/errors/no_parent.rb +24 -0
  68. data/lib/mongoid/errors/no_session_config.rb +22 -0
  69. data/lib/mongoid/errors/no_session_database.rb +27 -0
  70. data/lib/mongoid/errors/no_session_hosts.rb +27 -0
  71. data/lib/mongoid/errors/no_sessions_config.rb +20 -0
  72. data/lib/mongoid/errors/readonly_attribute.rb +25 -0
  73. data/lib/mongoid/errors/scope_overwrite.rb +4 -4
  74. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +4 -4
  75. data/lib/mongoid/errors/unknown_attribute.rb +25 -0
  76. data/lib/mongoid/errors/unsaved_document.rb +4 -8
  77. data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
  78. data/lib/mongoid/errors/unsupported_version.rb +4 -4
  79. data/lib/mongoid/errors/validations.rb +7 -6
  80. data/lib/mongoid/errors/versioning_not_on_root.rb +23 -0
  81. data/lib/mongoid/extensions.rb +28 -76
  82. data/lib/mongoid/extensions/array.rb +127 -0
  83. data/lib/mongoid/extensions/big_decimal.rb +42 -0
  84. data/lib/mongoid/extensions/boolean.rb +24 -0
  85. data/lib/mongoid/extensions/date.rb +70 -0
  86. data/lib/mongoid/extensions/date_time.rb +68 -0
  87. data/lib/mongoid/extensions/false_class.rb +26 -0
  88. data/lib/mongoid/extensions/float.rb +44 -0
  89. data/lib/mongoid/extensions/hash.rb +91 -0
  90. data/lib/mongoid/extensions/integer.rb +54 -0
  91. data/lib/mongoid/extensions/module.rb +28 -0
  92. data/lib/mongoid/extensions/nil_class.rb +21 -0
  93. data/lib/mongoid/extensions/object.rb +188 -0
  94. data/lib/mongoid/extensions/object_id.rb +53 -0
  95. data/lib/mongoid/extensions/range.rb +55 -0
  96. data/lib/mongoid/extensions/regexp.rb +27 -0
  97. data/lib/mongoid/extensions/set.rb +55 -0
  98. data/lib/mongoid/extensions/string.rb +155 -0
  99. data/lib/mongoid/extensions/symbol.rb +54 -0
  100. data/lib/mongoid/extensions/time.rb +78 -0
  101. data/lib/mongoid/extensions/time_with_zone.rb +55 -0
  102. data/lib/mongoid/extensions/true_class.rb +26 -0
  103. data/lib/mongoid/factory.rb +1 -1
  104. data/lib/mongoid/fields.rb +129 -194
  105. data/lib/mongoid/fields/foreign_key.rb +134 -0
  106. data/lib/mongoid/fields/localized.rb +73 -0
  107. data/lib/mongoid/fields/standard.rb +268 -0
  108. data/lib/mongoid/fields/validators.rb +2 -0
  109. data/lib/mongoid/fields/validators/macro.rb +83 -0
  110. data/lib/mongoid/finders.rb +42 -43
  111. data/lib/mongoid/hierarchy.rb +25 -14
  112. data/lib/mongoid/identity_map.rb +31 -19
  113. data/lib/mongoid/indexes.rb +66 -15
  114. data/lib/mongoid/indexes/validators/options.rb +80 -0
  115. data/lib/mongoid/inspection.rb +1 -1
  116. data/lib/mongoid/javascript.rb +1 -1
  117. data/lib/mongoid/json.rb +2 -2
  118. data/lib/mongoid/loggable.rb +69 -0
  119. data/lib/mongoid/matchers.rb +1 -1
  120. data/lib/mongoid/matchers/all.rb +7 -8
  121. data/lib/mongoid/matchers/and.rb +3 -3
  122. data/lib/mongoid/matchers/default.rb +6 -4
  123. data/lib/mongoid/matchers/exists.rb +2 -2
  124. data/lib/mongoid/matchers/gt.rb +2 -2
  125. data/lib/mongoid/matchers/gte.rb +2 -2
  126. data/lib/mongoid/matchers/in.rb +3 -7
  127. data/lib/mongoid/matchers/lt.rb +2 -2
  128. data/lib/mongoid/matchers/lte.rb +2 -2
  129. data/lib/mongoid/matchers/ne.rb +2 -2
  130. data/lib/mongoid/matchers/nin.rb +2 -2
  131. data/lib/mongoid/matchers/or.rb +2 -2
  132. data/lib/mongoid/matchers/size.rb +2 -2
  133. data/lib/mongoid/matchers/strategies.rb +3 -3
  134. data/lib/mongoid/multi_parameter_attributes.rb +8 -10
  135. data/lib/mongoid/nested_attributes.rb +17 -9
  136. data/lib/mongoid/observer.rb +1 -2
  137. data/lib/mongoid/paranoia.rb +13 -18
  138. data/lib/mongoid/persistence.rb +43 -39
  139. data/lib/mongoid/persistence/atomic.rb +2 -2
  140. data/lib/mongoid/persistence/atomic/add_to_set.rb +5 -9
  141. data/lib/mongoid/persistence/atomic/bit.rb +5 -7
  142. data/lib/mongoid/persistence/atomic/inc.rb +5 -7
  143. data/lib/mongoid/persistence/atomic/operation.rb +45 -6
  144. data/lib/mongoid/persistence/atomic/pop.rb +5 -7
  145. data/lib/mongoid/persistence/atomic/pull.rb +5 -7
  146. data/lib/mongoid/persistence/atomic/pull_all.rb +5 -7
  147. data/lib/mongoid/persistence/atomic/push.rb +4 -10
  148. data/lib/mongoid/persistence/atomic/push_all.rb +4 -10
  149. data/lib/mongoid/persistence/atomic/rename.rb +6 -7
  150. data/lib/mongoid/persistence/atomic/sets.rb +5 -7
  151. data/lib/mongoid/persistence/atomic/unset.rb +4 -5
  152. data/lib/mongoid/persistence/deletion.rb +2 -2
  153. data/lib/mongoid/persistence/insertion.rb +10 -16
  154. data/lib/mongoid/persistence/modification.rb +5 -9
  155. data/lib/mongoid/persistence/operations.rb +6 -19
  156. data/lib/mongoid/persistence/operations/embedded/insert.rb +7 -6
  157. data/lib/mongoid/persistence/operations/embedded/remove.rb +5 -5
  158. data/lib/mongoid/persistence/operations/insert.rb +4 -4
  159. data/lib/mongoid/persistence/operations/remove.rb +4 -4
  160. data/lib/mongoid/persistence/operations/update.rb +5 -5
  161. data/lib/mongoid/railtie.rb +26 -11
  162. data/lib/mongoid/railties/database.rake +22 -108
  163. data/lib/mongoid/relations.rb +4 -6
  164. data/lib/mongoid/relations/accessors.rb +119 -19
  165. data/lib/mongoid/relations/auto_save.rb +59 -5
  166. data/lib/mongoid/relations/binding.rb +211 -2
  167. data/lib/mongoid/relations/bindings/embedded/in.rb +16 -22
  168. data/lib/mongoid/relations/bindings/embedded/many.rb +9 -50
  169. data/lib/mongoid/relations/bindings/embedded/one.rb +10 -16
  170. data/lib/mongoid/relations/bindings/referenced/in.rb +31 -57
  171. data/lib/mongoid/relations/bindings/referenced/many.rb +8 -20
  172. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -19
  173. data/lib/mongoid/relations/bindings/referenced/one.rb +10 -24
  174. data/lib/mongoid/relations/builder.rb +3 -3
  175. data/lib/mongoid/relations/builders.rb +19 -16
  176. data/lib/mongoid/relations/builders/embedded/in.rb +5 -5
  177. data/lib/mongoid/relations/builders/embedded/many.rb +12 -12
  178. data/lib/mongoid/relations/builders/embedded/one.rb +6 -6
  179. data/lib/mongoid/relations/builders/nested_attributes/many.rb +8 -8
  180. data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -4
  181. data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
  182. data/lib/mongoid/relations/builders/referenced/many.rb +5 -5
  183. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +7 -5
  184. data/lib/mongoid/relations/builders/referenced/one.rb +5 -5
  185. data/lib/mongoid/relations/cascading.rb +6 -4
  186. data/lib/mongoid/relations/cascading/delete.rb +3 -5
  187. data/lib/mongoid/relations/cascading/destroy.rb +3 -3
  188. data/lib/mongoid/relations/cascading/nullify.rb +3 -3
  189. data/lib/mongoid/relations/cascading/restrict.rb +37 -0
  190. data/lib/mongoid/relations/constraint.rb +4 -3
  191. data/lib/mongoid/relations/conversions.rb +5 -6
  192. data/lib/mongoid/relations/cyclic.rb +7 -7
  193. data/lib/mongoid/relations/embedded/batchable.rb +346 -0
  194. data/lib/mongoid/relations/embedded/in.rb +23 -12
  195. data/lib/mongoid/relations/embedded/many.rb +99 -161
  196. data/lib/mongoid/relations/embedded/one.rb +25 -14
  197. data/lib/mongoid/relations/macros.rb +105 -61
  198. data/lib/mongoid/relations/many.rb +93 -14
  199. data/lib/mongoid/relations/metadata.rb +200 -45
  200. data/lib/mongoid/relations/nested_builder.rb +3 -5
  201. data/lib/mongoid/relations/one.rb +2 -2
  202. data/lib/mongoid/relations/options.rb +2 -2
  203. data/lib/mongoid/relations/polymorphic.rb +9 -9
  204. data/lib/mongoid/relations/proxy.rb +60 -31
  205. data/lib/mongoid/relations/referenced/in.rb +40 -15
  206. data/lib/mongoid/relations/referenced/many.rb +117 -132
  207. data/lib/mongoid/relations/referenced/many_to_many.rb +101 -46
  208. data/lib/mongoid/relations/referenced/one.rb +34 -13
  209. data/lib/mongoid/relations/reflections.rb +3 -3
  210. data/lib/mongoid/relations/synchronization.rb +19 -23
  211. data/lib/mongoid/relations/targets/enumerable.rb +86 -57
  212. data/lib/mongoid/reloading.rb +12 -14
  213. data/lib/mongoid/scoping.rb +329 -0
  214. data/lib/mongoid/serialization.rb +8 -27
  215. data/lib/mongoid/sessions.rb +359 -0
  216. data/lib/mongoid/sessions/factory.rb +106 -0
  217. data/lib/mongoid/sessions/mongo_uri.rb +93 -0
  218. data/lib/mongoid/sessions/validators.rb +2 -0
  219. data/lib/mongoid/sessions/validators/storage.rb +49 -0
  220. data/lib/mongoid/sharding.rb +6 -6
  221. data/lib/mongoid/state.rb +6 -7
  222. data/lib/mongoid/threaded.rb +167 -59
  223. data/lib/mongoid/threaded/lifecycle.rb +21 -22
  224. data/lib/mongoid/threaded/sessions.rb +0 -0
  225. data/lib/mongoid/timestamps.rb +1 -1
  226. data/lib/mongoid/timestamps/created.rb +8 -4
  227. data/lib/mongoid/timestamps/timeless.rb +6 -4
  228. data/lib/mongoid/timestamps/updated.rb +3 -3
  229. data/lib/mongoid/unit_of_work.rb +61 -0
  230. data/lib/mongoid/validations.rb +27 -19
  231. data/lib/mongoid/validations/associated.rb +2 -2
  232. data/lib/mongoid/validations/format.rb +2 -2
  233. data/lib/mongoid/validations/presence.rb +31 -5
  234. data/lib/mongoid/validations/uniqueness.rb +9 -12
  235. data/lib/mongoid/version.rb +2 -2
  236. data/lib/mongoid/versioning.rb +25 -26
  237. data/lib/rack/mongoid/middleware/identity_map.rb +3 -3
  238. data/lib/rails/generators/mongoid/config/config_generator.rb +1 -1
  239. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +59 -19
  240. data/lib/rails/generators/mongoid/model/model_generator.rb +7 -7
  241. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +2 -2
  242. data/lib/rails/generators/mongoid/observer/observer_generator.rb +4 -4
  243. data/lib/rails/generators/mongoid_generator.rb +5 -5
  244. data/lib/rails/mongoid.rb +69 -25
  245. metadata +110 -137
  246. checksums.yaml +0 -7
  247. data/lib/config/locales/bg.yml +0 -61
  248. data/lib/config/locales/de.yml +0 -61
  249. data/lib/config/locales/en-GB.yml +0 -64
  250. data/lib/config/locales/es.yml +0 -59
  251. data/lib/config/locales/fr.yml +0 -62
  252. data/lib/config/locales/hi.yml +0 -53
  253. data/lib/config/locales/hu.yml +0 -64
  254. data/lib/config/locales/id.yml +0 -62
  255. data/lib/config/locales/it.yml +0 -59
  256. data/lib/config/locales/ja.yml +0 -57
  257. data/lib/config/locales/kr.yml +0 -54
  258. data/lib/config/locales/nl.yml +0 -61
  259. data/lib/config/locales/pl.yml +0 -59
  260. data/lib/config/locales/pt-BR.yml +0 -60
  261. data/lib/config/locales/pt.yml +0 -60
  262. data/lib/config/locales/ro.yml +0 -66
  263. data/lib/config/locales/ru.yml +0 -61
  264. data/lib/config/locales/sv.yml +0 -60
  265. data/lib/config/locales/vi.yml +0 -62
  266. data/lib/config/locales/zh-CN.yml +0 -53
  267. data/lib/mongoid/collection.rb +0 -157
  268. data/lib/mongoid/collections.rb +0 -120
  269. data/lib/mongoid/collections/master.rb +0 -45
  270. data/lib/mongoid/collections/operations.rb +0 -44
  271. data/lib/mongoid/config/database.rb +0 -181
  272. data/lib/mongoid/config/replset_database.rb +0 -80
  273. data/lib/mongoid/contexts.rb +0 -25
  274. data/lib/mongoid/contexts/enumerable.rb +0 -313
  275. data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
  276. data/lib/mongoid/contexts/mongo.rb +0 -487
  277. data/lib/mongoid/criterion/builder.rb +0 -34
  278. data/lib/mongoid/criterion/complex.rb +0 -84
  279. data/lib/mongoid/criterion/creational.rb +0 -34
  280. data/lib/mongoid/criterion/exclusion.rb +0 -110
  281. data/lib/mongoid/criterion/inclusion.rb +0 -290
  282. data/lib/mongoid/criterion/optional.rb +0 -259
  283. data/lib/mongoid/criterion/selector.rb +0 -177
  284. data/lib/mongoid/cursor.rb +0 -88
  285. data/lib/mongoid/default_scope.rb +0 -36
  286. data/lib/mongoid/errors/invalid_type.rb +0 -25
  287. data/lib/mongoid/extensions/array/deep_copy.rb +0 -25
  288. data/lib/mongoid/extensions/array/deletion.rb +0 -29
  289. data/lib/mongoid/extensions/false_class/equality.rb +0 -26
  290. data/lib/mongoid/extensions/hash/criteria_helpers.rb +0 -47
  291. data/lib/mongoid/extensions/hash/deep_copy.rb +0 -25
  292. data/lib/mongoid/extensions/hash/scoping.rb +0 -25
  293. data/lib/mongoid/extensions/integer/checks.rb +0 -23
  294. data/lib/mongoid/extensions/nil/collectionization.rb +0 -23
  295. data/lib/mongoid/extensions/object/checks.rb +0 -29
  296. data/lib/mongoid/extensions/object/deep_copy.rb +0 -21
  297. data/lib/mongoid/extensions/object/reflections.rb +0 -48
  298. data/lib/mongoid/extensions/object/substitutable.rb +0 -15
  299. data/lib/mongoid/extensions/object/yoda.rb +0 -44
  300. data/lib/mongoid/extensions/object_id/conversions.rb +0 -60
  301. data/lib/mongoid/extensions/proc/scoping.rb +0 -25
  302. data/lib/mongoid/extensions/string/checks.rb +0 -36
  303. data/lib/mongoid/extensions/string/conversions.rb +0 -22
  304. data/lib/mongoid/extensions/string/inflections.rb +0 -118
  305. data/lib/mongoid/extensions/symbol/checks.rb +0 -23
  306. data/lib/mongoid/extensions/symbol/inflections.rb +0 -67
  307. data/lib/mongoid/extensions/true_class/equality.rb +0 -26
  308. data/lib/mongoid/extras.rb +0 -31
  309. data/lib/mongoid/fields/internal/array.rb +0 -77
  310. data/lib/mongoid/fields/internal/big_decimal.rb +0 -63
  311. data/lib/mongoid/fields/internal/bignum.rb +0 -10
  312. data/lib/mongoid/fields/internal/binary.rb +0 -11
  313. data/lib/mongoid/fields/internal/boolean.rb +0 -58
  314. data/lib/mongoid/fields/internal/date.rb +0 -51
  315. data/lib/mongoid/fields/internal/date_time.rb +0 -28
  316. data/lib/mongoid/fields/internal/false_class.rb +0 -10
  317. data/lib/mongoid/fields/internal/fixnum.rb +0 -10
  318. data/lib/mongoid/fields/internal/float.rb +0 -47
  319. data/lib/mongoid/fields/internal/foreign_keys/array.rb +0 -88
  320. data/lib/mongoid/fields/internal/foreign_keys/object.rb +0 -56
  321. data/lib/mongoid/fields/internal/hash.rb +0 -11
  322. data/lib/mongoid/fields/internal/integer.rb +0 -59
  323. data/lib/mongoid/fields/internal/localized.rb +0 -62
  324. data/lib/mongoid/fields/internal/nil_class.rb +0 -53
  325. data/lib/mongoid/fields/internal/object.rb +0 -11
  326. data/lib/mongoid/fields/internal/object_id.rb +0 -46
  327. data/lib/mongoid/fields/internal/range.rb +0 -61
  328. data/lib/mongoid/fields/internal/set.rb +0 -57
  329. data/lib/mongoid/fields/internal/string.rb +0 -42
  330. data/lib/mongoid/fields/internal/symbol.rb +0 -43
  331. data/lib/mongoid/fields/internal/time.rb +0 -23
  332. data/lib/mongoid/fields/internal/time_with_zone.rb +0 -23
  333. data/lib/mongoid/fields/internal/timekeeping.rb +0 -122
  334. data/lib/mongoid/fields/internal/true_class.rb +0 -10
  335. data/lib/mongoid/fields/mappings.rb +0 -42
  336. data/lib/mongoid/fields/serializable.rb +0 -270
  337. data/lib/mongoid/identity.rb +0 -92
  338. data/lib/mongoid/keys.rb +0 -144
  339. data/lib/mongoid/logger.rb +0 -45
  340. data/lib/mongoid/multi_database.rb +0 -36
  341. data/lib/mongoid/named_scope.rb +0 -166
  342. data/lib/mongoid/relations/embedded/atomic.rb +0 -89
  343. data/lib/mongoid/relations/embedded/atomic/operation.rb +0 -63
  344. data/lib/mongoid/relations/embedded/atomic/pull.rb +0 -65
  345. data/lib/mongoid/relations/embedded/atomic/push_all.rb +0 -59
  346. data/lib/mongoid/relations/embedded/atomic/set.rb +0 -61
  347. data/lib/mongoid/relations/embedded/atomic/unset.rb +0 -41
  348. data/lib/mongoid/relations/referenced/batch.rb +0 -73
  349. data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
  350. data/lib/mongoid/safety.rb +0 -105
  351. data/lib/mongoid/scope.rb +0 -31
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
2
+ module Mongoid
3
3
 
4
4
  # This is the base module for all domain objects that need to be persisted to
5
5
  # the database as documents.
@@ -17,6 +17,8 @@ module Mongoid #:nodoc:
17
17
  # @param [ Document ] other The document to compare with.
18
18
  #
19
19
  # @return [ Integer ] -1, 0, 1.
20
+ #
21
+ # @since 1.0.0
20
22
  def <=>(other)
21
23
  attributes["_id"].to_s <=> other.attributes["_id"].to_s
22
24
  end
@@ -30,6 +32,8 @@ module Mongoid #:nodoc:
30
32
  # @param [ Document, Object ] other The other object to compare with.
31
33
  #
32
34
  # @return [ true, false ] True if the ids are equal, false if not.
35
+ #
36
+ # @since 1.0.0
33
37
  def ==(other)
34
38
  self.class == other.class &&
35
39
  attributes["_id"] == other.attributes["_id"]
@@ -43,12 +47,10 @@ module Mongoid #:nodoc:
43
47
  # @param [ Document, Object ] other The other object to compare with.
44
48
  #
45
49
  # @return [ true, false ] True if the classes are equal, false if not.
50
+ #
51
+ # @since 1.0.0
46
52
  def ===(other)
47
- if other.class == Class
48
- self.class === other
49
- else
50
- id == other.id
51
- end
53
+ other.class == Class ? self.class === other : self == other
52
54
  end
53
55
 
54
56
  # Delegates to ==. Used when needing checks in hashes.
@@ -59,6 +61,8 @@ module Mongoid #:nodoc:
59
61
  # @param [ Document, Object ] other The object to check against.
60
62
  #
61
63
  # @return [ true, false ] True if equal, false if not.
64
+ #
65
+ # @since 1.0.0
62
66
  def eql?(other)
63
67
  self == (other)
64
68
  end
@@ -72,7 +76,7 @@ module Mongoid #:nodoc:
72
76
  #
73
77
  # @since 2.0.0
74
78
  def freeze
75
- tap { |doc| doc.as_document.freeze }
79
+ as_document.freeze and self
76
80
  end
77
81
 
78
82
  # Checks if the document is frozen
@@ -87,8 +91,8 @@ module Mongoid #:nodoc:
87
91
  attributes.frozen?
88
92
  end
89
93
 
90
- # Delegates to id in order to allow two records of the same type and id to
91
- # work with something like:
94
+ # Delegates to identity in order to allow two records of the same identity
95
+ # to work with something like:
92
96
  #
93
97
  # [ Person.find(1), Person.find(2), Person.find(3) ] &
94
98
  # [ Person.find(1), Person.find(4) ] # => [ Person.find(1) ]
@@ -96,19 +100,25 @@ module Mongoid #:nodoc:
96
100
  # @example Get the hash.
97
101
  # document.hash
98
102
  #
99
- # @return [ Integer ] The hash of the document's id.
103
+ # @return [ Integer ] The hash of the document's identity.
104
+ #
105
+ # @since 1.0.0
100
106
  def hash
101
- attributes["_id"].hash
107
+ identity.hash
102
108
  end
103
109
 
104
- # Generate an id for this +Document+.
110
+ # A Document's is identified absolutely by it's class and database id:
111
+ #
112
+ # Person.first.identity #=> [Person, BSON::ObjectId('4f775130a04745933a000003')]
113
+ #
114
+ # @example Get the identity
115
+ # document.identity
105
116
  #
106
- # @example Create the id.
107
- # person.identify
117
+ # @return [ Array ] An array containing [document.class, document.id]
108
118
  #
109
- # @return [ BSON::ObjectId, String ] A newly created id.
110
- def identify
111
- Identity.new(self).create
119
+ # @since 3.0.0
120
+ def identity
121
+ [ self.class, self.id ]
112
122
  end
113
123
 
114
124
  # Instantiate a new +Document+, setting the Document's attributes if
@@ -126,19 +136,19 @@ module Mongoid #:nodoc:
126
136
  # :as and :without_protection
127
137
  #
128
138
  # @return [ Document ] A new document.
139
+ #
140
+ # @since 1.0.0
129
141
  def initialize(attrs = nil, options = nil)
130
142
  _building do
131
143
  @new_record = true
132
144
  @attributes ||= {}
133
145
  options ||= {}
134
- apply_non_proc_defaults
135
- identify if using_object_ids?
136
- process(attrs, options[:as] || :default, !options[:without_protection]) do
137
- identify unless using_object_ids?
146
+ apply_pre_processed_defaults
147
+ process_attributes(attrs, options[:as] || :default, !options[:without_protection]) do
138
148
  yield(self) if block_given?
139
149
  end
140
- apply_proc_defaults
141
- run_callbacks(:initialize) { self }
150
+ apply_post_processed_defaults
151
+ run_callbacks(:initialize) if _initialize_callbacks.any?
142
152
  end
143
153
  end
144
154
 
@@ -151,11 +161,7 @@ module Mongoid #:nodoc:
151
161
  #
152
162
  # @since 2.4.0
153
163
  def to_key
154
- if destroyed?
155
- [ id ]
156
- else
157
- persisted? ? [ id ] : nil
158
- end
164
+ (persisted? || destroyed?) ? [ id ] : nil
159
165
  end
160
166
 
161
167
  # Return an array with this +Document+ only in it.
@@ -164,6 +170,8 @@ module Mongoid #:nodoc:
164
170
  # document.to_a
165
171
  #
166
172
  # @return [ Array<Document> ] An array with the document as its only item.
173
+ #
174
+ # @since 1.0.0
167
175
  def to_a
168
176
  [ self ]
169
177
  end
@@ -176,16 +184,17 @@ module Mongoid #:nodoc:
176
184
  # person.as_document
177
185
  #
178
186
  # @return [ Hash ] A hash of all attributes in the hierarchy.
187
+ #
188
+ # @since 1.0.0
179
189
  def as_document
180
- attributes.tap do |attrs|
181
- return attrs if frozen?
182
- relations.each_pair do |name, meta|
183
- if meta.embedded?
184
- relation = send(name)
185
- attrs[name] = relation.as_document unless relation.blank?
186
- end
190
+ return attributes if frozen?
191
+ embedded_relations.each_pair do |name, meta|
192
+ without_autobuild do
193
+ relation = send(name)
194
+ attributes[meta.store_as] = relation.as_document unless relation.blank?
187
195
  end
188
196
  end
197
+ attributes
189
198
  end
190
199
 
191
200
  # Returns an instance of the specified class with the attributes
@@ -199,16 +208,18 @@ module Mongoid #:nodoc:
199
208
  # @param [ Class ] klass The class to become.
200
209
  #
201
210
  # @return [ Document ] An instance of the specified class.
211
+ #
212
+ # @since 2.0.0
202
213
  def becomes(klass)
203
214
  unless klass.include?(Mongoid::Document)
204
215
  raise ArgumentError, "A class which includes Mongoid::Document is expected"
205
216
  end
206
- klass.instantiate(frozen? ? attributes.dup : attributes).tap do |became|
207
- became.instance_variable_set(:@errors, errors)
208
- became.instance_variable_set(:@new_record, new_record?)
209
- became.instance_variable_set(:@destroyed, destroyed?)
210
- became._type = klass.to_s
211
- end
217
+ became = klass.instantiate(frozen? ? attributes.dup : attributes)
218
+ became.instance_variable_set(:@errors, errors)
219
+ became.instance_variable_set(:@new_record, new_record?)
220
+ became.instance_variable_set(:@destroyed, destroyed?)
221
+ became._type = klass.to_s
222
+ became
212
223
  end
213
224
 
214
225
  # Print out the cache key. This will append different values on the
@@ -228,7 +239,7 @@ module Mongoid #:nodoc:
228
239
  # @since 2.4.0
229
240
  def cache_key
230
241
  return "#{model_key}/new" if new_record?
231
- return "#{model_key}/#{id}-#{updated_at.utc.to_s(:number)}" unless self[:updated_at].nil?
242
+ return "#{model_key}/#{id}-#{updated_at.utc.to_s(:number)}" if updated_at
232
243
  "#{model_key}/#{id}"
233
244
  end
234
245
 
@@ -267,7 +278,7 @@ module Mongoid #:nodoc:
267
278
  nil
268
279
  end
269
280
 
270
- module ClassMethods #:nodoc:
281
+ module ClassMethods
271
282
 
272
283
  # Performs class equality checking.
273
284
  #
@@ -292,14 +303,16 @@ module Mongoid #:nodoc:
292
303
  # @param [ Hash ] attrs The hash of attributes to instantiate with.
293
304
  #
294
305
  # @return [ Document ] A new document.
306
+ #
307
+ # @since 1.0.0
295
308
  def instantiate(attrs = nil)
296
309
  attributes = attrs || {}
297
- allocate.tap do |doc|
298
- doc.instance_variable_set(:@attributes, attributes)
299
- doc.apply_defaults
300
- IdentityMap.set(doc) unless _loading_revision?
301
- doc.run_callbacks(:initialize) { doc }
302
- end
310
+ doc = allocate
311
+ doc.instance_variable_set(:@attributes, attributes)
312
+ doc.apply_defaults
313
+ IdentityMap.set(doc) unless _loading_revision?
314
+ doc.run_callbacks(:initialize) if doc._initialize_callbacks.any?
315
+ doc
303
316
  end
304
317
 
305
318
  # Returns all types to query for when using this class as the base.
@@ -308,13 +321,17 @@ module Mongoid #:nodoc:
308
321
  # document._types
309
322
  #
310
323
  # @return [ Array<Class> ] All subclasses of the current document.
324
+ #
325
+ # @since 1.0.0
311
326
  def _types
312
- @_type ||= [descendants + [self]].flatten.uniq.map { |t| t.to_s }
327
+ @_type ||= (descendants + [ self ]).uniq.map { |t| t.to_s }
313
328
  end
314
329
 
315
330
  # Set the i18n scope to overwrite ActiveModel.
316
331
  #
317
332
  # @return [ Symbol ] :mongoid
333
+ #
334
+ # @since 2.0.0
318
335
  def i18n_scope
319
336
  :mongoid
320
337
  end
@@ -333,3 +350,5 @@ module Mongoid #:nodoc:
333
350
  end
334
351
  end
335
352
  end
353
+
354
+ ActiveSupport.run_load_hooks(:mongoid, Mongoid::Document)
@@ -1,19 +1,40 @@
1
1
  # encoding: utf-8
2
2
  require "mongoid/errors/mongoid_error"
3
+ require "mongoid/errors/ambiguous_relationship"
3
4
  require "mongoid/errors/callback"
4
5
  require "mongoid/errors/document_not_found"
5
6
  require "mongoid/errors/eager_load"
6
7
  require "mongoid/errors/invalid_collection"
8
+ require "mongoid/errors/invalid_config_option"
7
9
  require "mongoid/errors/invalid_database"
8
10
  require "mongoid/errors/invalid_field"
11
+ require "mongoid/errors/invalid_field_option"
9
12
  require "mongoid/errors/invalid_find"
13
+ require "mongoid/errors/invalid_index"
10
14
  require "mongoid/errors/invalid_options"
15
+ require "mongoid/errors/invalid_scope"
16
+ require "mongoid/errors/invalid_set_polymorphic_relation"
17
+ require "mongoid/errors/invalid_storage_options"
11
18
  require "mongoid/errors/invalid_time"
12
- require "mongoid/errors/invalid_type"
19
+ require "mongoid/errors/inverse_not_found"
13
20
  require "mongoid/errors/mixed_relations"
21
+ require "mongoid/errors/mixed_session_configuration"
22
+ require "mongoid/errors/nested_attributes_metadata_not_found"
23
+ require "mongoid/errors/no_default_session"
14
24
  require "mongoid/errors/no_environment"
25
+ require "mongoid/errors/no_map_reduce_output"
26
+ require "mongoid/errors/no_parent"
27
+ require "mongoid/errors/no_session_config"
28
+ require "mongoid/errors/no_sessions_config"
29
+ require "mongoid/errors/no_session_database"
30
+ require "mongoid/errors/no_session_hosts"
31
+ require "mongoid/errors/readonly_attribute"
15
32
  require "mongoid/errors/scope_overwrite"
16
33
  require "mongoid/errors/too_many_nested_attribute_records"
34
+ require "mongoid/errors/unknown_attribute"
17
35
  require "mongoid/errors/unsaved_document"
36
+ require "mongoid/errors/unsupported_javascript"
18
37
  require "mongoid/errors/unsupported_version"
19
38
  require "mongoid/errors/validations"
39
+ require "mongoid/errors/versioning_not_on_root"
40
+ require "mongoid/errors/delete_restriction"
@@ -0,0 +1,51 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Errors
4
+
5
+ # This error is raised in case of an ambigous relationship.
6
+ #
7
+ # @example An ambigous relationship.
8
+ # class Person
9
+ # include Mongoid::Document
10
+ #
11
+ # has_many :invitations, inverse_of: :person
12
+ # has_many :referred_invitations, class_name: "Invitation", inverse_of: :referred_by
13
+ # end
14
+ #
15
+ # class Invitation
16
+ # include Mongoid::Document
17
+ #
18
+ # belongs_to :person
19
+ # belongs_to :referred_by, class_name: "Person"
20
+ # end
21
+ class AmbiguousRelationship < MongoidError
22
+
23
+ # Create the new error.
24
+ #
25
+ # @example Create the error.
26
+ # AmbiguousRelationship.new(
27
+ # Person, Drug, :person, [ :drugs, # :evil_drugs ]
28
+ # )
29
+ #
30
+ # @param [ Class ] klass The base class.
31
+ # @param [ Class ] inverse The inverse class.
32
+ # @param [ Symbol ] name The relation name.
33
+ # @param [ Array<Symbol> ] candidates The potential inverses.
34
+ #
35
+ # @since 3.0.0
36
+ def initialize(klass, inverse, name, candidates)
37
+ super(
38
+ compose_message(
39
+ "ambiguous_relationship",
40
+ {
41
+ klass: klass,
42
+ inverse: inverse,
43
+ name: name.inspect,
44
+ candidates: candidates.map(&:inspect).join(", ")
45
+ }
46
+ )
47
+ )
48
+ end
49
+ end
50
+ end
51
+ end
@@ -1,13 +1,11 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc
3
- module Errors #:nodoc
2
+ module Mongoid
3
+ module Errors
4
4
 
5
5
  # This error is raised when calling #save! or .create! on a model when one
6
6
  # of the callbacks returns false.
7
7
  class Callback < MongoidError
8
8
 
9
- attr_reader :klass, :method
10
-
11
9
  # Create the new callbacks error.
12
10
  #
13
11
  # @example Create the new callbacks error.
@@ -18,8 +16,9 @@ module Mongoid #:nodoc
18
16
  #
19
17
  # @since 2.2.0
20
18
  def initialize(klass, method)
21
- @klass, @method = klass, method
22
- super(translate("callbacks", { :klass => klass, :method => method }))
19
+ super(
20
+ compose_message("callbacks", { klass: klass, method: method })
21
+ )
23
22
  end
24
23
  end
25
24
  end
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Errors
4
+
5
+ # This error is raised when calling #save! or .create! on a model when one
6
+ # of the callbacks returns false.
7
+ class DeleteRestriction < MongoidError
8
+
9
+ # Create the new callbacks error.
10
+ #
11
+ # @example Create the new callbacks error.
12
+ # Callbacks.new(Post, :create!)
13
+ #
14
+ # @param [ Class ] klass The class of the document.
15
+ # @param [ Symbol ] method The name of the method.
16
+ #
17
+ # @since 3.0.0
18
+ def initialize(document, relation)
19
+ super(
20
+ compose_message(
21
+ "delete_restriction",
22
+ { document: document.class, relation: relation }
23
+ )
24
+ )
25
+ end
26
+ end
27
+ end
28
+ end
29
+
@@ -1,28 +1,109 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc
3
- module Errors #:nodoc
4
-
5
- # Raised when querying the database for a document by a specific id which
6
- # does not exist. If multiple ids were passed then it will display all of
7
- # those.
8
- #
9
- # @example Create the error.
10
- # DocumentNotFound.new(Person, ["1", "2"])
11
- class DocumentNotFound < MongoidError
2
+ module Mongoid
3
+ module Errors
12
4
 
13
- attr_reader :klass, :identifiers
5
+ # Raised when querying the database for a document by a specific id or by
6
+ # set of attributes which does not exist. If multiple ids were passed then
7
+ # it will display all of those.
8
+ class DocumentNotFound < MongoidError
14
9
 
15
- def initialize(klass, ids)
16
- @klass = klass
17
- @identifiers = ids.is_a?(Array) ? ids.join(", ") : ids
10
+ attr_reader :params
18
11
 
12
+ # Create the new error.
13
+ #
14
+ # @example Create the error.
15
+ # DocumentNotFound.new(Person, ["1", "2"])
16
+ #
17
+ # @example Create the error with attributes instead of ids
18
+ # DocumentNotFound.new(Person, :ssn => "1234", :name => "Helen")
19
+ #
20
+ # @param [ Class ] klass The model class.
21
+ # @param [ Hash, Array, Object ] params The attributes or ids.
22
+ # @param [ Array ] unmatched The unmatched ids, if appropriate
23
+ def initialize(klass, params, unmatched = nil)
24
+ if !unmatched && !params.is_a?(Hash)
25
+ raise ArgumentError, 'please also supply the unmatched ids'
26
+ end
19
27
  super(
20
- translate(
21
- "document_not_found",
22
- { :klass => klass.name, :identifiers => identifiers }
28
+ compose_message(
29
+ message_key(params),
30
+ {
31
+ klass: klass.name,
32
+ searched: searched(params),
33
+ attributes: params,
34
+ total: total(params),
35
+ missing: missing(unmatched)
36
+ }
23
37
  )
24
38
  )
25
39
  end
40
+
41
+ private
42
+
43
+ # Get the string to display the document params that were unmatched.
44
+ #
45
+ # @example Get the missing string.
46
+ # error.missing(1)
47
+ #
48
+ # @param [ Object, Array ] unmatched The ids that did not match.
49
+ #
50
+ # @return [ String ] The missing string.
51
+ #
52
+ # @since 3.0.0
53
+ def missing(unmatched)
54
+ if unmatched.is_a?(::Array)
55
+ unmatched.join(", ")
56
+ else
57
+ unmatched
58
+ end
59
+ end
60
+
61
+ # Get the string to display the document params that were searched for.
62
+ #
63
+ # @example Get the searched string.
64
+ # error.searched(1)
65
+ #
66
+ # @param [ Object, Array ] params The ids that were searched for.
67
+ #
68
+ # @return [ String ] The searched string.
69
+ #
70
+ # @since 3.0.0
71
+ def searched(params)
72
+ if params.is_a?(::Array)
73
+ params.take(3).join(", ") + " ..."
74
+ else
75
+ params
76
+ end
77
+ end
78
+
79
+ # Get the total number of expected documents.
80
+ #
81
+ # @example Get the total.
82
+ # error.total([ 1, 2, 3 ])
83
+ #
84
+ # @param [ Object, Array ] params What was searched for.
85
+ #
86
+ # @return [ Integer ] The total number.
87
+ #
88
+ # @since 3.0.0
89
+ def total(params)
90
+ params.is_a?(::Array) ? params.count : 1
91
+ end
92
+
93
+ # Create the problem.
94
+ #
95
+ # @example Create the problem.
96
+ # error.problem
97
+ #
98
+ # @return [ String ] The problem.
99
+ #
100
+ # @since 3.0.0
101
+ def message_key(params)
102
+ case params
103
+ when Hash then "document_with_attributes_not_found"
104
+ else "document_not_found"
105
+ end
106
+ end
26
107
  end
27
108
  end
28
109
  end