mongoid 1.9.5 → 2.0.0.alpha

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 (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