]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-47061: Deprecate `chunk` (GH-91419)
authorBrett Cannon <brett@python.org>
Mon, 11 Apr 2022 22:02:41 +0000 (15:02 -0700)
committerGitHub <noreply@github.com>
Mon, 11 Apr 2022 22:02:41 +0000 (15:02 -0700)
Doc/whatsnew/3.11.rst
Lib/aifc.py
Lib/chunk.py
Lib/wave.py
Misc/NEWS.d/next/Library/2022-04-10-11-11-33.gh-issue-91217.K82AuH.rst [new file with mode: 0644]

index df0b0a7fbebec93f60671b39fde970d69c5fa711..cc358b4ffdb2acd5107efe6c3d0b4f33040d14aa 100644 (file)
@@ -850,6 +850,7 @@ Deprecated
   * :mod:`audioop`
   * :mod:`cgi`
   * :mod:`cgitb`
+  * :mod:`chunk`
 
   (Contributed by Brett Cannon in :issue:`47061`.)
 
index 314cfd230d6cb67b7cb8b3869e740d2c53015268..5254987e22bc16716af52bdfafd67702c7dbf734 100644 (file)
@@ -255,7 +255,9 @@ def _write_float(f, x):
     _write_ulong(f, himant)
     _write_ulong(f, lomant)
 
-from chunk import Chunk
+with warnings.catch_warnings():
+    warnings.simplefilter("ignore", DeprecationWarning)
+    from chunk import Chunk
 from collections import namedtuple
 
 _aifc_params = namedtuple('_aifc_params',
index 870c39fe7f5037152dd5b430e6b6f3f7e5d7a8de..618781efd11e71593ac94032c101aa4038100029 100644 (file)
@@ -48,6 +48,10 @@ specifies whether or not chunks are aligned on 2-byte boundaries.  The
 default is 1, i.e. aligned.
 """
 
+import warnings
+
+warnings._deprecated(__name__, remove=(3, 13))
+
 class Chunk:
     def __init__(self, file, align=True, bigendian=True, inclheader=False):
         import struct
index 47a233df0a3ab8e06ff6f9f0b83c01c569a6e1ed..9a4557487b6e6392de7d6f67b20bdb1677ed1a09 100644 (file)
@@ -71,7 +71,6 @@ The close() method is called automatically when the class instance
 is destroyed.
 """
 
-from chunk import Chunk
 from collections import namedtuple
 import builtins
 import struct
@@ -100,6 +99,119 @@ def _byteswap(data, width):
     return bytes(swapped_data)
 
 
+class _Chunk:
+    def __init__(self, file, align=True, bigendian=True, inclheader=False):
+        import struct
+        self.closed = False
+        self.align = align      # whether to align to word (2-byte) boundaries
+        if bigendian:
+            strflag = '>'
+        else:
+            strflag = '<'
+        self.file = file
+        self.chunkname = file.read(4)
+        if len(self.chunkname) < 4:
+            raise EOFError
+        try:
+            self.chunksize = struct.unpack_from(strflag+'L', file.read(4))[0]
+        except struct.error:
+            raise EOFError from None
+        if inclheader:
+            self.chunksize = self.chunksize - 8 # subtract header
+        self.size_read = 0
+        try:
+            self.offset = self.file.tell()
+        except (AttributeError, OSError):
+            self.seekable = False
+        else:
+            self.seekable = True
+
+    def getname(self):
+        """Return the name (ID) of the current chunk."""
+        return self.chunkname
+
+    def close(self):
+        if not self.closed:
+            try:
+                self.skip()
+            finally:
+                self.closed = True
+
+    def seek(self, pos, whence=0):
+        """Seek to specified position into the chunk.
+        Default position is 0 (start of chunk).
+        If the file is not seekable, this will result in an error.
+        """
+
+        if self.closed:
+            raise ValueError("I/O operation on closed file")
+        if not self.seekable:
+            raise OSError("cannot seek")
+        if whence == 1:
+            pos = pos + self.size_read
+        elif whence == 2:
+            pos = pos + self.chunksize
+        if pos < 0 or pos > self.chunksize:
+            raise RuntimeError
+        self.file.seek(self.offset + pos, 0)
+        self.size_read = pos
+
+    def tell(self):
+        if self.closed:
+            raise ValueError("I/O operation on closed file")
+        return self.size_read
+
+    def read(self, size=-1):
+        """Read at most size bytes from the chunk.
+        If size is omitted or negative, read until the end
+        of the chunk.
+        """
+
+        if self.closed:
+            raise ValueError("I/O operation on closed file")
+        if self.size_read >= self.chunksize:
+            return b''
+        if size < 0:
+            size = self.chunksize - self.size_read
+        if size > self.chunksize - self.size_read:
+            size = self.chunksize - self.size_read
+        data = self.file.read(size)
+        self.size_read = self.size_read + len(data)
+        if self.size_read == self.chunksize and \
+           self.align and \
+           (self.chunksize & 1):
+            dummy = self.file.read(1)
+            self.size_read = self.size_read + len(dummy)
+        return data
+
+    def skip(self):
+        """Skip the rest of the chunk.
+        If you are not interested in the contents of the chunk,
+        this method should be called so that the file points to
+        the start of the next chunk.
+        """
+
+        if self.closed:
+            raise ValueError("I/O operation on closed file")
+        if self.seekable:
+            try:
+                n = self.chunksize - self.size_read
+                # maybe fix alignment
+                if self.align and (self.chunksize & 1):
+                    n = n + 1
+                self.file.seek(n, 1)
+                self.size_read = self.size_read + n
+                return
+            except OSError:
+                pass
+        while self.size_read < self.chunksize:
+            n = min(8192, self.chunksize - self.size_read)
+            dummy = self.read(n)
+            if not dummy:
+                raise EOFError
+
+
+
 class Wave_read:
     """Variables used in this class:
 
@@ -134,7 +246,7 @@ class Wave_read:
     def initfp(self, file):
         self._convert = None
         self._soundpos = 0
-        self._file = Chunk(file, bigendian = 0)
+        self._file = _Chunk(file, bigendian = 0)
         if self._file.getname() != b'RIFF':
             raise Error('file does not start with RIFF id')
         if self._file.read(4) != b'WAVE':
@@ -144,7 +256,7 @@ class Wave_read:
         while 1:
             self._data_seek_needed = 1
             try:
-                chunk = Chunk(self._file, bigendian = 0)
+                chunk = _Chunk(self._file, bigendian = 0)
             except EOFError:
                 break
             chunkname = chunk.getname()
diff --git a/Misc/NEWS.d/next/Library/2022-04-10-11-11-33.gh-issue-91217.K82AuH.rst b/Misc/NEWS.d/next/Library/2022-04-10-11-11-33.gh-issue-91217.K82AuH.rst
new file mode 100644 (file)
index 0000000..0181bbc
--- /dev/null
@@ -0,0 +1 @@
+Deprecate the chunk module.