mongoid 2.4.10 → 3.0.0.rc
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.md +843 -9
- data/LICENSE +1 -1
- data/README.md +10 -11
- data/Rakefile +2 -17
- data/lib/config/locales/en.yml +441 -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 +16 -9
- 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 +100 -42
- data/lib/mongoid/collections/retry.rb +2 -3
- data/lib/mongoid/components.rb +10 -22
- data/lib/mongoid/config/environment.rb +4 -3
- 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 +87 -233
- data/lib/mongoid/contextual/aggregable/memory.rb +98 -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 +66 -0
- data/lib/mongoid/contextual/map_reduce.rb +273 -0
- data/lib/mongoid/contextual/memory.rb +383 -0
- data/lib/mongoid/contextual/mongo.rb +543 -0
- data/lib/mongoid/contextual.rb +50 -0
- data/lib/mongoid/copyable.rb +2 -2
- data/lib/mongoid/criteria.rb +436 -248
- 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 +68 -49
- 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_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 +22 -1
- data/lib/mongoid/extensions/array.rb +127 -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 +68 -0
- data/lib/mongoid/extensions/false_class.rb +26 -0
- data/lib/mongoid/extensions/float.rb +44 -0
- data/lib/mongoid/extensions/hash.rb +91 -0
- data/lib/mongoid/extensions/integer.rb +54 -0
- data/lib/mongoid/extensions/module.rb +28 -0
- data/lib/mongoid/extensions/nil_class.rb +21 -0
- data/lib/mongoid/extensions/object.rb +188 -0
- data/lib/mongoid/extensions/object_id.rb +53 -0
- data/lib/mongoid/extensions/range.rb +55 -0
- data/lib/mongoid/extensions/regexp.rb +27 -0
- data/lib/mongoid/extensions/set.rb +55 -0
- data/lib/mongoid/extensions/string.rb +155 -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 +26 -0
- data/lib/mongoid/extensions.rb +28 -76
- data/lib/mongoid/factory.rb +1 -1
- data/lib/mongoid/fields/foreign_key.rb +134 -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 +129 -194
- data/lib/mongoid/finders.rb +42 -43
- data/lib/mongoid/hierarchy.rb +25 -14
- data/lib/mongoid/identity_map.rb +31 -19
- 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/javascript.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 +8 -10
- data/lib/mongoid/nested_attributes.rb +17 -9
- data/lib/mongoid/observer.rb +1 -2
- data/lib/mongoid/paranoia.rb +13 -18
- 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.rb +6 -19
- data/lib/mongoid/persistence.rb +64 -27
- data/lib/mongoid/railtie.rb +26 -11
- data/lib/mongoid/railties/database.rake +22 -108
- data/lib/mongoid/relations/accessors.rb +119 -19
- 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 +3 -3
- 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 +4 -4
- data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
- data/lib/mongoid/relations/builders/referenced/many.rb +5 -5
- 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 +6 -4
- data/lib/mongoid/relations/constraint.rb +4 -3
- data/lib/mongoid/relations/conversions.rb +5 -6
- data/lib/mongoid/relations/cyclic.rb +7 -7
- data/lib/mongoid/relations/embedded/batchable.rb +346 -0
- data/lib/mongoid/relations/embedded/in.rb +23 -12
- data/lib/mongoid/relations/embedded/many.rb +99 -160
- 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 +231 -45
- data/lib/mongoid/relations/nested_builder.rb +3 -5
- 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 +60 -31
- data/lib/mongoid/relations/referenced/in.rb +40 -15
- data/lib/mongoid/relations/referenced/many.rb +116 -128
- data/lib/mongoid/relations/referenced/many_to_many.rb +101 -46
- 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 +6 -6
- data/lib/mongoid/reloading.rb +12 -14
- data/lib/mongoid/scoping.rb +329 -0
- data/lib/mongoid/serialization.rb +13 -30
- data/lib/mongoid/sessions/factory.rb +106 -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 +359 -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 +167 -59
- data/lib/mongoid/timestamps/created.rb +8 -4
- data/lib/mongoid/timestamps/timeless.rb +6 -4
- data/lib/mongoid/timestamps/updated.rb +3 -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 +8 -10
- 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 +24 -39
- 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 +59 -19
- 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 +69 -25
- metadata +92 -154
- 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.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/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
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Fields
|
|
4
|
+
class Standard
|
|
5
|
+
|
|
6
|
+
# Defines the behaviour for defined fields in the document.
|
|
7
|
+
# Set readers for the instance variables.
|
|
8
|
+
attr_accessor :default_val, :label, :name, :options
|
|
9
|
+
|
|
10
|
+
delegate :demongoize, :evolve, :mongoize, to: :type
|
|
11
|
+
|
|
12
|
+
# Adds the atomic changes for this type of resizable field.
|
|
13
|
+
#
|
|
14
|
+
# @example Add the atomic changes.
|
|
15
|
+
# field.add_atomic_changes(doc, "key", {}, [], [])
|
|
16
|
+
#
|
|
17
|
+
# @param [ Document ] document The document to add to.
|
|
18
|
+
# @param [ String ] name The name of the field.
|
|
19
|
+
# @param [ String ] key The atomic location of the field.
|
|
20
|
+
# @param [ Hash ] mods The current modifications.
|
|
21
|
+
# @param [ Array ] new The new elements to add.
|
|
22
|
+
# @param [ Array ] old The old elements getting removed.
|
|
23
|
+
#
|
|
24
|
+
# @since 2.4.0
|
|
25
|
+
def add_atomic_changes(document, name, key, mods, new, old)
|
|
26
|
+
mods[key] = new
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Get the constraint from the metadata once.
|
|
30
|
+
#
|
|
31
|
+
# @example Get the constraint.
|
|
32
|
+
# field.constraint
|
|
33
|
+
#
|
|
34
|
+
# @return [ Constraint ] The relation's contraint.
|
|
35
|
+
#
|
|
36
|
+
# @since 2.1.0
|
|
37
|
+
def constraint
|
|
38
|
+
@constraint ||= metadata.constraint
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Evaluate the default value and return it. Will handle the
|
|
42
|
+
# serialization, proc calls, and duplication if necessary.
|
|
43
|
+
#
|
|
44
|
+
# @example Evaluate the default value.
|
|
45
|
+
# field.eval_default(document)
|
|
46
|
+
#
|
|
47
|
+
# @param [ Document ] doc The document the field belongs to.
|
|
48
|
+
#
|
|
49
|
+
# @return [ Object ] The serialized default value.
|
|
50
|
+
#
|
|
51
|
+
# @since 2.1.8
|
|
52
|
+
def eval_default(doc)
|
|
53
|
+
if fields = Threaded.selection
|
|
54
|
+
evaluated_default(doc) if included?(fields)
|
|
55
|
+
else
|
|
56
|
+
evaluated_default(doc)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Is this field a foreign key?
|
|
61
|
+
#
|
|
62
|
+
# @example Is the field a foreign key?
|
|
63
|
+
# field.foreign_key?
|
|
64
|
+
#
|
|
65
|
+
# @return [ true, false ] If the field is a foreign key.
|
|
66
|
+
#
|
|
67
|
+
# @since 2.4.0
|
|
68
|
+
def foreign_key?
|
|
69
|
+
false
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Create the new field with a name and optional additional options.
|
|
73
|
+
#
|
|
74
|
+
# @example Create the new field.
|
|
75
|
+
# Field.new(:name, :type => String)
|
|
76
|
+
#
|
|
77
|
+
# @param [ Hash ] options The field options.
|
|
78
|
+
#
|
|
79
|
+
# @option options [ Class ] :type The class of the field.
|
|
80
|
+
# @option options [ Object ] :default The default value for the field.
|
|
81
|
+
# @option options [ String ] :label The field's label.
|
|
82
|
+
#
|
|
83
|
+
# @since 3.0.0
|
|
84
|
+
def initialize(name, options = {})
|
|
85
|
+
@name = name
|
|
86
|
+
@options = options
|
|
87
|
+
@label = options[:label]
|
|
88
|
+
@default_val = options[:default]
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Is the field localized or not?
|
|
92
|
+
#
|
|
93
|
+
# @example Is the field localized?
|
|
94
|
+
# field.localized?
|
|
95
|
+
#
|
|
96
|
+
# @return [ true, false ] If the field is localized.
|
|
97
|
+
#
|
|
98
|
+
# @since 2.3.0
|
|
99
|
+
def localized?
|
|
100
|
+
false
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# Get the metadata for the field if its a foreign key.
|
|
104
|
+
#
|
|
105
|
+
# @example Get the metadata.
|
|
106
|
+
# field.metadata
|
|
107
|
+
#
|
|
108
|
+
# @return [ Metadata ] The relation metadata.
|
|
109
|
+
#
|
|
110
|
+
# @since 2.2.0
|
|
111
|
+
def metadata
|
|
112
|
+
@metadata ||= options[:metadata]
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# Is the field a BSON::ObjectId?
|
|
116
|
+
#
|
|
117
|
+
# @example Is the field a BSON::ObjectId?
|
|
118
|
+
# field.object_id_field?
|
|
119
|
+
#
|
|
120
|
+
# @return [ true, false ] If the field is a BSON::ObjectId.
|
|
121
|
+
#
|
|
122
|
+
# @since 2.2.0
|
|
123
|
+
def object_id_field?
|
|
124
|
+
@object_id_field ||= (type == Moped::BSON::ObjectId)
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# Does the field pre-process it's default value?
|
|
128
|
+
#
|
|
129
|
+
# @example Does the field pre-process the default?
|
|
130
|
+
# field.pre_processed?
|
|
131
|
+
#
|
|
132
|
+
# @return [ true, false ] If the field's default is pre-processed.
|
|
133
|
+
#
|
|
134
|
+
# @since 3.0.0
|
|
135
|
+
def pre_processed?
|
|
136
|
+
@pre_processed ||=
|
|
137
|
+
(options[:pre_processed] || (default_val && !default_val.is_a?(::Proc)))
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# Get the type of this field - inferred from the class name.
|
|
141
|
+
#
|
|
142
|
+
# @example Get the type.
|
|
143
|
+
# field.type
|
|
144
|
+
#
|
|
145
|
+
# @return [ Class ] The name of the class.
|
|
146
|
+
#
|
|
147
|
+
# @since 2.1.0
|
|
148
|
+
def type
|
|
149
|
+
@type ||= options[:type] || Object
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# Is this field included in versioned attributes?
|
|
153
|
+
#
|
|
154
|
+
# @example Is the field versioned?
|
|
155
|
+
# field.versioned?
|
|
156
|
+
#
|
|
157
|
+
# @return [ true, false ] If the field is included in versioning.
|
|
158
|
+
#
|
|
159
|
+
# @since 2.1.0
|
|
160
|
+
def versioned?
|
|
161
|
+
@versioned ||= (options[:versioned].nil? ? true : options[:versioned])
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
private
|
|
165
|
+
|
|
166
|
+
# Get the name of the default method for this field.
|
|
167
|
+
#
|
|
168
|
+
# @api private
|
|
169
|
+
#
|
|
170
|
+
# @example Get the default name.
|
|
171
|
+
# field.default_name
|
|
172
|
+
#
|
|
173
|
+
# @return [ String ] The method name.
|
|
174
|
+
#
|
|
175
|
+
# @since 3.0.0
|
|
176
|
+
def default_name
|
|
177
|
+
@default_name ||= "__#{name}_default__"
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
# Define the method for getting the default on the document.
|
|
181
|
+
#
|
|
182
|
+
# @api private
|
|
183
|
+
#
|
|
184
|
+
# @example Define the method.
|
|
185
|
+
# field.define_default_method(doc)
|
|
186
|
+
#
|
|
187
|
+
# @note Ruby's instance_exec was just too slow.
|
|
188
|
+
#
|
|
189
|
+
# @param [ Document ] doc The document.
|
|
190
|
+
#
|
|
191
|
+
# @since 3.0.0
|
|
192
|
+
def define_default_method(doc)
|
|
193
|
+
unless doc.respond_to?(default_name)
|
|
194
|
+
doc.class.__send__(:define_method, default_name, default_val)
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
# Is the field included in the fields that were returned from the
|
|
199
|
+
# database? We can apply the default if:
|
|
200
|
+
# 1. The field is included in an only limitation (field: 1)
|
|
201
|
+
# 2. The field is not excluded in a without limitation (field: 0)
|
|
202
|
+
#
|
|
203
|
+
# @example Is the field included?
|
|
204
|
+
# field.included?(fields)
|
|
205
|
+
#
|
|
206
|
+
# @param [ Hash ] fields The field limitations.
|
|
207
|
+
#
|
|
208
|
+
# @return [ true, false ] If the field was included.
|
|
209
|
+
#
|
|
210
|
+
# @since 2.4.4
|
|
211
|
+
def included?(fields)
|
|
212
|
+
(fields.values.first == 1 && fields[name.to_s] == 1) ||
|
|
213
|
+
(fields.values.first == 0 && !fields.has_key?(name.to_s))
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
# Get the evaluated default.
|
|
217
|
+
#
|
|
218
|
+
# @example Get the evaluated default.
|
|
219
|
+
# field.evaluated_default.
|
|
220
|
+
#
|
|
221
|
+
# @param [ Document ] doc The doc being applied to.
|
|
222
|
+
#
|
|
223
|
+
# @return [ Object ] The default value.
|
|
224
|
+
#
|
|
225
|
+
# @since 2.4.4
|
|
226
|
+
def evaluated_default(doc)
|
|
227
|
+
if default_val.respond_to?(:call)
|
|
228
|
+
evaluate_default_proc(doc)
|
|
229
|
+
else
|
|
230
|
+
serialize_default(default_val.__deep_copy__)
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
# Evaluate the default proc. In some cases we need to instance exec,
|
|
235
|
+
# in others we don't.
|
|
236
|
+
#
|
|
237
|
+
# @example Eval the default proc.
|
|
238
|
+
# field.evaluate_default_proc(band)
|
|
239
|
+
#
|
|
240
|
+
# @param [ Document ] doc The document.
|
|
241
|
+
#
|
|
242
|
+
# @return [ Object ] The called proc.
|
|
243
|
+
#
|
|
244
|
+
# @since 3.0.0
|
|
245
|
+
def evaluate_default_proc(doc)
|
|
246
|
+
define_default_method(doc)
|
|
247
|
+
serialize_default(doc.__send__(default_name))
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
# This is used when default values need to be serialized. Most of the
|
|
251
|
+
# time just return the object.
|
|
252
|
+
#
|
|
253
|
+
# @api private
|
|
254
|
+
#
|
|
255
|
+
# @example Serialize the default value.
|
|
256
|
+
# field.serialize_default(obj)
|
|
257
|
+
#
|
|
258
|
+
# @param [ Object ] object The default.
|
|
259
|
+
#
|
|
260
|
+
# @return [ Object ] The serialized default.
|
|
261
|
+
#
|
|
262
|
+
# @since 3.0.0
|
|
263
|
+
def serialize_default(object)
|
|
264
|
+
mongoize(object)
|
|
265
|
+
end
|
|
266
|
+
end
|
|
267
|
+
end
|
|
268
|
+
end
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Fields
|
|
4
|
+
module Validators
|
|
5
|
+
|
|
6
|
+
# Validates the params passed to the field macro.
|
|
7
|
+
module Macro
|
|
8
|
+
extend self
|
|
9
|
+
|
|
10
|
+
OPTIONS = [
|
|
11
|
+
:as,
|
|
12
|
+
:default,
|
|
13
|
+
:identity,
|
|
14
|
+
:label,
|
|
15
|
+
:localize,
|
|
16
|
+
:metadata,
|
|
17
|
+
:pre_processed,
|
|
18
|
+
:subtype,
|
|
19
|
+
:type,
|
|
20
|
+
:versioned
|
|
21
|
+
]
|
|
22
|
+
|
|
23
|
+
# Validate the field definition.
|
|
24
|
+
#
|
|
25
|
+
# @example Validate the field definition.
|
|
26
|
+
# Macro.validate(Model, :name, { localized: true })
|
|
27
|
+
#
|
|
28
|
+
# @param [ Class ] klass The model class.
|
|
29
|
+
# @param [ Symbol ] name The field name.
|
|
30
|
+
# @param [ Hash ] options The provided options.
|
|
31
|
+
#
|
|
32
|
+
# @since 3.0.0
|
|
33
|
+
def validate(klass, name, options)
|
|
34
|
+
validate_name(klass, name)
|
|
35
|
+
validate_options(klass, name, options)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
private
|
|
39
|
+
|
|
40
|
+
# Determine if the field name is allowed, if not raise an error.
|
|
41
|
+
#
|
|
42
|
+
# @api private
|
|
43
|
+
#
|
|
44
|
+
# @example Check the field name.
|
|
45
|
+
# Macro.validate_name(Model, :name)
|
|
46
|
+
#
|
|
47
|
+
# @param [ Class ] klass The model class.
|
|
48
|
+
# @param [ Symbol ] name The field name.
|
|
49
|
+
#
|
|
50
|
+
# @raise [ Errors::InvalidField ] If the name is not allowed.
|
|
51
|
+
#
|
|
52
|
+
# @since 3.0.0
|
|
53
|
+
def validate_name(klass, name)
|
|
54
|
+
if Mongoid.destructive_fields.include?(name)
|
|
55
|
+
raise Errors::InvalidField.new(klass, name)
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Validate that the field options are allowed.
|
|
60
|
+
#
|
|
61
|
+
# @api private
|
|
62
|
+
#
|
|
63
|
+
# @example Validate the field options.
|
|
64
|
+
# Macro.validate_options(Model, :name, { localized: true })
|
|
65
|
+
#
|
|
66
|
+
# @param [ Class ] klass The model class.
|
|
67
|
+
# @param [ Symbol ] name The field name.
|
|
68
|
+
# @param [ Hash ] options The provided options.
|
|
69
|
+
#
|
|
70
|
+
# @raise [ Errors::InvalidFieldOption ] If an option is invalid.
|
|
71
|
+
#
|
|
72
|
+
# @since 3.0.0
|
|
73
|
+
def validate_options(klass, name, options)
|
|
74
|
+
options.keys.each do |option|
|
|
75
|
+
if !OPTIONS.include?(option) && !Fields.options.include?(option)
|
|
76
|
+
raise Errors::InvalidFieldOption.new(klass, name, option, OPTIONS)
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|