mongo_mapper_ign 0.7.7 → 0.7.8

Sign up to get free protection for your applications and to get access to all the features.
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