Commit c8d62ec5 authored by Georg Brandl's avatar Georg Brandl

Issue #17915: Fix interoperability of xml.sax with file objects returned by

codecs.open().
parent aff10545
...@@ -15,6 +15,7 @@ from xml.sax.expatreader import create_parser ...@@ -15,6 +15,7 @@ from xml.sax.expatreader import create_parser
from xml.sax.handler import feature_namespaces from xml.sax.handler import feature_namespaces
from xml.sax.xmlreader import InputSource, AttributesImpl, AttributesNSImpl from xml.sax.xmlreader import InputSource, AttributesImpl, AttributesNSImpl
from io import BytesIO, StringIO from io import BytesIO, StringIO
import codecs
import os.path import os.path
import shutil import shutil
from test import support from test import support
...@@ -538,6 +539,34 @@ class WriterXmlgenTest(BytesXmlgenTest): ...@@ -538,6 +539,34 @@ class WriterXmlgenTest(BytesXmlgenTest):
def getvalue(self): def getvalue(self):
return b''.join(self) return b''.join(self)
class StreamWriterXmlgenTest(XmlgenTest, unittest.TestCase):
def ioclass(self):
raw = BytesIO()
writer = codecs.getwriter('ascii')(raw, 'xmlcharrefreplace')
writer.getvalue = raw.getvalue
return writer
def xml(self, doc, encoding='iso-8859-1'):
return ('<?xml version="1.0" encoding="%s"?>\n%s' %
(encoding, doc)).encode('ascii', 'xmlcharrefreplace')
class StreamReaderWriterXmlgenTest(XmlgenTest, unittest.TestCase):
fname = support.TESTFN + '-codecs'
def ioclass(self):
writer = codecs.open(self.fname, 'w', encoding='ascii',
errors='xmlcharrefreplace', buffering=0)
self.addCleanup(support.unlink, self.fname)
writer.getvalue = self.getvalue
return writer
def getvalue(self):
with open(self.fname, 'rb') as f:
return f.read()
def xml(self, doc, encoding='iso-8859-1'):
return ('<?xml version="1.0" encoding="%s"?>\n%s' %
(encoding, doc)).encode('ascii', 'xmlcharrefreplace')
start = b'<?xml version="1.0" encoding="iso-8859-1"?>\n' start = b'<?xml version="1.0" encoding="iso-8859-1"?>\n'
...@@ -946,6 +975,8 @@ def test_main(): ...@@ -946,6 +975,8 @@ def test_main():
StringXmlgenTest, StringXmlgenTest,
BytesXmlgenTest, BytesXmlgenTest,
WriterXmlgenTest, WriterXmlgenTest,
StreamWriterXmlgenTest,
StreamReaderWriterXmlgenTest,
ExpatReaderTest, ExpatReaderTest,
ErrorReportingTest, ErrorReportingTest,
XmlReaderTest) XmlReaderTest)
......
...@@ -5,6 +5,7 @@ convenience of application and driver writers. ...@@ -5,6 +5,7 @@ convenience of application and driver writers.
import os, urllib.parse, urllib.request import os, urllib.parse, urllib.request
import io import io
import codecs
from . import handler from . import handler
from . import xmlreader from . import xmlreader
...@@ -77,6 +78,10 @@ def _gettextwriter(out, encoding): ...@@ -77,6 +78,10 @@ def _gettextwriter(out, encoding):
# use a text writer as is # use a text writer as is
return out return out
if isinstance(out, (codecs.StreamWriter, codecs.StreamReaderWriter)):
# use a codecs stream writer as is
return out
# wrap a binary writer with TextIOWrapper # wrap a binary writer with TextIOWrapper
if isinstance(out, io.RawIOBase): if isinstance(out, io.RawIOBase):
# Keep the original file open when the TextIOWrapper is # Keep the original file open when the TextIOWrapper is
......
...@@ -20,6 +20,9 @@ Library ...@@ -20,6 +20,9 @@ Library
- Issue #1159051: Back out a fix for handling corrupted gzip files that - Issue #1159051: Back out a fix for handling corrupted gzip files that
broke backwards compatibility. broke backwards compatibility.
- Issue #17915: Fix interoperability of xml.sax with file objects returned by
codecs.open().
Build Build
----- -----
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment