mongoid 2.8.1 → 3.0.0.rc
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.md +802 -58
- data/LICENSE +1 -1
- data/README.md +10 -11
- data/Rakefile +2 -8
- data/lib/config/locales/en.yml +441 -51
- data/lib/mongoid.rb +24 -39
- data/lib/mongoid/atomic.rb +16 -33
- data/lib/mongoid/atomic/modifiers.rb +2 -2
- data/lib/mongoid/atomic/paths/embedded.rb +4 -5
- 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/root.rb +4 -5
- data/lib/mongoid/attributes.rb +95 -32
- data/lib/mongoid/attributes/processing.rb +14 -10
- data/lib/mongoid/attributes/readonly.rb +56 -0
- data/lib/mongoid/callbacks.rb +90 -27
- data/lib/mongoid/collections/retry.rb +2 -3
- data/lib/mongoid/components.rb +11 -23
- data/lib/mongoid/config.rb +87 -233
- data/lib/mongoid/config/environment.rb +5 -6
- data/lib/mongoid/config/inflections.rb +6 -0
- data/lib/mongoid/config/options.rb +1 -1
- data/lib/mongoid/config/validators.rb +3 -0
- data/lib/mongoid/config/validators/option.rb +25 -0
- data/lib/mongoid/config/validators/session.rb +140 -0
- data/lib/mongoid/contextual.rb +50 -0
- 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/copyable.rb +3 -34
- data/lib/mongoid/criteria.rb +436 -250
- 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 +69 -50
- data/lib/mongoid/errors.rb +22 -1
- 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/extensions.rb +28 -76
- 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/factory.rb +1 -1
- data/lib/mongoid/fields.rb +129 -194
- 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.rb +2 -0
- data/lib/mongoid/fields/validators/macro.rb +83 -0
- 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.rb +66 -15
- data/lib/mongoid/indexes/validators/options.rb +80 -0
- 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.rb +1 -1
- 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/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.rb +43 -39
- data/lib/mongoid/persistence/atomic.rb +2 -2
- 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/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.rb +6 -19
- 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/railtie.rb +26 -11
- data/lib/mongoid/railties/database.rake +22 -108
- data/lib/mongoid/relations.rb +4 -6
- 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.rb +19 -16
- 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/cascading.rb +6 -4
- 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/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 -161
- data/lib/mongoid/relations/embedded/one.rb +25 -14
- data/lib/mongoid/relations/macros.rb +105 -61
- data/lib/mongoid/relations/many.rb +93 -14
- data/lib/mongoid/relations/metadata.rb +200 -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 +117 -132
- 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/reloading.rb +12 -14
- data/lib/mongoid/scoping.rb +329 -0
- data/lib/mongoid/serialization.rb +8 -27
- data/lib/mongoid/sessions.rb +359 -0
- data/lib/mongoid/sessions/factory.rb +106 -0
- data/lib/mongoid/sessions/mongo_uri.rb +93 -0
- data/lib/mongoid/sessions/validators.rb +2 -0
- data/lib/mongoid/sessions/validators/storage.rb +49 -0
- data/lib/mongoid/sharding.rb +6 -6
- data/lib/mongoid/state.rb +6 -7
- data/lib/mongoid/threaded.rb +167 -59
- data/lib/mongoid/threaded/lifecycle.rb +21 -22
- data/lib/mongoid/threaded/sessions.rb +0 -0
- data/lib/mongoid/timestamps.rb +1 -1
- 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/unit_of_work.rb +61 -0
- data/lib/mongoid/validations.rb +27 -19
- data/lib/mongoid/validations/associated.rb +2 -2
- data/lib/mongoid/validations/format.rb +2 -2
- data/lib/mongoid/validations/presence.rb +31 -5
- data/lib/mongoid/validations/uniqueness.rb +9 -12
- data/lib/mongoid/version.rb +2 -2
- data/lib/mongoid/versioning.rb +25 -26
- 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 +110 -137
- checksums.yaml +0 -7
- 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.rb +0 -120
- data/lib/mongoid/collections/master.rb +0 -45
- data/lib/mongoid/collections/operations.rb +0 -44
- data/lib/mongoid/config/database.rb +0 -181
- data/lib/mongoid/config/replset_database.rb +0 -80
- data/lib/mongoid/contexts.rb +0 -25
- data/lib/mongoid/contexts/enumerable.rb +0 -313
- data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
- data/lib/mongoid/contexts/mongo.rb +0 -487
- 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 -110
- 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 -77
- 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.rb +0 -89
- 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/referenced/batch.rb +0 -73
- data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
- data/lib/mongoid/safety.rb +0 -105
- data/lib/mongoid/scope.rb +0 -31
@@ -0,0 +1,55 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Extensions
|
4
|
+
module TimeWithZone
|
5
|
+
|
6
|
+
# Turn the object from the ruby type we deal with to a Mongo friendly
|
7
|
+
# type.
|
8
|
+
#
|
9
|
+
# @example Mongoize the object.
|
10
|
+
# date_time.mongoize
|
11
|
+
#
|
12
|
+
# @return [ Time ] The object mongoized.
|
13
|
+
#
|
14
|
+
# @since 3.0.0
|
15
|
+
def mongoize
|
16
|
+
::ActiveSupport::TimeWithZone.mongoize(self)
|
17
|
+
end
|
18
|
+
|
19
|
+
module ClassMethods
|
20
|
+
|
21
|
+
# Convert the object from it's mongo friendly ruby type to this type.
|
22
|
+
#
|
23
|
+
# @example Demongoize the object.
|
24
|
+
# TimeWithZone.demongoize(object)
|
25
|
+
#
|
26
|
+
# @param [ Time ] object The time from Mongo.
|
27
|
+
#
|
28
|
+
# @return [ TimeWithZone ] The object as a date.
|
29
|
+
#
|
30
|
+
# @since 3.0.0
|
31
|
+
def demongoize(object)
|
32
|
+
::Time.demongoize(object).in_time_zone
|
33
|
+
end
|
34
|
+
|
35
|
+
# Turn the object from the ruby type we deal with to a Mongo friendly
|
36
|
+
# type.
|
37
|
+
#
|
38
|
+
# @example Mongoize the object.
|
39
|
+
# TimeWithZone.mongoize("2012-1-1")
|
40
|
+
#
|
41
|
+
# @param [ Object ] object The object to convert.
|
42
|
+
#
|
43
|
+
# @return [ Time ] The object mongoized.
|
44
|
+
#
|
45
|
+
# @since 3.0.0
|
46
|
+
def mongoize(object)
|
47
|
+
::Time.mongoize(object)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
::ActiveSupport::TimeWithZone.__send__(:include, Mongoid::Extensions::TimeWithZone)
|
55
|
+
::ActiveSupport::TimeWithZone.__send__(:extend, Mongoid::Extensions::TimeWithZone::ClassMethods)
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Extensions
|
4
|
+
module TrueClass
|
5
|
+
|
6
|
+
# Is the passed value a boolean?
|
7
|
+
#
|
8
|
+
# @example Is the value a boolean type?
|
9
|
+
# true.is_a?(Boolean)
|
10
|
+
#
|
11
|
+
# @param [ Class ] other The class to check.
|
12
|
+
#
|
13
|
+
# @return [ true, false ] If the other is a boolean.
|
14
|
+
#
|
15
|
+
# @since 1.0.0
|
16
|
+
def is_a?(other)
|
17
|
+
if other == ::Boolean || other.class == ::Boolean
|
18
|
+
return true
|
19
|
+
end
|
20
|
+
super(other)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
::TrueClass.__send__(:include, Mongoid::Extensions::TrueClass)
|
data/lib/mongoid/factory.rb
CHANGED
data/lib/mongoid/fields.rb
CHANGED
@@ -1,34 +1,10 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
require "mongoid/fields/
|
3
|
-
require "mongoid/fields/
|
4
|
-
require "mongoid/fields/
|
5
|
-
require "mongoid/fields/
|
6
|
-
|
7
|
-
|
8
|
-
require "mongoid/fields/internal/boolean"
|
9
|
-
require "mongoid/fields/internal/date"
|
10
|
-
require "mongoid/fields/internal/date_time"
|
11
|
-
require "mongoid/fields/internal/false_class"
|
12
|
-
require "mongoid/fields/internal/float"
|
13
|
-
require "mongoid/fields/internal/hash"
|
14
|
-
require "mongoid/fields/internal/integer"
|
15
|
-
require "mongoid/fields/internal/bignum"
|
16
|
-
require "mongoid/fields/internal/fixnum"
|
17
|
-
require "mongoid/fields/internal/localized"
|
18
|
-
require "mongoid/fields/internal/nil_class"
|
19
|
-
require "mongoid/fields/internal/object"
|
20
|
-
require "mongoid/fields/internal/object_id"
|
21
|
-
require "mongoid/fields/internal/range"
|
22
|
-
require "mongoid/fields/internal/set"
|
23
|
-
require "mongoid/fields/internal/string"
|
24
|
-
require "mongoid/fields/internal/symbol"
|
25
|
-
require "mongoid/fields/internal/time"
|
26
|
-
require "mongoid/fields/internal/time_with_zone"
|
27
|
-
require "mongoid/fields/internal/true_class"
|
28
|
-
require "mongoid/fields/internal/foreign_keys/array"
|
29
|
-
require "mongoid/fields/internal/foreign_keys/object"
|
30
|
-
|
31
|
-
module Mongoid #:nodoc
|
2
|
+
require "mongoid/fields/standard"
|
3
|
+
require "mongoid/fields/foreign_key"
|
4
|
+
require "mongoid/fields/localized"
|
5
|
+
require "mongoid/fields/validators"
|
6
|
+
|
7
|
+
module Mongoid
|
32
8
|
|
33
9
|
# This module defines behaviour for fields.
|
34
10
|
module Fields
|
@@ -37,31 +13,38 @@ module Mongoid #:nodoc
|
|
37
13
|
included do
|
38
14
|
class_attribute :aliased_fields
|
39
15
|
class_attribute :fields
|
40
|
-
class_attribute :
|
41
|
-
class_attribute :
|
16
|
+
class_attribute :pre_processed_defaults
|
17
|
+
class_attribute :post_processed_defaults
|
42
18
|
|
43
|
-
self.aliased_fields = {}
|
19
|
+
self.aliased_fields = { "id" => "_id" }
|
44
20
|
self.fields = {}
|
45
|
-
self.
|
46
|
-
self.
|
21
|
+
self.pre_processed_defaults = []
|
22
|
+
self.post_processed_defaults = []
|
47
23
|
|
48
|
-
field(:_type, :type
|
49
|
-
field(
|
24
|
+
field(:_type, default: ->{ self.class.name if hereditary? }, type: String)
|
25
|
+
field(
|
26
|
+
:_id,
|
27
|
+
default: ->{ BSON::ObjectId.new },
|
28
|
+
pre_processed: true,
|
29
|
+
type: BSON::ObjectId
|
30
|
+
)
|
50
31
|
|
51
32
|
alias :id :_id
|
52
33
|
alias :id= :_id=
|
34
|
+
|
35
|
+
attr_protected(:id, :_id, :_type) if Mongoid.protect_sensitive_fields?
|
53
36
|
end
|
54
37
|
|
55
38
|
# Apply all default values to the document which are not procs.
|
56
39
|
#
|
57
40
|
# @example Apply all the non-proc defaults.
|
58
|
-
# model.
|
41
|
+
# model.apply_pre_processed_defaults
|
59
42
|
#
|
60
43
|
# @return [ Array<String ] The names of the non-proc defaults.
|
61
44
|
#
|
62
45
|
# @since 2.4.0
|
63
|
-
def
|
64
|
-
|
46
|
+
def apply_pre_processed_defaults
|
47
|
+
pre_processed_defaults.each do |name|
|
65
48
|
apply_default(name)
|
66
49
|
end
|
67
50
|
end
|
@@ -69,13 +52,13 @@ module Mongoid #:nodoc
|
|
69
52
|
# Apply all default values to the document which are procs.
|
70
53
|
#
|
71
54
|
# @example Apply all the proc defaults.
|
72
|
-
# model.
|
55
|
+
# model.apply_post_processed_defaults
|
73
56
|
#
|
74
57
|
# @return [ Array<String ] The names of the proc defaults.
|
75
58
|
#
|
76
59
|
# @since 2.4.0
|
77
|
-
def
|
78
|
-
|
60
|
+
def apply_post_processed_defaults
|
61
|
+
post_processed_defaults.each do |name|
|
79
62
|
apply_default(name)
|
80
63
|
end
|
81
64
|
end
|
@@ -107,20 +90,20 @@ module Mongoid #:nodoc
|
|
107
90
|
#
|
108
91
|
# @since 2.4.0
|
109
92
|
def apply_defaults
|
110
|
-
|
111
|
-
|
93
|
+
apply_pre_processed_defaults
|
94
|
+
apply_post_processed_defaults
|
112
95
|
end
|
113
96
|
|
114
|
-
#
|
97
|
+
# Is the document using object ids?
|
115
98
|
#
|
116
|
-
# @
|
117
|
-
# model.defaults
|
99
|
+
# @note Refactored from using delegate for class load performance.
|
118
100
|
#
|
119
|
-
# @
|
101
|
+
# @example Is the document using object ids?
|
102
|
+
# model.using_object_ids?
|
120
103
|
#
|
121
|
-
# @
|
122
|
-
def
|
123
|
-
self.class.
|
104
|
+
# @return [ true, false ] Using object ids.
|
105
|
+
def using_object_ids?
|
106
|
+
self.class.using_object_ids?
|
124
107
|
end
|
125
108
|
|
126
109
|
class << self
|
@@ -160,18 +143,21 @@ module Mongoid #:nodoc
|
|
160
143
|
end
|
161
144
|
end
|
162
145
|
|
163
|
-
module ClassMethods
|
146
|
+
module ClassMethods
|
164
147
|
|
165
|
-
#
|
148
|
+
# Returns an array of names for the attributes available on this object.
|
166
149
|
#
|
167
|
-
#
|
168
|
-
#
|
150
|
+
# Provides the field names in an ORM-agnostic way. Rails v3.1+ uses this
|
151
|
+
# meathod to automatically wrap params in JSON requests.
|
169
152
|
#
|
170
|
-
# @
|
153
|
+
# @example Get the field names
|
154
|
+
# Model.attribute_names
|
171
155
|
#
|
172
|
-
# @
|
173
|
-
|
174
|
-
|
156
|
+
# @return [ Array<String> ] The field names
|
157
|
+
#
|
158
|
+
# @since 3.0.0
|
159
|
+
def attribute_names
|
160
|
+
fields.keys
|
175
161
|
end
|
176
162
|
|
177
163
|
# Defines all the fields that are accessible on the Document
|
@@ -191,12 +177,12 @@ module Mongoid #:nodoc
|
|
191
177
|
# @return [ Field ] The generated field
|
192
178
|
def field(name, options = {})
|
193
179
|
named = name.to_s
|
194
|
-
|
195
|
-
add_field(named, options)
|
196
|
-
|
197
|
-
|
198
|
-
end
|
180
|
+
Validators::Macro.validate(self, name, options)
|
181
|
+
added = add_field(named, options)
|
182
|
+
descendants.each do |subclass|
|
183
|
+
subclass.add_field(named, options)
|
199
184
|
end
|
185
|
+
added
|
200
186
|
end
|
201
187
|
|
202
188
|
# When inheriting, we want to copy the fields from the parent class and
|
@@ -211,25 +197,8 @@ module Mongoid #:nodoc
|
|
211
197
|
# @since 2.0.0.rc.6
|
212
198
|
def inherited(subclass)
|
213
199
|
super
|
214
|
-
subclass.fields, subclass.
|
215
|
-
fields.dup,
|
216
|
-
end
|
217
|
-
|
218
|
-
# Is the field with the provided name a BSON::ObjectId?
|
219
|
-
#
|
220
|
-
# @example Is the field a BSON::ObjectId?
|
221
|
-
# Person.object_id_field?(:name)
|
222
|
-
#
|
223
|
-
# @param [ String, Symbol ] name The name of the field.
|
224
|
-
#
|
225
|
-
# @return [ true, false ] If the field is a BSON::ObjectId.
|
226
|
-
#
|
227
|
-
# @since 2.2.0
|
228
|
-
def object_id_field?(name)
|
229
|
-
field_name = name.to_s
|
230
|
-
field_name = "_id" if field_name == "id"
|
231
|
-
field = fields[field_name]
|
232
|
-
field ? field.object_id_field? : false
|
200
|
+
subclass.fields, subclass.pre_processed_defaults, subclass.post_processed_defaults =
|
201
|
+
fields.dup, pre_processed_defaults.dup, post_processed_defaults.dup
|
233
202
|
end
|
234
203
|
|
235
204
|
# Replace a field with a new type.
|
@@ -244,8 +213,21 @@ module Mongoid #:nodoc
|
|
244
213
|
#
|
245
214
|
# @since 2.1.0
|
246
215
|
def replace_field(name, type)
|
247
|
-
|
248
|
-
add_field(name, fields[name].options.merge(:
|
216
|
+
remove_defaults(name)
|
217
|
+
add_field(name, fields[name].options.merge(type: type))
|
218
|
+
end
|
219
|
+
|
220
|
+
# Convenience method for determining if we are using +BSON::ObjectIds+ as
|
221
|
+
# our id.
|
222
|
+
#
|
223
|
+
# @example Does this class use object ids?
|
224
|
+
# person.using_object_ids?
|
225
|
+
#
|
226
|
+
# @return [ true, false ] If the class uses BSON::ObjectIds for the id.
|
227
|
+
#
|
228
|
+
# @since 1.0.0
|
229
|
+
def using_object_ids?
|
230
|
+
fields["_id"].object_id_field?
|
249
231
|
end
|
250
232
|
|
251
233
|
protected
|
@@ -261,11 +243,12 @@ module Mongoid #:nodoc
|
|
261
243
|
# @since 2.4.0
|
262
244
|
def add_defaults(field)
|
263
245
|
default, name = field.default_val, field.name.to_s
|
246
|
+
remove_defaults(name)
|
264
247
|
unless default.nil?
|
265
|
-
if field.
|
266
|
-
|
248
|
+
if field.pre_processed?
|
249
|
+
pre_processed_defaults.push(name)
|
267
250
|
else
|
268
|
-
|
251
|
+
post_processed_defaults.push(name)
|
269
252
|
end
|
270
253
|
end
|
271
254
|
end
|
@@ -280,16 +263,15 @@ module Mongoid #:nodoc
|
|
280
263
|
def add_field(name, options = {})
|
281
264
|
aliased = options[:as]
|
282
265
|
aliased_fields[aliased.to_s] = name if aliased
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
end
|
266
|
+
field = field_for(name, options)
|
267
|
+
fields[name] = field
|
268
|
+
add_defaults(field)
|
269
|
+
create_accessors(name, name, options)
|
270
|
+
create_accessors(name, aliased, options) if aliased
|
271
|
+
process_options(field)
|
272
|
+
create_dirty_methods(name, name)
|
273
|
+
create_dirty_methods(name, aliased) if aliased
|
274
|
+
field
|
293
275
|
end
|
294
276
|
|
295
277
|
# Run through all custom options stored in Mongoid::Fields.options and
|
@@ -315,22 +297,6 @@ module Mongoid #:nodoc
|
|
315
297
|
end
|
316
298
|
end
|
317
299
|
|
318
|
-
# Determine if the field name is allowed, if not raise an error.
|
319
|
-
#
|
320
|
-
# @example Check the field name.
|
321
|
-
# Model.check_field_name!(:collection)
|
322
|
-
#
|
323
|
-
# @param [ Symbol ] name The field name.
|
324
|
-
#
|
325
|
-
# @raise [ Errors::InvalidField ] If the name is not allowed.
|
326
|
-
#
|
327
|
-
# @since 2.1.8
|
328
|
-
def check_field_name!(name)
|
329
|
-
if Mongoid.destructive_fields.include?(name)
|
330
|
-
raise Errors::InvalidField.new(name)
|
331
|
-
end
|
332
|
-
end
|
333
|
-
|
334
300
|
# Create the field accessors.
|
335
301
|
#
|
336
302
|
# @example Generate the accessors.
|
@@ -348,12 +314,12 @@ module Mongoid #:nodoc
|
|
348
314
|
field = fields[name]
|
349
315
|
|
350
316
|
create_field_getter(name, meth, field)
|
351
|
-
create_field_setter(name, meth)
|
317
|
+
create_field_setter(name, meth, field)
|
352
318
|
create_field_check(name, meth)
|
353
319
|
|
354
320
|
if options[:localize]
|
355
321
|
create_translations_getter(name, meth)
|
356
|
-
create_translations_setter(name, meth)
|
322
|
+
create_translations_setter(name, meth, field)
|
357
323
|
end
|
358
324
|
end
|
359
325
|
|
@@ -369,38 +335,10 @@ module Mongoid #:nodoc
|
|
369
335
|
# @since 2.4.0
|
370
336
|
def create_field_getter(name, meth, field)
|
371
337
|
generated_methods.module_eval do
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
end
|
377
|
-
else
|
378
|
-
define_method(meth) do
|
379
|
-
read_attribute(name).tap do |value|
|
380
|
-
if value.is_a?(Array) || value.is_a?(Hash)
|
381
|
-
attribute_will_change!(name)
|
382
|
-
end
|
383
|
-
end
|
384
|
-
end
|
385
|
-
end
|
386
|
-
else
|
387
|
-
if field.cast_on_read?
|
388
|
-
class_eval <<-EOM
|
389
|
-
def #{meth}
|
390
|
-
fields[#{name.inspect}].deserialize(read_attribute(#{name.inspect}))
|
391
|
-
end
|
392
|
-
EOM
|
393
|
-
else
|
394
|
-
class_eval <<-EOM
|
395
|
-
def #{meth}
|
396
|
-
read_attribute(#{name.inspect}).tap do |value|
|
397
|
-
if value.is_a?(Array) || value.is_a?(Hash)
|
398
|
-
attribute_will_change!(#{name.inspect})
|
399
|
-
end
|
400
|
-
end
|
401
|
-
end
|
402
|
-
EOM
|
403
|
-
end
|
338
|
+
re_define_method(meth) do
|
339
|
+
value = fields[name].demongoize(read_attribute(name))
|
340
|
+
attribute_will_change!(name) if value.resizable?
|
341
|
+
value
|
404
342
|
end
|
405
343
|
end
|
406
344
|
end
|
@@ -412,20 +350,16 @@ module Mongoid #:nodoc
|
|
412
350
|
#
|
413
351
|
# @param [ String ] name The name of the attribute.
|
414
352
|
# @param [ String ] meth The name of the method.
|
353
|
+
# @param [ Field ] field The field.
|
415
354
|
#
|
416
355
|
# @since 2.4.0
|
417
|
-
def create_field_setter(name, meth)
|
356
|
+
def create_field_setter(name, meth, field)
|
418
357
|
generated_methods.module_eval do
|
419
|
-
|
420
|
-
|
421
|
-
|
358
|
+
re_define_method("#{meth}=") do |value|
|
359
|
+
write_attribute(name, value)
|
360
|
+
if field.foreign_key?
|
361
|
+
remove_ivar(field.metadata.name)
|
422
362
|
end
|
423
|
-
else
|
424
|
-
class_eval <<-EOM
|
425
|
-
def #{meth}=(value)
|
426
|
-
write_attribute(#{name.inspect}, value)
|
427
|
-
end
|
428
|
-
EOM
|
429
363
|
end
|
430
364
|
end
|
431
365
|
end
|
@@ -441,18 +375,9 @@ module Mongoid #:nodoc
|
|
441
375
|
# @since 2.4.0
|
442
376
|
def create_field_check(name, meth)
|
443
377
|
generated_methods.module_eval do
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
attr == true || attr.present?
|
448
|
-
end
|
449
|
-
else
|
450
|
-
class_eval <<-EOM
|
451
|
-
def #{meth}?
|
452
|
-
attr = read_attribute(#{name.inspect})
|
453
|
-
attr == true || attr.present?
|
454
|
-
end
|
455
|
-
EOM
|
378
|
+
re_define_method("#{meth}?") do
|
379
|
+
attr = read_attribute(name)
|
380
|
+
attr == true || attr.present?
|
456
381
|
end
|
457
382
|
end
|
458
383
|
end
|
@@ -468,16 +393,8 @@ module Mongoid #:nodoc
|
|
468
393
|
# @since 2.4.0
|
469
394
|
def create_translations_getter(name, meth)
|
470
395
|
generated_methods.module_eval do
|
471
|
-
|
472
|
-
|
473
|
-
attributes[name]
|
474
|
-
end
|
475
|
-
else
|
476
|
-
class_eval <<-EOM
|
477
|
-
def #{meth}_translations
|
478
|
-
attributes[#{name.inspect}]
|
479
|
-
end
|
480
|
-
EOM
|
396
|
+
re_define_method("#{meth}_translations") do
|
397
|
+
attributes[name] ||= {}
|
481
398
|
end
|
482
399
|
end
|
483
400
|
end
|
@@ -489,22 +406,19 @@ module Mongoid #:nodoc
|
|
489
406
|
#
|
490
407
|
# @param [ String ] name The name of the attribute.
|
491
408
|
# @param [ String ] meth The name of the method.
|
409
|
+
# @param [ Field ] field The field.
|
492
410
|
#
|
493
411
|
# @since 2.4.0
|
494
|
-
def create_translations_setter(name, meth)
|
412
|
+
def create_translations_setter(name, meth, field)
|
495
413
|
generated_methods.module_eval do
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
else
|
502
|
-
class_eval <<-EOM
|
503
|
-
def #{meth}_translations=(value)
|
504
|
-
attribute_will_change!(#{name.inspect})
|
505
|
-
attributes[#{name.inspect}] = value
|
414
|
+
re_define_method("#{meth}_translations=") do |value|
|
415
|
+
attribute_will_change!(name)
|
416
|
+
if value
|
417
|
+
value.update_values do |value|
|
418
|
+
field.type.mongoize(value)
|
506
419
|
end
|
507
|
-
|
420
|
+
end
|
421
|
+
attributes[name] = value
|
508
422
|
end
|
509
423
|
end
|
510
424
|
end
|
@@ -519,9 +433,30 @@ module Mongoid #:nodoc
|
|
519
433
|
# @since 2.0.0
|
520
434
|
def generated_methods
|
521
435
|
@generated_methods ||= begin
|
522
|
-
Module.new
|
436
|
+
mod = Module.new
|
437
|
+
include(mod)
|
438
|
+
mod
|
523
439
|
end
|
524
440
|
end
|
441
|
+
|
442
|
+
# Remove the default keys for the provided name.
|
443
|
+
#
|
444
|
+
# @example Remove the default keys.
|
445
|
+
# Model.remove_defaults(name)
|
446
|
+
#
|
447
|
+
# @param [ String ] name The field name.
|
448
|
+
#
|
449
|
+
# @since 2.4.0
|
450
|
+
def remove_defaults(name)
|
451
|
+
pre_processed_defaults.delete_one(name)
|
452
|
+
post_processed_defaults.delete_one(name)
|
453
|
+
end
|
454
|
+
|
455
|
+
def field_for(name, options)
|
456
|
+
return Fields::Localized.new(name, options) if options[:localize]
|
457
|
+
return Fields::ForeignKey.new(name, options) if options[:identity]
|
458
|
+
Fields::Standard.new(name, options)
|
459
|
+
end
|
525
460
|
end
|
526
461
|
end
|
527
462
|
end
|