Permalink
Browse files

Hash#to_xml supports Bignum and BigDecimal. Closes #6313.

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@5209 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
  • Loading branch information...
1 parent 7ac6ed8 commit cb978baafa68c9bb4f1311df417947249586f47d @jeremy jeremy committed Sep 29, 2006
View
2 activesupport/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*
+* Hash#to_xml supports Bignum and BigDecimal. #6313 [edibiase]
+
* Don't undefine #class in OptionMerger [Rick]
* Hash.create_from_xml has been renamed to Hash.from_xml, alias will exist until Rails 2.0 [DHH]
View
18 activesupport/lib/active_support/core_ext/hash/conversions.rb
@@ -6,13 +6,15 @@ module CoreExtensions #:nodoc:
module Hash #:nodoc:
module Conversions
XML_TYPE_NAMES = {
- ::Fixnum => "integer",
- ::Float => "float",
- ::Date => "date",
- ::DateTime => "datetime",
- ::Time => "datetime",
- ::TrueClass => "boolean",
- ::FalseClass => "boolean"
+ "Fixnum" => "integer",
+ "Bignum" => "integer",
+ "BigDecimal" => "numeric",
+ "Float" => "float",
+ "Date" => "date",
+ "DateTime" => "datetime",
+ "Time" => "datetime",
+ "TrueClass" => "boolean",
+ "FalseClass" => "boolean"
} unless defined? XML_TYPE_NAMES
XML_FORMATTING = {
@@ -56,7 +58,7 @@ def to_xml(options = {})
if value.respond_to?(:to_xml)
value.to_xml(options.merge({ :root => key, :skip_instruct => true }))
else
- type_name = XML_TYPE_NAMES[value.class]
+ type_name = XML_TYPE_NAMES[value.class.name]
key = dasherize ? key.to_s.dasherize : key.to_s
View
18 activesupport/test/core_ext/array_ext_test.rb
@@ -1,4 +1,5 @@
require File.dirname(__FILE__) + '/../abstract_unit'
+require 'bigdecimal'
class ArrayExtToParamTests < Test::Unit::TestCase
def test_string_array
@@ -116,19 +117,22 @@ def test_split_with_edge_values
class ArrayToXmlTests < Test::Unit::TestCase
def test_to_xml
xml = [
- { :name => "David", :age => 26 }, { :name => "Jason", :age => 31 }
+ { :name => "David", :age => 26, :age_in_millis => 820497600000 },
+ { :name => "Jason", :age => 31, :age_in_millis => BigDecimal.new('1.0') }
].to_xml(:skip_instruct => true, :indent => 0)
- assert_equal "<records><record>", xml.first(17)
- assert xml.include?(%(<age type="integer">26</age>))
- assert xml.include?(%(<name>David</name>))
- assert xml.include?(%(<age type="integer">31</age>))
- assert xml.include?(%(<name>Jason</name>))
+ assert_equal "<records><record>", xml.first(17), xml
+ assert xml.include?(%(<age type="integer">26</age>)), xml
+ assert xml.include?(%(<age-in-millis type="integer">820497600000</age-in-millis>)), xml
+ assert xml.include?(%(<name>David</name>)), xml
+ assert xml.include?(%(<age type="integer">31</age>)), xml
+ assert xml.include?(%(<age-in-millis type="numeric">1.0</age-in-millis>)), xml
+ assert xml.include?(%(<name>Jason</name>)), xml
end
def test_to_xml_with_dedicated_name
xml = [
- { :name => "David", :age => 26 }, { :name => "Jason", :age => 31 }
+ { :name => "David", :age => 26, :age_in_millis => 820497600000 }, { :name => "Jason", :age => 31 }
].to_xml(:skip_instruct => true, :indent => 0, :root => "people")
assert_equal "<people><person>", xml.first(16)
View
8 activesupport/test/core_ext/hash_ext_test.rb
@@ -255,11 +255,12 @@ def test_one_level_dasherize_true
end
def test_one_level_with_types
- xml = { :name => "David", :street => "Paulina", :age => 26, :moved_on => Date.new(2005, 11, 15) }.to_xml(@xml_options)
+ xml = { :name => "David", :street => "Paulina", :age => 26, :age_in_millis => 820497600000, :moved_on => Date.new(2005, 11, 15) }.to_xml(@xml_options)
assert_equal "<person>", xml.first(8)
assert xml.include?(%(<street>Paulina</street>))
assert xml.include?(%(<name>David</name>))
assert xml.include?(%(<age type="integer">26</age>))
+ assert xml.include?(%(<age-in-millis type="integer">820497600000</age-in-millis>))
assert xml.include?(%(<moved-on type="date">2005-11-15</moved-on>))
end
@@ -315,6 +316,7 @@ def test_single_record_from_xml
<id type="integer">1</id>
<approved type="boolean"> true </approved>
<replies-count type="integer">0</replies-count>
+ <replies-close-in type="integer">2592000000</replies-close-in>
<written-on type="date">2003-07-16</written-on>
<viewed-at type="datetime">2003-07-16T09:28:00+0000</viewed-at>
<content>Have a nice day</content>
@@ -329,6 +331,7 @@ def test_single_record_from_xml
:id => 1,
:approved => true,
:replies_count => 0,
+ :replies_close_in => 2592000000,
:written_on => Date.new(2003, 7, 16),
:viewed_at => Time.utc(2003, 7, 16, 9, 28),
:content => "Have a nice day",
@@ -372,6 +375,7 @@ def test_multiple_records_from_xml
<id type="integer">1</id>
<approved type="boolean">false</approved>
<replies-count type="integer">0</replies-count>
+ <replies-close-in type="integer">2592000000</replies-close-in>
<written-on type="date">2003-07-16</written-on>
<viewed-at type="datetime">2003-07-16T09:28:00+0000</viewed-at>
<content>Have a nice day</content>
@@ -384,6 +388,7 @@ def test_multiple_records_from_xml
<id type="integer">1</id>
<approved type="boolean">false</approved>
<replies-count type="integer">0</replies-count>
+ <replies-close-in type="integer">2592000000</replies-close-in>
<written-on type="date">2003-07-16</written-on>
<viewed-at type="datetime">2003-07-16T09:28:00+0000</viewed-at>
<content>Have a nice day</content>
@@ -399,6 +404,7 @@ def test_multiple_records_from_xml
:id => 1,
:approved => false,
:replies_count => 0,
+ :replies_close_in => 2592000000,
:written_on => Date.new(2003, 7, 16),
:viewed_at => Time.utc(2003, 7, 16, 9, 28),
:content => "Have a nice day",

0 comments on commit cb978ba

Please sign in to comment.