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,22 +1,22 @@
1
- # encoding: UTF-8
2
- module MongoMapper
3
- module Plugins
4
- module Timestamps
5
- module ClassMethods
6
- def timestamps!
7
- key :created_at, Time
8
- key :updated_at, Time
9
- class_eval { before_save :update_timestamps }
10
- end
11
- end
12
-
13
- module InstanceMethods
14
- def update_timestamps
15
- now = Time.now.utc
16
- self[:created_at] = now if new? && !created_at?
17
- self[:updated_at] = now
18
- end
19
- end
20
- end
21
- end
1
+ # encoding: UTF-8
2
+ module MongoMapper
3
+ module Plugins
4
+ module Timestamps
5
+ module ClassMethods
6
+ def timestamps!
7
+ key :created_at, Time
8
+ key :updated_at, Time
9
+ class_eval { before_save :update_timestamps }
10
+ end
11
+ end
12
+
13
+ module InstanceMethods
14
+ def update_timestamps
15
+ now = Time.now.utc
16
+ self[:created_at] = now if new? && !created_at?
17
+ self[:updated_at] = now
18
+ end
19
+ end
20
+ end
21
+ end
22
22
  end
@@ -1,15 +1,15 @@
1
- # encoding: UTF-8
2
- module MongoMapper
3
- module Plugins
4
- module Userstamps
5
- module ClassMethods
6
- def userstamps!
7
- key :creator_id, ObjectId
8
- key :updater_id, ObjectId
9
- belongs_to :creator, :class_name => 'User'
10
- belongs_to :updater, :class_name => 'User'
11
- end
12
- end
13
- end
14
- end
1
+ # encoding: UTF-8
2
+ module MongoMapper
3
+ module Plugins
4
+ module Userstamps
5
+ module ClassMethods
6
+ def userstamps!
7
+ key :creator_id, ObjectId
8
+ key :updater_id, ObjectId
9
+ belongs_to :creator, :class_name => 'User'
10
+ belongs_to :updater, :class_name => 'User'
11
+ end
12
+ end
13
+ end
14
+ end
15
15
  end
@@ -1,47 +1,47 @@
1
- # encoding: UTF-8
2
- module MongoMapper
3
- module Plugins
4
- module Validations
5
- def self.configure(model)
6
- model.class_eval { include Validatable }
7
- end
8
-
9
- module DocumentMacros
10
- def validates_uniqueness_of(*args)
11
- add_validations(args, MongoMapper::Plugins::Validations::ValidatesUniquenessOf)
12
- end
13
- end
14
-
15
- class ValidatesUniquenessOf < Validatable::ValidationBase
16
- option :scope, :case_sensitive
17
- default :case_sensitive => true
18
-
19
- def valid?(instance)
20
- value = instance[attribute]
21
- return true if allow_blank && value.blank?
22
- return true if allow_nil && value.nil?
23
- base_conditions = case_sensitive ? {self.attribute => value} : {}
24
- doc = instance.class.first(base_conditions.merge(scope_conditions(instance)).merge(where_conditions(instance)))
25
- doc.nil? || instance._id == doc._id
26
- end
27
-
28
- def message(instance)
29
- super || "has already been taken"
30
- end
31
-
32
- def scope_conditions(instance)
33
- return {} unless scope
34
- Array(scope).inject({}) do |conditions, key|
35
- conditions.merge(key => instance[key])
36
- end
37
- end
38
-
39
- def where_conditions(instance)
40
- conditions = {}
41
- conditions[attribute] = /^#{Regexp.escape(instance[attribute].to_s)}$/i unless case_sensitive
42
- conditions
43
- end
44
- end
45
- end
46
- end
1
+ # encoding: UTF-8
2
+ module MongoMapper
3
+ module Plugins
4
+ module Validations
5
+ def self.configure(model)
6
+ model.class_eval { include Validatable }
7
+ end
8
+
9
+ module DocumentMacros
10
+ def validates_uniqueness_of(*args)
11
+ add_validations(args, MongoMapper::Plugins::Validations::ValidatesUniquenessOf)
12
+ end
13
+ end
14
+
15
+ class ValidatesUniquenessOf < Validatable::ValidationBase
16
+ option :scope, :case_sensitive
17
+ default :case_sensitive => true
18
+
19
+ def valid?(instance)
20
+ value = instance[attribute]
21
+ return true if allow_blank && value.blank?
22
+ return true if allow_nil && value.nil?
23
+ base_conditions = case_sensitive ? {self.attribute => value} : {}
24
+ doc = instance.class.first(base_conditions.merge(scope_conditions(instance)).merge(where_conditions(instance)))
25
+ doc.nil? || instance._id == doc._id
26
+ end
27
+
28
+ def message(instance)
29
+ super || "has already been taken"
30
+ end
31
+
32
+ def scope_conditions(instance)
33
+ return {} unless scope
34
+ Array(scope).inject({}) do |conditions, key|
35
+ conditions.merge(key => instance[key])
36
+ end
37
+ end
38
+
39
+ def where_conditions(instance)
40
+ conditions = {}
41
+ conditions[attribute] = /^#{Regexp.escape(instance[attribute].to_s)}$/i unless case_sensitive
42
+ conditions
43
+ end
44
+ end
45
+ end
46
+ end
47
47
  end
@@ -1,28 +1,28 @@
1
- # encoding: UTF-8
2
- module MongoMapper
3
- class Query
4
- def initialize(model, options={})
5
- raise ArgumentError, "Options must be a hash" unless options.is_a?(Hash)
6
- @model, @options, @conditions = model, {}, {}
7
- query.update(options)
8
- add_sci_condition
9
- end
10
-
11
- private
12
- def method_missing(method, *args, &block)
13
- query.send(method, *args, &block)
14
- end
15
-
16
- def query
17
- if @model.enslave?
18
- @query ||= Plucky::Query.new(@model.slave_collection).object_ids(@model.object_id_keys)
19
- else
20
- @query ||= Plucky::Query.new(@model.collection).object_ids(@model.object_id_keys)
21
- end
22
- end
23
-
24
- def add_sci_condition
25
- query[:_type] = @model.to_s if @model.single_collection_inherited?
26
- end
27
- end
28
- end
1
+ # encoding: UTF-8
2
+ module MongoMapper
3
+ class Query
4
+ def initialize(model, options={})
5
+ raise ArgumentError, "Options must be a hash" unless options.is_a?(Hash)
6
+ @model, @options, @conditions = model, {}, {}
7
+ query.update(options)
8
+ add_sci_condition
9
+ end
10
+
11
+ private
12
+ def method_missing(method, *args, &block)
13
+ query.send(method, *args, &block)
14
+ end
15
+
16
+ def query
17
+ if @model.enslave?
18
+ @query ||= Plucky::Query.new(@model.slave_collection).object_ids(@model.object_id_keys)
19
+ else
20
+ @query ||= Plucky::Query.new(@model.collection).object_ids(@model.object_id_keys)
21
+ end
22
+ end
23
+
24
+ def add_sci_condition
25
+ query[:_type] = @model.to_s if @model.single_collection_inherited?
26
+ end
27
+ end
28
+ end
@@ -1,197 +1,197 @@
1
- # encoding: UTF-8
2
- class Array
3
- def self.to_mongo(value)
4
- value = value.respond_to?(:lines) ? value.lines : value
5
- value.to_a
6
- end
7
-
8
- def self.from_mongo(value)
9
- value || []
10
- end
11
- end
12
-
13
- class Binary
14
- def self.to_mongo(value)
15
- if value.is_a?(BSON::Binary)
16
- value
17
- else
18
- value.nil? ? nil : BSON::Binary.new(value)
19
- end
20
- end
21
-
22
- def self.from_mongo(value)
23
- value
24
- end
25
- end
26
-
27
- class Boolean
28
- BOOLEAN_MAPPING = {
29
- true => true, 'true' => true, 'TRUE' => true, 'True' => true, 't' => true, 'T' => true, '1' => true, 1 => true, 1.0 => true,
30
- false => false, 'false' => false, 'FALSE' => false, 'False' => false, 'f' => false, 'F' => false, '0' => false, 0 => false, 0.0 => false, nil => nil
31
- }
32
-
33
- def self.to_mongo(value)
34
- if value.is_a?(Boolean)
35
- value
36
- else
37
- BOOLEAN_MAPPING[value]
38
- end
39
- end
40
-
41
- def self.from_mongo(value)
42
- !!value
43
- end
44
- end
45
-
46
- class Date
47
- def self.to_mongo(value)
48
- if value.nil? || value == ''
49
- nil
50
- else
51
- date = value.is_a?(Date) || value.is_a?(Time) ? value : Date.parse(value.to_s)
52
- Time.utc(date.year, date.month, date.day)
53
- end
54
- rescue
55
- nil
56
- end
57
-
58
- def self.from_mongo(value)
59
- value.to_date if value.present?
60
- end
61
- end
62
-
63
- class Float
64
- def self.to_mongo(value)
65
- value.nil? ? nil : value.to_f
66
- end
67
- end
68
-
69
- class Hash
70
- def self.from_mongo(value)
71
- HashWithIndifferentAccess.new(value || {})
72
- end
73
-
74
- def to_mongo
75
- self
76
- end
77
- end
78
-
79
- class Integer
80
- def self.to_mongo(value)
81
- value_to_i = value.to_i
82
- if value_to_i == 0 && value != value_to_i
83
- value.to_s =~ /^(0x|0b)?0+/ ? 0 : nil
84
- else
85
- value_to_i
86
- end
87
- end
88
- end
89
-
90
- class NilClass
91
- def to_mongo(value)
92
- value
93
- end
94
-
95
- def from_mongo(value)
96
- value
97
- end
98
- end
99
-
100
- class Object
101
- # The hidden singleton lurks behind everyone
102
- def metaclass
103
- class << self; self end
104
- end
105
-
106
- def meta_eval(&blk)
107
- metaclass.instance_eval(&blk)
108
- end
109
-
110
- # Adds methods to a metaclass
111
- def meta_def(name, &blk)
112
- meta_eval { define_method(name, &blk) }
113
- end
114
-
115
- # Defines an instance method within a class
116
- def class_def(name, &blk)
117
- class_eval { define_method(name, &blk) }
118
- end
119
-
120
- def self.to_mongo(value)
121
- value
122
- end
123
-
124
- def self.from_mongo(value)
125
- value
126
- end
127
- end
128
-
129
- class ObjectId
130
- def self.to_mongo(value)
131
- Plucky.to_object_id(value)
132
- end
133
-
134
- def self.from_mongo(value)
135
- value
136
- end
137
- end
138
-
139
- class Set
140
- def self.to_mongo(value)
141
- value.to_a
142
- end
143
-
144
- def self.from_mongo(value)
145
- Set.new(value || [])
146
- end
147
- end
148
-
149
- class String
150
- def self.to_mongo(value)
151
- value.nil? ? nil : value.to_s
152
- end
153
-
154
- def self.from_mongo(value)
155
- value.nil? ? nil : value.to_s
156
- end
157
- end
158
-
159
- class Time
160
- def self.to_mongo(value)
161
- if value.nil? || value == ''
162
- nil
163
- else
164
- time_class = Time.try(:zone).present? ? Time.zone : Time
165
- time = value.is_a?(Time) ? value : time_class.parse(value.to_s)
166
- # strip milliseconds as Ruby does micro and bson does milli and rounding rounded wrong
167
- at(time.to_i).utc if time
168
- end
169
- end
170
-
171
- def self.from_mongo(value)
172
- if Time.try(:zone).present? && value.present?
173
- value.in_time_zone(Time.zone)
174
- else
175
- value
176
- end
177
- end
178
- end
179
-
180
- class BSON::ObjectID
181
- alias_method :original_to_json, :to_json
182
-
183
- def as_json(options=nil)
184
- to_s
185
- end
186
-
187
- def to_json(options = nil)
188
- as_json.to_json
189
- end
190
- end
191
-
192
- module MongoMapper
193
- module Support
194
- autoload :DescendantAppends, 'mongo_mapper/support/descendant_appends'
195
- autoload :Find, 'mongo_mapper/support/find'
196
- end
197
- end
1
+ # encoding: UTF-8
2
+ class Array
3
+ def self.to_mongo(value)
4
+ value = value.respond_to?(:lines) ? value.lines : value
5
+ value.to_a
6
+ end
7
+
8
+ def self.from_mongo(value)
9
+ value || []
10
+ end
11
+ end
12
+
13
+ class Binary
14
+ def self.to_mongo(value)
15
+ if value.is_a?(BSON::Binary)
16
+ value
17
+ else
18
+ value.nil? ? nil : BSON::Binary.new(value)
19
+ end
20
+ end
21
+
22
+ def self.from_mongo(value)
23
+ value
24
+ end
25
+ end
26
+
27
+ class Boolean
28
+ BOOLEAN_MAPPING = {
29
+ true => true, 'true' => true, 'TRUE' => true, 'True' => true, 't' => true, 'T' => true, '1' => true, 1 => true, 1.0 => true,
30
+ false => false, 'false' => false, 'FALSE' => false, 'False' => false, 'f' => false, 'F' => false, '0' => false, 0 => false, 0.0 => false, nil => nil
31
+ }
32
+
33
+ def self.to_mongo(value)
34
+ if value.is_a?(Boolean)
35
+ value
36
+ else
37
+ BOOLEAN_MAPPING[value]
38
+ end
39
+ end
40
+
41
+ def self.from_mongo(value)
42
+ !!value
43
+ end
44
+ end
45
+
46
+ class Date
47
+ def self.to_mongo(value)
48
+ if value.nil? || value == ''
49
+ nil
50
+ else
51
+ date = value.is_a?(Date) || value.is_a?(Time) ? value : Date.parse(value.to_s)
52
+ Time.utc(date.year, date.month, date.day)
53
+ end
54
+ rescue
55
+ nil
56
+ end
57
+
58
+ def self.from_mongo(value)
59
+ value.to_date if value.present?
60
+ end
61
+ end
62
+
63
+ class Float
64
+ def self.to_mongo(value)
65
+ value.nil? ? nil : value.to_f
66
+ end
67
+ end
68
+
69
+ class Hash
70
+ def self.from_mongo(value)
71
+ HashWithIndifferentAccess.new(value || {})
72
+ end
73
+
74
+ def to_mongo
75
+ self
76
+ end
77
+ end
78
+
79
+ class Integer
80
+ def self.to_mongo(value)
81
+ value_to_i = value.to_i
82
+ if value_to_i == 0 && value != value_to_i
83
+ value.to_s =~ /^(0x|0b)?0+/ ? 0 : nil
84
+ else
85
+ value_to_i
86
+ end
87
+ end
88
+ end
89
+
90
+ class NilClass
91
+ def to_mongo(value)
92
+ value
93
+ end
94
+
95
+ def from_mongo(value)
96
+ value
97
+ end
98
+ end
99
+
100
+ class Object
101
+ # The hidden singleton lurks behind everyone
102
+ def metaclass
103
+ class << self; self end
104
+ end
105
+
106
+ def meta_eval(&blk)
107
+ metaclass.instance_eval(&blk)
108
+ end
109
+
110
+ # Adds methods to a metaclass
111
+ def meta_def(name, &blk)
112
+ meta_eval { define_method(name, &blk) }
113
+ end
114
+
115
+ # Defines an instance method within a class
116
+ def class_def(name, &blk)
117
+ class_eval { define_method(name, &blk) }
118
+ end
119
+
120
+ def self.to_mongo(value)
121
+ value
122
+ end
123
+
124
+ def self.from_mongo(value)
125
+ value
126
+ end
127
+ end
128
+
129
+ class ObjectId
130
+ def self.to_mongo(value)
131
+ Plucky.to_object_id(value)
132
+ end
133
+
134
+ def self.from_mongo(value)
135
+ value
136
+ end
137
+ end
138
+
139
+ class Set
140
+ def self.to_mongo(value)
141
+ value.to_a
142
+ end
143
+
144
+ def self.from_mongo(value)
145
+ Set.new(value || [])
146
+ end
147
+ end
148
+
149
+ class String
150
+ def self.to_mongo(value)
151
+ value.nil? ? nil : value.to_s
152
+ end
153
+
154
+ def self.from_mongo(value)
155
+ value.nil? ? nil : value.to_s
156
+ end
157
+ end
158
+
159
+ class Time
160
+ def self.to_mongo(value)
161
+ if value.nil? || value == ''
162
+ nil
163
+ else
164
+ time_class = Time.try(:zone).present? ? Time.zone : Time
165
+ time = value.is_a?(Time) ? value : time_class.parse(value.to_s)
166
+ # strip milliseconds as Ruby does micro and bson does milli and rounding rounded wrong
167
+ at(time.to_i).utc if time
168
+ end
169
+ end
170
+
171
+ def self.from_mongo(value)
172
+ if Time.try(:zone).present? && value.present?
173
+ value.in_time_zone(Time.zone)
174
+ else
175
+ value
176
+ end
177
+ end
178
+ end
179
+
180
+ class BSON::ObjectID
181
+ alias_method :original_to_json, :to_json
182
+
183
+ def as_json(options=nil)
184
+ to_s
185
+ end
186
+
187
+ def to_json(options = nil)
188
+ as_json.to_json
189
+ end
190
+ end
191
+
192
+ module MongoMapper
193
+ module Support
194
+ autoload :DescendantAppends, 'mongo_mapper/support/descendant_appends'
195
+ autoload :Find, 'mongo_mapper/support/find'
196
+ end
197
+ end