virtus 0.5.5 → 1.0.0.beta3

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 (268) hide show
  1. data/.rspec +1 -1
  2. data/.ruby-gemset +1 -0
  3. data/.ruby-version +1 -0
  4. data/.travis.yml +6 -8
  5. data/Gemfile +8 -2
  6. data/Gemfile.devtools +24 -30
  7. data/Guardfile +17 -6
  8. data/README.md +215 -77
  9. data/TODO.md +6 -0
  10. data/config/flay.yml +2 -2
  11. data/config/flog.yml +1 -1
  12. data/config/mutant.yml +12 -1
  13. data/config/reek.yml +57 -66
  14. data/lib/virtus.rb +126 -42
  15. data/lib/virtus/attribute.rb +52 -240
  16. data/lib/virtus/attribute/accessor.rb +91 -0
  17. data/lib/virtus/attribute/boolean.rb +11 -8
  18. data/lib/virtus/attribute/builder.rb +120 -0
  19. data/lib/virtus/attribute/coercer.rb +51 -0
  20. data/lib/virtus/attribute/coercible.rb +14 -0
  21. data/lib/virtus/attribute/collection.rb +44 -90
  22. data/lib/virtus/attribute/default_value/from_callable.rb +1 -1
  23. data/lib/virtus/attribute/default_value/from_clonable.rb +1 -6
  24. data/lib/virtus/attribute/default_value/from_symbol.rb +3 -3
  25. data/lib/virtus/attribute/embedded_value.rb +37 -28
  26. data/lib/virtus/attribute/hash.rb +69 -71
  27. data/lib/virtus/attribute/lazy_default.rb +18 -0
  28. data/lib/virtus/attribute/strict.rb +16 -0
  29. data/lib/virtus/attribute_set.rb +81 -9
  30. data/lib/virtus/class_inclusions.rb +24 -17
  31. data/lib/virtus/class_methods.rb +13 -31
  32. data/lib/virtus/configuration.rb +77 -0
  33. data/lib/virtus/const_missing_extensions.rb +16 -0
  34. data/lib/virtus/extensions.rb +86 -61
  35. data/lib/virtus/instance_methods.rb +107 -128
  36. data/lib/virtus/model.rb +68 -0
  37. data/lib/virtus/module_builder.rb +184 -0
  38. data/lib/virtus/module_extensions.rb +27 -15
  39. data/lib/virtus/support/equalizer.rb +2 -3
  40. data/lib/virtus/support/type_lookup.rb +1 -1
  41. data/lib/virtus/value_object.rb +24 -31
  42. data/lib/virtus/version.rb +1 -1
  43. data/spec/integration/building_module_spec.rb +68 -0
  44. data/spec/integration/custom_attributes_spec.rb +8 -15
  45. data/spec/integration/custom_collection_attributes_spec.rb +101 -0
  46. data/spec/integration/default_values_spec.rb +9 -2
  47. data/spec/integration/defining_attributes_spec.rb +2 -2
  48. data/spec/integration/using_modules_spec.rb +5 -3
  49. data/spec/shared/freeze_method_behavior.rb +2 -2
  50. data/spec/shared/options_class_method.rb +1 -1
  51. data/spec/spec_helper.rb +25 -5
  52. data/spec/unit/virtus/attribute/boolean/value_coerced_predicate_spec.rb +25 -0
  53. data/spec/unit/virtus/attribute/class_methods/build_spec.rb +115 -22
  54. data/spec/unit/virtus/attribute/class_methods/coerce_spec.rb +32 -0
  55. data/spec/unit/virtus/attribute/coerce_spec.rb +38 -21
  56. data/spec/unit/virtus/attribute/coercible_predicate_spec.rb +20 -0
  57. data/spec/unit/virtus/attribute/collection/class_methods/build_spec.rb +84 -0
  58. data/spec/unit/virtus/attribute/collection/coerce_spec.rb +37 -24
  59. data/spec/unit/virtus/attribute/custom_collection_spec.rb +23 -0
  60. data/spec/unit/virtus/attribute/embedded_value/class_methods/build_spec.rb +37 -0
  61. data/spec/unit/virtus/attribute/embedded_value/coerce_spec.rb +46 -10
  62. data/spec/unit/virtus/attribute/get_spec.rb +15 -63
  63. data/spec/unit/virtus/attribute/hash/class_methods/build_spec.rb +80 -0
  64. data/spec/unit/virtus/attribute/hash/coerce_spec.rb +75 -13
  65. data/spec/unit/virtus/attribute/lazy_predicate_spec.rb +20 -0
  66. data/spec/unit/virtus/attribute/set_default_value_spec.rb +74 -0
  67. data/spec/unit/virtus/attribute/set_spec.rb +16 -36
  68. data/spec/unit/virtus/attribute/value_coerced_predicate_spec.rb +19 -0
  69. data/spec/unit/virtus/attribute_set/append_spec.rb +3 -5
  70. data/spec/unit/virtus/attribute_set/define_reader_method_spec.rb +1 -1
  71. data/spec/unit/virtus/attribute_set/define_writer_method_spec.rb +1 -1
  72. data/spec/unit/virtus/attribute_set/each_spec.rb +3 -3
  73. data/spec/unit/virtus/attribute_set/element_reference_spec.rb +1 -1
  74. data/spec/unit/virtus/attribute_set/element_set_spec.rb +4 -4
  75. data/spec/unit/virtus/attribute_set/merge_spec.rb +10 -16
  76. data/spec/unit/virtus/attribute_set/reset_spec.rb +6 -10
  77. data/spec/unit/virtus/attribute_spec.rb +222 -0
  78. data/spec/unit/virtus/attributes_reader_spec.rb +41 -0
  79. data/spec/unit/virtus/attributes_writer_spec.rb +51 -0
  80. data/spec/unit/virtus/class_methods/new_spec.rb +39 -0
  81. data/spec/unit/virtus/config_spec.rb +13 -0
  82. data/spec/unit/virtus/element_reader_spec.rb +21 -0
  83. data/spec/unit/virtus/element_writer_spec.rb +19 -0
  84. data/spec/unit/virtus/freeze_spec.rb +21 -0
  85. data/spec/unit/virtus/model_spec.rb +134 -0
  86. data/spec/unit/virtus/module_spec.rb +76 -0
  87. data/spec/unit/virtus/set_default_attributes_spec.rb +25 -0
  88. data/spec/unit/virtus/value_object_spec.rb +105 -0
  89. data/virtus.gemspec +4 -2
  90. metadata +82 -191
  91. data/.rvmrc +0 -1
  92. data/TODO +0 -1
  93. data/config/roodi.yml +0 -17
  94. data/lib/virtus/attribute/array.rb +0 -24
  95. data/lib/virtus/attribute/class.rb +0 -21
  96. data/lib/virtus/attribute/date.rb +0 -34
  97. data/lib/virtus/attribute/date_time.rb +0 -36
  98. data/lib/virtus/attribute/decimal.rb +0 -21
  99. data/lib/virtus/attribute/embedded_value/from_open_struct.rb +0 -19
  100. data/lib/virtus/attribute/embedded_value/from_struct.rb +0 -19
  101. data/lib/virtus/attribute/float.rb +0 -30
  102. data/lib/virtus/attribute/integer.rb +0 -27
  103. data/lib/virtus/attribute/numeric.rb +0 -11
  104. data/lib/virtus/attribute/object.rb +0 -11
  105. data/lib/virtus/attribute/set.rb +0 -24
  106. data/lib/virtus/attribute/string.rb +0 -24
  107. data/lib/virtus/attribute/symbol.rb +0 -21
  108. data/lib/virtus/attribute/time.rb +0 -36
  109. data/lib/virtus/coercion.rb +0 -32
  110. data/lib/virtus/coercion/array.rb +0 -23
  111. data/lib/virtus/coercion/date.rb +0 -26
  112. data/lib/virtus/coercion/date_time.rb +0 -26
  113. data/lib/virtus/coercion/decimal.rb +0 -40
  114. data/lib/virtus/coercion/false_class.rb +0 -24
  115. data/lib/virtus/coercion/float.rb +0 -39
  116. data/lib/virtus/coercion/hash.rb +0 -71
  117. data/lib/virtus/coercion/integer.rb +0 -83
  118. data/lib/virtus/coercion/numeric.rb +0 -66
  119. data/lib/virtus/coercion/object.rb +0 -125
  120. data/lib/virtus/coercion/string.rb +0 -218
  121. data/lib/virtus/coercion/symbol.rb +0 -24
  122. data/lib/virtus/coercion/time.rb +0 -40
  123. data/lib/virtus/coercion/time_coercions.rb +0 -86
  124. data/lib/virtus/coercion/true_class.rb +0 -24
  125. data/spec/unit/virtus/attribute/array/coerce_spec.rb +0 -13
  126. data/spec/unit/virtus/attribute/boolean/coerce_spec.rb +0 -85
  127. data/spec/unit/virtus/attribute/boolean/define_reader_method_spec.rb +0 -15
  128. data/spec/unit/virtus/attribute/boolean/value_coerced_spec.rb +0 -97
  129. data/spec/unit/virtus/attribute/boolean_spec.rb +0 -19
  130. data/spec/unit/virtus/attribute/class/coerce_spec.rb +0 -13
  131. data/spec/unit/virtus/attribute/class_methods/accessor_spec.rb +0 -12
  132. data/spec/unit/virtus/attribute/class_methods/coercion_method_spec.rb +0 -9
  133. data/spec/unit/virtus/attribute/class_methods/default_spec.rb +0 -9
  134. data/spec/unit/virtus/attribute/class_methods/determine_type_spec.rb +0 -117
  135. data/spec/unit/virtus/attribute/class_methods/merge_options_spec.rb +0 -11
  136. data/spec/unit/virtus/attribute/class_methods/primitive_spec.rb +0 -9
  137. data/spec/unit/virtus/attribute/class_methods/reader_spec.rb +0 -9
  138. data/spec/unit/virtus/attribute/class_methods/writer_spec.rb +0 -9
  139. data/spec/unit/virtus/attribute/coercion_method_spec.rb +0 -12
  140. data/spec/unit/virtus/attribute/collection/class_methods/merge_options_spec.rb +0 -40
  141. data/spec/unit/virtus/attribute/collection/coerce_and_append_member_spec.rb +0 -16
  142. data/spec/unit/virtus/attribute/collection/member_coercion/coerce_and_append_member_spec.rb +0 -18
  143. data/spec/unit/virtus/attribute/collection/member_type_spec.rb +0 -17
  144. data/spec/unit/virtus/attribute/collection/new_collection_spec.rb +0 -9
  145. data/spec/unit/virtus/attribute/date/coerce_spec.rb +0 -47
  146. data/spec/unit/virtus/attribute/date/value_coerced_spec.rb +0 -46
  147. data/spec/unit/virtus/attribute/date_time/coerce_spec.rb +0 -80
  148. data/spec/unit/virtus/attribute/decimal/coerce_spec.rb +0 -123
  149. data/spec/unit/virtus/attribute/default_spec.rb +0 -28
  150. data/spec/unit/virtus/attribute/default_value/call_spec.rb +0 -21
  151. data/spec/unit/virtus/attribute/default_value/class_methods/build_spec.rb +0 -23
  152. data/spec/unit/virtus/attribute/default_value/class_methods/new_spec.rb +0 -21
  153. data/spec/unit/virtus/attribute/default_value/from_callable/call_spec.rb +0 -19
  154. data/spec/unit/virtus/attribute/default_value/from_callable/class_methods/handle_spec.rb +0 -17
  155. data/spec/unit/virtus/attribute/default_value/from_clonable/call_spec.rb +0 -20
  156. data/spec/unit/virtus/attribute/default_value/from_clonable/class_methods/handle_spec.rb +0 -19
  157. data/spec/unit/virtus/attribute/default_value/from_symbol/call_spec.rb +0 -17
  158. data/spec/unit/virtus/attribute/default_value/from_symbol/class_methods/handle_spec.rb +0 -17
  159. data/spec/unit/virtus/attribute/default_value/value_spec.rb +0 -10
  160. data/spec/unit/virtus/attribute/define_accessor_methods_spec.rb +0 -26
  161. data/spec/unit/virtus/attribute/define_reader_method_spec.rb +0 -24
  162. data/spec/unit/virtus/attribute/define_writer_method_spec.rb +0 -24
  163. data/spec/unit/virtus/attribute/embedded_value/class_methods/determine_type_spec.rb +0 -23
  164. data/spec/unit/virtus/attribute/embedded_value/class_methods/merge_options_spec.rb +0 -17
  165. data/spec/unit/virtus/attribute/embedded_value/from_open_struct/coerce_spec.rb +0 -34
  166. data/spec/unit/virtus/attribute/embedded_value/from_struct/coerce_spec.rb +0 -34
  167. data/spec/unit/virtus/attribute/float/coerce_spec.rb +0 -123
  168. data/spec/unit/virtus/attribute/hash/class_methods/merge_options_spec.rb +0 -33
  169. data/spec/unit/virtus/attribute/hash/key_type_spec.rb +0 -10
  170. data/spec/unit/virtus/attribute/hash/value_type_spec.rb +0 -10
  171. data/spec/unit/virtus/attribute/inspect_spec.rb +0 -27
  172. data/spec/unit/virtus/attribute/integer/coerce_spec.rb +0 -117
  173. data/spec/unit/virtus/attribute/name_spec.rb +0 -12
  174. data/spec/unit/virtus/attribute/numeric/class_methods/descendants_spec.rb +0 -15
  175. data/spec/unit/virtus/attribute/numeric/class_methods/max_spec.rb +0 -9
  176. data/spec/unit/virtus/attribute/numeric/class_methods/min_spec.rb +0 -9
  177. data/spec/unit/virtus/attribute/options_spec.rb +0 -14
  178. data/spec/unit/virtus/attribute/public_reader_spec.rb +0 -24
  179. data/spec/unit/virtus/attribute/public_writer_spec.rb +0 -24
  180. data/spec/unit/virtus/attribute/set/coerce_spec.rb +0 -13
  181. data/spec/unit/virtus/attribute/string/coerce_spec.rb +0 -11
  182. data/spec/unit/virtus/attribute/symbol/coerce_spec.rb +0 -13
  183. data/spec/unit/virtus/attribute/time/coerce_spec.rb +0 -67
  184. data/spec/unit/virtus/attribute/value_coerced_spec.rb +0 -19
  185. data/spec/unit/virtus/class_methods/attribute_set_spec.rb +0 -9
  186. data/spec/unit/virtus/class_methods/attribute_spec.rb +0 -30
  187. data/spec/unit/virtus/class_methods/attributes_spec.rb +0 -22
  188. data/spec/unit/virtus/class_methods/const_missing_spec.rb +0 -27
  189. data/spec/unit/virtus/class_methods/inherited_spec.rb +0 -21
  190. data/spec/unit/virtus/coercion/array/class_methods/to_set_spec.rb +0 -12
  191. data/spec/unit/virtus/coercion/class_methods/element_reference_spec.rb +0 -17
  192. data/spec/unit/virtus/coercion/class_methods/primitive_spec.rb +0 -13
  193. data/spec/unit/virtus/coercion/date/class_methods/to_date_spec.rb +0 -10
  194. data/spec/unit/virtus/coercion/date/class_methods/to_datetime_spec.rb +0 -30
  195. data/spec/unit/virtus/coercion/date/class_methods/to_string_spec.rb +0 -12
  196. data/spec/unit/virtus/coercion/date/class_methods/to_time_spec.rb +0 -12
  197. data/spec/unit/virtus/coercion/date_time/class_methods/to_date_spec.rb +0 -30
  198. data/spec/unit/virtus/coercion/date_time/class_methods/to_datetime_spec.rb +0 -10
  199. data/spec/unit/virtus/coercion/date_time/class_methods/to_string_spec.rb +0 -12
  200. data/spec/unit/virtus/coercion/date_time/class_methods/to_time_spec.rb +0 -30
  201. data/spec/unit/virtus/coercion/decimal/class_methods/to_decimal_spec.rb +0 -9
  202. data/spec/unit/virtus/coercion/decimal/class_methods/to_float_spec.rb +0 -12
  203. data/spec/unit/virtus/coercion/decimal/class_methods/to_integer_spec.rb +0 -12
  204. data/spec/unit/virtus/coercion/decimal/class_methods/to_string_spec.rb +0 -12
  205. data/spec/unit/virtus/coercion/false_class/class_methods/to_string_spec.rb +0 -12
  206. data/spec/unit/virtus/coercion/float/class_methods/to_decimal_spec.rb +0 -12
  207. data/spec/unit/virtus/coercion/float/class_methods/to_float_spec.rb +0 -9
  208. data/spec/unit/virtus/coercion/float/class_methods/to_integer_spec.rb +0 -12
  209. data/spec/unit/virtus/coercion/float/class_methods/to_string_spec.rb +0 -12
  210. data/spec/unit/virtus/coercion/hash/class_methods/to_date_spec.rb +0 -38
  211. data/spec/unit/virtus/coercion/hash/class_methods/to_datetime_spec.rb +0 -38
  212. data/spec/unit/virtus/coercion/hash/class_methods/to_time_spec.rb +0 -38
  213. data/spec/unit/virtus/coercion/integer/class_methods/to_boolean_spec.rb +0 -25
  214. data/spec/unit/virtus/coercion/integer/class_methods/to_decimal_spec.rb +0 -12
  215. data/spec/unit/virtus/coercion/integer/class_methods/to_float_spec.rb +0 -12
  216. data/spec/unit/virtus/coercion/integer/class_methods/to_integer_spec.rb +0 -9
  217. data/spec/unit/virtus/coercion/integer/class_methods/to_string_spec.rb +0 -12
  218. data/spec/unit/virtus/coercion/numeric/class_methods/to_decimal_spec.rb +0 -10
  219. data/spec/unit/virtus/coercion/numeric/class_methods/to_float_spec.rb +0 -10
  220. data/spec/unit/virtus/coercion/numeric/class_methods/to_integer_spec.rb +0 -10
  221. data/spec/unit/virtus/coercion/numeric/class_methods/to_string_spec.rb +0 -12
  222. data/spec/unit/virtus/coercion/object/class_methods/method_missing_spec.rb +0 -33
  223. data/spec/unit/virtus/coercion/object/class_methods/to_array_spec.rb +0 -51
  224. data/spec/unit/virtus/coercion/object/class_methods/to_hash_spec.rb +0 -22
  225. data/spec/unit/virtus/coercion/object/class_methods/to_integer_spec.rb +0 -22
  226. data/spec/unit/virtus/coercion/object/class_methods/to_string_spec.rb +0 -22
  227. data/spec/unit/virtus/coercion/string/class_methods/to_boolean_spec.rb +0 -29
  228. data/spec/unit/virtus/coercion/string/class_methods/to_constant_spec.rb +0 -49
  229. data/spec/unit/virtus/coercion/string/class_methods/to_date_spec.rb +0 -23
  230. data/spec/unit/virtus/coercion/string/class_methods/to_datetime_spec.rb +0 -50
  231. data/spec/unit/virtus/coercion/string/class_methods/to_decimal_spec.rb +0 -47
  232. data/spec/unit/virtus/coercion/string/class_methods/to_float_spec.rb +0 -57
  233. data/spec/unit/virtus/coercion/string/class_methods/to_integer_spec.rb +0 -68
  234. data/spec/unit/virtus/coercion/string/class_methods/to_symbol_spec.rb +0 -9
  235. data/spec/unit/virtus/coercion/string/class_methods/to_time_spec.rb +0 -50
  236. data/spec/unit/virtus/coercion/symbol/class_methods/to_string_spec.rb +0 -12
  237. data/spec/unit/virtus/coercion/time/class_methods/to_integer_spec.rb +0 -10
  238. data/spec/unit/virtus/coercion/time/class_methods/to_time_spec.rb +0 -10
  239. data/spec/unit/virtus/coercion/time_coercions/to_date_spec.rb +0 -33
  240. data/spec/unit/virtus/coercion/time_coercions/to_datetime_spec.rb +0 -33
  241. data/spec/unit/virtus/coercion/time_coercions/to_string_spec.rb +0 -18
  242. data/spec/unit/virtus/coercion/time_coercions/to_time_spec.rb +0 -33
  243. data/spec/unit/virtus/coercion/true_class/class_methods/to_string_spec.rb +0 -12
  244. data/spec/unit/virtus/equalizer/append_spec.rb +0 -82
  245. data/spec/unit/virtus/equalizer/class_method/new_spec.rb +0 -111
  246. data/spec/unit/virtus/equalizer/methods/eql_spec.rb +0 -47
  247. data/spec/unit/virtus/equalizer/methods/equal_value_spec.rb +0 -57
  248. data/spec/unit/virtus/extensions/allowed_writer_methods_spec.rb +0 -25
  249. data/spec/unit/virtus/extensions/attribute_spec.rb +0 -26
  250. data/spec/unit/virtus/instance_methods/attributes_spec.rb +0 -140
  251. data/spec/unit/virtus/instance_methods/element_reference_spec.rb +0 -24
  252. data/spec/unit/virtus/instance_methods/element_set_spec.rb +0 -28
  253. data/spec/unit/virtus/instance_methods/freeze_spec.rb +0 -64
  254. data/spec/unit/virtus/instance_methods/initialize_spec.rb +0 -48
  255. data/spec/unit/virtus/instance_methods/to_hash_spec.rb +0 -23
  256. data/spec/unit/virtus/module_extensions/attribute_spec.rb +0 -31
  257. data/spec/unit/virtus/options/accept_options_spec.rb +0 -37
  258. data/spec/unit/virtus/options/accepted_options_spec.rb +0 -21
  259. data/spec/unit/virtus/options/options_spec.rb +0 -34
  260. data/spec/unit/virtus/type_lookup/class_methods/extended_spec.rb +0 -9
  261. data/spec/unit/virtus/type_lookup/determine_type_spec.rb +0 -81
  262. data/spec/unit/virtus/type_lookup/primitive_spec.rb +0 -9
  263. data/spec/unit/virtus/value_object/class_methods/allowed_writer_methods_spec.rb +0 -15
  264. data/spec/unit/virtus/value_object/class_methods/attribute_spec.rb +0 -50
  265. data/spec/unit/virtus/value_object/class_methods/equalizer_spec.rb +0 -24
  266. data/spec/unit/virtus/value_object/initialize_spec.rb +0 -19
  267. data/spec/unit/virtus/value_object/instance_methods/clone_spec.rb +0 -21
  268. data/spec/unit/virtus/value_object/instance_methods/with_spec.rb +0 -31
@@ -1,26 +0,0 @@
1
- module Virtus
2
- class Coercion
3
-
4
- # Coerce Date values
5
- class Date < Object
6
- extend TimeCoercions
7
-
8
- primitive ::Date
9
-
10
- # Passthrough the value
11
- #
12
- # @example
13
- # Virtus::Coercion::DateTime.to_date(date) # => Date object
14
- #
15
- # @param [DateTime] value
16
- #
17
- # @return [Date]
18
- #
19
- # @api public
20
- def self.to_date(value)
21
- value
22
- end
23
-
24
- end # class Date
25
- end # class Coercion
26
- end # module Virtus
@@ -1,26 +0,0 @@
1
- module Virtus
2
- class Coercion
3
-
4
- # Coerce DateTime values
5
- class DateTime < Object
6
- primitive ::DateTime
7
-
8
- extend TimeCoercions
9
-
10
- # Passthrough the value
11
- #
12
- # @example
13
- # Virtus::Coercion::DateTime.to_datetime(datetime) # => DateTime object
14
- #
15
- # @param [DateTime] value
16
- #
17
- # @return [Date]
18
- #
19
- # @api public
20
- def self.to_datetime(value)
21
- value
22
- end
23
-
24
- end # class DateTime
25
- end # class Coercion
26
- end # module Virtus
@@ -1,40 +0,0 @@
1
- module Virtus
2
- class Coercion
3
-
4
- # Coerce BigDecimal values
5
- class Decimal < Numeric
6
- primitive ::BigDecimal
7
-
8
- FLOAT_FORMAT = 'F'.freeze
9
-
10
- # Coerce given value to String
11
- #
12
- # @example
13
- # Virtus::Coercion::BigDecimal.to_string(BigDecimal('1.0')) # => "1.0"
14
- #
15
- # @param [BigDecimal] value
16
- #
17
- # @return [String]
18
- #
19
- # @api public
20
- def self.to_string(value)
21
- value.to_s(FLOAT_FORMAT)
22
- end
23
-
24
- # Passthrough the value
25
- #
26
- # @example
27
- # Virtus::Coercion::BigDecimal.to_decimal(BigDecimal('1.0')) # => BigDecimal('1.0')
28
- #
29
- # @param [BigDecimal] value
30
- #
31
- # @return [Fixnum]
32
- #
33
- # @api public
34
- def self.to_decimal(value)
35
- value
36
- end
37
-
38
- end # class BigDecimal
39
- end # class Coercion
40
- end # module Virtus
@@ -1,24 +0,0 @@
1
- module Virtus
2
- class Coercion
3
-
4
- # Coerce false values
5
- class FalseClass < Object
6
- primitive ::FalseClass
7
-
8
- # Coerce given value to String
9
- #
10
- # @example
11
- # Virtus::Coercion::FalseClass.to_string(false) # => "false"
12
- #
13
- # @param [FalseClass] value
14
- #
15
- # @return [String]
16
- #
17
- # @api public
18
- def self.to_string(value)
19
- value.to_s
20
- end
21
-
22
- end # class FalseClass
23
- end # class Coercion
24
- end # module Virtus
@@ -1,39 +0,0 @@
1
- module Virtus
2
- class Coercion
3
-
4
- # Coerce Float values
5
- class Float < Numeric
6
- primitive ::Float
7
-
8
- # Passthrough the value
9
- #
10
- # @example
11
- # Virtus::Coercion::Float.to_float(1.0) # => 1.0
12
- #
13
- # @param [Float] value
14
- #
15
- # @return [Integer]
16
- #
17
- # @api public
18
- def self.to_float(value)
19
- value
20
- end
21
-
22
- # Coerce given value to a DateTime
23
- #
24
- # @example
25
- # datetime = Virtus::Coercion::Float.to_datetime(1000000000.999) # => Sun, 09 Sep 2001 01:46:40 +0000
26
- # datetime.to_f # => 1000000000.999
27
- #
28
- # @param [Float] value
29
- #
30
- # @return [DateTime]
31
- #
32
- # @api public
33
- def self.to_datetime(value)
34
- ::DateTime.strptime((value * 10**3).to_s, "%Q")
35
- end
36
-
37
- end # class Float
38
- end # class Coercion
39
- end # module Virtus
@@ -1,71 +0,0 @@
1
- module Virtus
2
- class Coercion
3
-
4
- # Coerce Hash values
5
- class Hash < Object
6
- primitive ::Hash
7
-
8
- TIME_SEGMENTS = [ :year, :month, :day, :hour, :min, :sec ].freeze
9
-
10
- # Creates a Time instance from a Hash
11
- #
12
- # Valid keys are: :year, :month, :day, :hour, :min, :sec
13
- #
14
- # @param [Hash] value
15
- #
16
- # @return [Time]
17
- #
18
- # @api private
19
- def self.to_time(value)
20
- ::Time.local(*extract(value))
21
- end
22
-
23
- # Creates a Date instance from a Hash
24
- #
25
- # Valid keys are: :year, :month, :day, :hour
26
- #
27
- # @param [Hash] value
28
- #
29
- # @return [Date]
30
- #
31
- # @api private
32
- def self.to_date(value)
33
- ::Date.new(*extract(value).first(3))
34
- end
35
-
36
- # Creates a DateTime instance from a Hash
37
- #
38
- # Valid keys are: :year, :month, :day, :hour, :min, :sec
39
- #
40
- # @param [Hash] value
41
- #
42
- # @return [DateTime]
43
- #
44
- # @api private
45
- def self.to_datetime(value)
46
- ::DateTime.new(*extract(value))
47
- end
48
-
49
- # Extracts the given args from a Hash
50
- #
51
- # If a value does not exist, it uses the value of Time.now
52
- #
53
- # @param [Hash] value
54
- #
55
- # @return [Array]
56
- #
57
- # @api private
58
- def self.extract(value)
59
- now = ::Time.now
60
-
61
- TIME_SEGMENTS.map do |segment|
62
- val = value.fetch(segment, now.public_send(segment))
63
- Coercion[val.class.name].to_integer(val)
64
- end
65
- end
66
-
67
- private_class_method :extract
68
-
69
- end # class Hash
70
- end # class Coercion
71
- end # module Virtus
@@ -1,83 +0,0 @@
1
- module Virtus
2
- class Coercion
3
-
4
- # Coerce Fixnum values
5
- class Integer < Numeric
6
- primitive ::Integer
7
-
8
- # Coerce given value to String
9
- #
10
- # @example
11
- # Virtus::Coercion::Fixnum.to_string(1) # => "1"
12
- #
13
- # @param [Fixnum] value
14
- #
15
- # @return [String]
16
- #
17
- # @api public
18
- def self.to_string(value)
19
- value.to_s
20
- end
21
-
22
- # Passthrough the value
23
- #
24
- # @example
25
- # Virtus::Coercion::Fixnum.to_integer(1) # => 1
26
- #
27
- # @param [Fixnum] value
28
- #
29
- # @return [Float]
30
- #
31
- # @api public
32
- def self.to_integer(value)
33
- value
34
- end
35
-
36
- # Coerce given value to a Boolean
37
- #
38
- # @example with a 1
39
- # Virtus::Coercion::Fixnum.to_boolean(1) # => true
40
- #
41
- # @example with a 0
42
- # Virtus::Coercion::Fixnum.to_boolean(0) # => false
43
- #
44
- # @param [Fixnum] value
45
- #
46
- # @return [BigDecimal]
47
- #
48
- # @api public
49
- def self.to_boolean(value)
50
- case value
51
- when 1 then true
52
- when 0 then false
53
- else
54
- value
55
- end
56
- end
57
-
58
- # Coerce given value to a DateTime
59
- #
60
- # @example
61
- # Virtus::Coercion::Fixnum.to_datetime(0) # => Thu, 01 Jan 1970 00:00:00 +0000
62
- #
63
- # @param [Integer] value
64
- #
65
- # @return [DateTime]
66
- #
67
- # @api public
68
- def self.to_datetime(value)
69
- # FIXME: Remove after Rubinius 2.0 is released
70
- if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx'
71
- datetime_format = '%Q'
72
- value = "#{value * 10**3}"
73
- else
74
- datetime_format = '%s'
75
- value = "#{value}"
76
- end
77
-
78
- ::DateTime.strptime(value, datetime_format)
79
- end
80
-
81
- end # class Fixnum
82
- end # class Coercion
83
- end # module Virtus
@@ -1,66 +0,0 @@
1
- module Virtus
2
- class Coercion
3
-
4
- # Base class for all numeric Coercion classes
5
- class Numeric < Object
6
- primitive ::Numeric
7
-
8
- # Coerce given value to String
9
- #
10
- # @example
11
- # Virtus::Coercion::Numeric.to_string(Rational(2, 2)) # => "1.0"
12
- #
13
- # @param [Numeric] value
14
- #
15
- # @return [String]
16
- #
17
- # @api public
18
- def self.to_string(value)
19
- value.to_s
20
- end
21
-
22
- # Creates an Integer instance from a numeric object
23
- #
24
- # @example
25
- # Virtus::Coercion::Numeric.to_integer(Rational(2, 2)) # => 1
26
- #
27
- # @param [Numeric] value
28
- #
29
- # @return [Integer]
30
- #
31
- # @api public
32
- def self.to_integer(value)
33
- value.to_i
34
- end
35
-
36
- # Creates a Float instance from a numeric object
37
- #
38
- # @example
39
- # Virtus::Coercion::Numeric.to_float(Rational(2, 2)) # => 1.0
40
- #
41
- # @param [Numeric] value
42
- #
43
- # @return [Float]
44
- #
45
- # @api public
46
- def self.to_float(value)
47
- value.to_f
48
- end
49
-
50
- # Coerce a BigDecimal instance from a numeric object
51
- #
52
- # @example
53
- # Virtus::Coercion::Numeric.to_decimal(Rational(2, 2)) # => BigDecimal('1.0')
54
- #
55
- # @param [Numeric] value
56
- #
57
- # @return [BigDecimal]
58
- #
59
- # @api public
60
- def self.to_decimal(value)
61
- to_string(value).to_d
62
- end
63
-
64
- end # class Numeric
65
- end # class Coercion
66
- end # module Virtus
@@ -1,125 +0,0 @@
1
- module Virtus
2
- class Coercion
3
-
4
- # Coerce Object values
5
- class Object < Coercion
6
- primitive ::Object
7
-
8
- COERCION_METHOD_REGEXP = /\Ato_/.freeze
9
-
10
- # Create an Array from any Object
11
- #
12
- # @example with an object that does not respond to #to_a or #to_ary
13
- # Virtus::Coercion::Object.to_array(value) # => [ value ]
14
- #
15
- # @example with an object that responds to #to_a
16
- # Virtus::Coercion::Object.to_array(Set[ value ]) # => [ value ]
17
- #
18
- # @example with n object that responds to #to_ary
19
- # Virtus::Coercion::Object.to_array([ value ]) # => [ value ]
20
- #
21
- # @param [#to_a,#to_ary,Object] value
22
- # @param [#to_a,#to_ary,Object] value
23
- #
24
- # @return [Array]
25
- #
26
- # @api public
27
- def self.to_array(value)
28
- Array(value)
29
- end
30
-
31
- # Create a Hash from the Object if possible
32
- #
33
- # @example with a coercible object
34
- # Virtus::Coercion::Object.to_hash(key => value) # => { key => value }
35
- #
36
- # @example with an object that is not coercible
37
- # Virtus::Coercion::Object.to_hash(value) # => value
38
- #
39
- # @param [#to_hash, Object] value
40
- #
41
- # @return [Hash]
42
- # returns a Hash when the object can be coerced
43
- # @return [Object]
44
- # returns the value when the object cannot be coerced
45
- #
46
- # @api public
47
- def self.to_hash(value)
48
- coerce_with_method(value, :to_hash)
49
- end
50
-
51
- # Create a String from the Object if possible
52
- #
53
- # @example with a coercible object
54
- # Virtus::Coercion::Object.to_string("string") # => "string"
55
- #
56
- # @example with an object that is not coercible
57
- # Virtus::Coercion::Object.to_string(value) # => value
58
- #
59
- # @param [#to_str, Object] value
60
- #
61
- # @return [String]
62
- # returns a String when the object can be coerced
63
- # @return [Object]
64
- # returns the value when the object cannot be coerced
65
- #
66
- # @api public
67
- def self.to_string(value)
68
- coerce_with_method(value, :to_str)
69
- end
70
-
71
- # Create an Integer from the Object if possible
72
- #
73
- # @example with a coercible object
74
- # Virtus::Coercion::Object.to_integer(1) # => 1
75
- #
76
- # @example with an object that is not coercible
77
- # Virtus::Coercion::Object.to_integer(value) # => value
78
- #
79
- # @param [#to_int, Object] value
80
- #
81
- # @return [Integer]
82
- # returns an Integer when the object can be coerced
83
- # @return [Object]
84
- # returns the value when the object cannot be coerced
85
- #
86
- # @api public
87
- def self.to_integer(value)
88
- coerce_with_method(value, :to_int)
89
- end
90
-
91
- # Passthrough given value
92
- #
93
- # @param [Object] value
94
- #
95
- # @return [Object]
96
- #
97
- # @api private
98
- def self.method_missing(method, *args)
99
- if method.to_s =~ COERCION_METHOD_REGEXP and args.size == 1
100
- args.first
101
- else
102
- super
103
- end
104
- end
105
-
106
- private_class_method :method_missing
107
-
108
- # Try to use native coercion method on the given value
109
- #
110
- # @param [Object] value
111
- #
112
- # @param [Symbol] method
113
- #
114
- # @return [Object]
115
- #
116
- # @api private
117
- def self.coerce_with_method(value, method)
118
- value.respond_to?(method) ? value.public_send(method) : value
119
- end
120
-
121
- private_class_method :coerce_with_method
122
-
123
- end # class Object
124
- end # class Coercion
125
- end # module Virtus