bpo-31307: Make ConfigParser.read() accept bytes objects (GH-3420)
This commit is contained in:
parent
a64ce973a3
commit
e314853d57
|
@ -995,7 +995,8 @@ ConfigParser Objects
|
||||||
Attempt to read and parse a list of filenames, returning a list of
|
Attempt to read and parse a list of filenames, returning a list of
|
||||||
filenames which were successfully parsed.
|
filenames which were successfully parsed.
|
||||||
|
|
||||||
If *filenames* is a string or :term:`path-like object`, it is treated as
|
If *filenames* is a string, a :class:`bytes` object or a
|
||||||
|
:term:`path-like object`, it is treated as
|
||||||
a single filename. If a file named in *filenames* cannot be opened, that
|
a single filename. If a file named in *filenames* cannot be opened, that
|
||||||
file will be ignored. This is designed so that you can specify a list of
|
file will be ignored. This is designed so that you can specify a list of
|
||||||
potential configuration file locations (for example, the current
|
potential configuration file locations (for example, the current
|
||||||
|
@ -1022,6 +1023,9 @@ ConfigParser Objects
|
||||||
.. versionadded:: 3.6.1
|
.. versionadded:: 3.6.1
|
||||||
The *filenames* parameter accepts a :term:`path-like object`.
|
The *filenames* parameter accepts a :term:`path-like object`.
|
||||||
|
|
||||||
|
.. versionadded:: 3.7
|
||||||
|
The *filenames* parameter accepts a :class:`bytes` object.
|
||||||
|
|
||||||
|
|
||||||
.. method:: read_file(f, source=None)
|
.. method:: read_file(f, source=None)
|
||||||
|
|
||||||
|
|
|
@ -687,7 +687,7 @@ class RawConfigParser(MutableMapping):
|
||||||
|
|
||||||
Return list of successfully read files.
|
Return list of successfully read files.
|
||||||
"""
|
"""
|
||||||
if isinstance(filenames, (str, os.PathLike)):
|
if isinstance(filenames, (str, bytes, os.PathLike)):
|
||||||
filenames = [filenames]
|
filenames = [filenames]
|
||||||
read_ok = []
|
read_ok = []
|
||||||
for filename in filenames:
|
for filename in filenames:
|
||||||
|
|
|
@ -740,6 +740,23 @@ boolean {0[0]} NO
|
||||||
parsed_files = cf.read([])
|
parsed_files = cf.read([])
|
||||||
self.assertEqual(parsed_files, [])
|
self.assertEqual(parsed_files, [])
|
||||||
|
|
||||||
|
def test_read_returns_file_list_with_bytestring_path(self):
|
||||||
|
if self.delimiters[0] != '=':
|
||||||
|
self.skipTest('incompatible format')
|
||||||
|
file1_bytestring = support.findfile("cfgparser.1").encode()
|
||||||
|
# check when passing an existing bytestring path
|
||||||
|
cf = self.newconfig()
|
||||||
|
parsed_files = cf.read(file1_bytestring)
|
||||||
|
self.assertEqual(parsed_files, [file1_bytestring])
|
||||||
|
# check when passing an non-existing bytestring path
|
||||||
|
cf = self.newconfig()
|
||||||
|
parsed_files = cf.read(b'nonexistent-file')
|
||||||
|
self.assertEqual(parsed_files, [])
|
||||||
|
# check when passing both an existing and non-existing bytestring path
|
||||||
|
cf = self.newconfig()
|
||||||
|
parsed_files = cf.read([file1_bytestring, b'nonexistent-file'])
|
||||||
|
self.assertEqual(parsed_files, [file1_bytestring])
|
||||||
|
|
||||||
# shared by subclasses
|
# shared by subclasses
|
||||||
def get_interpolation_config(self):
|
def get_interpolation_config(self):
|
||||||
return self.fromstring(
|
return self.fromstring(
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Allow use of bytes objects for arguments to
|
||||||
|
:meth:`configparser.ConfigParser.read`. Patch by Vincent Michel.
|
Loading…
Reference in New Issue