From: Nick Coghlan Date: Tue, 6 Jan 2015 14:37:01 +0000 (+1000) Subject: Merge issue 19548 changes from 3.4 X-Git-Tag: v3.5.0a1~232 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=582acb75e9a03e21281fe3c3877b6d48a8f0fa8f;p=python Merge issue 19548 changes from 3.4 --- 582acb75e9a03e21281fe3c3877b6d48a8f0fa8f diff --cc Doc/library/codecs.rst index 06bce84b7b,8be5d18dc1..0227d9b963 --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@@ -18,114 -17,94 +18,91 @@@ 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 `, 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 `, 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 `). 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 `). + 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 `: + + +-------------------------+-----------------------------------------------+ + | 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`. | +-------------------------+-----------------------------------------------+ +| ``'namereplace'`` | Replace with ``\N{...}`` escape sequences | +| | (only for encoding). | ++-------------------------+-----------------------------------------------+ - | ``'surrogateescape'`` | Replace byte with surrogate U+DCxx, as defined| - | | in :pep:`383`. | + | ``'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 @@@ -396,11 -344,77 +346,87 @@@ .. versionchanged:: 3.4 The ``'surrogatepass'`` error handlers now works with utf-16\* and utf-32\* codecs. +.. versionadded:: 3.5 + The ``'namereplace'`` error handler. + - The set of allowed values can be extended via :meth:`register_error`. + 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 + ` 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 ` 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 ` 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: diff --cc Misc/NEWS index 3797b78054,08a02f2890..0d48134262 --- a/Misc/NEWS +++ 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 @@@ -1477,67 -1129,6 +1481,71 @@@ 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.