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 Matchers #:nodoc:
2
+ module Mongoid
3
+ module Matchers
4
4
 
5
5
  # Defines behavior for handling $or expressions in embedded documents.
6
6
  class Or < Default
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Matchers #:nodoc:
2
+ module Mongoid
3
+ module Matchers
4
4
 
5
5
  # Performs size checking.
6
6
  class Size < Default
@@ -13,8 +13,8 @@ require "mongoid/matchers/nin"
13
13
  require "mongoid/matchers/or"
14
14
  require "mongoid/matchers/size"
15
15
 
16
- module Mongoid #:nodoc:
17
- module Matchers #:nodoc:
16
+ module Mongoid
17
+ module Matchers
18
18
 
19
19
  # This module is responsible for returning the correct matcher given a
20
20
  # MongoDB query expression.
@@ -81,7 +81,7 @@ module Mongoid #:nodoc:
81
81
  # @since 2.2.1
82
82
  def extract_attribute(document, key)
83
83
  if (key_string = key.to_s) =~ /.+\..+/
84
- key_string.split('.').inject(document.attributes) do |_attribs, _key|
84
+ key_string.split('.').inject(document.as_document) do |_attribs, _key|
85
85
  if _attribs.is_a?(::Array)
86
86
  _attribs.map { |doc| doc.try(:[], _key) }
87
87
  else
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
  require "mongoid/matchers/strategies"
3
3
 
4
- module Mongoid #:nodoc:
4
+ module Mongoid
5
5
 
6
6
  # This module contains all the behavior for ruby implementations of MongoDB
7
7
  # selectors.
@@ -1,12 +1,12 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
2
+ module Mongoid
3
3
 
4
4
  # Adds Rails' multi-parameter attribute support to Mongoid.
5
5
  #
6
6
  # @todo: Durran: This module needs an overhaul.
7
7
  module MultiParameterAttributes
8
8
 
9
- module Errors #:nodoc:
9
+ module Errors
10
10
 
11
11
  # Raised when an error occurred while doing a mass assignment to an
12
12
  # attribute through the <tt>attributes=</tt> method. The exception
@@ -41,21 +41,21 @@ module Mongoid #:nodoc:
41
41
  # put into the document's attributes.
42
42
  #
43
43
  # @example Process the attributes.
44
- # person.process(:title => "sir", :age => 40)
44
+ # person.process_attributes(:title => "sir", :age => 40)
45
45
  #
46
46
  # @param [ Hash ] attrs The attributes to set.
47
47
  # @param [ Symbol ] role A role for scoped mass assignment.
48
48
  # @param [ Boolean ] guard_protected_attributes False to skip mass assignment protection.
49
49
  #
50
50
  # @since 2.0.0.rc.7
51
- def process(attrs = nil, role = :default, guard_protected_attributes = true)
51
+ def process_attributes(attrs = nil, role = :default, guard_protected_attributes = true)
52
52
  if attrs
53
53
  errors = []
54
54
  attributes = {}
55
55
  multi_parameter_attributes = {}
56
56
 
57
57
  attrs.each_pair do |key, value|
58
- if key =~ /^([^\(]+)\((\d+)([if])\)$/
58
+ if key =~ /\A([^\(]+)\((\d+)([if])\)$/
59
59
  key, index = $1, $2.to_i
60
60
  (multi_parameter_attributes[key] ||= {})[index] = value.empty? ? nil : value.send("to_#{$3}")
61
61
  else
@@ -66,7 +66,7 @@ module Mongoid #:nodoc:
66
66
  multi_parameter_attributes.each_pair do |key, values|
67
67
  begin
68
68
  values = (values.keys.min..values.keys.max).map { |i| values[i] }
69
- field = self.class.fields[key]
69
+ field = self.class.fields[aliased_fields[key] || key]
70
70
  attributes[key] = instantiate_object(field, values)
71
71
  rescue => e
72
72
  errors << Errors::AttributeAssignmentError.new(
@@ -76,10 +76,8 @@ module Mongoid #:nodoc:
76
76
  end
77
77
 
78
78
  unless errors.empty?
79
- raise(
80
- Errors::MultiparameterAssignmentErrors.new(errors),
79
+ raise Errors::MultiparameterAssignmentErrors.new(errors),
81
80
  "#{errors.size} error(s) on assignment of multiparameter attributes"
82
- )
83
81
  end
84
82
 
85
83
  super attributes, role, guard_protected_attributes
@@ -95,9 +93,9 @@ module Mongoid #:nodoc:
95
93
  values = values_with_empty_parameters.collect { |v| v.nil? ? 1 : v }
96
94
  klass = field.type
97
95
  if klass == DateTime || klass == Date || klass == Time
98
- field.serialize(values)
96
+ field.mongoize(values)
99
97
  elsif klass
100
- klass.new *values
98
+ klass.new(*values)
101
99
  else
102
100
  values
103
101
  end
@@ -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,8 +14,11 @@ 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
+
20
+ default_scope where(deleted_at: nil)
21
+ scope :deleted, ne(deleted_at: nil)
19
22
  end
20
23
 
21
24
  # Delete the paranoid +Document+ from the database completely. This will
@@ -56,11 +59,8 @@ module Mongoid #:nodoc:
56
59
  # @since 1.0.0
57
60
  def remove(options = {})
58
61
  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
- )
62
+ paranoid_collection.find(atomic_selector).
63
+ update({ "$set" => { paranoid_field => time }})
64
64
  cascade!
65
65
  @destroyed = true
66
66
  IdentityMap.remove(self)
@@ -78,7 +78,7 @@ module Mongoid #:nodoc:
78
78
  #
79
79
  # @since 1.0.0
80
80
  def destroyed?
81
- @destroyed || !!deleted_at
81
+ (@destroyed ||= false) || !!deleted_at
82
82
  end
83
83
 
84
84
  # Restores a previously soft-deleted document. Handles this by removing the
@@ -91,10 +91,8 @@ module Mongoid #:nodoc:
91
91
  #
92
92
  # @since 1.0.0
93
93
  def restore
94
- paranoid_collection.update(
95
- atomic_selector,
96
- { "$unset" => { paranoid_field => true }}
97
- )
94
+ paranoid_collection.find(atomic_selector).
95
+ update({ "$unset" => { paranoid_field => true }})
98
96
  attributes.delete("deleted_at")
99
97
  end
100
98
 
@@ -123,37 +121,5 @@ module Mongoid #:nodoc:
123
121
  def paranoid_field
124
122
  embedded? ? "#{atomic_position}.deleted_at" : "deleted_at"
125
123
  end
126
-
127
- module ClassMethods #:nodoc:
128
-
129
- # Override the default +Criteria+ accessor to only get existing
130
- # documents. Passes all arguments up to +NamedScope.criteria+
131
- #
132
- # @example Override the criteria.
133
- # Person.criteria
134
- #
135
- # @param [ Array ] args The arguments.
136
- #
137
- # @return [ Criteria ] The paranoid compliant criteria.
138
- #
139
- # @since 1.0.0
140
- def criteria(embedded = false, scoped = true)
141
- scoped ? super.where(:deleted_at => nil) : super
142
- end
143
-
144
- # Find deleted documents
145
- #
146
- # @example Find deleted documents.
147
- # Person.deleted
148
- # Company.first.employees.deleted
149
- # Person.deleted.find("4c188dea7b17235a2a000001").first
150
- #
151
- # @return [ Criteria ] The deleted criteria.
152
- #
153
- # @since 1.0.0
154
- def deleted
155
- where(:deleted_at.ne => nil)
156
- end
157
- end
158
124
  end
159
125
  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 $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.new_record?
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