]> granicus.if.org Git - python/commitdiff
bpo-31307: Make ConfigParser.read() accept bytes objects (GH-3420)
authorVincent Michel <vxgmichel@gmail.com>
Thu, 2 Nov 2017 12:47:04 +0000 (13:47 +0100)
committerBerker Peksag <berker.peksag@gmail.com>
Thu, 2 Nov 2017 12:47:04 +0000 (15:47 +0300)
Doc/library/configparser.rst
Lib/configparser.py
Lib/test/test_configparser.py
Misc/NEWS.d/next/Library/2017-09-07-12-50-28.bpo-31307.AVBiNY.rst [new file with mode: 0644]

index acca64701110b26cfcc9b61672d73238f61b5041..dd8257720b7c5fec98ccc987a461d710894e794a 100644 (file)
@@ -995,7 +995,8 @@ ConfigParser Objects
       Attempt to read and parse a list of filenames, returning a list of
       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
       file will be ignored.  This is designed so that you can specify a list of
       potential configuration file locations (for example, the current
@@ -1022,6 +1023,9 @@ ConfigParser Objects
       .. versionadded:: 3.6.1
          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)
 
index e172ac8b36f990dab3c3a0965178fc2cbe895b05..33dc9b9046f102a414b41a26389e5306b2107330 100644 (file)
@@ -687,7 +687,7 @@ class RawConfigParser(MutableMapping):
 
         Return list of successfully read files.
         """
-        if isinstance(filenames, (str, os.PathLike)):
+        if isinstance(filenames, (str, bytes, os.PathLike)):
             filenames = [filenames]
         read_ok = []
         for filename in filenames:
index d8969efc4db937d88cfb933f0be7960f047009a8..4d07203b9dac289732da580a88e10262266e7cf1 100644 (file)
@@ -740,6 +740,23 @@ boolean {0[0]} NO
         parsed_files = cf.read([])
         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
     def get_interpolation_config(self):
         return self.fromstring(
diff --git a/Misc/NEWS.d/next/Library/2017-09-07-12-50-28.bpo-31307.AVBiNY.rst b/Misc/NEWS.d/next/Library/2017-09-07-12-50-28.bpo-31307.AVBiNY.rst
new file mode 100644 (file)
index 0000000..7e649aa
--- /dev/null
@@ -0,0 +1,2 @@
+Allow use of bytes objects for arguments to
+:meth:`configparser.ConfigParser.read`. Patch by Vincent Michel.