mongoid 1.2.14 → 1.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (200) hide show
  1. data/lib/mongoid.rb +10 -3
  2. data/lib/mongoid/associations.rb +133 -97
  3. data/lib/mongoid/associations/belongs_to_related.rb +2 -3
  4. data/lib/mongoid/associations/{belongs_to.rb → embedded_in.rb} +14 -6
  5. data/lib/mongoid/associations/{has_many.rb → embeds_many.rb} +89 -31
  6. data/lib/mongoid/associations/{has_one.rb → embeds_one.rb} +8 -7
  7. data/lib/mongoid/associations/has_many_related.rb +52 -7
  8. data/lib/mongoid/associations/has_one_related.rb +8 -4
  9. data/lib/mongoid/associations/meta_data.rb +2 -1
  10. data/lib/mongoid/associations/options.rb +6 -1
  11. data/lib/mongoid/associations/proxy.rb +14 -21
  12. data/lib/mongoid/attributes.rb +27 -12
  13. data/lib/mongoid/collection.rb +4 -3
  14. data/lib/mongoid/collections.rb +41 -0
  15. data/lib/mongoid/collections/master.rb +3 -2
  16. data/lib/mongoid/collections/slaves.rb +3 -2
  17. data/lib/mongoid/components.rb +21 -19
  18. data/lib/mongoid/concern.rb +31 -0
  19. data/lib/mongoid/config.rb +117 -12
  20. data/lib/mongoid/contexts.rb +1 -1
  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/criterion/inclusion.rb +17 -0
  25. data/lib/mongoid/criterion/optional.rb +1 -1
  26. data/lib/mongoid/dirty.rb +253 -0
  27. data/lib/mongoid/document.rb +81 -52
  28. data/lib/mongoid/errors.rb +32 -1
  29. data/lib/mongoid/extensions.rb +11 -9
  30. data/lib/mongoid/extensions/big_decimal/conversions.rb +2 -2
  31. data/lib/mongoid/extensions/boolean/conversions.rb +8 -2
  32. data/lib/mongoid/extensions/date/conversions.rb +13 -4
  33. data/lib/mongoid/extensions/datetime/conversions.rb +1 -6
  34. data/lib/mongoid/extensions/float/conversions.rb +5 -1
  35. data/lib/mongoid/extensions/hash/assimilation.rb +12 -3
  36. data/lib/mongoid/extensions/hash/conversions.rb +34 -4
  37. data/lib/mongoid/extensions/integer/conversions.rb +5 -1
  38. data/lib/mongoid/extensions/nil/assimilation.rb +4 -0
  39. data/lib/mongoid/extensions/object/conversions.rb +1 -1
  40. data/lib/mongoid/extensions/string/conversions.rb +1 -1
  41. data/lib/mongoid/extensions/symbol/inflections.rb +1 -1
  42. data/lib/mongoid/extensions/time_conversions.rb +35 -0
  43. data/lib/mongoid/extras.rb +6 -9
  44. data/lib/mongoid/factory.rb +2 -1
  45. data/lib/mongoid/field.rb +9 -2
  46. data/lib/mongoid/fields.rb +1 -0
  47. data/lib/mongoid/identity.rb +3 -3
  48. data/lib/mongoid/indexes.rb +3 -3
  49. data/lib/mongoid/memoization.rb +8 -2
  50. data/lib/mongoid/named_scope.rb +0 -3
  51. data/lib/mongoid/observable.rb +30 -0
  52. data/lib/mongoid/paths.rb +62 -0
  53. data/lib/mongoid/persistence.rb +222 -0
  54. data/lib/mongoid/persistence/command.rb +39 -0
  55. data/lib/mongoid/persistence/insert.rb +50 -0
  56. data/lib/mongoid/persistence/insert_embedded.rb +38 -0
  57. data/lib/mongoid/persistence/remove.rb +39 -0
  58. data/lib/mongoid/persistence/remove_all.rb +37 -0
  59. data/lib/mongoid/persistence/remove_embedded.rb +50 -0
  60. data/lib/mongoid/persistence/update.rb +63 -0
  61. data/lib/mongoid/state.rb +28 -21
  62. data/lib/mongoid/timestamps.rb +5 -8
  63. data/lib/mongoid/version.rb +4 -0
  64. data/lib/mongoid/versioning.rb +6 -7
  65. metadata +81 -300
  66. data/.gitignore +0 -6
  67. data/.watchr +0 -29
  68. data/Rakefile +0 -53
  69. data/VERSION +0 -1
  70. data/caliper.yml +0 -4
  71. data/lib/mongoid/collections/mimic.rb +0 -46
  72. data/lib/mongoid/commands.rb +0 -174
  73. data/lib/mongoid/commands/create.rb +0 -21
  74. data/lib/mongoid/commands/delete.rb +0 -16
  75. data/lib/mongoid/commands/delete_all.rb +0 -23
  76. data/lib/mongoid/commands/deletion.rb +0 -18
  77. data/lib/mongoid/commands/destroy.rb +0 -19
  78. data/lib/mongoid/commands/destroy_all.rb +0 -23
  79. data/lib/mongoid/commands/save.rb +0 -27
  80. data/lib/mongoid/extensions/time/conversions.rb +0 -18
  81. data/mongoid.gemspec +0 -395
  82. data/perf/benchmark.rb +0 -77
  83. data/spec/integration/mongoid/associations_spec.rb +0 -340
  84. data/spec/integration/mongoid/attributes_spec.rb +0 -22
  85. data/spec/integration/mongoid/commands_spec.rb +0 -218
  86. data/spec/integration/mongoid/contexts/enumerable_spec.rb +0 -33
  87. data/spec/integration/mongoid/criteria_spec.rb +0 -272
  88. data/spec/integration/mongoid/document_spec.rb +0 -593
  89. data/spec/integration/mongoid/extensions_spec.rb +0 -26
  90. data/spec/integration/mongoid/finders_spec.rb +0 -119
  91. data/spec/integration/mongoid/inheritance_spec.rb +0 -137
  92. data/spec/integration/mongoid/named_scope_spec.rb +0 -46
  93. data/spec/models/address.rb +0 -39
  94. data/spec/models/animal.rb +0 -6
  95. data/spec/models/callbacks.rb +0 -18
  96. data/spec/models/comment.rb +0 -8
  97. data/spec/models/country_code.rb +0 -6
  98. data/spec/models/employer.rb +0 -5
  99. data/spec/models/game.rb +0 -7
  100. data/spec/models/inheritance.rb +0 -56
  101. data/spec/models/location.rb +0 -5
  102. data/spec/models/mixed_drink.rb +0 -4
  103. data/spec/models/name.rb +0 -13
  104. data/spec/models/namespacing.rb +0 -11
  105. data/spec/models/patient.rb +0 -4
  106. data/spec/models/person.rb +0 -99
  107. data/spec/models/pet.rb +0 -7
  108. data/spec/models/pet_owner.rb +0 -6
  109. data/spec/models/phone.rb +0 -7
  110. data/spec/models/post.rb +0 -15
  111. data/spec/models/translation.rb +0 -5
  112. data/spec/models/vet_visit.rb +0 -5
  113. data/spec/spec.opts +0 -3
  114. data/spec/spec_helper.rb +0 -31
  115. data/spec/unit/mongoid/associations/belongs_to_related_spec.rb +0 -145
  116. data/spec/unit/mongoid/associations/belongs_to_spec.rb +0 -193
  117. data/spec/unit/mongoid/associations/has_many_related_spec.rb +0 -420
  118. data/spec/unit/mongoid/associations/has_many_spec.rb +0 -519
  119. data/spec/unit/mongoid/associations/has_one_related_spec.rb +0 -179
  120. data/spec/unit/mongoid/associations/has_one_spec.rb +0 -282
  121. data/spec/unit/mongoid/associations/meta_data_spec.rb +0 -88
  122. data/spec/unit/mongoid/associations/options_spec.rb +0 -192
  123. data/spec/unit/mongoid/associations_spec.rb +0 -595
  124. data/spec/unit/mongoid/attributes_spec.rb +0 -507
  125. data/spec/unit/mongoid/callbacks_spec.rb +0 -55
  126. data/spec/unit/mongoid/collection_spec.rb +0 -187
  127. data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +0 -75
  128. data/spec/unit/mongoid/collections/master_spec.rb +0 -41
  129. data/spec/unit/mongoid/collections/mimic_spec.rb +0 -43
  130. data/spec/unit/mongoid/collections/slaves_spec.rb +0 -81
  131. data/spec/unit/mongoid/commands/create_spec.rb +0 -30
  132. data/spec/unit/mongoid/commands/delete_all_spec.rb +0 -58
  133. data/spec/unit/mongoid/commands/delete_spec.rb +0 -38
  134. data/spec/unit/mongoid/commands/destroy_all_spec.rb +0 -23
  135. data/spec/unit/mongoid/commands/destroy_spec.rb +0 -50
  136. data/spec/unit/mongoid/commands/save_spec.rb +0 -105
  137. data/spec/unit/mongoid/commands_spec.rb +0 -275
  138. data/spec/unit/mongoid/config_spec.rb +0 -172
  139. data/spec/unit/mongoid/contexts/enumerable_spec.rb +0 -421
  140. data/spec/unit/mongoid/contexts/mongo_spec.rb +0 -682
  141. data/spec/unit/mongoid/contexts_spec.rb +0 -25
  142. data/spec/unit/mongoid/criteria_spec.rb +0 -824
  143. data/spec/unit/mongoid/criterion/complex_spec.rb +0 -19
  144. data/spec/unit/mongoid/criterion/exclusion_spec.rb +0 -91
  145. data/spec/unit/mongoid/criterion/inclusion_spec.rb +0 -219
  146. data/spec/unit/mongoid/criterion/optional_spec.rb +0 -319
  147. data/spec/unit/mongoid/cursor_spec.rb +0 -74
  148. data/spec/unit/mongoid/deprecation_spec.rb +0 -24
  149. data/spec/unit/mongoid/document_spec.rb +0 -952
  150. data/spec/unit/mongoid/errors_spec.rb +0 -103
  151. data/spec/unit/mongoid/extensions/array/accessors_spec.rb +0 -50
  152. data/spec/unit/mongoid/extensions/array/assimilation_spec.rb +0 -24
  153. data/spec/unit/mongoid/extensions/array/conversions_spec.rb +0 -35
  154. data/spec/unit/mongoid/extensions/array/parentization_spec.rb +0 -20
  155. data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +0 -22
  156. data/spec/unit/mongoid/extensions/binary/conversions_spec.rb +0 -22
  157. data/spec/unit/mongoid/extensions/boolean/conversions_spec.rb +0 -49
  158. data/spec/unit/mongoid/extensions/date/conversions_spec.rb +0 -102
  159. data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +0 -70
  160. data/spec/unit/mongoid/extensions/float/conversions_spec.rb +0 -61
  161. data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +0 -184
  162. data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +0 -46
  163. data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +0 -21
  164. data/spec/unit/mongoid/extensions/hash/criteria_helpers_spec.rb +0 -17
  165. data/spec/unit/mongoid/extensions/hash/scoping_spec.rb +0 -14
  166. data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +0 -61
  167. data/spec/unit/mongoid/extensions/nil/assimilation_spec.rb +0 -24
  168. data/spec/unit/mongoid/extensions/object/conversions_spec.rb +0 -57
  169. data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +0 -34
  170. data/spec/unit/mongoid/extensions/string/conversions_spec.rb +0 -17
  171. data/spec/unit/mongoid/extensions/string/inflections_spec.rb +0 -208
  172. data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +0 -91
  173. data/spec/unit/mongoid/extensions/time/conversions_spec.rb +0 -70
  174. data/spec/unit/mongoid/extras_spec.rb +0 -102
  175. data/spec/unit/mongoid/factory_spec.rb +0 -31
  176. data/spec/unit/mongoid/field_spec.rb +0 -143
  177. data/spec/unit/mongoid/fields_spec.rb +0 -181
  178. data/spec/unit/mongoid/finders_spec.rb +0 -404
  179. data/spec/unit/mongoid/identity_spec.rb +0 -109
  180. data/spec/unit/mongoid/indexes_spec.rb +0 -93
  181. data/spec/unit/mongoid/javascript_spec.rb +0 -48
  182. data/spec/unit/mongoid/matchers/all_spec.rb +0 -27
  183. data/spec/unit/mongoid/matchers/default_spec.rb +0 -27
  184. data/spec/unit/mongoid/matchers/exists_spec.rb +0 -56
  185. data/spec/unit/mongoid/matchers/gt_spec.rb +0 -39
  186. data/spec/unit/mongoid/matchers/gte_spec.rb +0 -49
  187. data/spec/unit/mongoid/matchers/in_spec.rb +0 -27
  188. data/spec/unit/mongoid/matchers/lt_spec.rb +0 -39
  189. data/spec/unit/mongoid/matchers/lte_spec.rb +0 -49
  190. data/spec/unit/mongoid/matchers/ne_spec.rb +0 -27
  191. data/spec/unit/mongoid/matchers/nin_spec.rb +0 -27
  192. data/spec/unit/mongoid/matchers/size_spec.rb +0 -27
  193. data/spec/unit/mongoid/matchers_spec.rb +0 -329
  194. data/spec/unit/mongoid/memoization_spec.rb +0 -75
  195. data/spec/unit/mongoid/named_scope_spec.rb +0 -123
  196. data/spec/unit/mongoid/scope_spec.rb +0 -240
  197. data/spec/unit/mongoid/state_spec.rb +0 -83
  198. data/spec/unit/mongoid/timestamps_spec.rb +0 -25
  199. data/spec/unit/mongoid/versioning_spec.rb +0 -41
  200. 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,22 @@ 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
76
107
  end
77
108
  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
@@ -24,7 +24,7 @@ module Mongoid #:nodoc:
24
24
  end
25
25
 
26
26
  def get(value)
27
- self.new(value)
27
+ value ? self.new(value) : value
28
28
  end
29
29
  end
30
30
  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,7 +23,7 @@ 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", "size", "exists", "within"].each do |oper|
27
27
  class_eval <<-OPERATORS
28
28
  def #{oper}
29
29
  Criterion::Complex.new(:key => self, :operator => "#{oper}")
@@ -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
@@ -1,15 +1,12 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid #:nodoc:
3
3
  module Extras #:nodoc:
4
- def self.included(base)
5
- base.class_eval do
6
- extend ClassMethods
7
- class_inheritable_accessor :cached, :enslaved
8
- self.cached = false
9
- self.enslaved = false
10
-
11
- delegate :cached?, :enslaved?, :to => "self.class"
12
- end
4
+ extend ActiveSupport::Concern
5
+ included do
6
+ class_inheritable_accessor :cached, :enslaved
7
+ self.cached = false
8
+ self.enslaved = false
9
+ delegate :cached?, :enslaved?, :to => "self.class"
13
10
  end
14
11
 
15
12
  module ClassMethods #:nodoc
@@ -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
@@ -34,6 +34,7 @@ module Mongoid #:nodoc:
34
34
  # <tt>Field.new(:score, :default => 0)</tt>
35
35
  def initialize(name, options = {})
36
36
  @name, @default = name, options[:default]
37
+ @copyable = (@default.is_a?(Array) || @default.is_a?(Hash))
37
38
  @type = options[:type] || String
38
39
  @accessible = options.has_key?(:accessible) ? options[:accessible] : true
39
40
  end
@@ -41,12 +42,18 @@ module Mongoid #:nodoc:
41
42
  # Used for setting an object in the attributes hash. If nil is provided the
42
43
  # default will get returned if it exists.
43
44
  def set(object)
44
- object.nil? ? default : type.set(object)
45
+ type.set(object)
45
46
  end
46
47
 
47
48
  # Used for retrieving the object out of the attributes hash.
48
49
  def get(object)
49
50
  type.get(object)
50
51
  end
52
+
53
+ protected
54
+ # Slightly faster default check.
55
+ def copy
56
+ @copyable ? @default.dup : @default
57
+ end
51
58
  end
52
59
  end
@@ -47,6 +47,7 @@ module Mongoid #:nodoc
47
47
  meth = options.delete(:as) || name
48
48
  fields[name] = Field.new(name, options)
49
49
  create_accessors(name, meth, options)
50
+ add_dirty_methods(name)
50
51
  end
51
52
 
52
53
  # Create the field accessors.
@@ -15,19 +15,19 @@ module Mongoid #:nodoc:
15
15
  protected
16
16
  # Return the proper id for the document.
17
17
  def generate_id
18
- id = Mongo::ObjectID.new
18
+ id = BSON::ObjectID.new
19
19
  Mongoid.use_object_ids ? id : id.to_s
20
20
  end
21
21
 
22
22
  # Set the id for the document.
23
23
  def identify(doc)
24
24
  doc.id = compose(doc).join(" ").identify if doc.primary_key
25
- doc.id = generate_id unless doc.id
25
+ doc.id = generate_id if doc.id.blank?
26
26
  end
27
27
 
28
28
  # Set the _type field on the document.
29
29
  def type(doc)
30
- doc._type = doc.class.name if Mongoid.persist_types
30
+ doc._type = doc.class.name if doc.hereditary?
31
31
  end
32
32
 
33
33
  # Generates the composite key for a document.