]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-104773: PEP 594: Remove the chunk module (#104868)
authorVictor Stinner <vstinner@python.org>
Thu, 25 May 2023 16:27:55 +0000 (18:27 +0200)
committerGitHub <noreply@github.com>
Thu, 25 May 2023 16:27:55 +0000 (16:27 +0000)
The module had no tests.

Doc/library/chunk.rst [deleted file]
Doc/library/superseded.rst
Doc/tools/.nitignore
Doc/whatsnew/2.0.rst
Doc/whatsnew/3.11.rst
Doc/whatsnew/3.12.rst
Doc/whatsnew/3.13.rst
Lib/chunk.py [deleted file]
Misc/NEWS.d/next/Library/2023-05-24-15-57-34.gh-issue-104773.IHWRgg.rst [new file with mode: 0644]
Python/stdlib_module_names.h

diff --git a/Doc/library/chunk.rst b/Doc/library/chunk.rst
deleted file mode 100644 (file)
index 3b88e55..0000000
+++ /dev/null
@@ -1,142 +0,0 @@
-:mod:`chunk` --- Read IFF chunked data
-======================================
-
-.. module:: chunk
-   :synopsis: Module to read IFF chunks.
-   :deprecated:
-
-.. moduleauthor:: Sjoerd Mullender <sjoerd@acm.org>
-.. sectionauthor:: Sjoerd Mullender <sjoerd@acm.org>
-
-**Source code:** :source:`Lib/chunk.py`
-
-.. index::
-   single: Audio Interchange File Format
-   single: AIFF
-   single: AIFF-C
-   single: Real Media File Format
-   single: RMFF
-
-.. deprecated-removed:: 3.11 3.13
-   The :mod:`chunk` module is deprecated
-   (see :pep:`PEP 594 <594#chunk>` for details).
-
---------------
-
-This module provides an interface for reading files that use EA IFF 85 chunks.
-[#]_  This format is used in at least the Audio Interchange File Format
-(AIFF/AIFF-C) and the Real Media File Format (RMFF).  The WAVE audio file format
-is closely related and can also be read using this module.
-
-A chunk has the following structure:
-
-+---------+--------+-------------------------------+
-| Offset  | Length | Contents                      |
-+=========+========+===============================+
-| 0       | 4      | Chunk ID                      |
-+---------+--------+-------------------------------+
-| 4       | 4      | Size of chunk in big-endian   |
-|         |        | byte order, not including the |
-|         |        | header                        |
-+---------+--------+-------------------------------+
-| 8       | *n*    | Data bytes, where *n* is the  |
-|         |        | size given in the preceding   |
-|         |        | field                         |
-+---------+--------+-------------------------------+
-| 8 + *n* | 0 or 1 | Pad byte needed if *n* is odd |
-|         |        | and chunk alignment is used   |
-+---------+--------+-------------------------------+
-
-The ID is a 4-byte string which identifies the type of chunk.
-
-The size field (a 32-bit value, encoded using big-endian byte order) gives the
-size of the chunk data, not including the 8-byte header.
-
-Usually an IFF-type file consists of one or more chunks.  The proposed usage of
-the :class:`Chunk` class defined here is to instantiate an instance at the start
-of each chunk and read from the instance until it reaches the end, after which a
-new instance can be instantiated. At the end of the file, creating a new
-instance will fail with an :exc:`EOFError` exception.
-
-
-.. class:: Chunk(file, align=True, bigendian=True, inclheader=False)
-
-   Class which represents a chunk.  The *file* argument is expected to be a
-   file-like object.  An instance of this class is specifically allowed.  The
-   only method that is needed is :meth:`~io.IOBase.read`.  If the methods
-   :meth:`~io.IOBase.seek` and :meth:`~io.IOBase.tell` are present and don't
-   raise an exception, they are also used.
-   If these methods are present and raise an exception, they are expected to not
-   have altered the object.  If the optional argument *align* is true, chunks
-   are assumed to be aligned on 2-byte boundaries.  If *align* is false, no
-   alignment is assumed.  The default value is true.  If the optional argument
-   *bigendian* is false, the chunk size is assumed to be in little-endian order.
-   This is needed for WAVE audio files. The default value is true.  If the
-   optional argument *inclheader* is true, the size given in the chunk header
-   includes the size of the header.  The default value is false.
-
-   A :class:`Chunk` object supports the following methods:
-
-
-   .. method:: getname()
-
-      Returns the name (ID) of the chunk.  This is the first 4 bytes of the
-      chunk.
-
-
-   .. method:: getsize()
-
-      Returns the size of the chunk.
-
-
-   .. method:: close()
-
-      Close and skip to the end of the chunk.  This does not close the
-      underlying file.
-
-   The remaining methods will raise :exc:`OSError` if called after the
-   :meth:`close` method has been called.  Before Python 3.3, they used to
-   raise :exc:`IOError`, now an alias of :exc:`OSError`.
-
-
-   .. method:: isatty()
-
-      Returns ``False``.
-
-
-   .. method:: seek(pos, whence=0)
-
-      Set the chunk's current position.  The *whence* argument is optional and
-      defaults to ``0`` (absolute file positioning); other values are ``1``
-      (seek relative to the current position) and ``2`` (seek relative to the
-      file's end).  There is no return value. If the underlying file does not
-      allow seek, only forward seeks are allowed.
-
-
-   .. method:: tell()
-
-      Return the current position into the chunk.
-
-
-   .. method:: read(size=-1)
-
-      Read at most *size* bytes from the chunk (less if the read hits the end of
-      the chunk before obtaining *size* bytes).  If the *size* argument is
-      negative or omitted, read all data until the end of the chunk.  An empty
-      bytes object is returned when the end of the chunk is encountered
-      immediately.
-
-
-   .. method:: skip()
-
-      Skip to the end of the chunk.  All further calls to :meth:`read` for the
-      chunk will return ``b''``.  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.
-
-
-.. rubric:: Footnotes
-
-.. [#] "EA IFF 85" Standard for Interchange Format Files, Jerry Morrison, Electronic
-   Arts, January 1985.
-
index b4ce392d4c54c0fca965f850b91ac529b1946838..24e74110a319f94b5b442bf02039fbe0fe72b79a 100644 (file)
@@ -10,6 +10,5 @@ backwards compatibility. They have been superseded by other modules.
 
 .. toctree::
 
-   chunk.rst
    imghdr.rst
    optparse.rst
index a36a5f5741ae2f382ffbb0ba2a79576954e3df46..fb2969028f084f225d2377fa0ea8fd331f2f708c 100644 (file)
@@ -89,7 +89,6 @@ Doc/library/bisect.rst
 Doc/library/bz2.rst
 Doc/library/calendar.rst
 Doc/library/cgi.rst
-Doc/library/chunk.rst
 Doc/library/cmath.rst
 Doc/library/cmd.rst
 Doc/library/code.rst
index b1e584987fb14d2c6917fb63329834b8e03ddce0..489268ced4c864acd2236efb9f8bd2bbc7131bf8 100644 (file)
@@ -1031,7 +1031,7 @@ Module changes
 Lots of improvements and bugfixes were made to Python's extensive standard
 library; some of the affected modules include :mod:`readline`,
 :mod:`ConfigParser`, :mod:`!cgi`, :mod:`calendar`, :mod:`posix`, :mod:`readline`,
-:mod:`xmllib`, :mod:`!aifc`, :mod:`chunk, wave`, :mod:`random`, :mod:`shelve`,
+:mod:`xmllib`, :mod:`!aifc`, :mod:`!chunk`, :mod:`wave`, :mod:`random`, :mod:`shelve`,
 and :mod:`!nntplib`.  Consult the CVS logs for the exact patch-by-patch details.
 
 Brian Gallew contributed OpenSSL support for the :mod:`socket` module.  OpenSSL
index c93e66afc792891588cae1c77675c57d5b64d9fc..ccdf3fc34682bee1d5f0ab9288456017795a416e 100644 (file)
@@ -1731,7 +1731,7 @@ Modules
   slated for removal in Python 3.13:
 
   +---------------------+---------------------+---------------------+---------------------+---------------------+
-  | :mod:`!aifc`        | :mod:`chunk`        | :mod:`!msilib`      | :mod:`!pipes`       | :mod:`!telnetlib`   |
+  | :mod:`!aifc`        | :mod:`!chunk`       | :mod:`!msilib`      | :mod:`!pipes`       | :mod:`!telnetlib`   |
   +---------------------+---------------------+---------------------+---------------------+---------------------+
   | :mod:`!audioop`     | :mod:`!crypt`       | :mod:`!nis`         | :mod:`!sndhdr`      | :mod:`!uu`          |
   +---------------------+---------------------+---------------------+---------------------+---------------------+
index 622bded5241ff5f095cf4fce2ec578ba02183d7a..5266f5ffb937373192dce9349ccbad04136181f3 100644 (file)
@@ -922,7 +922,7 @@ Modules (see :pep:`594`):
 * :mod:`!audioop`
 * :mod:`!cgi`
 * :mod:`!cgitb`
-* :mod:`chunk`
+* :mod:`!chunk`
 * :mod:`!crypt`
 * :mod:`imghdr`
 * :mod:`!mailcap`
index 9a3d32b92352b6f396867089c9f250e7cede725f..8734dd89513a11966cac1e3546c548a9d49c43f7 100644 (file)
@@ -227,6 +227,9 @@ Removed
 * :pep:`594`: Remove the :mod:`!audioop` module, deprecated in Python 3.11.
   (Contributed by Victor Stinner in :gh:`104773`.)
 
+* :pep:`594`: Remove the :mod:`!chunk` module, deprecated in Python 3.11.
+  (Contributed by Victor Stinner in :gh:`104773`.)
+
 
 Porting to Python 3.13
 ======================
diff --git a/Lib/chunk.py b/Lib/chunk.py
deleted file mode 100644 (file)
index 618781e..0000000
+++ /dev/null
@@ -1,173 +0,0 @@
-"""Simple class to read IFF chunks.
-
-An IFF chunk (used in formats such as AIFF, TIFF, RMFF (RealMedia File
-Format)) has the following structure:
-
-+----------------+
-| ID (4 bytes)   |
-+----------------+
-| size (4 bytes) |
-+----------------+
-| data           |
-| ...            |
-+----------------+
-
-The ID is a 4-byte string which identifies the type of chunk.
-
-The size field (a 32-bit value, encoded using big-endian byte order)
-gives the size of the whole chunk, including the 8-byte header.
-
-Usually an IFF-type file consists of one or more chunks.  The proposed
-usage of the Chunk class defined here is to instantiate an instance at
-the start of each chunk and read from the instance until it reaches
-the end, after which a new instance can be instantiated.  At the end
-of the file, creating a new instance will fail with an EOFError
-exception.
-
-Usage:
-while True:
-    try:
-        chunk = Chunk(file)
-    except EOFError:
-        break
-    chunktype = chunk.getname()
-    while True:
-        data = chunk.read(nbytes)
-        if not data:
-            pass
-        # do something with data
-
-The interface is file-like.  The implemented methods are:
-read, close, seek, tell, isatty.
-Extra methods are: skip() (called by close, skips to the end of the chunk),
-getname() (returns the name (ID) of the chunk)
-
-The __init__ method has one required argument, a file-like object
-(including a chunk instance), and one optional argument, a flag which
-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
-        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 getsize(self):
-        """Return the size of the current chunk."""
-        return self.chunksize
-
-    def close(self):
-        if not self.closed:
-            try:
-                self.skip()
-            finally:
-                self.closed = True
-
-    def isatty(self):
-        if self.closed:
-            raise ValueError("I/O operation on closed file")
-        return False
-
-    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
diff --git a/Misc/NEWS.d/next/Library/2023-05-24-15-57-34.gh-issue-104773.IHWRgg.rst b/Misc/NEWS.d/next/Library/2023-05-24-15-57-34.gh-issue-104773.IHWRgg.rst
new file mode 100644 (file)
index 0000000..a2b2604
--- /dev/null
@@ -0,0 +1,2 @@
+:pep:`594`: Remove the :mod:`!chunk` module, deprecated in Python 3.11.
+Patch by Victor Stinner.
index 94f8cb5a0dedc247b826ceee1540f759f9665003..5af120d25428223725827a5f084e811e4a6364d1 100644 (file)
@@ -103,7 +103,6 @@ static const char* _Py_stdlib_module_names[] = {
 "bz2",
 "cProfile",
 "calendar",
-"chunk",
 "cmath",
 "cmd",
 "code",