diff options
author | Marek Kirejczyk <marekkirejczyk@users.noreply.github.com> | 2016-05-21 14:14:22 +0200 |
---|---|---|
committer | Rafael França <rafaelmfranca@gmail.com> | 2016-05-21 09:14:22 -0300 |
commit | dd829df07e632209404b025423f57d63148d0867 (patch) | |
tree | 99118e90592dcbbfc11b836e878b6487c363ef58 | |
parent | 91421984b7182a483db0f96239e2d5f27ea3a9de (diff) | |
download | rails-dd829df07e632209404b025423f57d63148d0867.tar.gz rails-dd829df07e632209404b025423f57d63148d0867.tar.bz2 rails-dd829df07e632209404b025423f57d63148d0867.zip |
Fix Hash#from_xml with frozen strings (#24718)
* Hash#from_xml works with frozen strings
Fixes #24647
* Fix rexml engine test
[Marek Kirejczyk + Rafael Mendonça França]
-rw-r--r-- | activesupport/lib/active_support/xml_mini/rexml.rb | 4 | ||||
-rw-r--r-- | activesupport/test/xml_mini/rexml_engine_test.rb | 26 |
2 files changed, 19 insertions, 11 deletions
diff --git a/activesupport/lib/active_support/xml_mini/rexml.rb b/activesupport/lib/active_support/xml_mini/rexml.rb index 924ed72345..95af5af2c0 100644 --- a/activesupport/lib/active_support/xml_mini/rexml.rb +++ b/activesupport/lib/active_support/xml_mini/rexml.rb @@ -20,11 +20,9 @@ module ActiveSupport data = StringIO.new(data || '') end - char = data.getc - if char.nil? + if data.eof? {} else - data.ungetc(char) silence_warnings { require 'rexml/document' } unless defined?(REXML::Document) doc = REXML::Document.new(data) diff --git a/activesupport/test/xml_mini/rexml_engine_test.rb b/activesupport/test/xml_mini/rexml_engine_test.rb index f0067ca656..6e9ce7ac11 100644 --- a/activesupport/test/xml_mini/rexml_engine_test.rb +++ b/activesupport/test/xml_mini/rexml_engine_test.rb @@ -22,14 +22,24 @@ class REXMLEngineTest < ActiveSupport::TestCase morning </root> eoxml - assert_equal_rexml(io) + hash = ActiveSupport::XmlMini.parse(io) + assert hash.has_key?('root') + assert hash['root'].has_key?('products') + assert_match "good", hash['root']['__content__'] + products = hash['root']['products'] + assert products.has_key?("__content__") + assert_match 'hello everyone', products['__content__'] + end + + def test_parse_from_empty_string + ActiveSupport::XmlMini.backend = 'REXML' + assert_equal({}, ActiveSupport::XmlMini.parse("")) + end + + def test_parse_from_frozen_string + ActiveSupport::XmlMini.backend = 'REXML' + xml_string = "<root></root>".freeze + assert_equal({"root" => {}}, ActiveSupport::XmlMini.parse(xml_string)) end - private - def assert_equal_rexml(xml) - parsed_xml = ActiveSupport::XmlMini.parse(xml) - xml.rewind if xml.respond_to?(:rewind) - hash = ActiveSupport::XmlMini.with_backend('REXML') { ActiveSupport::XmlMini.parse(xml) } - assert_equal(hash, parsed_xml) - end end |