mongoid 2.0.0.alpha → 2.0.0.beta.5

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