mongoid 2.4.10 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (356) hide show
  1. data/CHANGELOG.md +949 -10
  2. data/LICENSE +1 -1
  3. data/README.md +10 -11
  4. data/Rakefile +3 -17
  5. data/lib/config/locales/en.yml +455 -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 +70 -16
  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 +106 -43
  16. data/lib/mongoid/components.rb +12 -23
  17. data/lib/mongoid/config/environment.rb +7 -4
  18. data/lib/mongoid/config/inflections.rb +6 -0
  19. data/lib/mongoid/config/options.rb +1 -1
  20. data/lib/mongoid/config/validators/option.rb +25 -0
  21. data/lib/mongoid/config/validators/session.rb +140 -0
  22. data/lib/mongoid/config/validators.rb +3 -0
  23. data/lib/mongoid/config.rb +104 -225
  24. data/lib/mongoid/contextual/aggregable/memory.rb +109 -0
  25. data/lib/mongoid/contextual/aggregable/mongo.rb +181 -0
  26. data/lib/mongoid/contextual/atomic.rb +179 -0
  27. data/lib/mongoid/contextual/command.rb +43 -0
  28. data/lib/mongoid/contextual/find_and_modify.rb +68 -0
  29. data/lib/mongoid/contextual/map_reduce.rb +273 -0
  30. data/lib/mongoid/contextual/memory.rb +406 -0
  31. data/lib/mongoid/contextual/mongo.rb +662 -0
  32. data/lib/mongoid/contextual.rb +50 -0
  33. data/lib/mongoid/copyable.rb +7 -25
  34. data/lib/mongoid/criteria.rb +515 -245
  35. data/lib/mongoid/criterion/inspection.rb +14 -8
  36. data/lib/mongoid/criterion/scoping.rb +114 -44
  37. data/lib/mongoid/dirty.rb +152 -67
  38. data/lib/mongoid/document.rb +71 -52
  39. data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
  40. data/lib/mongoid/errors/callback.rb +5 -6
  41. data/lib/mongoid/errors/delete_restriction.rb +29 -0
  42. data/lib/mongoid/errors/document_not_found.rb +98 -17
  43. data/lib/mongoid/errors/eager_load.rb +3 -6
  44. data/lib/mongoid/errors/invalid_collection.rb +3 -3
  45. data/lib/mongoid/errors/invalid_config_option.rb +27 -0
  46. data/lib/mongoid/errors/invalid_database.rb +3 -3
  47. data/lib/mongoid/errors/invalid_field.rb +54 -8
  48. data/lib/mongoid/errors/invalid_field_option.rb +35 -0
  49. data/lib/mongoid/errors/invalid_find.rb +3 -3
  50. data/lib/mongoid/errors/invalid_index.rb +28 -0
  51. data/lib/mongoid/errors/invalid_options.rb +4 -4
  52. data/lib/mongoid/errors/invalid_scope.rb +24 -0
  53. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
  54. data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
  55. data/lib/mongoid/errors/invalid_time.rb +3 -6
  56. data/lib/mongoid/errors/inverse_not_found.rb +29 -0
  57. data/lib/mongoid/errors/mixed_relations.rb +4 -9
  58. data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
  59. data/lib/mongoid/errors/mongoid_error.rb +54 -3
  60. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
  61. data/lib/mongoid/errors/no_default_session.rb +23 -0
  62. data/lib/mongoid/errors/no_environment.rb +3 -3
  63. data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
  64. data/lib/mongoid/errors/no_metadata.rb +21 -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 +23 -1
  80. data/lib/mongoid/evolvable.rb +19 -0
  81. data/lib/mongoid/extensions/array.rb +164 -0
  82. data/lib/mongoid/extensions/big_decimal.rb +42 -0
  83. data/lib/mongoid/extensions/boolean.rb +24 -0
  84. data/lib/mongoid/extensions/date.rb +70 -0
  85. data/lib/mongoid/extensions/date_time.rb +73 -0
  86. data/lib/mongoid/extensions/false_class.rb +38 -0
  87. data/lib/mongoid/extensions/float.rb +56 -0
  88. data/lib/mongoid/extensions/hash.rb +123 -0
  89. data/lib/mongoid/extensions/integer.rb +66 -0
  90. data/lib/mongoid/extensions/module.rb +28 -0
  91. data/lib/mongoid/extensions/nil_class.rb +21 -0
  92. data/lib/mongoid/extensions/object.rb +238 -0
  93. data/lib/mongoid/extensions/object_id.rb +54 -0
  94. data/lib/mongoid/extensions/range.rb +79 -0
  95. data/lib/mongoid/extensions/regexp.rb +27 -0
  96. data/lib/mongoid/extensions/set.rb +55 -0
  97. data/lib/mongoid/extensions/string.rb +181 -0
  98. data/lib/mongoid/extensions/symbol.rb +54 -0
  99. data/lib/mongoid/extensions/time.rb +78 -0
  100. data/lib/mongoid/extensions/time_with_zone.rb +55 -0
  101. data/lib/mongoid/extensions/true_class.rb +38 -0
  102. data/lib/mongoid/extensions.rb +28 -76
  103. data/lib/mongoid/factory.rb +1 -1
  104. data/lib/mongoid/fields/foreign_key.rb +150 -0
  105. data/lib/mongoid/fields/localized.rb +73 -0
  106. data/lib/mongoid/fields/standard.rb +268 -0
  107. data/lib/mongoid/fields/validators/macro.rb +83 -0
  108. data/lib/mongoid/fields/validators.rb +2 -0
  109. data/lib/mongoid/fields.rb +142 -208
  110. data/lib/mongoid/finders.rb +45 -50
  111. data/lib/mongoid/hierarchy.rb +44 -15
  112. data/lib/mongoid/identity_map.rb +49 -21
  113. data/lib/mongoid/indexes/validators/options.rb +80 -0
  114. data/lib/mongoid/indexes.rb +66 -15
  115. data/lib/mongoid/inspection.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 +9 -11
  134. data/lib/mongoid/nested_attributes.rb +17 -9
  135. data/lib/mongoid/observer.rb +1 -2
  136. data/lib/mongoid/paranoia.rb +10 -44
  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/upsert.rb +28 -0
  159. data/lib/mongoid/persistence/operations.rb +22 -19
  160. data/lib/mongoid/persistence/upsertion.rb +30 -0
  161. data/lib/mongoid/persistence.rb +94 -39
  162. data/lib/mongoid/railtie.rb +26 -11
  163. data/lib/mongoid/railties/database.rake +22 -108
  164. data/lib/mongoid/relations/accessors.rb +120 -20
  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 +4 -4
  175. data/lib/mongoid/relations/builders/embedded/in.rb +5 -5
  176. data/lib/mongoid/relations/builders/embedded/many.rb +12 -12
  177. data/lib/mongoid/relations/builders/embedded/one.rb +6 -6
  178. data/lib/mongoid/relations/builders/nested_attributes/many.rb +8 -8
  179. data/lib/mongoid/relations/builders/nested_attributes/one.rb +5 -5
  180. data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
  181. data/lib/mongoid/relations/builders/referenced/many.rb +6 -6
  182. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +7 -5
  183. data/lib/mongoid/relations/builders/referenced/one.rb +5 -5
  184. data/lib/mongoid/relations/builders.rb +19 -16
  185. data/lib/mongoid/relations/cascading/delete.rb +3 -5
  186. data/lib/mongoid/relations/cascading/destroy.rb +3 -3
  187. data/lib/mongoid/relations/cascading/nullify.rb +3 -3
  188. data/lib/mongoid/relations/cascading/restrict.rb +37 -0
  189. data/lib/mongoid/relations/cascading.rb +10 -7
  190. data/lib/mongoid/relations/constraint.rb +4 -3
  191. data/lib/mongoid/relations/conversions.rb +6 -7
  192. data/lib/mongoid/relations/cyclic.rb +7 -7
  193. data/lib/mongoid/relations/embedded/batchable.rb +347 -0
  194. data/lib/mongoid/relations/embedded/in.rb +23 -12
  195. data/lib/mongoid/relations/embedded/many.rb +100 -161
  196. data/lib/mongoid/relations/embedded/one.rb +25 -14
  197. data/lib/mongoid/relations/macros.rb +105 -60
  198. data/lib/mongoid/relations/many.rb +93 -14
  199. data/lib/mongoid/relations/metadata.rb +277 -47
  200. data/lib/mongoid/relations/nested_builder.rb +4 -6
  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 +62 -31
  205. data/lib/mongoid/relations/referenced/in.rb +40 -15
  206. data/lib/mongoid/relations/referenced/many.rb +162 -130
  207. data/lib/mongoid/relations/referenced/many_to_many.rb +104 -48
  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/relations/touchable.rb +32 -0
  213. data/lib/mongoid/relations.rb +22 -6
  214. data/lib/mongoid/reloading.rb +12 -14
  215. data/lib/mongoid/scoping.rb +312 -0
  216. data/lib/mongoid/serialization.rb +94 -42
  217. data/lib/mongoid/sessions/factory.rb +108 -0
  218. data/lib/mongoid/sessions/mongo_uri.rb +93 -0
  219. data/lib/mongoid/sessions/validators/storage.rb +49 -0
  220. data/lib/mongoid/sessions/validators.rb +2 -0
  221. data/lib/mongoid/sessions.rb +383 -0
  222. data/lib/mongoid/sharding.rb +6 -6
  223. data/lib/mongoid/state.rb +6 -7
  224. data/lib/mongoid/threaded/lifecycle.rb +21 -21
  225. data/lib/mongoid/threaded/sessions.rb +0 -0
  226. data/lib/mongoid/threaded.rb +219 -59
  227. data/lib/mongoid/timestamps/created.rb +8 -4
  228. data/lib/mongoid/timestamps/timeless.rb +6 -4
  229. data/lib/mongoid/timestamps/updated.rb +4 -3
  230. data/lib/mongoid/timestamps.rb +1 -1
  231. data/lib/mongoid/unit_of_work.rb +61 -0
  232. data/lib/mongoid/validations/associated.rb +2 -2
  233. data/lib/mongoid/validations/format.rb +2 -2
  234. data/lib/mongoid/validations/presence.rb +34 -4
  235. data/lib/mongoid/validations/uniqueness.rb +11 -12
  236. data/lib/mongoid/validations.rb +28 -20
  237. data/lib/mongoid/version.rb +2 -2
  238. data/lib/mongoid/versioning.rb +25 -26
  239. data/lib/mongoid.rb +37 -37
  240. data/lib/rack/mongoid/middleware/identity_map.rb +3 -3
  241. data/lib/rails/generators/mongoid/config/config_generator.rb +1 -1
  242. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +65 -17
  243. data/lib/rails/generators/mongoid/model/model_generator.rb +7 -7
  244. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +2 -2
  245. data/lib/rails/generators/mongoid/observer/observer_generator.rb +4 -4
  246. data/lib/rails/generators/mongoid_generator.rb +5 -5
  247. data/lib/rails/mongoid.rb +73 -26
  248. metadata +103 -148
  249. data/lib/config/locales/bg.yml +0 -61
  250. data/lib/config/locales/de.yml +0 -61
  251. data/lib/config/locales/en-GB.yml +0 -64
  252. data/lib/config/locales/es.yml +0 -59
  253. data/lib/config/locales/fr.yml +0 -62
  254. data/lib/config/locales/hi.yml +0 -53
  255. data/lib/config/locales/hu.yml +0 -64
  256. data/lib/config/locales/id.yml +0 -62
  257. data/lib/config/locales/it.yml +0 -59
  258. data/lib/config/locales/ja.yml +0 -57
  259. data/lib/config/locales/kr.yml +0 -54
  260. data/lib/config/locales/nl.yml +0 -61
  261. data/lib/config/locales/pl.yml +0 -59
  262. data/lib/config/locales/pt-BR.yml +0 -60
  263. data/lib/config/locales/pt.yml +0 -60
  264. data/lib/config/locales/ro.yml +0 -66
  265. data/lib/config/locales/ru.yml +0 -61
  266. data/lib/config/locales/sv.yml +0 -60
  267. data/lib/config/locales/vi.yml +0 -62
  268. data/lib/config/locales/zh-CN.yml +0 -53
  269. data/lib/mongoid/collection.rb +0 -157
  270. data/lib/mongoid/collections/master.rb +0 -45
  271. data/lib/mongoid/collections/operations.rb +0 -44
  272. data/lib/mongoid/collections/retry.rb +0 -59
  273. data/lib/mongoid/collections.rb +0 -120
  274. data/lib/mongoid/config/database.rb +0 -181
  275. data/lib/mongoid/config/replset_database.rb +0 -80
  276. data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
  277. data/lib/mongoid/contexts/enumerable.rb +0 -313
  278. data/lib/mongoid/contexts/mongo.rb +0 -487
  279. data/lib/mongoid/contexts.rb +0 -25
  280. data/lib/mongoid/criterion/builder.rb +0 -34
  281. data/lib/mongoid/criterion/complex.rb +0 -84
  282. data/lib/mongoid/criterion/creational.rb +0 -34
  283. data/lib/mongoid/criterion/exclusion.rb +0 -108
  284. data/lib/mongoid/criterion/inclusion.rb +0 -290
  285. data/lib/mongoid/criterion/optional.rb +0 -259
  286. data/lib/mongoid/criterion/selector.rb +0 -177
  287. data/lib/mongoid/cursor.rb +0 -88
  288. data/lib/mongoid/default_scope.rb +0 -36
  289. data/lib/mongoid/errors/invalid_type.rb +0 -25
  290. data/lib/mongoid/extensions/array/deep_copy.rb +0 -25
  291. data/lib/mongoid/extensions/array/deletion.rb +0 -29
  292. data/lib/mongoid/extensions/false_class/equality.rb +0 -26
  293. data/lib/mongoid/extensions/hash/criteria_helpers.rb +0 -47
  294. data/lib/mongoid/extensions/hash/deep_copy.rb +0 -25
  295. data/lib/mongoid/extensions/hash/scoping.rb +0 -25
  296. data/lib/mongoid/extensions/integer/checks.rb +0 -23
  297. data/lib/mongoid/extensions/nil/collectionization.rb +0 -23
  298. data/lib/mongoid/extensions/object/checks.rb +0 -29
  299. data/lib/mongoid/extensions/object/deep_copy.rb +0 -21
  300. data/lib/mongoid/extensions/object/reflections.rb +0 -48
  301. data/lib/mongoid/extensions/object/substitutable.rb +0 -15
  302. data/lib/mongoid/extensions/object/yoda.rb +0 -44
  303. data/lib/mongoid/extensions/object_id/conversions.rb +0 -60
  304. data/lib/mongoid/extensions/proc/scoping.rb +0 -25
  305. data/lib/mongoid/extensions/string/checks.rb +0 -36
  306. data/lib/mongoid/extensions/string/conversions.rb +0 -22
  307. data/lib/mongoid/extensions/string/inflections.rb +0 -118
  308. data/lib/mongoid/extensions/symbol/checks.rb +0 -23
  309. data/lib/mongoid/extensions/symbol/inflections.rb +0 -67
  310. data/lib/mongoid/extensions/true_class/equality.rb +0 -26
  311. data/lib/mongoid/extras.rb +0 -31
  312. data/lib/mongoid/fields/internal/array.rb +0 -76
  313. data/lib/mongoid/fields/internal/big_decimal.rb +0 -63
  314. data/lib/mongoid/fields/internal/bignum.rb +0 -10
  315. data/lib/mongoid/fields/internal/binary.rb +0 -11
  316. data/lib/mongoid/fields/internal/boolean.rb +0 -58
  317. data/lib/mongoid/fields/internal/date.rb +0 -51
  318. data/lib/mongoid/fields/internal/date_time.rb +0 -28
  319. data/lib/mongoid/fields/internal/false_class.rb +0 -10
  320. data/lib/mongoid/fields/internal/fixnum.rb +0 -10
  321. data/lib/mongoid/fields/internal/float.rb +0 -47
  322. data/lib/mongoid/fields/internal/foreign_keys/array.rb +0 -88
  323. data/lib/mongoid/fields/internal/foreign_keys/object.rb +0 -56
  324. data/lib/mongoid/fields/internal/hash.rb +0 -11
  325. data/lib/mongoid/fields/internal/integer.rb +0 -59
  326. data/lib/mongoid/fields/internal/localized.rb +0 -62
  327. data/lib/mongoid/fields/internal/nil_class.rb +0 -53
  328. data/lib/mongoid/fields/internal/object.rb +0 -11
  329. data/lib/mongoid/fields/internal/object_id.rb +0 -46
  330. data/lib/mongoid/fields/internal/range.rb +0 -61
  331. data/lib/mongoid/fields/internal/set.rb +0 -57
  332. data/lib/mongoid/fields/internal/string.rb +0 -42
  333. data/lib/mongoid/fields/internal/symbol.rb +0 -43
  334. data/lib/mongoid/fields/internal/time.rb +0 -23
  335. data/lib/mongoid/fields/internal/time_with_zone.rb +0 -23
  336. data/lib/mongoid/fields/internal/timekeeping.rb +0 -122
  337. data/lib/mongoid/fields/internal/true_class.rb +0 -10
  338. data/lib/mongoid/fields/mappings.rb +0 -42
  339. data/lib/mongoid/fields/serializable.rb +0 -270
  340. data/lib/mongoid/identity.rb +0 -92
  341. data/lib/mongoid/javascript/functions.yml +0 -63
  342. data/lib/mongoid/javascript.rb +0 -20
  343. data/lib/mongoid/keys.rb +0 -144
  344. data/lib/mongoid/logger.rb +0 -45
  345. data/lib/mongoid/multi_database.rb +0 -36
  346. data/lib/mongoid/named_scope.rb +0 -166
  347. data/lib/mongoid/relations/embedded/atomic/operation.rb +0 -63
  348. data/lib/mongoid/relations/embedded/atomic/pull.rb +0 -65
  349. data/lib/mongoid/relations/embedded/atomic/push_all.rb +0 -59
  350. data/lib/mongoid/relations/embedded/atomic/set.rb +0 -61
  351. data/lib/mongoid/relations/embedded/atomic/unset.rb +0 -41
  352. data/lib/mongoid/relations/embedded/atomic.rb +0 -89
  353. data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
  354. data/lib/mongoid/relations/referenced/batch.rb +0 -73
  355. data/lib/mongoid/safety.rb +0 -105
  356. data/lib/mongoid/scope.rb +0 -31
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
  require "mongoid/threaded/lifecycle"
3
3
 
4
- module Mongoid #:nodoc:
4
+ module Mongoid
5
5
 
6
6
  # This module contains logic for easy access to objects that have a lifecycle
7
7
  # on the current thread.
@@ -13,7 +13,7 @@ module Mongoid #:nodoc:
13
13
  # @example Begin entry into the stack.
14
14
  # Threaded.begin(:create)
15
15
  #
16
- # @param [ Symbol ] name The name of the stack
16
+ # @param [ String ] name The name of the stack
17
17
  #
18
18
  # @return [ true ] True.
19
19
  #
@@ -22,6 +22,44 @@ module Mongoid #:nodoc:
22
22
  stack(name).push(true)
23
23
  end
24
24
 
25
+ # Get the global database override.
26
+ #
27
+ # @example Get the global database override.
28
+ # Threaded.database_override
29
+ #
30
+ # @return [ String, Symbol ] The override.
31
+ #
32
+ # @since 3.0.0
33
+ def database_override
34
+ Thread.current["[mongoid]:db-override"]
35
+ end
36
+
37
+ # Set the global database override.
38
+ #
39
+ # @example Set the global database override.
40
+ # Threaded.database_override = :testing
41
+ #
42
+ # @param [ String, Symbol ] The global override name.
43
+ #
44
+ # @return [ String, Symbol ] The override.
45
+ #
46
+ # @since 3.0.0
47
+ def database_override=(name)
48
+ Thread.current["[mongoid]:db-override"] = name
49
+ end
50
+
51
+ # Get the database sessions from the current thread.
52
+ #
53
+ # @example Get the database sessions.
54
+ # Threaded.sessions
55
+ #
56
+ # @return [ Hash ] The sessions.
57
+ #
58
+ # @since 3.0.0
59
+ def sessions
60
+ Thread.current["[mongoid]:sessions"] ||= {}
61
+ end
62
+
25
63
  # Are in the middle of executing the named stack
26
64
  #
27
65
  # @example Are we in the stack execution?
@@ -61,7 +99,19 @@ module Mongoid #:nodoc:
61
99
  #
62
100
  # @since 2.4.0
63
101
  def stack(name)
64
- Thread.current[:"[mongoid]:#{name}-stack"] ||= []
102
+ Thread.current["[mongoid]:#{name}-stack"] ||= []
103
+ end
104
+
105
+ # Begin autosaving a document on the current thread.
106
+ #
107
+ # @example Begin autosave.
108
+ # Threaded.begin_autosave(doc)
109
+ #
110
+ # @param [ Document ] document The document to autosave.
111
+ #
112
+ # @since 3.0.0
113
+ def begin_autosave(document)
114
+ autosaves_for(document.class).push(document.id)
65
115
  end
66
116
 
67
117
  # Begin validating a document on the current thread.
@@ -76,16 +126,19 @@ module Mongoid #:nodoc:
76
126
  validations_for(document.class).push(document.id)
77
127
  end
78
128
 
79
- # Clear out all the safety options set using the safely proxy.
129
+ # Clear out all the persistence options.
80
130
  #
81
- # @example Clear out the options.
82
- # Threaded.clear_safety_options!
131
+ # @example Clear out the persistence options.
132
+ # Threaded.clear_persistence_options(Band)
83
133
  #
84
- # @return [ nil ] nil
134
+ # @param [ Class ] klass The model class.
85
135
  #
86
- # @since 2.1.0
87
- def clear_safety_options!
88
- Thread.current[:"[mongoid]:safety-options"] = nil
136
+ # @return [ true ] true.
137
+ #
138
+ # @since 2.0.0
139
+ def clear_persistence_options(klass)
140
+ Thread.current["[mongoid][#{klass}]:persistence-options"] = nil
141
+ true
89
142
  end
90
143
 
91
144
  # Clear out all options set on a one-time basis.
@@ -95,10 +148,21 @@ module Mongoid #:nodoc:
95
148
  #
96
149
  # @since 2.3.0
97
150
  def clear_options!
98
- clear_safety_options!
99
151
  self.timeless = false
100
152
  end
101
153
 
154
+ # Exit autosaving a document on the current thread.
155
+ #
156
+ # @example Exit autosave.
157
+ # Threaded.exit_autosave(doc)
158
+ #
159
+ # @param [ Document ] document The document to autosave.
160
+ #
161
+ # @since 3.0.0
162
+ def exit_autosave(document)
163
+ autosaves_for(document.class).delete_one(document.id)
164
+ end
165
+
102
166
  # Exit validating a document on the current thread.
103
167
  #
104
168
  # @example Exit validation.
@@ -120,7 +184,61 @@ module Mongoid #:nodoc:
120
184
  #
121
185
  # @since 2.1.0
122
186
  def identity_map
123
- Thread.current[:"[mongoid]:identity-map"] ||= IdentityMap.new
187
+ Thread.current["[mongoid]:identity-map"] ||= IdentityMap.new
188
+ end
189
+
190
+ # Is the identity map enabled on the current thread?
191
+ #
192
+ # @example Is the identity map enabled?
193
+ # Threaded.identity_map_enabled?
194
+ #
195
+ # @return [ true, false ] If the identity map is enabled.
196
+ #
197
+ # @since 3.0.0
198
+ def identity_map_enabled?
199
+ Thread.current["[mongoid]:identity-map-enabled"] != false
200
+ end
201
+
202
+ # Disable the identity map on either the current thread or all threads.
203
+ #
204
+ # @example Disable the identity map on all threads.
205
+ # Threaded.disable_identity_map(:all)
206
+ #
207
+ # @example Disable the identity map on the current thread.
208
+ # Threaded.disable_identity_map(:current)
209
+ #
210
+ # @param [ Symbol ] option The disabling option.
211
+ #
212
+ # @since 3.0.0
213
+ def disable_identity_map(option)
214
+ if option == :all
215
+ Thread.list.each do |thread|
216
+ thread["[mongoid]:identity-map-enabled"] = false
217
+ end
218
+ else
219
+ Thread.current["[mongoid]:identity-map-enabled"] = false
220
+ end
221
+ end
222
+
223
+ # Enable the identity map on either the current thread or all threads.
224
+ #
225
+ # @example Enable the identity map on all threads.
226
+ # Threaded.enable_identity_map(:all)
227
+ #
228
+ # @example Enable the identity map on the current thread.
229
+ # Threaded.enable_identity_map(:current)
230
+ #
231
+ # @param [ Symbol ] option The disabling option.
232
+ #
233
+ # @since 3.0.0
234
+ def enable_identity_map(option)
235
+ if option == :all
236
+ Thread.list.each do |thread|
237
+ thread["[mongoid]:identity-map-enabled"] = true
238
+ end
239
+ else
240
+ Thread.current["[mongoid]:identity-map-enabled"] = true
241
+ end
124
242
  end
125
243
 
126
244
  # Get the insert consumer from the current thread.
@@ -132,7 +250,7 @@ module Mongoid #:nodoc:
132
250
  #
133
251
  # @since 2.1.0
134
252
  def insert(name)
135
- Thread.current[:"[mongoid][#{name}]:insert-consumer"]
253
+ Thread.current["[mongoid][#{name}]:insert-consumer"]
136
254
  end
137
255
 
138
256
  # Set the insert consumer on the current thread.
@@ -146,33 +264,36 @@ module Mongoid #:nodoc:
146
264
  #
147
265
  # @since 2.1.0
148
266
  def set_insert(name, consumer)
149
- Thread.current[:"[mongoid][#{name}]:insert-consumer"] = consumer
267
+ Thread.current["[mongoid][#{name}]:insert-consumer"] = consumer
150
268
  end
151
269
 
152
- # Get the safety options for the current thread.
270
+ # Get the persistence options for the current thread.
271
+ #
272
+ # @example Get the persistence options.
273
+ # Threaded.persistence_options(Band)
153
274
  #
154
- # @example Get the safety options.
155
- # Threaded.safety_options
275
+ # @param [ Class ] klass The model class.
156
276
  #
157
- # @return [ Hash ] The current safety options.
277
+ # @return [ Hash ] The current persistence options.
158
278
  #
159
279
  # @since 2.1.0
160
- def safety_options
161
- Thread.current[:"[mongoid]:safety-options"]
280
+ def persistence_options(klass)
281
+ Thread.current["[mongoid][#{klass}]:persistence-options"]
162
282
  end
163
283
 
164
- # Set the safety options on the current thread.
284
+ # Set the persistence options on the current thread.
165
285
  #
166
- # @example Set the safety options.
167
- # Threaded.safety_options = { :fsync => true }
286
+ # @example Set the persistence options.
287
+ # Threaded.set_persistence_options(Band, { safe: { fsync: true }})
168
288
  #
169
- # @param [ Hash ] options The safety options.
289
+ # @param [ Class ] klass The model class.
290
+ # @param [ Hash ] options The persistence options.
170
291
  #
171
- # @return [ Hash ] The safety options.
292
+ # @return [ Hash ] The persistence options.
172
293
  #
173
294
  # @since 2.1.0
174
- def safety_options=(options)
175
- Thread.current[:"[mongoid]:safety-options"] = options
295
+ def set_persistence_options(klass, options)
296
+ Thread.current["[mongoid][#{klass}]:persistence-options"] = options
176
297
  end
177
298
 
178
299
  # Get the field selection options from the current thread.
@@ -184,7 +305,7 @@ module Mongoid #:nodoc:
184
305
  #
185
306
  # @since 2.4.4
186
307
  def selection
187
- Thread.current[:"[mongoid]:selection"]
308
+ Thread.current["[mongoid]:selection"]
188
309
  end
189
310
 
190
311
  # Set the field selection on the current thread.
@@ -198,7 +319,33 @@ module Mongoid #:nodoc:
198
319
  #
199
320
  # @since 2.4.4
200
321
  def selection=(value)
201
- Thread.current[:"[mongoid]:selection"] = value
322
+ Thread.current["[mongoid]:selection"] = value
323
+ end
324
+
325
+ # Get the global session override.
326
+ #
327
+ # @example Get the global session override.
328
+ # Threaded.session_override
329
+ #
330
+ # @return [ String, Symbol ] The override.
331
+ #
332
+ # @since 3.0.0
333
+ def session_override
334
+ Thread.current["[mongoid]:session-override"]
335
+ end
336
+
337
+ # Set the global session override.
338
+ #
339
+ # @example Set the global session override.
340
+ # Threaded.session_override = :testing
341
+ #
342
+ # @param [ String, Symbol ] The global override name.
343
+ #
344
+ # @return [ String, Symbol ] The override.
345
+ #
346
+ # @since 3.0.0
347
+ def session_override=(name)
348
+ Thread.current["[mongoid]:session-override"] = name
202
349
  end
203
350
 
204
351
  # Get the mongoid scope stack for chained criteria.
@@ -210,7 +357,7 @@ module Mongoid #:nodoc:
210
357
  #
211
358
  # @since 2.1.0
212
359
  def scope_stack
213
- Thread.current[:"[mongoid]:scope-stack"] ||= {}
360
+ Thread.current["[mongoid]:scope-stack"] ||= {}
214
361
  end
215
362
 
216
363
  # Get the value of the one-off timeless call.
@@ -222,7 +369,7 @@ module Mongoid #:nodoc:
222
369
  #
223
370
  # @since 2.3.0
224
371
  def timeless
225
- !!Thread.current[:"[mongoid]:timeless"]
372
+ !!Thread.current["[mongoid]:timeless"]
226
373
  end
227
374
 
228
375
  # Set the value of the one-off timeless call.
@@ -234,33 +381,7 @@ module Mongoid #:nodoc:
234
381
  #
235
382
  # @since 2.3.0
236
383
  def timeless=(value)
237
- Thread.current[:"[mongoid]:timeless"] = value
238
- end
239
-
240
- # Get the update consumer from the current thread.
241
- #
242
- # @example Get the update consumer.
243
- # Threaded.update
244
- #
245
- # @return [ Object ] The atomic update consumer.
246
- #
247
- # @since 2.1.0
248
- def update_consumer(klass)
249
- Thread.current[:"[mongoid][#{klass}]:update-consumer"]
250
- end
251
-
252
- # Set the update consumer on the current thread.
253
- #
254
- # @example Set the update consumer.
255
- # Threaded.update = consumer
256
- #
257
- # @param [ Object ] consumer The update consumer.
258
- #
259
- # @return [ Object ] The update consumer.
260
- #
261
- # @since 2.1.0
262
- def set_update_consumer(klass, consumer)
263
- Thread.current[:"[mongoid][#{klass}]:update-consumer"] = consumer
384
+ Thread.current["[mongoid]:timeless"] = value
264
385
  end
265
386
 
266
387
  # Is the current thread setting timestamps?
@@ -275,6 +396,20 @@ module Mongoid #:nodoc:
275
396
  !timeless
276
397
  end
277
398
 
399
+ # Is the document autosaved on the current thread?
400
+ #
401
+ # @example Is the document autosaved?
402
+ # Threaded.autosaved?(doc)
403
+ #
404
+ # @param [ Document ] document The document to check.
405
+ #
406
+ # @return [ true, false ] If the document is autosaved.
407
+ #
408
+ # @since 2.1.9
409
+ def autosaved?(document)
410
+ autosaves_for(document.class).include?(document.id)
411
+ end
412
+
278
413
  # Is the document validated on the current thread?
279
414
  #
280
415
  # @example Is the document validated?
@@ -289,6 +424,18 @@ module Mongoid #:nodoc:
289
424
  validations_for(document.class).include?(document.id)
290
425
  end
291
426
 
427
+ # Get all autosaves on the current thread.
428
+ #
429
+ # @example Get all autosaves.
430
+ # Threaded.autosaves
431
+ #
432
+ # @return [ Hash ] The current autosaves.
433
+ #
434
+ # @since 3.0.0
435
+ def autosaves
436
+ Thread.current["[mongoid]:autosaves"] ||= {}
437
+ end
438
+
292
439
  # Get all validations on the current thread.
293
440
  #
294
441
  # @example Get all validations.
@@ -298,9 +445,22 @@ module Mongoid #:nodoc:
298
445
  #
299
446
  # @since 2.1.9
300
447
  def validations
301
- Thread.current[:"[mongoid]:validations"] ||= {}
448
+ Thread.current["[mongoid]:validations"] ||= {}
302
449
  end
303
450
 
451
+ # Get all autosaves on the current thread for the class.
452
+ #
453
+ # @example Get all autosaves.
454
+ # Threaded.autosaves_for(Person)
455
+ #
456
+ # @param [ Class ] The class to check.
457
+ #
458
+ # @return [ Array ] The current autosaves.
459
+ #
460
+ # @since 3.0.0
461
+ def autosaves_for(klass)
462
+ autosaves[klass] ||= []
463
+ end
304
464
  # Get all validations on the current thread for the class.
305
465
  #
306
466
  # @example Get all validations.
@@ -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) && !updated_at_changed?
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,9 @@ 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 :create, :before, :set_updated_at, if: :able_to_set_updated_at?
12
+ set_callback :update, :before, :set_updated_at, if: :able_to_set_updated_at?
12
13
  end
13
14
 
14
15
  # Update the updated_at field on the Document to the current time.
@@ -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.
@@ -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
@@ -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,13 +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?
37
+ end
38
+ elsif document.relations.has_key?(attribute.to_s)
39
+ if relation_or_fk_missing?(document, attribute, value)
40
+ document.errors.add(attribute, :blank, options)
33
41
  end
34
42
  else
35
43
  document.errors.add(attribute, :blank, options) if value.blank?
36
44
  end
37
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
38
68
  end
39
69
  end
40
70
  end