mongoid 2.8.1 → 3.0.0.rc

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (351) hide show
  1. data/CHANGELOG.md +802 -58
  2. data/LICENSE +1 -1
  3. data/README.md +10 -11
  4. data/Rakefile +2 -8
  5. data/lib/config/locales/en.yml +441 -51
  6. data/lib/mongoid.rb +24 -39
  7. data/lib/mongoid/atomic.rb +16 -33
  8. data/lib/mongoid/atomic/modifiers.rb +2 -2
  9. data/lib/mongoid/atomic/paths/embedded.rb +4 -5
  10. data/lib/mongoid/atomic/paths/embedded/many.rb +6 -6
  11. data/lib/mongoid/atomic/paths/embedded/one.rb +5 -5
  12. data/lib/mongoid/atomic/paths/root.rb +4 -5
  13. data/lib/mongoid/attributes.rb +95 -32
  14. data/lib/mongoid/attributes/processing.rb +14 -10
  15. data/lib/mongoid/attributes/readonly.rb +56 -0
  16. data/lib/mongoid/callbacks.rb +90 -27
  17. data/lib/mongoid/collections/retry.rb +2 -3
  18. data/lib/mongoid/components.rb +11 -23
  19. data/lib/mongoid/config.rb +87 -233
  20. data/lib/mongoid/config/environment.rb +5 -6
  21. data/lib/mongoid/config/inflections.rb +6 -0
  22. data/lib/mongoid/config/options.rb +1 -1
  23. data/lib/mongoid/config/validators.rb +3 -0
  24. data/lib/mongoid/config/validators/option.rb +25 -0
  25. data/lib/mongoid/config/validators/session.rb +140 -0
  26. data/lib/mongoid/contextual.rb +50 -0
  27. data/lib/mongoid/contextual/aggregable/memory.rb +98 -0
  28. data/lib/mongoid/contextual/aggregable/mongo.rb +181 -0
  29. data/lib/mongoid/contextual/atomic.rb +179 -0
  30. data/lib/mongoid/contextual/command.rb +43 -0
  31. data/lib/mongoid/contextual/find_and_modify.rb +66 -0
  32. data/lib/mongoid/contextual/map_reduce.rb +273 -0
  33. data/lib/mongoid/contextual/memory.rb +383 -0
  34. data/lib/mongoid/contextual/mongo.rb +543 -0
  35. data/lib/mongoid/copyable.rb +3 -34
  36. data/lib/mongoid/criteria.rb +436 -250
  37. data/lib/mongoid/criterion/inspection.rb +14 -8
  38. data/lib/mongoid/criterion/scoping.rb +114 -44
  39. data/lib/mongoid/dirty.rb +152 -67
  40. data/lib/mongoid/document.rb +69 -50
  41. data/lib/mongoid/errors.rb +22 -1
  42. data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
  43. data/lib/mongoid/errors/callback.rb +5 -6
  44. data/lib/mongoid/errors/delete_restriction.rb +29 -0
  45. data/lib/mongoid/errors/document_not_found.rb +98 -17
  46. data/lib/mongoid/errors/eager_load.rb +3 -6
  47. data/lib/mongoid/errors/invalid_collection.rb +3 -3
  48. data/lib/mongoid/errors/invalid_config_option.rb +27 -0
  49. data/lib/mongoid/errors/invalid_database.rb +3 -3
  50. data/lib/mongoid/errors/invalid_field.rb +54 -8
  51. data/lib/mongoid/errors/invalid_field_option.rb +35 -0
  52. data/lib/mongoid/errors/invalid_find.rb +3 -3
  53. data/lib/mongoid/errors/invalid_index.rb +28 -0
  54. data/lib/mongoid/errors/invalid_options.rb +4 -4
  55. data/lib/mongoid/errors/invalid_scope.rb +24 -0
  56. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
  57. data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
  58. data/lib/mongoid/errors/invalid_time.rb +3 -6
  59. data/lib/mongoid/errors/inverse_not_found.rb +29 -0
  60. data/lib/mongoid/errors/mixed_relations.rb +4 -9
  61. data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
  62. data/lib/mongoid/errors/mongoid_error.rb +54 -3
  63. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
  64. data/lib/mongoid/errors/no_default_session.rb +23 -0
  65. data/lib/mongoid/errors/no_environment.rb +3 -3
  66. data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
  67. data/lib/mongoid/errors/no_parent.rb +24 -0
  68. data/lib/mongoid/errors/no_session_config.rb +22 -0
  69. data/lib/mongoid/errors/no_session_database.rb +27 -0
  70. data/lib/mongoid/errors/no_session_hosts.rb +27 -0
  71. data/lib/mongoid/errors/no_sessions_config.rb +20 -0
  72. data/lib/mongoid/errors/readonly_attribute.rb +25 -0
  73. data/lib/mongoid/errors/scope_overwrite.rb +4 -4
  74. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +4 -4
  75. data/lib/mongoid/errors/unknown_attribute.rb +25 -0
  76. data/lib/mongoid/errors/unsaved_document.rb +4 -8
  77. data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
  78. data/lib/mongoid/errors/unsupported_version.rb +4 -4
  79. data/lib/mongoid/errors/validations.rb +7 -6
  80. data/lib/mongoid/errors/versioning_not_on_root.rb +23 -0
  81. data/lib/mongoid/extensions.rb +28 -76
  82. data/lib/mongoid/extensions/array.rb +127 -0
  83. data/lib/mongoid/extensions/big_decimal.rb +42 -0
  84. data/lib/mongoid/extensions/boolean.rb +24 -0
  85. data/lib/mongoid/extensions/date.rb +70 -0
  86. data/lib/mongoid/extensions/date_time.rb +68 -0
  87. data/lib/mongoid/extensions/false_class.rb +26 -0
  88. data/lib/mongoid/extensions/float.rb +44 -0
  89. data/lib/mongoid/extensions/hash.rb +91 -0
  90. data/lib/mongoid/extensions/integer.rb +54 -0
  91. data/lib/mongoid/extensions/module.rb +28 -0
  92. data/lib/mongoid/extensions/nil_class.rb +21 -0
  93. data/lib/mongoid/extensions/object.rb +188 -0
  94. data/lib/mongoid/extensions/object_id.rb +53 -0
  95. data/lib/mongoid/extensions/range.rb +55 -0
  96. data/lib/mongoid/extensions/regexp.rb +27 -0
  97. data/lib/mongoid/extensions/set.rb +55 -0
  98. data/lib/mongoid/extensions/string.rb +155 -0
  99. data/lib/mongoid/extensions/symbol.rb +54 -0
  100. data/lib/mongoid/extensions/time.rb +78 -0
  101. data/lib/mongoid/extensions/time_with_zone.rb +55 -0
  102. data/lib/mongoid/extensions/true_class.rb +26 -0
  103. data/lib/mongoid/factory.rb +1 -1
  104. data/lib/mongoid/fields.rb +129 -194
  105. data/lib/mongoid/fields/foreign_key.rb +134 -0
  106. data/lib/mongoid/fields/localized.rb +73 -0
  107. data/lib/mongoid/fields/standard.rb +268 -0
  108. data/lib/mongoid/fields/validators.rb +2 -0
  109. data/lib/mongoid/fields/validators/macro.rb +83 -0
  110. data/lib/mongoid/finders.rb +42 -43
  111. data/lib/mongoid/hierarchy.rb +25 -14
  112. data/lib/mongoid/identity_map.rb +31 -19
  113. data/lib/mongoid/indexes.rb +66 -15
  114. data/lib/mongoid/indexes/validators/options.rb +80 -0
  115. data/lib/mongoid/inspection.rb +1 -1
  116. data/lib/mongoid/javascript.rb +1 -1
  117. data/lib/mongoid/json.rb +2 -2
  118. data/lib/mongoid/loggable.rb +69 -0
  119. data/lib/mongoid/matchers.rb +1 -1
  120. data/lib/mongoid/matchers/all.rb +7 -8
  121. data/lib/mongoid/matchers/and.rb +3 -3
  122. data/lib/mongoid/matchers/default.rb +6 -4
  123. data/lib/mongoid/matchers/exists.rb +2 -2
  124. data/lib/mongoid/matchers/gt.rb +2 -2
  125. data/lib/mongoid/matchers/gte.rb +2 -2
  126. data/lib/mongoid/matchers/in.rb +3 -7
  127. data/lib/mongoid/matchers/lt.rb +2 -2
  128. data/lib/mongoid/matchers/lte.rb +2 -2
  129. data/lib/mongoid/matchers/ne.rb +2 -2
  130. data/lib/mongoid/matchers/nin.rb +2 -2
  131. data/lib/mongoid/matchers/or.rb +2 -2
  132. data/lib/mongoid/matchers/size.rb +2 -2
  133. data/lib/mongoid/matchers/strategies.rb +3 -3
  134. data/lib/mongoid/multi_parameter_attributes.rb +8 -10
  135. data/lib/mongoid/nested_attributes.rb +17 -9
  136. data/lib/mongoid/observer.rb +1 -2
  137. data/lib/mongoid/paranoia.rb +13 -18
  138. data/lib/mongoid/persistence.rb +43 -39
  139. data/lib/mongoid/persistence/atomic.rb +2 -2
  140. data/lib/mongoid/persistence/atomic/add_to_set.rb +5 -9
  141. data/lib/mongoid/persistence/atomic/bit.rb +5 -7
  142. data/lib/mongoid/persistence/atomic/inc.rb +5 -7
  143. data/lib/mongoid/persistence/atomic/operation.rb +45 -6
  144. data/lib/mongoid/persistence/atomic/pop.rb +5 -7
  145. data/lib/mongoid/persistence/atomic/pull.rb +5 -7
  146. data/lib/mongoid/persistence/atomic/pull_all.rb +5 -7
  147. data/lib/mongoid/persistence/atomic/push.rb +4 -10
  148. data/lib/mongoid/persistence/atomic/push_all.rb +4 -10
  149. data/lib/mongoid/persistence/atomic/rename.rb +6 -7
  150. data/lib/mongoid/persistence/atomic/sets.rb +5 -7
  151. data/lib/mongoid/persistence/atomic/unset.rb +4 -5
  152. data/lib/mongoid/persistence/deletion.rb +2 -2
  153. data/lib/mongoid/persistence/insertion.rb +10 -16
  154. data/lib/mongoid/persistence/modification.rb +5 -9
  155. data/lib/mongoid/persistence/operations.rb +6 -19
  156. data/lib/mongoid/persistence/operations/embedded/insert.rb +7 -6
  157. data/lib/mongoid/persistence/operations/embedded/remove.rb +5 -5
  158. data/lib/mongoid/persistence/operations/insert.rb +4 -4
  159. data/lib/mongoid/persistence/operations/remove.rb +4 -4
  160. data/lib/mongoid/persistence/operations/update.rb +5 -5
  161. data/lib/mongoid/railtie.rb +26 -11
  162. data/lib/mongoid/railties/database.rake +22 -108
  163. data/lib/mongoid/relations.rb +4 -6
  164. data/lib/mongoid/relations/accessors.rb +119 -19
  165. data/lib/mongoid/relations/auto_save.rb +59 -5
  166. data/lib/mongoid/relations/binding.rb +211 -2
  167. data/lib/mongoid/relations/bindings/embedded/in.rb +16 -22
  168. data/lib/mongoid/relations/bindings/embedded/many.rb +9 -50
  169. data/lib/mongoid/relations/bindings/embedded/one.rb +10 -16
  170. data/lib/mongoid/relations/bindings/referenced/in.rb +31 -57
  171. data/lib/mongoid/relations/bindings/referenced/many.rb +8 -20
  172. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -19
  173. data/lib/mongoid/relations/bindings/referenced/one.rb +10 -24
  174. data/lib/mongoid/relations/builder.rb +3 -3
  175. data/lib/mongoid/relations/builders.rb +19 -16
  176. data/lib/mongoid/relations/builders/embedded/in.rb +5 -5
  177. data/lib/mongoid/relations/builders/embedded/many.rb +12 -12
  178. data/lib/mongoid/relations/builders/embedded/one.rb +6 -6
  179. data/lib/mongoid/relations/builders/nested_attributes/many.rb +8 -8
  180. data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -4
  181. data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
  182. data/lib/mongoid/relations/builders/referenced/many.rb +5 -5
  183. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +7 -5
  184. data/lib/mongoid/relations/builders/referenced/one.rb +5 -5
  185. data/lib/mongoid/relations/cascading.rb +6 -4
  186. data/lib/mongoid/relations/cascading/delete.rb +3 -5
  187. data/lib/mongoid/relations/cascading/destroy.rb +3 -3
  188. data/lib/mongoid/relations/cascading/nullify.rb +3 -3
  189. data/lib/mongoid/relations/cascading/restrict.rb +37 -0
  190. data/lib/mongoid/relations/constraint.rb +4 -3
  191. data/lib/mongoid/relations/conversions.rb +5 -6
  192. data/lib/mongoid/relations/cyclic.rb +7 -7
  193. data/lib/mongoid/relations/embedded/batchable.rb +346 -0
  194. data/lib/mongoid/relations/embedded/in.rb +23 -12
  195. data/lib/mongoid/relations/embedded/many.rb +99 -161
  196. data/lib/mongoid/relations/embedded/one.rb +25 -14
  197. data/lib/mongoid/relations/macros.rb +105 -61
  198. data/lib/mongoid/relations/many.rb +93 -14
  199. data/lib/mongoid/relations/metadata.rb +200 -45
  200. data/lib/mongoid/relations/nested_builder.rb +3 -5
  201. data/lib/mongoid/relations/one.rb +2 -2
  202. data/lib/mongoid/relations/options.rb +2 -2
  203. data/lib/mongoid/relations/polymorphic.rb +9 -9
  204. data/lib/mongoid/relations/proxy.rb +60 -31
  205. data/lib/mongoid/relations/referenced/in.rb +40 -15
  206. data/lib/mongoid/relations/referenced/many.rb +117 -132
  207. data/lib/mongoid/relations/referenced/many_to_many.rb +101 -46
  208. data/lib/mongoid/relations/referenced/one.rb +34 -13
  209. data/lib/mongoid/relations/reflections.rb +3 -3
  210. data/lib/mongoid/relations/synchronization.rb +19 -23
  211. data/lib/mongoid/relations/targets/enumerable.rb +86 -57
  212. data/lib/mongoid/reloading.rb +12 -14
  213. data/lib/mongoid/scoping.rb +329 -0
  214. data/lib/mongoid/serialization.rb +8 -27
  215. data/lib/mongoid/sessions.rb +359 -0
  216. data/lib/mongoid/sessions/factory.rb +106 -0
  217. data/lib/mongoid/sessions/mongo_uri.rb +93 -0
  218. data/lib/mongoid/sessions/validators.rb +2 -0
  219. data/lib/mongoid/sessions/validators/storage.rb +49 -0
  220. data/lib/mongoid/sharding.rb +6 -6
  221. data/lib/mongoid/state.rb +6 -7
  222. data/lib/mongoid/threaded.rb +167 -59
  223. data/lib/mongoid/threaded/lifecycle.rb +21 -22
  224. data/lib/mongoid/threaded/sessions.rb +0 -0
  225. data/lib/mongoid/timestamps.rb +1 -1
  226. data/lib/mongoid/timestamps/created.rb +8 -4
  227. data/lib/mongoid/timestamps/timeless.rb +6 -4
  228. data/lib/mongoid/timestamps/updated.rb +3 -3
  229. data/lib/mongoid/unit_of_work.rb +61 -0
  230. data/lib/mongoid/validations.rb +27 -19
  231. data/lib/mongoid/validations/associated.rb +2 -2
  232. data/lib/mongoid/validations/format.rb +2 -2
  233. data/lib/mongoid/validations/presence.rb +31 -5
  234. data/lib/mongoid/validations/uniqueness.rb +9 -12
  235. data/lib/mongoid/version.rb +2 -2
  236. data/lib/mongoid/versioning.rb +25 -26
  237. data/lib/rack/mongoid/middleware/identity_map.rb +3 -3
  238. data/lib/rails/generators/mongoid/config/config_generator.rb +1 -1
  239. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +59 -19
  240. data/lib/rails/generators/mongoid/model/model_generator.rb +7 -7
  241. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +2 -2
  242. data/lib/rails/generators/mongoid/observer/observer_generator.rb +4 -4
  243. data/lib/rails/generators/mongoid_generator.rb +5 -5
  244. data/lib/rails/mongoid.rb +69 -25
  245. metadata +110 -137
  246. checksums.yaml +0 -7
  247. data/lib/config/locales/bg.yml +0 -61
  248. data/lib/config/locales/de.yml +0 -61
  249. data/lib/config/locales/en-GB.yml +0 -64
  250. data/lib/config/locales/es.yml +0 -59
  251. data/lib/config/locales/fr.yml +0 -62
  252. data/lib/config/locales/hi.yml +0 -53
  253. data/lib/config/locales/hu.yml +0 -64
  254. data/lib/config/locales/id.yml +0 -62
  255. data/lib/config/locales/it.yml +0 -59
  256. data/lib/config/locales/ja.yml +0 -57
  257. data/lib/config/locales/kr.yml +0 -54
  258. data/lib/config/locales/nl.yml +0 -61
  259. data/lib/config/locales/pl.yml +0 -59
  260. data/lib/config/locales/pt-BR.yml +0 -60
  261. data/lib/config/locales/pt.yml +0 -60
  262. data/lib/config/locales/ro.yml +0 -66
  263. data/lib/config/locales/ru.yml +0 -61
  264. data/lib/config/locales/sv.yml +0 -60
  265. data/lib/config/locales/vi.yml +0 -62
  266. data/lib/config/locales/zh-CN.yml +0 -53
  267. data/lib/mongoid/collection.rb +0 -157
  268. data/lib/mongoid/collections.rb +0 -120
  269. data/lib/mongoid/collections/master.rb +0 -45
  270. data/lib/mongoid/collections/operations.rb +0 -44
  271. data/lib/mongoid/config/database.rb +0 -181
  272. data/lib/mongoid/config/replset_database.rb +0 -80
  273. data/lib/mongoid/contexts.rb +0 -25
  274. data/lib/mongoid/contexts/enumerable.rb +0 -313
  275. data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
  276. data/lib/mongoid/contexts/mongo.rb +0 -487
  277. data/lib/mongoid/criterion/builder.rb +0 -34
  278. data/lib/mongoid/criterion/complex.rb +0 -84
  279. data/lib/mongoid/criterion/creational.rb +0 -34
  280. data/lib/mongoid/criterion/exclusion.rb +0 -110
  281. data/lib/mongoid/criterion/inclusion.rb +0 -290
  282. data/lib/mongoid/criterion/optional.rb +0 -259
  283. data/lib/mongoid/criterion/selector.rb +0 -177
  284. data/lib/mongoid/cursor.rb +0 -88
  285. data/lib/mongoid/default_scope.rb +0 -36
  286. data/lib/mongoid/errors/invalid_type.rb +0 -25
  287. data/lib/mongoid/extensions/array/deep_copy.rb +0 -25
  288. data/lib/mongoid/extensions/array/deletion.rb +0 -29
  289. data/lib/mongoid/extensions/false_class/equality.rb +0 -26
  290. data/lib/mongoid/extensions/hash/criteria_helpers.rb +0 -47
  291. data/lib/mongoid/extensions/hash/deep_copy.rb +0 -25
  292. data/lib/mongoid/extensions/hash/scoping.rb +0 -25
  293. data/lib/mongoid/extensions/integer/checks.rb +0 -23
  294. data/lib/mongoid/extensions/nil/collectionization.rb +0 -23
  295. data/lib/mongoid/extensions/object/checks.rb +0 -29
  296. data/lib/mongoid/extensions/object/deep_copy.rb +0 -21
  297. data/lib/mongoid/extensions/object/reflections.rb +0 -48
  298. data/lib/mongoid/extensions/object/substitutable.rb +0 -15
  299. data/lib/mongoid/extensions/object/yoda.rb +0 -44
  300. data/lib/mongoid/extensions/object_id/conversions.rb +0 -60
  301. data/lib/mongoid/extensions/proc/scoping.rb +0 -25
  302. data/lib/mongoid/extensions/string/checks.rb +0 -36
  303. data/lib/mongoid/extensions/string/conversions.rb +0 -22
  304. data/lib/mongoid/extensions/string/inflections.rb +0 -118
  305. data/lib/mongoid/extensions/symbol/checks.rb +0 -23
  306. data/lib/mongoid/extensions/symbol/inflections.rb +0 -67
  307. data/lib/mongoid/extensions/true_class/equality.rb +0 -26
  308. data/lib/mongoid/extras.rb +0 -31
  309. data/lib/mongoid/fields/internal/array.rb +0 -77
  310. data/lib/mongoid/fields/internal/big_decimal.rb +0 -63
  311. data/lib/mongoid/fields/internal/bignum.rb +0 -10
  312. data/lib/mongoid/fields/internal/binary.rb +0 -11
  313. data/lib/mongoid/fields/internal/boolean.rb +0 -58
  314. data/lib/mongoid/fields/internal/date.rb +0 -51
  315. data/lib/mongoid/fields/internal/date_time.rb +0 -28
  316. data/lib/mongoid/fields/internal/false_class.rb +0 -10
  317. data/lib/mongoid/fields/internal/fixnum.rb +0 -10
  318. data/lib/mongoid/fields/internal/float.rb +0 -47
  319. data/lib/mongoid/fields/internal/foreign_keys/array.rb +0 -88
  320. data/lib/mongoid/fields/internal/foreign_keys/object.rb +0 -56
  321. data/lib/mongoid/fields/internal/hash.rb +0 -11
  322. data/lib/mongoid/fields/internal/integer.rb +0 -59
  323. data/lib/mongoid/fields/internal/localized.rb +0 -62
  324. data/lib/mongoid/fields/internal/nil_class.rb +0 -53
  325. data/lib/mongoid/fields/internal/object.rb +0 -11
  326. data/lib/mongoid/fields/internal/object_id.rb +0 -46
  327. data/lib/mongoid/fields/internal/range.rb +0 -61
  328. data/lib/mongoid/fields/internal/set.rb +0 -57
  329. data/lib/mongoid/fields/internal/string.rb +0 -42
  330. data/lib/mongoid/fields/internal/symbol.rb +0 -43
  331. data/lib/mongoid/fields/internal/time.rb +0 -23
  332. data/lib/mongoid/fields/internal/time_with_zone.rb +0 -23
  333. data/lib/mongoid/fields/internal/timekeeping.rb +0 -122
  334. data/lib/mongoid/fields/internal/true_class.rb +0 -10
  335. data/lib/mongoid/fields/mappings.rb +0 -42
  336. data/lib/mongoid/fields/serializable.rb +0 -270
  337. data/lib/mongoid/identity.rb +0 -92
  338. data/lib/mongoid/keys.rb +0 -144
  339. data/lib/mongoid/logger.rb +0 -45
  340. data/lib/mongoid/multi_database.rb +0 -36
  341. data/lib/mongoid/named_scope.rb +0 -166
  342. data/lib/mongoid/relations/embedded/atomic.rb +0 -89
  343. data/lib/mongoid/relations/embedded/atomic/operation.rb +0 -63
  344. data/lib/mongoid/relations/embedded/atomic/pull.rb +0 -65
  345. data/lib/mongoid/relations/embedded/atomic/push_all.rb +0 -59
  346. data/lib/mongoid/relations/embedded/atomic/set.rb +0 -61
  347. data/lib/mongoid/relations/embedded/atomic/unset.rb +0 -41
  348. data/lib/mongoid/relations/referenced/batch.rb +0 -73
  349. data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
  350. data/lib/mongoid/safety.rb +0 -105
  351. data/lib/mongoid/scope.rb +0 -31
@@ -1,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
@@ -5,7 +5,7 @@ require "mongoid/persistence/insertion"
5
5
  require "mongoid/persistence/modification"
6
6
  require "mongoid/persistence/operations"
7
7
 
8
- module Mongoid #:nodoc:
8
+ module Mongoid
9
9
 
10
10
  # The persistence module is a mixin to provide database accessor methods for
11
11
  # the document. These correspond to the appropriate accessors on a
@@ -19,7 +19,7 @@ module Mongoid #:nodoc:
19
19
  extend ActiveSupport::Concern
20
20
  include Atomic
21
21
 
22
- # Remove the document from the datbase with callbacks.
22
+ # Remove the document from the database with callbacks.
23
23
  #
24
24
  # @example Destroy a document.
25
25
  # document.destroy
@@ -29,11 +29,11 @@ module Mongoid #:nodoc:
29
29
  # @return [ true, false ] True if successful, false if not.
30
30
  def destroy(options = {})
31
31
  self.flagged_for_destroy = true
32
- run_callbacks(:destroy) do
32
+ result = run_callbacks(:destroy) do
33
33
  remove(options)
34
- end.tap do
35
- self.flagged_for_destroy = false
36
34
  end
35
+ self.flagged_for_destroy = false
36
+ result
37
37
  end
38
38
 
39
39
  # Insert a new document into the database. Will return the document
@@ -49,7 +49,7 @@ module Mongoid #:nodoc:
49
49
  Operations.insert(self, options).persist
50
50
  end
51
51
 
52
- # Remove the document from the datbase.
52
+ # Remove the document from the database.
53
53
  #
54
54
  # @example Remove the document.
55
55
  # document.remove
@@ -79,8 +79,7 @@ module Mongoid #:nodoc:
79
79
  return true
80
80
  end
81
81
 
82
-
83
- # Touch the document, in effect updating its updated_at timestamp and
82
+ # Touch the document, in effect updating it's updated_at timestamp and
84
83
  # optionally the provided field to the current time. If any belongs_to
85
84
  # relations exist with a touch option, they will be updated as well.
86
85
  #
@@ -94,25 +93,21 @@ module Mongoid #:nodoc:
94
93
  #
95
94
  # @param [ Symbol ] field The name of an additional field to update.
96
95
  #
97
- # @return [ true/false ] false if record is new_record otherwise true.
96
+ # @return [ true ] true.
98
97
  #
99
- # @since 2.6.0
98
+ # @since 3.0.0
100
99
  def touch(field = nil)
101
- return false if _root.new_record?
102
100
  current = Time.now
103
101
  write_attribute(:updated_at, current) if fields["updated_at"]
104
102
  write_attribute(field, current) if field
105
-
106
- touches = touch_atomic_updates(field)
107
- unless touches.empty?
108
- _root.collection.update(atomic_selector, touches)
103
+ collection.find(atomic_selector).update(atomic_updates)
104
+ without_autobuild do
105
+ touchables.each { |name| send(name).try(:touch) }
109
106
  end
110
-
111
- touchables.each { |name| send(name).try(:touch) }
112
107
  move_changes and true
113
108
  end
114
109
 
115
- # Update the document in the datbase.
110
+ # Update the document in the database.
116
111
  #
117
112
  # @example Update an existing document.
118
113
  # document.update
@@ -133,15 +128,21 @@ module Mongoid #:nodoc:
133
128
  # @param [ Symbol, String ] name The name of the attribute.
134
129
  # @param [ Object ] value The new value of the attribute.a
135
130
  #
131
+ # @raise [ Errors::ReadonlyAttribute ] If the field cannot be changed due
132
+ # to being flagged as reaodnly.
133
+ #
136
134
  # @return [ true, false ] True if save was successfull, false if not.
137
135
  #
138
136
  # @since 2.0.0.rc.6
139
137
  def update_attribute(name, value)
138
+ unless attribute_writable?(name.to_s)
139
+ raise Errors::ReadonlyAttribute.new(name, value)
140
+ end
140
141
  write_attribute(name, value)
141
- save(:validate => false)
142
+ save(validate: false)
142
143
  end
143
144
 
144
- # Update the document attributes in the datbase.
145
+ # Update the document attributes in the database.
145
146
  #
146
147
  # @example Update the document's attributes
147
148
  # document.update_attributes(:title => "Sir")
@@ -165,12 +166,12 @@ module Mongoid #:nodoc:
165
166
  #
166
167
  # @return [ true, false ] True if validation passed.
167
168
  def update_attributes!(attributes = {}, options = {})
168
- update_attributes(attributes, options).tap do |result|
169
- unless result
170
- self.class.fail_validate!(self) if errors.any?
171
- self.class.fail_callback!(self, :update_attributes!)
172
- end
169
+ result = update_attributes(attributes, options)
170
+ unless result
171
+ self.class.fail_validate!(self) if errors.any?
172
+ self.class.fail_callback!(self, :update_attributes!)
173
173
  end
174
+ result
174
175
  end
175
176
 
176
177
  # Upsert the document - will perform an insert if the document is new, and
@@ -184,7 +185,7 @@ module Mongoid #:nodoc:
184
185
  # @return [ true, false ] True is success, false if not.
185
186
  def upsert(options = {})
186
187
  if new_record?
187
- !insert(options).new_record?
188
+ insert(options).persisted?
188
189
  else
189
190
  update(options)
190
191
  end
@@ -207,7 +208,9 @@ module Mongoid #:nodoc:
207
208
  # @return [ Document ] The newly created document.
208
209
  def create(attributes = {}, options = {}, &block)
209
210
  _creating do
210
- new(attributes, options, &block).tap { |doc| doc.save }
211
+ doc = new(attributes, options, &block)
212
+ doc.save
213
+ doc
211
214
  end
212
215
  end
213
216
 
@@ -226,10 +229,10 @@ module Mongoid #:nodoc:
226
229
  # @return [ Document ] The newly created document.
227
230
  def create!(attributes = {}, options = {}, &block)
228
231
  _creating do
229
- new(attributes, options, &block).tap do |doc|
230
- fail_validate!(doc) if doc.insert.errors.any?
231
- fail_callback!(doc, :create!) if doc.new?
232
- end
232
+ doc = new(attributes, options, &block)
233
+ fail_validate!(doc) if doc.insert.errors.any?
234
+ fail_callback!(doc, :create!) if doc.new_record?
235
+ doc
233
236
  end
234
237
  end
235
238
 
@@ -249,11 +252,12 @@ module Mongoid #:nodoc:
249
252
  def delete_all(conditions = nil)
250
253
  conds = conditions || {}
251
254
  selector = conds[:conditions] || conds
252
- selector.merge!(:_type => name) if hereditary?
253
- collection.find(selector).count.tap do
254
- collection.remove(selector, Safety.merge_safety_options)
255
- Threaded.clear_options!
256
- end
255
+ selector.merge!(_type: name) if hereditary?
256
+ coll = collection
257
+ deleted = coll.find(selector).count
258
+ coll.find(selector).remove_all
259
+ Threaded.clear_options!
260
+ deleted
257
261
  end
258
262
 
259
263
  # Delete all documents given the supplied conditions. If no conditions
@@ -272,9 +276,9 @@ module Mongoid #:nodoc:
272
276
  def destroy_all(conditions = nil)
273
277
  conds = conditions || {}
274
278
  documents = where(conds[:conditions] || conds)
275
- documents.count.tap do
276
- documents.each { |doc| doc.destroy }
277
- end
279
+ destroyed = documents.count
280
+ documents.each { |doc| doc.destroy }
281
+ destroyed
278
282
  end
279
283
 
280
284
  # Raise an error if validation failed.
@@ -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,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