Issue #28225: Merge from 3.6

This commit is contained in:
Berker Peksag 2016-10-02 20:07:38 +03:00
commit f63f12b479
4 changed files with 25 additions and 7 deletions

View File

@ -61,6 +61,9 @@ All of the classes in this module may safely be accessed from multiple threads.
.. versionchanged:: 3.4 .. versionchanged:: 3.4
The ``'x'`` (exclusive creation) mode was added. 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) .. 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 The :meth:`~io.BufferedIOBase.read` method now accepts an argument of
``None``. ``None``.
.. versionchanged:: 3.6
Accepts a :term:`path-like object`.
Incremental (de)compression Incremental (de)compression
--------------------------- ---------------------------

View File

@ -11,6 +11,7 @@ __author__ = "Nadeem Vawda <nadeem.vawda@gmail.com>"
from builtins import open as _builtin_open from builtins import open as _builtin_open
import io import io
import os
import warnings import warnings
import _compression import _compression
@ -42,9 +43,9 @@ class BZ2File(_compression.BaseStream):
def __init__(self, filename, mode="r", buffering=None, compresslevel=9): def __init__(self, filename, mode="r", buffering=None, compresslevel=9):
"""Open a bzip2-compressed file. """Open a bzip2-compressed file.
If filename is a str or bytes object, it gives the name If filename is a str, bytes, or PathLike object, it gives the
of the file to be opened. Otherwise, it should be a file object, name of the file to be opened. Otherwise, it should be a file
which will be used to read or write the compressed data. object, which will be used to read or write the compressed data.
mode can be 'r' for reading (default), 'w' for (over)writing, mode can be 'r' for reading (default), 'w' for (over)writing,
'x' for creating exclusively, or 'a' for appending. These can 'x' for creating exclusively, or 'a' for appending. These can
@ -91,7 +92,7 @@ class BZ2File(_compression.BaseStream):
else: else:
raise ValueError("Invalid mode: %r" % (mode,)) 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._fp = _builtin_open(filename, mode)
self._closefp = True self._closefp = True
self._mode = mode_code self._mode = mode_code
@ -99,7 +100,7 @@ class BZ2File(_compression.BaseStream):
self._fp = filename self._fp = filename
self._mode = mode_code self._mode = mode_code
else: 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: if self._mode == _MODE_READ:
raw = _compression.DecompressReader(self._fp, raw = _compression.DecompressReader(self._fp,
@ -289,8 +290,9 @@ def open(filename, mode="rb", compresslevel=9,
encoding=None, errors=None, newline=None): encoding=None, errors=None, newline=None):
"""Open a bzip2-compressed file in binary or text mode. """Open a bzip2-compressed file in binary or text mode.
The filename argument can be an actual filename (a str or bytes The filename argument can be an actual filename (a str, bytes, or
object), or an existing file object to read from or write to. 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 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. "ab" for binary mode, or "rt", "wt", "xt" or "at" for text mode.

View File

@ -6,6 +6,7 @@ from io import BytesIO, DEFAULT_BUFFER_SIZE
import os import os
import pickle import pickle
import glob import glob
import pathlib
import random import random
import subprocess import subprocess
import sys import sys
@ -560,6 +561,13 @@ class BZ2FileTest(BaseTest):
with BZ2File(str_filename, "rb") as f: with BZ2File(str_filename, "rb") as f:
self.assertEqual(f.read(), self.DATA) 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): def testDecompressLimited(self):
"""Decompressed data buffering should be limited""" """Decompressed data buffering should be limited"""
bomb = bz2.compress(b'\0' * int(2e6), compresslevel=9) bomb = bz2.compress(b'\0' * int(2e6), compresslevel=9)

View File

@ -54,6 +54,8 @@ Core and Builtins
Library Library
------- -------
- Issue #28225: bz2 module now supports pathlib. Initial patch by Ethan Furman.
- Issue #28227: gzip now supports pathlib. Patch by Ethan Furman. - Issue #28227: gzip now supports pathlib. Patch by Ethan Furman.
- Issue #28332: Deprecated silent truncations in socket.htons and socket.ntohs. - Issue #28332: Deprecated silent truncations in socket.htons and socket.ntohs.