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.
- data/CHANGELOG.md +949 -10
- data/LICENSE +1 -1
- data/README.md +10 -11
- data/Rakefile +3 -17
- data/lib/config/locales/en.yml +455 -51
- data/lib/mongoid/atomic/modifiers.rb +2 -2
- data/lib/mongoid/atomic/paths/embedded/many.rb +6 -6
- data/lib/mongoid/atomic/paths/embedded/one.rb +5 -5
- data/lib/mongoid/atomic/paths/embedded.rb +4 -5
- data/lib/mongoid/atomic/paths/root.rb +4 -5
- data/lib/mongoid/atomic.rb +70 -16
- data/lib/mongoid/attributes/processing.rb +14 -10
- data/lib/mongoid/attributes/readonly.rb +56 -0
- data/lib/mongoid/attributes.rb +95 -32
- data/lib/mongoid/callbacks.rb +106 -43
- data/lib/mongoid/components.rb +12 -23
- data/lib/mongoid/config/environment.rb +7 -4
- data/lib/mongoid/config/inflections.rb +6 -0
- data/lib/mongoid/config/options.rb +1 -1
- data/lib/mongoid/config/validators/option.rb +25 -0
- data/lib/mongoid/config/validators/session.rb +140 -0
- data/lib/mongoid/config/validators.rb +3 -0
- data/lib/mongoid/config.rb +104 -225
- data/lib/mongoid/contextual/aggregable/memory.rb +109 -0
- data/lib/mongoid/contextual/aggregable/mongo.rb +181 -0
- data/lib/mongoid/contextual/atomic.rb +179 -0
- data/lib/mongoid/contextual/command.rb +43 -0
- data/lib/mongoid/contextual/find_and_modify.rb +68 -0
- data/lib/mongoid/contextual/map_reduce.rb +273 -0
- data/lib/mongoid/contextual/memory.rb +406 -0
- data/lib/mongoid/contextual/mongo.rb +662 -0
- data/lib/mongoid/contextual.rb +50 -0
- data/lib/mongoid/copyable.rb +7 -25
- data/lib/mongoid/criteria.rb +515 -245
- data/lib/mongoid/criterion/inspection.rb +14 -8
- data/lib/mongoid/criterion/scoping.rb +114 -44
- data/lib/mongoid/dirty.rb +152 -67
- data/lib/mongoid/document.rb +71 -52
- data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
- data/lib/mongoid/errors/callback.rb +5 -6
- data/lib/mongoid/errors/delete_restriction.rb +29 -0
- data/lib/mongoid/errors/document_not_found.rb +98 -17
- data/lib/mongoid/errors/eager_load.rb +3 -6
- data/lib/mongoid/errors/invalid_collection.rb +3 -3
- data/lib/mongoid/errors/invalid_config_option.rb +27 -0
- data/lib/mongoid/errors/invalid_database.rb +3 -3
- data/lib/mongoid/errors/invalid_field.rb +54 -8
- data/lib/mongoid/errors/invalid_field_option.rb +35 -0
- data/lib/mongoid/errors/invalid_find.rb +3 -3
- data/lib/mongoid/errors/invalid_index.rb +28 -0
- data/lib/mongoid/errors/invalid_options.rb +4 -4
- data/lib/mongoid/errors/invalid_scope.rb +24 -0
- data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
- data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
- data/lib/mongoid/errors/invalid_time.rb +3 -6
- data/lib/mongoid/errors/inverse_not_found.rb +29 -0
- data/lib/mongoid/errors/mixed_relations.rb +4 -9
- data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
- data/lib/mongoid/errors/mongoid_error.rb +54 -3
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
- data/lib/mongoid/errors/no_default_session.rb +23 -0
- data/lib/mongoid/errors/no_environment.rb +3 -3
- data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
- data/lib/mongoid/errors/no_metadata.rb +21 -0
- data/lib/mongoid/errors/no_parent.rb +24 -0
- data/lib/mongoid/errors/no_session_config.rb +22 -0
- data/lib/mongoid/errors/no_session_database.rb +27 -0
- data/lib/mongoid/errors/no_session_hosts.rb +27 -0
- data/lib/mongoid/errors/no_sessions_config.rb +20 -0
- data/lib/mongoid/errors/readonly_attribute.rb +25 -0
- data/lib/mongoid/errors/scope_overwrite.rb +4 -4
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +4 -4
- data/lib/mongoid/errors/unknown_attribute.rb +25 -0
- data/lib/mongoid/errors/unsaved_document.rb +4 -8
- data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
- data/lib/mongoid/errors/unsupported_version.rb +4 -4
- data/lib/mongoid/errors/validations.rb +7 -6
- data/lib/mongoid/errors/versioning_not_on_root.rb +23 -0
- data/lib/mongoid/errors.rb +23 -1
- data/lib/mongoid/evolvable.rb +19 -0
- data/lib/mongoid/extensions/array.rb +164 -0
- data/lib/mongoid/extensions/big_decimal.rb +42 -0
- data/lib/mongoid/extensions/boolean.rb +24 -0
- data/lib/mongoid/extensions/date.rb +70 -0
- data/lib/mongoid/extensions/date_time.rb +73 -0
- data/lib/mongoid/extensions/false_class.rb +38 -0
- data/lib/mongoid/extensions/float.rb +56 -0
- data/lib/mongoid/extensions/hash.rb +123 -0
- data/lib/mongoid/extensions/integer.rb +66 -0
- data/lib/mongoid/extensions/module.rb +28 -0
- data/lib/mongoid/extensions/nil_class.rb +21 -0
- data/lib/mongoid/extensions/object.rb +238 -0
- data/lib/mongoid/extensions/object_id.rb +54 -0
- data/lib/mongoid/extensions/range.rb +79 -0
- data/lib/mongoid/extensions/regexp.rb +27 -0
- data/lib/mongoid/extensions/set.rb +55 -0
- data/lib/mongoid/extensions/string.rb +181 -0
- data/lib/mongoid/extensions/symbol.rb +54 -0
- data/lib/mongoid/extensions/time.rb +78 -0
- data/lib/mongoid/extensions/time_with_zone.rb +55 -0
- data/lib/mongoid/extensions/true_class.rb +38 -0
- data/lib/mongoid/extensions.rb +28 -76
- data/lib/mongoid/factory.rb +1 -1
- data/lib/mongoid/fields/foreign_key.rb +150 -0
- data/lib/mongoid/fields/localized.rb +73 -0
- data/lib/mongoid/fields/standard.rb +268 -0
- data/lib/mongoid/fields/validators/macro.rb +83 -0
- data/lib/mongoid/fields/validators.rb +2 -0
- data/lib/mongoid/fields.rb +142 -208
- data/lib/mongoid/finders.rb +45 -50
- data/lib/mongoid/hierarchy.rb +44 -15
- data/lib/mongoid/identity_map.rb +49 -21
- data/lib/mongoid/indexes/validators/options.rb +80 -0
- data/lib/mongoid/indexes.rb +66 -15
- data/lib/mongoid/inspection.rb +1 -1
- data/lib/mongoid/json.rb +2 -2
- data/lib/mongoid/loggable.rb +69 -0
- data/lib/mongoid/matchers/all.rb +7 -8
- data/lib/mongoid/matchers/and.rb +3 -3
- data/lib/mongoid/matchers/default.rb +6 -4
- data/lib/mongoid/matchers/exists.rb +2 -2
- data/lib/mongoid/matchers/gt.rb +2 -2
- data/lib/mongoid/matchers/gte.rb +2 -2
- data/lib/mongoid/matchers/in.rb +3 -7
- data/lib/mongoid/matchers/lt.rb +2 -2
- data/lib/mongoid/matchers/lte.rb +2 -2
- data/lib/mongoid/matchers/ne.rb +2 -2
- data/lib/mongoid/matchers/nin.rb +2 -2
- data/lib/mongoid/matchers/or.rb +2 -2
- data/lib/mongoid/matchers/size.rb +2 -2
- data/lib/mongoid/matchers/strategies.rb +3 -3
- data/lib/mongoid/matchers.rb +1 -1
- data/lib/mongoid/multi_parameter_attributes.rb +9 -11
- data/lib/mongoid/nested_attributes.rb +17 -9
- data/lib/mongoid/observer.rb +1 -2
- data/lib/mongoid/paranoia.rb +10 -44
- data/lib/mongoid/persistence/atomic/add_to_set.rb +5 -9
- data/lib/mongoid/persistence/atomic/bit.rb +5 -7
- data/lib/mongoid/persistence/atomic/inc.rb +5 -7
- data/lib/mongoid/persistence/atomic/operation.rb +45 -6
- data/lib/mongoid/persistence/atomic/pop.rb +5 -7
- data/lib/mongoid/persistence/atomic/pull.rb +5 -7
- data/lib/mongoid/persistence/atomic/pull_all.rb +5 -7
- data/lib/mongoid/persistence/atomic/push.rb +4 -10
- data/lib/mongoid/persistence/atomic/push_all.rb +4 -10
- data/lib/mongoid/persistence/atomic/rename.rb +6 -7
- data/lib/mongoid/persistence/atomic/sets.rb +5 -7
- data/lib/mongoid/persistence/atomic/unset.rb +4 -5
- data/lib/mongoid/persistence/atomic.rb +2 -2
- data/lib/mongoid/persistence/deletion.rb +2 -2
- data/lib/mongoid/persistence/insertion.rb +10 -16
- data/lib/mongoid/persistence/modification.rb +5 -9
- data/lib/mongoid/persistence/operations/embedded/insert.rb +7 -6
- data/lib/mongoid/persistence/operations/embedded/remove.rb +5 -5
- data/lib/mongoid/persistence/operations/insert.rb +4 -4
- data/lib/mongoid/persistence/operations/remove.rb +4 -4
- data/lib/mongoid/persistence/operations/update.rb +5 -5
- data/lib/mongoid/persistence/operations/upsert.rb +28 -0
- data/lib/mongoid/persistence/operations.rb +22 -19
- data/lib/mongoid/persistence/upsertion.rb +30 -0
- data/lib/mongoid/persistence.rb +94 -39
- data/lib/mongoid/railtie.rb +26 -11
- data/lib/mongoid/railties/database.rake +22 -108
- data/lib/mongoid/relations/accessors.rb +120 -20
- data/lib/mongoid/relations/auto_save.rb +59 -5
- data/lib/mongoid/relations/binding.rb +211 -2
- data/lib/mongoid/relations/bindings/embedded/in.rb +16 -22
- data/lib/mongoid/relations/bindings/embedded/many.rb +9 -50
- data/lib/mongoid/relations/bindings/embedded/one.rb +10 -16
- data/lib/mongoid/relations/bindings/referenced/in.rb +31 -57
- data/lib/mongoid/relations/bindings/referenced/many.rb +8 -20
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -19
- data/lib/mongoid/relations/bindings/referenced/one.rb +10 -24
- data/lib/mongoid/relations/builder.rb +4 -4
- data/lib/mongoid/relations/builders/embedded/in.rb +5 -5
- data/lib/mongoid/relations/builders/embedded/many.rb +12 -12
- data/lib/mongoid/relations/builders/embedded/one.rb +6 -6
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +8 -8
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +5 -5
- data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
- data/lib/mongoid/relations/builders/referenced/many.rb +6 -6
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +7 -5
- data/lib/mongoid/relations/builders/referenced/one.rb +5 -5
- data/lib/mongoid/relations/builders.rb +19 -16
- data/lib/mongoid/relations/cascading/delete.rb +3 -5
- data/lib/mongoid/relations/cascading/destroy.rb +3 -3
- data/lib/mongoid/relations/cascading/nullify.rb +3 -3
- data/lib/mongoid/relations/cascading/restrict.rb +37 -0
- data/lib/mongoid/relations/cascading.rb +10 -7
- data/lib/mongoid/relations/constraint.rb +4 -3
- data/lib/mongoid/relations/conversions.rb +6 -7
- data/lib/mongoid/relations/cyclic.rb +7 -7
- data/lib/mongoid/relations/embedded/batchable.rb +347 -0
- data/lib/mongoid/relations/embedded/in.rb +23 -12
- data/lib/mongoid/relations/embedded/many.rb +100 -161
- data/lib/mongoid/relations/embedded/one.rb +25 -14
- data/lib/mongoid/relations/macros.rb +105 -60
- data/lib/mongoid/relations/many.rb +93 -14
- data/lib/mongoid/relations/metadata.rb +277 -47
- data/lib/mongoid/relations/nested_builder.rb +4 -6
- data/lib/mongoid/relations/one.rb +2 -2
- data/lib/mongoid/relations/options.rb +2 -2
- data/lib/mongoid/relations/polymorphic.rb +9 -9
- data/lib/mongoid/relations/proxy.rb +62 -31
- data/lib/mongoid/relations/referenced/in.rb +40 -15
- data/lib/mongoid/relations/referenced/many.rb +162 -130
- data/lib/mongoid/relations/referenced/many_to_many.rb +104 -48
- data/lib/mongoid/relations/referenced/one.rb +34 -13
- data/lib/mongoid/relations/reflections.rb +3 -3
- data/lib/mongoid/relations/synchronization.rb +19 -23
- data/lib/mongoid/relations/targets/enumerable.rb +86 -57
- data/lib/mongoid/relations/touchable.rb +32 -0
- data/lib/mongoid/relations.rb +22 -6
- data/lib/mongoid/reloading.rb +12 -14
- data/lib/mongoid/scoping.rb +312 -0
- data/lib/mongoid/serialization.rb +94 -42
- data/lib/mongoid/sessions/factory.rb +108 -0
- data/lib/mongoid/sessions/mongo_uri.rb +93 -0
- data/lib/mongoid/sessions/validators/storage.rb +49 -0
- data/lib/mongoid/sessions/validators.rb +2 -0
- data/lib/mongoid/sessions.rb +383 -0
- data/lib/mongoid/sharding.rb +6 -6
- data/lib/mongoid/state.rb +6 -7
- data/lib/mongoid/threaded/lifecycle.rb +21 -21
- data/lib/mongoid/threaded/sessions.rb +0 -0
- data/lib/mongoid/threaded.rb +219 -59
- data/lib/mongoid/timestamps/created.rb +8 -4
- data/lib/mongoid/timestamps/timeless.rb +6 -4
- data/lib/mongoid/timestamps/updated.rb +4 -3
- data/lib/mongoid/timestamps.rb +1 -1
- data/lib/mongoid/unit_of_work.rb +61 -0
- data/lib/mongoid/validations/associated.rb +2 -2
- data/lib/mongoid/validations/format.rb +2 -2
- data/lib/mongoid/validations/presence.rb +34 -4
- data/lib/mongoid/validations/uniqueness.rb +11 -12
- data/lib/mongoid/validations.rb +28 -20
- data/lib/mongoid/version.rb +2 -2
- data/lib/mongoid/versioning.rb +25 -26
- data/lib/mongoid.rb +37 -37
- data/lib/rack/mongoid/middleware/identity_map.rb +3 -3
- data/lib/rails/generators/mongoid/config/config_generator.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +65 -17
- data/lib/rails/generators/mongoid/model/model_generator.rb +7 -7
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +2 -2
- data/lib/rails/generators/mongoid/observer/observer_generator.rb +4 -4
- data/lib/rails/generators/mongoid_generator.rb +5 -5
- data/lib/rails/mongoid.rb +73 -26
- metadata +103 -148
- data/lib/config/locales/bg.yml +0 -61
- data/lib/config/locales/de.yml +0 -61
- data/lib/config/locales/en-GB.yml +0 -64
- data/lib/config/locales/es.yml +0 -59
- data/lib/config/locales/fr.yml +0 -62
- data/lib/config/locales/hi.yml +0 -53
- data/lib/config/locales/hu.yml +0 -64
- data/lib/config/locales/id.yml +0 -62
- data/lib/config/locales/it.yml +0 -59
- data/lib/config/locales/ja.yml +0 -57
- data/lib/config/locales/kr.yml +0 -54
- data/lib/config/locales/nl.yml +0 -61
- data/lib/config/locales/pl.yml +0 -59
- data/lib/config/locales/pt-BR.yml +0 -60
- data/lib/config/locales/pt.yml +0 -60
- data/lib/config/locales/ro.yml +0 -66
- data/lib/config/locales/ru.yml +0 -61
- data/lib/config/locales/sv.yml +0 -60
- data/lib/config/locales/vi.yml +0 -62
- data/lib/config/locales/zh-CN.yml +0 -53
- data/lib/mongoid/collection.rb +0 -157
- data/lib/mongoid/collections/master.rb +0 -45
- data/lib/mongoid/collections/operations.rb +0 -44
- data/lib/mongoid/collections/retry.rb +0 -59
- data/lib/mongoid/collections.rb +0 -120
- data/lib/mongoid/config/database.rb +0 -181
- data/lib/mongoid/config/replset_database.rb +0 -80
- data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
- data/lib/mongoid/contexts/enumerable.rb +0 -313
- data/lib/mongoid/contexts/mongo.rb +0 -487
- data/lib/mongoid/contexts.rb +0 -25
- data/lib/mongoid/criterion/builder.rb +0 -34
- data/lib/mongoid/criterion/complex.rb +0 -84
- data/lib/mongoid/criterion/creational.rb +0 -34
- data/lib/mongoid/criterion/exclusion.rb +0 -108
- data/lib/mongoid/criterion/inclusion.rb +0 -290
- data/lib/mongoid/criterion/optional.rb +0 -259
- data/lib/mongoid/criterion/selector.rb +0 -177
- data/lib/mongoid/cursor.rb +0 -88
- data/lib/mongoid/default_scope.rb +0 -36
- data/lib/mongoid/errors/invalid_type.rb +0 -25
- data/lib/mongoid/extensions/array/deep_copy.rb +0 -25
- data/lib/mongoid/extensions/array/deletion.rb +0 -29
- data/lib/mongoid/extensions/false_class/equality.rb +0 -26
- data/lib/mongoid/extensions/hash/criteria_helpers.rb +0 -47
- data/lib/mongoid/extensions/hash/deep_copy.rb +0 -25
- data/lib/mongoid/extensions/hash/scoping.rb +0 -25
- data/lib/mongoid/extensions/integer/checks.rb +0 -23
- data/lib/mongoid/extensions/nil/collectionization.rb +0 -23
- data/lib/mongoid/extensions/object/checks.rb +0 -29
- data/lib/mongoid/extensions/object/deep_copy.rb +0 -21
- data/lib/mongoid/extensions/object/reflections.rb +0 -48
- data/lib/mongoid/extensions/object/substitutable.rb +0 -15
- data/lib/mongoid/extensions/object/yoda.rb +0 -44
- data/lib/mongoid/extensions/object_id/conversions.rb +0 -60
- data/lib/mongoid/extensions/proc/scoping.rb +0 -25
- data/lib/mongoid/extensions/string/checks.rb +0 -36
- data/lib/mongoid/extensions/string/conversions.rb +0 -22
- data/lib/mongoid/extensions/string/inflections.rb +0 -118
- data/lib/mongoid/extensions/symbol/checks.rb +0 -23
- data/lib/mongoid/extensions/symbol/inflections.rb +0 -67
- data/lib/mongoid/extensions/true_class/equality.rb +0 -26
- data/lib/mongoid/extras.rb +0 -31
- data/lib/mongoid/fields/internal/array.rb +0 -76
- data/lib/mongoid/fields/internal/big_decimal.rb +0 -63
- data/lib/mongoid/fields/internal/bignum.rb +0 -10
- data/lib/mongoid/fields/internal/binary.rb +0 -11
- data/lib/mongoid/fields/internal/boolean.rb +0 -58
- data/lib/mongoid/fields/internal/date.rb +0 -51
- data/lib/mongoid/fields/internal/date_time.rb +0 -28
- data/lib/mongoid/fields/internal/false_class.rb +0 -10
- data/lib/mongoid/fields/internal/fixnum.rb +0 -10
- data/lib/mongoid/fields/internal/float.rb +0 -47
- data/lib/mongoid/fields/internal/foreign_keys/array.rb +0 -88
- data/lib/mongoid/fields/internal/foreign_keys/object.rb +0 -56
- data/lib/mongoid/fields/internal/hash.rb +0 -11
- data/lib/mongoid/fields/internal/integer.rb +0 -59
- data/lib/mongoid/fields/internal/localized.rb +0 -62
- data/lib/mongoid/fields/internal/nil_class.rb +0 -53
- data/lib/mongoid/fields/internal/object.rb +0 -11
- data/lib/mongoid/fields/internal/object_id.rb +0 -46
- data/lib/mongoid/fields/internal/range.rb +0 -61
- data/lib/mongoid/fields/internal/set.rb +0 -57
- data/lib/mongoid/fields/internal/string.rb +0 -42
- data/lib/mongoid/fields/internal/symbol.rb +0 -43
- data/lib/mongoid/fields/internal/time.rb +0 -23
- data/lib/mongoid/fields/internal/time_with_zone.rb +0 -23
- data/lib/mongoid/fields/internal/timekeeping.rb +0 -122
- data/lib/mongoid/fields/internal/true_class.rb +0 -10
- data/lib/mongoid/fields/mappings.rb +0 -42
- data/lib/mongoid/fields/serializable.rb +0 -270
- data/lib/mongoid/identity.rb +0 -92
- data/lib/mongoid/javascript/functions.yml +0 -63
- data/lib/mongoid/javascript.rb +0 -20
- data/lib/mongoid/keys.rb +0 -144
- data/lib/mongoid/logger.rb +0 -45
- data/lib/mongoid/multi_database.rb +0 -36
- data/lib/mongoid/named_scope.rb +0 -166
- data/lib/mongoid/relations/embedded/atomic/operation.rb +0 -63
- data/lib/mongoid/relations/embedded/atomic/pull.rb +0 -65
- data/lib/mongoid/relations/embedded/atomic/push_all.rb +0 -59
- data/lib/mongoid/relations/embedded/atomic/set.rb +0 -61
- data/lib/mongoid/relations/embedded/atomic/unset.rb +0 -41
- data/lib/mongoid/relations/embedded/atomic.rb +0 -89
- data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
- data/lib/mongoid/relations/referenced/batch.rb +0 -73
- data/lib/mongoid/safety.rb +0 -105
- data/lib/mongoid/scope.rb +0 -31
data/lib/mongoid/callbacks.rb
CHANGED
|
@@ -1,26 +1,77 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
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
|
-
:
|
|
10
|
-
:
|
|
11
|
-
:
|
|
12
|
-
:
|
|
13
|
-
:
|
|
14
|
-
:
|
|
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, :
|
|
22
|
-
define_model_callbacks :build, :
|
|
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
|
-
|
|
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
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
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
|
data/lib/mongoid/components.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Components
|
|
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::
|
|
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::
|
|
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::
|
|
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::
|
|
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::
|
|
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.
|
|
92
|
-
|
|
93
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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,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
|