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

Stefan Behnel webhook-mailer at python.org
Sun Apr 14 05:17:13 EDT 2019


https://github.com/python/cpython/commit/929b70473829f04dedb8e802abcbd506926886e1
commit: 929b70473829f04dedb8e802abcbd506926886e1
branch: master
author: Mickaël Schoentgen <contact at tiger-222.fr>
committer: Stefan Behnel <stefan_ml at behnel.de>
date: 2019年04月14日T11:16:54+02:00
summary:
bpo-31658: Make xml.sax.parse accepting Path objects (GH-8564)
files:
A Misc/NEWS.d/next/Library/2018-07-30-12-00-15.bpo-31658._bx7a_.rst
M Doc/library/xml.sax.reader.rst
M Lib/test/test_sax.py
M Lib/xml/sax/saxutils.py
diff --git a/Doc/library/xml.sax.reader.rst b/Doc/library/xml.sax.reader.rst
index 1b6e43145b90..113e9e93fb04 100644
--- a/Doc/library/xml.sax.reader.rst
+++ b/Doc/library/xml.sax.reader.rst
@@ -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()
 
diff --git a/Lib/test/test_sax.py b/Lib/test/test_sax.py
index 9addc06f20dd..da4eb1da3c6a 100644
--- a/Lib/test/test_sax.py
+++ b/Lib/test/test_sax.py
@@ -21,7 +21,7 @@
 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 @@ def test_parse_bytes(self):
 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 @@ def test_string(self):
 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.
diff --git a/Lib/xml/sax/saxutils.py b/Lib/xml/sax/saxutils.py
index b4fc2da76408..c1612ea1cebc 100644
--- a/Lib/xml/sax/saxutils.py
+++ b/Lib/xml/sax/saxutils.py
@@ -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"):
diff --git a/Misc/NEWS.d/next/Library/2018-07-30-12-00-15.bpo-31658._bx7a_.rst b/Misc/NEWS.d/next/Library/2018-07-30-12-00-15.bpo-31658._bx7a_.rst
new file mode 100644
index 000000000000..8b35060fd737
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2018-07-30-12-00-15.bpo-31658._bx7a_.rst
@@ -0,0 +1,2 @@
+:func:`xml.sax.parse` now supports :term:`path-like <path-like object>`.
+Patch by Mickaël Schoentgen.


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /