mongoid 2.4.9 → 3.0.0.rc

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (351) hide show
  1. data/CHANGELOG.md +869 -8
  2. data/LICENSE +1 -1
  3. data/README.md +10 -11
  4. data/Rakefile +2 -17
  5. data/lib/config/locales/en.yml +441 -51
  6. data/lib/mongoid/atomic/modifiers.rb +2 -2
  7. data/lib/mongoid/atomic/paths/embedded/many.rb +6 -6
  8. data/lib/mongoid/atomic/paths/embedded/one.rb +5 -5
  9. data/lib/mongoid/atomic/paths/embedded.rb +4 -5
  10. data/lib/mongoid/atomic/paths/root.rb +4 -5
  11. data/lib/mongoid/atomic.rb +16 -6
  12. data/lib/mongoid/attributes/processing.rb +14 -10
  13. data/lib/mongoid/attributes/readonly.rb +56 -0
  14. data/lib/mongoid/attributes.rb +95 -32
  15. data/lib/mongoid/callbacks.rb +100 -42
  16. data/lib/mongoid/collections/retry.rb +2 -3
  17. data/lib/mongoid/components.rb +10 -22
  18. data/lib/mongoid/config/environment.rb +4 -3
  19. data/lib/mongoid/config/inflections.rb +6 -0
  20. data/lib/mongoid/config/options.rb +1 -1
  21. data/lib/mongoid/config/validators/option.rb +25 -0
  22. data/lib/mongoid/config/validators/session.rb +140 -0
  23. data/lib/mongoid/config/validators.rb +3 -0
  24. data/lib/mongoid/config.rb +87 -233
  25. data/lib/mongoid/contextual/aggregable/memory.rb +98 -0
  26. data/lib/mongoid/contextual/aggregable/mongo.rb +181 -0
  27. data/lib/mongoid/contextual/atomic.rb +179 -0
  28. data/lib/mongoid/contextual/command.rb +43 -0
  29. data/lib/mongoid/contextual/find_and_modify.rb +66 -0
  30. data/lib/mongoid/contextual/map_reduce.rb +273 -0
  31. data/lib/mongoid/contextual/memory.rb +383 -0
  32. data/lib/mongoid/contextual/mongo.rb +543 -0
  33. data/lib/mongoid/contextual.rb +50 -0
  34. data/lib/mongoid/copyable.rb +2 -2
  35. data/lib/mongoid/criteria.rb +436 -248
  36. data/lib/mongoid/criterion/inspection.rb +14 -8
  37. data/lib/mongoid/criterion/scoping.rb +114 -44
  38. data/lib/mongoid/dirty.rb +152 -67
  39. data/lib/mongoid/document.rb +68 -49
  40. data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
  41. data/lib/mongoid/errors/callback.rb +5 -6
  42. data/lib/mongoid/errors/delete_restriction.rb +29 -0
  43. data/lib/mongoid/errors/document_not_found.rb +98 -17
  44. data/lib/mongoid/errors/eager_load.rb +3 -6
  45. data/lib/mongoid/errors/invalid_collection.rb +3 -3
  46. data/lib/mongoid/errors/invalid_config_option.rb +27 -0
  47. data/lib/mongoid/errors/invalid_database.rb +3 -3
  48. data/lib/mongoid/errors/invalid_field.rb +54 -8
  49. data/lib/mongoid/errors/invalid_field_option.rb +35 -0
  50. data/lib/mongoid/errors/invalid_find.rb +3 -3
  51. data/lib/mongoid/errors/invalid_index.rb +28 -0
  52. data/lib/mongoid/errors/invalid_options.rb +4 -4
  53. data/lib/mongoid/errors/invalid_scope.rb +24 -0
  54. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
  55. data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
  56. data/lib/mongoid/errors/invalid_time.rb +3 -6
  57. data/lib/mongoid/errors/inverse_not_found.rb +29 -0
  58. data/lib/mongoid/errors/mixed_relations.rb +4 -9
  59. data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
  60. data/lib/mongoid/errors/mongoid_error.rb +54 -3
  61. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
  62. data/lib/mongoid/errors/no_default_session.rb +23 -0
  63. data/lib/mongoid/errors/no_environment.rb +3 -3
  64. data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
  65. data/lib/mongoid/errors/no_parent.rb +24 -0
  66. data/lib/mongoid/errors/no_session_config.rb +22 -0
  67. data/lib/mongoid/errors/no_session_database.rb +27 -0
  68. data/lib/mongoid/errors/no_session_hosts.rb +27 -0
  69. data/lib/mongoid/errors/no_sessions_config.rb +20 -0
  70. data/lib/mongoid/errors/readonly_attribute.rb +25 -0
  71. data/lib/mongoid/errors/scope_overwrite.rb +4 -4
  72. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +4 -4
  73. data/lib/mongoid/errors/unknown_attribute.rb +25 -0
  74. data/lib/mongoid/errors/unsaved_document.rb +4 -8
  75. data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
  76. data/lib/mongoid/errors/unsupported_version.rb +4 -4
  77. data/lib/mongoid/errors/validations.rb +7 -6
  78. data/lib/mongoid/errors/versioning_not_on_root.rb +23 -0
  79. data/lib/mongoid/errors.rb +22 -1
  80. data/lib/mongoid/extensions/array.rb +127 -0
  81. data/lib/mongoid/extensions/big_decimal.rb +42 -0
  82. data/lib/mongoid/extensions/boolean.rb +24 -0
  83. data/lib/mongoid/extensions/date.rb +70 -0
  84. data/lib/mongoid/extensions/date_time.rb +68 -0
  85. data/lib/mongoid/extensions/false_class.rb +26 -0
  86. data/lib/mongoid/extensions/float.rb +44 -0
  87. data/lib/mongoid/extensions/hash.rb +91 -0
  88. data/lib/mongoid/extensions/integer.rb +54 -0
  89. data/lib/mongoid/extensions/module.rb +28 -0
  90. data/lib/mongoid/extensions/nil_class.rb +21 -0
  91. data/lib/mongoid/extensions/object.rb +188 -0
  92. data/lib/mongoid/extensions/object_id.rb +53 -0
  93. data/lib/mongoid/extensions/range.rb +55 -0
  94. data/lib/mongoid/extensions/regexp.rb +27 -0
  95. data/lib/mongoid/extensions/set.rb +55 -0
  96. data/lib/mongoid/extensions/string.rb +155 -0
  97. data/lib/mongoid/extensions/symbol.rb +54 -0
  98. data/lib/mongoid/extensions/time.rb +78 -0
  99. data/lib/mongoid/extensions/time_with_zone.rb +55 -0
  100. data/lib/mongoid/extensions/true_class.rb +26 -0
  101. data/lib/mongoid/extensions.rb +28 -76
  102. data/lib/mongoid/factory.rb +4 -4
  103. data/lib/mongoid/fields/foreign_key.rb +134 -0
  104. data/lib/mongoid/fields/localized.rb +73 -0
  105. data/lib/mongoid/fields/standard.rb +268 -0
  106. data/lib/mongoid/fields/validators/macro.rb +83 -0
  107. data/lib/mongoid/fields/validators.rb +2 -0
  108. data/lib/mongoid/fields.rb +129 -194
  109. data/lib/mongoid/finders.rb +42 -43
  110. data/lib/mongoid/hierarchy.rb +25 -14
  111. data/lib/mongoid/identity_map.rb +39 -12
  112. data/lib/mongoid/indexes/validators/options.rb +80 -0
  113. data/lib/mongoid/indexes.rb +66 -15
  114. data/lib/mongoid/inspection.rb +1 -1
  115. data/lib/mongoid/javascript.rb +1 -1
  116. data/lib/mongoid/json.rb +2 -2
  117. data/lib/mongoid/loggable.rb +69 -0
  118. data/lib/mongoid/matchers/all.rb +7 -8
  119. data/lib/mongoid/matchers/and.rb +3 -3
  120. data/lib/mongoid/matchers/default.rb +6 -4
  121. data/lib/mongoid/matchers/exists.rb +2 -2
  122. data/lib/mongoid/matchers/gt.rb +2 -2
  123. data/lib/mongoid/matchers/gte.rb +2 -2
  124. data/lib/mongoid/matchers/in.rb +3 -7
  125. data/lib/mongoid/matchers/lt.rb +2 -2
  126. data/lib/mongoid/matchers/lte.rb +2 -2
  127. data/lib/mongoid/matchers/ne.rb +2 -2
  128. data/lib/mongoid/matchers/nin.rb +2 -2
  129. data/lib/mongoid/matchers/or.rb +2 -2
  130. data/lib/mongoid/matchers/size.rb +2 -2
  131. data/lib/mongoid/matchers/strategies.rb +3 -3
  132. data/lib/mongoid/matchers.rb +1 -1
  133. data/lib/mongoid/multi_parameter_attributes.rb +8 -10
  134. data/lib/mongoid/nested_attributes.rb +17 -9
  135. data/lib/mongoid/observer.rb +1 -2
  136. data/lib/mongoid/paranoia.rb +13 -18
  137. data/lib/mongoid/persistence/atomic/add_to_set.rb +5 -9
  138. data/lib/mongoid/persistence/atomic/bit.rb +5 -7
  139. data/lib/mongoid/persistence/atomic/inc.rb +5 -7
  140. data/lib/mongoid/persistence/atomic/operation.rb +45 -6
  141. data/lib/mongoid/persistence/atomic/pop.rb +5 -7
  142. data/lib/mongoid/persistence/atomic/pull.rb +5 -7
  143. data/lib/mongoid/persistence/atomic/pull_all.rb +5 -7
  144. data/lib/mongoid/persistence/atomic/push.rb +4 -10
  145. data/lib/mongoid/persistence/atomic/push_all.rb +4 -10
  146. data/lib/mongoid/persistence/atomic/rename.rb +6 -7
  147. data/lib/mongoid/persistence/atomic/sets.rb +5 -7
  148. data/lib/mongoid/persistence/atomic/unset.rb +4 -5
  149. data/lib/mongoid/persistence/atomic.rb +2 -2
  150. data/lib/mongoid/persistence/deletion.rb +2 -2
  151. data/lib/mongoid/persistence/insertion.rb +10 -16
  152. data/lib/mongoid/persistence/modification.rb +5 -9
  153. data/lib/mongoid/persistence/operations/embedded/insert.rb +7 -6
  154. data/lib/mongoid/persistence/operations/embedded/remove.rb +5 -5
  155. data/lib/mongoid/persistence/operations/insert.rb +4 -4
  156. data/lib/mongoid/persistence/operations/remove.rb +4 -4
  157. data/lib/mongoid/persistence/operations/update.rb +5 -5
  158. data/lib/mongoid/persistence/operations.rb +6 -19
  159. data/lib/mongoid/persistence.rb +64 -27
  160. data/lib/mongoid/railtie.rb +26 -11
  161. data/lib/mongoid/railties/database.rake +22 -108
  162. data/lib/mongoid/relations/accessors.rb +119 -19
  163. data/lib/mongoid/relations/auto_save.rb +59 -5
  164. data/lib/mongoid/relations/binding.rb +211 -2
  165. data/lib/mongoid/relations/bindings/embedded/in.rb +16 -22
  166. data/lib/mongoid/relations/bindings/embedded/many.rb +9 -50
  167. data/lib/mongoid/relations/bindings/embedded/one.rb +10 -16
  168. data/lib/mongoid/relations/bindings/referenced/in.rb +31 -57
  169. data/lib/mongoid/relations/bindings/referenced/many.rb +8 -20
  170. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -19
  171. data/lib/mongoid/relations/bindings/referenced/one.rb +10 -24
  172. data/lib/mongoid/relations/builder.rb +3 -3
  173. data/lib/mongoid/relations/builders/embedded/in.rb +5 -5
  174. data/lib/mongoid/relations/builders/embedded/many.rb +12 -12
  175. data/lib/mongoid/relations/builders/embedded/one.rb +6 -6
  176. data/lib/mongoid/relations/builders/nested_attributes/many.rb +8 -8
  177. data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -4
  178. data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
  179. data/lib/mongoid/relations/builders/referenced/many.rb +5 -5
  180. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +7 -5
  181. data/lib/mongoid/relations/builders/referenced/one.rb +5 -5
  182. data/lib/mongoid/relations/builders.rb +19 -16
  183. data/lib/mongoid/relations/cascading/delete.rb +12 -4
  184. data/lib/mongoid/relations/cascading/destroy.rb +3 -3
  185. data/lib/mongoid/relations/cascading/nullify.rb +3 -3
  186. data/lib/mongoid/relations/cascading/restrict.rb +37 -0
  187. data/lib/mongoid/relations/cascading.rb +6 -4
  188. data/lib/mongoid/relations/constraint.rb +4 -3
  189. data/lib/mongoid/relations/conversions.rb +5 -6
  190. data/lib/mongoid/relations/cyclic.rb +7 -7
  191. data/lib/mongoid/relations/embedded/batchable.rb +346 -0
  192. data/lib/mongoid/relations/embedded/in.rb +23 -12
  193. data/lib/mongoid/relations/embedded/many.rb +99 -148
  194. data/lib/mongoid/relations/embedded/one.rb +25 -14
  195. data/lib/mongoid/relations/macros.rb +105 -60
  196. data/lib/mongoid/relations/many.rb +93 -14
  197. data/lib/mongoid/relations/metadata.rb +231 -45
  198. data/lib/mongoid/relations/nested_builder.rb +3 -5
  199. data/lib/mongoid/relations/one.rb +14 -2
  200. data/lib/mongoid/relations/options.rb +2 -2
  201. data/lib/mongoid/relations/polymorphic.rb +9 -9
  202. data/lib/mongoid/relations/proxy.rb +60 -31
  203. data/lib/mongoid/relations/referenced/in.rb +40 -15
  204. data/lib/mongoid/relations/referenced/many.rb +116 -122
  205. data/lib/mongoid/relations/referenced/many_to_many.rb +101 -46
  206. data/lib/mongoid/relations/referenced/one.rb +34 -13
  207. data/lib/mongoid/relations/reflections.rb +3 -3
  208. data/lib/mongoid/relations/synchronization.rb +19 -23
  209. data/lib/mongoid/relations/targets/enumerable.rb +86 -57
  210. data/lib/mongoid/relations/touchable.rb +32 -0
  211. data/lib/mongoid/relations.rb +6 -6
  212. data/lib/mongoid/reloading.rb +12 -14
  213. data/lib/mongoid/scoping.rb +329 -0
  214. data/lib/mongoid/serialization.rb +13 -30
  215. data/lib/mongoid/sessions/factory.rb +106 -0
  216. data/lib/mongoid/sessions/mongo_uri.rb +93 -0
  217. data/lib/mongoid/sessions/validators/storage.rb +49 -0
  218. data/lib/mongoid/sessions/validators.rb +2 -0
  219. data/lib/mongoid/sessions.rb +359 -0
  220. data/lib/mongoid/sharding.rb +6 -6
  221. data/lib/mongoid/state.rb +6 -7
  222. data/lib/mongoid/threaded/lifecycle.rb +21 -21
  223. data/lib/mongoid/threaded/sessions.rb +0 -0
  224. data/lib/mongoid/threaded.rb +167 -59
  225. data/lib/mongoid/timestamps/created.rb +8 -4
  226. data/lib/mongoid/timestamps/timeless.rb +6 -4
  227. data/lib/mongoid/timestamps/updated.rb +3 -3
  228. data/lib/mongoid/timestamps.rb +1 -1
  229. data/lib/mongoid/unit_of_work.rb +61 -0
  230. data/lib/mongoid/validations/associated.rb +2 -2
  231. data/lib/mongoid/validations/format.rb +2 -2
  232. data/lib/mongoid/validations/presence.rb +34 -4
  233. data/lib/mongoid/validations/uniqueness.rb +103 -25
  234. data/lib/mongoid/validations.rb +62 -20
  235. data/lib/mongoid/version.rb +2 -2
  236. data/lib/mongoid/versioning.rb +25 -26
  237. data/lib/mongoid.rb +24 -39
  238. data/lib/rack/mongoid/middleware/identity_map.rb +3 -3
  239. data/lib/rails/generators/mongoid/config/config_generator.rb +1 -1
  240. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +59 -19
  241. data/lib/rails/generators/mongoid/model/model_generator.rb +7 -7
  242. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +2 -2
  243. data/lib/rails/generators/mongoid/observer/observer_generator.rb +4 -4
  244. data/lib/rails/generators/mongoid_generator.rb +5 -5
  245. data/lib/rails/mongoid.rb +69 -25
  246. metadata +93 -155
  247. data/lib/config/locales/bg.yml +0 -61
  248. data/lib/config/locales/de.yml +0 -61
  249. data/lib/config/locales/en-GB.yml +0 -64
  250. data/lib/config/locales/es.yml +0 -59
  251. data/lib/config/locales/fr.yml +0 -62
  252. data/lib/config/locales/hi.yml +0 -53
  253. data/lib/config/locales/hu.yml +0 -64
  254. data/lib/config/locales/id.yml +0 -62
  255. data/lib/config/locales/it.yml +0 -59
  256. data/lib/config/locales/ja.yml +0 -57
  257. data/lib/config/locales/kr.yml +0 -54
  258. data/lib/config/locales/nl.yml +0 -61
  259. data/lib/config/locales/pl.yml +0 -59
  260. data/lib/config/locales/pt-BR.yml +0 -60
  261. data/lib/config/locales/pt.yml +0 -60
  262. data/lib/config/locales/ro.yml +0 -66
  263. data/lib/config/locales/ru.yml +0 -61
  264. data/lib/config/locales/sv.yml +0 -60
  265. data/lib/config/locales/vi.yml +0 -62
  266. data/lib/config/locales/zh-CN.yml +0 -53
  267. data/lib/mongoid/collection.rb +0 -157
  268. data/lib/mongoid/collections/master.rb +0 -45
  269. data/lib/mongoid/collections/operations.rb +0 -44
  270. data/lib/mongoid/collections.rb +0 -120
  271. data/lib/mongoid/config/database.rb +0 -181
  272. data/lib/mongoid/config/replset_database.rb +0 -80
  273. data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
  274. data/lib/mongoid/contexts/enumerable.rb +0 -313
  275. data/lib/mongoid/contexts/mongo.rb +0 -485
  276. data/lib/mongoid/contexts.rb +0 -25
  277. data/lib/mongoid/criterion/builder.rb +0 -34
  278. data/lib/mongoid/criterion/complex.rb +0 -84
  279. data/lib/mongoid/criterion/creational.rb +0 -34
  280. data/lib/mongoid/criterion/exclusion.rb +0 -108
  281. data/lib/mongoid/criterion/inclusion.rb +0 -290
  282. data/lib/mongoid/criterion/optional.rb +0 -259
  283. data/lib/mongoid/criterion/selector.rb +0 -177
  284. data/lib/mongoid/cursor.rb +0 -88
  285. data/lib/mongoid/default_scope.rb +0 -36
  286. data/lib/mongoid/errors/invalid_type.rb +0 -25
  287. data/lib/mongoid/extensions/array/deep_copy.rb +0 -25
  288. data/lib/mongoid/extensions/array/deletion.rb +0 -29
  289. data/lib/mongoid/extensions/false_class/equality.rb +0 -26
  290. data/lib/mongoid/extensions/hash/criteria_helpers.rb +0 -47
  291. data/lib/mongoid/extensions/hash/deep_copy.rb +0 -25
  292. data/lib/mongoid/extensions/hash/scoping.rb +0 -25
  293. data/lib/mongoid/extensions/integer/checks.rb +0 -23
  294. data/lib/mongoid/extensions/nil/collectionization.rb +0 -23
  295. data/lib/mongoid/extensions/object/checks.rb +0 -29
  296. data/lib/mongoid/extensions/object/deep_copy.rb +0 -21
  297. data/lib/mongoid/extensions/object/reflections.rb +0 -48
  298. data/lib/mongoid/extensions/object/substitutable.rb +0 -15
  299. data/lib/mongoid/extensions/object/yoda.rb +0 -44
  300. data/lib/mongoid/extensions/object_id/conversions.rb +0 -60
  301. data/lib/mongoid/extensions/proc/scoping.rb +0 -25
  302. data/lib/mongoid/extensions/string/checks.rb +0 -36
  303. data/lib/mongoid/extensions/string/conversions.rb +0 -22
  304. data/lib/mongoid/extensions/string/inflections.rb +0 -118
  305. data/lib/mongoid/extensions/symbol/checks.rb +0 -23
  306. data/lib/mongoid/extensions/symbol/inflections.rb +0 -67
  307. data/lib/mongoid/extensions/true_class/equality.rb +0 -26
  308. data/lib/mongoid/extras.rb +0 -31
  309. data/lib/mongoid/fields/internal/array.rb +0 -76
  310. data/lib/mongoid/fields/internal/big_decimal.rb +0 -63
  311. data/lib/mongoid/fields/internal/bignum.rb +0 -10
  312. data/lib/mongoid/fields/internal/binary.rb +0 -11
  313. data/lib/mongoid/fields/internal/boolean.rb +0 -58
  314. data/lib/mongoid/fields/internal/date.rb +0 -51
  315. data/lib/mongoid/fields/internal/date_time.rb +0 -28
  316. data/lib/mongoid/fields/internal/false_class.rb +0 -10
  317. data/lib/mongoid/fields/internal/fixnum.rb +0 -10
  318. data/lib/mongoid/fields/internal/float.rb +0 -47
  319. data/lib/mongoid/fields/internal/foreign_keys/array.rb +0 -88
  320. data/lib/mongoid/fields/internal/foreign_keys/object.rb +0 -56
  321. data/lib/mongoid/fields/internal/hash.rb +0 -11
  322. data/lib/mongoid/fields/internal/integer.rb +0 -59
  323. data/lib/mongoid/fields/internal/localized.rb +0 -62
  324. data/lib/mongoid/fields/internal/nil_class.rb +0 -53
  325. data/lib/mongoid/fields/internal/object.rb +0 -11
  326. data/lib/mongoid/fields/internal/object_id.rb +0 -46
  327. data/lib/mongoid/fields/internal/range.rb +0 -61
  328. data/lib/mongoid/fields/internal/set.rb +0 -57
  329. data/lib/mongoid/fields/internal/string.rb +0 -42
  330. data/lib/mongoid/fields/internal/symbol.rb +0 -43
  331. data/lib/mongoid/fields/internal/time.rb +0 -23
  332. data/lib/mongoid/fields/internal/time_with_zone.rb +0 -23
  333. data/lib/mongoid/fields/internal/timekeeping.rb +0 -122
  334. data/lib/mongoid/fields/internal/true_class.rb +0 -10
  335. data/lib/mongoid/fields/mappings.rb +0 -42
  336. data/lib/mongoid/fields/serializable.rb +0 -270
  337. data/lib/mongoid/identity.rb +0 -92
  338. data/lib/mongoid/keys.rb +0 -144
  339. data/lib/mongoid/logger.rb +0 -45
  340. data/lib/mongoid/multi_database.rb +0 -31
  341. data/lib/mongoid/named_scope.rb +0 -166
  342. data/lib/mongoid/relations/embedded/atomic/operation.rb +0 -63
  343. data/lib/mongoid/relations/embedded/atomic/pull.rb +0 -65
  344. data/lib/mongoid/relations/embedded/atomic/push_all.rb +0 -59
  345. data/lib/mongoid/relations/embedded/atomic/set.rb +0 -61
  346. data/lib/mongoid/relations/embedded/atomic/unset.rb +0 -41
  347. data/lib/mongoid/relations/embedded/atomic.rb +0 -89
  348. data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
  349. data/lib/mongoid/relations/referenced/batch.rb +0 -73
  350. data/lib/mongoid/safety.rb +0 -105
  351. data/lib/mongoid/scope.rb +0 -31
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
2
+ module Mongoid
3
3
 
4
4
  # Mongoid's implementation of Rails' nested attributes.
5
5
  module NestedAttributes
@@ -7,12 +7,14 @@ module Mongoid #:nodoc:
7
7
 
8
8
  included do
9
9
  class_attribute :nested_attributes
10
- self.nested_attributes = []
10
+ self.nested_attributes = {}
11
11
  end
12
12
 
13
- module ClassMethods #:nodoc:
13
+ module ClassMethods
14
14
 
15
- REJECT_ALL_BLANK_PROC = proc { |attributes| attributes.all? { |key, value| key == '_destroy' || value.blank? } }
15
+ REJECT_ALL_BLANK_PROC = ->(attributes){
16
+ attributes.all? { |key, value| key == '_destroy' || value.blank? }
17
+ }
16
18
 
17
19
  # Used when needing to update related models from a parent relation. Can
18
20
  # be used on embedded or referenced relations.
@@ -33,18 +35,24 @@ module Mongoid #:nodoc:
33
35
  # by a hash of options.
34
36
  #
35
37
  # @option *args [ true, false ] :allow_destroy Can deletion occur?
36
- # @option *args [ Proc, Symbol ] :reject_if Block or symbol pointing to a class method to reject documents with.
38
+ # @option *args [ Proc, Symbol ] :reject_if Block or symbol pointing
39
+ # to a class method to reject documents with.
37
40
  # @option *args [ Integer ] :limit The max number to create.
38
41
  # @option *args [ true, false ] :update_only Only update existing docs.
39
42
  def accepts_nested_attributes_for(*args)
40
43
  options = args.extract_options!
41
44
  options[:reject_if] = REJECT_ALL_BLANK_PROC if options[:reject_if] == :all_blank
42
45
  args.each do |name|
43
- self.nested_attributes += [ "#{name}_attributes=" ]
44
- define_method("#{name}_attributes=") do |attrs|
46
+ meth = "#{name}_attributes="
47
+ self.nested_attributes["#{name}_attributes"] = meth
48
+ metadata = relations[name.to_s]
49
+ unless metadata
50
+ raise Errors::NestedAttributesMetadataNotFound.new(self, name)
51
+ end
52
+ autosave(metadata.merge!(autosave: true))
53
+ re_define_method(meth) do |attrs|
45
54
  _assigning do
46
- relation = relations[name.to_s]
47
- relation.nested_builder(attrs, options).build(self)
55
+ metadata.nested_builder(attrs, options).build(self)
48
56
  end
49
57
  end
50
58
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
2
+ module Mongoid
3
3
 
4
4
  # Observer classes respond to life cycle callbacks to implement trigger-like
5
5
  # behavior outside the original class. This is a great way to reduce the
@@ -176,6 +176,5 @@ module Mongoid #:nodoc:
176
176
  return false unless klass.respond_to?(:observers)
177
177
  klass.observers.disabled_for?(self) || Mongoid.observers.disabled_for?(self)
178
178
  end
179
-
180
179
  end
181
180
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
2
+ module Mongoid
3
3
 
4
4
  # Include this module to get soft deletion of root level documents.
5
5
  # This will add a deleted_at field to the +Document+, managed automatically.
@@ -14,7 +14,7 @@ module Mongoid #:nodoc:
14
14
  extend ActiveSupport::Concern
15
15
 
16
16
  included do
17
- field :deleted_at, :type => Time
17
+ field :deleted_at, type: Time
18
18
  self.paranoid = true
19
19
  end
20
20
 
@@ -56,11 +56,8 @@ module Mongoid #:nodoc:
56
56
  # @since 1.0.0
57
57
  def remove(options = {})
58
58
  time = self.deleted_at = Time.now
59
- paranoid_collection.update(
60
- atomic_selector,
61
- { "$set" => { paranoid_field => time }},
62
- Safety.merge_safety_options(options)
63
- )
59
+ paranoid_collection.find(atomic_selector).
60
+ update({ "$set" => { paranoid_field => time }})
64
61
  cascade!
65
62
  @destroyed = true
66
63
  IdentityMap.remove(self)
@@ -78,7 +75,7 @@ module Mongoid #:nodoc:
78
75
  #
79
76
  # @since 1.0.0
80
77
  def destroyed?
81
- @destroyed || !!deleted_at
78
+ (@destroyed ||= false) || !!deleted_at
82
79
  end
83
80
 
84
81
  # Restores a previously soft-deleted document. Handles this by removing the
@@ -91,10 +88,8 @@ module Mongoid #:nodoc:
91
88
  #
92
89
  # @since 1.0.0
93
90
  def restore
94
- paranoid_collection.update(
95
- atomic_selector,
96
- { "$unset" => { paranoid_field => true }}
97
- )
91
+ paranoid_collection.find(atomic_selector).
92
+ update({ "$unset" => { paranoid_field => true }})
98
93
  attributes.delete("deleted_at")
99
94
  end
100
95
 
@@ -124,21 +119,21 @@ module Mongoid #:nodoc:
124
119
  embedded? ? "#{atomic_position}.deleted_at" : "deleted_at"
125
120
  end
126
121
 
127
- module ClassMethods #:nodoc:
122
+ module ClassMethods
128
123
 
129
124
  # Override the default +Criteria+ accessor to only get existing
130
- # documents. Passes all arguments up to +NamedScope.criteria+
125
+ # documents.
131
126
  #
132
127
  # @example Override the criteria.
133
- # Person.criteria
128
+ # Person.queryable
134
129
  #
135
130
  # @param [ Array ] args The arguments.
136
131
  #
137
132
  # @return [ Criteria ] The paranoid compliant criteria.
138
133
  #
139
- # @since 1.0.0
140
- def criteria(embedded = false, scoped = true)
141
- scoped ? super.where(:deleted_at => nil) : super
134
+ # @since 3.0.0
135
+ def queryable
136
+ super.where(deleted_at: nil)
142
137
  end
143
138
 
144
139
  # Find deleted documents
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Persistence #:nodoc:
4
- module Atomic #:nodoc:
2
+ module Mongoid
3
+ module Persistence
4
+ module Atomic
5
5
 
6
6
  # This class provides the ability to perform an explicit $addToSet
7
7
  # modification on a specific field.
@@ -23,12 +23,8 @@ module Mongoid #:nodoc:
23
23
  Array.wrap(value).each do |val|
24
24
  values.push(val) unless values.include?(val)
25
25
  end
26
- values.tap do
27
- if document.persisted?
28
- collection.update(document.atomic_selector, operation("$addToSet"), options)
29
- document.remove_change(field)
30
- end
31
- end
26
+ execute("$addToSet")
27
+ values
32
28
  end
33
29
  end
34
30
 
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Persistence #:nodoc:
4
- module Atomic #:nodoc:
2
+ module Mongoid
3
+ module Persistence
4
+ module Atomic
5
5
 
6
6
  # This operation is for performing $bit atomic operations against the
7
7
  # database.
@@ -25,10 +25,8 @@ module Mongoid #:nodoc:
25
25
  result = result | val if bit.to_s == "or"
26
26
  result
27
27
  end
28
- document[field].tap do
29
- collection.update(document.atomic_selector, operation("$bit"), options)
30
- document.remove_change(field)
31
- end
28
+ execute("$bit")
29
+ document[field]
32
30
  end
33
31
  end
34
32
  end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Persistence #:nodoc:
4
- module Atomic #:nodoc:
2
+ module Mongoid
3
+ module Persistence
4
+ module Atomic
5
5
 
6
6
  # This class provides atomic $inc behaviour.
7
7
  class Inc
@@ -19,10 +19,8 @@ module Mongoid #:nodoc:
19
19
  prepare do
20
20
  current = document[field] || 0
21
21
  document[field] = current + value
22
- document[field].tap do
23
- collection.update(document.atomic_selector, operation("$inc"), options)
24
- document.remove_change(field)
25
- end
22
+ execute("$inc")
23
+ document[field]
26
24
  end
27
25
  end
28
26
  end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Persistence #:nodoc:
4
- module Atomic #:nodoc:
2
+ module Mongoid
3
+ module Persistence
4
+ module Atomic
5
5
 
6
6
  # This is the included module for all atomic operation objects.
7
7
  module Operation
@@ -33,7 +33,7 @@ module Mongoid #:nodoc:
33
33
  # @since 2.0.0
34
34
  def initialize(document, field, value, options = {})
35
35
  @document, @field, @value = document, field.to_s, value
36
- @options = Safety.merge_safety_options(options)
36
+ @options = options
37
37
  end
38
38
 
39
39
  # Get the atomic operation to perform.
@@ -75,8 +75,47 @@ module Mongoid #:nodoc:
75
75
  #
76
76
  # @since 2.1.0
77
77
  def prepare
78
- yield(document).tap do
79
- Threaded.clear_options!
78
+ doc = yield(document)
79
+ Threaded.clear_options!
80
+ doc
81
+ end
82
+
83
+ private
84
+
85
+ # Executes the common functionality between operations.
86
+ #
87
+ # @api private
88
+ #
89
+ # @example Execute the operation.
90
+ # operation.execute("$push")
91
+ #
92
+ # @param [ String ] name The name of the operation.
93
+ #
94
+ # @since 3.0.0
95
+ def execute(name)
96
+ if document.persisted?
97
+ collection.find(document.atomic_selector).update(operation(name))
98
+ document.remove_change(field)
99
+ end
100
+ end
101
+
102
+ # Appends items to an array and executes the corresponding $push or
103
+ # $pushAll operation.
104
+ #
105
+ # @api private
106
+ #
107
+ # @example Execute the append.
108
+ # operation.append_with("$push")
109
+ #
110
+ # @param [ String ] name The name of the operation - $push or $pushAll.
111
+ #
112
+ # @since 3.0.0
113
+ def append_with(name)
114
+ prepare do
115
+ document[field] = [] unless document[field]
116
+ docs = document.send(field).concat(value.__array__)
117
+ execute(name)
118
+ docs
80
119
  end
81
120
  end
82
121
  end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Persistence #:nodoc:
4
- module Atomic #:nodoc:
2
+ module Mongoid
3
+ module Persistence
4
+ module Atomic
5
5
 
6
6
  # This class provides the ability to perform an explicit $pop
7
7
  # modification on a specific field.
@@ -21,10 +21,8 @@ module Mongoid #:nodoc:
21
21
  if document[field]
22
22
  values = document.send(field)
23
23
  value > 0 ? values.pop : values.shift
24
- values.tap do
25
- collection.update(document.atomic_selector, operation("$pop"), options)
26
- document.remove_change(field) if document.persisted?
27
- end
24
+ execute("$pop")
25
+ values
28
26
  end
29
27
  end
30
28
  end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Persistence #:nodoc:
4
- module Atomic #:nodoc:
2
+ module Mongoid
3
+ module Persistence
4
+ module Atomic
5
5
 
6
6
  # This class provides the ability to perform an explicit $pull
7
7
  # modification on a specific field.
@@ -21,10 +21,8 @@ module Mongoid #:nodoc:
21
21
  if document[field]
22
22
  values = document.send(field)
23
23
  values.delete(value)
24
- values.tap do
25
- collection.update(document.atomic_selector, operation("$pull"), options)
26
- document.remove_change(field) if document.persisted?
27
- end
24
+ execute("$pull")
25
+ values
28
26
  end
29
27
  end
30
28
  end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Persistence #:nodoc:
4
- module Atomic #:nodoc:
2
+ module Mongoid
3
+ module Persistence
4
+ module Atomic
5
5
 
6
6
  # This class provides the ability to perform an explicit $pullAll
7
7
  # modification on a specific field.
@@ -21,10 +21,8 @@ module Mongoid #:nodoc:
21
21
  if document[field]
22
22
  values = document.send(field)
23
23
  values.delete_if { |val| value.include?(val) }
24
- values.tap do
25
- collection.update(document.atomic_selector, operation("$pullAll"), options)
26
- document.remove_change(field) if document.persisted?
27
- end
24
+ execute("$pullAll")
25
+ values
28
26
  end
29
27
  end
30
28
  end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Persistence #:nodoc:
4
- module Atomic #:nodoc:
2
+ module Mongoid
3
+ module Persistence
4
+ module Atomic
5
5
 
6
6
  # This class provides the ability to perform an explicit $push modification
7
7
  # on a specific field.
@@ -17,13 +17,7 @@ module Mongoid #:nodoc:
17
17
  #
18
18
  # @since 2.0.0
19
19
  def persist
20
- prepare do
21
- document[field] = [] unless document[field]
22
- document.send(field).push(value).tap do |value|
23
- collection.update(document.atomic_selector, operation("$push"), options)
24
- document.remove_change(field)
25
- end
26
- end
20
+ append_with("$push")
27
21
  end
28
22
  end
29
23
  end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Persistence #:nodoc:
4
- module Atomic #:nodoc:
2
+ module Mongoid
3
+ module Persistence
4
+ module Atomic
5
5
 
6
6
  # This class provides the ability to perform an explicit $pushAll modification
7
7
  # on a specific field.
@@ -17,13 +17,7 @@ module Mongoid #:nodoc:
17
17
  #
18
18
  # @since 2.1.0
19
19
  def persist
20
- prepare do
21
- document[field] = [] unless document[field]
22
- document.send(field).concat(value).tap do |value|
23
- collection.update(document.atomic_selector, operation("$pushAll"), options)
24
- document.remove_change(field)
25
- end
26
- end
20
+ append_with("$pushAll")
27
21
  end
28
22
  end
29
23
  end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Persistence #:nodoc:
4
- module Atomic #:nodoc:
2
+ module Mongoid
3
+ module Persistence
4
+ module Atomic
5
5
 
6
6
  # Performs an atomic rename operation.
7
7
  class Rename
@@ -19,10 +19,9 @@ module Mongoid #:nodoc:
19
19
  prepare do
20
20
  @value = value.to_s
21
21
  document[value] = document.attributes.delete(field)
22
- document[value].tap do
23
- collection.update(document.atomic_selector, operation("$rename"), options)
24
- document.remove_change(value)
25
- end
22
+ execute("$rename")
23
+ document.remove_change(value)
24
+ document[value]
26
25
  end
27
26
  end
28
27
  end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Persistence #:nodoc:
4
- module Atomic #:nodoc:
2
+ module Mongoid
3
+ module Persistence
4
+ module Atomic
5
5
 
6
6
  # This class provides atomic $set behaviour.
7
7
  class Sets
@@ -18,10 +18,8 @@ module Mongoid #:nodoc:
18
18
  def persist
19
19
  prepare do
20
20
  document[field] = value
21
- document[field].tap do
22
- collection.update(document.atomic_selector, operation("$set"), options)
23
- document.remove_change(field)
24
- end
21
+ execute("$set")
22
+ document[field]
25
23
  end
26
24
  end
27
25
  end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Persistence #:nodoc:
4
- module Atomic #:nodoc:
2
+ module Mongoid
3
+ module Persistence
4
+ module Atomic
5
5
 
6
6
  # Performs atomic $unset operations.
7
7
  class Unset
@@ -18,8 +18,7 @@ module Mongoid #:nodoc:
18
18
  def persist
19
19
  prepare do
20
20
  document.attributes.delete(field)
21
- collection.update(document.atomic_selector, operation("$unset"), options)
22
- document.remove_change(value)
21
+ execute("$unset")
23
22
  end
24
23
  end
25
24
  end
@@ -12,8 +12,8 @@ require "mongoid/persistence/atomic/rename"
12
12
  require "mongoid/persistence/atomic/sets"
13
13
  require "mongoid/persistence/atomic/unset"
14
14
 
15
- module Mongoid #:nodoc:
16
- module Persistence #:nodoc:
15
+ module Mongoid
16
+ module Persistence
17
17
 
18
18
  # This module provides the explicit atomic operations helpers on the
19
19
  # document itself.
@@ -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 delete operations.
6
6
  module Deletion
@@ -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({ _id: doc.id }).remove
28
28
  end
29
29
  end
30
30
  end