]> granicus.if.org Git - python/commitdiff
Merge issue 19548 changes from 3.4
authorNick Coghlan <ncoghlan@gmail.com>
Tue, 6 Jan 2015 14:37:01 +0000 (00:37 +1000)
committerNick Coghlan <ncoghlan@gmail.com>
Tue, 6 Jan 2015 14:37:01 +0000 (00:37 +1000)
1  2 
Doc/glossary.rst
Doc/library/codecs.rst
Doc/library/functions.rst
Doc/library/stdtypes.rst
Doc/library/tarfile.rst
Lib/codecs.py
Lib/test/test_codecs.py
Misc/NEWS
Modules/_codecsmodule.c

Simple merge
index 06bce84b7b30f3c6901a351a8a49b910dc8ad28d,8be5d18dc14f0678de61927ef4bdd97c54d1a3a1..0227d9b96363e49d66c60aadeaaa485b9cbbf075
     pair: stackable; streams
  
  This module defines base classes for standard Python codecs (encoders and
- decoders) and provides access to the internal Python codec registry which
- manages the codec and error handling lookup process.
- It defines the following functions:
+ decoders) and provides access to the internal Python codec registry, which
+ manages the codec and error handling lookup process. Most standard codecs
+ are :term:`text encodings <text encoding>`, which encode text to bytes,
+ but there are also codecs provided that encode text to text, and bytes to
+ bytes. Custom codecs may encode and decode between arbitrary types, but some
+ module features are restricted to use specifically with
+ :term:`text encodings <text encoding>`, or with codecs that encode to
+ :class:`bytes`.
+ The module defines the following functions for encoding and decoding with
+ any codec:
  
 -.. function:: encode(obj, [encoding[, errors]])
 +.. function:: encode(obj, encoding='utf-8', errors='strict')
  
 -   Encodes *obj* using the codec registered for *encoding*. The default
 -   encoding is ``utf-8``.
 +   Encodes *obj* using the codec registered for *encoding*.
  
     *Errors* may be given to set the desired error handling scheme. The
-    default error handler is ``strict`` meaning that encoding errors raise
+    default error handler is ``'strict'`` meaning that encoding errors raise
     :exc:`ValueError` (or a more codec specific subclass, such as
     :exc:`UnicodeEncodeError`). Refer to :ref:`codec-base-classes` for more
     information on codec error handling.
  
 -.. function:: decode(obj, [encoding[, errors]])
 +.. function:: decode(obj, encoding='utf-8', errors='strict')
  
 -   Decodes *obj* using the codec registered for *encoding*. The default
 -   encoding is ``utf-8``.
 +   Decodes *obj* using the codec registered for *encoding*.
  
     *Errors* may be given to set the desired error handling scheme. The
-    default error handler is ``strict`` meaning that decoding errors raise
+    default error handler is ``'strict'`` meaning that decoding errors raise
     :exc:`ValueError` (or a more codec specific subclass, such as
     :exc:`UnicodeDecodeError`). Refer to :ref:`codec-base-classes` for more
     information on codec error handling.
  
- .. function:: register(search_function)
-    Register a codec search function. Search functions are expected to take one
-    argument, the encoding name in all lower case letters, and return a
-    :class:`CodecInfo` object having the following attributes:
-    * ``name`` The name of the encoding;
-    * ``encode`` The stateless encoding function;
+ The full details for each codec can also be looked up directly:
  
-    * ``decode`` The stateless decoding function;
-    * ``incrementalencoder`` An incremental encoder class or factory function;
-    * ``incrementaldecoder`` An incremental decoder class or factory function;
-    * ``streamwriter`` A stream writer class or factory function;
-    * ``streamreader`` A stream reader class or factory function.
-    The various functions or classes take the following arguments:
+ .. function:: lookup(encoding)
  
-    *encode* and *decode*: These must be functions or methods which have the same
-    interface as the :meth:`~Codec.encode`/:meth:`~Codec.decode` methods of Codec
-    instances (see :ref:`Codec Interface <codec-objects>`). The functions/methods
-    are expected to work in a stateless mode.
+    Looks up the codec info in the Python codec registry and returns a
+    :class:`CodecInfo` object as defined below.
  
-    *incrementalencoder* and *incrementaldecoder*: These have to be factory
-    functions providing the following interface:
+    Encodings are first looked up in the registry's cache. If not found, the list of
+    registered search functions is scanned. If no :class:`CodecInfo` object is
+    found, a :exc:`LookupError` is raised. Otherwise, the :class:`CodecInfo` object
+    is stored in the cache and returned to the caller.
  
-       ``factory(errors='strict')``
+ .. class:: CodecInfo(encode, decode, streamreader=None, streamwriter=None, incrementalencoder=None, incrementaldecoder=None, name=None)
  
-    The factory functions must return objects providing the interfaces defined by
-    the base classes :class:`IncrementalEncoder` and :class:`IncrementalDecoder`,
-    respectively. Incremental codecs can maintain state.
+    Codec details when looking up the codec registry. The constructor
+    arguments are stored in attributes of the same name:
  
-    *streamreader* and *streamwriter*: These have to be factory functions providing
-    the following interface:
  
-       ``factory(stream, errors='strict')``
+    .. attribute:: name
  
-    The factory functions must return objects providing the interfaces defined by
-    the base classes :class:`StreamReader` and :class:`StreamWriter`, respectively.
-    Stream codecs can maintain state.
+       The name of the encoding.
  
-    Possible values for errors are
  
-    * ``'strict'``: raise an exception in case of an encoding error
-    * ``'replace'``: replace malformed data with a suitable replacement marker,
-      such as ``'?'`` or ``'\ufffd'``
-    * ``'ignore'``: ignore malformed data and continue without further notice
-    * ``'xmlcharrefreplace'``: replace with the appropriate XML character
-      reference (for encoding only)
-    * ``'backslashreplace'``: replace with backslashed escape sequences (for
-      encoding only)
-    * ``'namereplace'``: replace with ``\N{...}`` escape sequences (for
-      encoding only)
-    * ``'surrogateescape'``: on decoding, replace with code points in the Unicode
-      Private Use Area ranging from U+DC80 to U+DCFF.  These private code
-      points will then be turned back into the same bytes when the
-      ``surrogateescape`` error handler is used when encoding the data.
-      (See :pep:`383` for more.)
+    .. attribute:: encode
+                   decode
  
-    as well as any other error handling name defined via :func:`register_error`.
+       The stateless encoding and decoding functions. These must be
+       functions or methods which have the same interface as
+       the :meth:`~Codec.encode` and :meth:`~Codec.decode` methods of Codec
+       instances (see :ref:`Codec Interface <codec-objects>`).
+       The functions or methods are expected to work in a stateless mode.
  
-    In case a search function cannot find a given encoding, it should return
-    ``None``.
  
+    .. attribute:: incrementalencoder
+                   incrementaldecoder
  
- .. function:: lookup(encoding)
+       Incremental encoder and decoder classes or factory functions.
+       These have to provide the interface defined by the base classes
+       :class:`IncrementalEncoder` and :class:`IncrementalDecoder`,
+       respectively. Incremental codecs can maintain state.
  
-    Looks up the codec info in the Python codec registry and returns a
-    :class:`CodecInfo` object as defined above.
  
-    Encodings are first looked up in the registry's cache. If not found, the list of
-    registered search functions is scanned. If no :class:`CodecInfo` object is
-    found, a :exc:`LookupError` is raised. Otherwise, the :class:`CodecInfo` object
-    is stored in the cache and returned to the caller.
+    .. attribute:: streamwriter
+                   streamreader
  
- To simplify access to the various codecs, the module provides these additional
- functions which use :func:`lookup` for the codec lookup:
+       Stream writer and reader classes or factory functions. These have to
+       provide the interface defined by the base classes
+       :class:`StreamWriter` and :class:`StreamReader`, respectively.
+       Stream codecs can maintain state.
  
+ To simplify access to the various codec components, the module provides
+ these additional functions which use :func:`lookup` for the codec lookup:
  
 -
  .. function:: getencoder(encoding)
  
     Look up the codec for the given encoding and return its encoder function.
@@@ -355,39 -290,52 +289,55 @@@ defined and implemented by all standar
  | Value                   | Meaning                                       |
  +=========================+===============================================+
  | ``'strict'``            | Raise :exc:`UnicodeError` (or a subclass);    |
- |                         | this is the default.                          |
+ |                         | this is the default.  Implemented in          |
+ |                         | :func:`strict_errors`.                        |
  +-------------------------+-----------------------------------------------+
- | ``'ignore'``            | Ignore the character and continue with the    |
- |                         | next.                                         |
+ | ``'ignore'``            | Ignore the malformed data and continue        |
+ |                         | without further notice.  Implemented in       |
+ |                         | :func:`ignore_errors`.                        |
  +-------------------------+-----------------------------------------------+
+ The following error handlers are only applicable to
+ :term:`text encodings <text encoding>`:
+ +-------------------------+-----------------------------------------------+
+ | Value                   | Meaning                                       |
+ +=========================+===============================================+
  | ``'replace'``           | Replace with a suitable replacement           |
- |                         | character; Python will use the official       |
- |                         | U+FFFD REPLACEMENT CHARACTER for the built-in |
- |                         | Unicode codecs on decoding and '?' on         |
- |                         | encoding.                                     |
+ |                         | marker; Python will use the official          |
+ |                         | ``U+FFFD`` REPLACEMENT CHARACTER for the      |
+ |                         | built-in codecs on decoding, and '?' on       |
+ |                         | encoding.  Implemented in                     |
+ |                         | :func:`replace_errors`.                       |
  +-------------------------+-----------------------------------------------+
  | ``'xmlcharrefreplace'`` | Replace with the appropriate XML character    |
- |                         | reference (only for encoding).                |
+ |                         | reference (only for encoding).  Implemented   |
+ |                         | in :func:`xmlcharrefreplace_errors`.          |
  +-------------------------+-----------------------------------------------+
  | ``'backslashreplace'``  | Replace with backslashed escape sequences     |
- |                         | (only for encoding).                          |
+ |                         | (only for encoding).  Implemented in          |
+ |                         | :func:`backslashreplace_errors`.              |
  +-------------------------+-----------------------------------------------+
- | ``'surrogateescape'``   | Replace byte with surrogate U+DCxx, as defined|
- |                         | in :pep:`383`.                                |
 +| ``'namereplace'``       | Replace with ``\N{...}`` escape sequences     |
 +|                         | (only for encoding).                          |
 ++-------------------------+-----------------------------------------------+
+ | ``'surrogateescape'``   | On decoding, replace byte with individual     |
+ |                         | surrogate code ranging from ``U+DC80`` to     |
+ |                         | ``U+DCFF``.  This code will then be turned    |
+ |                         | back into the same byte when the              |
+ |                         | ``'surrogateescape'`` error handler is used   |
+ |                         | when encoding the data.  (See :pep:`383` for  |
+ |                         | more.)                                        |
  +-------------------------+-----------------------------------------------+
  
- In addition, the following error handlers are specific to Unicode encoding
- schemes:
+ In addition, the following error handler is specific to the given codecs:
  
  +-------------------+------------------------+-------------------------------------------+
- | Value             | Codec                  | Meaning                                   |
+ | Value             | Codecs                 | Meaning                                   |
  +===================+========================+===========================================+
  |``'surrogatepass'``| utf-8, utf-16, utf-32, | Allow encoding and decoding of surrogate  |
- |                   | utf-16-be, utf-16-le,  | codes in all the Unicode encoding schemes.|
- |                   | utf-32-be, utf-32-le   |                                           |
+ |                   | utf-16-be, utf-16-le,  | codes.  These codecs normally treat the   |
+ |                   | utf-32-be, utf-32-le   | presence of surrogates as an error.       |
  +-------------------+------------------------+-------------------------------------------+
  
  .. versionadded:: 3.1
  .. versionchanged:: 3.4
     The ``'surrogatepass'`` error handlers now works with utf-16\* and utf-32\* codecs.
  
- The set of allowed values can be extended via :meth:`register_error`.
 +.. versionadded:: 3.5
 +   The ``'namereplace'`` error handler.
 +
+ The set of allowed values can be extended by registering a new named error
+ handler:
+ .. function:: register_error(name, error_handler)
+    Register the error handling function *error_handler* under the name *name*.
+    The *error_handler* argument will be called during encoding and decoding
+    in case of an error, when *name* is specified as the errors parameter.
+    For encoding, *error_handler* will be called with a :exc:`UnicodeEncodeError`
+    instance, which contains information about the location of the error. The
+    error handler must either raise this or a different exception, or return a
+    tuple with a replacement for the unencodable part of the input and a position
+    where encoding should continue. The replacement may be either :class:`str` or
+    :class:`bytes`.  If the replacement is bytes, the encoder will simply copy
+    them into the output buffer. If the replacement is a string, the encoder will
+    encode the replacement.  Encoding continues on original input at the
+    specified position. Negative position values will be treated as being
+    relative to the end of the input string. If the resulting position is out of
+    bound an :exc:`IndexError` will be raised.
+    Decoding and translating works similarly, except :exc:`UnicodeDecodeError` or
+    :exc:`UnicodeTranslateError` will be passed to the handler and that the
+    replacement from the error handler will be put into the output directly.
+ Previously registered error handlers (including the standard error handlers)
+ can be looked up by name:
+ .. function:: lookup_error(name)
+    Return the error handler previously registered under the name *name*.
+    Raises a :exc:`LookupError` in case the handler cannot be found.
+ The following standard error handlers are also made available as module level
+ functions:
+ .. function:: strict_errors(exception)
+    Implements the ``'strict'`` error handling: each encoding or
+    decoding error raises a :exc:`UnicodeError`.
+ .. function:: replace_errors(exception)
+    Implements the ``'replace'`` error handling (for :term:`text encodings
+    <text encoding>` only): substitutes ``'?'`` for encoding errors
+    (to be encoded by the codec), and ``'\ufffd'`` (the Unicode replacement
+    character, ``'�'``) for decoding errors.
+ .. function:: ignore_errors(exception)
+    Implements the ``'ignore'`` error handling: malformed data is ignored and
+    encoding or decoding is continued without further notice.
+ .. function:: xmlcharrefreplace_errors(exception)
+    Implements the ``'xmlcharrefreplace'`` error handling (for encoding with
+    :term:`text encodings <text encoding>` only): the
+    unencodable character is replaced by an appropriate XML character reference.
+ .. function:: backslashreplace_errors(exception)
+    Implements the ``'backslashreplace'`` error handling (for encoding with
+    :term:`text encodings <text encoding>` only): the
+    unencodable character is replaced by a backslashed escape sequence.
++.. function:: namereplace_errors(exception)
++
++   Implements the ``namereplace`` error handling (for encoding only): the
++   unencodable character is replaced by a ``\N{...}`` escape sequence.
++
++   .. versionadded:: 3.5
 +
  
  .. _codec-objects:
  
Simple merge
Simple merge
Simple merge
diff --cc Lib/codecs.py
Simple merge
Simple merge
diff --cc Misc/NEWS
index 3797b78054c57c65b74fef28ac9e9efdb5809b3b,08a02f2890025e4c99ad6a29fe88f03e6e10651c..0d48134262662b7e6aa2832777e35c0a1f6924ee
+++ b/Misc/NEWS
@@@ -1267,204 -1078,45 +1267,208 @@@ Librar
  IDLE
  ----
  
 -- Issue #21139: Change default paragraph width to 72, the PEP 8 recommendation.
 +- Issue #20577: Configuration of the max line length for the FormatParagraph
 +  extension has been moved from the General tab of the Idle preferences dialog
 +  to the FormatParagraph tab of the Config Extensions dialog.
 +  Patch by Tal Einat.
  
 -- Issue #21284: Paragraph reformat test passes after user changes reformat width.
 +- Issue #16893: Update Idle doc chapter to match current Idle and add new
 +  information.
  
 -- Issue #17654: Ensure IDLE menus are customized properly on OS X for
 -  non-framework builds and for all variants of Tk.
 +- Issue #3068: Add Idle extension configuration dialog to Options menu.
 +  Changes are written to HOME/.idlerc/config-extensions.cfg.
 +  Original patch by Tal Einat.
  
 -Build
 ------
 +- Issue #16233: A module browser (File : Class Browser, Alt+C) requires a
 +  editor window with a filename.  When Class Browser is requested otherwise,
 +  from a shell, output window, or 'Untitled' editor, Idle no longer displays
 +  an error box.  It now pops up an  Open Module box (Alt+M). If a valid name
 +  is entered and a module is opened, a corresponding browser is also opened.
  
 -- The Windows build now includes OpenSSL 1.0.1g
 +- Issue #4832: Save As to type Python files automatically adds .py to the
 +  name you enter (even if your system does not display it).  Some systems
 +  automatically add .txt when type is Text files.
  
 -- Issue #21285: Refactor and fix curses configure check to always search
 -  in a ncursesw directory.
 +- Issue #21986: Code objects are not normally pickled by the pickle module.
 +  To match this, they are no longer pickled when running under Idle.
  
 -- Issue #15234: For BerkelyDB and Sqlite, only add the found library and
 -  include directories if they aren't already being searched. This avoids
 -  an explicit runtime library dependency.
 +- Issue #17390: Adjust Editor window title; remove 'Python',
 +  move version to end.
  
 -- Issue #20644: OS X installer build support for documentation build changes
 -  in 3.4.1: assume externally supplied sphinx-build is available in /usr/bin.
 +- Issue #14105: Idle debugger breakpoints no longer disappear
 +  when inseting or deleting lines.
  
 -C API
 ------
 -- Issue #20942: PyImport_ImportFrozenModuleObject() no longer sets __file__ to
 -  match what importlib does; this affects _frozen_importlib as well as any
 -  module loaded using imp.init_frozen().
 +- Issue #17172: Turtledemo can now be run from Idle.
 +  Currently, the entry is on the Help menu, but it may move to Run.
 +  Patch by Ramchandra Apt and Lita Cho.
  
 -Documentation
 --------------
 +- Issue #21765: Add support for non-ascii identifiers to HyperParser.
  
 -- Issue #17386: Expanded functionality of the ``Doc/make.bat`` script to make
 -  it much more comparable to ``Doc/Makefile``.
 +- Issue #21940: Add unittest for WidgetRedirector. Initial patch by Saimadhav
 +  Heblikar.
  
 -- Issue #21043: Remove the recommendation for specific CA organizations and to
 -  mention the ability to load the OS certificates.
 +- Issue #18592: Add unittest for SearchDialogBase. Patch by Phil Webster.
  
 -- Issue #20765: Add missing documentation for PurePath.with_name() and
 -  PurePath.with_suffix().
 +- Issue #21694: Add unittest for ParenMatch. Patch by Saimadhav Heblikar.
 +
 +- Issue #21686: add unittest for HyperParser. Original patch by Saimadhav
 +  Heblikar.
 +
 +- Issue #12387: Add missing upper(lower)case versions of default Windows key
 +  bindings for Idle so Caps Lock does not disable them. Patch by Roger Serwy.
 +
 +- Issue #21695: Closing a Find-in-files output window while the search is
 +  still in progress no longer closes Idle.
 +
 +- Issue #18910: Add unittest for textView. Patch by Phil Webster.
 +
 +- Issue #18292: Add unittest for AutoExpand. Patch by Saihadhav Heblikar.
 +
 +- Issue #18409: Add unittest for AutoComplete. Patch by Phil Webster.
 +
 +- Issue #21477: htest.py - Improve framework, complete set of tests.
 +  Patches by Saimadhav Heblikar
 +
 +- Issue #18104: Add idlelib/idle_test/htest.py with a few sample tests to begin
 +  consolidating and improving human-validated tests of Idle. Change other files
 +  as needed to work with htest.  Running the module as __main__ runs all tests.
 +
 +- Issue #21139: Change default paragraph width to 72, the PEP 8 recommendation.
 +
 +- Issue #21284: Paragraph reformat test passes after user changes reformat width.
 +
 +- Issue #17654: Ensure IDLE menus are customized properly on OS X for
 +  non-framework builds and for all variants of Tk.
 +
 +Build
 +-----
 +
 +- Issue #15506: Use standard PKG_PROG_PKG_CONFIG autoconf macro in the configure
 +  script.
 +
 +- Issue #22935: Allow the ssl module to be compiled if openssl doesn't support
 +  SSL 3.
 +
 +- Issue #22592: Drop support of the Borland C compiler to build Python. The
 +  distutils module still supports it to build extensions.
 +
 +- Issue #22591: Drop support of MS-DOS, especially of the DJGPP compiler
 +  (MS-DOS port of GCC).
 +
 +- Issue #16537: Check whether self.extensions is empty in setup.py. Patch by
 +  Jonathan Hosmer.
 +
 +- Issue #22359: Remove incorrect uses of recursive make.  Patch by Jonas
 +  Wagner.
 +
 +- Issue #21958: Define HAVE_ROUND when building with Visual Studio 2013 and
 +  above.  Patch by Zachary Turner.
 +
 +- Issue #18093: the programs that embed the CPython runtime are now in a
 +  separate "Programs" directory, rather than being kept in the Modules
 +  directory.
 +
 +- Issue #15759: "make suspicious", "make linkcheck" and "make doctest" in Doc/
 +  now display special message when and only when there are failures.
 +
 +- Issue #21141: The Windows build process no longer attempts to find Perl,
 +  instead relying on OpenSSL source being configured and ready to build.  The
 +  ``PCbuild\build_ssl.py`` script has been re-written and re-named to
 +  ``PCbuild\prepare_ssl.py``, and takes care of configuring OpenSSL source
 +  for both 32 and 64 bit platforms.  OpenSSL sources obtained from
 +  svn.python.org will always be pre-configured and ready to build.
 +
 +- Issue #21037: Add a build option to enable AddressSanitizer support.
 +
 +- Issue #19962: The Windows build process now creates "python.bat" in the
 +  root of the source tree, which passes all arguments through to the most
 +  recently built interpreter.
 +
 +- Issue #21285: Refactor and fix curses configure check to always search
 +  in a ncursesw directory.
 +
 +- Issue #15234: For BerkelyDB and Sqlite, only add the found library and
 +  include directories if they aren't already being searched. This avoids
 +  an explicit runtime library dependency.
 +
 +- Issue #17861: Tools/scripts/generate_opcode_h.py automatically regenerates
 +  Include/opcode.h from Lib/opcode.py if the later gets any change.
 +
 +- Issue #20644: OS X installer build support for documentation build changes
 +  in 3.4.1: assume externally supplied sphinx-build is available in /usr/bin.
 +
 +- Issue #20022: Eliminate use of deprecated bundlebuilder in OS X builds.
 +
 +- Issue #15968: Incorporated Tcl, Tk, and Tix builds into the Windows build
 +  solution.
 +
 +- Issue #17095: Fix Modules/Setup *shared* support.
 +
 +- Issue #21811: Anticipated fixes to support OS X versions > 10.9.
 +
 +- Issue #21166: Prevent possible segfaults and other random failures of
 +  python --generate-posix-vars in pybuilddir.txt build target.
 +
 +- Issue #18096: Fix library order returned by python-config.
 +
 +- Issue #17219: Add library build dir for Python extension cross-builds.
 +
 +- Issue #22919: Windows build updated to support VC 14.0 (Visual Studio 2015),
 +  which will be used for the official release.
 +
 +- Issue #21236: Build _msi.pyd with cabinet.lib instead of fci.lib
 +
 +- Issue #17128: Use private version of OpenSSL for 2.7.9 OS X 10.5+ installer.
 +
 +C API
 +-----
 +
 +- Issue #22453: Removed non-documented macro PyObject_REPR().
 +
 +- Issue #18395: Rename ``_Py_char2wchar()`` to :c:func:`Py_DecodeLocale`,
 +  rename ``_Py_wchar2char()`` to :c:func:`Py_EncodeLocale`, and document
 +  these functions.
 +
 +- Issue #21233: Add new C functions: PyMem_RawCalloc(), PyMem_Calloc(),
 +  PyObject_Calloc(), _PyObject_GC_Calloc(). bytes(int) is now using
 +  ``calloc()`` instead of ``malloc()`` for large objects which is faster and
 +  use less memory.
 +
 +- Issue #20942: PyImport_ImportFrozenModuleObject() no longer sets __file__ to
 +  match what importlib does; this affects _frozen_importlib as well as any
 +  module loaded using imp.init_frozen().
 +
 +Documentation
 +-------------
 +
++- Issue #19548: Update the codecs module documentation to better cover the
++  distinction between text encodings and other codecs, together with other
++  clarifications. Patch by Martin Panter.
++
 +- Issue #22394: Doc/Makefile now supports ``make venv PYTHON=../python`` to
 +  create a venv for generating the documentation, e.g.,
 +  ``make html PYTHON=venv/bin/python3``.
 +
 +- Issue #21514: The documentation of the json module now refers to new JSON RFC
 +  7159 instead of obsoleted RFC 4627.
 +
 +- Issue #21777: The binary sequence methods on bytes and bytearray are now
 +  documented explicitly, rather than assuming users will be able to derive
 +  the expected behaviour from the behaviour of the corresponding str methods.
 +
 +- Issue #6916: undocument deprecated asynchat.fifo class.
 +
 +- Issue #17386: Expanded functionality of the ``Doc/make.bat`` script to make
 +  it much more comparable to ``Doc/Makefile``.
 +
 +- Issue #21312: Update the thread_foobar.h template file to include newer
 +  threading APIs.  Patch by Jack McCracken.
 +
 +- Issue #21043: Remove the recommendation for specific CA organizations and to
 +  mention the ability to load the OS certificates.
 +
 +- Issue #20765: Add missing documentation for PurePath.with_name() and
 +  PurePath.with_suffix().
  
  - Issue #19407: New package installation and distribution guides based on
    the Python Packaging Authority tools. Existing guides have been retained
  Tests
  -----
  
++- Issue #19548: Added some additional checks to test_codecs to ensure that
++  statements in the updated documentation remain accurate. Patch by Martin
++  Panter.
++
 +- Issue #22838: All test_re tests now work with unittest test discovery.
 +
 +- Issue #22173: Update lib2to3 tests to use unittest test discovery.
 +
 +- Issue #16000: Convert test_curses to use unittest.
 +
 +- Issue #21456: Skip two tests in test_urllib2net.py if _ssl module not
 +  present. Patch by Remi Pointel.
 +
 +- Issue #20746: Fix test_pdb to run in refleak mode (-R).  Patch by Xavier
 +  de Gaye.
 +
 +- Issue #22060: test_ctypes has been somewhat cleaned up and simplified; it
 +  now uses unittest test discovery to find its tests.
 +
 +- Issue #22104: regrtest.py no longer holds a reference to the suite of tests
 +  loaded from test modules that don't define test_main().
 +
 +- Issue #22111: Assorted cleanups in test_imaplib.  Patch by Milan Oberkirch.
 +
 +- Issue #22002: Added ``load_package_tests`` function to test.support and used
 +  it to implement/augment test discovery in test_asyncio, test_email,
 +  test_importlib, test_json, and test_tools.
 +
 +- Issue #21976: Fix test_ssl to accept LibreSSL version strings.  Thanks
 +  to William Orr.
 +
 +- Issue #21918: Converted test_tools from a module to a package containing
 +  separate test files for each tested script.
 +
 +- Issue #9554: Use modern unittest features in test_argparse. Initial patch by
 +  Denver Coneybeare and Radu Voicilas.
 +
 +- Issue #20155: Changed HTTP method names in failing tests in test_httpservers
 +  so that packet filtering software (specifically Windows Base Filtering Engine)
 +  does not interfere with the transaction semantics expected by the tests.
 +
 +- Issue #19493: Refactored the ctypes test package to skip tests explicitly
 +  rather than silently.
 +
 +- Issue #18492: All resources are now allowed when tests are not run by
 +  regrtest.py.
 +
 +- Issue #21634: Fix pystone micro-benchmark: use floor division instead of true
 +  division to benchmark integers instead of floating point numbers. Set pystone
 +  version to 1.2. Patch written by Lennart Regebro.
 +
 +- Issue #21605: Added tests for Tkinter images.
 +
 +- Issue #21493: Added test for ntpath.expanduser().  Original patch by
 +  Claudiu Popa.
 +
 +- Issue #19925: Added tests for the spwd module. Original patch by Vajrasky Kok.
 +
 +- Issue #21522: Added Tkinter tests for Listbox.itemconfigure(),
 +  PanedWindow.paneconfigure(), and Menu.entryconfigure().
 +
 +- Issue #17756: Fix test_code test when run from the installed location.
 +
 +- Issue #17752: Fix distutils tests when run from the installed location.
 +
  - Issue #18604: Consolidated checks for GUI availability.  All platforms now
    at least check whether Tk can be instantiated when the GUI resource is
    requested.
Simple merge