mongoid 2.8.1 → 3.0.0.rc

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 (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