]> granicus.if.org Git - python/commitdiff
Issue #28225: bz2 module now supports pathlib
authorBerker Peksag <berker.peksag@gmail.com>
Sun, 2 Oct 2016 17:07:06 +0000 (20:07 +0300)
committerBerker Peksag <berker.peksag@gmail.com>
Sun, 2 Oct 2016 17:07:06 +0000 (20:07 +0300)
Initial patch by Ethan Furman.

Doc/library/bz2.rst
Lib/bz2.py
Lib/test/test_bz2.py
Misc/NEWS

index 6c49d9fffe9c1187a05fe1dc865227cd082294db..d5f622515a40f04b46a479519ae1b11f40f9cfcc 100644 (file)
@@ -61,6 +61,9 @@ All of the classes in this module may safely be accessed from multiple threads.
    .. versionchanged:: 3.4
       The ``'x'`` (exclusive creation) mode was added.
 
+   .. versionchanged:: 3.6
+      Accepts a :term:`path-like object`.
+
 
 .. class:: BZ2File(filename, mode='r', buffering=None, compresslevel=9)
 
@@ -128,6 +131,9 @@ All of the classes in this module may safely be accessed from multiple threads.
       The :meth:`~io.BufferedIOBase.read` method now accepts an argument of
       ``None``.
 
+   .. versionchanged:: 3.6
+      Accepts a :term:`path-like object`.
+
 
 Incremental (de)compression
 ---------------------------
index bc78c544851203bf0c25592e642b6188488d25e9..6f56328b9b233391b265589cc46a3bbd453402af 100644 (file)
@@ -11,6 +11,7 @@ __author__ = "Nadeem Vawda <nadeem.vawda@gmail.com>"
 
 from builtins import open as _builtin_open
 import io
+import os
 import warnings
 import _compression
 
@@ -42,9 +43,9 @@ class BZ2File(_compression.BaseStream):
     def __init__(self, filename, mode="r", buffering=None, compresslevel=9):
         """Open a bzip2-compressed file.
 
-        If filename is a str or bytes object, it gives the name
-        of the file to be opened. Otherwise, it should be a file object,
-        which will be used to read or write the compressed data.
+        If filename is a str, bytes, or PathLike object, it gives the
+        name of the file to be opened. Otherwise, it should be a file
+        object, which will be used to read or write the compressed data.
 
         mode can be 'r' for reading (default), 'w' for (over)writing,
         'x' for creating exclusively, or 'a' for appending. These can
@@ -91,7 +92,7 @@ class BZ2File(_compression.BaseStream):
         else:
             raise ValueError("Invalid mode: %r" % (mode,))
 
-        if isinstance(filename, (str, bytes)):
+        if isinstance(filename, (str, bytes, os.PathLike)):
             self._fp = _builtin_open(filename, mode)
             self._closefp = True
             self._mode = mode_code
@@ -99,7 +100,7 @@ class BZ2File(_compression.BaseStream):
             self._fp = filename
             self._mode = mode_code
         else:
-            raise TypeError("filename must be a str or bytes object, or a file")
+            raise TypeError("filename must be a str, bytes, file or PathLike object")
 
         if self._mode == _MODE_READ:
             raw = _compression.DecompressReader(self._fp,
@@ -289,8 +290,9 @@ def open(filename, mode="rb", compresslevel=9,
          encoding=None, errors=None, newline=None):
     """Open a bzip2-compressed file in binary or text mode.
 
-    The filename argument can be an actual filename (a str or bytes
-    object), or an existing file object to read from or write to.
+    The filename argument can be an actual filename (a str, bytes, or
+    PathLike object), or an existing file object to read from or write
+    to.
 
     The mode argument can be "r", "rb", "w", "wb", "x", "xb", "a" or
     "ab" for binary mode, or "rt", "wt", "xt" or "at" for text mode.
index 46ad2c44d8909a891b6d8253b1bda15d1af1d82b..482242c00e33b8256d9b2433db21e6943fc05788 100644 (file)
@@ -6,6 +6,7 @@ from io import BytesIO, DEFAULT_BUFFER_SIZE
 import os
 import pickle
 import glob
+import pathlib
 import random
 import subprocess
 import sys
@@ -560,6 +561,13 @@ class BZ2FileTest(BaseTest):
         with BZ2File(str_filename, "rb") as f:
             self.assertEqual(f.read(), self.DATA)
 
+    def testOpenPathLikeFilename(self):
+        filename = pathlib.Path(self.filename)
+        with BZ2File(filename, "wb") as f:
+            f.write(self.DATA)
+        with BZ2File(filename, "rb") as f:
+            self.assertEqual(f.read(), self.DATA)
+
     def testDecompressLimited(self):
         """Decompressed data buffering should be limited"""
         bomb = bz2.compress(b'\0' * int(2e6), compresslevel=9)
index abf9c93dfb5c6faec869a25054b4955635d8e79c..bc4aa8c28196085d7900e12ee1dea249ae508c8d 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -46,6 +46,8 @@ Core and Builtins
 Library
 -------
 
+- Issue #28225: bz2 module now supports pathlib.  Initial patch by Ethan Furman.
+
 - Issue #28227: gzip now supports pathlib.  Patch by Ethan Furman.
 
 - Issue #27358: Optimized merging var-keyword arguments and improved error