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,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Persistence #:nodoc:
2
+ module Mongoid
3
+ module Persistence
4
4
 
5
5
  # Contains common logic for insertion operations.
6
6
  module Insertion
@@ -19,23 +19,17 @@ module Mongoid #:nodoc:
19
19
  #
20
20
  # @since 2.1.0
21
21
  def prepare(&block)
22
- document.tap do |doc|
23
- unless validating? && document.invalid?(:create)
24
- result = doc.run_callbacks(:save) do
25
- doc.run_callbacks(:create) do
26
- yield(doc)
27
- doc.new_record = false
28
- true
29
- end
30
- end
31
-
32
- unless result == false
33
- doc.reset_persisted_children
34
- doc.move_changes
35
- Threaded.clear_options!
22
+ unless validating? && document.invalid?(:create)
23
+ result = document.run_callbacks(:save) do
24
+ document.run_callbacks(:create) do
25
+ yield(document)
26
+ document.new_record = false
27
+ true
36
28
  end
37
29
  end
30
+ document.post_persist unless result == false
38
31
  end
32
+ document
39
33
  end
40
34
  end
41
35
  end
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Persistence #:nodoc:
2
+ module Mongoid
3
+ module Persistence
4
4
 
5
5
  # Contains common logic for modification operations.
6
6
  module Modification
@@ -20,17 +20,13 @@ module Mongoid #:nodoc:
20
20
  # @since 2.1.0
21
21
  def prepare(&block)
22
22
  return false if validating? && document.invalid?(:update)
23
- document.run_callbacks(:save) do
23
+ result = document.run_callbacks(:save) do
24
24
  document.run_callbacks(:update) do
25
25
  yield(document); true
26
26
  end
27
- end.tap do |result|
28
- unless result == false
29
- document.reset_persisted_children
30
- document.move_changes
31
- Threaded.clear_options!
32
- end
33
27
  end
28
+ document.post_persist unless result == false
29
+ result
34
30
  end
35
31
  end
36
32
  end
@@ -1,8 +1,8 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Persistence #:nodoc:
4
- module Operations #:nodoc:
5
- module Embedded #:nodoc:
2
+ module Mongoid
3
+ module Persistence
4
+ module Operations
5
+ module Embedded
6
6
 
7
7
  # Insert is a persistence command responsible for taking a document that
8
8
  # has not been saved to the database and saving it. This specific class
@@ -28,10 +28,11 @@ module Mongoid #:nodoc:
28
28
  # @return [ Document ] The document to be inserted.
29
29
  def persist
30
30
  prepare do
31
- if parent.new?
31
+ raise Errors::NoParent.new(document.class.name) unless parent
32
+ if parent.new_record?
32
33
  parent.insert
33
34
  else
34
- collection.update(parent.atomic_selector, inserts, options)
35
+ collection.find(parent.atomic_selector).update(inserts)
35
36
  end
36
37
  end
37
38
  end
@@ -1,8 +1,8 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Persistence #:nodoc:
4
- module Operations #:nodoc:
5
- module Embedded #:nodoc:
2
+ module Mongoid
3
+ module Persistence
4
+ module Operations
5
+ module Embedded
6
6
 
7
7
  # Remove is a persistence command responsible for deleting a document from
8
8
  # the database.
@@ -29,7 +29,7 @@ module Mongoid #:nodoc:
29
29
  prepare do |doc|
30
30
  parent.remove_child(doc) if notifying_parent?
31
31
  if parent.persisted?
32
- collection.update(parent.atomic_selector, deletes, options)
32
+ collection.find(parent.atomic_selector).update(deletes)
33
33
  end
34
34
  end
35
35
  end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Persistence #:nodoc:
4
- module Operations #:nodoc:
2
+ module Mongoid
3
+ module Persistence
4
+ module Operations
5
5
 
6
6
  # Insert is a persistence command responsible for taking a document that
7
7
  # has not been saved to the database and saving it.
@@ -24,7 +24,7 @@ module Mongoid #:nodoc:
24
24
  # @return [ Document ] The document to be inserted.
25
25
  def persist
26
26
  prepare do |doc|
27
- collection.insert(doc.as_document, options)
27
+ collection.insert(doc.as_document)
28
28
  IdentityMap.set(doc)
29
29
  end
30
30
  end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Persistence #:nodoc:
4
- module Operations #:nodoc:
2
+ module Mongoid
3
+ module Persistence
4
+ module Operations
5
5
 
6
6
  # Remove is a persistence command responsible for deleting a document from
7
7
  # the database.
@@ -24,7 +24,7 @@ module Mongoid #:nodoc:
24
24
  # @return [ true ] Always true.
25
25
  def persist
26
26
  prepare do |doc|
27
- collection.remove({ :_id => doc.id }, options)
27
+ collection.find(doc.atomic_selector).remove
28
28
  end
29
29
  end
30
30
  end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Persistence #:nodoc:
4
- module Operations #:nodoc:
2
+ module Mongoid
3
+ module Persistence
4
+ module Operations
5
5
 
6
6
  # Update is a persistence command responsible for taking a document that
7
7
  # has already been saved to the database and saving it, depending on
@@ -42,9 +42,9 @@ module Mongoid #:nodoc:
42
42
  def persist
43
43
  prepare do
44
44
  unless updates.empty?
45
- collection.update(selector, updates, options)
45
+ collection.find(selector).update(updates)
46
46
  conflicts.each_pair do |key, value|
47
- collection.update(selector, { key => value }, options)
47
+ collection.find(selector).update({ key => value })
48
48
  end
49
49
  end
50
50
  end
@@ -0,0 +1,28 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Persistence
4
+ module Operations
5
+
6
+ # Wraps behaviour for performing upserts in Mongodb. No matter if the
7
+ # document has been modified or not, it will be sent to the db and Mongo
8
+ # will determin whether or not to insert or update.
9
+ class Upsert
10
+ include Upsertion, Operations
11
+
12
+ # Persist the upsert operation.
13
+ #
14
+ # @example Execute the upsert.
15
+ # operation.persist
16
+ #
17
+ # @return [ true ] Always true.
18
+ #
19
+ # @since 3.0.0
20
+ def persist
21
+ prepare do
22
+ collection.find(selector).update(document.as_document, [ :upsert ])
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -2,17 +2,18 @@
2
2
  require "mongoid/persistence/operations/insert"
3
3
  require "mongoid/persistence/operations/remove"
4
4
  require "mongoid/persistence/operations/update"
5
+ require "mongoid/persistence/operations/upsert"
5
6
  require "mongoid/persistence/operations/embedded/insert"
6
7
  require "mongoid/persistence/operations/embedded/remove"
7
8
 
8
- module Mongoid #:nodoc:
9
- module Persistence #:nodoc:
9
+ module Mongoid
10
+ module Persistence
10
11
 
11
12
  # Persistence operations include this module to get basic functionality
12
13
  # on initialization.
13
14
  module Operations
14
15
 
15
- attr_reader :conflicts, :document
16
+ attr_reader :conflicts, :document, :options
16
17
 
17
18
  # Get the collection we should be persisting to.
18
19
  #
@@ -80,19 +81,6 @@ module Mongoid #:nodoc:
80
81
  @notifying_parent ||= !@options.delete(:suppress)
81
82
  end
82
83
 
83
- # Get all the options that will be sent to the database. Right now this
84
- # is only safe mode opts.
85
- #
86
- # @example Get the options hash.
87
- # operation.options
88
- #
89
- # @return [ Hash ] The options for the database.
90
- #
91
- # @since 2.1.0
92
- def options
93
- Safety.merge_safety_options(@options)
94
- end
95
-
96
84
  # Get the parent of the provided document.
97
85
  #
98
86
  # @example Get the parent.
@@ -154,9 +142,9 @@ module Mongoid #:nodoc:
154
142
  #
155
143
  # @since 2.1.0
156
144
  def init_updates
157
- document.atomic_updates.tap do |updates|
158
- @conflicts = updates.delete(:conflicts) || {}
159
- end
145
+ updates = document.atomic_updates
146
+ @conflicts = updates.delete(:conflicts) || {}
147
+ updates
160
148
  end
161
149
 
162
150
  class << self
@@ -205,6 +193,21 @@ module Mongoid #:nodoc:
205
193
  def update(doc, options = {})
206
194
  Update.new(doc, options)
207
195
  end
196
+
197
+ # Get the appropriate upsert operation based on the document.
198
+ #
199
+ # @example Get the upsert operation.
200
+ # Operations.upsert(doc, options)
201
+ #
202
+ # @param [ Document ] doc The document to persist.
203
+ # @param [ Hash ] options The persistence options.
204
+ #
205
+ # @return [ Operations ] The operation.
206
+ #
207
+ # @since 3.0.0
208
+ def upsert(doc, options = {})
209
+ Upsert.new(doc, options)
210
+ end
208
211
  end
209
212
  end
210
213
  end
@@ -0,0 +1,30 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Persistence
4
+
5
+ # Contains common logic for upsert operations.
6
+ module Upsertion
7
+
8
+ # Wrap all the common upsert logic for root docments.
9
+ #
10
+ # @example Execute common upsert logic.
11
+ # prepare do |doc|
12
+ # collection.find({ :_id => 1 }).upsert({ name: "test" }, [ :upsert ])
13
+ # end
14
+ #
15
+ # @param [ Proc ] block The block to call.
16
+ #
17
+ # @return [ true, false ] If the save passed or not.
18
+ #
19
+ # @since 3.0.0
20
+ def prepare(&block)
21
+ return false if validating? && document.invalid?(:upsert)
22
+ result = document.run_callbacks(:upsert) do
23
+ yield(document); true
24
+ end
25
+ document.post_persist unless result == false
26
+ result
27
+ end
28
+ end
29
+ end
30
+ end
@@ -3,9 +3,10 @@ require "mongoid/persistence/atomic"
3
3
  require "mongoid/persistence/deletion"
4
4
  require "mongoid/persistence/insertion"
5
5
  require "mongoid/persistence/modification"
6
+ require "mongoid/persistence/upsertion"
6
7
  require "mongoid/persistence/operations"
7
8
 
8
- module Mongoid #:nodoc:
9
+ module Mongoid
9
10
 
10
11
  # The persistence module is a mixin to provide database accessor methods for
11
12
  # the document. These correspond to the appropriate accessors on a
@@ -19,7 +20,7 @@ module Mongoid #:nodoc:
19
20
  extend ActiveSupport::Concern
20
21
  include Atomic
21
22
 
22
- # Remove the document from the datbase with callbacks.
23
+ # Remove the document from the database with callbacks.
23
24
  #
24
25
  # @example Destroy a document.
25
26
  # document.destroy
@@ -29,11 +30,11 @@ module Mongoid #:nodoc:
29
30
  # @return [ true, false ] True if successful, false if not.
30
31
  def destroy(options = {})
31
32
  self.flagged_for_destroy = true
32
- run_callbacks(:destroy) do
33
+ result = run_callbacks(:destroy) do
33
34
  remove(options)
34
- end.tap do
35
- self.flagged_for_destroy = false
36
35
  end
36
+ self.flagged_for_destroy = false
37
+ result
37
38
  end
38
39
 
39
40
  # Insert a new document into the database. Will return the document
@@ -49,7 +50,7 @@ module Mongoid #:nodoc:
49
50
  Operations.insert(self, options).persist
50
51
  end
51
52
 
52
- # Remove the document from the datbase.
53
+ # Remove the document from the database.
53
54
  #
54
55
  # @example Remove the document.
55
56
  # document.remove
@@ -62,6 +63,25 @@ module Mongoid #:nodoc:
62
63
  end
63
64
  alias :delete :remove
64
65
 
66
+ # Save the document - will perform an insert if the document is new, and
67
+ # update if not.
68
+ #
69
+ # @example Save the document.
70
+ # document.save
71
+ #
72
+ # @param [ Hash ] options Options to pass to the save.
73
+ #
74
+ # @return [ true, false ] True is success, false if not.
75
+ #
76
+ # @since 1.0.0
77
+ def save(options = {})
78
+ if new_record?
79
+ insert(options).persisted?
80
+ else
81
+ update(options)
82
+ end
83
+ end
84
+
65
85
  # Save the document - will perform an insert if the document is new, and
66
86
  # update if not. If a validation error occurs an error will get raised.
67
87
  #
@@ -72,14 +92,42 @@ module Mongoid #:nodoc:
72
92
  #
73
93
  # @return [ true, false ] True if validation passed.
74
94
  def save!(options = {})
75
- unless upsert(options)
76
- self.class.fail_validate!(self) if errors.any?
95
+ unless save(options)
96
+ self.class.fail_validate!(self) unless errors.empty?
77
97
  self.class.fail_callback!(self, :save!)
78
98
  end
79
99
  return true
80
100
  end
81
101
 
82
- # Update the document in the datbase.
102
+ # Touch the document, in effect updating it's updated_at timestamp and
103
+ # optionally the provided field to the current time. If any belongs_to
104
+ # relations exist with a touch option, they will be updated as well.
105
+ #
106
+ # @example Update the updated_at timestamp.
107
+ # document.touch
108
+ #
109
+ # @example Update the updated_at and provided timestamps.
110
+ # document.touch(:audited)
111
+ #
112
+ # @note This will not autobuild relations if those options are set.
113
+ #
114
+ # @param [ Symbol ] field The name of an additional field to update.
115
+ #
116
+ # @return [ true ] true.
117
+ #
118
+ # @since 3.0.0
119
+ def touch(field = nil)
120
+ current = Time.now
121
+ write_attribute(:updated_at, current) if fields["updated_at"]
122
+ write_attribute(field, current) if field
123
+ _root.collection.find(atomic_selector).update(atomic_updates)
124
+ without_autobuild do
125
+ touchables.each { |name| send(name).try(:touch) }
126
+ end
127
+ move_changes and true
128
+ end
129
+
130
+ # Update the document in the database.
83
131
  #
84
132
  # @example Update an existing document.
85
133
  # document.update
@@ -100,15 +148,21 @@ module Mongoid #:nodoc:
100
148
  # @param [ Symbol, String ] name The name of the attribute.
101
149
  # @param [ Object ] value The new value of the attribute.a
102
150
  #
151
+ # @raise [ Errors::ReadonlyAttribute ] If the field cannot be changed due
152
+ # to being flagged as reaodnly.
153
+ #
103
154
  # @return [ true, false ] True if save was successfull, false if not.
104
155
  #
105
156
  # @since 2.0.0.rc.6
106
157
  def update_attribute(name, value)
158
+ unless attribute_writable?(name.to_s)
159
+ raise Errors::ReadonlyAttribute.new(name, value)
160
+ end
107
161
  write_attribute(name, value)
108
- save(:validate => false)
162
+ save(validate: false)
109
163
  end
110
164
 
111
- # Update the document attributes in the datbase.
165
+ # Update the document attributes in the database.
112
166
  #
113
167
  # @example Update the document's attributes
114
168
  # document.update_attributes(:title => "Sir")
@@ -132,31 +186,29 @@ module Mongoid #:nodoc:
132
186
  #
133
187
  # @return [ true, false ] True if validation passed.
134
188
  def update_attributes!(attributes = {}, options = {})
135
- update_attributes(attributes, options).tap do |result|
136
- unless result
137
- self.class.fail_validate!(self) if errors.any?
138
- self.class.fail_callback!(self, :update_attributes!)
139
- end
189
+ result = update_attributes(attributes, options)
190
+ unless result
191
+ self.class.fail_validate!(self) unless errors.empty?
192
+ self.class.fail_callback!(self, :update_attributes!)
140
193
  end
194
+ result
141
195
  end
142
196
 
143
- # Upsert the document - will perform an insert if the document is new, and
144
- # update if not.
197
+ # Perform an upsert of the document. If the document does not exist in the
198
+ # database, then Mongo will insert a new one, otherwise the fields will get
199
+ # overwritten with new values on the existing document.
145
200
  #
146
201
  # @example Upsert the document.
147
202
  # document.upsert
148
203
  #
149
- # @param [ Hash ] options Options to pass to the upsert.
204
+ # @param [ Hash ] options The validation options.
150
205
  #
151
- # @return [ true, false ] True is success, false if not.
206
+ # @return [ true ] True.
207
+ #
208
+ # @since 3.0.0
152
209
  def upsert(options = {})
153
- if new_record?
154
- insert(options).persisted?
155
- else
156
- update(options)
157
- end
210
+ Operations.upsert(self, options).persist
158
211
  end
159
- alias :save :upsert
160
212
 
161
213
  module ClassMethods #:nodoc:
162
214
 
@@ -174,7 +226,9 @@ module Mongoid #:nodoc:
174
226
  # @return [ Document ] The newly created document.
175
227
  def create(attributes = {}, options = {}, &block)
176
228
  _creating do
177
- new(attributes, options, &block).tap { |doc| doc.save }
229
+ doc = new(attributes, options, &block)
230
+ doc.save
231
+ doc
178
232
  end
179
233
  end
180
234
 
@@ -193,10 +247,10 @@ module Mongoid #:nodoc:
193
247
  # @return [ Document ] The newly created document.
194
248
  def create!(attributes = {}, options = {}, &block)
195
249
  _creating do
196
- new(attributes, options, &block).tap do |doc|
197
- fail_validate!(doc) if doc.insert.errors.any?
198
- fail_callback!(doc, :create!) if doc.new?
199
- end
250
+ doc = new(attributes, options, &block)
251
+ fail_validate!(doc) unless doc.insert.errors.empty?
252
+ fail_callback!(doc, :create!) if doc.new_record?
253
+ doc
200
254
  end
201
255
  end
202
256
 
@@ -216,11 +270,12 @@ module Mongoid #:nodoc:
216
270
  def delete_all(conditions = nil)
217
271
  conds = conditions || {}
218
272
  selector = conds[:conditions] || conds
219
- selector.merge!(:_type => name) if hereditary?
220
- collection.find(selector).count.tap do
221
- collection.remove(selector, Safety.merge_safety_options)
222
- Threaded.clear_options!
223
- end
273
+ selector.merge!(_type: name) if hereditary?
274
+ coll = collection
275
+ deleted = coll.find(selector).count
276
+ coll.find(selector).remove_all
277
+ Threaded.clear_options!
278
+ deleted
224
279
  end
225
280
 
226
281
  # Delete all documents given the supplied conditions. If no conditions
@@ -239,9 +294,9 @@ module Mongoid #:nodoc:
239
294
  def destroy_all(conditions = nil)
240
295
  conds = conditions || {}
241
296
  documents = where(conds[:conditions] || conds)
242
- documents.count.tap do
243
- documents.each { |doc| doc.destroy }
244
- end
297
+ destroyed = documents.count
298
+ documents.each { |doc| doc.destroy }
299
+ destroyed
245
300
  end
246
301
 
247
302
  # Raise an error if validation failed.
@@ -1,14 +1,13 @@
1
1
  # encoding: utf-8
2
- require "singleton"
3
2
  require "mongoid"
4
3
  require "mongoid/config"
5
4
  require "mongoid/railties/document"
6
5
  require "rails"
7
6
  require "rails/mongoid"
8
7
 
9
- module Rails #:nodoc:
10
- module Mongoid #:nodoc:
11
- class Railtie < Rails::Railtie #:nodoc:
8
+ module Rails
9
+ module Mongoid
10
+ class Railtie < Rails::Railtie
12
11
 
13
12
  # Determine which generator to use. app_generators was introduced after
14
13
  # 3.0.0.
@@ -23,7 +22,7 @@ module Rails #:nodoc:
23
22
  config.respond_to?(:app_generators) ? :app_generators : :generators
24
23
  end
25
24
 
26
- # Maping of rescued exceptions to HTTP responses
25
+ # Mapping of rescued exceptions to HTTP responses
27
26
  #
28
27
  # @example
29
28
  # railtie.rescue_responses
@@ -38,7 +37,7 @@ module Rails #:nodoc:
38
37
  }
39
38
  end
40
39
 
41
- config.send(generator).orm :mongoid, :migration => false
40
+ config.send(generator).orm :mongoid, migration: false
42
41
 
43
42
  if config.action_dispatch.rescue_responses
44
43
  config.action_dispatch.rescue_responses.merge!(rescue_responses)
@@ -73,15 +72,22 @@ module Rails #:nodoc:
73
72
  # # - host: localhost
74
73
  # # port: 27019
75
74
  # allow_dynamic_fields: false
76
- # parameterize_keys: false
77
75
  # persist_in_safe_mode: false
78
76
  #
79
77
  initializer "setup database" do
80
78
  config_file = Rails.root.join("config", "mongoid.yml")
81
- # @todo: Durran: Remove extra check when #1291 complete.
82
- if config_file.file? &&
83
- YAML.load(ERB.new(File.read(config_file)).result)[Rails.env].values.flatten.any?
84
- ::Mongoid.load!(config_file)
79
+ if config_file.file?
80
+ begin
81
+ ::Mongoid.load!(config_file)
82
+ rescue ::Mongoid::Errors::NoSessionsConfig => e
83
+ handle_configuration_error(e)
84
+ rescue ::Mongoid::Errors::NoDefaultSession => e
85
+ handle_configuration_error(e)
86
+ rescue ::Mongoid::Errors::NoSessionDatabase => e
87
+ handle_configuration_error(e)
88
+ rescue ::Mongoid::Errors::NoSessionHosts => e
89
+ handle_configuration_error(e)
90
+ end
85
91
  end
86
92
  end
87
93
 
@@ -139,6 +145,15 @@ module Rails #:nodoc:
139
145
  end
140
146
  end
141
147
  end
148
+
149
+ # Rails runs all initializers first before getting into any generator
150
+ # code, so we have no way in the intitializer to know if we are
151
+ # generating a mongoid.yml. So instead of failing, we catch all the
152
+ # errors and print them out.
153
+ def handle_configuration_error(e)
154
+ puts "There is a configuration error with the current mongoid.yml."
155
+ puts e.message
156
+ end
142
157
  end
143
158
  end
144
159
  end