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,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Threaded #:nodoc:
2
+ module Mongoid
3
+ module Threaded
4
4
 
5
5
  # This module contains convenience methods for document lifecycle that
6
6
  # resides on thread locals.
@@ -22,10 +22,10 @@ module Mongoid #:nodoc:
22
22
  #
23
23
  # @since 2.2.0
24
24
  def _assigning
25
- Threaded.begin(:assign)
25
+ Threaded.begin("assign")
26
26
  yield
27
27
  ensure
28
- Threaded.exit(:assign)
28
+ Threaded.exit("assign")
29
29
  end
30
30
 
31
31
  # Is the current thread in assigning mode?
@@ -37,7 +37,7 @@ module Mongoid #:nodoc:
37
37
  #
38
38
  # @since 2.1.0
39
39
  def _assigning?
40
- Threaded.executing?(:assign)
40
+ Threaded.executing?("assign")
41
41
  end
42
42
 
43
43
  # Execute a block in binding mode.
@@ -51,10 +51,10 @@ module Mongoid #:nodoc:
51
51
  #
52
52
  # @since 2.1.0
53
53
  def _binding
54
- Threaded.begin(:bind)
54
+ Threaded.begin("bind")
55
55
  yield
56
56
  ensure
57
- Threaded.exit(:bind)
57
+ Threaded.exit("bind")
58
58
  end
59
59
 
60
60
  # Is the current thread in binding mode?
@@ -66,7 +66,7 @@ module Mongoid #:nodoc:
66
66
  #
67
67
  # @since 2.1.0
68
68
  def _binding?
69
- Threaded.executing?(:bind)
69
+ Threaded.executing?("bind")
70
70
  end
71
71
 
72
72
  # Execute a block in building mode.
@@ -80,10 +80,10 @@ module Mongoid #:nodoc:
80
80
  #
81
81
  # @since 2.1.0
82
82
  def _building
83
- Threaded.begin(:build)
83
+ Threaded.begin("build")
84
84
  yield
85
85
  ensure
86
- Threaded.exit(:build)
86
+ Threaded.exit("build")
87
87
  end
88
88
 
89
89
  # Is the current thread in building mode?
@@ -95,7 +95,7 @@ module Mongoid #:nodoc:
95
95
  #
96
96
  # @since 2.1.0
97
97
  def _building?
98
- Threaded.executing?(:build)
98
+ Threaded.executing?("build")
99
99
  end
100
100
 
101
101
  # Is the current thread in creating mode?
@@ -107,7 +107,7 @@ module Mongoid #:nodoc:
107
107
  #
108
108
  # @since 2.1.0
109
109
  def _creating?
110
- Threaded.executing?(:create)
110
+ Threaded.executing?("create")
111
111
  end
112
112
 
113
113
  # Execute a block in loading mode.
@@ -121,10 +121,10 @@ module Mongoid #:nodoc:
121
121
  #
122
122
  # @since 2.3.2
123
123
  def _loading
124
- Threaded.begin(:load)
124
+ Threaded.begin("load")
125
125
  yield
126
126
  ensure
127
- Threaded.exit(:load)
127
+ Threaded.exit("load")
128
128
  end
129
129
 
130
130
  # Is the current thread in loading mode?
@@ -136,7 +136,7 @@ module Mongoid #:nodoc:
136
136
  #
137
137
  # @since 2.3.2
138
138
  def _loading?
139
- Threaded.executing?(:load)
139
+ Threaded.executing?("load")
140
140
  end
141
141
 
142
142
  # Execute a block in loading revision mode.
@@ -150,13 +150,13 @@ module Mongoid #:nodoc:
150
150
  #
151
151
  # @since 2.3.4
152
152
  def _loading_revision
153
- Threaded.begin(:load_revision)
153
+ Threaded.begin("load_revision")
154
154
  yield
155
155
  ensure
156
- Threaded.exit(:load_revision)
156
+ Threaded.exit("load_revision")
157
157
  end
158
158
 
159
- module ClassMethods #:nodoc:
159
+ module ClassMethods
160
160
 
161
161
  # Execute a block in creating mode.
162
162
  #
@@ -169,11 +169,10 @@ module Mongoid #:nodoc:
169
169
  #
170
170
  # @since 2.1.0
171
171
  def _creating
172
- Threaded.begin(:create)
172
+ Threaded.begin("create")
173
173
  yield
174
174
  ensure
175
- Threaded.exit(:create)
176
- Threaded.clear_safety_options!
175
+ Threaded.exit("create")
177
176
  end
178
177
 
179
178
  # Is the current thread in loading revision mode?
@@ -185,7 +184,7 @@ module Mongoid #:nodoc:
185
184
  #
186
185
  # @since 2.3.4
187
186
  def _loading_revision?
188
- Threaded.executing?(:load_revision)
187
+ Threaded.executing?("load_revision")
189
188
  end
190
189
  end
191
190
  end
File without changes
@@ -3,7 +3,7 @@ require "mongoid/timestamps/created"
3
3
  require "mongoid/timestamps/updated"
4
4
  require "mongoid/timestamps/timeless"
5
5
 
6
- module Mongoid #:nodoc:
6
+ module Mongoid
7
7
 
8
8
  # This module handles the behaviour for setting up document created at and
9
9
  # updated at timestamps.
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
2
+ module Mongoid
3
3
  module Timestamps
4
4
  # This module handles the behaviour for setting up document created at
5
5
  # timestamp.
@@ -7,8 +7,8 @@ module Mongoid #:nodoc:
7
7
  extend ActiveSupport::Concern
8
8
 
9
9
  included do
10
- field :created_at, :type => Time
11
- set_callback :create, :before, :set_created_at, :if => :timestamping?
10
+ field :created_at, type: Time
11
+ set_callback :create, :before, :set_created_at, if: :timestamping?
12
12
  end
13
13
 
14
14
  # Update the created_at field on the Document to the current time. This is
@@ -17,7 +17,11 @@ module Mongoid #:nodoc:
17
17
  # @example Set the created at time.
18
18
  # person.set_created_at
19
19
  def set_created_at
20
- self.created_at = Time.now.utc if !created_at
20
+ if !created_at
21
+ time = Time.now.utc
22
+ self.updated_at = time if is_a?(Updated)
23
+ self.created_at = time
24
+ end
21
25
  end
22
26
  end
23
27
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
2
+ module Mongoid
3
3
  module Timestamps
4
4
 
5
5
  # This module adds behaviour for turning off timestamping in single or
@@ -16,7 +16,8 @@ module Mongoid #:nodoc:
16
16
  #
17
17
  # @since 2.3.0
18
18
  def timeless
19
- tap { Threaded.timeless = true }
19
+ Threaded.timeless = true
20
+ self
20
21
  end
21
22
 
22
23
  # Are we currently timestamping?
@@ -31,7 +32,7 @@ module Mongoid #:nodoc:
31
32
  Threaded.timestamping?
32
33
  end
33
34
 
34
- module ClassMethods #:nodoc
35
+ module ClassMethods
35
36
 
36
37
  # Begin an execution that should skip timestamping.
37
38
  #
@@ -42,7 +43,8 @@ module Mongoid #:nodoc:
42
43
  #
43
44
  # @since 2.3.0
44
45
  def timeless
45
- tap { Threaded.timeless = true }
46
+ Threaded.timeless = true
47
+ self
46
48
  end
47
49
  end
48
50
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
2
+ module Mongoid
3
3
  module Timestamps
4
4
  # This module handles the behaviour for setting up document updated at
5
5
  # timestamp.
@@ -7,8 +7,8 @@ module Mongoid #:nodoc:
7
7
  extend ActiveSupport::Concern
8
8
 
9
9
  included do
10
- field :updated_at, :type => Time
11
- set_callback :save, :before, :set_updated_at, :if => :able_to_set_updated_at?
10
+ field :updated_at, type: Time
11
+ set_callback :save, :before, :set_updated_at, if: :able_to_set_updated_at?
12
12
  end
13
13
 
14
14
  # Update the updated_at field on the Document to the current time.
@@ -0,0 +1,61 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+
4
+ # This module handles unit of work functionality with regards to the identity
5
+ # map.
6
+ module UnitOfWork
7
+
8
+ # We can process a unit of work in Mongoid and have the identity map
9
+ # automatically clear itself out after the work is complete.
10
+ #
11
+ # @example Process a unit of work.
12
+ # Mongoid.unit_of_work do
13
+ # Person.create(title: "Sir")
14
+ # end
15
+ #
16
+ # @example Process with identity map disabled on the current thread.
17
+ # Mongoid.unit_of_work(disable: :current) do
18
+ # Person.create(title: "Sir")
19
+ # end
20
+ #
21
+ # @example Process with identity map disabled on all threads.
22
+ # Mongoid.unit_of_work(disable: :all) do
23
+ # Person.create(title: "Sir")
24
+ # end
25
+ #
26
+ # @param [ Hash ] options The disabling options.
27
+ #
28
+ # @option [ Symbol ] :disable Either :all or :current to indicate whether
29
+ # to temporarily disable the identity map on the current thread or all
30
+ # threads.
31
+ #
32
+ # @return [ Object ] The result of the block.
33
+ #
34
+ # @since 2.1.0
35
+ def unit_of_work(options = {})
36
+ disable = options[:disable]
37
+ begin
38
+ Threaded.disable_identity_map(disable) if disable
39
+ yield if block_given?
40
+ ensure
41
+ if disable
42
+ Threaded.enable_identity_map(disable)
43
+ else
44
+ IdentityMap.clear
45
+ end
46
+ end
47
+ end
48
+
49
+ # Are we currently using the identity map?
50
+ #
51
+ # @example Is the identity map currently enabled?
52
+ # Mongoid.using_identity_map?
53
+ #
54
+ # @return [ true, false ] If the identity map is in use.
55
+ #
56
+ # @since 3.0.0
57
+ def using_identity_map?
58
+ Mongoid.identity_map_enabled? && Threaded.identity_map_enabled?
59
+ end
60
+ end
61
+ end
@@ -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.
@@ -53,7 +53,7 @@ module Mongoid #:nodoc:
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.
@@ -192,6 +177,29 @@ module Mongoid #:nodoc:
192
177
  validates_with(PresenceValidator, _merge_attributes(args))
193
178
  end
194
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
+
195
203
  protected
196
204
 
197
205
  # Adds an associated validator for the relation if the validate option
@@ -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 an association is valid or not. Will correctly
6
6
  # handle has one and has many associations.
@@ -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 that the specified attributes do or do not match a certain
6
6
  # regular expression.
@@ -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 that the specified attributes are not blank (as defined by
6
6
  # Object#blank?).
@@ -28,17 +28,43 @@ module Mongoid #:nodoc:
28
28
  def validate_each(document, attribute, value)
29
29
  field = document.fields[attribute.to_s]
30
30
  if field.try(:localized?) && !value.blank?
31
- value.each_pair do |locale, value|
32
- document.errors.add(attribute, :blank_on_locale, options.merge(:location => locale)) if value.blank?
31
+ value.each_pair do |_locale, _value|
32
+ document.errors.add(
33
+ attribute,
34
+ :blank_in_locale,
35
+ options.merge(location: _locale)
36
+ ) if _value.blank?
33
37
  end
34
38
  elsif document.relations.has_key?(attribute.to_s)
35
- if value.blank? && document.send(attribute).blank?
39
+ if relation_or_fk_missing?(document, attribute, value)
36
40
  document.errors.add(attribute, :blank, options)
37
41
  end
38
42
  else
39
43
  document.errors.add(attribute, :blank, options) if value.blank?
40
44
  end
41
45
  end
46
+
47
+ private
48
+
49
+ # Returns true if the relation is blank or the foreign key is blank.
50
+ #
51
+ # @api private
52
+ #
53
+ # @example Check is the relation or fk is blank.
54
+ # validator.relation_or_fk_mising(doc, :name, "")
55
+ #
56
+ # @param [ Document ] doc The document.
57
+ # @param [ Symbol ] attr The attribute.
58
+ # @param [ Object ] value The value.
59
+ #
60
+ # @return [ true, false ] If the doc is missing.
61
+ #
62
+ # @since 3.0.0
63
+ def relation_or_fk_missing?(doc, attr, value)
64
+ return true if value.blank? && doc.send(attr).blank?
65
+ metadata = doc.relations[attr.to_s]
66
+ metadata.stores_foreign_key? && doc.send(metadata.foreign_key).blank?
67
+ end
42
68
  end
43
69
  end
44
70
  end