bpo-31658: Make xml.sax.parse accepting Path objects (GH-8564)
This commit is contained in:
parent
e9927e1820
commit
929b704738
|
@ -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
|
||||
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
|
||||
can be discarded or reset.
|
||||
|
||||
.. versionchanged:: 3.5
|
||||
Added support of character streams.
|
||||
|
||||
.. versionchanged:: 3.8
|
||||
Added support of path-like objects.
|
||||
|
||||
|
||||
.. method:: XMLReader.getContentHandler()
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@ import os.path
|
|||
import shutil
|
||||
from urllib.error import URLError
|
||||
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_OUT = findfile("test.xml.out", subdir="xmltestdata")
|
||||
|
@ -182,6 +182,10 @@ class ParseTest(unittest.TestCase):
|
|||
with self.assertRaises(SAXException):
|
||||
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):
|
||||
# accept data without declared but with explicitly specified encoding
|
||||
make_xml_file(self.data, 'iso-8859-1', None)
|
||||
|
@ -397,6 +401,13 @@ class PrepareInputSourceTest(unittest.TestCase):
|
|||
self.checkContent(prep.getByteStream(),
|
||||
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):
|
||||
# If the source is a binary file-like object, use it as a byte
|
||||
# stream.
|
||||
|
|
|
@ -339,6 +339,8 @@ def prepare_input_source(source, base=""):
|
|||
"""This function takes an InputSource and an optional base URL and
|
||||
returns a fully resolved InputSource object ready for reading."""
|
||||
|
||||
if isinstance(source, os.PathLike):
|
||||
source = os.fspath(source)
|
||||
if isinstance(source, str):
|
||||
source = xmlreader.InputSource(source)
|
||||
elif hasattr(source, "read"):
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
:func:`xml.sax.parse` now supports :term:`path-like <path-like object>`.
|
||||
Patch by Mickaël Schoentgen.
|
Loading…
Reference in New Issue