mongomodel 0.5.5 → 0.5.6
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.
- 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
|