mongomodel 0.5.5 → 0.5.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.travis.yml +23 -11
- data/gemfiles/rails-3.2.gemfile +2 -2
- data/gemfiles/rails-4-observers.gemfile +1 -1
- data/gemfiles/rails-4.1.gemfile +2 -2
- data/gemfiles/{mongoid.gemfile → rails-4.2.gemfile} +2 -3
- data/gemfiles/{mongo_mapper.gemfile → rails-5.0.gemfile} +2 -3
- data/gemfiles/rails-5.1.gemfile +10 -0
- data/gemfiles/rails-5.2.gemfile +10 -0
- data/lib/mongomodel.rb +15 -15
- data/lib/mongomodel/attributes/mongo.rb +7 -7
- data/lib/mongomodel/attributes/store.rb +4 -4
- data/lib/mongomodel/attributes/typecasting.rb +7 -7
- data/lib/mongomodel/compatibility/mongo_mapper.rb +3 -3
- data/lib/mongomodel/compatibility/mongoid.rb +3 -3
- data/lib/mongomodel/concerns/abstract_class.rb +3 -3
- data/lib/mongomodel/concerns/activemodel.rb +4 -4
- data/lib/mongomodel/concerns/associations.rb +8 -8
- data/lib/mongomodel/concerns/associations/base/association.rb +5 -5
- data/lib/mongomodel/concerns/associations/base/definition.rb +4 -4
- data/lib/mongomodel/concerns/associations/base/proxy.rb +1 -1
- data/lib/mongomodel/concerns/associations/belongs_to.rb +19 -19
- data/lib/mongomodel/concerns/associations/has_many_by_foreign_key.rb +36 -36
- data/lib/mongomodel/concerns/associations/has_many_by_ids.rb +34 -34
- data/lib/mongomodel/concerns/attribute_methods.rb +10 -10
- data/lib/mongomodel/concerns/attribute_methods/before_type_cast.rb +4 -4
- data/lib/mongomodel/concerns/attribute_methods/dirty.rb +95 -13
- data/lib/mongomodel/concerns/attribute_methods/forbidden.rb +1 -1
- data/lib/mongomodel/concerns/attribute_methods/multi_parameter_assignment.rb +6 -6
- data/lib/mongomodel/concerns/attribute_methods/nested.rb +18 -18
- data/lib/mongomodel/concerns/attribute_methods/protected.rb +3 -3
- data/lib/mongomodel/concerns/attribute_methods/query.rb +3 -3
- data/lib/mongomodel/concerns/attribute_methods/read.rb +4 -4
- data/lib/mongomodel/concerns/attribute_methods/write.rb +4 -4
- data/lib/mongomodel/concerns/attributes.rb +18 -18
- data/lib/mongomodel/concerns/callbacks.rb +7 -7
- data/lib/mongomodel/concerns/document_parent.rb +2 -2
- data/lib/mongomodel/concerns/logging.rb +2 -2
- data/lib/mongomodel/concerns/map_reduce.rb +11 -11
- data/lib/mongomodel/concerns/pretty_inspect.rb +3 -3
- data/lib/mongomodel/concerns/properties.rb +18 -18
- data/lib/mongomodel/concerns/record_status.rb +9 -13
- data/lib/mongomodel/concerns/serialization.rb +4 -4
- data/lib/mongomodel/concerns/timestamps.rb +4 -4
- data/lib/mongomodel/concerns/translation.rb +2 -2
- data/lib/mongomodel/concerns/validations.rb +5 -5
- data/lib/mongomodel/concerns/validations/associated.rb +1 -1
- data/lib/mongomodel/document.rb +6 -6
- data/lib/mongomodel/document/callbacks.rb +15 -21
- data/lib/mongomodel/document/collection_modifiers.rb +5 -5
- data/lib/mongomodel/document/dynamic_finders.rb +1 -1
- data/lib/mongomodel/document/indexes.rb +19 -19
- data/lib/mongomodel/document/optimistic_locking.rb +7 -7
- data/lib/mongomodel/document/persistence.rb +23 -23
- data/lib/mongomodel/document/scopes.rb +20 -20
- data/lib/mongomodel/document/validations.rb +6 -6
- data/lib/mongomodel/document/validations/uniqueness.rb +11 -11
- data/lib/mongomodel/embedded_document.rb +11 -11
- data/lib/mongomodel/locale/en.yml +0 -1
- data/lib/mongomodel/log_subscriber.rb +5 -5
- data/lib/mongomodel/railtie.rb +13 -13
- data/lib/mongomodel/support/collection.rb +31 -31
- data/lib/mongomodel/support/configuration.rb +11 -11
- data/lib/mongomodel/support/core_extensions.rb +1 -1
- data/lib/mongomodel/support/dynamic_finder.rb +12 -12
- data/lib/mongomodel/support/exceptions.rb +6 -6
- data/lib/mongomodel/support/instrumented_collection.rb +20 -20
- data/lib/mongomodel/support/map.rb +33 -33
- data/lib/mongomodel/support/mongo_operator.rb +6 -6
- data/lib/mongomodel/support/mongo_options.rb +18 -18
- data/lib/mongomodel/support/mongo_order.rb +16 -16
- data/lib/mongomodel/support/paginator.rb +8 -8
- data/lib/mongomodel/support/reference.rb +10 -10
- data/lib/mongomodel/support/scope.rb +37 -37
- data/lib/mongomodel/support/scope/array_methods.rb +1 -1
- data/lib/mongomodel/support/scope/batches.rb +1 -1
- data/lib/mongomodel/support/scope/dynamic_finders.rb +1 -1
- data/lib/mongomodel/support/scope/finder_methods.rb +7 -7
- data/lib/mongomodel/support/scope/load_methods.rb +1 -1
- data/lib/mongomodel/support/scope/pagination.rb +1 -1
- data/lib/mongomodel/support/scope/query_methods.rb +6 -6
- data/lib/mongomodel/support/scope/spawn_methods.rb +8 -8
- data/lib/mongomodel/support/types.rb +2 -2
- data/lib/mongomodel/support/types/array.rb +1 -1
- data/lib/mongomodel/support/types/boolean.rb +3 -3
- data/lib/mongomodel/support/types/custom.rb +3 -3
- data/lib/mongomodel/support/types/date.rb +2 -2
- data/lib/mongomodel/support/types/date_time.rb +6 -16
- data/lib/mongomodel/support/types/float.rb +1 -1
- data/lib/mongomodel/support/types/hash.rb +1 -1
- data/lib/mongomodel/support/types/integer.rb +13 -10
- data/lib/mongomodel/support/types/object.rb +5 -5
- data/lib/mongomodel/support/types/rational.rb +3 -3
- data/lib/mongomodel/support/types/time.rb +2 -2
- data/lib/mongomodel/version.rb +1 -1
- data/lib/rails/generators/mongo_model/config/templates/mongomodel.yml +3 -4
- data/lib/rails/generators/mongo_model/model/model_generator.rb +3 -3
- data/mongomodel.gemspec +5 -4
- data/spec/mongomodel/attributes/store_spec.rb +21 -21
- data/spec/mongomodel/concerns/activemodel_spec.rb +4 -4
- data/spec/mongomodel/concerns/associations/base/association_spec.rb +12 -12
- data/spec/mongomodel/concerns/associations/belongs_to_spec.rb +34 -21
- data/spec/mongomodel/concerns/associations/has_many_by_foreign_key_spec.rb +53 -53
- data/spec/mongomodel/concerns/associations/has_many_by_ids_spec.rb +30 -30
- data/spec/mongomodel/concerns/attribute_methods/before_type_cast_spec.rb +7 -7
- data/spec/mongomodel/concerns/attribute_methods/dirty_spec.rb +45 -41
- data/spec/mongomodel/concerns/attribute_methods/multi_parameter_assignment_spec.rb +7 -7
- data/spec/mongomodel/concerns/attribute_methods/nested_spec.rb +31 -31
- data/spec/mongomodel/concerns/attribute_methods/protected_spec.rb +15 -15
- data/spec/mongomodel/concerns/attribute_methods/query_spec.rb +19 -19
- data/spec/mongomodel/concerns/attribute_methods/read_spec.rb +9 -9
- data/spec/mongomodel/concerns/attribute_methods/write_spec.rb +6 -6
- data/spec/mongomodel/concerns/attribute_methods_spec.rb +13 -13
- data/spec/mongomodel/concerns/attributes_spec.rb +34 -34
- data/spec/mongomodel/concerns/callbacks_spec.rb +25 -21
- data/spec/mongomodel/concerns/logging_spec.rb +5 -3
- data/spec/mongomodel/concerns/map_reduce_spec.rb +19 -19
- data/spec/mongomodel/concerns/observing_spec.rb +3 -3
- data/spec/mongomodel/concerns/pretty_inspect_spec.rb +10 -10
- data/spec/mongomodel/concerns/properties_spec.rb +11 -11
- data/spec/mongomodel/concerns/serialization/json_serialization_spec.rb +13 -13
- data/spec/mongomodel/concerns/timestamps_spec.rb +39 -39
- data/spec/mongomodel/concerns/validations_spec.rb +41 -38
- data/spec/mongomodel/document/callbacks_spec.rb +20 -16
- data/spec/mongomodel/document/collection_modifiers_spec.rb +16 -16
- data/spec/mongomodel/document/dynamic_finders_spec.rb +46 -46
- data/spec/mongomodel/document/finders_spec.rb +15 -15
- data/spec/mongomodel/document/indexes_spec.rb +29 -29
- data/spec/mongomodel/document/optimistic_locking_spec.rb +16 -16
- data/spec/mongomodel/document/persistence_spec.rb +39 -39
- data/spec/mongomodel/document/scopes_spec.rb +17 -17
- data/spec/mongomodel/document/validations/uniqueness_spec.rb +46 -46
- data/spec/mongomodel/document/validations_spec.rb +35 -35
- data/spec/mongomodel/document_spec.rb +19 -19
- data/spec/mongomodel/embedded_document_spec.rb +19 -19
- data/spec/mongomodel/mongomodel_spec.rb +7 -6
- data/spec/mongomodel/support/collection_spec.rb +54 -54
- data/spec/mongomodel/support/configuration_spec.rb +1 -1
- data/spec/mongomodel/support/map_spec.rb +66 -66
- data/spec/mongomodel/support/mongo_operator_spec.rb +5 -5
- data/spec/mongomodel/support/mongo_options_spec.rb +42 -42
- data/spec/mongomodel/support/mongo_order_spec.rb +24 -24
- data/spec/mongomodel/support/paginator_spec.rb +15 -15
- data/spec/mongomodel/support/property_spec.rb +29 -23
- data/spec/mongomodel/support/scope_spec.rb +205 -204
- data/spec/spec_helper.rb +13 -2
- data/spec/support/callbacks.rb +3 -8
- data/spec/support/helpers/define_class.rb +7 -7
- data/spec/support/helpers/document_finder_stubs.rb +6 -6
- data/spec/support/helpers/specs_for.rb +1 -1
- data/spec/support/helpers/validations.rb +1 -1
- data/spec/support/matchers/find_with.rb +8 -8
- data/spec/support/matchers/respond_to_boolean.rb +3 -3
- data/spec/support/matchers/run_callbacks.rb +6 -9
- data/spec/support/models.rb +5 -5
- metadata +23 -7
@@ -2,39 +2,39 @@ module MongoModel
|
|
2
2
|
module DocumentExtensions
|
3
3
|
module Scopes
|
4
4
|
extend ActiveSupport::Concern
|
5
|
-
|
5
|
+
|
6
6
|
delegate :current_scope, :to => "self.class"
|
7
|
-
|
7
|
+
|
8
8
|
def initialize(*)
|
9
9
|
self.attributes = current_scope.options_for_create if respond_to?(:attributes=)
|
10
10
|
super
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
module ClassMethods
|
14
14
|
delegate :find, :first, :last, :all, :exists?, :count, :to => :scoped
|
15
15
|
delegate :update, :update_all, :delete, :delete_all, :destroy, :destroy_all, :to => :scoped
|
16
16
|
delegate :select, :order, :where, :limit, :offset, :from, :paginate, :in_batches, :to => :scoped
|
17
|
-
|
17
|
+
|
18
18
|
def unscoped
|
19
19
|
@unscoped ||= MongoModel::Scope.new(self)
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
def scoped
|
23
23
|
current_scope.clone
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
def scope(name, scope)
|
27
27
|
name = name.to_sym
|
28
|
-
|
28
|
+
|
29
29
|
if !scopes[name] && respond_to?(name, true)
|
30
30
|
logger.warn "Creating scope :#{name}. " \
|
31
31
|
"Overwriting existing method #{self.name}.#{name}."
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
scopes[name] = lambda do |*args|
|
35
35
|
scope.is_a?(Proc) ? scope.call(*args) : scope
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
singleton_class.class_eval do
|
39
39
|
define_method(name) do |*args|
|
40
40
|
s = scopes[name].call(*args)
|
@@ -42,55 +42,55 @@ module MongoModel
|
|
42
42
|
end
|
43
43
|
end
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
def default_scope(scope)
|
47
47
|
reset_current_scopes
|
48
48
|
previous_scope = default_scoping.last || unscoped
|
49
49
|
default_scoping << previous_scope.merge(scope)
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
52
|
def current_scope
|
53
53
|
current_scopes.last || unscoped
|
54
54
|
end
|
55
|
-
|
55
|
+
|
56
56
|
def scopes
|
57
57
|
@_scopes ||= {}
|
58
58
|
end
|
59
|
-
|
59
|
+
|
60
60
|
def scopes=(scopes)
|
61
61
|
@_scopes = scopes
|
62
62
|
end
|
63
|
-
|
63
|
+
|
64
64
|
def default_scoping
|
65
65
|
@_default_scoping ||= []
|
66
66
|
end
|
67
|
-
|
67
|
+
|
68
68
|
def default_scoping=(scoping)
|
69
69
|
@_default_scoping = scoping
|
70
70
|
end
|
71
|
-
|
71
|
+
|
72
72
|
def inherited(subclass)
|
73
73
|
super
|
74
74
|
subclass.scopes = scopes.dup
|
75
75
|
subclass.default_scoping = default_scoping.dup
|
76
76
|
end
|
77
|
-
|
77
|
+
|
78
78
|
protected
|
79
79
|
def with_scope(scope, &block)
|
80
80
|
current_scopes << current_scope.merge(scope)
|
81
|
-
|
81
|
+
|
82
82
|
begin
|
83
83
|
yield
|
84
84
|
ensure
|
85
85
|
current_scopes.pop
|
86
86
|
end
|
87
87
|
end
|
88
|
-
|
88
|
+
|
89
89
|
private
|
90
90
|
def current_scopes
|
91
91
|
Thread.current[:"#{self}_scopes"] ||= default_scoping.dup
|
92
92
|
end
|
93
|
-
|
93
|
+
|
94
94
|
def reset_current_scopes
|
95
95
|
Thread.current[:"#{self}_scopes"] = nil
|
96
96
|
end
|
@@ -6,12 +6,12 @@ module MongoModel
|
|
6
6
|
module ClassMethods
|
7
7
|
def property(name, *args, &block) #:nodoc:
|
8
8
|
property = super
|
9
|
-
|
9
|
+
|
10
10
|
validates_uniqueness_of(name) if property.options[:unique]
|
11
|
-
|
11
|
+
|
12
12
|
property
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
# Creates an object just like Document.create but calls save! instead of save
|
16
16
|
# so an exception is raised if the document is invalid.
|
17
17
|
def create!(attributes={}, &block)
|
@@ -24,7 +24,7 @@ module MongoModel
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
# The validation process on save can be skipped by passing <tt>:validate => false</tt>. The regular Document#save method is
|
29
29
|
# replaced with this when the validations module is mixed in, which it is by default.
|
30
30
|
def save(options={})
|
@@ -39,7 +39,7 @@ module MongoModel
|
|
39
39
|
false
|
40
40
|
end
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
# Attempts to save the document just like Document#save but will raise a DocumentInvalid exception
|
44
44
|
# instead of returning false if the document is not valid.
|
45
45
|
def save!(options={})
|
@@ -53,7 +53,7 @@ module MongoModel
|
|
53
53
|
raise DocumentInvalid.new(self)
|
54
54
|
end
|
55
55
|
end
|
56
|
-
|
56
|
+
|
57
57
|
protected
|
58
58
|
def perform_validation(options={})
|
59
59
|
perform_validation = options != false && options[:validate] != false
|
@@ -6,40 +6,40 @@ module MongoModel
|
|
6
6
|
class UniquenessValidator < ActiveModel::EachValidator
|
7
7
|
def initialize(options)
|
8
8
|
options = options.reverse_merge(:case_sensitive => true)
|
9
|
-
|
9
|
+
|
10
10
|
ActiveSupport::Deprecation.silence { super }
|
11
11
|
setup!(options[:class]) if options[:class] && !@klass
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
def setup(klass)
|
15
15
|
setup!(klass)
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
def validate_each(record, attribute, value)
|
19
19
|
finder_class = find_finder_class_for(record)
|
20
20
|
unique_scope = finder_class.scoped
|
21
|
-
|
21
|
+
|
22
22
|
if options[:case_sensitive] || !value.is_a?(String)
|
23
23
|
unique_scope = unique_scope.where(attribute => value)
|
24
24
|
else
|
25
25
|
unique_scope = unique_scope.where("_lowercase_#{attribute}" => value.downcase)
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
Array.wrap(options[:scope]).each do |scope|
|
29
29
|
unique_scope = unique_scope.where(scope => record.send(scope))
|
30
30
|
end
|
31
|
-
|
31
|
+
|
32
32
|
unique_scope = unique_scope.where(:id.ne => record.id) unless record.new_record?
|
33
|
-
|
33
|
+
|
34
34
|
if unique_scope.any?
|
35
35
|
record.errors.add(attribute, :taken, :message => options[:message], :value => value)
|
36
36
|
end
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
39
|
private
|
40
40
|
def setup!(klass)
|
41
41
|
@klass = klass
|
42
|
-
|
42
|
+
|
43
43
|
unless options[:index] == false
|
44
44
|
# Create unique indexes to deal with race condition
|
45
45
|
attributes.each do |attr_name|
|
@@ -53,7 +53,7 @@ module MongoModel
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
end
|
56
|
-
|
56
|
+
|
57
57
|
# The check for an existing value should be run from a class that
|
58
58
|
# isn't abstract. This means working down from the current class
|
59
59
|
# (self), to the first non-abstract class. Since classes don't know
|
@@ -69,7 +69,7 @@ module MongoModel
|
|
69
69
|
class_hierarchy.detect { |klass| !klass.abstract_class? }
|
70
70
|
end
|
71
71
|
end
|
72
|
-
|
72
|
+
|
73
73
|
module ClassMethods
|
74
74
|
# Validates whether the value of the specified attributes are unique across the system. Useful for making sure that only one user
|
75
75
|
# can be named "davidhh".
|
@@ -3,17 +3,17 @@ module MongoModel
|
|
3
3
|
def ==(other)
|
4
4
|
self.class == other.class && attributes == other.attributes
|
5
5
|
end
|
6
|
-
|
6
|
+
|
7
7
|
include Attributes
|
8
8
|
include Properties
|
9
|
-
|
9
|
+
|
10
10
|
include Translation
|
11
11
|
include Validations
|
12
12
|
include Callbacks
|
13
13
|
include Observing if defined?(ActiveModel::Observing)
|
14
|
-
|
14
|
+
|
15
15
|
include Associations
|
16
|
-
|
16
|
+
|
17
17
|
include AttributeMethods
|
18
18
|
include AttributeMethods::Read
|
19
19
|
include AttributeMethods::Write
|
@@ -24,29 +24,29 @@ module MongoModel
|
|
24
24
|
include AttributeMethods::Nested
|
25
25
|
include AttributeMethods::MultiParameterAssignment
|
26
26
|
include AttributeMethods::Forbidden if defined?(ActiveModel::ForbiddenAttributesProtection)
|
27
|
-
|
27
|
+
|
28
28
|
include Logging
|
29
|
-
|
29
|
+
prepend RecordStatus
|
30
30
|
include ActiveModelCompatibility
|
31
31
|
include Serialization
|
32
32
|
include Timestamps
|
33
33
|
include PrettyInspect
|
34
34
|
include AbstractClass
|
35
35
|
include DocumentParent
|
36
|
-
|
36
|
+
|
37
37
|
# Allow Collection class to be used in property definitions
|
38
38
|
Collection = MongoModel::Collection
|
39
39
|
extend Collection::PropertyDefaults
|
40
|
-
|
40
|
+
|
41
41
|
# Allow Map class to be used in property definitions
|
42
42
|
Map = MongoModel::Map
|
43
43
|
extend Map::PropertyDefaults
|
44
|
-
|
44
|
+
|
45
45
|
undef_method :type if method_defined?(:type)
|
46
46
|
property :type, String, :as => '_type', :default => lambda { |doc| doc.class.name }, :protected => true
|
47
|
-
|
47
|
+
|
48
48
|
self.abstract_class = true
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
|
-
ActiveSupport::run_load_hooks(:mongomodel, MongoModel::EmbeddedDocument)
|
52
|
+
ActiveSupport::run_load_hooks(:mongomodel, MongoModel::EmbeddedDocument)
|
@@ -17,24 +17,24 @@ module MongoModel
|
|
17
17
|
super
|
18
18
|
@odd_or_even = false
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
def query(event)
|
22
22
|
self.class.runtime += event.duration
|
23
23
|
return unless logger.debug?
|
24
|
-
|
24
|
+
|
25
25
|
collection = '%s (%.1fms)' % [event.payload[:collection], event.duration]
|
26
26
|
query = event.payload[:query]
|
27
|
-
|
27
|
+
|
28
28
|
if odd?
|
29
29
|
collection = color(collection, CYAN, true)
|
30
30
|
query = color(query, nil, true)
|
31
31
|
else
|
32
32
|
collection = color(collection, MAGENTA, true)
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
debug " #{collection} #{query}"
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
def odd?
|
39
39
|
@odd_or_even = !@odd_or_even
|
40
40
|
end
|
data/lib/mongomodel/railtie.rb
CHANGED
@@ -3,44 +3,44 @@ module MongoModel
|
|
3
3
|
def self.rescue_responses
|
4
4
|
{ 'MongoModel::DocumentNotFound' => :not_found }
|
5
5
|
end
|
6
|
-
|
6
|
+
|
7
7
|
if config.action_dispatch.rescue_responses
|
8
8
|
config.action_dispatch.rescue_responses.merge!(rescue_responses)
|
9
9
|
end
|
10
|
-
|
11
|
-
config.app_generators.orm :mongo_model, :migration => false
|
10
|
+
|
11
|
+
config.app_generators.orm :mongo_model, :migration => false
|
12
12
|
|
13
13
|
config.mongomodel = ActiveSupport::OrderedOptions.new
|
14
14
|
|
15
15
|
rake_tasks do
|
16
16
|
load "mongomodel/tasks/database.rake"
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
console do
|
20
20
|
MongoModel.logger = Logger.new(STDERR)
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
initializer "mongomodel.logger" do
|
24
24
|
MongoModel.logger ||= ::Rails.logger
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
initializer "mongomodel.rescue_responses" do
|
28
28
|
unless config.action_dispatch.rescue_responses
|
29
29
|
ActionDispatch::ShowExceptions.rescue_responses.update(self.class.rescue_responses)
|
30
30
|
end
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
initializer "mongomodel.database_configuration" do |app|
|
34
34
|
require 'erb'
|
35
|
-
|
35
|
+
|
36
36
|
config = Rails.root.join("config", "mongomodel.yml")
|
37
|
-
|
37
|
+
|
38
38
|
if File.exists?(config)
|
39
39
|
mongomodel_configuration = YAML::load(ERB.new(IO.read(config)).result)
|
40
40
|
MongoModel.configuration = mongomodel_configuration[Rails.env]
|
41
41
|
end
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
# Expose database runtime to controller for logging.
|
45
45
|
initializer "mongomodel.log_runtime" do |app|
|
46
46
|
require "mongomodel/railties/controller_runtime"
|
@@ -48,7 +48,7 @@ module MongoModel
|
|
48
48
|
include MongoModel::Railties::ControllerRuntime
|
49
49
|
end
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
52
|
initializer "mongomodel.passenger_forking" do |app|
|
53
53
|
if defined?(PhusionPassenger)
|
54
54
|
PhusionPassenger.on_event(:starting_worker_process) do |forked|
|
@@ -56,13 +56,13 @@ module MongoModel
|
|
56
56
|
end
|
57
57
|
end
|
58
58
|
end
|
59
|
-
|
59
|
+
|
60
60
|
initializer "mongomodel.observers" do |app|
|
61
61
|
if defined?(ActiveModel::Observing)
|
62
62
|
MongoModel::EmbeddedDocument.observers = app.config.mongomodel.observers || []
|
63
63
|
end
|
64
64
|
end
|
65
|
-
|
65
|
+
|
66
66
|
# Initialize observer instances if available
|
67
67
|
ActiveSupport.on_load(:mongomodel) do
|
68
68
|
if respond_to?(:instantiate_observers)
|
@@ -5,84 +5,84 @@ module MongoModel
|
|
5
5
|
module PropertyDefaults
|
6
6
|
def property(name, *args, &block) #:nodoc:
|
7
7
|
property = super(name, *args, &block)
|
8
|
-
|
8
|
+
|
9
9
|
if property.type <= Collection
|
10
10
|
property.options[:default] ||= lambda { property.type.new }
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
property
|
14
14
|
end
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
ARRAY_CONVERTER = Types.converter_for(Array)
|
18
|
-
|
18
|
+
|
19
19
|
class_attribute :type
|
20
20
|
self.type = Object
|
21
|
-
|
21
|
+
|
22
22
|
include DocumentParent
|
23
|
-
|
23
|
+
|
24
24
|
def initialize(array=[])
|
25
25
|
super(array.map { |i| convert_for_add(i) })
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
def []=(index, value)
|
29
29
|
super(index, convert_for_add(value))
|
30
30
|
end
|
31
|
-
|
31
|
+
|
32
32
|
def <<(value)
|
33
33
|
super(convert_for_add(value))
|
34
34
|
end
|
35
|
-
|
35
|
+
|
36
36
|
def build(value={})
|
37
37
|
value = convert(value)
|
38
38
|
self << value
|
39
39
|
value
|
40
40
|
end
|
41
|
-
|
41
|
+
|
42
42
|
def +(other)
|
43
43
|
self.class.new(super(other))
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
def concat(values)
|
47
47
|
super(values.map { |v| convert_for_add(v) })
|
48
48
|
end
|
49
|
-
|
49
|
+
|
50
50
|
def delete(value)
|
51
51
|
super(convert(value))
|
52
52
|
end
|
53
|
-
|
53
|
+
|
54
54
|
def include?(value)
|
55
55
|
super(convert(value))
|
56
56
|
end
|
57
|
-
|
57
|
+
|
58
58
|
def index(value)
|
59
59
|
super(convert(value))
|
60
60
|
end
|
61
|
-
|
61
|
+
|
62
62
|
def insert(index, value)
|
63
63
|
super(index, convert_for_add(value))
|
64
64
|
end
|
65
|
-
|
65
|
+
|
66
66
|
def push(*values)
|
67
67
|
super(*values.map { |v| convert_for_add(v) })
|
68
68
|
end
|
69
|
-
|
69
|
+
|
70
70
|
def rindex(value)
|
71
71
|
super(convert(value))
|
72
72
|
end
|
73
|
-
|
73
|
+
|
74
74
|
def unshift(*values)
|
75
75
|
super(*values.map { |v| convert_for_add(v) })
|
76
76
|
end
|
77
|
-
|
77
|
+
|
78
78
|
def to_mongo
|
79
79
|
ARRAY_CONVERTER.to_mongo(self)
|
80
80
|
end
|
81
|
-
|
81
|
+
|
82
82
|
def embedded_documents
|
83
83
|
select { |item| item.is_a?(EmbeddedDocument) }
|
84
84
|
end
|
85
|
-
|
85
|
+
|
86
86
|
class << self
|
87
87
|
def inspect
|
88
88
|
if type == Object
|
@@ -91,14 +91,14 @@ module MongoModel
|
|
91
91
|
"Collection[#{type}]"
|
92
92
|
end
|
93
93
|
end
|
94
|
-
|
94
|
+
|
95
95
|
# Create a new MongoModel::Collection class with the type set to the specified class.
|
96
96
|
# This allows you declare arrays of embedded documents like:
|
97
97
|
#
|
98
98
|
# class Thing < MongoModel::EmbeddedDocument
|
99
99
|
# property :name, String
|
100
100
|
# end
|
101
|
-
#
|
101
|
+
#
|
102
102
|
# class MyModel < MongoModel::Document
|
103
103
|
# property :things, Collection[Thing]
|
104
104
|
# end
|
@@ -124,9 +124,9 @@ module MongoModel
|
|
124
124
|
collection
|
125
125
|
end
|
126
126
|
end
|
127
|
-
|
127
|
+
|
128
128
|
alias of []
|
129
|
-
|
129
|
+
|
130
130
|
def cast(value)
|
131
131
|
case value
|
132
132
|
when Array
|
@@ -138,7 +138,7 @@ module MongoModel
|
|
138
138
|
new(Array(value))
|
139
139
|
end
|
140
140
|
end
|
141
|
-
|
141
|
+
|
142
142
|
def from_mongo(value)
|
143
143
|
case value
|
144
144
|
when Array
|
@@ -147,11 +147,11 @@ module MongoModel
|
|
147
147
|
from_mongo([value])
|
148
148
|
end
|
149
149
|
end
|
150
|
-
|
150
|
+
|
151
151
|
def converter
|
152
152
|
@converter ||= Types.converter_for(type)
|
153
153
|
end
|
154
|
-
|
154
|
+
|
155
155
|
private
|
156
156
|
def instantiate(item)
|
157
157
|
if item.is_a?(Hash) && item['_type']
|
@@ -161,18 +161,18 @@ module MongoModel
|
|
161
161
|
end
|
162
162
|
end
|
163
163
|
end
|
164
|
-
|
164
|
+
|
165
165
|
private
|
166
166
|
def convert(value)
|
167
167
|
converter.cast(value)
|
168
168
|
end
|
169
|
-
|
169
|
+
|
170
170
|
def convert_for_add(value)
|
171
171
|
result = convert(value)
|
172
172
|
result.parent_document = lambda { parent_document } if result.respond_to?(:parent_document=)
|
173
173
|
result
|
174
174
|
end
|
175
|
-
|
175
|
+
|
176
176
|
def converter
|
177
177
|
self.class.converter
|
178
178
|
end
|