mongoid 2.0.2 → 2.1.0

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 (240) hide show
  1. data/README.rdoc +3 -1
  2. data/Rakefile +3 -2
  3. data/lib/config/locales/bg.yml +6 -0
  4. data/lib/config/locales/de.yml +6 -0
  5. data/lib/config/locales/en-GB.yml +48 -0
  6. data/lib/config/locales/en.yml +6 -3
  7. data/lib/config/locales/es.yml +6 -0
  8. data/lib/config/locales/fr.yml +6 -0
  9. data/lib/config/locales/hi.yml +39 -0
  10. data/lib/config/locales/hu.yml +13 -7
  11. data/lib/config/locales/id.yml +3 -0
  12. data/lib/config/locales/it.yml +7 -1
  13. data/lib/config/locales/ja.yml +4 -1
  14. data/lib/config/locales/kr.yml +9 -34
  15. data/lib/config/locales/nl.yml +6 -0
  16. data/lib/config/locales/pl.yml +6 -0
  17. data/lib/config/locales/pt-BR.yml +6 -0
  18. data/lib/config/locales/pt.yml +6 -0
  19. data/lib/config/locales/ro.yml +6 -0
  20. data/lib/config/locales/ru.yml +6 -0
  21. data/lib/config/locales/sv.yml +6 -0
  22. data/lib/config/locales/vi.yml +3 -0
  23. data/lib/config/locales/zh-CN.yml +6 -0
  24. data/lib/mongoid.rb +51 -45
  25. data/lib/mongoid/atomic.rb +145 -0
  26. data/lib/mongoid/atomic/modifiers.rb +109 -0
  27. data/lib/mongoid/atomic/paths.rb +3 -0
  28. data/lib/mongoid/atomic/paths/embedded.rb +43 -0
  29. data/lib/mongoid/atomic/paths/embedded/many.rb +44 -0
  30. data/lib/mongoid/atomic/paths/embedded/one.rb +43 -0
  31. data/lib/mongoid/atomic/paths/root.rb +40 -0
  32. data/lib/mongoid/attributes.rb +12 -23
  33. data/lib/mongoid/attributes/processing.rb +5 -5
  34. data/lib/mongoid/callbacks.rb +2 -0
  35. data/lib/mongoid/collection.rb +12 -59
  36. data/lib/mongoid/collections.rb +23 -20
  37. data/lib/mongoid/collections/master.rb +6 -4
  38. data/lib/mongoid/collections/operations.rb +1 -0
  39. data/lib/mongoid/collections/retry.rb +7 -0
  40. data/lib/mongoid/components.rb +2 -2
  41. data/lib/mongoid/config.rb +42 -55
  42. data/lib/mongoid/config/database.rb +6 -2
  43. data/lib/mongoid/config/replset_database.rb +7 -3
  44. data/lib/mongoid/contexts.rb +9 -3
  45. data/lib/mongoid/contexts/enumerable.rb +7 -3
  46. data/lib/mongoid/contexts/mongo.rb +139 -101
  47. data/lib/mongoid/criteria.rb +86 -69
  48. data/lib/mongoid/criterion/complex.rb +32 -5
  49. data/lib/mongoid/criterion/inclusion.rb +4 -2
  50. data/lib/mongoid/criterion/optional.rb +111 -86
  51. data/lib/mongoid/criterion/selector.rb +8 -4
  52. data/lib/mongoid/cursor.rb +27 -27
  53. data/lib/mongoid/dirty.rb +54 -214
  54. data/lib/mongoid/document.rb +37 -39
  55. data/lib/mongoid/errors/document_not_found.rb +3 -4
  56. data/lib/mongoid/errors/invalid_collection.rb +2 -3
  57. data/lib/mongoid/errors/invalid_database.rb +2 -3
  58. data/lib/mongoid/errors/invalid_field.rb +2 -3
  59. data/lib/mongoid/errors/invalid_options.rb +19 -7
  60. data/lib/mongoid/errors/invalid_type.rb +2 -3
  61. data/lib/mongoid/errors/mongoid_error.rb +5 -6
  62. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +2 -3
  63. data/lib/mongoid/errors/unsupported_version.rb +2 -3
  64. data/lib/mongoid/errors/validations.rb +2 -3
  65. data/lib/mongoid/extensions.rb +8 -62
  66. data/lib/mongoid/extensions/array/deletion.rb +29 -0
  67. data/lib/mongoid/extensions/false_class/equality.rb +14 -1
  68. data/lib/mongoid/extensions/hash/criteria_helpers.rb +21 -10
  69. data/lib/mongoid/extensions/hash/scoping.rb +14 -1
  70. data/lib/mongoid/extensions/nil/collectionization.rb +12 -1
  71. data/lib/mongoid/extensions/object/reflections.rb +33 -2
  72. data/lib/mongoid/extensions/object_id/conversions.rb +2 -36
  73. data/lib/mongoid/extensions/proc/scoping.rb +14 -1
  74. data/lib/mongoid/extensions/string/conversions.rb +4 -16
  75. data/lib/mongoid/extensions/string/inflections.rb +35 -14
  76. data/lib/mongoid/extensions/symbol/inflections.rb +38 -12
  77. data/lib/mongoid/extensions/true_class/equality.rb +14 -1
  78. data/lib/mongoid/extras.rb +11 -30
  79. data/lib/mongoid/factory.rb +1 -1
  80. data/lib/mongoid/fields.rb +121 -29
  81. data/lib/mongoid/fields/mappings.rb +36 -0
  82. data/lib/mongoid/fields/serializable.rb +131 -0
  83. data/lib/mongoid/fields/serializable/array.rb +64 -0
  84. data/lib/mongoid/fields/serializable/big_decimal.rb +42 -0
  85. data/lib/mongoid/fields/serializable/bignum.rb +10 -0
  86. data/lib/mongoid/fields/serializable/binary.rb +11 -0
  87. data/lib/mongoid/fields/serializable/boolean.rb +44 -0
  88. data/lib/mongoid/fields/serializable/date.rb +51 -0
  89. data/lib/mongoid/fields/serializable/date_time.rb +28 -0
  90. data/lib/mongoid/fields/serializable/fixnum.rb +10 -0
  91. data/lib/mongoid/fields/serializable/float.rb +33 -0
  92. data/lib/mongoid/fields/serializable/foreign_keys/array.rb +56 -0
  93. data/lib/mongoid/fields/serializable/foreign_keys/object.rb +43 -0
  94. data/lib/mongoid/fields/serializable/hash.rb +25 -0
  95. data/lib/mongoid/fields/serializable/integer.rb +33 -0
  96. data/lib/mongoid/fields/serializable/object.rb +11 -0
  97. data/lib/mongoid/fields/serializable/object_id.rb +32 -0
  98. data/lib/mongoid/fields/serializable/range.rb +42 -0
  99. data/lib/mongoid/fields/serializable/set.rb +42 -0
  100. data/lib/mongoid/fields/serializable/string.rb +28 -0
  101. data/lib/mongoid/fields/serializable/symbol.rb +28 -0
  102. data/lib/mongoid/fields/serializable/time.rb +12 -0
  103. data/lib/mongoid/fields/serializable/time_with_zone.rb +12 -0
  104. data/lib/mongoid/fields/serializable/timekeeping.rb +102 -0
  105. data/lib/mongoid/finders.rb +61 -37
  106. data/lib/mongoid/hierarchy.rb +43 -8
  107. data/lib/mongoid/identity_map.rb +106 -0
  108. data/lib/mongoid/indexes.rb +17 -1
  109. data/lib/mongoid/javascript.rb +2 -3
  110. data/lib/mongoid/keys.rb +10 -21
  111. data/lib/mongoid/logger.rb +22 -1
  112. data/lib/mongoid/matchers/all.rb +10 -0
  113. data/lib/mongoid/matchers/default.rb +1 -1
  114. data/lib/mongoid/matchers/exists.rb +10 -0
  115. data/lib/mongoid/matchers/gt.rb +10 -0
  116. data/lib/mongoid/matchers/gte.rb +10 -0
  117. data/lib/mongoid/matchers/in.rb +10 -0
  118. data/lib/mongoid/matchers/lt.rb +10 -0
  119. data/lib/mongoid/matchers/lte.rb +10 -0
  120. data/lib/mongoid/matchers/ne.rb +10 -0
  121. data/lib/mongoid/matchers/nin.rb +10 -0
  122. data/lib/mongoid/matchers/or.rb +7 -4
  123. data/lib/mongoid/matchers/size.rb +10 -0
  124. data/lib/mongoid/multi_database.rb +26 -6
  125. data/lib/mongoid/multi_parameter_attributes.rb +40 -17
  126. data/lib/mongoid/named_scope.rb +1 -2
  127. data/lib/mongoid/nested_attributes.rb +4 -1
  128. data/lib/mongoid/observer.rb +108 -5
  129. data/lib/mongoid/paranoia.rb +26 -26
  130. data/lib/mongoid/persistence.rb +15 -21
  131. data/lib/mongoid/persistence/atomic.rb +135 -0
  132. data/lib/mongoid/persistence/atomic/add_to_set.rb +11 -8
  133. data/lib/mongoid/persistence/atomic/bit.rb +37 -0
  134. data/lib/mongoid/persistence/atomic/inc.rb +9 -6
  135. data/lib/mongoid/persistence/atomic/operation.rb +48 -7
  136. data/lib/mongoid/persistence/atomic/pop.rb +34 -0
  137. data/lib/mongoid/persistence/atomic/pull.rb +34 -0
  138. data/lib/mongoid/persistence/atomic/pull_all.rb +10 -9
  139. data/lib/mongoid/persistence/atomic/push.rb +8 -5
  140. data/lib/mongoid/persistence/atomic/push_all.rb +31 -0
  141. data/lib/mongoid/persistence/atomic/rename.rb +31 -0
  142. data/lib/mongoid/persistence/atomic/set.rb +30 -0
  143. data/lib/mongoid/persistence/atomic/unset.rb +28 -0
  144. data/lib/mongoid/persistence/deletion.rb +32 -0
  145. data/lib/mongoid/persistence/insertion.rb +41 -0
  146. data/lib/mongoid/persistence/modification.rb +37 -0
  147. data/lib/mongoid/persistence/operations.rb +214 -0
  148. data/lib/mongoid/persistence/operations/embedded/insert.rb +42 -0
  149. data/lib/mongoid/persistence/operations/embedded/remove.rb +40 -0
  150. data/lib/mongoid/persistence/operations/insert.rb +34 -0
  151. data/lib/mongoid/persistence/operations/remove.rb +33 -0
  152. data/lib/mongoid/persistence/operations/update.rb +53 -0
  153. data/lib/mongoid/railtie.rb +21 -33
  154. data/lib/mongoid/railties/database.rake +12 -12
  155. data/lib/mongoid/relations.rb +9 -5
  156. data/lib/mongoid/relations/accessors.rb +15 -36
  157. data/lib/mongoid/relations/auto_save.rb +2 -2
  158. data/lib/mongoid/relations/binding.rb +28 -1
  159. data/lib/mongoid/relations/bindings/embedded/in.rb +17 -30
  160. data/lib/mongoid/relations/bindings/embedded/many.rb +16 -21
  161. data/lib/mongoid/relations/bindings/embedded/one.rb +11 -16
  162. data/lib/mongoid/relations/bindings/referenced/in.rb +31 -32
  163. data/lib/mongoid/relations/bindings/referenced/many.rb +19 -61
  164. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -63
  165. data/lib/mongoid/relations/bindings/referenced/one.rb +18 -26
  166. data/lib/mongoid/relations/builder.rb +4 -2
  167. data/lib/mongoid/relations/builders.rb +21 -2
  168. data/lib/mongoid/relations/builders/embedded/in.rb +5 -1
  169. data/lib/mongoid/relations/builders/embedded/many.rb +12 -4
  170. data/lib/mongoid/relations/builders/embedded/one.rb +5 -1
  171. data/lib/mongoid/relations/builders/nested_attributes/many.rb +2 -2
  172. data/lib/mongoid/relations/builders/nested_attributes/one.rb +1 -1
  173. data/lib/mongoid/relations/builders/referenced/in.rb +2 -5
  174. data/lib/mongoid/relations/builders/referenced/many.rb +2 -3
  175. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +14 -5
  176. data/lib/mongoid/relations/builders/referenced/one.rb +2 -3
  177. data/lib/mongoid/relations/embedded/atomic.rb +2 -2
  178. data/lib/mongoid/relations/embedded/in.rb +72 -41
  179. data/lib/mongoid/relations/embedded/many.rb +116 -120
  180. data/lib/mongoid/relations/embedded/one.rb +59 -41
  181. data/lib/mongoid/relations/embedded/sort.rb +31 -0
  182. data/lib/mongoid/relations/macros.rb +28 -24
  183. data/lib/mongoid/relations/many.rb +10 -103
  184. data/lib/mongoid/relations/metadata.rb +335 -38
  185. data/lib/mongoid/relations/one.rb +7 -32
  186. data/lib/mongoid/relations/options.rb +47 -0
  187. data/lib/mongoid/relations/proxy.rb +29 -28
  188. data/lib/mongoid/relations/referenced/batch.rb +2 -3
  189. data/lib/mongoid/relations/referenced/in.rb +66 -53
  190. data/lib/mongoid/relations/referenced/many.rb +216 -143
  191. data/lib/mongoid/relations/referenced/many_to_many.rb +132 -163
  192. data/lib/mongoid/relations/referenced/one.rb +76 -58
  193. data/lib/mongoid/relations/synchronization.rb +113 -0
  194. data/lib/mongoid/relations/targets.rb +2 -0
  195. data/lib/mongoid/relations/targets/enumerable.rb +329 -0
  196. data/lib/mongoid/safety.rb +24 -156
  197. data/lib/mongoid/serialization.rb +21 -0
  198. data/lib/mongoid/state.rb +34 -0
  199. data/lib/mongoid/threaded.rb +175 -0
  200. data/lib/mongoid/timestamps/updated.rb +1 -1
  201. data/lib/mongoid/validations.rb +3 -7
  202. data/lib/mongoid/version.rb +1 -1
  203. data/lib/mongoid/versioning.rb +61 -7
  204. data/lib/rack/mongoid.rb +2 -0
  205. data/lib/rack/mongoid/middleware/identity_map.rb +38 -0
  206. data/lib/rails/generators/mongoid/model/model_generator.rb +1 -1
  207. data/lib/rails/generators/mongoid/model/templates/{model.rb → model.rb.tt} +0 -0
  208. data/lib/rails/generators/mongoid/observer/observer_generator.rb +1 -1
  209. data/lib/rails/generators/mongoid/observer/templates/{observer.rb → observer.rb.tt} +0 -0
  210. data/lib/rails/mongoid.rb +17 -17
  211. metadata +136 -102
  212. data/lib/mongoid/atomicity.rb +0 -111
  213. data/lib/mongoid/collections/cyclic_iterator.rb +0 -34
  214. data/lib/mongoid/collections/slaves.rb +0 -61
  215. data/lib/mongoid/extensions/array/conversions.rb +0 -23
  216. data/lib/mongoid/extensions/array/parentization.rb +0 -13
  217. data/lib/mongoid/extensions/big_decimal/conversions.rb +0 -19
  218. data/lib/mongoid/extensions/binary/conversions.rb +0 -17
  219. data/lib/mongoid/extensions/boolean/conversions.rb +0 -27
  220. data/lib/mongoid/extensions/date/conversions.rb +0 -25
  221. data/lib/mongoid/extensions/datetime/conversions.rb +0 -12
  222. data/lib/mongoid/extensions/float/conversions.rb +0 -20
  223. data/lib/mongoid/extensions/hash/conversions.rb +0 -19
  224. data/lib/mongoid/extensions/integer/conversions.rb +0 -20
  225. data/lib/mongoid/extensions/object/conversions.rb +0 -25
  226. data/lib/mongoid/extensions/range/conversions.rb +0 -25
  227. data/lib/mongoid/extensions/set/conversions.rb +0 -20
  228. data/lib/mongoid/extensions/symbol/conversions.rb +0 -21
  229. data/lib/mongoid/extensions/time_conversions.rb +0 -38
  230. data/lib/mongoid/field.rb +0 -162
  231. data/lib/mongoid/paths.rb +0 -61
  232. data/lib/mongoid/persistence/command.rb +0 -71
  233. data/lib/mongoid/persistence/insert.rb +0 -53
  234. data/lib/mongoid/persistence/insert_embedded.rb +0 -43
  235. data/lib/mongoid/persistence/remove.rb +0 -44
  236. data/lib/mongoid/persistence/remove_all.rb +0 -40
  237. data/lib/mongoid/persistence/remove_embedded.rb +0 -48
  238. data/lib/mongoid/persistence/update.rb +0 -77
  239. data/lib/mongoid/safe.rb +0 -23
  240. data/lib/mongoid/validations/referenced.rb +0 -58
@@ -0,0 +1,36 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc
3
+ module Fields #:nodoc:
4
+
5
+ # This module maps classes used in field type definitions to the custom
6
+ # definable field in Mongoid.
7
+ module Mappings
8
+ extend self
9
+
10
+ MODULE = "Mongoid::Fields::Serializable"
11
+
12
+ # Get the custom field type for the provided class used in the field
13
+ # definition.
14
+ #
15
+ # @example Get the mapping for the class.
16
+ # Mappings.for(BSON::ObjectId)
17
+ #
18
+ # @param [ Class ] klass The class to get the field type for.
19
+ #
20
+ # @return [ Class ] The class of the custom field.
21
+ #
22
+ # @since 2.1.0
23
+ def for(klass, foreign_key = false)
24
+ return Serializable::Object unless klass
25
+ if foreign_key
26
+ return "#{MODULE}::ForeignKeys::#{klass.to_s.demodulize}".constantize
27
+ end
28
+ begin
29
+ "#{MODULE}::#{klass.to_s.demodulize}".constantize
30
+ rescue NameError
31
+ klass
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,131 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Fields #:nodoc:
4
+
5
+ # Defines the behaviour for defined fields in the document.
6
+ #
7
+ # For people who want to have custom field types in their
8
+ # applications and want control over the serialization process
9
+ # to and from the domain model and MongoDB you will need to include
10
+ # this module in your custom type class. You will also need to define
11
+ # either a #serialize and #deserialize instance method, where previously
12
+ # these were a .set and .get class method respectively.
13
+ #
14
+ # class MyCustomType
15
+ # include Mongoid::Fields::Serializable
16
+ #
17
+ # def deserialize(object)
18
+ # # Do something to convert it from Mongo to my type.
19
+ # end
20
+ #
21
+ # def serialize(object)
22
+ # # Do something to convert from my type to MongoDB friendly.
23
+ # end
24
+ # end
25
+ module Serializable
26
+
27
+ # Set readers for the instance variables.
28
+ attr_reader :default_value, :label, :name, :options
29
+
30
+ # When reading the field do we need to cast the value? This holds true when
31
+ # times are stored or for big decimals which are stored as strings.
32
+ #
33
+ # @example Typecast on a read?
34
+ # field.cast_on_read?
35
+ #
36
+ # @return [ true, false ] If the field should be cast.
37
+ #
38
+ # @since 2.1.0
39
+ def cast_on_read?
40
+ return @cast_on_read if defined?(@cast_on_read)
41
+ @cast_on_read =
42
+ self.class.public_instance_methods(false).map do |m|
43
+ m.to_sym
44
+ end.include?(:deserialize)
45
+ end
46
+
47
+ # Get the default value for the field.
48
+ #
49
+ # @example Get the default.
50
+ # field.default
51
+ #
52
+ # @return [ Object ] The default value.
53
+ #
54
+ # @since 2.1.0
55
+ def default
56
+ if default_value.respond_to?(:call)
57
+ serialize(default_value.call)
58
+ else
59
+ serialize(default_value)
60
+ end
61
+ end
62
+
63
+ # Deserialize this field from the type stored in MongoDB to the type
64
+ # defined on the model
65
+ #
66
+ # @example Deserialize the field.
67
+ # field.deserialize(object)
68
+ #
69
+ # @param [ Object ] object The object to cast.
70
+ #
71
+ # @return [ Object ] The converted object.
72
+ #
73
+ # @since 2.1.0
74
+ def deserialize(object); object; end
75
+
76
+ # Create the new field with a name and optional additional options.
77
+ #
78
+ # @example Create the new field.
79
+ # Field.new(:name, :type => String)
80
+ #
81
+ # @param [ Hash ] options The field options.
82
+ #
83
+ # @option options [ Class ] :type The class of the field.
84
+ # @option options [ Object ] :default The default value for the field.
85
+ # @option options [ String ] :label The field's label.
86
+ #
87
+ # @since 2.1.0
88
+ def initialize(name, options = {})
89
+ @name, @options = name, options
90
+ @default_value, @label = options[:default], options[:label]
91
+ end
92
+
93
+ # Serialize the object from the type defined in the model to a MongoDB
94
+ # compatible object to store.
95
+ #
96
+ # @example Serialize the field.
97
+ # field.serialize(object)
98
+ #
99
+ # @param [ Object ] object The object to cast.
100
+ #
101
+ # @return [ Object ] The converted object.
102
+ #
103
+ # @since 2.1.0
104
+ def serialize(object); object; end
105
+
106
+ # Get the type of this field - inferred from the class name.
107
+ #
108
+ # @example Get the type.
109
+ # field.type
110
+ #
111
+ # @return [ Class ] The name of the class.
112
+ #
113
+ # @since 2.1.0
114
+ def type
115
+ @type ||= options[:type] || Object
116
+ end
117
+
118
+ # Is this field included in versioned attributes?
119
+ #
120
+ # @example Is the field versioned?
121
+ # field.versioned?
122
+ #
123
+ # @return [ true, false ] If the field is included in versioning.
124
+ #
125
+ # @since 2.1.0
126
+ def versioned?
127
+ @versioned ||= (options[:versioned].nil? ? true : options[:versioned])
128
+ end
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,64 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Fields #:nodoc:
4
+ module Serializable #:nodoc:
5
+
6
+ # Defines the behaviour for array fields.
7
+ class Array
8
+ include Serializable
9
+
10
+ # Get the default value for the field. If the default is a proc call
11
+ # it, otherwise clone the array.
12
+ #
13
+ # @example Get the default.
14
+ # field.default
15
+ #
16
+ # @return [ Object ] The default value.
17
+ #
18
+ # @since 2.1.0
19
+ def default
20
+ return nil unless default_value
21
+ default_value.respond_to?(:call) ? default_value.call : default_value.dup
22
+ end
23
+
24
+ # Serialize the object from the type defined in the model to a MongoDB
25
+ # compatible object to store.
26
+ #
27
+ # @example Serialize the field.
28
+ # field.serialize(object)
29
+ #
30
+ # @param [ Object ] object The object to cast.
31
+ #
32
+ # @return [ Array ] The converted object.
33
+ #
34
+ # @since 2.1.0
35
+ def serialize(object)
36
+ raise_or_return(object)
37
+ end
38
+ alias :set :serialize
39
+
40
+ protected
41
+
42
+ # If the value is not an array or nil we will raise an error,
43
+ # otherwise return the value.
44
+ #
45
+ # @example Raise or return the value.
46
+ # field.raise_or_return([])
47
+ #
48
+ # @param [ Object ] value The value to check.a
49
+ #
50
+ # @raise [ InvalidType ] If not passed an array.
51
+ #
52
+ # @return [ Array ] The array.
53
+ #
54
+ # @since 2.1.0
55
+ def raise_or_return(value)
56
+ unless value.nil? || value.is_a?(::Array)
57
+ raise Mongoid::Errors::InvalidType.new(::Array, value)
58
+ end
59
+ value
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,42 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Fields #:nodoc:
4
+ module Serializable #:nodoc:
5
+
6
+ # Defines the behaviour for big decimal fields.
7
+ class BigDecimal
8
+ include Serializable
9
+
10
+ # Deserialize this field from the type stored in MongoDB to the type
11
+ # defined on the model.
12
+ #
13
+ # @example Deserialize the field.
14
+ # field.deserialize(object)
15
+ #
16
+ # @param [ Object ] object The object to cast.
17
+ #
18
+ # @return [ BigDecimal ] The converted big decimal.
19
+ #
20
+ # @since 2.1.0
21
+ def deserialize(object)
22
+ object ? ::BigDecimal.new(object) : object
23
+ end
24
+
25
+ # Serialize the object from the type defined in the model to a MongoDB
26
+ # compatible object to store.
27
+ #
28
+ # @example Serialize the field.
29
+ # field.serialize(object)
30
+ #
31
+ # @param [ Object ] object The object to cast.
32
+ #
33
+ # @return [ String ] The converted string.
34
+ #
35
+ # @since 2.1.0
36
+ def serialize(object)
37
+ object ? object.to_s : object
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,10 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Fields #:nodoc:
4
+ module Serializable #:nodoc:
5
+ # Defines the behaviour for bignum fields.
6
+ class Bignum < Integer
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Fields #:nodoc:
4
+ module Serializable #:nodoc:
5
+ # Defines the behaviour for binary fields.
6
+ class Binary
7
+ include Serializable
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,44 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Fields #:nodoc:
4
+ module Serializable #:nodoc:
5
+
6
+ # Defines the behaviour for boolean fields.
7
+ class Boolean
8
+ include Serializable
9
+
10
+ MAPPINGS = {
11
+ true => true,
12
+ "true" => true,
13
+ "TRUE" => true,
14
+ "1" => true,
15
+ 1 => true,
16
+ 1.0 => true,
17
+ false => false,
18
+ "false" => false,
19
+ "FALSE" => false,
20
+ "0" => false,
21
+ 0 => false,
22
+ 0.0 => false
23
+ }
24
+
25
+ # Serialize the object from the type defined in the model to a MongoDB
26
+ # compatible object to store.
27
+ #
28
+ # @example Serialize the field.
29
+ # field.serialize(object)
30
+ #
31
+ # @param [ Object ] object The object to cast.
32
+ #
33
+ # @return [ true, false ] The converted boolean.
34
+ #
35
+ # @since 2.1.0
36
+ def serialize(object)
37
+ object = MAPPINGS[object]
38
+ object.nil? ? nil : object
39
+ end
40
+ alias :set :serialize
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,51 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Fields #:nodoc:
4
+ module Serializable #:nodoc:
5
+
6
+ # Defines the behaviour for date fields.
7
+ class Date
8
+ include Serializable
9
+ include Timekeeping
10
+
11
+ # Deserialize this field from the type stored in MongoDB to the type
12
+ # defined on the model.
13
+ #
14
+ # @example Deserialize the field.
15
+ # field.deserialize(object)
16
+ #
17
+ # @param [ Object ] object The object to cast.
18
+ #
19
+ # @return [ Date ] The converted date.
20
+ #
21
+ # @since 2.1.0
22
+ def deserialize(object)
23
+ return nil if object.blank?
24
+ if Mongoid::Config.use_utc?
25
+ object.to_date
26
+ else
27
+ ::Date.new(object.year, object.month, object.day)
28
+ end
29
+ end
30
+
31
+ protected
32
+
33
+ # Converts the date to a time to persist.
34
+ #
35
+ # @example Convert the date to a time.
36
+ # Date.convert_to_time(date)
37
+ #
38
+ # @param [ Date ] value The date to convert.
39
+ #
40
+ # @return [ Time ] The date converted.
41
+ #
42
+ # @since 2.1.0
43
+ def convert_to_time(value)
44
+ value = ::Date.parse(value) if value.is_a?(::String)
45
+ value = ::Date.civil(*value) if value.is_a?(::Array)
46
+ ::Time.utc(value.year, value.month, value.day)
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,28 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Fields #:nodoc:
4
+ module Serializable #:nodoc:
5
+
6
+ # Defines the behaviour for date time fields.
7
+ class DateTime
8
+ include Serializable
9
+ include Timekeeping
10
+
11
+ # Deserialize this field from the type stored in MongoDB to the type
12
+ # defined on the model.
13
+ #
14
+ # @example Deserialize the field.
15
+ # field.deserialize(object)
16
+ #
17
+ # @param [ Object ] object The object to cast.
18
+ #
19
+ # @return [ DateTime ] The converted date time.
20
+ #
21
+ # @since 2.1.0
22
+ def deserialize(object)
23
+ object.try(:to_datetime)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,10 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Fields #:nodoc:
4
+ module Serializable #:nodoc:
5
+ # Defines the behaviour for fixnum fields.
6
+ class Fixnum < Integer
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,33 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Fields #:nodoc:
4
+ module Serializable #:nodoc:
5
+
6
+ # Defines the behaviour for float fields.
7
+ class Float
8
+ include Serializable
9
+
10
+ # Serialize the object from the type defined in the model to a MongoDB
11
+ # compatible object to store.
12
+ #
13
+ # @example Serialize the field.
14
+ # field.serialize(object)
15
+ #
16
+ # @param [ Object ] object The object to cast.
17
+ #
18
+ # @return [ Float ] The converted float.
19
+ #
20
+ # @since 2.1.0
21
+ def serialize(object)
22
+ return nil if object.blank?
23
+ begin
24
+ Float(object)
25
+ rescue ArgumentError => e
26
+ object
27
+ end
28
+ end
29
+ alias :set :serialize
30
+ end
31
+ end
32
+ end
33
+ end