mongo_mapper_ign 0.7.7 → 0.7.8

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 (50) hide show
  1. data/LICENSE +20 -20
  2. data/README.rdoc +34 -34
  3. data/bin/mmconsole +60 -60
  4. data/lib/mongo_mapper.rb +123 -123
  5. data/lib/mongo_mapper/document.rb +292 -292
  6. data/lib/mongo_mapper/embedded_document.rb +71 -71
  7. data/lib/mongo_mapper/plugins.rb +36 -36
  8. data/lib/mongo_mapper/plugins/associations.rb +115 -115
  9. data/lib/mongo_mapper/plugins/associations/base.rb +124 -124
  10. data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +31 -31
  11. data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +26 -26
  12. data/lib/mongo_mapper/plugins/associations/collection.rb +21 -21
  13. data/lib/mongo_mapper/plugins/associations/embedded_collection.rb +39 -39
  14. data/lib/mongo_mapper/plugins/associations/in_array_proxy.rb +160 -144
  15. data/lib/mongo_mapper/plugins/associations/many_documents_as_proxy.rb +29 -29
  16. data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +130 -130
  17. data/lib/mongo_mapper/plugins/associations/many_embedded_polymorphic_proxy.rb +32 -32
  18. data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +24 -24
  19. data/lib/mongo_mapper/plugins/associations/many_polymorphic_proxy.rb +14 -14
  20. data/lib/mongo_mapper/plugins/associations/one_embedded_proxy.rb +42 -42
  21. data/lib/mongo_mapper/plugins/associations/one_proxy.rb +70 -70
  22. data/lib/mongo_mapper/plugins/associations/proxy.rb +125 -125
  23. data/lib/mongo_mapper/plugins/callbacks.rb +241 -241
  24. data/lib/mongo_mapper/plugins/clone.rb +13 -13
  25. data/lib/mongo_mapper/plugins/descendants.rb +16 -16
  26. data/lib/mongo_mapper/plugins/dirty.rb +119 -119
  27. data/lib/mongo_mapper/plugins/equality.rb +23 -23
  28. data/lib/mongo_mapper/plugins/identity_map.rb +123 -123
  29. data/lib/mongo_mapper/plugins/inspect.rb +14 -14
  30. data/lib/mongo_mapper/plugins/keys.rb +322 -322
  31. data/lib/mongo_mapper/plugins/keys/key.rb +53 -53
  32. data/lib/mongo_mapper/plugins/logger.rb +17 -17
  33. data/lib/mongo_mapper/plugins/modifiers.rb +111 -111
  34. data/lib/mongo_mapper/plugins/pagination.rb +24 -24
  35. data/lib/mongo_mapper/plugins/pagination/proxy.rb +72 -72
  36. data/lib/mongo_mapper/plugins/persistence.rb +96 -96
  37. data/lib/mongo_mapper/plugins/protected.rb +46 -46
  38. data/lib/mongo_mapper/plugins/rails.rb +57 -57
  39. data/lib/mongo_mapper/plugins/serialization.rb +92 -92
  40. data/lib/mongo_mapper/plugins/serialization/array.rb +56 -56
  41. data/lib/mongo_mapper/plugins/serialization/xml_serializer.rb +239 -239
  42. data/lib/mongo_mapper/plugins/timestamps.rb +21 -21
  43. data/lib/mongo_mapper/plugins/userstamps.rb +14 -14
  44. data/lib/mongo_mapper/plugins/validations.rb +46 -46
  45. data/lib/mongo_mapper/query.rb +28 -28
  46. data/lib/mongo_mapper/support.rb +197 -197
  47. data/lib/mongo_mapper/support/descendant_appends.rb +46 -46
  48. data/lib/mongo_mapper/support/find.rb +77 -77
  49. data/lib/mongo_mapper/version.rb +3 -3
  50. metadata +4 -25
@@ -1,15 +1,15 @@
1
- # encoding: UTF-8
2
- module MongoMapper
3
- module Plugins
4
- module Inspect
5
- module InstanceMethods
6
- def inspect
7
- attributes_as_nice_string = key_names.collect do |name|
8
- "#{name}: #{self[name].inspect}"
9
- end.join(", ")
10
- "#<#{self.class} #{attributes_as_nice_string}>"
11
- end
12
- end
13
- end
14
- end
1
+ # encoding: UTF-8
2
+ module MongoMapper
3
+ module Plugins
4
+ module Inspect
5
+ module InstanceMethods
6
+ def inspect
7
+ attributes_as_nice_string = key_names.collect do |name|
8
+ "#{name}: #{self[name].inspect}"
9
+ end.join(", ")
10
+ "#<#{self.class} #{attributes_as_nice_string}>"
11
+ end
12
+ end
13
+ end
14
+ end
15
15
  end
@@ -1,322 +1,322 @@
1
- # encoding: UTF-8
2
- module MongoMapper
3
- module Plugins
4
- module Keys
5
- autoload :Key, 'mongo_mapper/plugins/keys/key'
6
-
7
- def self.configure(model)
8
- model.key :_id, ObjectId
9
- end
10
-
11
- module ClassMethods
12
- def inherited(descendant)
13
- key :_type, String unless keys.keys.include?(:_type)
14
- descendant.instance_variable_set(:@keys, keys.dup)
15
- super
16
- end
17
-
18
- def keys
19
- @keys ||= HashWithIndifferentAccess.new
20
- end
21
-
22
- def key(*args)
23
- Key.new(*args).tap do |key|
24
- keys[key.name] = key
25
- create_accessors_for(key)
26
- create_key_in_descendants(*args)
27
- create_indexes_for(key)
28
- create_validations_for(key)
29
- end
30
- end
31
-
32
- def key?(key)
33
- keys.keys.include?(key.to_s)
34
- end
35
-
36
- def using_object_id?
37
- object_id_key?(:_id)
38
- end
39
-
40
- def object_id_keys
41
- keys.keys.select { |key| keys[key].type == ObjectId }.map(&:to_sym)
42
- end
43
-
44
- def object_id_key?(name)
45
- object_id_keys.include?(name.to_sym)
46
- end
47
-
48
- def to_mongo(instance)
49
- return nil if instance.nil?
50
- instance.to_mongo
51
- end
52
-
53
- def from_mongo(value)
54
- return nil if value.nil?
55
- value.is_a?(self) ? value : load(value)
56
- end
57
-
58
- # load is overridden in identity map to ensure same objects are loaded
59
- def load(attrs)
60
- return nil if attrs.nil?
61
- begin
62
- klass = attrs['_type'].present? ? attrs['_type'].constantize : self
63
- klass.new(attrs, true)
64
- rescue NameError
65
- new(attrs, true)
66
- end
67
- end
68
-
69
- private
70
- def key_accessors_module_defined?
71
- if method(:const_defined?).arity == 1 # Ruby 1.9 compat check
72
- const_defined?('MongoMapperKeys')
73
- else
74
- const_defined?('MongoMapperKeys', false)
75
- end
76
- end
77
-
78
- def accessors_module
79
- if key_accessors_module_defined?
80
- const_get 'MongoMapperKeys'
81
- else
82
- const_set 'MongoMapperKeys', Module.new
83
- end
84
- end
85
-
86
- def create_accessors_for(key)
87
- accessors_module.module_eval <<-end_eval
88
- def #{key.name}
89
- read_key(:#{key.name})
90
- end
91
-
92
- def #{key.name}_before_typecast
93
- read_key_before_typecast(:#{key.name})
94
- end
95
-
96
- def #{key.name}=(value)
97
- write_key(:#{key.name}, value)
98
- end
99
-
100
- def #{key.name}?
101
- read_key(:#{key.name}).present?
102
- end
103
- end_eval
104
-
105
- include accessors_module
106
- end
107
-
108
- def create_key_in_descendants(*args)
109
- descendants.each { |descendant| descendant.key(*args) }
110
- end
111
-
112
- def create_indexes_for(key)
113
- ensure_index key.name if key.options[:index] && !key.embeddable?
114
- end
115
-
116
- def create_validations_for(key)
117
- attribute = key.name.to_sym
118
-
119
- if key.options[:required]
120
- validates_presence_of(attribute)
121
- end
122
-
123
- if key.options[:unique]
124
- validates_uniqueness_of(attribute)
125
- end
126
-
127
- if key.options[:numeric]
128
- number_options = key.type == Integer ? {:only_integer => true} : {}
129
- validates_numericality_of(attribute, number_options)
130
- end
131
-
132
- if key.options[:format]
133
- validates_format_of(attribute, :with => key.options[:format])
134
- end
135
-
136
- if key.options[:in]
137
- validates_inclusion_of(attribute, :within => key.options[:in])
138
- end
139
-
140
- if key.options[:not_in]
141
- validates_exclusion_of(attribute, :within => key.options[:not_in])
142
- end
143
-
144
- if key.options[:length]
145
- length_options = case key.options[:length]
146
- when Integer
147
- {:minimum => 0, :maximum => key.options[:length]}
148
- when Range
149
- {:within => key.options[:length]}
150
- when Hash
151
- key.options[:length]
152
- end
153
- validates_length_of(attribute, length_options)
154
- end
155
- end
156
- end
157
-
158
- module InstanceMethods
159
- def initialize(attrs={}, from_database=false)
160
- default_id_value(attrs)
161
-
162
- if from_database
163
- @new = false
164
- load_from_database(attrs)
165
- else
166
- @new = true
167
- assign(attrs)
168
- end
169
-
170
- assign_type
171
- end
172
-
173
- def persisted?
174
- !new? && !destroyed?
175
- end
176
-
177
- def attributes=(attrs)
178
- return if attrs.blank?
179
-
180
- attrs.each_pair do |key, value|
181
- if respond_to?(:"#{key}=")
182
- self.send(:"#{key}=", value)
183
- else
184
- self[key] = value
185
- end
186
- end
187
- end
188
-
189
- def attributes
190
- attrs = HashWithIndifferentAccess.new
191
-
192
- keys.each_pair do |name, key|
193
- value = key.set(self[key.name])
194
- attrs[name] = value
195
- end
196
-
197
- embedded_associations.each do |association|
198
- if documents = instance_variable_get(association.ivar)
199
- if association.one?
200
- attrs[association.name] = documents.to_mongo
201
- else
202
- attrs[association.name] = documents.map { |document| document.to_mongo }
203
- end
204
- end
205
- end
206
-
207
- attrs
208
- end
209
- alias :to_mongo :attributes
210
-
211
- def assign(attrs={})
212
- self.attributes = attrs
213
- end
214
-
215
- def update_attributes(attrs={})
216
- assign(attrs)
217
- save
218
- end
219
-
220
- def update_attributes!(attrs={})
221
- assign(attrs)
222
- save!
223
- end
224
-
225
- def id
226
- _id
227
- end
228
-
229
- def id=(value)
230
- if self.class.using_object_id?
231
- value = ObjectId.to_mongo(value)
232
- end
233
-
234
- self[:_id] = value
235
- end
236
-
237
- def [](name)
238
- read_key(name)
239
- end
240
-
241
- def []=(name, value)
242
- ensure_key_exists(name)
243
- write_key(name, value)
244
- end
245
-
246
- def keys
247
- self.class.keys
248
- end
249
-
250
- def key_names
251
- keys.keys
252
- end
253
-
254
- def non_embedded_keys
255
- keys.values.select { |key| !key.embeddable? }
256
- end
257
-
258
- def embedded_keys
259
- keys.values.select { |key| key.embeddable? }
260
- end
261
-
262
- private
263
- def load_from_database(attrs)
264
- return if attrs.blank?
265
- attrs.each do |key, value|
266
- if respond_to?(:"#{key}=") && !self.class.key?(key)
267
- self.send(:"#{key}=", value)
268
- else
269
- self[key] = value
270
- end
271
- end
272
- end
273
-
274
- def default_id_value(attrs)
275
- unless attrs.nil?
276
- provided_keys = attrs.keys.map { |k| k.to_s }
277
- unless provided_keys.include?('_id') || provided_keys.include?('id')
278
- write_key :_id, BSON::ObjectID.new
279
- end
280
- end
281
- end
282
-
283
- def assign_type
284
- self._type = self.class.name if respond_to?(:_type=)
285
- end
286
-
287
- def ensure_key_exists(name)
288
- self.class.key(name) unless respond_to?("#{name}=")
289
- end
290
-
291
- def set_parent_document(key, value)
292
- if key.embeddable? && value.is_a?(key.type)
293
- value._parent_document = self
294
- end
295
- end
296
-
297
- def read_key(key_name)
298
- if key = keys[key_name]
299
- value = key.get(instance_variable_get(:"@#{key_name}"))
300
- set_parent_document(key, value)
301
- instance_variable_set(:"@#{key_name}", value)
302
- else
303
- raise KeyNotFound, "Could not find key: #{key_name.inspect}"
304
- end
305
- end
306
-
307
- def read_key_before_typecast(name)
308
- instance_variable_get(:"@#{name}_before_typecast")
309
- end
310
-
311
- def write_key(name, value)
312
- key = keys[name.to_s]
313
- set_parent_document(key, value)
314
- instance_variable_set :"@#{name}_before_typecast", value
315
- instance_variable_set :"@#{name}", key.set(value)
316
- end
317
- end
318
-
319
-
320
- end
321
- end
322
- end
1
+ # encoding: UTF-8
2
+ module MongoMapper
3
+ module Plugins
4
+ module Keys
5
+ autoload :Key, 'mongo_mapper/plugins/keys/key'
6
+
7
+ def self.configure(model)
8
+ model.key :_id, ObjectId
9
+ end
10
+
11
+ module ClassMethods
12
+ def inherited(descendant)
13
+ key :_type, String unless keys.keys.include?(:_type)
14
+ descendant.instance_variable_set(:@keys, keys.dup)
15
+ super
16
+ end
17
+
18
+ def keys
19
+ @keys ||= HashWithIndifferentAccess.new
20
+ end
21
+
22
+ def key(*args)
23
+ Key.new(*args).tap do |key|
24
+ keys[key.name] = key
25
+ create_accessors_for(key)
26
+ create_key_in_descendants(*args)
27
+ create_indexes_for(key)
28
+ create_validations_for(key)
29
+ end
30
+ end
31
+
32
+ def key?(key)
33
+ keys.keys.include?(key.to_s)
34
+ end
35
+
36
+ def using_object_id?
37
+ object_id_key?(:_id)
38
+ end
39
+
40
+ def object_id_keys
41
+ keys.keys.select { |key| keys[key].type == ObjectId }.map(&:to_sym)
42
+ end
43
+
44
+ def object_id_key?(name)
45
+ object_id_keys.include?(name.to_sym)
46
+ end
47
+
48
+ def to_mongo(instance)
49
+ return nil if instance.nil?
50
+ instance.to_mongo
51
+ end
52
+
53
+ def from_mongo(value)
54
+ return nil if value.nil?
55
+ value.is_a?(self) ? value : load(value)
56
+ end
57
+
58
+ # load is overridden in identity map to ensure same objects are loaded
59
+ def load(attrs)
60
+ return nil if attrs.nil?
61
+ begin
62
+ klass = attrs['_type'].present? ? attrs['_type'].constantize : self
63
+ klass.new(attrs, true)
64
+ rescue NameError
65
+ new(attrs, true)
66
+ end
67
+ end
68
+
69
+ private
70
+ def key_accessors_module_defined?
71
+ if method(:const_defined?).arity == 1 # Ruby 1.9 compat check
72
+ const_defined?('MongoMapperKeys')
73
+ else
74
+ const_defined?('MongoMapperKeys', false)
75
+ end
76
+ end
77
+
78
+ def accessors_module
79
+ if key_accessors_module_defined?
80
+ const_get 'MongoMapperKeys'
81
+ else
82
+ const_set 'MongoMapperKeys', Module.new
83
+ end
84
+ end
85
+
86
+ def create_accessors_for(key)
87
+ accessors_module.module_eval <<-end_eval
88
+ def #{key.name}
89
+ read_key(:#{key.name})
90
+ end
91
+
92
+ def #{key.name}_before_typecast
93
+ read_key_before_typecast(:#{key.name})
94
+ end
95
+
96
+ def #{key.name}=(value)
97
+ write_key(:#{key.name}, value)
98
+ end
99
+
100
+ def #{key.name}?
101
+ read_key(:#{key.name}).present?
102
+ end
103
+ end_eval
104
+
105
+ include accessors_module
106
+ end
107
+
108
+ def create_key_in_descendants(*args)
109
+ descendants.each { |descendant| descendant.key(*args) }
110
+ end
111
+
112
+ def create_indexes_for(key)
113
+ ensure_index key.name if key.options[:index] && !key.embeddable?
114
+ end
115
+
116
+ def create_validations_for(key)
117
+ attribute = key.name.to_sym
118
+
119
+ if key.options[:required]
120
+ validates_presence_of(attribute)
121
+ end
122
+
123
+ if key.options[:unique]
124
+ validates_uniqueness_of(attribute)
125
+ end
126
+
127
+ if key.options[:numeric]
128
+ number_options = key.type == Integer ? {:only_integer => true} : {}
129
+ validates_numericality_of(attribute, number_options)
130
+ end
131
+
132
+ if key.options[:format]
133
+ validates_format_of(attribute, :with => key.options[:format])
134
+ end
135
+
136
+ if key.options[:in]
137
+ validates_inclusion_of(attribute, :within => key.options[:in])
138
+ end
139
+
140
+ if key.options[:not_in]
141
+ validates_exclusion_of(attribute, :within => key.options[:not_in])
142
+ end
143
+
144
+ if key.options[:length]
145
+ length_options = case key.options[:length]
146
+ when Integer
147
+ {:minimum => 0, :maximum => key.options[:length]}
148
+ when Range
149
+ {:within => key.options[:length]}
150
+ when Hash
151
+ key.options[:length]
152
+ end
153
+ validates_length_of(attribute, length_options)
154
+ end
155
+ end
156
+ end
157
+
158
+ module InstanceMethods
159
+ def initialize(attrs={}, from_database=false)
160
+ default_id_value(attrs)
161
+
162
+ if from_database
163
+ @new = false
164
+ load_from_database(attrs)
165
+ else
166
+ @new = true
167
+ assign(attrs)
168
+ end
169
+
170
+ assign_type
171
+ end
172
+
173
+ def persisted?
174
+ !new? && !destroyed?
175
+ end
176
+
177
+ def attributes=(attrs)
178
+ return if attrs.blank?
179
+
180
+ attrs.each_pair do |key, value|
181
+ if respond_to?(:"#{key}=")
182
+ self.send(:"#{key}=", value)
183
+ else
184
+ self[key] = value
185
+ end
186
+ end
187
+ end
188
+
189
+ def attributes
190
+ attrs = HashWithIndifferentAccess.new
191
+
192
+ keys.each_pair do |name, key|
193
+ value = key.set(self[key.name])
194
+ attrs[name] = value
195
+ end
196
+
197
+ embedded_associations.each do |association|
198
+ if documents = instance_variable_get(association.ivar)
199
+ if association.one?
200
+ attrs[association.name] = documents.to_mongo
201
+ else
202
+ attrs[association.name] = documents.map { |document| document.to_mongo }
203
+ end
204
+ end
205
+ end
206
+
207
+ attrs
208
+ end
209
+ alias :to_mongo :attributes
210
+
211
+ def assign(attrs={})
212
+ self.attributes = attrs
213
+ end
214
+
215
+ def update_attributes(attrs={})
216
+ assign(attrs)
217
+ save
218
+ end
219
+
220
+ def update_attributes!(attrs={})
221
+ assign(attrs)
222
+ save!
223
+ end
224
+
225
+ def id
226
+ _id
227
+ end
228
+
229
+ def id=(value)
230
+ if self.class.using_object_id?
231
+ value = ObjectId.to_mongo(value)
232
+ end
233
+
234
+ self[:_id] = value
235
+ end
236
+
237
+ def [](name)
238
+ read_key(name)
239
+ end
240
+
241
+ def []=(name, value)
242
+ ensure_key_exists(name)
243
+ write_key(name, value)
244
+ end
245
+
246
+ def keys
247
+ self.class.keys
248
+ end
249
+
250
+ def key_names
251
+ keys.keys
252
+ end
253
+
254
+ def non_embedded_keys
255
+ keys.values.select { |key| !key.embeddable? }
256
+ end
257
+
258
+ def embedded_keys
259
+ keys.values.select { |key| key.embeddable? }
260
+ end
261
+
262
+ private
263
+ def load_from_database(attrs)
264
+ return if attrs.blank?
265
+ attrs.each do |key, value|
266
+ if respond_to?(:"#{key}=") && !self.class.key?(key)
267
+ self.send(:"#{key}=", value)
268
+ else
269
+ self[key] = value
270
+ end
271
+ end
272
+ end
273
+
274
+ def default_id_value(attrs)
275
+ unless attrs.nil?
276
+ provided_keys = attrs.keys.map { |k| k.to_s }
277
+ unless provided_keys.include?('_id') || provided_keys.include?('id')
278
+ write_key :_id, BSON::ObjectID.new
279
+ end
280
+ end
281
+ end
282
+
283
+ def assign_type
284
+ self._type = self.class.name if respond_to?(:_type=)
285
+ end
286
+
287
+ def ensure_key_exists(name)
288
+ self.class.key(name) unless respond_to?("#{name}=")
289
+ end
290
+
291
+ def set_parent_document(key, value)
292
+ if key.embeddable? && value.is_a?(key.type)
293
+ value._parent_document = self
294
+ end
295
+ end
296
+
297
+ def read_key(key_name)
298
+ if key = keys[key_name]
299
+ value = key.get(instance_variable_get(:"@#{key_name}"))
300
+ set_parent_document(key, value)
301
+ instance_variable_set(:"@#{key_name}", value)
302
+ else
303
+ raise KeyNotFound, "Could not find key: #{key_name.inspect}"
304
+ end
305
+ end
306
+
307
+ def read_key_before_typecast(name)
308
+ instance_variable_get(:"@#{name}_before_typecast")
309
+ end
310
+
311
+ def write_key(name, value)
312
+ key = keys[name.to_s]
313
+ set_parent_document(key, value)
314
+ instance_variable_set :"@#{name}_before_typecast", value
315
+ instance_variable_set :"@#{name}", key.set(value)
316
+ end
317
+ end
318
+
319
+
320
+ end
321
+ end
322
+ end