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,26 +1,77 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
2
+ module Mongoid
3
3
 
4
4
  # This module contains all the callback hooks for Mongoid.
5
5
  module Callbacks
6
6
  extend ActiveSupport::Concern
7
7
 
8
8
  CALLBACKS = [
9
- :before_validation, :after_validation,
10
- :after_initialize, :after_build,
11
- :before_create, :around_create, :after_create,
12
- :before_destroy, :around_destroy, :after_destroy,
13
- :before_save, :around_save, :after_save,
14
- :before_update, :around_update, :after_update,
9
+ :after_build,
10
+ :after_create,
11
+ :after_destroy,
12
+ :after_initialize,
13
+ :after_save,
14
+ :after_update,
15
+ :after_upsert,
16
+ :after_validation,
17
+ :around_create,
18
+ :around_destroy,
19
+ :around_save,
20
+ :around_update,
21
+ :around_upsert,
22
+ :before_create,
23
+ :before_destroy,
24
+ :before_save,
25
+ :before_update,
26
+ :before_upsert,
27
+ :before_validation
15
28
  ]
16
29
 
17
30
  included do
18
31
  extend ActiveModel::Callbacks
19
32
  include ActiveModel::Validations::Callbacks
20
33
 
21
- define_model_callbacks :initialize, :only => :after
22
- define_model_callbacks :build, :only => :after
23
- define_model_callbacks :create, :destroy, :save, :update
34
+ define_model_callbacks :initialize, only: :after
35
+ define_model_callbacks :build, only: :after
36
+ define_model_callbacks :create, :destroy, :save, :update, :upsert
37
+ end
38
+
39
+ # Run only the after callbacks for the specific event.
40
+ #
41
+ # @note ActiveSupport does not allow this type of behaviour by default, so
42
+ # Mongoid has to get around it and implement itself.
43
+ #
44
+ # @example Run only the after save callbacks.
45
+ # model.run_after_callbacks(:save)
46
+ #
47
+ # @param [ Array<Symbol> ] kinds The events that are occurring.
48
+ #
49
+ # @return [ Object ] The result of the chain executing.
50
+ #
51
+ # @since 3.0.0
52
+ def run_after_callbacks(*kinds)
53
+ kinds.each do |kind|
54
+ run_targeted_callbacks(:after, kind)
55
+ end
56
+ end
57
+
58
+ # Run only the before callbacks for the specific event.
59
+ #
60
+ # @note ActiveSupport does not allow this type of behaviour by default, so
61
+ # Mongoid has to get around it and implement itself.
62
+ #
63
+ # @example Run only the before save callbacks.
64
+ # model.run_before_callbacks(:save, :create)
65
+ #
66
+ # @param [ Array<Symbol> ] kinds The events that are occurring.
67
+ #
68
+ # @return [ Object ] The result of the chain executing.
69
+ #
70
+ # @since 3.0.0
71
+ def run_before_callbacks(*kinds)
72
+ kinds.each do |kind|
73
+ run_targeted_callbacks(:before, kind)
74
+ end
24
75
  end
25
76
 
26
77
  # Run the callbacks for the document. This overrides active support's
@@ -39,35 +90,16 @@ module Mongoid #:nodoc:
39
90
  #
40
91
  # @since 2.3.0
41
92
  def run_callbacks(kind, *args, &block)
42
- run_cascading_callbacks(cascadable_children(kind), kind, *args) {}
93
+ cascadable_children(kind).each do |child|
94
+ unless child.run_callbacks(child_callback_type(kind, child), *args)
95
+ return false
96
+ end
97
+ end
43
98
  super(kind, *args, &block)
44
99
  end
45
100
 
46
101
  private
47
102
 
48
- # Execute the callbacks, including all children that have cascade callbacks
49
- # set to true.
50
- #
51
- # @example Run the cascading callbacks.
52
- # document.run_cascading_callbacks([], :update)
53
- #
54
- # @param [ Array<Document> ] children The cascading children.
55
- # @param [ Symbol ] kind The callback type.
56
- # @param [ Array ] args The options.
57
- #
58
- # @since 2.3.0
59
- def run_cascading_callbacks(children, kind, *args, &block)
60
- if child = children.pop
61
- run_cascading_callbacks(children, kind, *args) do
62
- child.run_callbacks(child_callback_type(kind, child), *args) do
63
- block.call
64
- end
65
- end
66
- else
67
- block.call
68
- end
69
- end
70
-
71
103
  # Get all the child embedded documents that are flagged as cascadable.
72
104
  #
73
105
  # @example Get all the cascading children.
@@ -78,19 +110,23 @@ module Mongoid #:nodoc:
78
110
  # @return [ Array<Document> ] The children.
79
111
  #
80
112
  # @since 2.3.0
81
- def cascadable_children(kind)
82
- [].tap do |children|
83
- relations.each_pair do |name, metadata|
84
- next unless metadata.cascading_callbacks?
113
+ def cascadable_children(kind, children = Set.new)
114
+ embedded_relations.each_pair do |name, metadata|
115
+ next unless metadata.cascading_callbacks?
116
+ without_autobuild do
85
117
  delayed_pulls = delayed_atomic_pulls[name]
86
- children.concat(delayed_pulls) if delayed_pulls
87
- child = send(name)
88
- Array.wrap(child).each do |doc|
89
- children.push(doc) if cascadable_child?(kind, doc)
90
- children.concat(doc.send(:cascadable_children, kind))
118
+ delayed_unsets = delayed_atomic_unsets[name]
119
+ children.merge(delayed_pulls) if delayed_pulls
120
+ children.merge(delayed_unsets) if delayed_unsets
121
+ relation = send(name)
122
+ Array.wrap(relation).each do |child|
123
+ next if children.include?(child)
124
+ children.add(child) if cascadable_child?(kind, child)
125
+ children.merge(child.send(:cascadable_children, kind, children))
91
126
  end
92
127
  end
93
128
  end
129
+ children.to_a
94
130
  end
95
131
 
96
132
  # Determine if the child should fire the callback.
@@ -132,5 +168,32 @@ module Mongoid #:nodoc:
132
168
  kind
133
169
  end
134
170
  end
171
+
172
+ # Run only the callbacks for the target location (before, after, around)
173
+ # and kind (save, update, create).
174
+ #
175
+ # @example Run the targeted callbacks.
176
+ # model.run_targeted_callbacks(:before, :save)
177
+ #
178
+ # @param [ Symbol ] place The time to run, :before, :after, :around.
179
+ # @param [ Symbol ] kind The type of callback, :save, :create, :update.
180
+ #
181
+ # @return [ Object ] The result of the chain execution.
182
+ #
183
+ # @since 3.0.0
184
+ def run_targeted_callbacks(place, kind)
185
+ name = "_run__#{place}__#{kind}__callbacks"
186
+ unless respond_to?(name)
187
+ chain = ActiveSupport::Callbacks::CallbackChain.new(name, {})
188
+ send("_#{kind}_callbacks").each do |callback|
189
+ chain.push(callback) if callback.kind == place
190
+ end
191
+ class_eval <<-EOM
192
+ def #{name}() #{chain.compile} end
193
+ protected :#{name}
194
+ EOM
195
+ end
196
+ send(name)
197
+ end
135
198
  end
136
199
  end
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc
3
- module Components #:nodoc
2
+ module Mongoid
3
+ module Components
4
4
  extend ActiveSupport::Concern
5
5
 
6
6
  # All modules that a +Document+ is composed of are defined in this
@@ -21,23 +21,19 @@ module Mongoid #:nodoc
21
21
  include Mongoid::Atomic
22
22
  include Mongoid::Dirty
23
23
  include Mongoid::Attributes
24
- include Mongoid::Collections
25
- include Mongoid::Copyable
26
- include Mongoid::DefaultScope
27
- include Mongoid::Extras
24
+ include Mongoid::Evolvable
28
25
  include Mongoid::Fields
29
26
  include Mongoid::Hierarchy
30
27
  include Mongoid::Indexes
31
28
  include Mongoid::Inspection
32
29
  include Mongoid::JSON
33
- include Mongoid::Keys
34
30
  include Mongoid::Matchers
35
- include Mongoid::NamedScope
36
31
  include Mongoid::NestedAttributes
37
32
  include Mongoid::Persistence
38
33
  include Mongoid::Relations
39
34
  include Mongoid::Reloading
40
- include Mongoid::Safety
35
+ include Mongoid::Scoping
36
+ include Mongoid::Sessions
41
37
  include Mongoid::Serialization
42
38
  include Mongoid::Sharding
43
39
  include Mongoid::State
@@ -45,35 +41,30 @@ module Mongoid #:nodoc
45
41
  include Mongoid::Timestamps::Timeless
46
42
  include Mongoid::Validations
47
43
  include Mongoid::Callbacks
48
- include Mongoid::MultiDatabase
44
+ include Mongoid::Copyable
49
45
 
50
46
  MODULES = [
51
47
  Mongoid::Atomic,
52
48
  Mongoid::Attributes,
53
- Mongoid::Collections,
54
49
  Mongoid::Copyable,
55
- Mongoid::DefaultScope,
56
50
  Mongoid::Dirty,
57
- Mongoid::Extras,
58
51
  Mongoid::Fields,
59
52
  Mongoid::Hierarchy,
60
53
  Mongoid::Indexes,
61
54
  Mongoid::Inspection,
62
55
  Mongoid::JSON,
63
- Mongoid::Keys,
56
+ Mongoid::Loggable,
64
57
  Mongoid::Matchers,
65
- Mongoid::NamedScope,
66
58
  Mongoid::NestedAttributes,
67
59
  Mongoid::Persistence,
68
60
  Mongoid::Relations,
69
61
  Mongoid::Relations::Proxy,
70
- Mongoid::Safety,
62
+ Mongoid::Scoping,
71
63
  Mongoid::Serialization,
72
64
  Mongoid::Sharding,
73
65
  Mongoid::State,
74
66
  Mongoid::Validations,
75
- Mongoid::Callbacks,
76
- Mongoid::MultiDatabase,
67
+ Mongoid::Callbacks
77
68
  ]
78
69
 
79
70
  class << self
@@ -88,11 +79,9 @@ module Mongoid #:nodoc
88
79
  #
89
80
  # @since 2.1.8
90
81
  def prohibited_methods
91
- @prohibited_methods ||= MODULES.inject([]) do |methods, mod|
92
- methods.tap do |mets|
93
- mets << mod.instance_methods.map{ |m| m.to_sym }
94
- end
95
- end.flatten
82
+ @prohibited_methods ||= MODULES.flat_map do |mod|
83
+ mod.instance_methods.map{ |m| m.to_sym }
84
+ end
96
85
  end
97
86
  end
98
87
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc
2
+ module Mongoid
3
3
  module Config
4
4
 
5
5
  # Encapsulates logic for getting environment information.
@@ -8,11 +8,13 @@ module Mongoid #:nodoc
8
8
 
9
9
  # Get the name of the environment that we are running under. This first
10
10
  # looks for Rails, then Sinatra, then a RACK_ENV environment variable,
11
- # and if none of those are found returns "development".
11
+ # and if none of those are found raises an error.
12
12
  #
13
13
  # @example Get the env name.
14
14
  # Environment.env_name
15
15
  #
16
+ # @raise [ Errors::NoEnvironment ] If no environment was set.
17
+ #
16
18
  # @return [ String ] The name of the current environment.
17
19
  #
18
20
  # @since 2.3.0
@@ -33,8 +35,9 @@ module Mongoid #:nodoc
33
35
  # @return [ Hash ] The settings.
34
36
  #
35
37
  # @since 2.3.0
36
- def load_yaml(path)
37
- YAML.load(ERB.new(File.new(path).read).result)[env_name]
38
+ def load_yaml(path, environment = nil)
39
+ env = environment ? environment.to_s : env_name
40
+ YAML.load(ERB.new(File.new(path).read).result)[env]
38
41
  end
39
42
  end
40
43
  end
@@ -0,0 +1,6 @@
1
+ # encoding: utf-8
2
+ ActiveSupport::Inflector.inflections do |inflect|
3
+ inflect.singular(/address$/, "address")
4
+ inflect.singular("addresses", "address")
5
+ inflect.irregular("canvas", "canvases")
6
+ end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc
2
+ module Mongoid
3
3
  module Config
4
4
 
5
5
  # Encapsulates logic for setting options.
@@ -0,0 +1,25 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Config
4
+ module Validators
5
+
6
+ # Validator for configuration options.
7
+ module Option
8
+ extend self
9
+
10
+ # Validate a configuration option.
11
+ #
12
+ # @example Validate a configuraiton option.
13
+ #
14
+ # @param [ String ] option The name of the option.
15
+ #
16
+ # @since 3.0.0
17
+ def validate(option)
18
+ unless Config.settings.keys.include?(option.to_sym)
19
+ raise Errors::InvalidConfigOption.new(option)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,140 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Config
4
+ module Validators
5
+
6
+ # Validator for session specific configuration.
7
+ module Session
8
+ extend self
9
+
10
+ STANDARD = [ :database, :hosts, :username, :password ]
11
+
12
+ # Validate the session configuration.
13
+ #
14
+ # @example Validate the session config.
15
+ # Session.validate({ default: { hosts: [ "localhost:27017" ] }})
16
+ #
17
+ # @param [ Hash ] sessions The sessions config.
18
+ #
19
+ # @since 3.0.0
20
+ def validate(sessions)
21
+ unless sessions.has_key?(:default)
22
+ raise Errors::NoDefaultSession.new(sessions.keys)
23
+ end
24
+ sessions.each_pair do |name, config|
25
+ validate_session_database(name, config)
26
+ validate_session_hosts(name, config)
27
+ validate_session_uri(name, config)
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ # Validate that the session config has database.
34
+ #
35
+ # @api private
36
+ #
37
+ # @example Validate the session has database.
38
+ # validator.validate_session_database(:default, {})
39
+ #
40
+ # @param [ String, Symbol ] name The config key.
41
+ # @param [ Hash ] config The configuration.
42
+ #
43
+ # @since 3.0.0
44
+ def validate_session_database(name, config)
45
+ if no_database_or_uri?(config)
46
+ raise Errors::NoSessionDatabase.new(name, config)
47
+ end
48
+ end
49
+
50
+ # Validate that the session config has hosts.
51
+ #
52
+ # @api private
53
+ #
54
+ # @example Validate the session has hosts.
55
+ # validator.validate_session_hosts(:default, {})
56
+ #
57
+ # @param [ String, Symbol ] name The config key.
58
+ # @param [ Hash ] config The configuration.
59
+ #
60
+ # @since 3.0.0
61
+ def validate_session_hosts(name, config)
62
+ if no_hosts_or_uri?(config)
63
+ raise Errors::NoSessionHosts.new(name, config)
64
+ end
65
+ end
66
+
67
+ # Validate that not both a uri and standard options are provided for a
68
+ # single session.
69
+ #
70
+ # @api private
71
+ #
72
+ # @example Validate the uri and options.
73
+ # validator.validate_session_uri(:default, {})
74
+ #
75
+ # @param [ String, Symbol ] name The config key.
76
+ # @param [ Hash ] config The configuration.
77
+ #
78
+ # @since 3.0.0
79
+ def validate_session_uri(name, config)
80
+ if both_uri_and_standard?(config)
81
+ raise Errors::MixedSessionConfiguration.new(name, config)
82
+ end
83
+ end
84
+
85
+ # Return true if the configuration has no database or uri option
86
+ # defined.
87
+ #
88
+ # @api private
89
+ #
90
+ # @example Validate the options.
91
+ # validator.no_database_or_uri?(config)
92
+ #
93
+ # @param [ Hash ] config The configuration options.
94
+ #
95
+ # @return [ true, false ] If no database or uri is defined.
96
+ #
97
+ # @since 3.0.0
98
+ def no_database_or_uri?(config)
99
+ !config.has_key?(:database) && !config.has_key?(:uri)
100
+ end
101
+
102
+ # Return true if the configuration has no hosts or uri option
103
+ # defined.
104
+ #
105
+ # @api private
106
+ #
107
+ # @example Validate the options.
108
+ # validator.no_hosts_or_uri?(config)
109
+ #
110
+ # @param [ Hash ] config The configuration options.
111
+ #
112
+ # @return [ true, false ] If no hosts or uri is defined.
113
+ #
114
+ # @since 3.0.0
115
+ def no_hosts_or_uri?(config)
116
+ !config.has_key?(:hosts) && !config.has_key?(:uri)
117
+ end
118
+
119
+ # Return true if the configuration has both standard options and a uri
120
+ # defined.
121
+ #
122
+ # @api private
123
+ #
124
+ # @example Validate the options.
125
+ # validator.no_database_or_uri?(config)
126
+ #
127
+ # @param [ Hash ] config The configuration options.
128
+ #
129
+ # @return [ true, false ] If both standard and uri are defined.
130
+ #
131
+ # @since 3.0.0
132
+ def both_uri_and_standard?(config)
133
+ config.has_key?(:uri) && config.keys.any? do |key|
134
+ STANDARD.include?(key.to_sym)
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end
140
+ end
@@ -0,0 +1,3 @@
1
+ # encoding: utf-8
2
+ require "mongoid/config/validators/option"
3
+ require "mongoid/config/validators/session"