mongoid 2.4.9 → 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 +869 -8
  2. data/LICENSE +1 -1
  3. data/README.md +10 -11
  4. data/Rakefile +2 -17
  5. data/lib/config/locales/en.yml +441 -51
  6. data/lib/mongoid/atomic/modifiers.rb +2 -2
  7. data/lib/mongoid/atomic/paths/embedded/many.rb +6 -6
  8. data/lib/mongoid/atomic/paths/embedded/one.rb +5 -5
  9. data/lib/mongoid/atomic/paths/embedded.rb +4 -5
  10. data/lib/mongoid/atomic/paths/root.rb +4 -5
  11. data/lib/mongoid/atomic.rb +16 -6
  12. data/lib/mongoid/attributes/processing.rb +14 -10
  13. data/lib/mongoid/attributes/readonly.rb +56 -0
  14. data/lib/mongoid/attributes.rb +95 -32
  15. data/lib/mongoid/callbacks.rb +100 -42
  16. data/lib/mongoid/collections/retry.rb +2 -3
  17. data/lib/mongoid/components.rb +10 -22
  18. data/lib/mongoid/config/environment.rb +4 -3
  19. data/lib/mongoid/config/inflections.rb +6 -0
  20. data/lib/mongoid/config/options.rb +1 -1
  21. data/lib/mongoid/config/validators/option.rb +25 -0
  22. data/lib/mongoid/config/validators/session.rb +140 -0
  23. data/lib/mongoid/config/validators.rb +3 -0
  24. data/lib/mongoid/config.rb +87 -233
  25. data/lib/mongoid/contextual/aggregable/memory.rb +98 -0
  26. data/lib/mongoid/contextual/aggregable/mongo.rb +181 -0
  27. data/lib/mongoid/contextual/atomic.rb +179 -0
  28. data/lib/mongoid/contextual/command.rb +43 -0
  29. data/lib/mongoid/contextual/find_and_modify.rb +66 -0
  30. data/lib/mongoid/contextual/map_reduce.rb +273 -0
  31. data/lib/mongoid/contextual/memory.rb +383 -0
  32. data/lib/mongoid/contextual/mongo.rb +543 -0
  33. data/lib/mongoid/contextual.rb +50 -0
  34. data/lib/mongoid/copyable.rb +2 -2
  35. data/lib/mongoid/criteria.rb +436 -248
  36. data/lib/mongoid/criterion/inspection.rb +14 -8
  37. data/lib/mongoid/criterion/scoping.rb +114 -44
  38. data/lib/mongoid/dirty.rb +152 -67
  39. data/lib/mongoid/document.rb +68 -49
  40. data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
  41. data/lib/mongoid/errors/callback.rb +5 -6
  42. data/lib/mongoid/errors/delete_restriction.rb +29 -0
  43. data/lib/mongoid/errors/document_not_found.rb +98 -17
  44. data/lib/mongoid/errors/eager_load.rb +3 -6
  45. data/lib/mongoid/errors/invalid_collection.rb +3 -3
  46. data/lib/mongoid/errors/invalid_config_option.rb +27 -0
  47. data/lib/mongoid/errors/invalid_database.rb +3 -3
  48. data/lib/mongoid/errors/invalid_field.rb +54 -8
  49. data/lib/mongoid/errors/invalid_field_option.rb +35 -0
  50. data/lib/mongoid/errors/invalid_find.rb +3 -3
  51. data/lib/mongoid/errors/invalid_index.rb +28 -0
  52. data/lib/mongoid/errors/invalid_options.rb +4 -4
  53. data/lib/mongoid/errors/invalid_scope.rb +24 -0
  54. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
  55. data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
  56. data/lib/mongoid/errors/invalid_time.rb +3 -6
  57. data/lib/mongoid/errors/inverse_not_found.rb +29 -0
  58. data/lib/mongoid/errors/mixed_relations.rb +4 -9
  59. data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
  60. data/lib/mongoid/errors/mongoid_error.rb +54 -3
  61. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
  62. data/lib/mongoid/errors/no_default_session.rb +23 -0
  63. data/lib/mongoid/errors/no_environment.rb +3 -3
  64. data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
  65. data/lib/mongoid/errors/no_parent.rb +24 -0
  66. data/lib/mongoid/errors/no_session_config.rb +22 -0
  67. data/lib/mongoid/errors/no_session_database.rb +27 -0
  68. data/lib/mongoid/errors/no_session_hosts.rb +27 -0
  69. data/lib/mongoid/errors/no_sessions_config.rb +20 -0
  70. data/lib/mongoid/errors/readonly_attribute.rb +25 -0
  71. data/lib/mongoid/errors/scope_overwrite.rb +4 -4
  72. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +4 -4
  73. data/lib/mongoid/errors/unknown_attribute.rb +25 -0
  74. data/lib/mongoid/errors/unsaved_document.rb +4 -8
  75. data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
  76. data/lib/mongoid/errors/unsupported_version.rb +4 -4
  77. data/lib/mongoid/errors/validations.rb +7 -6
  78. data/lib/mongoid/errors/versioning_not_on_root.rb +23 -0
  79. data/lib/mongoid/errors.rb +22 -1
  80. data/lib/mongoid/extensions/array.rb +127 -0
  81. data/lib/mongoid/extensions/big_decimal.rb +42 -0
  82. data/lib/mongoid/extensions/boolean.rb +24 -0
  83. data/lib/mongoid/extensions/date.rb +70 -0
  84. data/lib/mongoid/extensions/date_time.rb +68 -0
  85. data/lib/mongoid/extensions/false_class.rb +26 -0
  86. data/lib/mongoid/extensions/float.rb +44 -0
  87. data/lib/mongoid/extensions/hash.rb +91 -0
  88. data/lib/mongoid/extensions/integer.rb +54 -0
  89. data/lib/mongoid/extensions/module.rb +28 -0
  90. data/lib/mongoid/extensions/nil_class.rb +21 -0
  91. data/lib/mongoid/extensions/object.rb +188 -0
  92. data/lib/mongoid/extensions/object_id.rb +53 -0
  93. data/lib/mongoid/extensions/range.rb +55 -0
  94. data/lib/mongoid/extensions/regexp.rb +27 -0
  95. data/lib/mongoid/extensions/set.rb +55 -0
  96. data/lib/mongoid/extensions/string.rb +155 -0
  97. data/lib/mongoid/extensions/symbol.rb +54 -0
  98. data/lib/mongoid/extensions/time.rb +78 -0
  99. data/lib/mongoid/extensions/time_with_zone.rb +55 -0
  100. data/lib/mongoid/extensions/true_class.rb +26 -0
  101. data/lib/mongoid/extensions.rb +28 -76
  102. data/lib/mongoid/factory.rb +4 -4
  103. data/lib/mongoid/fields/foreign_key.rb +134 -0
  104. data/lib/mongoid/fields/localized.rb +73 -0
  105. data/lib/mongoid/fields/standard.rb +268 -0
  106. data/lib/mongoid/fields/validators/macro.rb +83 -0
  107. data/lib/mongoid/fields/validators.rb +2 -0
  108. data/lib/mongoid/fields.rb +129 -194
  109. data/lib/mongoid/finders.rb +42 -43
  110. data/lib/mongoid/hierarchy.rb +25 -14
  111. data/lib/mongoid/identity_map.rb +39 -12
  112. data/lib/mongoid/indexes/validators/options.rb +80 -0
  113. data/lib/mongoid/indexes.rb +66 -15
  114. data/lib/mongoid/inspection.rb +1 -1
  115. data/lib/mongoid/javascript.rb +1 -1
  116. data/lib/mongoid/json.rb +2 -2
  117. data/lib/mongoid/loggable.rb +69 -0
  118. data/lib/mongoid/matchers/all.rb +7 -8
  119. data/lib/mongoid/matchers/and.rb +3 -3
  120. data/lib/mongoid/matchers/default.rb +6 -4
  121. data/lib/mongoid/matchers/exists.rb +2 -2
  122. data/lib/mongoid/matchers/gt.rb +2 -2
  123. data/lib/mongoid/matchers/gte.rb +2 -2
  124. data/lib/mongoid/matchers/in.rb +3 -7
  125. data/lib/mongoid/matchers/lt.rb +2 -2
  126. data/lib/mongoid/matchers/lte.rb +2 -2
  127. data/lib/mongoid/matchers/ne.rb +2 -2
  128. data/lib/mongoid/matchers/nin.rb +2 -2
  129. data/lib/mongoid/matchers/or.rb +2 -2
  130. data/lib/mongoid/matchers/size.rb +2 -2
  131. data/lib/mongoid/matchers/strategies.rb +3 -3
  132. data/lib/mongoid/matchers.rb +1 -1
  133. data/lib/mongoid/multi_parameter_attributes.rb +8 -10
  134. data/lib/mongoid/nested_attributes.rb +17 -9
  135. data/lib/mongoid/observer.rb +1 -2
  136. data/lib/mongoid/paranoia.rb +13 -18
  137. data/lib/mongoid/persistence/atomic/add_to_set.rb +5 -9
  138. data/lib/mongoid/persistence/atomic/bit.rb +5 -7
  139. data/lib/mongoid/persistence/atomic/inc.rb +5 -7
  140. data/lib/mongoid/persistence/atomic/operation.rb +45 -6
  141. data/lib/mongoid/persistence/atomic/pop.rb +5 -7
  142. data/lib/mongoid/persistence/atomic/pull.rb +5 -7
  143. data/lib/mongoid/persistence/atomic/pull_all.rb +5 -7
  144. data/lib/mongoid/persistence/atomic/push.rb +4 -10
  145. data/lib/mongoid/persistence/atomic/push_all.rb +4 -10
  146. data/lib/mongoid/persistence/atomic/rename.rb +6 -7
  147. data/lib/mongoid/persistence/atomic/sets.rb +5 -7
  148. data/lib/mongoid/persistence/atomic/unset.rb +4 -5
  149. data/lib/mongoid/persistence/atomic.rb +2 -2
  150. data/lib/mongoid/persistence/deletion.rb +2 -2
  151. data/lib/mongoid/persistence/insertion.rb +10 -16
  152. data/lib/mongoid/persistence/modification.rb +5 -9
  153. data/lib/mongoid/persistence/operations/embedded/insert.rb +7 -6
  154. data/lib/mongoid/persistence/operations/embedded/remove.rb +5 -5
  155. data/lib/mongoid/persistence/operations/insert.rb +4 -4
  156. data/lib/mongoid/persistence/operations/remove.rb +4 -4
  157. data/lib/mongoid/persistence/operations/update.rb +5 -5
  158. data/lib/mongoid/persistence/operations.rb +6 -19
  159. data/lib/mongoid/persistence.rb +64 -27
  160. data/lib/mongoid/railtie.rb +26 -11
  161. data/lib/mongoid/railties/database.rake +22 -108
  162. data/lib/mongoid/relations/accessors.rb +119 -19
  163. data/lib/mongoid/relations/auto_save.rb +59 -5
  164. data/lib/mongoid/relations/binding.rb +211 -2
  165. data/lib/mongoid/relations/bindings/embedded/in.rb +16 -22
  166. data/lib/mongoid/relations/bindings/embedded/many.rb +9 -50
  167. data/lib/mongoid/relations/bindings/embedded/one.rb +10 -16
  168. data/lib/mongoid/relations/bindings/referenced/in.rb +31 -57
  169. data/lib/mongoid/relations/bindings/referenced/many.rb +8 -20
  170. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -19
  171. data/lib/mongoid/relations/bindings/referenced/one.rb +10 -24
  172. data/lib/mongoid/relations/builder.rb +3 -3
  173. data/lib/mongoid/relations/builders/embedded/in.rb +5 -5
  174. data/lib/mongoid/relations/builders/embedded/many.rb +12 -12
  175. data/lib/mongoid/relations/builders/embedded/one.rb +6 -6
  176. data/lib/mongoid/relations/builders/nested_attributes/many.rb +8 -8
  177. data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -4
  178. data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
  179. data/lib/mongoid/relations/builders/referenced/many.rb +5 -5
  180. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +7 -5
  181. data/lib/mongoid/relations/builders/referenced/one.rb +5 -5
  182. data/lib/mongoid/relations/builders.rb +19 -16
  183. data/lib/mongoid/relations/cascading/delete.rb +12 -4
  184. data/lib/mongoid/relations/cascading/destroy.rb +3 -3
  185. data/lib/mongoid/relations/cascading/nullify.rb +3 -3
  186. data/lib/mongoid/relations/cascading/restrict.rb +37 -0
  187. data/lib/mongoid/relations/cascading.rb +6 -4
  188. data/lib/mongoid/relations/constraint.rb +4 -3
  189. data/lib/mongoid/relations/conversions.rb +5 -6
  190. data/lib/mongoid/relations/cyclic.rb +7 -7
  191. data/lib/mongoid/relations/embedded/batchable.rb +346 -0
  192. data/lib/mongoid/relations/embedded/in.rb +23 -12
  193. data/lib/mongoid/relations/embedded/many.rb +99 -148
  194. data/lib/mongoid/relations/embedded/one.rb +25 -14
  195. data/lib/mongoid/relations/macros.rb +105 -60
  196. data/lib/mongoid/relations/many.rb +93 -14
  197. data/lib/mongoid/relations/metadata.rb +231 -45
  198. data/lib/mongoid/relations/nested_builder.rb +3 -5
  199. data/lib/mongoid/relations/one.rb +14 -2
  200. data/lib/mongoid/relations/options.rb +2 -2
  201. data/lib/mongoid/relations/polymorphic.rb +9 -9
  202. data/lib/mongoid/relations/proxy.rb +60 -31
  203. data/lib/mongoid/relations/referenced/in.rb +40 -15
  204. data/lib/mongoid/relations/referenced/many.rb +116 -122
  205. data/lib/mongoid/relations/referenced/many_to_many.rb +101 -46
  206. data/lib/mongoid/relations/referenced/one.rb +34 -13
  207. data/lib/mongoid/relations/reflections.rb +3 -3
  208. data/lib/mongoid/relations/synchronization.rb +19 -23
  209. data/lib/mongoid/relations/targets/enumerable.rb +86 -57
  210. data/lib/mongoid/relations/touchable.rb +32 -0
  211. data/lib/mongoid/relations.rb +6 -6
  212. data/lib/mongoid/reloading.rb +12 -14
  213. data/lib/mongoid/scoping.rb +329 -0
  214. data/lib/mongoid/serialization.rb +13 -30
  215. data/lib/mongoid/sessions/factory.rb +106 -0
  216. data/lib/mongoid/sessions/mongo_uri.rb +93 -0
  217. data/lib/mongoid/sessions/validators/storage.rb +49 -0
  218. data/lib/mongoid/sessions/validators.rb +2 -0
  219. data/lib/mongoid/sessions.rb +359 -0
  220. data/lib/mongoid/sharding.rb +6 -6
  221. data/lib/mongoid/state.rb +6 -7
  222. data/lib/mongoid/threaded/lifecycle.rb +21 -21
  223. data/lib/mongoid/threaded/sessions.rb +0 -0
  224. data/lib/mongoid/threaded.rb +167 -59
  225. data/lib/mongoid/timestamps/created.rb +8 -4
  226. data/lib/mongoid/timestamps/timeless.rb +6 -4
  227. data/lib/mongoid/timestamps/updated.rb +3 -3
  228. data/lib/mongoid/timestamps.rb +1 -1
  229. data/lib/mongoid/unit_of_work.rb +61 -0
  230. data/lib/mongoid/validations/associated.rb +2 -2
  231. data/lib/mongoid/validations/format.rb +2 -2
  232. data/lib/mongoid/validations/presence.rb +34 -4
  233. data/lib/mongoid/validations/uniqueness.rb +103 -25
  234. data/lib/mongoid/validations.rb +62 -20
  235. data/lib/mongoid/version.rb +2 -2
  236. data/lib/mongoid/versioning.rb +25 -26
  237. data/lib/mongoid.rb +24 -39
  238. data/lib/rack/mongoid/middleware/identity_map.rb +3 -3
  239. data/lib/rails/generators/mongoid/config/config_generator.rb +1 -1
  240. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +59 -19
  241. data/lib/rails/generators/mongoid/model/model_generator.rb +7 -7
  242. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +2 -2
  243. data/lib/rails/generators/mongoid/observer/observer_generator.rb +4 -4
  244. data/lib/rails/generators/mongoid_generator.rb +5 -5
  245. data/lib/rails/mongoid.rb +69 -25
  246. metadata +93 -155
  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/master.rb +0 -45
  269. data/lib/mongoid/collections/operations.rb +0 -44
  270. data/lib/mongoid/collections.rb +0 -120
  271. data/lib/mongoid/config/database.rb +0 -181
  272. data/lib/mongoid/config/replset_database.rb +0 -80
  273. data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
  274. data/lib/mongoid/contexts/enumerable.rb +0 -313
  275. data/lib/mongoid/contexts/mongo.rb +0 -485
  276. data/lib/mongoid/contexts.rb +0 -25
  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 -108
  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 -76
  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 -31
  341. data/lib/mongoid/named_scope.rb +0 -166
  342. data/lib/mongoid/relations/embedded/atomic/operation.rb +0 -63
  343. data/lib/mongoid/relations/embedded/atomic/pull.rb +0 -65
  344. data/lib/mongoid/relations/embedded/atomic/push_all.rb +0 -59
  345. data/lib/mongoid/relations/embedded/atomic/set.rb +0 -61
  346. data/lib/mongoid/relations/embedded/atomic/unset.rb +0 -41
  347. data/lib/mongoid/relations/embedded/atomic.rb +0 -89
  348. data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
  349. data/lib/mongoid/relations/referenced/batch.rb +0 -73
  350. data/lib/mongoid/safety.rb +0 -105
  351. data/lib/mongoid/scope.rb +0 -31
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Validations #:nodoc:
2
+ module Mongoid
3
+ module Validations
4
4
 
5
5
  # Validates whether or not a field is unique against the documents in the
6
6
  # database.
@@ -44,32 +44,36 @@ module Mongoid #:nodoc:
44
44
  attrib, val = to_validate(document, attribute, value)
45
45
  return unless validation_required?(document, attrib)
46
46
  if document.embedded?
47
- return if skip_validation?(document)
48
- relation = document._parent.send(document.metadata.name)
49
- criteria = relation.where(criterion(document, attrib, val))
50
- criteria = scope(criteria, document, attrib)
51
- if criteria.count > 1
52
- document.errors.add(
53
- attrib,
54
- :taken,
55
- options.except(:case_sensitive, :scope).merge(:val => val)
56
- )
57
- end
47
+ validate_embedded(document, attrib, val)
58
48
  else
59
- criteria = klass.unscoped.where(criterion(document, attrib, val))
60
- criteria = scope(criteria, document, attrib)
61
- if criteria.exists?
62
- document.errors.add(
63
- attrib, :taken, options.except(:case_sensitive, :scope).merge(:val => val)
64
- )
65
- end
49
+ validate_root(document, attrib, val)
66
50
  end
67
51
  end
68
52
 
69
- protected
53
+ private
54
+
55
+ # Add the error to the document.
56
+ #
57
+ # @api private
58
+ #
59
+ # @example Add the error.
60
+ # validator.add_error(doc, :name, "test")
61
+ #
62
+ # @param [ Document ] document The document to validate.
63
+ # @param [ Symbol ] attribute The name of the attribute.
64
+ # @param [ Object ] value The value of the object.
65
+ #
66
+ # @since 2.4.10
67
+ def add_error(document, attribute, value)
68
+ document.errors.add(
69
+ attribute, :taken, options.except(:case_sensitive, :scope).merge(value: value)
70
+ )
71
+ end
70
72
 
71
73
  # Should the uniqueness validation be case sensitive?
72
74
  #
75
+ # @api private
76
+ #
73
77
  # @example Is the validation case sensitive?
74
78
  # validator.case_sensitive?
75
79
  #
@@ -80,8 +84,36 @@ module Mongoid #:nodoc:
80
84
  !(options[:case_sensitive] == false)
81
85
  end
82
86
 
87
+ # Create the validation criteria.
88
+ #
89
+ # @api private
90
+ #
91
+ # @example Create the criteria.
92
+ # validator.create_criteria(User, user, :name, "syd")
93
+ #
94
+ # @param [ Class, Proxy ] base The base to execute the criteria from.
95
+ # @param [ Document ] document The document to validate.
96
+ # @param [ Symbol ] attribute The name of the attribute.
97
+ # @param [ Object ] value The value of the object.
98
+ #
99
+ # @return [ Criteria ] The criteria.
100
+ #
101
+ # @since 2.4.10
102
+ def create_criteria(base, document, attribute, value)
103
+ field = document.fields[attribute.to_s]
104
+ criteria = base.unscoped
105
+ if field.try(:localized?)
106
+ criteria.selector.update(criterion(document, attribute, value))
107
+ else
108
+ criteria = criteria.where(criterion(document, attribute, value))
109
+ end
110
+ scope(criteria, document, attribute)
111
+ end
112
+
83
113
  # Get the default criteria for checking uniqueness.
84
114
  #
115
+ # @api private
116
+ #
85
117
  # @example Get the criteria.
86
118
  # validator.criterion(person, :title, "Sir")
87
119
  #
@@ -93,15 +125,17 @@ module Mongoid #:nodoc:
93
125
  #
94
126
  # @since 2.3.0
95
127
  def criterion(document, attribute, value)
96
- { attribute => filter(value) }.tap do |selector|
97
- if document.persisted? && !document.embedded?
98
- selector.merge!(:_id => { "$ne" => document.id })
99
- end
128
+ selector = { attribute => filter(value) }
129
+ if document.persisted? && !document.embedded?
130
+ selector.merge!(_id: { "$ne" => document.id })
100
131
  end
132
+ selector
101
133
  end
102
134
 
103
135
  # Filter the value based on whether the check is case sensitive or not.
104
136
  #
137
+ # @api private
138
+ #
105
139
  # @example Filter the value.
106
140
  # validator.filter("testing")
107
141
  #
@@ -116,6 +150,8 @@ module Mongoid #:nodoc:
116
150
 
117
151
  # Scope the criteria to the scope options provided.
118
152
  #
153
+ # @api private
154
+ #
119
155
  # @example Scope the criteria.
120
156
  # validator.scope(criteria, document)
121
157
  #
@@ -134,6 +170,8 @@ module Mongoid #:nodoc:
134
170
 
135
171
  # Should validation be skipped?
136
172
  #
173
+ # @api private
174
+ #
137
175
  # @example Should the validation be skipped?
138
176
  # validator.skip_validation?(doc)
139
177
  #
@@ -148,6 +186,8 @@ module Mongoid #:nodoc:
148
186
 
149
187
  # Scope reference has changed?
150
188
  #
189
+ # @api private
190
+ #
151
191
  # @example Has scope reference changed?
152
192
  # validator.scope_value_changed?(doc)
153
193
  #
@@ -167,6 +207,8 @@ module Mongoid #:nodoc:
167
207
  # we need to send the key name and value to the db, not the relation
168
208
  # object.
169
209
  #
210
+ # @api private
211
+ #
170
212
  # @example Get the name and key to validate.
171
213
  # validator.to_validate(doc, :parent, Parent.new)
172
214
  #
@@ -186,6 +228,42 @@ module Mongoid #:nodoc:
186
228
  end
187
229
  end
188
230
 
231
+ # Validate an embedded document.
232
+ #
233
+ # @api private
234
+ #
235
+ # @example Validate the embedded document.
236
+ # validator.validate_embedded(doc, :name, "test")
237
+ #
238
+ # @param [ Document ] document The document.
239
+ # @param [ Symbol ] attribute The attribute name.
240
+ # @param [ Object ] value The value.
241
+ #
242
+ # @since 2.4.10
243
+ def validate_embedded(document, attribute, value)
244
+ return if skip_validation?(document)
245
+ relation = document._parent.send(document.metadata.name)
246
+ criteria = create_criteria(relation, document, attribute, value)
247
+ add_error(document, attribute, value) if criteria.count > 1
248
+ end
249
+
250
+ # Validate a root document.
251
+ #
252
+ # @api private
253
+ #
254
+ # @example Validate the root document.
255
+ # validator.validate_root(doc, :name, "test")
256
+ #
257
+ # @param [ Document ] document The document.
258
+ # @param [ Symbol ] attribute The attribute name.
259
+ # @param [ Object ] value The value.
260
+ #
261
+ # @since 2.4.10
262
+ def validate_root(document, attribute, value)
263
+ criteria = create_criteria(klass, document, attribute, value)
264
+ add_error(document, attribute, value) if criteria.exists?
265
+ end
266
+
189
267
  # Are we required to validate the document?
190
268
  #
191
269
  # @example Is validation needed?
@@ -6,7 +6,7 @@ require "mongoid/validations/length"
6
6
  require "mongoid/validations/presence"
7
7
  require "mongoid/validations/uniqueness"
8
8
 
9
- module Mongoid #:nodoc:
9
+ module Mongoid
10
10
 
11
11
  # This module provides additional validations that ActiveModel does not
12
12
  # provide: validates_associated and validates_uniqueness_of.
@@ -48,12 +48,12 @@ module Mongoid #:nodoc:
48
48
  # @since 2.0.0.rc.1
49
49
  def read_attribute_for_validation(attr)
50
50
  attribute = attr.to_s
51
- if relations[attribute]
51
+ if relations.has_key?(attribute)
52
52
  begin_validate
53
53
  relation = send(attr)
54
54
  exit_validate
55
55
  relation.do_or_do_not(:in_memory) || relation
56
- elsif fields[attribute] && fields[attribute].localized?
56
+ elsif fields[attribute].try(:localized?)
57
57
  attributes[attribute]
58
58
  else
59
59
  send(attr)
@@ -74,7 +74,7 @@ module Mongoid #:nodoc:
74
74
  #
75
75
  # @since 2.0.0.rc.6
76
76
  def valid?(context = nil)
77
- super context ? context : (new? ? :create : :update)
77
+ super context ? context : (new_record? ? :create : :update)
78
78
  end
79
79
 
80
80
  # Used to prevent infinite loops in associated validations.
@@ -89,22 +89,7 @@ module Mongoid #:nodoc:
89
89
  Threaded.validated?(self)
90
90
  end
91
91
 
92
- module ClassMethods #:nodoc:
93
-
94
- # Validates whether or not a field matches a certain regular expression.
95
- #
96
- # @example
97
- # class Person
98
- # include Mongoid::Document
99
- # field :website
100
- #
101
- # validates_format_of :website, :with => URI.regexp
102
- # end
103
- #
104
- # @param [ Array ] *args The arguments to pass to the validator.
105
- def validates_format_of(*args)
106
- validates_with(FormatValidator, _merge_attributes(args))
107
- end
92
+ module ClassMethods
108
93
 
109
94
  # Validates whether or not an association is valid or not. Will correctly
110
95
  # handle has one and has many associations.
@@ -141,6 +126,40 @@ module Mongoid #:nodoc:
141
126
  validates_with(UniquenessValidator, _merge_attributes(args))
142
127
  end
143
128
 
129
+ # Validates the format of a field.
130
+ #
131
+ # @example
132
+ # class Person
133
+ # include Mongoid::Document
134
+ # field :title
135
+ #
136
+ # validates_format_of :title, with: /^[a-z0-9 \-_]*$/i
137
+ # end
138
+ #
139
+ # @param [ Array ] args The names of the fields to validate.
140
+ #
141
+ # @since 2.4.0
142
+ def validates_format_of(*args)
143
+ validates_with(Mongoid::Validations::FormatValidator, _merge_attributes(args))
144
+ end
145
+
146
+ # Validates the length of a field.
147
+ #
148
+ # @example
149
+ # class Person
150
+ # include Mongoid::Document
151
+ # field :title
152
+ #
153
+ # validates_length_of :title, minimum: 100
154
+ # end
155
+ #
156
+ # @param [ Array ] args The names of the fields to validate.
157
+ #
158
+ # @since 2.4.0
159
+ def validates_length_of(*args)
160
+ validates_with(Mongoid::Validations::LengthValidator, _merge_attributes(args))
161
+ end
162
+
144
163
  # Validates whether or not a field is present - meaning nil or empty.
145
164
  #
146
165
  # @example
@@ -158,6 +177,29 @@ module Mongoid #:nodoc:
158
177
  validates_with(PresenceValidator, _merge_attributes(args))
159
178
  end
160
179
 
180
+ # Add validation with the supplied validators forthe provided fields
181
+ # with options.
182
+ #
183
+ # @example Validate with a specific validator.
184
+ # validates_with MyValidator, on: :create
185
+ #
186
+ # @param [ Class<Array>, Hash ] *args The validator classes and options.
187
+ #
188
+ # @note See ActiveModel::Validations::With for full options. This is
189
+ # overridden to add autosave functionality when presence validation is
190
+ # added.
191
+ #
192
+ # @since 3.0.0
193
+ def validates_with(*args, &block)
194
+ if args.first == PresenceValidator
195
+ args.last[:attributes].each do |name|
196
+ metadata = relations[name.to_s]
197
+ autosave(metadata.merge!(autosave: true)) if metadata
198
+ end
199
+ end
200
+ super
201
+ end
202
+
161
203
  protected
162
204
 
163
205
  # Adds an associated validator for the relation if the validate option
@@ -1,4 +1,4 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc
3
- VERSION = "2.4.9"
2
+ module Mongoid
3
+ VERSION = "3.0.0.rc"
4
4
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
2
+ module Mongoid
3
3
 
4
4
  # Include this module to get automatic versioning of root level documents.
5
5
  # This will add a version field to the +Document+ and a has_many association
@@ -8,17 +8,17 @@ module Mongoid #:nodoc:
8
8
  extend ActiveSupport::Concern
9
9
 
10
10
  included do
11
- field :version, :type => Integer, :default => 1
11
+ field :version, type: Integer, default: 1
12
12
 
13
13
  embeds_many \
14
14
  :versions,
15
- :class_name => self.name,
16
- :validate => false,
17
- :cyclic => true,
18
- :inverse_of => nil,
19
- :versioned => true
15
+ class_name: self.name,
16
+ validate: false,
17
+ cyclic: true,
18
+ inverse_of: nil,
19
+ versioned: true
20
20
 
21
- set_callback :save, :before, :revise, :if => :revisable?
21
+ set_callback :save, :before, :revise, if: :revisable?
22
22
 
23
23
  class_attribute :version_max
24
24
  self.cyclic = true
@@ -36,17 +36,16 @@ module Mongoid #:nodoc:
36
36
  def revise
37
37
  previous = previous_revision
38
38
  if previous && versioned_attributes_changed?
39
- versions.build(
40
- previous.versioned_attributes, :without_protection => true
41
- ).attributes.delete("_id")
39
+ new_version = versions.build(
40
+ previous.versioned_attributes, without_protection: true
41
+ )
42
+ new_version._id = nil
42
43
  if version_max.present? && versions.length > version_max
43
44
  deleted = versions.first
44
45
  if deleted.paranoid?
45
46
  versions.delete_one(deleted)
46
- collection.update(
47
- atomic_selector,
48
- { "$pull" => { "versions" => { "version" => deleted.version }}}
49
- )
47
+ collection.find(atomic_selector).
48
+ update({ "$pull" => { "versions" => { "version" => deleted.version }}})
50
49
  else
51
50
  versions.delete(deleted)
52
51
  end
@@ -63,8 +62,8 @@ module Mongoid #:nodoc:
63
62
  #
64
63
  # @since 2.2.1
65
64
  def revise!
66
- new_version = versions.build(
67
- (previous_revision || self).versioned_attributes, :without_protection => true
65
+ versions.build(
66
+ (previous_revision || self).versioned_attributes, without_protection: true
68
67
  )
69
68
  versions.shift if version_max.present? && versions.length > version_max
70
69
  self.version = (version || 1 ) + 1
@@ -132,8 +131,8 @@ module Mongoid #:nodoc:
132
131
  def previous_revision
133
132
  _loading_revision do
134
133
  self.class.unscoped.
135
- where(:_id => id).
136
- any_of({ :version => version }, { :version => nil }).first
134
+ where(_id: id).
135
+ any_of({ version: version }, { version: nil }).first
137
136
  end
138
137
  end
139
138
 
@@ -160,7 +159,7 @@ module Mongoid #:nodoc:
160
159
  #
161
160
  # @since 2.0.0
162
161
  def versionless?
163
- !!@versionless
162
+ @versionless ||= false
164
163
  end
165
164
 
166
165
  # Filters fields that should not be versioned out of an attributes hash.
@@ -172,15 +171,15 @@ module Mongoid #:nodoc:
172
171
  #
173
172
  # @since 2.1.0
174
173
  def only_versioned_attributes(hash)
175
- {}.tap do |versioned|
176
- hash.except("versions").each_pair do |name, value|
177
- field = fields[name]
178
- versioned[name] = value if !field || field.versioned?
179
- end
174
+ versioned = {}
175
+ hash.except("versions").each_pair do |name, value|
176
+ field = fields[name]
177
+ versioned[name] = value if !field || field.versioned?
180
178
  end
179
+ versioned
181
180
  end
182
181
 
183
- module ClassMethods #:nodoc:
182
+ module ClassMethods
184
183
 
185
184
  # Sets the maximum number of versions to store.
186
185
  #
data/lib/mongoid.rb CHANGED
@@ -22,13 +22,18 @@
22
22
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
23
  require "delegate"
24
24
  require "time"
25
+ require "set"
26
+
25
27
  require "active_support/core_ext"
26
28
  require 'active_support/json'
27
29
  require "active_support/inflector"
28
- require "active_support/lazy_load_hooks"
29
30
  require "active_support/time_with_zone"
30
31
  require "active_model"
31
- require "mongo"
32
+
33
+ require "origin"
34
+ require "moped"
35
+ BSON = Moped::BSON
36
+
32
37
  require "mongoid/extensions"
33
38
  require "mongoid/errors"
34
39
  require "mongoid/threaded"
@@ -36,42 +41,34 @@ require "mongoid/relations"
36
41
  require "mongoid/atomic"
37
42
  require "mongoid/attributes"
38
43
  require "mongoid/callbacks"
39
- require "mongoid/collection"
40
- require "mongoid/collections"
41
44
  require "mongoid/config"
42
- require "mongoid/contexts"
45
+ require "mongoid/contextual"
43
46
  require "mongoid/copyable"
44
47
  require "mongoid/criteria"
45
- require "mongoid/cursor"
46
- require "mongoid/default_scope"
47
48
  require "mongoid/dirty"
48
- require "mongoid/extras"
49
49
  require "mongoid/factory"
50
50
  require "mongoid/fields"
51
51
  require "mongoid/finders"
52
52
  require "mongoid/hierarchy"
53
- require "mongoid/identity"
54
53
  require "mongoid/identity_map"
55
54
  require "mongoid/indexes"
56
55
  require "mongoid/inspection"
57
56
  require "mongoid/javascript"
58
57
  require "mongoid/json"
59
- require "mongoid/keys"
60
- require "mongoid/logger"
58
+ require "mongoid/loggable"
61
59
  require "mongoid/matchers"
62
60
  require "mongoid/multi_parameter_attributes"
63
- require "mongoid/multi_database"
64
- require "mongoid/named_scope"
65
61
  require "mongoid/nested_attributes"
66
62
  require "mongoid/observer"
67
63
  require "mongoid/persistence"
68
64
  require "mongoid/reloading"
69
- require "mongoid/safety"
70
- require "mongoid/scope"
65
+ require "mongoid/scoping"
71
66
  require "mongoid/serialization"
67
+ require "mongoid/sessions"
72
68
  require "mongoid/sharding"
73
69
  require "mongoid/state"
74
70
  require "mongoid/timestamps"
71
+ require "mongoid/unit_of_work"
75
72
  require "mongoid/validations"
76
73
  require "mongoid/version"
77
74
  require "mongoid/versioning"
@@ -94,7 +91,9 @@ end
94
91
  # add english load path by default
95
92
  I18n.load_path << File.join(File.dirname(__FILE__), "config", "locales", "en.yml")
96
93
 
97
- module Mongoid #:nodoc
94
+ module Mongoid
95
+ extend Loggable
96
+ extend UnitOfWork
98
97
  extend self
99
98
 
100
99
  MONGODB_VERSION = "2.0.0"
@@ -103,10 +102,8 @@ module Mongoid #:nodoc
103
102
  #
104
103
  # @example Set up configuration options.
105
104
  # Mongoid.configure do |config|
106
- # name = "mongoid_test"
107
- # host = "localhost"
108
105
  # config.allow_dynamic_fields = false
109
- # config.master = Mongo::Connection.new.db(name)
106
+ # config.use(name: "mongoid_test", host: "localhost", port: 27017)
110
107
  # end
111
108
  #
112
109
  # @return [ Config ] The configuration obejct.
@@ -115,25 +112,13 @@ module Mongoid #:nodoc
115
112
  def configure
116
113
  block_given? ? yield(Config) : Config
117
114
  end
118
- alias :config :configure
119
115
 
120
- # We can process a unit of work in Mongoid and have the identity map
121
- # automatically clear itself out after the work is complete.
122
- #
123
- # @example Process a unit of work.
124
- # Mongoid.unit_of_work do
125
- # Person.create(:title => "Sir")
126
- # end
127
- #
128
- # @return [ Object ] The result of the block.
129
- #
130
- # @since 2.1.0
131
- def unit_of_work
132
- begin
133
- yield if block_given?
134
- ensure
135
- IdentityMap.clear
136
- end
116
+ def default_session
117
+ Sessions.default
118
+ end
119
+
120
+ def session(name)
121
+ Sessions.with_name(name)
137
122
  end
138
123
 
139
124
  # Take all the public instance methods from the Config singleton and allow
@@ -143,7 +128,7 @@ module Mongoid #:nodoc
143
128
  # Mongoid.database = Mongo::Connection.new.db("test")
144
129
  #
145
130
  # @since 1.0.0
146
- delegate *(Config.public_instance_methods(false) +
131
+ delegate(*(Config.public_instance_methods(false) +
147
132
  ActiveModel::Observing::ClassMethods.public_instance_methods(false) <<
148
- { :to => Config })
133
+ { to: Config }))
149
134
  end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
- module Rack #:nodoc:
3
- module Mongoid #:nodoc:
4
- module Middleware #:nodoc:
2
+ module Rack
3
+ module Mongoid
4
+ module Middleware
5
5
 
6
6
  # This middleware contains the behaviour needed to properly use the
7
7
  # identity map in Rack based applications.
@@ -6,7 +6,7 @@ module Mongoid
6
6
  class ConfigGenerator < Rails::Generators::Base
7
7
  desc "Creates a Mongoid configuration file at config/mongoid.yml"
8
8
 
9
- argument :database_name, :type => :string, :optional => true
9
+ argument :database_name, type: :string, optional: true
10
10
 
11
11
  def self.source_root
12
12
  @_mongoid_source_root ||= File.expand_path("../templates", __FILE__)
@@ -1,20 +1,60 @@
1
1
  development:
2
- host: localhost
3
- database: <%= database_name || app_name %>_development
4
-
5
- test:
6
- host: localhost
7
- database: <%= database_name || app_name %>_test
8
-
9
- # set these environment variables on your prod server
10
- production:
11
- host: <%%= ENV['MONGOID_HOST'] %>
12
- port: <%%= ENV['MONGOID_PORT'] %>
13
- username: <%%= ENV['MONGOID_USERNAME'] %>
14
- password: <%%= ENV['MONGOID_PASSWORD'] %>
15
- database: <%%= ENV['MONGOID_DATABASE'] %>
16
- # slaves:
17
- # - host: slave1.local
18
- # port: 27018
19
- # - host: slave2.local
20
- # port: 27019
2
+ # Configure available database sessions. (required)
3
+ sessions:
4
+ # Defines the default session. (required)
5
+ default:
6
+ # Defines the name of the default database that Mongoid can connect to.
7
+ # (required).
8
+ database: <%= database_name || app_name %>_development
9
+ # Provides the hosts the default session can connect to. Must be an array
10
+ # of host:port pairs. (required)
11
+ hosts:
12
+ - localhost:27017
13
+ options:
14
+ # Change whether the session persists in safe mode by default.
15
+ # (default: false)
16
+ # safe: false
17
+
18
+ # Change the default consistency model to :eventual or :strong.
19
+ # :eventual will send reads to secondaries, :strong sends everything
20
+ # to master. (default: :eventual)
21
+ consistency: :strong
22
+ # Configure Mongoid specific options. (optional)
23
+ options:
24
+ # Configuration for whether or not to allow access to fields that do
25
+ # not have a field definition on the model. (default: true)
26
+ # allow_dynamic_fields: true
27
+
28
+ # Enable the identity map, needed for eager loading. (default: false)
29
+ # identity_map_enabled: false
30
+
31
+ # Includes the root model name in json serialization. (default: false)
32
+ # include_root_in_json: false
33
+
34
+ # Include the _type field in serializaion. (default: false)
35
+ # include_type_for_serialization: false
36
+
37
+ # Preload all models in development, needed when models use
38
+ # inheritance. (default: false)
39
+ # preload_models: false
40
+
41
+ # Protect id and type from mass assignment. (default: true)
42
+ # protect_sensitive_fields: true
43
+
44
+ # Raise an error when performing a #find and the document is not found.
45
+ # (default: true)
46
+ # raise_not_found_error: true
47
+
48
+ # Raise an error when defining a scope with the same name as an
49
+ # existing method. (default: false)
50
+ # scope_overwrite_exception: false
51
+
52
+ # Skip the database version check, used when connecting to a db without
53
+ # admin access. (default: false)
54
+ # skip_version_check: false
55
+
56
+ # User Active Support's time zone in conversions. (default: true)
57
+ # use_activesupport_time_zone: true
58
+
59
+ # Ensure all times are UTC in the app side. (default: false)
60
+ # use_utc: false