mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Fix that empty collections should be treated as empty arrays regardless of whitespace for Hash#from_xml (closes #10255) [adamj]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@8202 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
parent
ccebac9d1f
commit
4d96ece6ec
3 changed files with 26 additions and 13 deletions
|
@ -1,5 +1,7 @@
|
|||
*SVN*
|
||||
|
||||
* Fix that empty collections should be treated as empty arrays regardless of whitespace for Hash#from_xml #10255 [adamj]
|
||||
|
||||
* Time#time_with_datetime_fallback, Time#to_datetime, Date#to_datetime and String#to_datetime honor Ruby's default calendar reform setting. #10201 [Geoff Buesing]
|
||||
|
||||
* Change Time and DateTime #end_of_month to return last second of month instead of beginning of last day of month. Closes #10200 [Geoff Buesing]
|
||||
|
|
|
@ -174,20 +174,9 @@ module ActiveSupport #:nodoc:
|
|||
def typecast_xml_value(value)
|
||||
case value.class.to_s
|
||||
when 'Hash'
|
||||
if value.has_key?("__content__")
|
||||
content = value["__content__"]
|
||||
if parser = XML_PARSING[value["type"]]
|
||||
if parser.arity == 2
|
||||
XML_PARSING[value["type"]].call(content, value)
|
||||
else
|
||||
XML_PARSING[value["type"]].call(content)
|
||||
end
|
||||
else
|
||||
content
|
||||
end
|
||||
elsif value['type'] == 'array'
|
||||
if value['type'] == 'array'
|
||||
child_key, entries = value.detect { |k,v| k != 'type' } # child_key is throwaway
|
||||
if entries.nil?
|
||||
if entries.nil? || (c = value['__content__'] && c.blank?)
|
||||
[]
|
||||
else
|
||||
case entries.class.to_s # something weird with classes not matching here. maybe singleton methods breaking is_a?
|
||||
|
@ -199,6 +188,17 @@ module ActiveSupport #:nodoc:
|
|||
raise "can't typecast #{entries.inspect}"
|
||||
end
|
||||
end
|
||||
elsif value.has_key?("__content__")
|
||||
content = value["__content__"]
|
||||
if parser = XML_PARSING[value["type"]]
|
||||
if parser.arity == 2
|
||||
XML_PARSING[value["type"]].call(content, value)
|
||||
else
|
||||
XML_PARSING[value["type"]].call(content)
|
||||
end
|
||||
else
|
||||
content
|
||||
end
|
||||
elsif value['type'] == 'string' && value['nil'] != 'true'
|
||||
""
|
||||
# blank or nil parsed values are represented by nil
|
||||
|
|
|
@ -549,6 +549,17 @@ class HashToXmlTest < Test::Unit::TestCase
|
|||
assert_equal expected_blog_hash, Hash.from_xml(blog_xml)
|
||||
end
|
||||
|
||||
def test_empty_array_with_whitespace_from_xml
|
||||
blog_xml = <<-XML
|
||||
<blog>
|
||||
<posts type="array">
|
||||
</posts>
|
||||
</blog>
|
||||
XML
|
||||
expected_blog_hash = {"blog" => {"posts" => []}}
|
||||
assert_equal expected_blog_hash, Hash.from_xml(blog_xml)
|
||||
end
|
||||
|
||||
def test_array_with_one_entry_from_xml
|
||||
blog_xml = <<-XML
|
||||
<blog>
|
||||
|
|
Loading…
Reference in a new issue