mongoid 2.0.0.alpha → 2.0.0.beta.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (216) hide show
  1. data/lib/mongoid.rb +11 -5
  2. data/lib/mongoid/associations.rb +112 -107
  3. data/lib/mongoid/associations/belongs_to_related.rb +2 -3
  4. data/lib/mongoid/associations/embedded_in.rb +12 -4
  5. data/lib/mongoid/associations/{embed_many.rb → embeds_many.rb} +101 -32
  6. data/lib/mongoid/associations/{embed_one.rb → embeds_one.rb} +10 -10
  7. data/lib/mongoid/associations/has_many_related.rb +51 -5
  8. data/lib/mongoid/associations/has_one_related.rb +9 -5
  9. data/lib/mongoid/associations/meta_data.rb +2 -1
  10. data/lib/mongoid/associations/options.rb +15 -6
  11. data/lib/mongoid/associations/proxy.rb +14 -21
  12. data/lib/mongoid/attributes.rb +34 -13
  13. data/lib/mongoid/callbacks.rb +1 -2
  14. data/lib/mongoid/collection.rb +4 -3
  15. data/lib/mongoid/collections.rb +41 -0
  16. data/lib/mongoid/collections/master.rb +3 -2
  17. data/lib/mongoid/collections/slaves.rb +3 -2
  18. data/lib/mongoid/components.rb +4 -1
  19. data/lib/mongoid/config.rb +163 -13
  20. data/lib/mongoid/contexts.rb +1 -2
  21. data/lib/mongoid/contexts/enumerable.rb +1 -1
  22. data/lib/mongoid/contexts/mongo.rb +1 -1
  23. data/lib/mongoid/contexts/paging.rb +10 -2
  24. data/lib/mongoid/criteria.rb +13 -22
  25. data/lib/mongoid/criterion/exclusion.rb +3 -3
  26. data/lib/mongoid/criterion/inclusion.rb +17 -0
  27. data/lib/mongoid/criterion/optional.rb +1 -1
  28. data/lib/mongoid/dirty.rb +253 -0
  29. data/lib/mongoid/document.rb +40 -85
  30. data/lib/mongoid/errors.rb +48 -1
  31. data/lib/mongoid/extensions.rb +11 -9
  32. data/lib/mongoid/extensions/big_decimal/conversions.rb +2 -2
  33. data/lib/mongoid/extensions/boolean/conversions.rb +8 -2
  34. data/lib/mongoid/extensions/date/conversions.rb +13 -4
  35. data/lib/mongoid/extensions/datetime/conversions.rb +1 -6
  36. data/lib/mongoid/extensions/float/conversions.rb +5 -1
  37. data/lib/mongoid/extensions/hash/assimilation.rb +12 -3
  38. data/lib/mongoid/extensions/hash/conversions.rb +34 -4
  39. data/lib/mongoid/extensions/integer/conversions.rb +5 -1
  40. data/lib/mongoid/extensions/nil/assimilation.rb +4 -0
  41. data/lib/mongoid/extensions/object/conversions.rb +3 -3
  42. data/lib/mongoid/extensions/string/conversions.rb +1 -1
  43. data/lib/mongoid/extensions/symbol/inflections.rb +5 -2
  44. data/lib/mongoid/extensions/time_conversions.rb +35 -0
  45. data/lib/mongoid/factory.rb +2 -1
  46. data/lib/mongoid/field.rb +15 -2
  47. data/lib/mongoid/fields.rb +1 -1
  48. data/lib/mongoid/identity.rb +3 -3
  49. data/lib/mongoid/indexes.rb +3 -3
  50. data/lib/mongoid/matchers.rb +1 -2
  51. data/lib/mongoid/memoization.rb +8 -2
  52. data/lib/mongoid/named_scope.rb +0 -5
  53. data/lib/mongoid/observable.rb +1 -1
  54. data/lib/mongoid/paths.rb +30 -22
  55. data/lib/mongoid/persistence.rb +218 -0
  56. data/lib/mongoid/persistence/command.rb +39 -0
  57. data/lib/mongoid/persistence/insert.rb +47 -0
  58. data/lib/mongoid/persistence/insert_embedded.rb +38 -0
  59. data/lib/mongoid/persistence/remove.rb +39 -0
  60. data/lib/mongoid/persistence/remove_all.rb +37 -0
  61. data/lib/mongoid/persistence/remove_embedded.rb +50 -0
  62. data/lib/mongoid/persistence/update.rb +63 -0
  63. data/lib/mongoid/railtie.rb +53 -0
  64. data/lib/mongoid/railties/database.rake +37 -0
  65. data/lib/mongoid/timestamps.rb +2 -2
  66. data/lib/mongoid/validations.rb +2 -2
  67. data/lib/mongoid/validations/associated.rb +2 -2
  68. data/lib/mongoid/validations/uniqueness.rb +13 -2
  69. data/lib/mongoid/version.rb +4 -0
  70. data/lib/mongoid/versioning.rb +3 -2
  71. data/lib/rails/generators/mongoid/config/config_generator.rb +41 -0
  72. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +24 -0
  73. data/lib/rails/generators/mongoid/model/model_generator.rb +24 -0
  74. data/lib/rails/generators/mongoid/model/templates/model.rb +15 -0
  75. data/lib/rails/generators/mongoid_generator.rb +61 -0
  76. metadata +76 -301
  77. data/.gitignore +0 -6
  78. data/.watchr +0 -29
  79. data/Rakefile +0 -52
  80. data/VERSION +0 -1
  81. data/caliper.yml +0 -4
  82. data/lib/mongoid/collections/mimic.rb +0 -46
  83. data/lib/mongoid/commands.rb +0 -161
  84. data/lib/mongoid/commands/create.rb +0 -19
  85. data/lib/mongoid/commands/delete.rb +0 -16
  86. data/lib/mongoid/commands/delete_all.rb +0 -23
  87. data/lib/mongoid/commands/deletion.rb +0 -18
  88. data/lib/mongoid/commands/destroy.rb +0 -17
  89. data/lib/mongoid/commands/destroy_all.rb +0 -23
  90. data/lib/mongoid/commands/save.rb +0 -29
  91. data/lib/mongoid/extensions/time/conversions.rb +0 -18
  92. data/mongoid.gemspec +0 -408
  93. data/perf/benchmark.rb +0 -77
  94. data/spec/integration/mongoid/associations_spec.rb +0 -340
  95. data/spec/integration/mongoid/attributes_spec.rb +0 -22
  96. data/spec/integration/mongoid/commands_spec.rb +0 -227
  97. data/spec/integration/mongoid/contexts/enumerable_spec.rb +0 -33
  98. data/spec/integration/mongoid/criteria_spec.rb +0 -272
  99. data/spec/integration/mongoid/document_spec.rb +0 -650
  100. data/spec/integration/mongoid/extensions_spec.rb +0 -22
  101. data/spec/integration/mongoid/finders_spec.rb +0 -119
  102. data/spec/integration/mongoid/inheritance_spec.rb +0 -137
  103. data/spec/integration/mongoid/named_scope_spec.rb +0 -46
  104. data/spec/models/address.rb +0 -39
  105. data/spec/models/animal.rb +0 -6
  106. data/spec/models/callbacks.rb +0 -18
  107. data/spec/models/comment.rb +0 -8
  108. data/spec/models/country_code.rb +0 -6
  109. data/spec/models/employer.rb +0 -5
  110. data/spec/models/game.rb +0 -7
  111. data/spec/models/inheritance.rb +0 -56
  112. data/spec/models/location.rb +0 -5
  113. data/spec/models/mixed_drink.rb +0 -4
  114. data/spec/models/name.rb +0 -13
  115. data/spec/models/namespacing.rb +0 -11
  116. data/spec/models/patient.rb +0 -4
  117. data/spec/models/person.rb +0 -99
  118. data/spec/models/pet.rb +0 -7
  119. data/spec/models/pet_owner.rb +0 -6
  120. data/spec/models/phone.rb +0 -7
  121. data/spec/models/post.rb +0 -15
  122. data/spec/models/translation.rb +0 -5
  123. data/spec/models/vet_visit.rb +0 -5
  124. data/spec/spec.opts +0 -3
  125. data/spec/spec_helper.rb +0 -31
  126. data/spec/unit/mongoid/associations/belongs_to_related_spec.rb +0 -145
  127. data/spec/unit/mongoid/associations/embed_many_spec.rb +0 -516
  128. data/spec/unit/mongoid/associations/embed_one_spec.rb +0 -282
  129. data/spec/unit/mongoid/associations/embedded_in_spec.rb +0 -193
  130. data/spec/unit/mongoid/associations/has_many_related_spec.rb +0 -418
  131. data/spec/unit/mongoid/associations/has_one_related_spec.rb +0 -179
  132. data/spec/unit/mongoid/associations/meta_data_spec.rb +0 -88
  133. data/spec/unit/mongoid/associations/options_spec.rb +0 -192
  134. data/spec/unit/mongoid/associations_spec.rb +0 -595
  135. data/spec/unit/mongoid/attributes_spec.rb +0 -507
  136. data/spec/unit/mongoid/callbacks_spec.rb +0 -55
  137. data/spec/unit/mongoid/collection_spec.rb +0 -187
  138. data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +0 -75
  139. data/spec/unit/mongoid/collections/master_spec.rb +0 -41
  140. data/spec/unit/mongoid/collections/mimic_spec.rb +0 -43
  141. data/spec/unit/mongoid/collections/slaves_spec.rb +0 -81
  142. data/spec/unit/mongoid/commands/create_spec.rb +0 -31
  143. data/spec/unit/mongoid/commands/delete_all_spec.rb +0 -58
  144. data/spec/unit/mongoid/commands/delete_spec.rb +0 -38
  145. data/spec/unit/mongoid/commands/destroy_all_spec.rb +0 -21
  146. data/spec/unit/mongoid/commands/destroy_spec.rb +0 -51
  147. data/spec/unit/mongoid/commands/save_spec.rb +0 -107
  148. data/spec/unit/mongoid/commands_spec.rb +0 -270
  149. data/spec/unit/mongoid/config_spec.rb +0 -172
  150. data/spec/unit/mongoid/contexts/enumerable_spec.rb +0 -421
  151. data/spec/unit/mongoid/contexts/mongo_spec.rb +0 -682
  152. data/spec/unit/mongoid/contexts_spec.rb +0 -25
  153. data/spec/unit/mongoid/criteria_spec.rb +0 -824
  154. data/spec/unit/mongoid/criterion/complex_spec.rb +0 -19
  155. data/spec/unit/mongoid/criterion/exclusion_spec.rb +0 -91
  156. data/spec/unit/mongoid/criterion/inclusion_spec.rb +0 -219
  157. data/spec/unit/mongoid/criterion/optional_spec.rb +0 -319
  158. data/spec/unit/mongoid/cursor_spec.rb +0 -74
  159. data/spec/unit/mongoid/deprecation_spec.rb +0 -24
  160. data/spec/unit/mongoid/document_spec.rb +0 -818
  161. data/spec/unit/mongoid/errors_spec.rb +0 -103
  162. data/spec/unit/mongoid/extensions/array/accessors_spec.rb +0 -50
  163. data/spec/unit/mongoid/extensions/array/assimilation_spec.rb +0 -24
  164. data/spec/unit/mongoid/extensions/array/conversions_spec.rb +0 -35
  165. data/spec/unit/mongoid/extensions/array/parentization_spec.rb +0 -20
  166. data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +0 -22
  167. data/spec/unit/mongoid/extensions/binary/conversions_spec.rb +0 -22
  168. data/spec/unit/mongoid/extensions/boolean/conversions_spec.rb +0 -49
  169. data/spec/unit/mongoid/extensions/date/conversions_spec.rb +0 -102
  170. data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +0 -67
  171. data/spec/unit/mongoid/extensions/float/conversions_spec.rb +0 -61
  172. data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +0 -184
  173. data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +0 -46
  174. data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +0 -21
  175. data/spec/unit/mongoid/extensions/hash/criteria_helpers_spec.rb +0 -17
  176. data/spec/unit/mongoid/extensions/hash/scoping_spec.rb +0 -14
  177. data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +0 -61
  178. data/spec/unit/mongoid/extensions/nil/assimilation_spec.rb +0 -24
  179. data/spec/unit/mongoid/extensions/object/conversions_spec.rb +0 -57
  180. data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +0 -34
  181. data/spec/unit/mongoid/extensions/string/conversions_spec.rb +0 -17
  182. data/spec/unit/mongoid/extensions/string/inflections_spec.rb +0 -208
  183. data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +0 -91
  184. data/spec/unit/mongoid/extensions/time/conversions_spec.rb +0 -70
  185. data/spec/unit/mongoid/extras_spec.rb +0 -102
  186. data/spec/unit/mongoid/factory_spec.rb +0 -31
  187. data/spec/unit/mongoid/field_spec.rb +0 -143
  188. data/spec/unit/mongoid/fields_spec.rb +0 -181
  189. data/spec/unit/mongoid/finders_spec.rb +0 -404
  190. data/spec/unit/mongoid/identity_spec.rb +0 -109
  191. data/spec/unit/mongoid/indexes_spec.rb +0 -93
  192. data/spec/unit/mongoid/javascript_spec.rb +0 -48
  193. data/spec/unit/mongoid/matchers/all_spec.rb +0 -27
  194. data/spec/unit/mongoid/matchers/default_spec.rb +0 -27
  195. data/spec/unit/mongoid/matchers/exists_spec.rb +0 -56
  196. data/spec/unit/mongoid/matchers/gt_spec.rb +0 -39
  197. data/spec/unit/mongoid/matchers/gte_spec.rb +0 -49
  198. data/spec/unit/mongoid/matchers/in_spec.rb +0 -27
  199. data/spec/unit/mongoid/matchers/lt_spec.rb +0 -39
  200. data/spec/unit/mongoid/matchers/lte_spec.rb +0 -49
  201. data/spec/unit/mongoid/matchers/ne_spec.rb +0 -27
  202. data/spec/unit/mongoid/matchers/nin_spec.rb +0 -27
  203. data/spec/unit/mongoid/matchers/size_spec.rb +0 -27
  204. data/spec/unit/mongoid/matchers_spec.rb +0 -329
  205. data/spec/unit/mongoid/memoization_spec.rb +0 -75
  206. data/spec/unit/mongoid/named_scope_spec.rb +0 -123
  207. data/spec/unit/mongoid/observable_spec.rb +0 -46
  208. data/spec/unit/mongoid/paths_spec.rb +0 -124
  209. data/spec/unit/mongoid/scope_spec.rb +0 -240
  210. data/spec/unit/mongoid/state_spec.rb +0 -83
  211. data/spec/unit/mongoid/timestamps_spec.rb +0 -25
  212. data/spec/unit/mongoid/validations/associated_spec.rb +0 -103
  213. data/spec/unit/mongoid/validations/uniqueness_spec.rb +0 -47
  214. data/spec/unit/mongoid/validations_spec.rb +0 -190
  215. data/spec/unit/mongoid/versioning_spec.rb +0 -41
  216. data/spec/unit/mongoid_spec.rb +0 -46
@@ -41,6 +41,20 @@ 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
+
44
58
  # Raised when a persisence method ending in ! fails validation. The message
45
59
  # will contain the full error messages from the +Document+ in question.
46
60
  #
@@ -52,7 +66,7 @@ module Mongoid #:nodoc
52
66
  @errors = errors
53
67
  end
54
68
  def message
55
- "Validation failed: #{@errors.full_messages}"
69
+ "Validation Failed: " + @errors.full_messages.join(", ")
56
70
  end
57
71
  end
58
72
 
@@ -73,5 +87,38 @@ module Mongoid #:nodoc
73
87
  end
74
88
  end
75
89
 
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
+
108
+ # This error is raised when trying to create set nested records above the
109
+ # specified :limit
110
+ #
111
+ # Example:
112
+ #
113
+ #<tt>TooManyNestedAttributeRecords.new('association', limit)
114
+ class TooManyNestedAttributeRecords < RuntimeError
115
+ def initialize(association, limit)
116
+ @association = association.to_s.humanize.capitalize
117
+ @limit = limit
118
+ end
119
+ def message
120
+ "Accept Nested Attributes for #{@association} is limited to #{@limit} records"
121
+ end
122
+ end
76
123
  end
77
124
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ require "mongoid/extensions/time_conversions"
2
3
  require "mongoid/extensions/array/accessors"
3
4
  require "mongoid/extensions/array/aliasing"
4
5
  require "mongoid/extensions/array/assimilation"
@@ -22,7 +23,6 @@ require "mongoid/extensions/proc/scoping"
22
23
  require "mongoid/extensions/string/conversions"
23
24
  require "mongoid/extensions/string/inflections"
24
25
  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,14 +44,16 @@ class Boolean #:nodoc
44
44
  extend Mongoid::Extensions::Boolean::Conversions
45
45
  end
46
46
 
47
- class Date #:nodoc
48
- extend Mongoid::Extensions::Date::Conversions
49
- end
50
-
51
47
  class DateTime #:nodoc
48
+ extend Mongoid::Extensions::TimeConversions
52
49
  extend Mongoid::Extensions::DateTime::Conversions
53
50
  end
54
51
 
52
+ class Date #:nodoc
53
+ extend Mongoid::Extensions::TimeConversions
54
+ extend Mongoid::Extensions::Date::Conversions
55
+ end
56
+
55
57
  class Float #:nodoc
56
58
  extend Mongoid::Extensions::Float::Conversions
57
59
  end
@@ -61,7 +63,7 @@ class Hash #:nodoc
61
63
  include Mongoid::Extensions::Hash::Assimilation
62
64
  include Mongoid::Extensions::Hash::CriteriaHelpers
63
65
  include Mongoid::Extensions::Hash::Scoping
64
- extend Mongoid::Extensions::Hash::Conversions
66
+ include Mongoid::Extensions::Hash::Conversions
65
67
  end
66
68
 
67
69
  class Integer #:nodoc
@@ -91,9 +93,9 @@ class Symbol #:nodoc
91
93
  end
92
94
 
93
95
  class Time #:nodoc
94
- extend Mongoid::Extensions::Time::Conversions
96
+ extend Mongoid::Extensions::TimeConversions
95
97
  end
96
98
 
97
- class Mongo::ObjectID #:nodoc
99
+ class BSON::ObjectID #:nodoc
98
100
  extend Mongoid::Extensions::ObjectID::Conversions
99
- end
101
+ 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
- ::BigDecimal.new(value)
10
+ value ? ::BigDecimal.new(value) : value
11
11
  end
12
12
  # Set the value in the hash as a string.
13
13
  def set(value)
14
- value.to_s
14
+ value ? value.to_s : value
15
15
  end
16
16
  end
17
17
  end
@@ -3,9 +3,15 @@ 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
+
6
12
  def set(value)
7
- val = value.to_s
8
- val == "true" || val == "1"
13
+ value = BOOLEAN_MAP[value]
14
+ value.nil? ? nil : value
9
15
  end
10
16
  def get(value)
11
17
  value
@@ -3,11 +3,20 @@ module Mongoid #:nodoc:
3
3
  module Extensions #:nodoc:
4
4
  module Date #:nodoc:
5
5
  module Conversions #:nodoc:
6
- def set(value)
7
- value.to_date.at_midnight.to_time unless value.blank?
8
- end
9
6
  def get(value)
10
- value ? value.getlocal.to_date : 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
13
+ 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)
11
20
  end
12
21
  end
13
22
  end
@@ -3,13 +3,8 @@ 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
10
6
  def get(value)
11
- return nil if value.blank?
12
- ::Time.zone ? ::Time.parse(value.to_s).getlocal.to_datetime : value.to_datetime
7
+ super.try(:to_datetime)
13
8
  end
14
9
  end
15
10
  end
@@ -5,7 +5,11 @@ module Mongoid #:nodoc:
5
5
  module Conversions #:nodoc:
6
6
  def set(value)
7
7
  return nil if value.blank?
8
- value =~ /\d/ ? value.to_f : value
8
+ begin
9
+ Float(value)
10
+ rescue ArgumentError => e
11
+ puts(e.message); value
12
+ end
9
13
  end
10
14
  def get(value)
11
15
  value
@@ -18,10 +18,19 @@ module Mongoid #:nodoc:
18
18
  #
19
19
  # Returns: The child +Document+.
20
20
  def assimilate(parent, options, type = nil)
21
- klass = type ? type : options.klass
22
- child = klass.instantiate(:_parent => parent)
23
- child.write_attributes(self.merge("_type" => klass.name))
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)
24
32
  child.identify
33
+ child.reset_modifications
25
34
  child.assimilate(parent, options)
26
35
  end
27
36
  end
@@ -3,11 +3,41 @@ module Mongoid #:nodoc:
3
3
  module Extensions #:nodoc:
4
4
  module Hash #:nodoc:
5
5
  module Conversions #:nodoc:
6
- def get(value)
7
- value
6
+ extend ActiveSupport::Concern
7
+
8
+ module InstanceMethods #:nodoc:
9
+
10
+ # Get the difference between 2 hashes. This will give back a new hash
11
+ # with the keys and pairs of [ old, new ] values.
12
+ #
13
+ # Example:
14
+ #
15
+ # first = { :field => "value" }
16
+ # second = { :field => "new" }
17
+ # first.difference(second) # => { :field => [ "value", "new" ] }
18
+ #
19
+ # Returns:
20
+ #
21
+ # A +Hash+ of modifications.
22
+ def difference(other)
23
+ changes = {}
24
+ each_pair do |key, value|
25
+ if other.has_key?(key)
26
+ new_value = other[key]
27
+ changes[key] = [ value, new_value ] if new_value != value
28
+ end
29
+ end
30
+ changes
31
+ end
8
32
  end
9
- def set(value)
10
- value
33
+
34
+ module ClassMethods #:nodoc:
35
+ def get(value)
36
+ value
37
+ end
38
+ def set(value)
39
+ value
40
+ end
11
41
  end
12
42
  end
13
43
  end
@@ -5,7 +5,11 @@ module Mongoid #:nodoc:
5
5
  module Conversions #:nodoc:
6
6
  def set(value)
7
7
  return nil if value.blank?
8
- value =~ /\d/ ? value.to_i : value
8
+ begin
9
+ Integer(value)
10
+ rescue ArgumentError => e
11
+ puts(e.message); value
12
+ end
9
13
  end
10
14
  def get(value)
11
15
  value
@@ -7,6 +7,10 @@ module Mongoid #:nodoc:
7
7
  def assimilate(parent, options, type = nil)
8
8
  parent.remove_attribute(options.name); self
9
9
  end
10
+
11
+ def collectionize
12
+ to_s.collectionize
13
+ end
10
14
  end
11
15
  end
12
16
  end
@@ -8,17 +8,17 @@ module Mongoid #:nodoc:
8
8
  module InstanceMethods
9
9
  # Converts this object to a hash of attributes
10
10
  def mongoidize
11
- self.attributes
11
+ self.raw_attributes
12
12
  end
13
13
  end
14
14
 
15
15
  module ClassMethods
16
16
  def set(value)
17
- value.respond_to?(:attributes) ? value.attributes : value
17
+ value.respond_to?(:raw_attributes) ? value.raw_attributes : value
18
18
  end
19
19
 
20
20
  def get(value)
21
- self.new(value)
21
+ value ? self.instantiate(value) : value
22
22
  end
23
23
  end
24
24
  end
@@ -4,7 +4,7 @@ module Mongoid #:nodoc:
4
4
  module String #:nodoc:
5
5
  module Conversions #:nodoc:
6
6
  def set(value)
7
- value.to_s
7
+ value.to_s unless value.nil?
8
8
  end
9
9
  def get(value)
10
10
  value
@@ -23,9 +23,12 @@ module Mongoid #:nodoc:
23
23
  to_s.plural?
24
24
  end
25
25
 
26
- ["gt", "lt", "gte", "lte", "ne", "in", "nin", "mod", "all", "size", "exists"].each do |oper|
26
+ [ "gt", "lt", "gte", "lte", "ne", "near", "in", "nin", "mod", "all",
27
+ "size", "exists", "within", ["matches","elemMatch"] ].each do |oper|
28
+ m, oper = oper
29
+ oper = m unless oper
27
30
  class_eval <<-OPERATORS
28
- def #{oper}
31
+ def #{m}
29
32
  Criterion::Complex.new(:key => self, :operator => "#{oper}")
30
33
  end
31
34
  OPERATORS
@@ -0,0 +1,35 @@
1
+ module Mongoid #:nodoc:
2
+ module Extensions #:nodoc:
3
+ module TimeConversions #:nodoc:
4
+ def set(value)
5
+ return nil if value.blank?
6
+ time = convert_to_time(value)
7
+ strip_milliseconds(time).utc
8
+ end
9
+
10
+ def get(value)
11
+ return nil if value.blank?
12
+ if Mongoid::Config.instance.use_utc?
13
+ value
14
+ else
15
+ value.getlocal
16
+ end
17
+ end
18
+
19
+ protected
20
+
21
+ def strip_milliseconds(time)
22
+ ::Time.at(time.to_i)
23
+ end
24
+
25
+ def convert_to_time(value)
26
+ case value
27
+ when ::String then ::Time.parse(value)
28
+ when ::DateTime then ::Time.utc(value.year, value.month, value.day, value.hour, value.min, value.sec)
29
+ when ::Date then ::Time.utc(value.year, value.month, value.day)
30
+ else value
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -11,7 +11,8 @@ module Mongoid #:nodoc:
11
11
  #
12
12
  # klass: The class to instantiate from if _type is not present.
13
13
  # attributes: The +Document+ attributes.
14
- def self.build(klass, attrs)
14
+ def self.build(klass, attributes)
15
+ attrs = {}.merge(attributes)
15
16
  type = attrs["_type"]
16
17
  type ? type.constantize.instantiate(attrs) : klass.instantiate(attrs)
17
18
  end
@@ -18,7 +18,7 @@ module Mongoid #:nodoc:
18
18
  #
19
19
  # The primitive value or a copy of the default.
20
20
  def default
21
- (@default.is_a?(Array) || @default.is_a?(Hash)) ? @default.dup : @default
21
+ copy
22
22
  end
23
23
 
24
24
  # Create the new field with a name and optional additional options. Valid
@@ -33,7 +33,9 @@ module Mongoid #:nodoc:
33
33
  #
34
34
  # <tt>Field.new(:score, :default => 0)</tt>
35
35
  def initialize(name, options = {})
36
+ check_name!(name)
36
37
  @name, @default = name, options[:default]
38
+ @copyable = (@default.is_a?(Array) || @default.is_a?(Hash))
37
39
  @type = options[:type] || String
38
40
  @accessible = options.has_key?(:accessible) ? options[:accessible] : true
39
41
  end
@@ -41,12 +43,23 @@ module Mongoid #:nodoc:
41
43
  # Used for setting an object in the attributes hash. If nil is provided the
42
44
  # default will get returned if it exists.
43
45
  def set(object)
44
- object.nil? ? default : type.set(object)
46
+ type.set(object)
45
47
  end
46
48
 
47
49
  # Used for retrieving the object out of the attributes hash.
48
50
  def get(object)
49
51
  type.get(object)
50
52
  end
53
+
54
+ protected
55
+ # Slightly faster default check.
56
+ def copy
57
+ @copyable ? @default.dup : @default
58
+ end
59
+
60
+ # Check if the name is valid.
61
+ def check_name!(name)
62
+ raise Errors::InvalidField.new(name) if Mongoid.destructive_fields.include?(name.to_s)
63
+ end
51
64
  end
52
65
  end
@@ -44,6 +44,7 @@ module Mongoid #:nodoc
44
44
  meth = options.delete(:as) || name
45
45
  fields[name] = Field.new(name, options)
46
46
  create_accessors(name, meth, options)
47
+ add_dirty_methods(name)
47
48
  end
48
49
 
49
50
  # Create the field accessors.
@@ -55,7 +56,6 @@ module Mongoid #:nodoc
55
56
  (options[:type] == Boolean) ? attr == true : attr.present?
56
57
  end
57
58
  end
58
-
59
59
  end
60
60
  end
61
61
  end