mongoid-multi-db 3.0.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 (276) hide show
  1. data/CHANGELOG.md +615 -0
  2. data/LICENSE +20 -0
  3. data/README.md +62 -0
  4. data/Rakefile +49 -0
  5. data/lib/config/locales/bg.yml +54 -0
  6. data/lib/config/locales/de.yml +54 -0
  7. data/lib/config/locales/en-GB.yml +55 -0
  8. data/lib/config/locales/en.yml +55 -0
  9. data/lib/config/locales/es.yml +52 -0
  10. data/lib/config/locales/fr.yml +55 -0
  11. data/lib/config/locales/hi.yml +46 -0
  12. data/lib/config/locales/hu.yml +57 -0
  13. data/lib/config/locales/id.yml +55 -0
  14. data/lib/config/locales/it.yml +52 -0
  15. data/lib/config/locales/ja.yml +50 -0
  16. data/lib/config/locales/kr.yml +47 -0
  17. data/lib/config/locales/nl.yml +52 -0
  18. data/lib/config/locales/pl.yml +52 -0
  19. data/lib/config/locales/pt-BR.yml +53 -0
  20. data/lib/config/locales/pt.yml +53 -0
  21. data/lib/config/locales/ro.yml +59 -0
  22. data/lib/config/locales/ru.yml +54 -0
  23. data/lib/config/locales/sv.yml +53 -0
  24. data/lib/config/locales/vi.yml +55 -0
  25. data/lib/config/locales/zh-CN.yml +46 -0
  26. data/lib/mongoid.rb +148 -0
  27. data/lib/mongoid/atomic.rb +230 -0
  28. data/lib/mongoid/atomic/modifiers.rb +243 -0
  29. data/lib/mongoid/atomic/paths.rb +3 -0
  30. data/lib/mongoid/atomic/paths/embedded.rb +43 -0
  31. data/lib/mongoid/atomic/paths/embedded/many.rb +44 -0
  32. data/lib/mongoid/atomic/paths/embedded/one.rb +43 -0
  33. data/lib/mongoid/atomic/paths/root.rb +40 -0
  34. data/lib/mongoid/attributes.rb +234 -0
  35. data/lib/mongoid/attributes/processing.rb +146 -0
  36. data/lib/mongoid/callbacks.rb +135 -0
  37. data/lib/mongoid/collection.rb +153 -0
  38. data/lib/mongoid/collection_proxy.rb +59 -0
  39. data/lib/mongoid/collections.rb +120 -0
  40. data/lib/mongoid/collections/master.rb +45 -0
  41. data/lib/mongoid/collections/operations.rb +44 -0
  42. data/lib/mongoid/collections/retry.rb +46 -0
  43. data/lib/mongoid/components.rb +96 -0
  44. data/lib/mongoid/config.rb +347 -0
  45. data/lib/mongoid/config/database.rb +186 -0
  46. data/lib/mongoid/config/replset_database.rb +82 -0
  47. data/lib/mongoid/connection_proxy.rb +30 -0
  48. data/lib/mongoid/contexts.rb +25 -0
  49. data/lib/mongoid/contexts/enumerable.rb +288 -0
  50. data/lib/mongoid/contexts/enumerable/sort.rb +43 -0
  51. data/lib/mongoid/contexts/mongo.rb +409 -0
  52. data/lib/mongoid/copyable.rb +48 -0
  53. data/lib/mongoid/criteria.rb +418 -0
  54. data/lib/mongoid/criterion/builder.rb +34 -0
  55. data/lib/mongoid/criterion/complex.rb +84 -0
  56. data/lib/mongoid/criterion/creational.rb +34 -0
  57. data/lib/mongoid/criterion/exclusion.rb +108 -0
  58. data/lib/mongoid/criterion/inclusion.rb +305 -0
  59. data/lib/mongoid/criterion/inspection.rb +22 -0
  60. data/lib/mongoid/criterion/optional.rb +232 -0
  61. data/lib/mongoid/criterion/selector.rb +153 -0
  62. data/lib/mongoid/cursor.rb +86 -0
  63. data/lib/mongoid/database_proxy.rb +97 -0
  64. data/lib/mongoid/default_scope.rb +36 -0
  65. data/lib/mongoid/dirty.rb +110 -0
  66. data/lib/mongoid/document.rb +280 -0
  67. data/lib/mongoid/errors.rb +17 -0
  68. data/lib/mongoid/errors/callback.rb +26 -0
  69. data/lib/mongoid/errors/document_not_found.rb +28 -0
  70. data/lib/mongoid/errors/eager_load.rb +25 -0
  71. data/lib/mongoid/errors/invalid_collection.rb +18 -0
  72. data/lib/mongoid/errors/invalid_database.rb +19 -0
  73. data/lib/mongoid/errors/invalid_field.rb +18 -0
  74. data/lib/mongoid/errors/invalid_find.rb +19 -0
  75. data/lib/mongoid/errors/invalid_options.rb +28 -0
  76. data/lib/mongoid/errors/invalid_time.rb +25 -0
  77. data/lib/mongoid/errors/invalid_type.rb +25 -0
  78. data/lib/mongoid/errors/mixed_relations.rb +37 -0
  79. data/lib/mongoid/errors/mongoid_error.rb +26 -0
  80. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +20 -0
  81. data/lib/mongoid/errors/unsaved_document.rb +23 -0
  82. data/lib/mongoid/errors/unsupported_version.rb +20 -0
  83. data/lib/mongoid/errors/validations.rb +23 -0
  84. data/lib/mongoid/extensions.rb +82 -0
  85. data/lib/mongoid/extensions/array/deletion.rb +29 -0
  86. data/lib/mongoid/extensions/false_class/equality.rb +26 -0
  87. data/lib/mongoid/extensions/hash/criteria_helpers.rb +45 -0
  88. data/lib/mongoid/extensions/hash/scoping.rb +25 -0
  89. data/lib/mongoid/extensions/integer/checks.rb +23 -0
  90. data/lib/mongoid/extensions/nil/collectionization.rb +23 -0
  91. data/lib/mongoid/extensions/object/checks.rb +29 -0
  92. data/lib/mongoid/extensions/object/reflections.rb +48 -0
  93. data/lib/mongoid/extensions/object/substitutable.rb +15 -0
  94. data/lib/mongoid/extensions/object/yoda.rb +44 -0
  95. data/lib/mongoid/extensions/object_id/conversions.rb +60 -0
  96. data/lib/mongoid/extensions/proc/scoping.rb +25 -0
  97. data/lib/mongoid/extensions/string/checks.rb +36 -0
  98. data/lib/mongoid/extensions/string/conversions.rb +22 -0
  99. data/lib/mongoid/extensions/string/inflections.rb +118 -0
  100. data/lib/mongoid/extensions/symbol/checks.rb +23 -0
  101. data/lib/mongoid/extensions/symbol/inflections.rb +66 -0
  102. data/lib/mongoid/extensions/true_class/equality.rb +26 -0
  103. data/lib/mongoid/extras.rb +31 -0
  104. data/lib/mongoid/factory.rb +46 -0
  105. data/lib/mongoid/fields.rb +332 -0
  106. data/lib/mongoid/fields/mappings.rb +41 -0
  107. data/lib/mongoid/fields/serializable.rb +201 -0
  108. data/lib/mongoid/fields/serializable/array.rb +49 -0
  109. data/lib/mongoid/fields/serializable/big_decimal.rb +42 -0
  110. data/lib/mongoid/fields/serializable/bignum.rb +10 -0
  111. data/lib/mongoid/fields/serializable/binary.rb +11 -0
  112. data/lib/mongoid/fields/serializable/boolean.rb +43 -0
  113. data/lib/mongoid/fields/serializable/date.rb +51 -0
  114. data/lib/mongoid/fields/serializable/date_time.rb +28 -0
  115. data/lib/mongoid/fields/serializable/fixnum.rb +10 -0
  116. data/lib/mongoid/fields/serializable/float.rb +32 -0
  117. data/lib/mongoid/fields/serializable/foreign_keys/array.rb +42 -0
  118. data/lib/mongoid/fields/serializable/foreign_keys/object.rb +47 -0
  119. data/lib/mongoid/fields/serializable/hash.rb +11 -0
  120. data/lib/mongoid/fields/serializable/integer.rb +44 -0
  121. data/lib/mongoid/fields/serializable/localized.rb +41 -0
  122. data/lib/mongoid/fields/serializable/nil_class.rb +38 -0
  123. data/lib/mongoid/fields/serializable/object.rb +11 -0
  124. data/lib/mongoid/fields/serializable/object_id.rb +31 -0
  125. data/lib/mongoid/fields/serializable/range.rb +42 -0
  126. data/lib/mongoid/fields/serializable/set.rb +42 -0
  127. data/lib/mongoid/fields/serializable/string.rb +27 -0
  128. data/lib/mongoid/fields/serializable/symbol.rb +27 -0
  129. data/lib/mongoid/fields/serializable/time.rb +23 -0
  130. data/lib/mongoid/fields/serializable/time_with_zone.rb +23 -0
  131. data/lib/mongoid/fields/serializable/timekeeping.rb +106 -0
  132. data/lib/mongoid/finders.rb +152 -0
  133. data/lib/mongoid/hierarchy.rb +120 -0
  134. data/lib/mongoid/identity.rb +92 -0
  135. data/lib/mongoid/identity_map.rb +119 -0
  136. data/lib/mongoid/indexes.rb +54 -0
  137. data/lib/mongoid/inspection.rb +54 -0
  138. data/lib/mongoid/javascript.rb +20 -0
  139. data/lib/mongoid/javascript/functions.yml +63 -0
  140. data/lib/mongoid/json.rb +16 -0
  141. data/lib/mongoid/keys.rb +144 -0
  142. data/lib/mongoid/logger.rb +39 -0
  143. data/lib/mongoid/matchers.rb +32 -0
  144. data/lib/mongoid/matchers/all.rb +21 -0
  145. data/lib/mongoid/matchers/and.rb +30 -0
  146. data/lib/mongoid/matchers/default.rb +70 -0
  147. data/lib/mongoid/matchers/exists.rb +23 -0
  148. data/lib/mongoid/matchers/gt.rb +21 -0
  149. data/lib/mongoid/matchers/gte.rb +21 -0
  150. data/lib/mongoid/matchers/in.rb +21 -0
  151. data/lib/mongoid/matchers/lt.rb +21 -0
  152. data/lib/mongoid/matchers/lte.rb +21 -0
  153. data/lib/mongoid/matchers/ne.rb +21 -0
  154. data/lib/mongoid/matchers/nin.rb +21 -0
  155. data/lib/mongoid/matchers/or.rb +33 -0
  156. data/lib/mongoid/matchers/size.rb +21 -0
  157. data/lib/mongoid/matchers/strategies.rb +93 -0
  158. data/lib/mongoid/multi_database.rb +31 -0
  159. data/lib/mongoid/multi_parameter_attributes.rb +106 -0
  160. data/lib/mongoid/named_scope.rb +146 -0
  161. data/lib/mongoid/nested_attributes.rb +54 -0
  162. data/lib/mongoid/observer.rb +170 -0
  163. data/lib/mongoid/paranoia.rb +158 -0
  164. data/lib/mongoid/persistence.rb +264 -0
  165. data/lib/mongoid/persistence/atomic.rb +223 -0
  166. data/lib/mongoid/persistence/atomic/add_to_set.rb +35 -0
  167. data/lib/mongoid/persistence/atomic/bit.rb +37 -0
  168. data/lib/mongoid/persistence/atomic/inc.rb +31 -0
  169. data/lib/mongoid/persistence/atomic/operation.rb +85 -0
  170. data/lib/mongoid/persistence/atomic/pop.rb +34 -0
  171. data/lib/mongoid/persistence/atomic/pull.rb +34 -0
  172. data/lib/mongoid/persistence/atomic/pull_all.rb +34 -0
  173. data/lib/mongoid/persistence/atomic/push.rb +31 -0
  174. data/lib/mongoid/persistence/atomic/push_all.rb +31 -0
  175. data/lib/mongoid/persistence/atomic/rename.rb +31 -0
  176. data/lib/mongoid/persistence/atomic/sets.rb +30 -0
  177. data/lib/mongoid/persistence/atomic/unset.rb +28 -0
  178. data/lib/mongoid/persistence/deletion.rb +32 -0
  179. data/lib/mongoid/persistence/insertion.rb +41 -0
  180. data/lib/mongoid/persistence/modification.rb +37 -0
  181. data/lib/mongoid/persistence/operations.rb +211 -0
  182. data/lib/mongoid/persistence/operations/embedded/insert.rb +42 -0
  183. data/lib/mongoid/persistence/operations/embedded/remove.rb +40 -0
  184. data/lib/mongoid/persistence/operations/insert.rb +34 -0
  185. data/lib/mongoid/persistence/operations/remove.rb +33 -0
  186. data/lib/mongoid/persistence/operations/update.rb +64 -0
  187. data/lib/mongoid/railtie.rb +126 -0
  188. data/lib/mongoid/railties/database.rake +182 -0
  189. data/lib/mongoid/railties/document.rb +12 -0
  190. data/lib/mongoid/relations.rb +144 -0
  191. data/lib/mongoid/relations/accessors.rb +138 -0
  192. data/lib/mongoid/relations/auto_save.rb +38 -0
  193. data/lib/mongoid/relations/binding.rb +26 -0
  194. data/lib/mongoid/relations/bindings.rb +9 -0
  195. data/lib/mongoid/relations/bindings/embedded/in.rb +69 -0
  196. data/lib/mongoid/relations/bindings/embedded/many.rb +93 -0
  197. data/lib/mongoid/relations/bindings/embedded/one.rb +61 -0
  198. data/lib/mongoid/relations/bindings/referenced/in.rb +76 -0
  199. data/lib/mongoid/relations/bindings/referenced/many.rb +54 -0
  200. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +51 -0
  201. data/lib/mongoid/relations/bindings/referenced/one.rb +58 -0
  202. data/lib/mongoid/relations/builder.rb +57 -0
  203. data/lib/mongoid/relations/builders.rb +83 -0
  204. data/lib/mongoid/relations/builders/embedded/in.rb +29 -0
  205. data/lib/mongoid/relations/builders/embedded/many.rb +40 -0
  206. data/lib/mongoid/relations/builders/embedded/one.rb +30 -0
  207. data/lib/mongoid/relations/builders/nested_attributes/many.rb +110 -0
  208. data/lib/mongoid/relations/builders/nested_attributes/one.rb +135 -0
  209. data/lib/mongoid/relations/builders/referenced/in.rb +26 -0
  210. data/lib/mongoid/relations/builders/referenced/many.rb +27 -0
  211. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +38 -0
  212. data/lib/mongoid/relations/builders/referenced/one.rb +26 -0
  213. data/lib/mongoid/relations/cascading.rb +56 -0
  214. data/lib/mongoid/relations/cascading/delete.rb +19 -0
  215. data/lib/mongoid/relations/cascading/destroy.rb +26 -0
  216. data/lib/mongoid/relations/cascading/nullify.rb +18 -0
  217. data/lib/mongoid/relations/cascading/strategy.rb +26 -0
  218. data/lib/mongoid/relations/constraint.rb +42 -0
  219. data/lib/mongoid/relations/conversions.rb +35 -0
  220. data/lib/mongoid/relations/cyclic.rb +103 -0
  221. data/lib/mongoid/relations/embedded/atomic.rb +89 -0
  222. data/lib/mongoid/relations/embedded/atomic/operation.rb +63 -0
  223. data/lib/mongoid/relations/embedded/atomic/pull.rb +65 -0
  224. data/lib/mongoid/relations/embedded/atomic/push_all.rb +59 -0
  225. data/lib/mongoid/relations/embedded/atomic/set.rb +61 -0
  226. data/lib/mongoid/relations/embedded/atomic/unset.rb +41 -0
  227. data/lib/mongoid/relations/embedded/in.rb +220 -0
  228. data/lib/mongoid/relations/embedded/many.rb +560 -0
  229. data/lib/mongoid/relations/embedded/one.rb +206 -0
  230. data/lib/mongoid/relations/embedded/sort.rb +31 -0
  231. data/lib/mongoid/relations/macros.rb +310 -0
  232. data/lib/mongoid/relations/many.rb +135 -0
  233. data/lib/mongoid/relations/metadata.rb +919 -0
  234. data/lib/mongoid/relations/nested_builder.rb +75 -0
  235. data/lib/mongoid/relations/one.rb +36 -0
  236. data/lib/mongoid/relations/options.rb +47 -0
  237. data/lib/mongoid/relations/polymorphic.rb +40 -0
  238. data/lib/mongoid/relations/proxy.rb +145 -0
  239. data/lib/mongoid/relations/referenced/batch.rb +72 -0
  240. data/lib/mongoid/relations/referenced/batch/insert.rb +57 -0
  241. data/lib/mongoid/relations/referenced/in.rb +262 -0
  242. data/lib/mongoid/relations/referenced/many.rb +623 -0
  243. data/lib/mongoid/relations/referenced/many_to_many.rb +396 -0
  244. data/lib/mongoid/relations/referenced/one.rb +272 -0
  245. data/lib/mongoid/relations/reflections.rb +62 -0
  246. data/lib/mongoid/relations/synchronization.rb +153 -0
  247. data/lib/mongoid/relations/targets.rb +2 -0
  248. data/lib/mongoid/relations/targets/enumerable.rb +372 -0
  249. data/lib/mongoid/reloading.rb +91 -0
  250. data/lib/mongoid/safety.rb +105 -0
  251. data/lib/mongoid/scope.rb +31 -0
  252. data/lib/mongoid/serialization.rb +134 -0
  253. data/lib/mongoid/sharding.rb +61 -0
  254. data/lib/mongoid/state.rb +97 -0
  255. data/lib/mongoid/threaded.rb +530 -0
  256. data/lib/mongoid/threaded/lifecycle.rb +192 -0
  257. data/lib/mongoid/timestamps.rb +15 -0
  258. data/lib/mongoid/timestamps/created.rb +24 -0
  259. data/lib/mongoid/timestamps/timeless.rb +50 -0
  260. data/lib/mongoid/timestamps/updated.rb +26 -0
  261. data/lib/mongoid/validations.rb +140 -0
  262. data/lib/mongoid/validations/associated.rb +46 -0
  263. data/lib/mongoid/validations/uniqueness.rb +145 -0
  264. data/lib/mongoid/version.rb +4 -0
  265. data/lib/mongoid/versioning.rb +185 -0
  266. data/lib/rack/mongoid.rb +2 -0
  267. data/lib/rack/mongoid/middleware/identity_map.rb +38 -0
  268. data/lib/rails/generators/mongoid/config/config_generator.rb +25 -0
  269. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +20 -0
  270. data/lib/rails/generators/mongoid/model/model_generator.rb +24 -0
  271. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +19 -0
  272. data/lib/rails/generators/mongoid/observer/observer_generator.rb +17 -0
  273. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +4 -0
  274. data/lib/rails/generators/mongoid_generator.rb +70 -0
  275. data/lib/rails/mongoid.rb +91 -0
  276. metadata +465 -0
@@ -0,0 +1,41 @@
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
+ modules = "#{ MODULE }::|BSON::|ActiveSupport::"
30
+ if match = klass.to_s.match(Regexp.new("^(#{ modules })?(\\w+)$"))
31
+ "#{MODULE}::#{ match[2] }".constantize
32
+ else
33
+ klass.to_s.constantize
34
+ end
35
+ rescue NameError
36
+ klass
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,201 @@
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
+ extend ActiveSupport::Concern
27
+
28
+ included do
29
+ # @todo: Durran: Pull out in 3.0.0
30
+ unless method_defined?(:default)
31
+ alias :default :default_val
32
+ end
33
+
34
+ class_attribute :cast_on_read
35
+ end
36
+
37
+ # Set readers for the instance variables.
38
+ attr_accessor :default_val, :label, :localize, :name, :options
39
+
40
+ # Get the constraint from the metadata once.
41
+ #
42
+ # @example Get the constraint.
43
+ # field.constraint
44
+ #
45
+ # @return [ Constraint ] The relation's contraint.
46
+ #
47
+ # @since 2.1.0
48
+ def constraint
49
+ @constraint ||= metadata.constraint
50
+ end
51
+
52
+ # Deserialize this field from the type stored in MongoDB to the type
53
+ # defined on the model
54
+ #
55
+ # @example Deserialize the field.
56
+ # field.deserialize(object)
57
+ #
58
+ # @param [ Object ] object The object to cast.
59
+ #
60
+ # @return [ Object ] The converted object.
61
+ #
62
+ # @since 2.1.0
63
+ def deserialize(object); object; end
64
+
65
+ # Evaluate the default value and return it. Will handle the
66
+ # serialization, proc calls, and duplication if necessary.
67
+ #
68
+ # @example Evaluate the default value.
69
+ # field.eval_default(document)
70
+ #
71
+ # @param [ Document ] doc The document the field belongs to.
72
+ #
73
+ # @return [ Object ] The serialized default value.
74
+ #
75
+ # @since 2.1.8
76
+ def eval_default(doc)
77
+ if default_val.respond_to?(:call)
78
+ serialize(doc.instance_exec(&default_val))
79
+ else
80
+ serialize(default_val.duplicable? ? default_val.dup : default_val)
81
+ end
82
+ end
83
+
84
+ # Is the field localized or not?
85
+ #
86
+ # @example Is the field localized?
87
+ # field.localized?
88
+ #
89
+ # @return [ true, false ] If the field is localized.
90
+ #
91
+ # @since 2.3.0
92
+ def localized?
93
+ !!@localize
94
+ end
95
+
96
+ # Get the metadata for the field if its a foreign key.
97
+ #
98
+ # @example Get the metadata.
99
+ # field.metadata
100
+ #
101
+ # @return [ Metadata ] The relation metadata.
102
+ #
103
+ # @since 2.2.0
104
+ def metadata
105
+ @metadata ||= options[:metadata]
106
+ end
107
+
108
+ # Is the field a BSON::ObjectId?
109
+ #
110
+ # @example Is the field a BSON::ObjectId?
111
+ # field.object_id_field?
112
+ #
113
+ # @return [ true, false ] If the field is a BSON::ObjectId.
114
+ #
115
+ # @since 2.2.0
116
+ def object_id_field?
117
+ @object_id_field ||= (type == BSON::ObjectId)
118
+ end
119
+
120
+ # Serialize the object from the type defined in the model to a MongoDB
121
+ # compatible object to store.
122
+ #
123
+ # @example Serialize the field.
124
+ # field.serialize(object)
125
+ #
126
+ # @param [ Object ] object The object to cast.
127
+ #
128
+ # @return [ Object ] The converted object.
129
+ #
130
+ # @since 2.1.0
131
+ def serialize(object); object; end
132
+
133
+ # Get the type of this field - inferred from the class name.
134
+ #
135
+ # @example Get the type.
136
+ # field.type
137
+ #
138
+ # @return [ Class ] The name of the class.
139
+ #
140
+ # @since 2.1.0
141
+ def type
142
+ @type ||= options[:type] || Object
143
+ end
144
+
145
+ # Is this field included in versioned attributes?
146
+ #
147
+ # @example Is the field versioned?
148
+ # field.versioned?
149
+ #
150
+ # @return [ true, false ] If the field is included in versioning.
151
+ #
152
+ # @since 2.1.0
153
+ def versioned?
154
+ @versioned ||= (options[:versioned].nil? ? true : options[:versioned])
155
+ end
156
+
157
+ module ClassMethods #:nodoc:
158
+
159
+ # Create the new field with a name and optional additional options.
160
+ #
161
+ # @example Create the new field.
162
+ # Field.new(:name, :type => String)
163
+ #
164
+ # @param [ Hash ] options The field options.
165
+ #
166
+ # @option options [ Class ] :type The class of the field.
167
+ # @option options [ Object ] :default The default value for the field.
168
+ # @option options [ String ] :label The field's label.
169
+ #
170
+ # @since 2.1.0
171
+ def instantiate(name, options = {})
172
+ allocate.tap do |field|
173
+ field.name = name
174
+ field.options = options
175
+ field.label = options[:label]
176
+ field.localize = options[:localize]
177
+ field.default_val = options[:default]
178
+ unless field.default_val
179
+ field.default_val = {} if field.localized?
180
+ end
181
+ end
182
+ end
183
+
184
+ private
185
+
186
+ # If we define a method called deserialize then we need to cast on
187
+ # read.
188
+ #
189
+ # @example Hook into method added.
190
+ # method_added(:deserialize)
191
+ #
192
+ # @param [ Symbol ] method The method name.
193
+ #
194
+ # @since 2.3.4
195
+ def method_added(method)
196
+ self.cast_on_read = true if method == :deserialize
197
+ end
198
+ end
199
+ end
200
+ end
201
+ end
@@ -0,0 +1,49 @@
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
+ # 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 [ Array ] The converted object.
19
+ #
20
+ # @since 2.1.0
21
+ def serialize(object)
22
+ raise_or_return(object)
23
+ end
24
+
25
+ protected
26
+
27
+ # If the value is not an array or nil we will raise an error,
28
+ # otherwise return the value.
29
+ #
30
+ # @example Raise or return the value.
31
+ # field.raise_or_return([])
32
+ #
33
+ # @param [ Object ] value The value to check.a
34
+ #
35
+ # @raise [ InvalidType ] If not passed an array.
36
+ #
37
+ # @return [ Array ] The array.
38
+ #
39
+ # @since 2.1.0
40
+ def raise_or_return(value)
41
+ unless value.nil? || value.is_a?(::Array)
42
+ raise Mongoid::Errors::InvalidType.new(::Array, value)
43
+ end
44
+ value
45
+ end
46
+ end
47
+ end
48
+ end
49
+ 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,43 @@
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
+ end
41
+ end
42
+ end
43
+ 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