Add support for a type=binary with an optional encoding=base64. If the encoding attribute is absent, the data is considered unencoded.

[#2966 state:resolved]
This commit is contained in:
Josh Franklin 2010-03-26 12:43:59 +01:00 committed by José Valim
parent 4c7c406155
commit c7cc958368
2 changed files with 12 additions and 1 deletions

@ -54,6 +54,15 @@ def content_type
"string" => Proc.new { |string| string.to_s }, "string" => Proc.new { |string| string.to_s },
"yaml" => Proc.new { |yaml| YAML::load(yaml) rescue yaml }, "yaml" => Proc.new { |yaml| YAML::load(yaml) rescue yaml },
"base64Binary" => Proc.new { |bin| ActiveSupport::Base64.decode64(bin) }, "base64Binary" => Proc.new { |bin| ActiveSupport::Base64.decode64(bin) },
"binary" => Proc.new do |bin, entity|
case entity['encoding']
when 'base64'
ActiveSupport::Base64.decode64(bin)
# TODO: Add support for other encodings
else
bin
end
end,
"file" => Proc.new do |file, entity| "file" => Proc.new do |file, entity|
f = StringIO.new(ActiveSupport::Base64.decode64(file)) f = StringIO.new(ActiveSupport::Base64.decode64(file))
f.extend(FileLike) f.extend(FileLike)

@ -757,6 +757,7 @@ def test_xsd_like_types_from_xml
<expires-at type="dateTime">2007-12-25T12:34:56+0000</expires-at> <expires-at type="dateTime">2007-12-25T12:34:56+0000</expires-at>
<notes type="string"></notes> <notes type="string"></notes>
<illustration type="base64Binary">YmFiZS5wbmc=</illustration> <illustration type="base64Binary">YmFiZS5wbmc=</illustration>
<caption type="binary" encoding="base64">VGhhdCdsbCBkbywgcGlnLg==</caption>
</bacon> </bacon>
EOT EOT
@ -766,7 +767,8 @@ def test_xsd_like_types_from_xml
:price => BigDecimal("12.50"), :price => BigDecimal("12.50"),
:expires_at => Time.utc(2007,12,25,12,34,56), :expires_at => Time.utc(2007,12,25,12,34,56),
:notes => "", :notes => "",
:illustration => "babe.png" :illustration => "babe.png",
:caption => "That'll do, pig."
}.stringify_keys }.stringify_keys
assert_equal expected_bacon_hash, Hash.from_xml(bacon_xml)["bacon"] assert_equal expected_bacon_hash, Hash.from_xml(bacon_xml)["bacon"]