mongoid 2.0.0.alpha → 2.0.0.beta.5
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/lib/mongoid.rb +11 -5
- data/lib/mongoid/associations.rb +112 -107
- data/lib/mongoid/associations/belongs_to_related.rb +2 -3
- data/lib/mongoid/associations/embedded_in.rb +12 -4
- data/lib/mongoid/associations/{embed_many.rb → embeds_many.rb} +101 -32
- data/lib/mongoid/associations/{embed_one.rb → embeds_one.rb} +10 -10
- data/lib/mongoid/associations/has_many_related.rb +51 -5
- data/lib/mongoid/associations/has_one_related.rb +9 -5
- data/lib/mongoid/associations/meta_data.rb +2 -1
- data/lib/mongoid/associations/options.rb +15 -6
- data/lib/mongoid/associations/proxy.rb +14 -21
- data/lib/mongoid/attributes.rb +34 -13
- data/lib/mongoid/callbacks.rb +1 -2
- data/lib/mongoid/collection.rb +4 -3
- data/lib/mongoid/collections.rb +41 -0
- data/lib/mongoid/collections/master.rb +3 -2
- data/lib/mongoid/collections/slaves.rb +3 -2
- data/lib/mongoid/components.rb +4 -1
- data/lib/mongoid/config.rb +163 -13
- data/lib/mongoid/contexts.rb +1 -2
- data/lib/mongoid/contexts/enumerable.rb +1 -1
- data/lib/mongoid/contexts/mongo.rb +1 -1
- data/lib/mongoid/contexts/paging.rb +10 -2
- data/lib/mongoid/criteria.rb +13 -22
- data/lib/mongoid/criterion/exclusion.rb +3 -3
- data/lib/mongoid/criterion/inclusion.rb +17 -0
- data/lib/mongoid/criterion/optional.rb +1 -1
- data/lib/mongoid/dirty.rb +253 -0
- data/lib/mongoid/document.rb +40 -85
- data/lib/mongoid/errors.rb +48 -1
- data/lib/mongoid/extensions.rb +11 -9
- data/lib/mongoid/extensions/big_decimal/conversions.rb +2 -2
- data/lib/mongoid/extensions/boolean/conversions.rb +8 -2
- data/lib/mongoid/extensions/date/conversions.rb +13 -4
- data/lib/mongoid/extensions/datetime/conversions.rb +1 -6
- data/lib/mongoid/extensions/float/conversions.rb +5 -1
- data/lib/mongoid/extensions/hash/assimilation.rb +12 -3
- data/lib/mongoid/extensions/hash/conversions.rb +34 -4
- data/lib/mongoid/extensions/integer/conversions.rb +5 -1
- data/lib/mongoid/extensions/nil/assimilation.rb +4 -0
- data/lib/mongoid/extensions/object/conversions.rb +3 -3
- data/lib/mongoid/extensions/string/conversions.rb +1 -1
- data/lib/mongoid/extensions/symbol/inflections.rb +5 -2
- data/lib/mongoid/extensions/time_conversions.rb +35 -0
- data/lib/mongoid/factory.rb +2 -1
- data/lib/mongoid/field.rb +15 -2
- data/lib/mongoid/fields.rb +1 -1
- data/lib/mongoid/identity.rb +3 -3
- data/lib/mongoid/indexes.rb +3 -3
- data/lib/mongoid/matchers.rb +1 -2
- data/lib/mongoid/memoization.rb +8 -2
- data/lib/mongoid/named_scope.rb +0 -5
- data/lib/mongoid/observable.rb +1 -1
- data/lib/mongoid/paths.rb +30 -22
- data/lib/mongoid/persistence.rb +218 -0
- data/lib/mongoid/persistence/command.rb +39 -0
- data/lib/mongoid/persistence/insert.rb +47 -0
- data/lib/mongoid/persistence/insert_embedded.rb +38 -0
- data/lib/mongoid/persistence/remove.rb +39 -0
- data/lib/mongoid/persistence/remove_all.rb +37 -0
- data/lib/mongoid/persistence/remove_embedded.rb +50 -0
- data/lib/mongoid/persistence/update.rb +63 -0
- data/lib/mongoid/railtie.rb +53 -0
- data/lib/mongoid/railties/database.rake +37 -0
- data/lib/mongoid/timestamps.rb +2 -2
- data/lib/mongoid/validations.rb +2 -2
- data/lib/mongoid/validations/associated.rb +2 -2
- data/lib/mongoid/validations/uniqueness.rb +13 -2
- data/lib/mongoid/version.rb +4 -0
- data/lib/mongoid/versioning.rb +3 -2
- data/lib/rails/generators/mongoid/config/config_generator.rb +41 -0
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +24 -0
- data/lib/rails/generators/mongoid/model/model_generator.rb +24 -0
- data/lib/rails/generators/mongoid/model/templates/model.rb +15 -0
- data/lib/rails/generators/mongoid_generator.rb +61 -0
- metadata +76 -301
- data/.gitignore +0 -6
- data/.watchr +0 -29
- data/Rakefile +0 -52
- data/VERSION +0 -1
- data/caliper.yml +0 -4
- data/lib/mongoid/collections/mimic.rb +0 -46
- data/lib/mongoid/commands.rb +0 -161
- data/lib/mongoid/commands/create.rb +0 -19
- data/lib/mongoid/commands/delete.rb +0 -16
- data/lib/mongoid/commands/delete_all.rb +0 -23
- data/lib/mongoid/commands/deletion.rb +0 -18
- data/lib/mongoid/commands/destroy.rb +0 -17
- data/lib/mongoid/commands/destroy_all.rb +0 -23
- data/lib/mongoid/commands/save.rb +0 -29
- data/lib/mongoid/extensions/time/conversions.rb +0 -18
- data/mongoid.gemspec +0 -408
- data/perf/benchmark.rb +0 -77
- data/spec/integration/mongoid/associations_spec.rb +0 -340
- data/spec/integration/mongoid/attributes_spec.rb +0 -22
- data/spec/integration/mongoid/commands_spec.rb +0 -227
- data/spec/integration/mongoid/contexts/enumerable_spec.rb +0 -33
- data/spec/integration/mongoid/criteria_spec.rb +0 -272
- data/spec/integration/mongoid/document_spec.rb +0 -650
- data/spec/integration/mongoid/extensions_spec.rb +0 -22
- data/spec/integration/mongoid/finders_spec.rb +0 -119
- data/spec/integration/mongoid/inheritance_spec.rb +0 -137
- data/spec/integration/mongoid/named_scope_spec.rb +0 -46
- data/spec/models/address.rb +0 -39
- data/spec/models/animal.rb +0 -6
- data/spec/models/callbacks.rb +0 -18
- data/spec/models/comment.rb +0 -8
- data/spec/models/country_code.rb +0 -6
- data/spec/models/employer.rb +0 -5
- data/spec/models/game.rb +0 -7
- data/spec/models/inheritance.rb +0 -56
- data/spec/models/location.rb +0 -5
- data/spec/models/mixed_drink.rb +0 -4
- data/spec/models/name.rb +0 -13
- data/spec/models/namespacing.rb +0 -11
- data/spec/models/patient.rb +0 -4
- data/spec/models/person.rb +0 -99
- data/spec/models/pet.rb +0 -7
- data/spec/models/pet_owner.rb +0 -6
- data/spec/models/phone.rb +0 -7
- data/spec/models/post.rb +0 -15
- data/spec/models/translation.rb +0 -5
- data/spec/models/vet_visit.rb +0 -5
- data/spec/spec.opts +0 -3
- data/spec/spec_helper.rb +0 -31
- data/spec/unit/mongoid/associations/belongs_to_related_spec.rb +0 -145
- data/spec/unit/mongoid/associations/embed_many_spec.rb +0 -516
- data/spec/unit/mongoid/associations/embed_one_spec.rb +0 -282
- data/spec/unit/mongoid/associations/embedded_in_spec.rb +0 -193
- data/spec/unit/mongoid/associations/has_many_related_spec.rb +0 -418
- data/spec/unit/mongoid/associations/has_one_related_spec.rb +0 -179
- data/spec/unit/mongoid/associations/meta_data_spec.rb +0 -88
- data/spec/unit/mongoid/associations/options_spec.rb +0 -192
- data/spec/unit/mongoid/associations_spec.rb +0 -595
- data/spec/unit/mongoid/attributes_spec.rb +0 -507
- data/spec/unit/mongoid/callbacks_spec.rb +0 -55
- data/spec/unit/mongoid/collection_spec.rb +0 -187
- data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +0 -75
- data/spec/unit/mongoid/collections/master_spec.rb +0 -41
- data/spec/unit/mongoid/collections/mimic_spec.rb +0 -43
- data/spec/unit/mongoid/collections/slaves_spec.rb +0 -81
- data/spec/unit/mongoid/commands/create_spec.rb +0 -31
- data/spec/unit/mongoid/commands/delete_all_spec.rb +0 -58
- data/spec/unit/mongoid/commands/delete_spec.rb +0 -38
- data/spec/unit/mongoid/commands/destroy_all_spec.rb +0 -21
- data/spec/unit/mongoid/commands/destroy_spec.rb +0 -51
- data/spec/unit/mongoid/commands/save_spec.rb +0 -107
- data/spec/unit/mongoid/commands_spec.rb +0 -270
- data/spec/unit/mongoid/config_spec.rb +0 -172
- data/spec/unit/mongoid/contexts/enumerable_spec.rb +0 -421
- data/spec/unit/mongoid/contexts/mongo_spec.rb +0 -682
- data/spec/unit/mongoid/contexts_spec.rb +0 -25
- data/spec/unit/mongoid/criteria_spec.rb +0 -824
- data/spec/unit/mongoid/criterion/complex_spec.rb +0 -19
- data/spec/unit/mongoid/criterion/exclusion_spec.rb +0 -91
- data/spec/unit/mongoid/criterion/inclusion_spec.rb +0 -219
- data/spec/unit/mongoid/criterion/optional_spec.rb +0 -319
- data/spec/unit/mongoid/cursor_spec.rb +0 -74
- data/spec/unit/mongoid/deprecation_spec.rb +0 -24
- data/spec/unit/mongoid/document_spec.rb +0 -818
- data/spec/unit/mongoid/errors_spec.rb +0 -103
- data/spec/unit/mongoid/extensions/array/accessors_spec.rb +0 -50
- data/spec/unit/mongoid/extensions/array/assimilation_spec.rb +0 -24
- data/spec/unit/mongoid/extensions/array/conversions_spec.rb +0 -35
- data/spec/unit/mongoid/extensions/array/parentization_spec.rb +0 -20
- data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +0 -22
- data/spec/unit/mongoid/extensions/binary/conversions_spec.rb +0 -22
- data/spec/unit/mongoid/extensions/boolean/conversions_spec.rb +0 -49
- data/spec/unit/mongoid/extensions/date/conversions_spec.rb +0 -102
- data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +0 -67
- data/spec/unit/mongoid/extensions/float/conversions_spec.rb +0 -61
- data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +0 -184
- data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +0 -46
- data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +0 -21
- data/spec/unit/mongoid/extensions/hash/criteria_helpers_spec.rb +0 -17
- data/spec/unit/mongoid/extensions/hash/scoping_spec.rb +0 -14
- data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +0 -61
- data/spec/unit/mongoid/extensions/nil/assimilation_spec.rb +0 -24
- data/spec/unit/mongoid/extensions/object/conversions_spec.rb +0 -57
- data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +0 -34
- data/spec/unit/mongoid/extensions/string/conversions_spec.rb +0 -17
- data/spec/unit/mongoid/extensions/string/inflections_spec.rb +0 -208
- data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +0 -91
- data/spec/unit/mongoid/extensions/time/conversions_spec.rb +0 -70
- data/spec/unit/mongoid/extras_spec.rb +0 -102
- data/spec/unit/mongoid/factory_spec.rb +0 -31
- data/spec/unit/mongoid/field_spec.rb +0 -143
- data/spec/unit/mongoid/fields_spec.rb +0 -181
- data/spec/unit/mongoid/finders_spec.rb +0 -404
- data/spec/unit/mongoid/identity_spec.rb +0 -109
- data/spec/unit/mongoid/indexes_spec.rb +0 -93
- data/spec/unit/mongoid/javascript_spec.rb +0 -48
- data/spec/unit/mongoid/matchers/all_spec.rb +0 -27
- data/spec/unit/mongoid/matchers/default_spec.rb +0 -27
- data/spec/unit/mongoid/matchers/exists_spec.rb +0 -56
- data/spec/unit/mongoid/matchers/gt_spec.rb +0 -39
- data/spec/unit/mongoid/matchers/gte_spec.rb +0 -49
- data/spec/unit/mongoid/matchers/in_spec.rb +0 -27
- data/spec/unit/mongoid/matchers/lt_spec.rb +0 -39
- data/spec/unit/mongoid/matchers/lte_spec.rb +0 -49
- data/spec/unit/mongoid/matchers/ne_spec.rb +0 -27
- data/spec/unit/mongoid/matchers/nin_spec.rb +0 -27
- data/spec/unit/mongoid/matchers/size_spec.rb +0 -27
- data/spec/unit/mongoid/matchers_spec.rb +0 -329
- data/spec/unit/mongoid/memoization_spec.rb +0 -75
- data/spec/unit/mongoid/named_scope_spec.rb +0 -123
- data/spec/unit/mongoid/observable_spec.rb +0 -46
- data/spec/unit/mongoid/paths_spec.rb +0 -124
- data/spec/unit/mongoid/scope_spec.rb +0 -240
- data/spec/unit/mongoid/state_spec.rb +0 -83
- data/spec/unit/mongoid/timestamps_spec.rb +0 -25
- data/spec/unit/mongoid/validations/associated_spec.rb +0 -103
- data/spec/unit/mongoid/validations/uniqueness_spec.rb +0 -47
- data/spec/unit/mongoid/validations_spec.rb +0 -190
- data/spec/unit/mongoid/versioning_spec.rb +0 -41
- data/spec/unit/mongoid_spec.rb +0 -46
data/lib/mongoid/errors.rb
CHANGED
@@ -41,6 +41,20 @@ module Mongoid #:nodoc
|
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
+
# Raised when the database version is not supported by Mongoid.
|
45
|
+
#
|
46
|
+
# Example:
|
47
|
+
#
|
48
|
+
# <tt>UnsupportedVersion.new(Mongo::ServerVersion.new("1.3.1"))</tt>
|
49
|
+
class UnsupportedVersion < RuntimeError
|
50
|
+
def initialize(version)
|
51
|
+
@version = version
|
52
|
+
end
|
53
|
+
def message
|
54
|
+
"MongoDB #{@version} not supported, please upgrade to #{Mongoid::MONGODB_VERSION}"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
44
58
|
# Raised when a persisence method ending in ! fails validation. The message
|
45
59
|
# will contain the full error messages from the +Document+ in question.
|
46
60
|
#
|
@@ -52,7 +66,7 @@ module Mongoid #:nodoc
|
|
52
66
|
@errors = errors
|
53
67
|
end
|
54
68
|
def message
|
55
|
-
"Validation
|
69
|
+
"Validation Failed: " + @errors.full_messages.join(", ")
|
56
70
|
end
|
57
71
|
end
|
58
72
|
|
@@ -73,5 +87,38 @@ module Mongoid #:nodoc
|
|
73
87
|
end
|
74
88
|
end
|
75
89
|
|
90
|
+
# This error is raised when trying to create a field that conflicts with
|
91
|
+
# a Mongoid internal attribute or method.
|
92
|
+
#
|
93
|
+
# Example:
|
94
|
+
#
|
95
|
+
# <tt>InvalidField.new('collection')</tt>
|
96
|
+
class InvalidField < RuntimeError
|
97
|
+
def initialize(name)
|
98
|
+
@name = name
|
99
|
+
end
|
100
|
+
def message
|
101
|
+
"Defining a field named '#{@name}' is not allowed. " +
|
102
|
+
"Do not define fields that conflict with Mongoid internal attributes " +
|
103
|
+
"or method names. Use Document#instance_methods to see what " +
|
104
|
+
"names this includes."
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
# This error is raised when trying to create set nested records above the
|
109
|
+
# specified :limit
|
110
|
+
#
|
111
|
+
# Example:
|
112
|
+
#
|
113
|
+
#<tt>TooManyNestedAttributeRecords.new('association', limit)
|
114
|
+
class TooManyNestedAttributeRecords < RuntimeError
|
115
|
+
def initialize(association, limit)
|
116
|
+
@association = association.to_s.humanize.capitalize
|
117
|
+
@limit = limit
|
118
|
+
end
|
119
|
+
def message
|
120
|
+
"Accept Nested Attributes for #{@association} is limited to #{@limit} records"
|
121
|
+
end
|
122
|
+
end
|
76
123
|
end
|
77
124
|
end
|
data/lib/mongoid/extensions.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
require "mongoid/extensions/time_conversions"
|
2
3
|
require "mongoid/extensions/array/accessors"
|
3
4
|
require "mongoid/extensions/array/aliasing"
|
4
5
|
require "mongoid/extensions/array/assimilation"
|
@@ -22,7 +23,6 @@ require "mongoid/extensions/proc/scoping"
|
|
22
23
|
require "mongoid/extensions/string/conversions"
|
23
24
|
require "mongoid/extensions/string/inflections"
|
24
25
|
require "mongoid/extensions/symbol/inflections"
|
25
|
-
require "mongoid/extensions/time/conversions"
|
26
26
|
require "mongoid/extensions/objectid/conversions"
|
27
27
|
|
28
28
|
class Array #:nodoc
|
@@ -44,14 +44,16 @@ class Boolean #:nodoc
|
|
44
44
|
extend Mongoid::Extensions::Boolean::Conversions
|
45
45
|
end
|
46
46
|
|
47
|
-
class Date #:nodoc
|
48
|
-
extend Mongoid::Extensions::Date::Conversions
|
49
|
-
end
|
50
|
-
|
51
47
|
class DateTime #:nodoc
|
48
|
+
extend Mongoid::Extensions::TimeConversions
|
52
49
|
extend Mongoid::Extensions::DateTime::Conversions
|
53
50
|
end
|
54
51
|
|
52
|
+
class Date #:nodoc
|
53
|
+
extend Mongoid::Extensions::TimeConversions
|
54
|
+
extend Mongoid::Extensions::Date::Conversions
|
55
|
+
end
|
56
|
+
|
55
57
|
class Float #:nodoc
|
56
58
|
extend Mongoid::Extensions::Float::Conversions
|
57
59
|
end
|
@@ -61,7 +63,7 @@ class Hash #:nodoc
|
|
61
63
|
include Mongoid::Extensions::Hash::Assimilation
|
62
64
|
include Mongoid::Extensions::Hash::CriteriaHelpers
|
63
65
|
include Mongoid::Extensions::Hash::Scoping
|
64
|
-
|
66
|
+
include Mongoid::Extensions::Hash::Conversions
|
65
67
|
end
|
66
68
|
|
67
69
|
class Integer #:nodoc
|
@@ -91,9 +93,9 @@ class Symbol #:nodoc
|
|
91
93
|
end
|
92
94
|
|
93
95
|
class Time #:nodoc
|
94
|
-
extend Mongoid::Extensions::
|
96
|
+
extend Mongoid::Extensions::TimeConversions
|
95
97
|
end
|
96
98
|
|
97
|
-
class
|
99
|
+
class BSON::ObjectID #:nodoc
|
98
100
|
extend Mongoid::Extensions::ObjectID::Conversions
|
99
|
-
end
|
101
|
+
end
|
@@ -7,11 +7,11 @@ module Mongoid #:nodoc:
|
|
7
7
|
module Conversions #:nodoc:
|
8
8
|
# Get the string as a +BigDecimal+
|
9
9
|
def get(value)
|
10
|
-
::BigDecimal.new(value)
|
10
|
+
value ? ::BigDecimal.new(value) : value
|
11
11
|
end
|
12
12
|
# Set the value in the hash as a string.
|
13
13
|
def set(value)
|
14
|
-
value.to_s
|
14
|
+
value ? value.to_s : value
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
@@ -3,9 +3,15 @@ module Mongoid #:nodoc:
|
|
3
3
|
module Extensions #:nodoc:
|
4
4
|
module Boolean #:nodoc:
|
5
5
|
module Conversions #:nodoc:
|
6
|
+
|
7
|
+
BOOLEAN_MAP = {
|
8
|
+
true => true, "true" => true, "TRUE" => true, "1" => true, 1 => true, 1.0 => true,
|
9
|
+
false => false, "false" => false, "FALSE" => false, "0" => false, 0 => false, 0.0 => false
|
10
|
+
}
|
11
|
+
|
6
12
|
def set(value)
|
7
|
-
|
8
|
-
|
13
|
+
value = BOOLEAN_MAP[value]
|
14
|
+
value.nil? ? nil : value
|
9
15
|
end
|
10
16
|
def get(value)
|
11
17
|
value
|
@@ -3,11 +3,20 @@ module Mongoid #:nodoc:
|
|
3
3
|
module Extensions #:nodoc:
|
4
4
|
module Date #:nodoc:
|
5
5
|
module Conversions #:nodoc:
|
6
|
-
def set(value)
|
7
|
-
value.to_date.at_midnight.to_time unless value.blank?
|
8
|
-
end
|
9
6
|
def get(value)
|
10
|
-
|
7
|
+
return nil if value.blank?
|
8
|
+
if Mongoid::Config.instance.use_utc?
|
9
|
+
value.to_date
|
10
|
+
else
|
11
|
+
::Date.new(value.year, value.month, value.day)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
protected
|
16
|
+
|
17
|
+
def convert_to_time(value)
|
18
|
+
value = ::Date.parse(value) if value.is_a?(::String)
|
19
|
+
::Time.utc(value.year, value.month, value.day)
|
11
20
|
end
|
12
21
|
end
|
13
22
|
end
|
@@ -3,13 +3,8 @@ module Mongoid #:nodoc:
|
|
3
3
|
module Extensions #:nodoc:
|
4
4
|
module DateTime #:nodoc:
|
5
5
|
module Conversions #:nodoc:
|
6
|
-
def set(value)
|
7
|
-
return nil if value.blank?
|
8
|
-
::DateTime.parse(value.to_s).utc
|
9
|
-
end
|
10
6
|
def get(value)
|
11
|
-
|
12
|
-
::Time.zone ? ::Time.parse(value.to_s).getlocal.to_datetime : value.to_datetime
|
7
|
+
super.try(:to_datetime)
|
13
8
|
end
|
14
9
|
end
|
15
10
|
end
|
@@ -18,10 +18,19 @@ module Mongoid #:nodoc:
|
|
18
18
|
#
|
19
19
|
# Returns: The child +Document+.
|
20
20
|
def assimilate(parent, options, type = nil)
|
21
|
-
klass = type ? type : options.klass
|
22
|
-
child = klass.instantiate(
|
23
|
-
|
21
|
+
klass = self.klass || (type ? type : options.klass)
|
22
|
+
child = klass.instantiate("_id" => self["_id"])
|
23
|
+
self.merge("_type" => klass.name) if klass.hereditary
|
24
|
+
init(parent, child, options)
|
25
|
+
end
|
26
|
+
|
27
|
+
protected
|
28
|
+
|
29
|
+
def init(parent, child, options)
|
30
|
+
child._parent = parent
|
31
|
+
child.write_attributes(self)
|
24
32
|
child.identify
|
33
|
+
child.reset_modifications
|
25
34
|
child.assimilate(parent, options)
|
26
35
|
end
|
27
36
|
end
|
@@ -3,11 +3,41 @@ module Mongoid #:nodoc:
|
|
3
3
|
module Extensions #:nodoc:
|
4
4
|
module Hash #:nodoc:
|
5
5
|
module Conversions #:nodoc:
|
6
|
-
|
7
|
-
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
module InstanceMethods #:nodoc:
|
9
|
+
|
10
|
+
# Get the difference between 2 hashes. This will give back a new hash
|
11
|
+
# with the keys and pairs of [ old, new ] values.
|
12
|
+
#
|
13
|
+
# Example:
|
14
|
+
#
|
15
|
+
# first = { :field => "value" }
|
16
|
+
# second = { :field => "new" }
|
17
|
+
# first.difference(second) # => { :field => [ "value", "new" ] }
|
18
|
+
#
|
19
|
+
# Returns:
|
20
|
+
#
|
21
|
+
# A +Hash+ of modifications.
|
22
|
+
def difference(other)
|
23
|
+
changes = {}
|
24
|
+
each_pair do |key, value|
|
25
|
+
if other.has_key?(key)
|
26
|
+
new_value = other[key]
|
27
|
+
changes[key] = [ value, new_value ] if new_value != value
|
28
|
+
end
|
29
|
+
end
|
30
|
+
changes
|
31
|
+
end
|
8
32
|
end
|
9
|
-
|
10
|
-
|
33
|
+
|
34
|
+
module ClassMethods #:nodoc:
|
35
|
+
def get(value)
|
36
|
+
value
|
37
|
+
end
|
38
|
+
def set(value)
|
39
|
+
value
|
40
|
+
end
|
11
41
|
end
|
12
42
|
end
|
13
43
|
end
|
@@ -5,7 +5,11 @@ module Mongoid #:nodoc:
|
|
5
5
|
module Conversions #:nodoc:
|
6
6
|
def set(value)
|
7
7
|
return nil if value.blank?
|
8
|
-
|
8
|
+
begin
|
9
|
+
Integer(value)
|
10
|
+
rescue ArgumentError => e
|
11
|
+
puts(e.message); value
|
12
|
+
end
|
9
13
|
end
|
10
14
|
def get(value)
|
11
15
|
value
|
@@ -8,17 +8,17 @@ module Mongoid #:nodoc:
|
|
8
8
|
module InstanceMethods
|
9
9
|
# Converts this object to a hash of attributes
|
10
10
|
def mongoidize
|
11
|
-
self.
|
11
|
+
self.raw_attributes
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
15
|
module ClassMethods
|
16
16
|
def set(value)
|
17
|
-
value.respond_to?(:
|
17
|
+
value.respond_to?(:raw_attributes) ? value.raw_attributes : value
|
18
18
|
end
|
19
19
|
|
20
20
|
def get(value)
|
21
|
-
self.
|
21
|
+
value ? self.instantiate(value) : value
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
@@ -23,9 +23,12 @@ module Mongoid #:nodoc:
|
|
23
23
|
to_s.plural?
|
24
24
|
end
|
25
25
|
|
26
|
-
["gt", "lt", "gte", "lte", "ne", "in", "nin", "mod", "all",
|
26
|
+
[ "gt", "lt", "gte", "lte", "ne", "near", "in", "nin", "mod", "all",
|
27
|
+
"size", "exists", "within", ["matches","elemMatch"] ].each do |oper|
|
28
|
+
m, oper = oper
|
29
|
+
oper = m unless oper
|
27
30
|
class_eval <<-OPERATORS
|
28
|
-
def #{
|
31
|
+
def #{m}
|
29
32
|
Criterion::Complex.new(:key => self, :operator => "#{oper}")
|
30
33
|
end
|
31
34
|
OPERATORS
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Mongoid #:nodoc:
|
2
|
+
module Extensions #:nodoc:
|
3
|
+
module TimeConversions #:nodoc:
|
4
|
+
def set(value)
|
5
|
+
return nil if value.blank?
|
6
|
+
time = convert_to_time(value)
|
7
|
+
strip_milliseconds(time).utc
|
8
|
+
end
|
9
|
+
|
10
|
+
def get(value)
|
11
|
+
return nil if value.blank?
|
12
|
+
if Mongoid::Config.instance.use_utc?
|
13
|
+
value
|
14
|
+
else
|
15
|
+
value.getlocal
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
protected
|
20
|
+
|
21
|
+
def strip_milliseconds(time)
|
22
|
+
::Time.at(time.to_i)
|
23
|
+
end
|
24
|
+
|
25
|
+
def convert_to_time(value)
|
26
|
+
case value
|
27
|
+
when ::String then ::Time.parse(value)
|
28
|
+
when ::DateTime then ::Time.utc(value.year, value.month, value.day, value.hour, value.min, value.sec)
|
29
|
+
when ::Date then ::Time.utc(value.year, value.month, value.day)
|
30
|
+
else value
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/mongoid/factory.rb
CHANGED
@@ -11,7 +11,8 @@ module Mongoid #:nodoc:
|
|
11
11
|
#
|
12
12
|
# klass: The class to instantiate from if _type is not present.
|
13
13
|
# attributes: The +Document+ attributes.
|
14
|
-
def self.build(klass,
|
14
|
+
def self.build(klass, attributes)
|
15
|
+
attrs = {}.merge(attributes)
|
15
16
|
type = attrs["_type"]
|
16
17
|
type ? type.constantize.instantiate(attrs) : klass.instantiate(attrs)
|
17
18
|
end
|
data/lib/mongoid/field.rb
CHANGED
@@ -18,7 +18,7 @@ module Mongoid #:nodoc:
|
|
18
18
|
#
|
19
19
|
# The primitive value or a copy of the default.
|
20
20
|
def default
|
21
|
-
|
21
|
+
copy
|
22
22
|
end
|
23
23
|
|
24
24
|
# Create the new field with a name and optional additional options. Valid
|
@@ -33,7 +33,9 @@ module Mongoid #:nodoc:
|
|
33
33
|
#
|
34
34
|
# <tt>Field.new(:score, :default => 0)</tt>
|
35
35
|
def initialize(name, options = {})
|
36
|
+
check_name!(name)
|
36
37
|
@name, @default = name, options[:default]
|
38
|
+
@copyable = (@default.is_a?(Array) || @default.is_a?(Hash))
|
37
39
|
@type = options[:type] || String
|
38
40
|
@accessible = options.has_key?(:accessible) ? options[:accessible] : true
|
39
41
|
end
|
@@ -41,12 +43,23 @@ module Mongoid #:nodoc:
|
|
41
43
|
# Used for setting an object in the attributes hash. If nil is provided the
|
42
44
|
# default will get returned if it exists.
|
43
45
|
def set(object)
|
44
|
-
|
46
|
+
type.set(object)
|
45
47
|
end
|
46
48
|
|
47
49
|
# Used for retrieving the object out of the attributes hash.
|
48
50
|
def get(object)
|
49
51
|
type.get(object)
|
50
52
|
end
|
53
|
+
|
54
|
+
protected
|
55
|
+
# Slightly faster default check.
|
56
|
+
def copy
|
57
|
+
@copyable ? @default.dup : @default
|
58
|
+
end
|
59
|
+
|
60
|
+
# Check if the name is valid.
|
61
|
+
def check_name!(name)
|
62
|
+
raise Errors::InvalidField.new(name) if Mongoid.destructive_fields.include?(name.to_s)
|
63
|
+
end
|
51
64
|
end
|
52
65
|
end
|
data/lib/mongoid/fields.rb
CHANGED
@@ -44,6 +44,7 @@ module Mongoid #:nodoc
|
|
44
44
|
meth = options.delete(:as) || name
|
45
45
|
fields[name] = Field.new(name, options)
|
46
46
|
create_accessors(name, meth, options)
|
47
|
+
add_dirty_methods(name)
|
47
48
|
end
|
48
49
|
|
49
50
|
# Create the field accessors.
|
@@ -55,7 +56,6 @@ module Mongoid #:nodoc
|
|
55
56
|
(options[:type] == Boolean) ? attr == true : attr.present?
|
56
57
|
end
|
57
58
|
end
|
58
|
-
|
59
59
|
end
|
60
60
|
end
|
61
61
|
end
|