Kaydet (Commit) 929b7047 authored tarafından Mickaël Schoentgen's avatar Mickaël Schoentgen Kaydeden (comit) Stefan Behnel

bpo-31658: Make xml.sax.parse accepting Path objects (GH-8564)

üst e9927e18
...@@ -102,13 +102,17 @@ The :class:`XMLReader` interface supports the following methods: ...@@ -102,13 +102,17 @@ The :class:`XMLReader` interface supports the following methods:
Process an input source, producing SAX events. The *source* object can be a Process an input source, producing SAX events. The *source* object can be a
system identifier (a string identifying the input source -- typically a file system identifier (a string identifying the input source -- typically a file
name or a URL), a file-like object, or an :class:`InputSource` object. When name or a URL), a :class:`pathlib.Path` or :term:`path-like <path-like object>`
object, or an :class:`InputSource` object. When
:meth:`parse` returns, the input is completely processed, and the parser object :meth:`parse` returns, the input is completely processed, and the parser object
can be discarded or reset. can be discarded or reset.
.. versionchanged:: 3.5 .. versionchanged:: 3.5
Added support of character streams. Added support of character streams.
.. versionchanged:: 3.8
Added support of path-like objects.
.. method:: XMLReader.getContentHandler() .. method:: XMLReader.getContentHandler()
......
...@@ -21,7 +21,7 @@ import os.path ...@@ -21,7 +21,7 @@ import os.path
import shutil import shutil
from urllib.error import URLError from urllib.error import URLError
from test import support from test import support
from test.support import findfile, run_unittest, TESTFN from test.support import findfile, run_unittest, FakePath, TESTFN
TEST_XMLFILE = findfile("test.xml", subdir="xmltestdata") TEST_XMLFILE = findfile("test.xml", subdir="xmltestdata")
TEST_XMLFILE_OUT = findfile("test.xml.out", subdir="xmltestdata") TEST_XMLFILE_OUT = findfile("test.xml.out", subdir="xmltestdata")
...@@ -182,6 +182,10 @@ class ParseTest(unittest.TestCase): ...@@ -182,6 +182,10 @@ class ParseTest(unittest.TestCase):
with self.assertRaises(SAXException): with self.assertRaises(SAXException):
self.check_parse(f) self.check_parse(f)
def test_parse_path_object(self):
make_xml_file(self.data, 'utf-8', None)
self.check_parse(FakePath(TESTFN))
def test_parse_InputSource(self): def test_parse_InputSource(self):
# accept data without declared but with explicitly specified encoding # accept data without declared but with explicitly specified encoding
make_xml_file(self.data, 'iso-8859-1', None) make_xml_file(self.data, 'iso-8859-1', None)
...@@ -397,6 +401,13 @@ class PrepareInputSourceTest(unittest.TestCase): ...@@ -397,6 +401,13 @@ class PrepareInputSourceTest(unittest.TestCase):
self.checkContent(prep.getByteStream(), self.checkContent(prep.getByteStream(),
b"This was read from a file.") b"This was read from a file.")
def test_path_objects(self):
# If the source is a Path object, use it as a system ID and open it.
prep = prepare_input_source(FakePath(self.file))
self.assertIsNone(prep.getCharacterStream())
self.checkContent(prep.getByteStream(),
b"This was read from a file.")
def test_binary_file(self): def test_binary_file(self):
# If the source is a binary file-like object, use it as a byte # If the source is a binary file-like object, use it as a byte
# stream. # stream.
......
...@@ -339,6 +339,8 @@ def prepare_input_source(source, base=""): ...@@ -339,6 +339,8 @@ def prepare_input_source(source, base=""):
"""This function takes an InputSource and an optional base URL and """This function takes an InputSource and an optional base URL and
returns a fully resolved InputSource object ready for reading.""" returns a fully resolved InputSource object ready for reading."""
if isinstance(source, os.PathLike):
source = os.fspath(source)
if isinstance(source, str): if isinstance(source, str):
source = xmlreader.InputSource(source) source = xmlreader.InputSource(source)
elif hasattr(source, "read"): elif hasattr(source, "read"):
......
:func:`xml.sax.parse` now supports :term:`path-like <path-like object>`.
Patch by Mickaël Schoentgen.
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