Hash#to_xml handles symbol values. Closes #9954.
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@7997 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
parent
902533e6f0
commit
24077a1ffc
|
@ -1,5 +1,7 @@
|
|||
*SVN*
|
||||
|
||||
* Hash#to_xml handles symbol values. #9954 [Assaf]
|
||||
|
||||
* Hash#symbolize_keys behaves well with integer keys. #9890 [PotatoSalad]
|
||||
|
||||
* Multibyte: String#slice supports regexp argument. #9646 [yob]
|
||||
|
|
|
@ -47,6 +47,7 @@ module ActiveSupport #:nodoc:
|
|||
module Hash #:nodoc:
|
||||
module Conversions
|
||||
XML_TYPE_NAMES = {
|
||||
"Symbol" => "symbol",
|
||||
"Fixnum" => "integer",
|
||||
"Bignum" => "integer",
|
||||
"BigDecimal" => "decimal",
|
||||
|
@ -59,14 +60,18 @@ module ActiveSupport #:nodoc:
|
|||
} unless defined?(XML_TYPE_NAMES)
|
||||
|
||||
XML_FORMATTING = {
|
||||
"symbol" => Proc.new { |symbol| symbol.to_s },
|
||||
"date" => Proc.new { |date| date.to_s(:db) },
|
||||
"datetime" => Proc.new { |time| time.xmlschema },
|
||||
"binary" => Proc.new { |binary| Base64.encode64(binary) },
|
||||
"yaml" => Proc.new { |yaml| yaml.to_yaml }
|
||||
} unless defined?(XML_FORMATTING)
|
||||
|
||||
# TODO: use Time.xmlschema instead of Time.parse;
|
||||
# use regexp instead of Date.parse
|
||||
unless defined?(XML_PARSING)
|
||||
XML_PARSING = {
|
||||
"symbol" => Proc.new { |symbol| symbol.to_sym },
|
||||
"date" => Proc.new { |date| ::Date.parse(date) },
|
||||
"datetime" => Proc.new { |time| ::Time.parse(time).utc },
|
||||
"integer" => Proc.new { |integer| integer.to_i },
|
||||
|
|
|
@ -336,13 +336,14 @@ class HashToXmlTest < Test::Unit::TestCase
|
|||
end
|
||||
|
||||
def test_one_level_with_types
|
||||
xml = { :name => "David", :street => "Paulina", :age => 26, :age_in_millis => 820497600000, :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), :resident => :yes }.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>))
|
||||
assert xml.include?(%(<resident type="symbol">yes</resident>))
|
||||
end
|
||||
|
||||
def test_one_level_with_nils
|
||||
|
@ -416,6 +417,7 @@ class HashToXmlTest < Test::Unit::TestCase
|
|||
<parent-id></parent-id>
|
||||
<ad-revenue type="decimal">1.5</ad-revenue>
|
||||
<optimum-viewing-angle type="float">135</optimum-viewing-angle>
|
||||
<resident type="symbol">yes</resident>
|
||||
</topic>
|
||||
EOT
|
||||
|
||||
|
@ -432,7 +434,8 @@ class HashToXmlTest < Test::Unit::TestCase
|
|||
:author_email_address => "david@loudthinking.com",
|
||||
:parent_id => nil,
|
||||
:ad_revenue => BigDecimal("1.50"),
|
||||
:optimum_viewing_angle => 135.0
|
||||
:optimum_viewing_angle => 135.0,
|
||||
:resident => :yes
|
||||
}.stringify_keys
|
||||
|
||||
assert_equal expected_topic_hash, Hash.from_xml(topic_xml)["topic"]
|
||||
|
|
Loading…
Reference in New Issue