mongoid 1.2.14 → 1.9.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/lib/mongoid.rb +10 -3
- data/lib/mongoid/associations.rb +133 -97
- data/lib/mongoid/associations/belongs_to_related.rb +2 -3
- data/lib/mongoid/associations/{belongs_to.rb → embedded_in.rb} +14 -6
- data/lib/mongoid/associations/{has_many.rb → embeds_many.rb} +89 -31
- data/lib/mongoid/associations/{has_one.rb → embeds_one.rb} +8 -7
- data/lib/mongoid/associations/has_many_related.rb +52 -7
- data/lib/mongoid/associations/has_one_related.rb +8 -4
- data/lib/mongoid/associations/meta_data.rb +2 -1
- data/lib/mongoid/associations/options.rb +6 -1
- data/lib/mongoid/associations/proxy.rb +14 -21
- data/lib/mongoid/attributes.rb +27 -12
- 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 +21 -19
- data/lib/mongoid/concern.rb +31 -0
- data/lib/mongoid/config.rb +117 -12
- data/lib/mongoid/contexts.rb +1 -1
- 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/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 +81 -52
- data/lib/mongoid/errors.rb +32 -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 +1 -1
- data/lib/mongoid/extensions/string/conversions.rb +1 -1
- data/lib/mongoid/extensions/symbol/inflections.rb +1 -1
- data/lib/mongoid/extensions/time_conversions.rb +35 -0
- data/lib/mongoid/extras.rb +6 -9
- data/lib/mongoid/factory.rb +2 -1
- data/lib/mongoid/field.rb +9 -2
- data/lib/mongoid/fields.rb +1 -0
- data/lib/mongoid/identity.rb +3 -3
- data/lib/mongoid/indexes.rb +3 -3
- data/lib/mongoid/memoization.rb +8 -2
- data/lib/mongoid/named_scope.rb +0 -3
- data/lib/mongoid/observable.rb +30 -0
- data/lib/mongoid/paths.rb +62 -0
- data/lib/mongoid/persistence.rb +222 -0
- data/lib/mongoid/persistence/command.rb +39 -0
- data/lib/mongoid/persistence/insert.rb +50 -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/state.rb +28 -21
- data/lib/mongoid/timestamps.rb +5 -8
- data/lib/mongoid/version.rb +4 -0
- data/lib/mongoid/versioning.rb +6 -7
- metadata +81 -300
- data/.gitignore +0 -6
- data/.watchr +0 -29
- data/Rakefile +0 -53
- data/VERSION +0 -1
- data/caliper.yml +0 -4
- data/lib/mongoid/collections/mimic.rb +0 -46
- data/lib/mongoid/commands.rb +0 -174
- data/lib/mongoid/commands/create.rb +0 -21
- 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 -19
- data/lib/mongoid/commands/destroy_all.rb +0 -23
- data/lib/mongoid/commands/save.rb +0 -27
- data/lib/mongoid/extensions/time/conversions.rb +0 -18
- data/mongoid.gemspec +0 -395
- 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 -218
- 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 -593
- data/spec/integration/mongoid/extensions_spec.rb +0 -26
- 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/belongs_to_spec.rb +0 -193
- data/spec/unit/mongoid/associations/has_many_related_spec.rb +0 -420
- data/spec/unit/mongoid/associations/has_many_spec.rb +0 -519
- data/spec/unit/mongoid/associations/has_one_related_spec.rb +0 -179
- data/spec/unit/mongoid/associations/has_one_spec.rb +0 -282
- 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 -30
- 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 -23
- data/spec/unit/mongoid/commands/destroy_spec.rb +0 -50
- data/spec/unit/mongoid/commands/save_spec.rb +0 -105
- data/spec/unit/mongoid/commands_spec.rb +0 -275
- 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 -952
- 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 -70
- 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/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/versioning_spec.rb +0 -41
- data/spec/unit/mongoid_spec.rb +0 -46
data/lib/mongoid/attributes.rb
CHANGED
@@ -46,6 +46,7 @@ module Mongoid #:nodoc:
|
|
46
46
|
send("#{key}=", value)
|
47
47
|
end
|
48
48
|
end
|
49
|
+
setup_modifications
|
49
50
|
end
|
50
51
|
|
51
52
|
# Read a value from the +Document+ attributes. If the value does not exist
|
@@ -60,7 +61,7 @@ module Mongoid #:nodoc:
|
|
60
61
|
# <tt>person.read_attribute(:title)</tt>
|
61
62
|
def read_attribute(name)
|
62
63
|
access = name.to_s
|
63
|
-
fields[access].get(@attributes[access])
|
64
|
+
accessed(access, fields[access].get(@attributes[access]))
|
64
65
|
end
|
65
66
|
|
66
67
|
# Remove a value from the +Document+ attributes. If the value does not exist
|
@@ -74,7 +75,8 @@ module Mongoid #:nodoc:
|
|
74
75
|
#
|
75
76
|
# <tt>person.remove_attribute(:title)</tt>
|
76
77
|
def remove_attribute(name)
|
77
|
-
|
78
|
+
access = name.to_s
|
79
|
+
modify(access, @attributes.delete(access), nil)
|
78
80
|
end
|
79
81
|
|
80
82
|
# Returns the object type. This corresponds to the name of the class that
|
@@ -106,8 +108,8 @@ module Mongoid #:nodoc:
|
|
106
108
|
# there is any.
|
107
109
|
def write_attribute(name, value)
|
108
110
|
access = name.to_s
|
109
|
-
@attributes[access]
|
110
|
-
notify
|
111
|
+
modify(access, @attributes[access], fields[access].set(value))
|
112
|
+
notify if !id.blank? && new_record?
|
111
113
|
end
|
112
114
|
|
113
115
|
# Writes the supplied attributes +Hash+ to the +Document+. This will only
|
@@ -126,13 +128,24 @@ module Mongoid #:nodoc:
|
|
126
128
|
# there is any.
|
127
129
|
def write_attributes(attrs = nil)
|
128
130
|
process(attrs || {})
|
129
|
-
|
130
|
-
|
131
|
+
identified = !id.blank?
|
132
|
+
if new_record? && !identified
|
133
|
+
identify; notify
|
134
|
+
end
|
131
135
|
end
|
132
136
|
alias :attributes= write_attributes
|
133
137
|
|
134
138
|
protected
|
135
|
-
#
|
139
|
+
# apply default values to attributes - calling procs as required
|
140
|
+
def default_attributes
|
141
|
+
default_values = defaults
|
142
|
+
default_values.each_pair do |key, val|
|
143
|
+
default_values[key] = val.call if val.respond_to?(:call)
|
144
|
+
end
|
145
|
+
default_values || {}
|
146
|
+
end
|
147
|
+
|
148
|
+
# Return true if dynamic field setting is enabled.
|
136
149
|
def set_allowed?(key)
|
137
150
|
Mongoid.allow_dynamic_fields && !respond_to?("#{key}=")
|
138
151
|
end
|
@@ -150,8 +163,10 @@ module Mongoid #:nodoc:
|
|
150
163
|
|
151
164
|
# Return true if writing to the given field is allowed
|
152
165
|
def write_allowed?(key)
|
153
|
-
|
154
|
-
fields[
|
166
|
+
name = key.to_s
|
167
|
+
existing = fields[name]
|
168
|
+
return true unless existing
|
169
|
+
existing.accessible?
|
155
170
|
end
|
156
171
|
end
|
157
172
|
|
@@ -163,8 +178,8 @@ module Mongoid #:nodoc:
|
|
163
178
|
#
|
164
179
|
# class Person
|
165
180
|
# include Mongoid::Document
|
166
|
-
#
|
167
|
-
#
|
181
|
+
# embeds_one :name
|
182
|
+
# embeds_many :addresses
|
168
183
|
#
|
169
184
|
# accepts_nested_attributes_for :name, :addresses
|
170
185
|
# end
|
@@ -176,7 +191,7 @@ module Mongoid #:nodoc:
|
|
176
191
|
reject(attrs, options)
|
177
192
|
association = send(name)
|
178
193
|
if association
|
179
|
-
|
194
|
+
observe(association, true)
|
180
195
|
association.nested_build(attrs)
|
181
196
|
else
|
182
197
|
send("build_#{name}", attrs)
|
data/lib/mongoid/collection.rb
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require "mongoid/collections/operations"
|
3
3
|
require "mongoid/collections/cyclic_iterator"
|
4
|
-
require "mongoid/collections/mimic"
|
5
4
|
require "mongoid/collections/master"
|
6
5
|
require "mongoid/collections/slaves"
|
7
6
|
|
8
7
|
module Mongoid #:nodoc
|
8
|
+
# The Mongoid wrapper to the Mongo Ruby driver's collection object.
|
9
9
|
class Collection
|
10
|
-
include Collections::Mimic
|
11
10
|
attr_reader :counter, :name
|
12
11
|
|
13
12
|
# All write operations should delegate to the master connection. These
|
@@ -16,7 +15,9 @@ module Mongoid #:nodoc
|
|
16
15
|
# Example:
|
17
16
|
#
|
18
17
|
# <tt>collection.save({ :name => "Al" })</tt>
|
19
|
-
|
18
|
+
Collections::Operations::PROXIED.each do |name|
|
19
|
+
define_method(name) { |*args| master.send(name, *args) }
|
20
|
+
end
|
20
21
|
|
21
22
|
# Determines where to send the next read query. If the slaves are not
|
22
23
|
# defined then send to master. If the read counter is under the configured
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc
|
3
|
+
# The collections module is used for providing functionality around setting
|
4
|
+
# up and updating collections.
|
5
|
+
module Collections
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
included do
|
8
|
+
cattr_accessor :_collection, :collection_name
|
9
|
+
self.collection_name = self.name.collectionize
|
10
|
+
delegate :collection, :to => "self.class"
|
11
|
+
end
|
12
|
+
|
13
|
+
module ClassMethods #:nodoc:
|
14
|
+
# Returns the collection associated with this +Document+. If the
|
15
|
+
# document is embedded, there will be no collection associated
|
16
|
+
# with it.
|
17
|
+
#
|
18
|
+
# Returns: <tt>Mongo::Collection</tt>
|
19
|
+
def collection
|
20
|
+
raise Errors::InvalidCollection.new(self) if embedded?
|
21
|
+
self._collection || set_collection
|
22
|
+
add_indexes; self._collection
|
23
|
+
end
|
24
|
+
|
25
|
+
# Macro for setting the collection name to store in.
|
26
|
+
#
|
27
|
+
# Example:
|
28
|
+
#
|
29
|
+
# <tt>Person.store_in :populdation</tt>
|
30
|
+
def store_in(name)
|
31
|
+
self.collection_name = name.to_s
|
32
|
+
set_collection
|
33
|
+
end
|
34
|
+
|
35
|
+
protected
|
36
|
+
def set_collection
|
37
|
+
self._collection = Mongoid::Collection.new(self, self.collection_name)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -2,7 +2,6 @@
|
|
2
2
|
module Mongoid #:nodoc:
|
3
3
|
module Collections #:nodoc:
|
4
4
|
class Master
|
5
|
-
include Mimic
|
6
5
|
|
7
6
|
attr_reader :collection
|
8
7
|
|
@@ -12,7 +11,9 @@ module Mongoid #:nodoc:
|
|
12
11
|
# Example:
|
13
12
|
#
|
14
13
|
# <tt>collection.save({ :name => "Al" })</tt>
|
15
|
-
|
14
|
+
Operations::ALL.each do |name|
|
15
|
+
define_method(name) { |*args| collection.send(name, *args) }
|
16
|
+
end
|
16
17
|
|
17
18
|
# Create the new database writer. Will create a collection from the
|
18
19
|
# master database.
|
@@ -2,7 +2,6 @@
|
|
2
2
|
module Mongoid #:nodoc:
|
3
3
|
module Collections #:nodoc:
|
4
4
|
class Slaves
|
5
|
-
include Mimic
|
6
5
|
|
7
6
|
attr_reader :iterator
|
8
7
|
|
@@ -12,7 +11,9 @@ module Mongoid #:nodoc:
|
|
12
11
|
# Example:
|
13
12
|
#
|
14
13
|
# <tt>collection.save({ :name => "Al" })</tt>
|
15
|
-
|
14
|
+
Operations::READ.each do |name|
|
15
|
+
define_method(name) { |*args| collection.send(name, *args) }
|
16
|
+
end
|
16
17
|
|
17
18
|
# Is the collection of slaves empty or not?
|
18
19
|
#
|
data/lib/mongoid/components.rb
CHANGED
@@ -1,25 +1,27 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
module Mongoid #:nodoc
|
3
3
|
module Components #:nodoc
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
included do
|
6
|
+
# All modules that a +Document+ is composed of are defined in this
|
7
|
+
# module, to keep the document class from getting too cluttered.
|
8
|
+
include Mongoid::Associations
|
9
|
+
include Mongoid::Attributes
|
10
|
+
include Mongoid::Callbacks
|
11
|
+
include Mongoid::Collections
|
12
|
+
include Mongoid::Dirty
|
13
|
+
include Mongoid::Extras
|
14
|
+
include Mongoid::Fields
|
15
|
+
include Mongoid::Indexes
|
16
|
+
include Mongoid::Matchers
|
17
|
+
include Mongoid::Memoization
|
18
|
+
include Mongoid::Observable
|
19
|
+
include Mongoid::Paths
|
20
|
+
include Mongoid::Persistence
|
21
|
+
include Mongoid::State
|
22
|
+
include Validatable
|
23
|
+
extend Mongoid::Finders
|
24
|
+
extend Mongoid::NamedScope
|
23
25
|
end
|
24
26
|
end
|
25
27
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
unless defined?(ActiveSupport::Concern)
|
2
|
+
module ActiveSupport
|
3
|
+
module Concern
|
4
|
+
def self.extended(base)
|
5
|
+
base.instance_variable_set("@_dependencies", [])
|
6
|
+
end
|
7
|
+
|
8
|
+
def append_features(base)
|
9
|
+
if base.instance_variable_defined?("@_dependencies")
|
10
|
+
base.instance_variable_get("@_dependencies") << self
|
11
|
+
return false
|
12
|
+
else
|
13
|
+
return false if base < self
|
14
|
+
@_dependencies.each { |dep| base.send(:include, dep) }
|
15
|
+
super
|
16
|
+
base.extend const_get("ClassMethods") if const_defined?("ClassMethods")
|
17
|
+
base.send :include, const_get("InstanceMethods") if const_defined?("InstanceMethods")
|
18
|
+
base.class_eval(&@_included_block) if instance_variable_defined?("@_included_block")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def included(base = nil, &block)
|
23
|
+
if base.nil?
|
24
|
+
@_included_block = block
|
25
|
+
else
|
26
|
+
super
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/mongoid/config.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
require "uri"
|
3
|
+
|
2
4
|
module Mongoid #:nodoc
|
3
5
|
class Config #:nodoc
|
4
6
|
include Singleton
|
@@ -8,23 +10,44 @@ module Mongoid #:nodoc
|
|
8
10
|
:reconnect_time,
|
9
11
|
:parameterize_keys,
|
10
12
|
:persist_in_safe_mode,
|
11
|
-
:persist_types,
|
12
13
|
:raise_not_found_error,
|
13
14
|
:use_object_ids
|
14
15
|
|
15
16
|
# Defaults the configuration options to true.
|
16
17
|
def initialize
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
18
|
+
reset
|
19
|
+
end
|
20
|
+
|
21
|
+
# Sets whether the times returned from the database are in UTC or local time.
|
22
|
+
# If you omit this setting, then times will be returned in
|
23
|
+
# the local time zone.
|
24
|
+
#
|
25
|
+
# Example:
|
26
|
+
#
|
27
|
+
# <tt>Config.use_utc = true</tt>
|
28
|
+
#
|
29
|
+
# Returns:
|
30
|
+
#
|
31
|
+
# A boolean
|
32
|
+
def use_utc=(value)
|
33
|
+
@use_utc = value || false
|
24
34
|
end
|
25
35
|
|
26
|
-
#
|
27
|
-
#
|
36
|
+
# Returns whether times are return from the database in UTC. If
|
37
|
+
# this setting is false, then times will be returned in the local time zone.
|
38
|
+
#
|
39
|
+
# Example:
|
40
|
+
#
|
41
|
+
# <tt>Config.use_utc</tt>
|
42
|
+
#
|
43
|
+
# Returns:
|
44
|
+
#
|
45
|
+
# A boolean
|
46
|
+
attr_reader :use_utc
|
47
|
+
alias_method :use_utc?, :use_utc
|
48
|
+
|
49
|
+
# Sets the Mongo::DB master database to be used. If the object trying to be
|
50
|
+
# set is not a valid +Mongo::DB+, then an error will be raised.
|
28
51
|
#
|
29
52
|
# Example:
|
30
53
|
#
|
@@ -34,7 +57,7 @@ module Mongoid #:nodoc
|
|
34
57
|
#
|
35
58
|
# The Master DB instance.
|
36
59
|
def master=(db)
|
37
|
-
|
60
|
+
check_database!(db)
|
38
61
|
@master = db
|
39
62
|
end
|
40
63
|
|
@@ -66,7 +89,9 @@ module Mongoid #:nodoc
|
|
66
89
|
#
|
67
90
|
# The slaves DB instances.
|
68
91
|
def slaves=(dbs)
|
69
|
-
dbs.each
|
92
|
+
dbs.each do |db|
|
93
|
+
check_database!(db)
|
94
|
+
end
|
70
95
|
@slaves = dbs
|
71
96
|
end
|
72
97
|
|
@@ -82,5 +107,85 @@ module Mongoid #:nodoc
|
|
82
107
|
def slaves
|
83
108
|
@slaves
|
84
109
|
end
|
110
|
+
|
111
|
+
# Confiure mongoid from a hash that was usually parsed out of yml.
|
112
|
+
#
|
113
|
+
# Example:
|
114
|
+
#
|
115
|
+
# <tt>Mongoid::Config.instance.from_hash({})</tt>
|
116
|
+
def from_hash(settings)
|
117
|
+
_master(settings)
|
118
|
+
_slaves(settings)
|
119
|
+
settings.except("database").each_pair do |name, value|
|
120
|
+
send("#{name}=", value) if respond_to?(name)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
# Reset the configuration options to the defaults.
|
125
|
+
#
|
126
|
+
# Example:
|
127
|
+
#
|
128
|
+
# <tt>config.reset</tt>
|
129
|
+
def reset
|
130
|
+
@allow_dynamic_fields = true
|
131
|
+
@parameterize_keys = true
|
132
|
+
@persist_in_safe_mode = true
|
133
|
+
@raise_not_found_error = true
|
134
|
+
@reconnect_time = 3
|
135
|
+
@use_object_ids = false
|
136
|
+
@time_zone = nil
|
137
|
+
end
|
138
|
+
|
139
|
+
protected
|
140
|
+
|
141
|
+
# Check if the database is valid and the correct version.
|
142
|
+
#
|
143
|
+
# Example:
|
144
|
+
#
|
145
|
+
# <tt>config.check_database!</tt>
|
146
|
+
def check_database!(database)
|
147
|
+
raise Errors::InvalidDatabase.new(database) unless database.kind_of?(Mongo::DB)
|
148
|
+
version = database.connection.server_version
|
149
|
+
raise Errors::UnsupportedVersion.new(version) if version < Mongoid::MONGODB_VERSION
|
150
|
+
end
|
151
|
+
|
152
|
+
# Get a Rails logger or stdout logger.
|
153
|
+
#
|
154
|
+
# Example:
|
155
|
+
#
|
156
|
+
# <tt>config.logger</tt>
|
157
|
+
def logger
|
158
|
+
defined?(Rails) ? Rails.logger : Logger.new($stdout)
|
159
|
+
end
|
160
|
+
|
161
|
+
# Get a master database from settings.
|
162
|
+
#
|
163
|
+
# Example:
|
164
|
+
#
|
165
|
+
# <tt>config._master({}, "test")</tt>
|
166
|
+
def _master(settings)
|
167
|
+
name = settings["database"]
|
168
|
+
host = settings.delete("host") || "localhost"
|
169
|
+
port = settings.delete("port") || 27017
|
170
|
+
self.master = Mongo::Connection.new(host, port, :logger => logger).db(name)
|
171
|
+
end
|
172
|
+
|
173
|
+
# Get a bunch-o-slaves from settings and names.
|
174
|
+
#
|
175
|
+
# Example:
|
176
|
+
#
|
177
|
+
# <tt>config._slaves({}, "test")</tt>
|
178
|
+
def _slaves(settings)
|
179
|
+
name = settings["database"]
|
180
|
+
self.slaves = []
|
181
|
+
slaves = settings.delete("slaves")
|
182
|
+
slaves.to_a.each do |slave|
|
183
|
+
self.slaves << Mongo::Connection.new(
|
184
|
+
slave["host"],
|
185
|
+
slave["port"],
|
186
|
+
:slave_ok => true
|
187
|
+
).db(name)
|
188
|
+
end
|
189
|
+
end
|
85
190
|
end
|
86
191
|
end
|
data/lib/mongoid/contexts.rb
CHANGED