mongo_mapper 0.13.0.beta2 → 0.15.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.
Files changed (132) hide show
  1. checksums.yaml +5 -5
  2. data/LICENSE +1 -1
  3. data/README.md +64 -0
  4. data/examples/keys.rb +3 -3
  5. data/examples/modifiers/set.rb +2 -2
  6. data/examples/querying.rb +3 -3
  7. data/examples/safe.rb +2 -2
  8. data/examples/scopes.rb +1 -1
  9. data/lib/mongo_mapper.rb +5 -0
  10. data/lib/mongo_mapper/connection.rb +16 -37
  11. data/lib/mongo_mapper/document.rb +4 -0
  12. data/lib/mongo_mapper/extensions/array.rb +14 -6
  13. data/lib/mongo_mapper/extensions/hash.rb +15 -3
  14. data/lib/mongo_mapper/extensions/object.rb +4 -0
  15. data/lib/mongo_mapper/extensions/object_id.rb +5 -1
  16. data/lib/mongo_mapper/extensions/string.rb +13 -5
  17. data/lib/mongo_mapper/extensions/symbol.rb +18 -0
  18. data/lib/mongo_mapper/plugins/accessible.rb +14 -4
  19. data/lib/mongo_mapper/plugins/associations.rb +7 -6
  20. data/lib/mongo_mapper/plugins/associations/base.rb +18 -13
  21. data/lib/mongo_mapper/plugins/associations/belongs_to_association.rb +10 -1
  22. data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +9 -8
  23. data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +12 -11
  24. data/lib/mongo_mapper/plugins/associations/embedded_collection.rb +4 -4
  25. data/lib/mongo_mapper/plugins/associations/in_array_proxy.rb +24 -23
  26. data/lib/mongo_mapper/plugins/associations/many_documents_as_proxy.rb +18 -16
  27. data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +55 -48
  28. data/lib/mongo_mapper/plugins/associations/many_embedded_polymorphic_proxy.rb +14 -13
  29. data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +7 -6
  30. data/lib/mongo_mapper/plugins/associations/many_polymorphic_proxy.rb +7 -5
  31. data/lib/mongo_mapper/plugins/associations/one_as_proxy.rb +17 -14
  32. data/lib/mongo_mapper/plugins/associations/one_embedded_polymorphic_proxy.rb +14 -13
  33. data/lib/mongo_mapper/plugins/associations/one_embedded_proxy.rb +9 -9
  34. data/lib/mongo_mapper/plugins/associations/one_proxy.rb +27 -26
  35. data/lib/mongo_mapper/plugins/associations/proxy.rb +31 -28
  36. data/lib/mongo_mapper/plugins/callbacks.rb +14 -1
  37. data/lib/mongo_mapper/plugins/counter_cache.rb +97 -0
  38. data/lib/mongo_mapper/plugins/dirty.rb +29 -37
  39. data/lib/mongo_mapper/plugins/document.rb +1 -1
  40. data/lib/mongo_mapper/plugins/dynamic_querying.rb +10 -9
  41. data/lib/mongo_mapper/plugins/dynamic_querying/dynamic_finder.rb +18 -17
  42. data/lib/mongo_mapper/plugins/embedded_callbacks.rb +2 -1
  43. data/lib/mongo_mapper/plugins/embedded_document.rb +1 -1
  44. data/lib/mongo_mapper/plugins/identity_map.rb +1 -1
  45. data/lib/mongo_mapper/plugins/indexes.rb +37 -2
  46. data/lib/mongo_mapper/plugins/keys.rb +202 -142
  47. data/lib/mongo_mapper/plugins/keys/key.rb +22 -13
  48. data/lib/mongo_mapper/plugins/keys/static.rb +45 -0
  49. data/lib/mongo_mapper/plugins/modifiers.rb +59 -28
  50. data/lib/mongo_mapper/plugins/partial_updates.rb +86 -0
  51. data/lib/mongo_mapper/plugins/persistence.rb +13 -8
  52. data/lib/mongo_mapper/plugins/protected.rb +6 -5
  53. data/lib/mongo_mapper/plugins/querying.rb +85 -42
  54. data/lib/mongo_mapper/plugins/querying/decorated_plucky_query.rb +32 -9
  55. data/lib/mongo_mapper/plugins/rails.rb +1 -0
  56. data/lib/mongo_mapper/plugins/safe.rb +10 -4
  57. data/lib/mongo_mapper/plugins/sci.rb +4 -1
  58. data/lib/mongo_mapper/plugins/scopes.rb +78 -7
  59. data/lib/mongo_mapper/plugins/stats.rb +17 -0
  60. data/lib/mongo_mapper/plugins/timestamps.rb +1 -0
  61. data/lib/mongo_mapper/plugins/touch.rb +1 -1
  62. data/lib/mongo_mapper/plugins/validations.rb +7 -2
  63. data/lib/mongo_mapper/railtie.rb +20 -0
  64. data/lib/mongo_mapper/railtie/database.rake +1 -1
  65. data/lib/mongo_mapper/utils.rb +2 -2
  66. data/lib/mongo_mapper/version.rb +1 -1
  67. data/lib/rails/generators/mongo_mapper/config/config_generator.rb +12 -13
  68. data/lib/rails/generators/mongo_mapper/model/model_generator.rb +9 -9
  69. data/spec/examples.txt +1643 -0
  70. data/spec/functional/accessible_spec.rb +13 -13
  71. data/spec/functional/associations/belongs_to_polymorphic_proxy_spec.rb +13 -13
  72. data/spec/functional/associations/belongs_to_proxy_spec.rb +18 -19
  73. data/spec/functional/associations/in_array_proxy_spec.rb +10 -10
  74. data/spec/functional/associations/many_documents_as_proxy_spec.rb +6 -6
  75. data/spec/functional/associations/many_documents_proxy_spec.rb +85 -14
  76. data/spec/functional/associations/many_embedded_polymorphic_proxy_spec.rb +13 -13
  77. data/spec/functional/associations/many_embedded_proxy_spec.rb +1 -1
  78. data/spec/functional/associations/many_polymorphic_proxy_spec.rb +4 -4
  79. data/spec/functional/associations/one_as_proxy_spec.rb +10 -10
  80. data/spec/functional/associations/one_embedded_polymorphic_proxy_spec.rb +9 -9
  81. data/spec/functional/associations/one_embedded_proxy_spec.rb +3 -3
  82. data/spec/functional/associations/one_proxy_spec.rb +10 -10
  83. data/spec/functional/associations_spec.rb +3 -3
  84. data/spec/functional/binary_spec.rb +2 -2
  85. data/spec/functional/caching_spec.rb +8 -15
  86. data/spec/functional/callbacks_spec.rb +89 -2
  87. data/spec/functional/counter_cache_spec.rb +235 -0
  88. data/spec/functional/dirty_spec.rb +63 -46
  89. data/spec/functional/document_spec.rb +30 -2
  90. data/spec/functional/dumpable_spec.rb +1 -1
  91. data/spec/functional/embedded_document_spec.rb +18 -18
  92. data/spec/functional/identity_map_spec.rb +27 -14
  93. data/spec/functional/indexes_spec.rb +44 -19
  94. data/spec/functional/keys_spec.rb +117 -15
  95. data/spec/functional/logger_spec.rb +3 -3
  96. data/spec/functional/modifiers_spec.rb +67 -19
  97. data/spec/functional/partial_updates_spec.rb +577 -0
  98. data/spec/functional/protected_spec.rb +14 -14
  99. data/spec/functional/querying_spec.rb +55 -28
  100. data/spec/functional/safe_spec.rb +23 -27
  101. data/spec/functional/sci_spec.rb +49 -14
  102. data/spec/functional/scopes_spec.rb +235 -2
  103. data/spec/functional/static_keys_spec.rb +153 -0
  104. data/spec/functional/stats_spec.rb +86 -0
  105. data/spec/functional/touch_spec.rb +6 -6
  106. data/spec/functional/validations_spec.rb +51 -57
  107. data/spec/quality_spec.rb +51 -0
  108. data/spec/spec_helper.rb +37 -9
  109. data/spec/support/matchers.rb +5 -14
  110. data/spec/unit/associations/base_spec.rb +12 -12
  111. data/spec/unit/associations/belongs_to_association_spec.rb +2 -2
  112. data/spec/unit/associations/many_association_spec.rb +2 -2
  113. data/spec/unit/associations/one_association_spec.rb +2 -2
  114. data/spec/unit/associations/proxy_spec.rb +19 -16
  115. data/spec/unit/clone_spec.rb +1 -1
  116. data/spec/unit/document_spec.rb +8 -8
  117. data/spec/unit/dynamic_finder_spec.rb +8 -8
  118. data/spec/unit/embedded_document_spec.rb +18 -19
  119. data/spec/unit/extensions_spec.rb +41 -17
  120. data/spec/unit/identity_map_middleware_spec.rb +65 -96
  121. data/spec/unit/inspect_spec.rb +4 -4
  122. data/spec/unit/key_spec.rb +28 -26
  123. data/spec/unit/keys_spec.rb +10 -10
  124. data/spec/unit/model_generator_spec.rb +2 -4
  125. data/spec/unit/mongo_mapper_spec.rb +38 -85
  126. data/spec/unit/rails_spec.rb +5 -0
  127. data/spec/unit/serialization_spec.rb +1 -1
  128. data/spec/unit/time_zones_spec.rb +2 -2
  129. data/spec/unit/validations_spec.rb +28 -15
  130. metadata +188 -161
  131. data/README.rdoc +0 -55
  132. data/lib/mongo_mapper/extensions/ordered_hash.rb +0 -23
@@ -19,7 +19,7 @@ module MongoMapper
19
19
  end
20
20
 
21
21
  def reload
22
- if doc = collection.find_one(:_id => id)
22
+ if doc = collection.find({:_id => id},{limit: -1}).first
23
23
  self.class.associations.each_value do |association|
24
24
  get_proxy(association).reset
25
25
  end
@@ -29,16 +29,17 @@ module MongoMapper
29
29
  end
30
30
  end
31
31
 
32
- protected
33
- def method_missing(method, *args, &block)
34
- finder = DynamicFinder.new(method)
35
-
36
- if finder.found?
37
- dynamic_find(finder, args)
38
- else
39
- super
40
- end
32
+ private
33
+
34
+ def method_missing(method, *args, &block)
35
+ finder = DynamicFinder.new(method)
36
+
37
+ if finder.found?
38
+ dynamic_find(finder, args)
39
+ else
40
+ super
41
41
  end
42
+ end
42
43
  end
43
44
  end
44
45
  end
@@ -20,25 +20,26 @@ module MongoMapper
20
20
  bang == true
21
21
  end
22
22
 
23
- protected
24
- def match
25
- case method.to_s
26
- when /^find_(all_by|by)_([_a-zA-Z]\w*)$/
27
- @finder = :all if $1 == 'all_by'
28
- names = $2
29
- when /^find_by_([_a-zA-Z]\w*)\!$/
30
- @bang = true
31
- names = $1
32
- when /^find_or_(initialize|create)_by_([_a-zA-Z]\w*)$/
33
- @instantiator = $1 == 'initialize' ? :new : :create
34
- names = $2
35
- else
36
- @finder = nil
37
- end
23
+ protected
38
24
 
39
- @attributes = names && names.split('_and_')
25
+ def match
26
+ case method.to_s
27
+ when /^find_(all_by|by)_([_a-zA-Z]\w*)$/
28
+ @finder = :all if $1 == 'all_by'
29
+ names = $2
30
+ when /^find_by_([_a-zA-Z]\w*)\!$/
31
+ @bang = true
32
+ names = $1
33
+ when /^find_or_(initialize|create)_by_([_a-zA-Z]\w*)$/
34
+ @instantiator = $1 == 'initialize' ? :new : :create
35
+ names = $2
36
+ else
37
+ @finder = nil
40
38
  end
39
+
40
+ @attributes = names && names.split('_and_')
41
+ end
41
42
  end
42
43
  end
43
44
  end
44
- end
45
+ end
@@ -8,7 +8,7 @@ module MongoMapper
8
8
  extend ::ActiveModel::Callbacks
9
9
 
10
10
  define_model_callbacks :save, :create, :update, :destroy, :only => [:before, :after]
11
- define_model_callbacks :touch, :only => [:after]
11
+ define_model_callbacks :initialize, :find, :touch, :only => [:after]
12
12
 
13
13
  proxy_callbacks(
14
14
  :before => [:save, :create, :update, :destroy],
@@ -44,6 +44,7 @@ module MongoMapper
44
44
  definition.each do |prefix, suffixes|
45
45
  suffixes.each do |suffix|
46
46
  callback = "%s_%s" % [prefix, suffix]
47
+
47
48
  class_eval <<-CALLBACK, __FILE__, __LINE__ + 1
48
49
  class << self
49
50
  alias_method :__original_#{callback}, :#{callback}
@@ -41,7 +41,7 @@ module MongoMapper
41
41
 
42
42
  def persist(options={})
43
43
  @_new = false
44
- clear_changes if respond_to?(:clear_changes)
44
+ changes_applied if respond_to?(:changes_applied)
45
45
  save_to_collection(options)
46
46
  end
47
47
 
@@ -69,7 +69,7 @@ module MongoMapper
69
69
  end
70
70
  end
71
71
 
72
- def load(attrs)
72
+ def load(attrs, with_cast = false)
73
73
  return super unless Thread.current[:mongo_mapper_identity_map_enabled]
74
74
  return nil unless attrs
75
75
  document = get_from_identity_map(attrs['_id'])
@@ -5,8 +5,43 @@ module MongoMapper
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  module ClassMethods
8
- extend Forwardable
9
- def_delegators :collection, :ensure_index, :create_index, :drop_index, :drop_indexes
8
+ def ensure_index(spec, options = {})
9
+ #TODO: should we emulate the mongo 1.x behaviour of caching attempts to create indexes?
10
+ collection.indexes.create_one dealias_options(spec), options
11
+ end
12
+
13
+ def create_index(spec, options = {})
14
+ collection.indexes.create_one dealias_options(spec), options
15
+ end
16
+
17
+ def drop_index(name)
18
+ collection.indexes.drop_one name
19
+ end
20
+
21
+ def drop_indexes
22
+ collection.indexes.drop_all
23
+ end
24
+
25
+ private
26
+
27
+ def dealias_options(options)
28
+ case options
29
+ when Symbol, String
30
+ {abbr(options) => 1}
31
+ when Hash
32
+ dealias_keys(options)
33
+ when Array
34
+ if options.first.is_a?(Hash)
35
+ options.map {|o| dealias_options(o) }
36
+ elsif options.first.is_a?(Array) # [[:foo, 1], [:bar, 1]]
37
+ options.inject({}) {|acc, tuple| acc.merge(dealias_options(tuple))}
38
+ else
39
+ dealias_keys(Hash[*options])
40
+ end
41
+ else
42
+ options
43
+ end
44
+ end
10
45
  end
11
46
  end
12
47
  end
@@ -1,5 +1,6 @@
1
1
  # encoding: UTF-8
2
2
  require 'mongo_mapper/plugins/keys/key'
3
+ require 'mongo_mapper/plugins/keys/static'
3
4
 
4
5
  module MongoMapper
5
6
  module Plugins
@@ -35,11 +36,29 @@ module MongoMapper
35
36
  @unaliased_keys ||= Hash[*keys.select {|k, v| k == v.name }.flatten(1)]
36
37
  end
37
38
 
39
+ def dealias_keys(hash)
40
+ out = {}
41
+ hash.each do |k, v|
42
+ key = keys[k.to_s]
43
+ name = key && key.abbr || k
44
+ out[name] = k.to_s.match(/^\$/) && v.is_a?(Hash) ? dealias_keys(v) : v
45
+ end
46
+ out
47
+ end
48
+
49
+ def dealias_key(name)
50
+ key = keys[name.to_s]
51
+ key && key.abbr || k
52
+ end
53
+
54
+ alias_method :dealias, :dealias_keys
55
+ alias_method :unalias, :dealias_keys
56
+
38
57
  def key(*args)
39
58
  Key.new(*args).tap do |key|
40
59
  keys[key.name] = key
41
60
  keys[key.abbr] = key if key.abbr
42
- create_accessors_for(key) if key.valid_ruby_name?
61
+ create_accessors_for(key) if key.valid_ruby_name? && !key.reserved_name?
43
62
  create_key_in_descendants(*args)
44
63
  create_indexes_for(key)
45
64
  create_validations_for(key)
@@ -47,8 +66,26 @@ module MongoMapper
47
66
  end
48
67
  end
49
68
 
69
+ def remove_key(name)
70
+ if key = keys[name.to_s]
71
+ keys.delete key.name
72
+ keys.delete key.abbr
73
+ remove_method key.name if respond_to? "#{key.name}"
74
+ remove_method "#{key.name}=" if respond_to? "#{key.name}="
75
+ remove_method "#{key.name}?" if respond_to? "#{key.name}?"
76
+ remove_method "#{key.name}_before_type_cast" if respond_to? "#{key.name}_before_type_cast"
77
+ remove_key_in_descendants key.name
78
+ remove_validations_for key.name
79
+ @dynamic_keys = @defined_keys = @unaliased_keys = @object_id_keys = nil
80
+ end
81
+ end
82
+
50
83
  def persisted_name(name)
51
- keys[name.to_s].persisted_name
84
+ if key = keys[name.to_s]
85
+ key.persisted_name
86
+ else
87
+ name
88
+ end
52
89
  end
53
90
  alias_method :abbr, :persisted_name
54
91
 
@@ -86,120 +123,144 @@ module MongoMapper
86
123
  end.allocate.initialize_from_database(attrs, with_cast)
87
124
  end
88
125
 
89
- private
90
- def key_accessors_module_defined?
91
- # :nocov:
92
- if IS_RUBY_1_9
93
- const_defined?('MongoMapperKeys')
94
- else
95
- const_defined?('MongoMapperKeys', false)
96
- end
97
- # :nocov:
126
+ private
127
+
128
+ def key_accessors_module_defined?
129
+ # :nocov:
130
+ if IS_RUBY_1_9
131
+ const_defined?('MongoMapperKeys')
132
+ else
133
+ const_defined?('MongoMapperKeys', false)
98
134
  end
135
+ # :nocov:
136
+ end
99
137
 
100
- def accessors_module
101
- if key_accessors_module_defined?
102
- const_get 'MongoMapperKeys'
103
- else
104
- const_set 'MongoMapperKeys', Module.new
105
- end
138
+ def accessors_module
139
+ if key_accessors_module_defined?
140
+ const_get 'MongoMapperKeys'
141
+ else
142
+ const_set 'MongoMapperKeys', Module.new
106
143
  end
144
+ end
107
145
 
108
- def create_accessors_for(key)
109
- accessors = ""
110
- if key.read_accessor?
111
- accessors << <<-end_eval
112
- def #{key.name}
113
- read_key(:#{key.name})
114
- end
115
-
116
- def #{key.name}_before_type_cast
117
- read_key_before_type_cast(:#{key.name})
118
- end
119
- end_eval
120
- end
146
+ def create_accessors_for(key)
147
+ accessors = ""
148
+ if key.read_accessor?
149
+ accessors << <<-end_eval
150
+ def #{key.name}
151
+ read_key(:#{key.name})
152
+ end
121
153
 
122
- if key.write_accessor?
123
- accessors << <<-end_eval
124
- def #{key.name}=(value)
125
- write_key(:#{key.name}, value)
126
- end
127
- end_eval
128
- end
154
+ def #{key.name}_before_type_cast
155
+ read_key_before_type_cast(:#{key.name})
156
+ end
157
+ end_eval
158
+ end
129
159
 
130
- if key.predicate_accessor?
131
- accessors << <<-end_eval
132
- def #{key.name}?
133
- read_key(:#{key.name}).present?
134
- end
135
- end_eval
136
- end
160
+ if key.write_accessor?
161
+ accessors << <<-end_eval
162
+ def #{key.name}=(value)
163
+ write_key(:#{key.name}, value)
164
+ end
165
+ end_eval
166
+ end
137
167
 
138
- if block_given?
139
- accessors_module.module_eval do
140
- yield
168
+ if key.predicate_accessor?
169
+ accessors << <<-end_eval
170
+ def #{key.name}?
171
+ read_key(:#{key.name}).present?
141
172
  end
142
- end
173
+ end_eval
174
+ end
143
175
 
144
- accessors_module.module_eval accessors
145
- include accessors_module
176
+ if block_given?
177
+ accessors_module.module_eval do
178
+ yield
179
+ end
146
180
  end
147
181
 
148
- def create_key_in_descendants(*args)
149
- descendants.each { |descendant| descendant.key(*args) }
182
+ accessors_module.module_eval accessors
183
+ include accessors_module
184
+ end
185
+
186
+ def create_key_in_descendants(*args)
187
+ descendants.each { |descendant| descendant.key(*args) }
188
+ end
189
+
190
+ def remove_key_in_descendants(name)
191
+ descendants.each { |descendant| descendant.remove_key(name) }
192
+ end
193
+
194
+ def create_indexes_for(key)
195
+ if key.options[:index] && !key.embeddable?
196
+ warn "[DEPRECATION] :index option when defining key #{key.name.inspect} is deprecated. Put indexes in `db/indexes.rb`"
197
+ ensure_index key.name
150
198
  end
199
+ end
151
200
 
152
- def create_indexes_for(key)
153
- if key.options[:index] && !key.embeddable?
154
- warn "[DEPRECATION] :index option when defining key #{key.name.inspect} is deprecated. Put indexes in `db/indexes.rb`"
155
- ensure_index key.name
201
+ def create_validations_for(key)
202
+ attribute = key.name.to_sym
203
+
204
+ if key.options[:required]
205
+ if key.type == Boolean
206
+ validates_inclusion_of attribute, :in => [true, false]
207
+ else
208
+ validates_presence_of(attribute)
156
209
  end
157
210
  end
158
211
 
159
- def create_validations_for(key)
160
- attribute = key.name.to_sym
212
+ if key.options[:unique]
213
+ validates_uniqueness_of(attribute)
214
+ end
161
215
 
162
- if key.options[:required]
163
- if key.type == Boolean
164
- validates_inclusion_of attribute, :in => [true, false]
165
- else
166
- validates_presence_of(attribute)
167
- end
168
- end
216
+ if key.options[:numeric]
217
+ number_options = key.type == Integer ? {:only_integer => true} : {}
218
+ validates_numericality_of(attribute, number_options)
219
+ end
169
220
 
170
- if key.options[:unique]
171
- validates_uniqueness_of(attribute)
172
- end
221
+ if key.options[:format]
222
+ validates_format_of(attribute, :with => key.options[:format])
223
+ end
173
224
 
174
- if key.options[:numeric]
175
- number_options = key.type == Integer ? {:only_integer => true} : {}
176
- validates_numericality_of(attribute, number_options)
177
- end
225
+ if key.options[:in]
226
+ validates_inclusion_of(attribute, :in => key.options[:in])
227
+ end
178
228
 
179
- if key.options[:format]
180
- validates_format_of(attribute, :with => key.options[:format])
181
- end
229
+ if key.options[:not_in]
230
+ validates_exclusion_of(attribute, :in => key.options[:not_in])
231
+ end
182
232
 
183
- if key.options[:in]
184
- validates_inclusion_of(attribute, :in => key.options[:in])
233
+ if key.options[:length]
234
+ length_options = case key.options[:length]
235
+ when Integer
236
+ {:minimum => 0, :maximum => key.options[:length]}
237
+ when Range
238
+ {:within => key.options[:length]}
239
+ when Hash
240
+ key.options[:length]
185
241
  end
242
+ validates_length_of(attribute, length_options)
243
+ end
244
+ end
186
245
 
187
- if key.options[:not_in]
188
- validates_exclusion_of(attribute, :in => key.options[:not_in])
189
- end
246
+ def remove_validations_for(name)
247
+ name = name.to_sym
248
+ a_name = [name]
190
249
 
191
- if key.options[:length]
192
- length_options = case key.options[:length]
193
- when Integer
194
- {:minimum => 0, :maximum => key.options[:length]}
195
- when Range
196
- {:within => key.options[:length]}
197
- when Hash
198
- key.options[:length]
199
- end
200
- validates_length_of(attribute, length_options)
201
- end
250
+ _validators.reject!{ |key, _| key == name }
251
+ remove_validate_callbacks a_name
252
+ end
253
+
254
+ def remove_validate_callbacks(a_name)
255
+ chain = _validate_callbacks.dup.reject do |callback|
256
+ f = callback.raw_filter
257
+ f.respond_to?(:attributes) && f.attributes == a_name
258
+ end
259
+ reset_callbacks(:validate)
260
+ chain.each do |callback|
261
+ set_callback 'validate', callback.raw_filter
202
262
  end
263
+ end
203
264
  end
204
265
 
205
266
  def initialize(attrs={})
@@ -235,7 +296,7 @@ module MongoMapper
235
296
  end
236
297
 
237
298
  def to_mongo(include_abbreviatons = true)
238
- BSON::OrderedHash.new.tap do |attrs|
299
+ Hash.new.tap do |attrs|
239
300
  self.class.unaliased_keys.each do |name, key|
240
301
  value = self.read_key(key.name)
241
302
  if key.type == ObjectId || !value.nil?
@@ -245,7 +306,7 @@ module MongoMapper
245
306
 
246
307
  embedded_associations.each do |association|
247
308
  if documents = instance_variable_get(association.ivar)
248
- if association.instance_of?(Associations::OneAssociation)
309
+ if association.is_a?(Associations::OneAssociation)
249
310
  attrs[association.name] = documents.to_mongo
250
311
  else
251
312
  attrs[association.name] = documents.map(&:to_mongo)
@@ -312,8 +373,8 @@ module MongoMapper
312
373
  end
313
374
  end
314
375
 
315
- alias_method :[], :read_key
316
- alias_method :attribute, :read_key
376
+ def [](key_name); read_key(key_name); end
377
+ def attribute(key_name); read_key(key_name); end
317
378
 
318
379
  def []=(name, value)
319
380
  write_key(name, value)
@@ -331,7 +392,7 @@ module MongoMapper
331
392
  @embedded_keys ||= keys.values.select(&:embeddable?)
332
393
  end
333
394
 
334
- protected
395
+ protected
335
396
 
336
397
  def unalias_key(name)
337
398
  name = name.to_s
@@ -342,67 +403,66 @@ module MongoMapper
342
403
  end
343
404
  end
344
405
 
345
- private
406
+ private
346
407
 
347
- def init_ivars
348
- @__mm_keys = self.class.keys # Not dumpable
349
- @__mm_default_keys = @__mm_keys.values.select(&:default?) # Not dumpable
350
- @_dynamic_attributes = {} # Dumpable
351
- end
408
+ def init_ivars
409
+ @__mm_keys = self.class.keys # Not dumpable
410
+ @__mm_default_keys = @__mm_keys.values.select(&:default?) # Not dumpable
411
+ @_dynamic_attributes = {} # Dumpable
412
+ end
352
413
 
353
- def load_from_database(attrs, with_cast = false)
354
- return if attrs == nil || attrs.blank?
414
+ def load_from_database(attrs, with_cast = false)
415
+ return if attrs == nil || attrs.blank?
355
416
 
356
- attrs.each do |key, value|
357
- if !@__mm_keys.key?(key) && respond_to?(:"#{key}=")
358
- self.send(:"#{key}=", value)
359
- else
360
- internal_write_key key, value, with_cast
361
- end
417
+ attrs.each do |key, value|
418
+ if !@__mm_keys.key?(key) && respond_to?(:"#{key}=")
419
+ self.send(:"#{key}=", value)
420
+ else
421
+ internal_write_key key, value, with_cast
362
422
  end
363
423
  end
424
+ end
364
425
 
365
- def set_parent_document(key, value)
366
- if key.type and value.instance_of?(key.type) && key.embeddable? && value.respond_to?(:_parent_document)
367
- value._parent_document = self
368
- end
426
+ def set_parent_document(key, value)
427
+ if key.type and value.instance_of?(key.type) && key.embeddable? && value.respond_to?(:_parent_document)
428
+ value._parent_document = self
369
429
  end
430
+ end
370
431
 
371
- # This exists to be patched over by plugins, while letting us still get to the undecorated
372
- # version of the method.
373
- def write_key(name, value)
374
- init_ivars unless @__mm_keys
375
- internal_write_key(name.to_s, value)
376
- end
432
+ # This exists to be patched over by plugins, while letting us still get to the undecorated
433
+ # version of the method.
434
+ def write_key(name, value)
435
+ init_ivars unless @__mm_keys
436
+ internal_write_key(name.to_s, value)
437
+ end
377
438
 
378
- def internal_write_key(name, value, cast = true)
379
- key = @__mm_keys[name] || dynamic_key(name)
380
- as_mongo = cast ? key.set(value) : value
381
- as_typecast = key.get(as_mongo)
382
- if key.ivar
383
- if key.embeddable?
384
- set_parent_document(key, value)
385
- set_parent_document(key, as_typecast)
386
- end
387
- instance_variable_set key.ivar, as_typecast
388
- else
389
- @_dynamic_attributes[key.name.to_sym] = as_typecast
439
+ def internal_write_key(name, value, cast = true)
440
+ key = @__mm_keys[name] || dynamic_key(name)
441
+ as_mongo = cast ? key.set(value) : value
442
+ as_typecast = key.get(as_mongo)
443
+ if key.ivar
444
+ if key.embeddable?
445
+ set_parent_document(key, value)
446
+ set_parent_document(key, as_typecast)
390
447
  end
391
- @attributes = nil
448
+ instance_variable_set key.ivar, as_typecast
449
+ else
450
+ @_dynamic_attributes[key.name.to_sym] = as_typecast
392
451
  end
452
+ value
453
+ end
393
454
 
394
- def dynamic_key(name)
395
- self.class.key(name, :__dynamic => true)
396
- end
455
+ def dynamic_key(name)
456
+ self.class.key(name, :__dynamic => true)
457
+ end
397
458
 
398
- def initialize_default_values(except = {})
399
- @__mm_default_keys.each do |key|
400
- if !(except && except.key?(key.name))
401
- internal_write_key key.name, key.default_value, false
402
- end
459
+ def initialize_default_values(except = {})
460
+ @__mm_default_keys.each do |key|
461
+ if !(except && except.key?(key.name))
462
+ internal_write_key key.name, key.default_value, false
403
463
  end
404
464
  end
405
- #end private
465
+ end
406
466
  end
407
467
  end
408
468
  end