mongoid 1.9.5 → 2.0.0.alpha

Sign up to get free protection for your applications and to get access to all the features.
Files changed (213) hide show
  1. data/.gitignore +6 -0
  2. data/.watchr +29 -0
  3. data/Rakefile +52 -0
  4. data/VERSION +1 -0
  5. data/caliper.yml +4 -0
  6. data/lib/mongoid.rb +20 -9
  7. data/lib/mongoid/associations.rb +100 -123
  8. data/lib/mongoid/associations/belongs_to_related.rb +3 -2
  9. data/lib/mongoid/associations/{embeds_many.rb → embed_many.rb} +29 -90
  10. data/lib/mongoid/associations/{embeds_one.rb → embed_one.rb} +7 -8
  11. data/lib/mongoid/associations/embedded_in.rb +4 -12
  12. data/lib/mongoid/associations/has_many_related.rb +4 -52
  13. data/lib/mongoid/associations/has_one_related.rb +4 -8
  14. data/lib/mongoid/associations/meta_data.rb +1 -2
  15. data/lib/mongoid/associations/options.rb +1 -6
  16. data/lib/mongoid/associations/proxy.rb +21 -14
  17. data/lib/mongoid/attributes.rb +13 -33
  18. data/lib/mongoid/callbacks.rb +11 -16
  19. data/lib/mongoid/collection.rb +3 -4
  20. data/lib/mongoid/collections/master.rb +2 -3
  21. data/lib/mongoid/collections/mimic.rb +46 -0
  22. data/lib/mongoid/collections/slaves.rb +2 -3
  23. data/lib/mongoid/commands.rb +161 -0
  24. data/lib/mongoid/commands/create.rb +19 -0
  25. data/lib/mongoid/commands/delete.rb +16 -0
  26. data/lib/mongoid/commands/delete_all.rb +23 -0
  27. data/lib/mongoid/commands/deletion.rb +18 -0
  28. data/lib/mongoid/commands/destroy.rb +17 -0
  29. data/lib/mongoid/commands/destroy_all.rb +23 -0
  30. data/lib/mongoid/commands/save.rb +29 -0
  31. data/lib/mongoid/components.rb +6 -4
  32. data/lib/mongoid/config.rb +15 -134
  33. data/lib/mongoid/contexts.rb +1 -1
  34. data/lib/mongoid/contexts/enumerable.rb +1 -1
  35. data/lib/mongoid/contexts/mongo.rb +1 -1
  36. data/lib/mongoid/contexts/paging.rb +2 -10
  37. data/lib/mongoid/criterion/inclusion.rb +0 -17
  38. data/lib/mongoid/criterion/optional.rb +1 -1
  39. data/lib/mongoid/cursor.rb +1 -0
  40. data/lib/mongoid/document.rb +45 -49
  41. data/lib/mongoid/errors.rb +1 -32
  42. data/lib/mongoid/extensions.rb +10 -12
  43. data/lib/mongoid/extensions/array/conversions.rb +6 -8
  44. data/lib/mongoid/extensions/big_decimal/conversions.rb +2 -2
  45. data/lib/mongoid/extensions/boolean/conversions.rb +2 -8
  46. data/lib/mongoid/extensions/date/conversions.rb +4 -13
  47. data/lib/mongoid/extensions/datetime/conversions.rb +6 -1
  48. data/lib/mongoid/extensions/float/conversions.rb +1 -5
  49. data/lib/mongoid/extensions/hash/assimilation.rb +3 -12
  50. data/lib/mongoid/extensions/hash/conversions.rb +4 -34
  51. data/lib/mongoid/extensions/integer/conversions.rb +1 -5
  52. data/lib/mongoid/extensions/nil/assimilation.rb +0 -4
  53. data/lib/mongoid/extensions/object/conversions.rb +2 -8
  54. data/lib/mongoid/extensions/objectid/conversions.rb +1 -1
  55. data/lib/mongoid/extensions/string/conversions.rb +1 -1
  56. data/lib/mongoid/extensions/symbol/inflections.rb +1 -1
  57. data/lib/mongoid/extensions/time/conversions.rb +18 -0
  58. data/lib/mongoid/factory.rb +1 -2
  59. data/lib/mongoid/field.rb +2 -9
  60. data/lib/mongoid/fields.rb +7 -11
  61. data/lib/mongoid/finders.rb +2 -2
  62. data/lib/mongoid/identity.rb +4 -4
  63. data/lib/mongoid/indexes.rb +7 -10
  64. data/lib/mongoid/memoization.rb +2 -8
  65. data/lib/mongoid/named_scope.rb +5 -0
  66. data/lib/mongoid/observable.rb +1 -1
  67. data/lib/mongoid/paths.rb +22 -30
  68. data/lib/mongoid/state.rb +21 -28
  69. data/lib/mongoid/timestamps.rb +1 -1
  70. data/lib/mongoid/validations.rb +51 -0
  71. data/lib/mongoid/validations/associated.rb +32 -0
  72. data/lib/mongoid/validations/locale/en.yml +4 -0
  73. data/lib/mongoid/validations/uniqueness.rb +22 -0
  74. data/lib/mongoid/versioning.rb +1 -2
  75. data/mongoid.gemspec +408 -0
  76. data/perf/benchmark.rb +77 -0
  77. data/spec/integration/mongoid/associations_spec.rb +340 -0
  78. data/spec/integration/mongoid/attributes_spec.rb +22 -0
  79. data/spec/integration/mongoid/commands_spec.rb +227 -0
  80. data/spec/integration/mongoid/contexts/enumerable_spec.rb +33 -0
  81. data/spec/integration/mongoid/criteria_spec.rb +272 -0
  82. data/spec/integration/mongoid/document_spec.rb +650 -0
  83. data/spec/integration/mongoid/extensions_spec.rb +22 -0
  84. data/spec/integration/mongoid/finders_spec.rb +119 -0
  85. data/spec/integration/mongoid/inheritance_spec.rb +137 -0
  86. data/spec/integration/mongoid/named_scope_spec.rb +46 -0
  87. data/spec/models/address.rb +39 -0
  88. data/spec/models/animal.rb +6 -0
  89. data/spec/models/callbacks.rb +18 -0
  90. data/spec/models/comment.rb +8 -0
  91. data/spec/models/country_code.rb +6 -0
  92. data/spec/models/employer.rb +5 -0
  93. data/spec/models/game.rb +7 -0
  94. data/spec/models/inheritance.rb +56 -0
  95. data/spec/models/location.rb +5 -0
  96. data/spec/models/mixed_drink.rb +4 -0
  97. data/spec/models/name.rb +13 -0
  98. data/spec/models/namespacing.rb +11 -0
  99. data/spec/models/patient.rb +4 -0
  100. data/spec/models/person.rb +99 -0
  101. data/spec/models/pet.rb +7 -0
  102. data/spec/models/pet_owner.rb +6 -0
  103. data/spec/models/phone.rb +7 -0
  104. data/spec/models/post.rb +15 -0
  105. data/spec/models/translation.rb +5 -0
  106. data/spec/models/vet_visit.rb +5 -0
  107. data/spec/spec.opts +3 -0
  108. data/spec/spec_helper.rb +31 -0
  109. data/spec/unit/mongoid/associations/belongs_to_related_spec.rb +145 -0
  110. data/spec/unit/mongoid/associations/embed_many_spec.rb +516 -0
  111. data/spec/unit/mongoid/associations/embed_one_spec.rb +282 -0
  112. data/spec/unit/mongoid/associations/embedded_in_spec.rb +193 -0
  113. data/spec/unit/mongoid/associations/has_many_related_spec.rb +418 -0
  114. data/spec/unit/mongoid/associations/has_one_related_spec.rb +179 -0
  115. data/spec/unit/mongoid/associations/meta_data_spec.rb +88 -0
  116. data/spec/unit/mongoid/associations/options_spec.rb +192 -0
  117. data/spec/unit/mongoid/associations_spec.rb +595 -0
  118. data/spec/unit/mongoid/attributes_spec.rb +507 -0
  119. data/spec/unit/mongoid/callbacks_spec.rb +55 -0
  120. data/spec/unit/mongoid/collection_spec.rb +187 -0
  121. data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +75 -0
  122. data/spec/unit/mongoid/collections/master_spec.rb +41 -0
  123. data/spec/unit/mongoid/collections/mimic_spec.rb +43 -0
  124. data/spec/unit/mongoid/collections/slaves_spec.rb +81 -0
  125. data/spec/unit/mongoid/commands/create_spec.rb +31 -0
  126. data/spec/unit/mongoid/commands/delete_all_spec.rb +58 -0
  127. data/spec/unit/mongoid/commands/delete_spec.rb +38 -0
  128. data/spec/unit/mongoid/commands/destroy_all_spec.rb +21 -0
  129. data/spec/unit/mongoid/commands/destroy_spec.rb +51 -0
  130. data/spec/unit/mongoid/commands/save_spec.rb +107 -0
  131. data/spec/unit/mongoid/commands_spec.rb +270 -0
  132. data/spec/unit/mongoid/config_spec.rb +172 -0
  133. data/spec/unit/mongoid/contexts/enumerable_spec.rb +421 -0
  134. data/spec/unit/mongoid/contexts/mongo_spec.rb +682 -0
  135. data/spec/unit/mongoid/contexts_spec.rb +25 -0
  136. data/spec/unit/mongoid/criteria_spec.rb +824 -0
  137. data/spec/unit/mongoid/criterion/complex_spec.rb +19 -0
  138. data/spec/unit/mongoid/criterion/exclusion_spec.rb +91 -0
  139. data/spec/unit/mongoid/criterion/inclusion_spec.rb +219 -0
  140. data/spec/unit/mongoid/criterion/optional_spec.rb +319 -0
  141. data/spec/unit/mongoid/cursor_spec.rb +74 -0
  142. data/spec/unit/mongoid/deprecation_spec.rb +24 -0
  143. data/spec/unit/mongoid/document_spec.rb +818 -0
  144. data/spec/unit/mongoid/errors_spec.rb +103 -0
  145. data/spec/unit/mongoid/extensions/array/accessors_spec.rb +50 -0
  146. data/spec/unit/mongoid/extensions/array/assimilation_spec.rb +24 -0
  147. data/spec/unit/mongoid/extensions/array/conversions_spec.rb +35 -0
  148. data/spec/unit/mongoid/extensions/array/parentization_spec.rb +20 -0
  149. data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +22 -0
  150. data/spec/unit/mongoid/extensions/binary/conversions_spec.rb +22 -0
  151. data/spec/unit/mongoid/extensions/boolean/conversions_spec.rb +49 -0
  152. data/spec/unit/mongoid/extensions/date/conversions_spec.rb +102 -0
  153. data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +67 -0
  154. data/spec/unit/mongoid/extensions/float/conversions_spec.rb +61 -0
  155. data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +184 -0
  156. data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +46 -0
  157. data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +21 -0
  158. data/spec/unit/mongoid/extensions/hash/criteria_helpers_spec.rb +17 -0
  159. data/spec/unit/mongoid/extensions/hash/scoping_spec.rb +14 -0
  160. data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +61 -0
  161. data/spec/unit/mongoid/extensions/nil/assimilation_spec.rb +24 -0
  162. data/spec/unit/mongoid/extensions/object/conversions_spec.rb +57 -0
  163. data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +34 -0
  164. data/spec/unit/mongoid/extensions/string/conversions_spec.rb +17 -0
  165. data/spec/unit/mongoid/extensions/string/inflections_spec.rb +208 -0
  166. data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +91 -0
  167. data/spec/unit/mongoid/extensions/time/conversions_spec.rb +70 -0
  168. data/spec/unit/mongoid/extras_spec.rb +102 -0
  169. data/spec/unit/mongoid/factory_spec.rb +31 -0
  170. data/spec/unit/mongoid/field_spec.rb +143 -0
  171. data/spec/unit/mongoid/fields_spec.rb +181 -0
  172. data/spec/unit/mongoid/finders_spec.rb +404 -0
  173. data/spec/unit/mongoid/identity_spec.rb +109 -0
  174. data/spec/unit/mongoid/indexes_spec.rb +93 -0
  175. data/spec/unit/mongoid/javascript_spec.rb +48 -0
  176. data/spec/unit/mongoid/matchers/all_spec.rb +27 -0
  177. data/spec/unit/mongoid/matchers/default_spec.rb +27 -0
  178. data/spec/unit/mongoid/matchers/exists_spec.rb +56 -0
  179. data/spec/unit/mongoid/matchers/gt_spec.rb +39 -0
  180. data/spec/unit/mongoid/matchers/gte_spec.rb +49 -0
  181. data/spec/unit/mongoid/matchers/in_spec.rb +27 -0
  182. data/spec/unit/mongoid/matchers/lt_spec.rb +39 -0
  183. data/spec/unit/mongoid/matchers/lte_spec.rb +49 -0
  184. data/spec/unit/mongoid/matchers/ne_spec.rb +27 -0
  185. data/spec/unit/mongoid/matchers/nin_spec.rb +27 -0
  186. data/spec/unit/mongoid/matchers/size_spec.rb +27 -0
  187. data/spec/unit/mongoid/matchers_spec.rb +329 -0
  188. data/spec/unit/mongoid/memoization_spec.rb +75 -0
  189. data/spec/unit/mongoid/named_scope_spec.rb +123 -0
  190. data/spec/unit/mongoid/observable_spec.rb +46 -0
  191. data/spec/unit/mongoid/paths_spec.rb +124 -0
  192. data/spec/unit/mongoid/scope_spec.rb +240 -0
  193. data/spec/unit/mongoid/state_spec.rb +83 -0
  194. data/spec/unit/mongoid/timestamps_spec.rb +25 -0
  195. data/spec/unit/mongoid/validations/associated_spec.rb +103 -0
  196. data/spec/unit/mongoid/validations/uniqueness_spec.rb +47 -0
  197. data/spec/unit/mongoid/validations_spec.rb +190 -0
  198. data/spec/unit/mongoid/versioning_spec.rb +41 -0
  199. data/spec/unit/mongoid_spec.rb +46 -0
  200. metadata +316 -110
  201. data/lib/mongoid/collections.rb +0 -41
  202. data/lib/mongoid/concern.rb +0 -31
  203. data/lib/mongoid/dirty.rb +0 -253
  204. data/lib/mongoid/extensions/time_conversions.rb +0 -35
  205. data/lib/mongoid/persistence.rb +0 -222
  206. data/lib/mongoid/persistence/command.rb +0 -39
  207. data/lib/mongoid/persistence/insert.rb +0 -50
  208. data/lib/mongoid/persistence/insert_embedded.rb +0 -38
  209. data/lib/mongoid/persistence/remove.rb +0 -39
  210. data/lib/mongoid/persistence/remove_all.rb +0 -37
  211. data/lib/mongoid/persistence/remove_embedded.rb +0 -50
  212. data/lib/mongoid/persistence/update.rb +0 -63
  213. data/lib/mongoid/version.rb +0 -4
@@ -62,7 +62,7 @@ module Mongoid #:nodoc:
62
62
  #
63
63
  # Options:
64
64
  #
65
- # object_id: A +String+ representation of a <tt>BSON::ObjectId</tt>
65
+ # object_id: A +String+ representation of a <tt>Mongo::ObjectID</tt>
66
66
  #
67
67
  # Example:
68
68
  #
@@ -5,6 +5,7 @@ module Mongoid #:nodoc
5
5
  # Operations on the Mongo::Cursor object that will not get overriden by the
6
6
  # Mongoid::Cursor are defined here.
7
7
  OPERATIONS = [
8
+ :admin,
8
9
  :close,
9
10
  :closed?,
10
11
  :count,
@@ -2,16 +2,19 @@
2
2
  module Mongoid #:nodoc:
3
3
  module Document
4
4
  extend ActiveSupport::Concern
5
- include Mongoid::Components
6
5
  included do
7
6
  include Mongoid::Components
8
7
 
9
- cattr_accessor :primary_key, :hereditary
8
+ cattr_accessor :_collection, :collection_name, :embedded, :primary_key, :hereditary
9
+
10
+ self.embedded = false
10
11
  self.hereditary = false
12
+ self.collection_name = self.name.collectionize
11
13
 
12
14
  attr_accessor :association_name, :_parent
15
+ attr_reader :new_record
13
16
 
14
- delegate :db, :primary_key, :to => "self.class"
17
+ delegate :collection, :db, :embedded, :primary_key, :to => "self.class"
15
18
  end
16
19
 
17
20
  module ClassMethods
@@ -20,21 +23,23 @@ module Mongoid #:nodoc:
20
23
  collection.db
21
24
  end
22
25
 
26
+ # Returns the collection associated with this +Document+. If the
27
+ # document is embedded, there will be no collection associated
28
+ # with it.
29
+ #
30
+ # Returns: <tt>Mongo::Collection</tt>
31
+ def collection
32
+ raise Errors::InvalidCollection.new(self) if embedded
33
+ self._collection ||= Mongoid::Collection.new(self, self.collection_name)
34
+ add_indexes; self._collection
35
+ end
36
+
23
37
  # Perform default behavior but mark the hierarchy as being hereditary.
24
38
  def inherited(subclass)
25
39
  super(subclass)
26
40
  self.hereditary = true
27
41
  end
28
42
 
29
- # Returns a human readable version of the class.
30
- #
31
- # Example:
32
- #
33
- # <tt>MixedDrink.human_name # returns "Mixed Drink"</tt>
34
- def human_name
35
- name.labelize
36
- end
37
-
38
43
  # Instantiate a new object, only when loaded from the database or when
39
44
  # the attributes have already been typecast.
40
45
  #
@@ -46,7 +51,6 @@ module Mongoid #:nodoc:
46
51
  if attributes["_id"] || allocating
47
52
  document = allocate
48
53
  document.instance_variable_set(:@attributes, attributes)
49
- document.setup_modifications
50
54
  return document
51
55
  else
52
56
  return new(attrs)
@@ -69,14 +73,25 @@ module Mongoid #:nodoc:
69
73
  before_save :identify
70
74
  end
71
75
 
76
+ # Macro for setting the collection name to store in.
77
+ #
78
+ # Example:
79
+ #
80
+ # <tt>Person.store_in :populdation</tt>
81
+ def store_in(name)
82
+ self.collection_name = name.to_s
83
+ self._collection = Mongoid::Collection.new(self, name.to_s)
84
+ end
85
+
72
86
  # Returns all types to query for when using this class as the base.
73
87
  def _types
74
- @_type ||= (self.subclasses + [ self.name ])
88
+ @_type ||= (subclasses_of(self).map { |o| o.to_s } + [ self.name ])
75
89
  end
76
90
 
77
91
  # return the list of subclassses for an object
78
92
  def subclasses_of(*superclasses) #:nodoc:
79
93
  subclasses = []
94
+
80
95
  superclasses.each do |sup|
81
96
  ObjectSpace.each_object(class << sup; self; end) do |k|
82
97
  if k != sup && (k.name.blank? || eval("defined?(::#{k}) && ::#{k}.object_id == k.object_id"))
@@ -84,16 +99,18 @@ module Mongoid #:nodoc:
84
99
  end
85
100
  end
86
101
  end
102
+
87
103
  subclasses
88
104
  end
89
105
  end
90
106
 
91
107
  module InstanceMethods
92
- # Performs equality checking on the document ids. For more robust
93
- # equality checking please override this method.
108
+ # Performs equality checking on the attributes. For now we chack against
109
+ # all attributes excluding timestamps on the object.
94
110
  def ==(other)
95
111
  return false unless other.is_a?(Document)
96
- id == other.id
112
+ attributes.except(:modified_at).except(:created_at) ==
113
+ other.attributes.except(:modified_at).except(:created_at)
97
114
  end
98
115
 
99
116
  # Delegates to ==
@@ -107,15 +124,6 @@ module Mongoid #:nodoc:
107
124
  id.hash
108
125
  end
109
126
 
110
- # Is inheritance in play here?
111
- #
112
- # Returns:
113
- #
114
- # <tt>true</tt> if inheritance used, <tt>false</tt> if not.
115
- def hereditary?
116
- !!self.hereditary
117
- end
118
-
119
127
  # Introduces a child object into the +Document+ object graph. This will
120
128
  # set up the relationships between the parent and child and update the
121
129
  # attributes of the parent +Document+.
@@ -149,27 +157,24 @@ module Mongoid #:nodoc:
149
157
  # an empty +Hash+.
150
158
  #
151
159
  # If a primary key is defined, the document's id will be set to that key,
152
- # otherwise it will be set to a fresh +BSON::ObjectId+ string.
160
+ # otherwise it will be set to a fresh +Mongo::ObjectID+ string.
153
161
  #
154
162
  # Options:
155
163
  #
156
164
  # attrs: The attributes +Hash+ to set up the document with.
157
165
  def initialize(attrs = nil)
158
- @attributes = default_attributes
166
+ @attributes = {}
159
167
  process(attrs)
160
- @new_record = true
168
+ @attributes = attributes_with_defaults(@attributes)
169
+ @new_record = true if id.nil?
161
170
  document = yield self if block_given?
162
171
  identify
163
172
  end
164
173
 
165
174
  # Returns the class name plus its attributes.
166
175
  def inspect
167
- attrs = fields.map { |name, field| "#{name}: #{@attributes[name].inspect}" }
168
- if Mongoid.allow_dynamic_fields
169
- dynamic_keys = @attributes.keys - fields.keys - associations.keys - ["_id", "_type"]
170
- attrs += dynamic_keys.map { |name| "#{name}: #{@attributes[name].inspect}" }
171
- end
172
- "#<#{self.class.name} _id: #{id}, #{attrs * ', '}>"
176
+ attrs = fields.map { |name, field| "#{name}: #{@attributes[name].inspect}" } * ", "
177
+ "#<#{self.class.name} _id: #{id}, #{attrs}>"
173
178
  end
174
179
 
175
180
  # Notify observers of an update.
@@ -206,12 +211,8 @@ module Mongoid #:nodoc:
206
211
 
207
212
  # Reloads the +Document+ attributes from the database.
208
213
  def reload
209
- reloaded = collection.find_one(:_id => id)
210
- if Mongoid.raise_not_found_error
211
- raise Errors::DocumentNotFound.new(self.class, id) if reloaded.nil?
212
- end
213
- @attributes = {}.merge(reloaded || {})
214
- self.associations.keys.each { |association_name| unmemoize(association_name) }; self
214
+ @attributes = collection.find_one(:_id => id)
215
+ self
215
216
  end
216
217
 
217
218
  # Remove a child document from this parent +Document+. Will reset the
@@ -286,25 +287,20 @@ module Mongoid #:nodoc:
286
287
  #
287
288
  # This will also cause the observing +Document+ to notify it's parent if
288
289
  # there is any.
289
- def observe(child, clear = false)
290
+ def update(child, clear = false)
290
291
  name = child.association_name
291
292
  attrs = child.instance_variable_get(:@attributes)
292
- if clear
293
- @attributes.delete(name)
294
- else
295
- @attributes.insert(name, attrs) unless @attributes[name] && @attributes[name].include?(attrs)
296
- end
293
+ clear ? @attributes.delete(name) : @attributes.insert(name, attrs)
297
294
  notify
298
295
  end
299
296
 
300
297
  protected
301
298
  # apply default values to attributes - calling procs as required
302
299
  def attributes_with_defaults(attributes = {})
303
- default_values = defaults
300
+ default_values = defaults.merge(attributes)
304
301
  default_values.each_pair do |key, val|
305
302
  default_values[key] = val.call if val.respond_to?(:call)
306
303
  end
307
- default_values.merge(attributes)
308
304
  end
309
305
  end
310
306
  end
@@ -41,20 +41,6 @@ module Mongoid #:nodoc
41
41
  end
42
42
  end
43
43
 
44
- # Raised when the database version is not supported by Mongoid.
45
- #
46
- # Example:
47
- #
48
- # <tt>UnsupportedVersion.new(Mongo::ServerVersion.new("1.3.1"))</tt>
49
- class UnsupportedVersion < RuntimeError
50
- def initialize(version)
51
- @version = version
52
- end
53
- def message
54
- "MongoDB #{@version} not supported, please upgrade to #{Mongoid::MONGODB_VERSION}"
55
- end
56
- end
57
-
58
44
  # Raised when a persisence method ending in ! fails validation. The message
59
45
  # will contain the full error messages from the +Document+ in question.
60
46
  #
@@ -66,7 +52,7 @@ module Mongoid #:nodoc
66
52
  @errors = errors
67
53
  end
68
54
  def message
69
- "Validation Failed: #{@errors.full_messages.join(", ")}"
55
+ "Validation failed: #{@errors.full_messages}"
70
56
  end
71
57
  end
72
58
 
@@ -87,22 +73,5 @@ module Mongoid #:nodoc
87
73
  end
88
74
  end
89
75
 
90
- # This error is raised when trying to create a field that conflicts with
91
- # a Mongoid internal attribute or method.
92
- #
93
- # Example:
94
- #
95
- # <tt>InvalidField.new('collection')</tt>
96
- class InvalidField < RuntimeError
97
- def initialize(name)
98
- @name = name
99
- end
100
- def message
101
- "Defining a field named '#{@name}' is not allowed. " +
102
- "Do not define fields that conflict with Mongoid internal attributes " +
103
- "or method names. Use Document#instance_methods to see what " +
104
- "names this includes."
105
- end
106
- end
107
76
  end
108
77
  end
@@ -1,5 +1,4 @@
1
1
  # encoding: utf-8
2
- require "mongoid/extensions/time_conversions"
3
2
  require "mongoid/extensions/array/accessors"
4
3
  require "mongoid/extensions/array/aliasing"
5
4
  require "mongoid/extensions/array/assimilation"
@@ -23,6 +22,7 @@ require "mongoid/extensions/proc/scoping"
23
22
  require "mongoid/extensions/string/conversions"
24
23
  require "mongoid/extensions/string/inflections"
25
24
  require "mongoid/extensions/symbol/inflections"
25
+ require "mongoid/extensions/time/conversions"
26
26
  require "mongoid/extensions/objectid/conversions"
27
27
 
28
28
  class Array #:nodoc
@@ -44,16 +44,14 @@ class Boolean #:nodoc
44
44
  extend Mongoid::Extensions::Boolean::Conversions
45
45
  end
46
46
 
47
- class DateTime #:nodoc
48
- extend Mongoid::Extensions::TimeConversions
49
- extend Mongoid::Extensions::DateTime::Conversions
50
- end
51
-
52
47
  class Date #:nodoc
53
- extend Mongoid::Extensions::TimeConversions
54
48
  extend Mongoid::Extensions::Date::Conversions
55
49
  end
56
50
 
51
+ class DateTime #:nodoc
52
+ extend Mongoid::Extensions::DateTime::Conversions
53
+ end
54
+
57
55
  class Float #:nodoc
58
56
  extend Mongoid::Extensions::Float::Conversions
59
57
  end
@@ -63,7 +61,7 @@ class Hash #:nodoc
63
61
  include Mongoid::Extensions::Hash::Assimilation
64
62
  include Mongoid::Extensions::Hash::CriteriaHelpers
65
63
  include Mongoid::Extensions::Hash::Scoping
66
- include Mongoid::Extensions::Hash::Conversions
64
+ extend Mongoid::Extensions::Hash::Conversions
67
65
  end
68
66
 
69
67
  class Integer #:nodoc
@@ -93,9 +91,9 @@ class Symbol #:nodoc
93
91
  end
94
92
 
95
93
  class Time #:nodoc
96
- extend Mongoid::Extensions::TimeConversions
94
+ extend Mongoid::Extensions::Time::Conversions
97
95
  end
98
96
 
99
- class BSON::ObjectId #:nodoc
100
- extend Mongoid::Extensions::ObjectId::Conversions
101
- end
97
+ class Mongo::ObjectID #:nodoc
98
+ extend Mongoid::Extensions::ObjectID::Conversions
99
+ end
@@ -4,18 +4,16 @@ module Mongoid #:nodoc:
4
4
  module Array #:nodoc:
5
5
  # This module converts arrays into mongoid related objects.
6
6
  module Conversions #:nodoc:
7
- # Converts this array into an array of hashes.
8
- def mongoidize
9
- collect { |obj| obj.attributes }
10
- end
7
+ extend ActiveSupport::Concern
11
8
 
12
- def self.included(base)
13
- base.class_eval do
14
- extend ClassMethods
9
+ module InstanceMethods #:nodoc:
10
+ # Converts this array into an array of hashes.
11
+ def mongoidize
12
+ collect { |obj| obj.attributes }
15
13
  end
16
14
  end
17
15
 
18
- module ClassMethods
16
+ module ClassMethods #:nodoc:
19
17
  def get(value)
20
18
  value
21
19
  end
@@ -7,11 +7,11 @@ module Mongoid #:nodoc:
7
7
  module Conversions #:nodoc:
8
8
  # Get the string as a +BigDecimal+
9
9
  def get(value)
10
- value ? ::BigDecimal.new(value) : value
10
+ ::BigDecimal.new(value)
11
11
  end
12
12
  # Set the value in the hash as a string.
13
13
  def set(value)
14
- value ? value.to_s : value
14
+ value.to_s
15
15
  end
16
16
  end
17
17
  end
@@ -3,15 +3,9 @@ module Mongoid #:nodoc:
3
3
  module Extensions #:nodoc:
4
4
  module Boolean #:nodoc:
5
5
  module Conversions #:nodoc:
6
-
7
- BOOLEAN_MAP = {
8
- true => true, "true" => true, "TRUE" => true, "1" => true, 1 => true, 1.0 => true,
9
- false => false, "false" => false, "FALSE" => false, "0" => false, 0 => false, 0.0 => false
10
- }
11
-
12
6
  def set(value)
13
- value = BOOLEAN_MAP[value]
14
- value.nil? ? nil : value
7
+ val = value.to_s
8
+ val == "true" || val == "1"
15
9
  end
16
10
  def get(value)
17
11
  value
@@ -3,20 +3,11 @@ module Mongoid #:nodoc:
3
3
  module Extensions #:nodoc:
4
4
  module Date #:nodoc:
5
5
  module Conversions #:nodoc:
6
- def get(value)
7
- return nil if value.blank?
8
- if Mongoid::Config.instance.use_utc?
9
- value.to_date
10
- else
11
- ::Date.new(value.year, value.month, value.day)
12
- end
6
+ def set(value)
7
+ value.to_date.at_midnight.to_time unless value.blank?
13
8
  end
14
-
15
- protected
16
-
17
- def convert_to_time(value)
18
- value = ::Date.parse(value) if value.is_a?(::String)
19
- ::Time.utc(value.year, value.month, value.day)
9
+ def get(value)
10
+ value ? value.getlocal.to_date : value
20
11
  end
21
12
  end
22
13
  end
@@ -3,8 +3,13 @@ module Mongoid #:nodoc:
3
3
  module Extensions #:nodoc:
4
4
  module DateTime #:nodoc:
5
5
  module Conversions #:nodoc:
6
+ def set(value)
7
+ return nil if value.blank?
8
+ ::DateTime.parse(value.to_s).utc
9
+ end
6
10
  def get(value)
7
- super.try(:to_datetime)
11
+ return nil if value.blank?
12
+ ::Time.zone ? ::Time.parse(value.to_s).getlocal.to_datetime : value.to_datetime
8
13
  end
9
14
  end
10
15
  end
@@ -5,11 +5,7 @@ module Mongoid #:nodoc:
5
5
  module Conversions #:nodoc:
6
6
  def set(value)
7
7
  return nil if value.blank?
8
- begin
9
- Float(value)
10
- rescue ArgumentError => e
11
- puts(e.message); value
12
- end
8
+ value =~ /\d/ ? value.to_f : value
13
9
  end
14
10
  def get(value)
15
11
  value
@@ -18,19 +18,10 @@ module Mongoid #:nodoc:
18
18
  #
19
19
  # Returns: The child +Document+.
20
20
  def assimilate(parent, options, type = nil)
21
- klass = self.klass || (type ? type : options.klass)
22
- child = klass.instantiate("_id" => self["_id"])
23
- self.merge("_type" => klass.name) if klass.hereditary
24
- init(parent, child, options)
25
- end
26
-
27
- protected
28
-
29
- def init(parent, child, options)
30
- child._parent = parent
31
- child.write_attributes(self)
21
+ klass = type ? type : options.klass
22
+ child = klass.instantiate(:_parent => parent)
23
+ child.write_attributes(self.merge("_type" => klass.name))
32
24
  child.identify
33
- child.reset_modifications
34
25
  child.assimilate(parent, options)
35
26
  end
36
27
  end