summaryrefslogtreecommitdiff
path: root/guide
diff options
context:
space:
mode:
authorMichał Górny <mgorny@gentoo.org>2023-02-05 12:10:13 +0100
committerMichał Górny <mgorny@gentoo.org>2023-02-05 12:10:13 +0100
commit9ab20cd7a6c7046b6d62bee094a18049bf22cfa4 (patch)
treebc11d3d956820ef8067f496cd13327d48de13e4f /guide
parentUpdate Guide to 3f1ccee (diff)
downloadpython-9ab20cd7a6c7046b6d62bee094a18049bf22cfa4.tar.gz
python-9ab20cd7a6c7046b6d62bee094a18049bf22cfa4.tar.bz2
python-9ab20cd7a6c7046b6d62bee094a18049bf22cfa4.zip
Update Guide to 51dd5f6
Signed-off-by: Michał Górny <mgorny@gentoo.org>
Diffstat (limited to 'guide')
-rw-r--r--guide/_sources/distutils.rst.txt380
-rw-r--r--guide/_sources/index.rst.txt2
-rw-r--r--guide/_sources/qawarn.rst.txt85
-rw-r--r--guide/_sources/test.rst.txt306
-rw-r--r--guide/distutils.html348
-rw-r--r--guide/genindex.html16
-rw-r--r--guide/index.html29
-rw-r--r--guide/objects.invbin665 -> 656 bytes
-rw-r--r--guide/qawarn.html69
-rw-r--r--guide/search.html2
-rw-r--r--guide/searchindex.js2
-rw-r--r--guide/test.html291
12 files changed, 773 insertions, 757 deletions
diff --git a/guide/_sources/distutils.rst.txt b/guide/_sources/distutils.rst.txt
index 07aff5d..990cb42 100644
--- a/guide/_sources/distutils.rst.txt
+++ b/guide/_sources/distutils.rst.txt
@@ -281,87 +281,6 @@ as well). The eclass automatically uses the legacy setuptools backend
for them.
-Deprecated PEP 517 backends
-===========================
-
-flit.buildapi
--------------
-Some packages are still found using the historical flit build backend.
-Their ``pyproject.toml`` files contain a section similar
-to the following:
-
-.. code-block:: toml
-
- [build-system]
- requires = ["flit"]
- build-backend = "flit.buildapi"
-
-This backend requires installing the complete flit package manager.
-Instead, the package should be fixed upstream to use flit_core
-per `flit build system section documentation`_ instead:
-
-.. code-block:: toml
-
- [build-system]
- requires = ["flit_core"]
- build-backend = "flit_core.buildapi"
-
-flit_core produces identical artifacts to flit. At the same time, it
-reduces the build-time dependency footprint and therefore makes isolated
-PEP 517 builds faster.
-
-
-poetry.masonry.api
-------------------
-A similar problem applies to the packages using poetry. The respective
-``pyproject.toml`` files contain:
-
-.. code-block:: toml
-
- [build-system]
- requires = ["poetry>=0.12"]
- build-backend = "poetry.masonry.api"
-
-Instead, the lightweight poetry-core module should be used per `poetry
-PEP-517 documentation`_:
-
-.. code-block:: toml
-
- [build-system]
- requires = ["poetry_core>=1.0.0"]
- build-backend = "poetry.core.masonry.api"
-
-poetry-core produces identical artifacts to poetry. It has smaller
-dependency footprint and makes isolated builds much faster.
-
-
-setuptools.build_meta:__legacy__
---------------------------------
-Some packages using setuptools specify the following:
-
-.. code-block:: toml
-
- [build-system]
- requires = ["setuptools>=40.8.0", "wheel"]
- build-backend = "setuptools.build_meta:__legacy__"
-
-This is incorrect, as the legacy backend is intended to be used only
-as an implicit fallback. All packages should be using the regular
-backend instead:
-
-.. code-block:: toml
-
- [build-system]
- requires = ["setuptools>=40.8.0"]
- build-backend = "setuptools.build_meta"
-
-Please also note that the ``wheel`` package should *not* be listed
-as a dependency, as it is an implementation detail and it was always
-implicitly returned by the backend. Unfortunately, due to prolonged
-documentation error, a very large number of packages still specifies it,
-and other packages tend to copy that mistake.
-
-
.. index:: SETUPTOOLS_SCM_PRETEND_VERSION
.. index:: flit_scm
.. index:: hatch-vcs
@@ -763,302 +682,9 @@ beforehand (much like ``econf`` or ``emake``).
}
-.. index:: distutils_enable_tests
-
Enabling tests
==============
-Since Python performs only minimal build-time (or more precisely,
-import-time) checking of correctness, it is important to run tests
-of Python packages in order to catch any problems early. This is
-especially important for permitting others to verify support for new
-Python implementations.
-
-Many Python packages use one of the standard test runners, and work fine
-with the default ways of calling them. Note that upstreams sometimes
-specify a test runner that's not strictly necessary — e.g. specify
-``dev-python/pytest`` as a dependency while the tests do not use it
-anywhere and work just fine with built-in modules. The best way
-to determine the test runner to use is to grep the test sources.
-
-
-Using distutils_enable_tests
-----------------------------
-The simplest way of enabling tests is to call ``distutils_enable_tests``
-in global scope, passing the test runner name as the first argument.
-This function takes care of declaring test phase, setting appropriate
-dependencies and ``test`` USE flag if necessary. If called after
-setting ``RDEPEND``, it also copies it to test dependencies.
-
-.. code-block:: bash
- :emphasize-lines: 22
-
- # Copyright 1999-2020 Gentoo Authors
- # Distributed under the terms of the GNU General Public License v2
-
- EAPI=7
-
- PYTHON_COMPAT=( python2_7 python3_{6,7,8} pypy3 )
- inherit distutils-r1
-
- DESCRIPTION="An easy whitelist-based HTML-sanitizing tool"
- HOMEPAGE="https://github.com/mozilla/bleach https://pypi.org/project/bleach/"
- SRC_URI="mirror://pypi/${PN:0:1}/${PN}/${P}.tar.gz"
-
- LICENSE="Apache-2.0"
- SLOT="0"
- KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~mips ~ppc ~ppc64 ~s390 ~sparc ~x86"
-
- RDEPEND="
- dev-python/six[${PYTHON_USEDEP}]
- dev-python/webencodings[${PYTHON_USEDEP}]
- "
-
- distutils_enable_tests pytest
-
-The valid values include:
-
-- ``nose`` for ``dev-python/nose``
-- ``pytest`` for ``dev-python/pytest``
-- ``setup.py`` to call ``setup.py test`` (*deprecated*)
-- ``unittest`` to use built-in unittest discovery
-
-
-Adding more test dependencies
------------------------------
-Additional test dependencies can be specified in ``test?`` conditional.
-The flag normally does not need to be explicitly declared,
-as ``distutils_enable_tests`` does that in the majority of cases.
-
-.. code-block:: bash
- :emphasize-lines: 18,21
-
- # Copyright 1999-2020 Gentoo Authors
- # Distributed under the terms of the GNU General Public License v2
-
- EAPI=6
-
- PYTHON_COMPAT=( python2_7 python3_{6,7,8} pypy3 )
- inherit distutils-r1
-
- DESCRIPTION="Universal encoding detector"
- HOMEPAGE="https://github.com/chardet/chardet https://pypi.org/project/chardet/"
- SRC_URI="https://github.com/chardet/chardet/archive/${PV}.tar.gz -> ${P}.tar.gz"
-
- LICENSE="LGPL-2.1"
- SLOT="0"
- KEYWORDS="~alpha amd64 arm arm64 hppa ia64 ~m68k ~mips ppc ppc64 s390 ~sh sparc x86 ~x64-cygwin ~amd64-linux ~x86-linux ~x64-macos ~x86-macos ~x64-solaris"
-
- DEPEND="
- test? ( dev-python/hypothesis[${PYTHON_USEDEP}] )
- "
-
- distutils_enable_tests pytest
-
-Note that ``distutils_enable_tests`` modifies variables directly
-in the ebuild environment. This means that if you wish to change their
-values, you need to append to them, i.e. the bottom part of that ebuild
-can be rewritten as:
-
-.. code-block:: bash
- :emphasize-lines: 3
-
- distutils_enable_tests pytest
-
- DEPEND+="
- test? ( dev-python/hypothesis[${PYTHON_USEDEP}] )
- "
-
-Installing the package before running tests
--------------------------------------------
-In PEP 517 mode, the eclass automatically exposes a venv-style install
-tree to the test phase. No explicit action in necessary.
-
-In the legacy mode, ``distutils_enable_tests`` has an optional
-``--install`` option that can be used to force performing an install
-to a temporary directory. More information can be found in the legacy
-section.
-
-
-Undesirable test dependencies
------------------------------
-There is a number of packages that are frequently listed as test
-dependencies upstream but have little to no value for Gentoo users.
-It is recommended to skip those test dependencies whenever possible.
-If tests fail to run without them, it is often preferable to strip
-the dependencies and/or configuration values enforcing them.
-
-*Coverage testing* establishes how much of the package's code is covered
-by the test suite. While this is useful statistic upstream, it has
-no value for Gentoo users who just want to install the package. This
-is often represented by dependencies on ``dev-python/coverage``,
-``dev-python/pytest-cov``. In the latter case, you usually need
-to strip ``--cov`` parameter from ``pytest.ini``.
-
-*PEP-8 testing* enforces standard coding style across Python programs.
-Issues found by it are relevant to upstream but entirely irrelevant
-to Gentoo users. If the package uses ``dev-python/pep8``,
-``dev-python/pycodestyle``, ``dev-python/flake8``, strip that
-dependency.
-
-``dev-python/pytest-runner`` is a thin wrapper to run pytest
-from ``setup.py``. Do not use it, just call pytest directly.
-
-``dev-python/tox`` is a convenient wrapper to run tests for multiple
-Python versions, in a virtualenv. The eclass already provides the logic
-for the former, and an environment close enough to the latter. Do not
-use tox in ebuilds.
-
-
-Customizing the test phase
---------------------------
-If additional pre-/post-test phase actions need to be performed,
-they can be easily injected via overriding ``src_test()`` and making
-it call ``distutils-r1_src_test``:
-
-.. code-block:: bash
- :emphasize-lines: 30-34
-
- # Copyright 1999-2020 Gentoo Authors
- # Distributed under the terms of the GNU General Public License v2
-
- EAPI=7
-
- PYTHON_COMPAT=( python3_{6,7,8} )
- inherit distutils-r1
-
- DESCRIPTION="Extra features for standard library's cmd module"
- HOMEPAGE="https://github.com/python-cmd2/cmd2"
- SRC_URI="mirror://pypi/${PN:0:1}/${PN}/${P}.tar.gz"
-
- LICENSE="MIT"
- SLOT="0"
- KEYWORDS="~amd64 ~arm ~arm64 ~ppc64 ~x86 ~amd64-linux ~x86-linux"
-
- RDEPEND="
- dev-python/attrs[${PYTHON_USEDEP}]
- >=dev-python/colorama-0.3.7[${PYTHON_USEDEP}]
- >=dev-python/pyperclip-1.6[${PYTHON_USEDEP}]
- dev-python/six[${PYTHON_USEDEP}]
- dev-python/wcwidth[${PYTHON_USEDEP}]
- "
- BDEPEND="
- dev-python/setuptools_scm[${PYTHON_USEDEP}]
- "
-
- distutils_enable_tests pytest
-
- src_test() {
- # tests rely on very specific text wrapping...
- local -x COLUMNS=80
- distutils-r1_src_test
- }
-
-If the actual test command needs to be customized, or a non-standard
-test tool needs to be used, you can define a ``python_test()`` sub-phase
-function. This function is called for every enabled Python target
-by the default ``src_test`` implementation. This can either be combined
-with ``distutils_enable_tests`` call, or used instead of it. In fact,
-the former function simply defines a ``python_test()`` function as part
-of its logic.
-
-.. code-block:: bash
- :emphasize-lines: 16,17,26-31,33-35
-
- # Copyright 1999-2020 Gentoo Authors
- # Distributed under the terms of the GNU General Public License v2
-
- EAPI=7
-
- PYTHON_COMPAT=( python{2_7,3_6,3_7,3_8} pypy3 )
- inherit distutils-r1
-
- DESCRIPTION="Bash tab completion for argparse"
- HOMEPAGE="https://pypi.org/project/argcomplete/"
- SRC_URI="mirror://pypi/${PN:0:1}/${PN}/${P}.tar.gz"
-
- LICENSE="Apache-2.0"
- SLOT="0"
- KEYWORDS="~amd64 ~arm ~arm64 ~hppa ~x86 ~amd64-linux ~x86-linux ~x64-macos"
- IUSE="test"
- RESTRICT="!test? ( test )"
-
- RDEPEND="
- $(python_gen_cond_dep '
- <dev-python/importlib_metadata-2[${PYTHON_USEDEP}]
- ' -2 python3_{5,6,7} pypy3)"
- # pip is called as an external tool
- BDEPEND="
- dev-python/setuptools[${PYTHON_USEDEP}]
- test? (
- app-shells/fish
- app-shells/tcsh
- dev-python/pexpect[${PYTHON_USEDEP}]
- dev-python/pip
- )"
-
- python_test() {
- "${EPYTHON}" test/test.py -v || die
- }
-
-Note that ``python_test`` is called by ``distutils-r1_src_test``,
-so you must make sure to call it if you override ``src_test``.
-
-
-.. index:: epytest
-
-Customizing the test phase for pytest
--------------------------------------
-For the relatively frequent case of pytest-based packages needing
-additional customization, a ``epytest`` helper is provided. The helper
-runs ``pytest`` with a standard set of options and automatic handling
-of test failures.
-
-For example, if upstream uses ``network`` marker to disable
-network-based tests, you can override the test phase in the following
-way::
-
- distutils_enable_tests pytest
-
- python_test() {
- epytest -m 'not network'
- }
-
-
-.. index:: virtx
-
-Running tests with virtualx
----------------------------
-Test suites requiring a display to work correctly can often be appeased
-usng Xvfb. If the package in question does not start Xvfb directly,
-``virtualx.eclass`` can be used to do that. Whenever possible, it is
-preferable to run a single server in ``src_test()`` for all passes
-of the test suite, e.g.::
-
- distutils_enable_tests pytest
-
- src_test() {
- virtx distutils-r1_src_test
- }
-
-Note that ``virtx`` implicitly enables nonfatal mode. This means that
-e.g. ``epytest`` will no longer terminate the ebuild on failure, and you
-need to use ``die`` explicitly for it::
-
- src_test() {
- virtx distutils-r1_src_test
- }
-
- python_test() {
- epytest -m "not network" || die "Tests failed with ${EPYTHON}"
- }
-
-.. Warning::
-
- Explicit ``|| die`` is only necessary when overriding ``python_test``
- and running ``epytest`` inside a ``nonfatal``. The ``virtx`` command
- runs its arguments via a ``nonfatal``. The default ``python_test``
- implementation created by ``distutils_enable_tests`` accounts for
- this. In other contexts, ``epytest`` will die on its own.
+The support for test suites is now covered in the :doc:`test` chapter.
.. index:: distutils_enable_sphinx
@@ -1563,7 +1189,3 @@ ebuild fragment demonstrates using it with Meson:
https://devmanual.gentoo.org/eclass-reference/distutils-r1.eclass/index.html
.. _PEP 517:
https://www.python.org/dev/peps/pep-0517/
-.. _flit build system section documentation:
- https://flit.readthedocs.io/en/latest/pyproject_toml.html#build-system-section
-.. _poetry PEP-517 documentation:
- https://python-poetry.org/docs/pyproject/#poetry-and-pep-517
diff --git a/guide/_sources/index.rst.txt b/guide/_sources/index.rst.txt
index ed09999..c0c2e2c 100644
--- a/guide/_sources/index.rst.txt
+++ b/guide/_sources/index.rst.txt
@@ -16,10 +16,10 @@ Gentoo Python Guide
single
multi
distutils
+ test
distutils-legacy
helper
depend
- test
pytest
concept
expert-multi
diff --git a/guide/_sources/qawarn.rst.txt b/guide/_sources/qawarn.rst.txt
index fe80e48..4388350 100644
--- a/guide/_sources/qawarn.rst.txt
+++ b/guide/_sources/qawarn.rst.txt
@@ -253,9 +253,94 @@ entry:
For reference, see `include and exclude in Poetry documentation`_.
+Deprecated PEP 517 backends
+===========================
+
+flit.buildapi
+-------------
+Some packages are still found using the historical flit build backend.
+Their ``pyproject.toml`` files contain a section similar
+to the following:
+
+.. code-block:: toml
+
+ [build-system]
+ requires = ["flit"]
+ build-backend = "flit.buildapi"
+
+This backend requires installing the complete flit package manager.
+Instead, the package should be fixed upstream to use flit_core
+per `flit build system section documentation`_ instead:
+
+.. code-block:: toml
+
+ [build-system]
+ requires = ["flit_core"]
+ build-backend = "flit_core.buildapi"
+
+flit_core produces identical artifacts to flit. At the same time, it
+reduces the build-time dependency footprint and therefore makes isolated
+PEP 517 builds faster.
+
+
+poetry.masonry.api
+------------------
+A similar problem applies to the packages using poetry. The respective
+``pyproject.toml`` files contain:
+
+.. code-block:: toml
+
+ [build-system]
+ requires = ["poetry>=0.12"]
+ build-backend = "poetry.masonry.api"
+
+Instead, the lightweight poetry-core module should be used per `poetry
+PEP-517 documentation`_:
+
+.. code-block:: toml
+
+ [build-system]
+ requires = ["poetry_core>=1.0.0"]
+ build-backend = "poetry.core.masonry.api"
+
+poetry-core produces identical artifacts to poetry. It has smaller
+dependency footprint and makes isolated builds much faster.
+
+
+setuptools.build_meta:__legacy__
+--------------------------------
+Some packages using setuptools specify the following:
+
+.. code-block:: toml
+
+ [build-system]
+ requires = ["setuptools>=40.8.0", "wheel"]
+ build-backend = "setuptools.build_meta:__legacy__"
+
+This is incorrect, as the legacy backend is intended to be used only
+as an implicit fallback. All packages should be using the regular
+backend instead:
+
+.. code-block:: toml
+
+ [build-system]
+ requires = ["setuptools>=40.8.0"]
+ build-backend = "setuptools.build_meta"
+
+Please also note that the ``wheel`` package should *not* be listed
+as a dependency, as it is an implementation detail and it was always
+implicitly returned by the backend. Unfortunately, due to prolonged
+documentation error, a very large number of packages still specifies it,
+and other packages tend to copy that mistake.
+
+
.. _make.conf.example:
https://gitweb.gentoo.org/proj/portage.git/tree/cnf/make.conf.example#n330
.. _custom discovery in setuptools documentation:
https://setuptools.pypa.io/en/latest/userguide/package_discovery.html#custom-discovery
.. _include and exclude in Poetry documentation:
https://python-poetry.org/docs/pyproject/#include-and-exclude
+.. _flit build system section documentation:
+ https://flit.readthedocs.io/en/latest/pyproject_toml.html#build-system-section
+.. _poetry PEP-517 documentation:
+ https://python-poetry.org/docs/pyproject/#poetry-and-pep-517
diff --git a/guide/_sources/test.rst.txt b/guide/_sources/test.rst.txt
index 23c2c42..682c52f 100644
--- a/guide/_sources/test.rst.txt
+++ b/guide/_sources/test.rst.txt
@@ -1,9 +1,279 @@
-=============================
-Resolving test suite problems
-=============================
+========================
+Tests in Python packages
+========================
.. highlight:: bash
+
+Why is running tests important?
+===============================
+Since Python performs only minimal build-time (or more precisely,
+import-time) checking of correctness, it is important to run tests
+of Python packages in order to catch any problems early. This is
+especially important for permitting others to verify support for new
+Python implementations.
+
+
+.. index:: distutils_enable_tests
+
+Using distutils_enable_tests
+============================
+
+Basic use case
+--------------
+The simplest way of enabling tests is to call ``distutils_enable_tests``
+in global scope, passing the test runner name as the first argument.
+This function takes care of declaring test phase, setting appropriate
+dependencies and ``test`` USE flag if necessary. If called after
+setting ``RDEPEND``, it also copies it to test dependencies.
+
+.. code-block:: bash
+ :emphasize-lines: 22
+
+ # Copyright 1999-2020 Gentoo Authors
+ # Distributed under the terms of the GNU General Public License v2
+
+ EAPI=7
+
+ PYTHON_COMPAT=( python2_7 python3_{6,7,8} pypy3 )
+ inherit distutils-r1
+
+ DESCRIPTION="An easy whitelist-based HTML-sanitizing tool"
+ HOMEPAGE="https://github.com/mozilla/bleach https://pypi.org/project/bleach/"
+ SRC_URI="mirror://pypi/${PN:0:1}/${PN}/${P}.tar.gz"
+
+ LICENSE="Apache-2.0"
+ SLOT="0"
+ KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~mips ~ppc ~ppc64 ~s390 ~sparc ~x86"
+
+ RDEPEND="
+ dev-python/six[${PYTHON_USEDEP}]
+ dev-python/webencodings[${PYTHON_USEDEP}]
+ "
+
+ distutils_enable_tests pytest
+
+The valid values include:
+
+- ``nose`` for ``dev-python/nose`` (*deprecated*)
+- ``pytest`` for ``dev-python/pytest``
+- ``setup.py`` to call ``setup.py test`` (*deprecated*)
+- ``unittest`` to use built-in unittest discovery
+
+See `choosing the correct test runner`_ for more information.
+
+
+Adding more test dependencies
+-----------------------------
+Additional test dependencies can be specified in ``test?`` conditional.
+The flag normally does not need to be explicitly declared,
+as ``distutils_enable_tests`` does that in the majority of cases.
+
+Please read the section on `undesirable test dependencies`_ too.
+
+.. code-block:: bash
+ :emphasize-lines: 18,21
+
+ # Copyright 1999-2020 Gentoo Authors
+ # Distributed under the terms of the GNU General Public License v2
+
+ EAPI=6
+
+ PYTHON_COMPAT=( python2_7 python3_{6,7,8} pypy3 )
+ inherit distutils-r1
+
+ DESCRIPTION="Universal encoding detector"
+ HOMEPAGE="https://github.com/chardet/chardet https://pypi.org/project/chardet/"
+ SRC_URI="https://github.com/chardet/chardet/archive/${PV}.tar.gz -> ${P}.tar.gz"
+
+ LICENSE="LGPL-2.1"
+ SLOT="0"
+ KEYWORDS="~alpha amd64 arm arm64 hppa ia64 ~m68k ~mips ppc ppc64 s390 ~sh sparc x86 ~x64-cygwin ~amd64-linux ~x86-linux ~x64-macos ~x86-macos ~x64-solaris"
+
+ DEPEND="
+ test? ( dev-python/hypothesis[${PYTHON_USEDEP}] )
+ "
+
+ distutils_enable_tests pytest
+
+Note that ``distutils_enable_tests`` modifies variables directly
+in the ebuild environment. This means that if you wish to change their
+values, you need to append to them, i.e. the bottom part of that ebuild
+can be rewritten as:
+
+.. code-block:: bash
+ :emphasize-lines: 3
+
+ distutils_enable_tests pytest
+
+ DEPEND+="
+ test? ( dev-python/hypothesis[${PYTHON_USEDEP}] )
+ "
+
+
+Installing the package before running tests
+-------------------------------------------
+In PEP 517 mode, the eclass automatically exposes a venv-style install
+tree to the test phase. No explicit action in necessary.
+
+In the legacy mode, ``distutils_enable_tests`` has an optional
+``--install`` option that can be used to force performing an install
+to a temporary directory. More information can be found in the legacy
+section.
+
+
+Customizing the test phase
+--------------------------
+If additional pre-/post-test phase actions need to be performed,
+they can be easily injected via overriding ``src_test()`` and making
+it call ``distutils-r1_src_test``:
+
+.. code-block:: bash
+ :emphasize-lines: 30-34
+
+ # Copyright 1999-2020 Gentoo Authors
+ # Distributed under the terms of the GNU General Public License v2
+
+ EAPI=7
+
+ PYTHON_COMPAT=( python3_{6,7,8} )
+ inherit distutils-r1
+
+ DESCRIPTION="Extra features for standard library's cmd module"
+ HOMEPAGE="https://github.com/python-cmd2/cmd2"
+ SRC_URI="mirror://pypi/${PN:0:1}/${PN}/${P}.tar.gz"
+
+ LICENSE="MIT"
+ SLOT="0"
+ KEYWORDS="~amd64 ~arm ~arm64 ~ppc64 ~x86 ~amd64-linux ~x86-linux"
+
+ RDEPEND="
+ dev-python/attrs[${PYTHON_USEDEP}]
+ >=dev-python/colorama-0.3.7[${PYTHON_USEDEP}]
+ >=dev-python/pyperclip-1.6[${PYTHON_USEDEP}]
+ dev-python/six[${PYTHON_USEDEP}]
+ dev-python/wcwidth[${PYTHON_USEDEP}]
+ "
+ BDEPEND="
+ dev-python/setuptools_scm[${PYTHON_USEDEP}]
+ "
+
+ distutils_enable_tests pytest
+
+ src_test() {
+ # tests rely on very specific text wrapping...
+ local -x COLUMNS=80
+ distutils-r1_src_test
+ }
+
+If the actual test command needs to be customized, or a non-standard
+test tool needs to be used, you can define a ``python_test()`` sub-phase
+function. This function is called for every enabled Python target
+by the default ``src_test`` implementation. This can either be combined
+with ``distutils_enable_tests`` call, or used instead of it. In fact,
+the former function simply defines a ``python_test()`` function as part
+of its logic.
+
+.. code-block:: bash
+ :emphasize-lines: 16,17,26-31,33-35
+
+ # Copyright 1999-2020 Gentoo Authors
+ # Distributed under the terms of the GNU General Public License v2
+
+ EAPI=7
+
+ PYTHON_COMPAT=( python{2_7,3_6,3_7,3_8} pypy3 )
+ inherit distutils-r1
+
+ DESCRIPTION="Bash tab completion for argparse"
+ HOMEPAGE="https://pypi.org/project/argcomplete/"
+ SRC_URI="mirror://pypi/${PN:0:1}/${PN}/${P}.tar.gz"
+
+ LICENSE="Apache-2.0"
+ SLOT="0"
+ KEYWORDS="~amd64 ~arm ~arm64 ~hppa ~x86 ~amd64-linux ~x86-linux ~x64-macos"
+ IUSE="test"
+ RESTRICT="!test? ( test )"
+
+ RDEPEND="
+ $(python_gen_cond_dep '
+ <dev-python/importlib_metadata-2[${PYTHON_USEDEP}]
+ ' -2 python3_{5,6,7} pypy3)"
+ # pip is called as an external tool
+ BDEPEND="
+ dev-python/setuptools[${PYTHON_USEDEP}]
+ test? (
+ app-shells/fish
+ app-shells/tcsh
+ dev-python/pexpect[${PYTHON_USEDEP}]
+ dev-python/pip
+ )"
+
+ python_test() {
+ "${EPYTHON}" test/test.py -v || die
+ }
+
+Note that ``python_test`` is called by ``distutils-r1_src_test``,
+so you must make sure to call it if you override ``src_test``.
+
+
+.. index:: epytest
+
+Customizing the test phase for pytest
+-------------------------------------
+For the relatively frequent case of pytest-based packages needing
+additional customization, a ``epytest`` helper is provided. The helper
+runs ``pytest`` with a standard set of options and automatic handling
+of test failures.
+
+For example, if upstream uses ``network`` marker to disable
+network-based tests, you can override the test phase in the following
+way::
+
+ distutils_enable_tests pytest
+
+ python_test() {
+ epytest -m 'not network'
+ }
+
+
+.. index:: virtx
+
+Running tests with virtualx
+---------------------------
+Test suites requiring a display to work correctly can often be appeased
+usng Xvfb. If the package in question does not start Xvfb directly,
+``virtualx.eclass`` can be used to do that. Whenever possible, it is
+preferable to run a single server in ``src_test()`` for all passes
+of the test suite, e.g.::
+
+ distutils_enable_tests pytest
+
+ src_test() {
+ virtx distutils-r1_src_test
+ }
+
+Note that ``virtx`` implicitly enables nonfatal mode. This means that
+e.g. ``epytest`` will no longer terminate the ebuild on failure, and you
+need to use ``die`` explicitly for it::
+
+ src_test() {
+ virtx distutils-r1_src_test
+ }
+
+ python_test() {
+ epytest -m "not network" || die "Tests failed with ${EPYTHON}"
+ }
+
+.. Warning::
+
+ Explicit ``|| die`` is only necessary when overriding ``python_test``
+ and running ``epytest`` inside a ``nonfatal``. The ``virtx`` command
+ runs its arguments via a ``nonfatal``. The default ``python_test``
+ implementation created by ``distutils_enable_tests`` accounts for
+ this. In other contexts, ``epytest`` will die on its own.
+
+
Choosing the correct test runner
================================
There are a few modules used to run tests in Python packages. The most
@@ -49,6 +319,36 @@ If you have some free time, convincing upstream to switch from nose
to pytest is a worthwhile goal.
+Undesirable test dependencies
+=============================
+There is a number of packages that are frequently listed as test
+dependencies upstream but have little to no value for Gentoo users.
+It is recommended to skip those test dependencies whenever possible.
+If tests fail to run without them, it is often preferable to strip
+the dependencies and/or configuration values enforcing them.
+
+*Coverage testing* establishes how much of the package's code is covered
+by the test suite. While this is useful statistic upstream, it has
+no value for Gentoo users who just want to install the package. This
+is often represented by dependencies on ``dev-python/coverage``,
+``dev-python/pytest-cov``. In the latter case, you usually need
+to strip ``--cov`` parameter from ``pytest.ini``.
+
+*PEP-8 testing* enforces standard coding style across Python programs.
+Issues found by it are relevant to upstream but entirely irrelevant
+to Gentoo users. If the package uses ``dev-python/pep8``,
+``dev-python/pycodestyle``, ``dev-python/flake8``, strip that
+dependency.
+
+``dev-python/pytest-runner`` is a thin wrapper to run pytest
+from ``setup.py``. Do not use it, just call pytest directly.
+
+``dev-python/tox`` is a convenient wrapper to run tests for multiple
+Python versions, in a virtualenv. The eclass already provides the logic
+for the former, and an environment close enough to the latter. Do not
+use tox in ebuilds.
+
+
Missing test files in PyPI packages
===================================
One of the more common test-related problems is that PyPI packages
diff --git a/guide/distutils.html b/guide/distutils.html
index fd785f4..5f0b8c6 100644
--- a/guide/distutils.html
+++ b/guide/distutils.html
@@ -14,7 +14,7 @@
<script src="_static/sphinx_highlight.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
- <link rel="next" title="distutils-r1 legacy concepts" href="distutils-legacy.html" />
+ <link rel="next" title="Tests in Python packages" href="test.html" />
<link rel="prev" title="python-r1 — multi-impl packages" href="multi.html" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
@@ -311,73 +311,7 @@ backend.</p>
the <code class="docutils literal notranslate"><span class="pre">setuptools</span></code> backend (this applies to pure distutils packages
as well). The eclass automatically uses the legacy setuptools backend
for them.</p>
-</section>
-<section id="deprecated-pep-517-backends">
-<h2>Deprecated PEP 517 backends<a class="headerlink" href="#deprecated-pep-517-backends" title="Permalink to this heading">¶</a></h2>
-<section id="flit-buildapi">
-<h3>flit.buildapi<a class="headerlink" href="#flit-buildapi" title="Permalink to this heading">¶</a></h3>
-<p>Some packages are still found using the historical flit build backend.
-Their <code class="docutils literal notranslate"><span class="pre">pyproject.toml</span></code> files contain a section similar
-to the following:</p>
-<div class="highlight-toml notranslate"><div class="highlight"><pre><span></span><span class="k">[build-system]</span>
-<span class="n">requires</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="s">&quot;flit&quot;</span><span class="p">]</span>
-<span class="n">build-backend</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;flit.buildapi&quot;</span>
-</pre></div>
-</div>
-<p>This backend requires installing the complete flit package manager.
-Instead, the package should be fixed upstream to use flit_core
-per <a class="reference external" href="https://flit.readthedocs.io/en/latest/pyproject_toml.html#build-system-section">flit build system section documentation</a> instead:</p>
-<div class="highlight-toml notranslate"><div class="highlight"><pre><span></span><span class="k">[build-system]</span>
-<span class="n">requires</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="s">&quot;flit_core&quot;</span><span class="p">]</span>
-<span class="n">build-backend</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;flit_core.buildapi&quot;</span>
-</pre></div>
-</div>
-<p>flit_core produces identical artifacts to flit. At the same time, it
-reduces the build-time dependency footprint and therefore makes isolated
-PEP 517 builds faster.</p>
-</section>
-<section id="poetry-masonry-api">
-<h3>poetry.masonry.api<a class="headerlink" href="#poetry-masonry-api" title="Permalink to this heading">¶</a></h3>
-<p>A similar problem applies to the packages using poetry. The respective
-<code class="docutils literal notranslate"><span class="pre">pyproject.toml</span></code> files contain:</p>
-<div class="highlight-toml notranslate"><div class="highlight"><pre><span></span><span class="k">[build-system]</span>
-<span class="n">requires</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="s">&quot;poetry&gt;=0.12&quot;</span><span class="p">]</span>
-<span class="n">build-backend</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;poetry.masonry.api&quot;</span>
-</pre></div>
-</div>
-<p>Instead, the lightweight poetry-core module should be used per <a class="reference external" href="https://python-poetry.org/docs/pyproject/#poetry-and-pep-517">poetry
-PEP-517 documentation</a>:</p>
-<div class="highlight-toml notranslate"><div class="highlight"><pre><span></span><span class="k">[build-system]</span>
-<span class="n">requires</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="s">&quot;poetry_core&gt;=1.0.0&quot;</span><span class="p">]</span>
-<span class="n">build-backend</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;poetry.core.masonry.api&quot;</span>
-</pre></div>
-</div>
-<p>poetry-core produces identical artifacts to poetry. It has smaller
-dependency footprint and makes isolated builds much faster.</p>
-</section>
-<section id="setuptools-build-meta-legacy">
-<h3>setuptools.build_meta:__legacy__<a class="headerlink" href="#setuptools-build-meta-legacy" title="Permalink to this heading">¶</a></h3>
-<p>Some packages using setuptools specify the following:</p>
-<div class="highlight-toml notranslate"><div class="highlight"><pre><span></span><span class="k">[build-system]</span>
-<span class="n">requires</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="s">&quot;setuptools&gt;=40.8.0&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;wheel&quot;</span><span class="p">]</span>
-<span class="n">build-backend</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;setuptools.build_meta:__legacy__&quot;</span>
-</pre></div>
-</div>
-<p>This is incorrect, as the legacy backend is intended to be used only
-as an implicit fallback. All packages should be using the regular
-backend instead:</p>
-<div class="highlight-toml notranslate"><div class="highlight"><pre><span></span><span class="k">[build-system]</span>
-<span class="n">requires</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="s">&quot;setuptools&gt;=40.8.0&quot;</span><span class="p">]</span>
-<span class="n">build-backend</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;setuptools.build_meta&quot;</span>
-</pre></div>
-</div>
-<p>Please also note that the <code class="docutils literal notranslate"><span class="pre">wheel</span></code> package should <em>not</em> be listed
-as a dependency, as it is an implementation detail and it was always
-implicitly returned by the backend. Unfortunately, due to prolonged
-documentation error, a very large number of packages still specifies it,
-and other packages tend to copy that mistake.</p>
<span class="target" id="index-2"></span><span class="target" id="index-3"></span><span class="target" id="index-4"></span></section>
-</section>
<section id="setuptools-scm-flit-scm-hatch-vcs-and-snapshots">
<span id="index-5"></span><h2>setuptools_scm (flit_scm, hatch-vcs) and snapshots<a class="headerlink" href="#setuptools-scm-flit-scm-hatch-vcs-and-snapshots" title="Permalink to this heading">¶</a></h2>
<p><a class="reference external" href="https://pypi.org/project/setuptools-scm/">setuptools_scm</a> is a package providing additional features for running
@@ -708,274 +642,11 @@ beforehand (much like <code class="docutils literal notranslate"><span class="pr
</div>
</section>
<section id="enabling-tests">
-<span id="index-19"></span><h2>Enabling tests<a class="headerlink" href="#enabling-tests" title="Permalink to this heading">¶</a></h2>
-<p>Since Python performs only minimal build-time (or more precisely,
-import-time) checking of correctness, it is important to run tests
-of Python packages in order to catch any problems early. This is
-especially important for permitting others to verify support for new
-Python implementations.</p>
-<p>Many Python packages use one of the standard test runners, and work fine
-with the default ways of calling them. Note that upstreams sometimes
-specify a test runner that’s not strictly necessary — e.g. specify
-<code class="docutils literal notranslate"><span class="pre">dev-python/pytest</span></code> as a dependency while the tests do not use it
-anywhere and work just fine with built-in modules. The best way
-to determine the test runner to use is to grep the test sources.</p>
-<section id="using-distutils-enable-tests">
-<h3>Using distutils_enable_tests<a class="headerlink" href="#using-distutils-enable-tests" title="Permalink to this heading">¶</a></h3>
-<p>The simplest way of enabling tests is to call <code class="docutils literal notranslate"><span class="pre">distutils_enable_tests</span></code>
-in global scope, passing the test runner name as the first argument.
-This function takes care of declaring test phase, setting appropriate
-dependencies and <code class="docutils literal notranslate"><span class="pre">test</span></code> USE flag if necessary. If called after
-setting <code class="docutils literal notranslate"><span class="pre">RDEPEND</span></code>, it also copies it to test dependencies.</p>
-<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="c1"># Copyright 1999-2020 Gentoo Authors</span>
-<span class="w"> </span><span class="c1"># Distributed under the terms of the GNU General Public License v2</span>
-
-<span class="w"> </span><span class="nv">EAPI</span><span class="o">=</span><span class="m">7</span>
-
-<span class="w"> </span><span class="nv">PYTHON_COMPAT</span><span class="o">=(</span><span class="w"> </span>python2_7<span class="w"> </span>python3_<span class="o">{</span><span class="m">6</span>,7,8<span class="o">}</span><span class="w"> </span>pypy3<span class="w"> </span><span class="o">)</span>
-<span class="w"> </span>inherit<span class="w"> </span>distutils-r1
-
-<span class="w"> </span><span class="nv">DESCRIPTION</span><span class="o">=</span><span class="s2">&quot;An easy whitelist-based HTML-sanitizing tool&quot;</span>
-<span class="w"> </span><span class="nv">HOMEPAGE</span><span class="o">=</span><span class="s2">&quot;https://github.com/mozilla/bleach https://pypi.org/project/bleach/&quot;</span>
-<span class="w"> </span><span class="nv">SRC_URI</span><span class="o">=</span><span class="s2">&quot;mirror://pypi/</span><span class="si">${</span><span class="nv">PN</span><span class="p">:</span><span class="nv">0</span><span class="p">:</span><span class="nv">1</span><span class="si">}</span><span class="s2">/</span><span class="si">${</span><span class="nv">PN</span><span class="si">}</span><span class="s2">/</span><span class="si">${</span><span class="nv">P</span><span class="si">}</span><span class="s2">.tar.gz&quot;</span>
-
-<span class="w"> </span><span class="nv">LICENSE</span><span class="o">=</span><span class="s2">&quot;Apache-2.0&quot;</span>
-<span class="w"> </span><span class="nv">SLOT</span><span class="o">=</span><span class="s2">&quot;0&quot;</span>
-<span class="w"> </span><span class="nv">KEYWORDS</span><span class="o">=</span><span class="s2">&quot;~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~mips ~ppc ~ppc64 ~s390 ~sparc ~x86&quot;</span>
-
-<span class="w"> </span><span class="nv">RDEPEND</span><span class="o">=</span><span class="s2">&quot;</span>
-<span class="s2"> dev-python/six[</span><span class="si">${</span><span class="nv">PYTHON_USEDEP</span><span class="si">}</span><span class="s2">]</span>
-<span class="s2"> dev-python/webencodings[</span><span class="si">${</span><span class="nv">PYTHON_USEDEP</span><span class="si">}</span><span class="s2">]</span>
-<span class="s2"> &quot;</span>
-
-<span class="hll"><span class="w"> </span>distutils_enable_tests<span class="w"> </span>pytest
-</span></pre></div>
-</div>
-<p>The valid values include:</p>
-<ul class="simple">
-<li><p><code class="docutils literal notranslate"><span class="pre">nose</span></code> for <code class="docutils literal notranslate"><span class="pre">dev-python/nose</span></code></p></li>
-<li><p><code class="docutils literal notranslate"><span class="pre">pytest</span></code> for <code class="docutils literal notranslate"><span class="pre">dev-python/pytest</span></code></p></li>
-<li><p><code class="docutils literal notranslate"><span class="pre">setup.py</span></code> to call <code class="docutils literal notranslate"><span class="pre">setup.py</span> <span class="pre">test</span></code> (<em>deprecated</em>)</p></li>
-<li><p><code class="docutils literal notranslate"><span class="pre">unittest</span></code> to use built-in unittest discovery</p></li>
-</ul>
-</section>
-<section id="adding-more-test-dependencies">
-<h3>Adding more test dependencies<a class="headerlink" href="#adding-more-test-dependencies" title="Permalink to this heading">¶</a></h3>
-<p>Additional test dependencies can be specified in <code class="docutils literal notranslate"><span class="pre">test?</span></code> conditional.
-The flag normally does not need to be explicitly declared,
-as <code class="docutils literal notranslate"><span class="pre">distutils_enable_tests</span></code> does that in the majority of cases.</p>
-<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="c1"># Copyright 1999-2020 Gentoo Authors</span>
-<span class="w"> </span><span class="c1"># Distributed under the terms of the GNU General Public License v2</span>
-
-<span class="w"> </span><span class="nv">EAPI</span><span class="o">=</span><span class="m">6</span>
-
-<span class="w"> </span><span class="nv">PYTHON_COMPAT</span><span class="o">=(</span><span class="w"> </span>python2_7<span class="w"> </span>python3_<span class="o">{</span><span class="m">6</span>,7,8<span class="o">}</span><span class="w"> </span>pypy3<span class="w"> </span><span class="o">)</span>
-<span class="w"> </span>inherit<span class="w"> </span>distutils-r1
-
-<span class="w"> </span><span class="nv">DESCRIPTION</span><span class="o">=</span><span class="s2">&quot;Universal encoding detector&quot;</span>
-<span class="w"> </span><span class="nv">HOMEPAGE</span><span class="o">=</span><span class="s2">&quot;https://github.com/chardet/chardet https://pypi.org/project/chardet/&quot;</span>
-<span class="w"> </span><span class="nv">SRC_URI</span><span class="o">=</span><span class="s2">&quot;https://github.com/chardet/chardet/archive/</span><span class="si">${</span><span class="nv">PV</span><span class="si">}</span><span class="s2">.tar.gz -&gt; </span><span class="si">${</span><span class="nv">P</span><span class="si">}</span><span class="s2">.tar.gz&quot;</span>
-
-<span class="w"> </span><span class="nv">LICENSE</span><span class="o">=</span><span class="s2">&quot;LGPL-2.1&quot;</span>
-<span class="w"> </span><span class="nv">SLOT</span><span class="o">=</span><span class="s2">&quot;0&quot;</span>
-<span class="w"> </span><span class="nv">KEYWORDS</span><span class="o">=</span><span class="s2">&quot;~alpha amd64 arm arm64 hppa ia64 ~m68k ~mips ppc ppc64 s390 ~sh sparc x86 ~x64-cygwin ~amd64-linux ~x86-linux ~x64-macos ~x86-macos ~x64-solaris&quot;</span>
-
-<span class="w"> </span><span class="nv">DEPEND</span><span class="o">=</span><span class="s2">&quot;</span>
-<span class="hll"><span class="s2"> test? ( dev-python/hypothesis[</span><span class="si">${</span><span class="nv">PYTHON_USEDEP</span><span class="si">}</span><span class="s2">] )</span>
-</span><span class="s2"> &quot;</span>
-
-<span class="hll"><span class="w"> </span>distutils_enable_tests<span class="w"> </span>pytest
-</span></pre></div>
-</div>
-<p>Note that <code class="docutils literal notranslate"><span class="pre">distutils_enable_tests</span></code> modifies variables directly
-in the ebuild environment. This means that if you wish to change their
-values, you need to append to them, i.e. the bottom part of that ebuild
-can be rewritten as:</p>
-<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="w"> </span>distutils_enable_tests<span class="w"> </span>pytest
-
-<span class="hll"><span class="w"> </span><span class="nv">DEPEND</span><span class="o">+=</span><span class="s2">&quot;</span>
-</span><span class="s2"> test? ( dev-python/hypothesis[</span><span class="si">${</span><span class="nv">PYTHON_USEDEP</span><span class="si">}</span><span class="s2">] )</span>
-<span class="s2"> &quot;</span>
-</pre></div>
-</div>
-</section>
-<section id="installing-the-package-before-running-tests">
-<h3>Installing the package before running tests<a class="headerlink" href="#installing-the-package-before-running-tests" title="Permalink to this heading">¶</a></h3>
-<p>In PEP 517 mode, the eclass automatically exposes a venv-style install
-tree to the test phase. No explicit action in necessary.</p>
-<p>In the legacy mode, <code class="docutils literal notranslate"><span class="pre">distutils_enable_tests</span></code> has an optional
-<code class="docutils literal notranslate"><span class="pre">--install</span></code> option that can be used to force performing an install
-to a temporary directory. More information can be found in the legacy
-section.</p>
-</section>
-<section id="undesirable-test-dependencies">
-<h3>Undesirable test dependencies<a class="headerlink" href="#undesirable-test-dependencies" title="Permalink to this heading">¶</a></h3>
-<p>There is a number of packages that are frequently listed as test
-dependencies upstream but have little to no value for Gentoo users.
-It is recommended to skip those test dependencies whenever possible.
-If tests fail to run without them, it is often preferable to strip
-the dependencies and/or configuration values enforcing them.</p>
-<p><em>Coverage testing</em> establishes how much of the package’s code is covered
-by the test suite. While this is useful statistic upstream, it has
-no value for Gentoo users who just want to install the package. This
-is often represented by dependencies on <code class="docutils literal notranslate"><span class="pre">dev-python/coverage</span></code>,
-<code class="docutils literal notranslate"><span class="pre">dev-python/pytest-cov</span></code>. In the latter case, you usually need
-to strip <code class="docutils literal notranslate"><span class="pre">--cov</span></code> parameter from <code class="docutils literal notranslate"><span class="pre">pytest.ini</span></code>.</p>
-<p><em>PEP-8 testing</em> enforces standard coding style across Python programs.
-Issues found by it are relevant to upstream but entirely irrelevant
-to Gentoo users. If the package uses <code class="docutils literal notranslate"><span class="pre">dev-python/pep8</span></code>,
-<code class="docutils literal notranslate"><span class="pre">dev-python/pycodestyle</span></code>, <code class="docutils literal notranslate"><span class="pre">dev-python/flake8</span></code>, strip that
-dependency.</p>
-<p><code class="docutils literal notranslate"><span class="pre">dev-python/pytest-runner</span></code> is a thin wrapper to run pytest
-from <code class="docutils literal notranslate"><span class="pre">setup.py</span></code>. Do not use it, just call pytest directly.</p>
-<p><code class="docutils literal notranslate"><span class="pre">dev-python/tox</span></code> is a convenient wrapper to run tests for multiple
-Python versions, in a virtualenv. The eclass already provides the logic
-for the former, and an environment close enough to the latter. Do not
-use tox in ebuilds.</p>
-</section>
-<section id="customizing-the-test-phase">
-<h3>Customizing the test phase<a class="headerlink" href="#customizing-the-test-phase" title="Permalink to this heading">¶</a></h3>
-<p>If additional pre-/post-test phase actions need to be performed,
-they can be easily injected via overriding <code class="docutils literal notranslate"><span class="pre">src_test()</span></code> and making
-it call <code class="docutils literal notranslate"><span class="pre">distutils-r1_src_test</span></code>:</p>
-<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="c1"># Copyright 1999-2020 Gentoo Authors</span>
-<span class="w"> </span><span class="c1"># Distributed under the terms of the GNU General Public License v2</span>
-
-<span class="w"> </span><span class="nv">EAPI</span><span class="o">=</span><span class="m">7</span>
-
-<span class="w"> </span><span class="nv">PYTHON_COMPAT</span><span class="o">=(</span><span class="w"> </span>python3_<span class="o">{</span><span class="m">6</span>,7,8<span class="o">}</span><span class="w"> </span><span class="o">)</span>
-<span class="w"> </span>inherit<span class="w"> </span>distutils-r1
-
-<span class="w"> </span><span class="nv">DESCRIPTION</span><span class="o">=</span><span class="s2">&quot;Extra features for standard library&#39;s cmd module&quot;</span>
-<span class="w"> </span><span class="nv">HOMEPAGE</span><span class="o">=</span><span class="s2">&quot;https://github.com/python-cmd2/cmd2&quot;</span>
-<span class="w"> </span><span class="nv">SRC_URI</span><span class="o">=</span><span class="s2">&quot;mirror://pypi/</span><span class="si">${</span><span class="nv">PN</span><span class="p">:</span><span class="nv">0</span><span class="p">:</span><span class="nv">1</span><span class="si">}</span><span class="s2">/</span><span class="si">${</span><span class="nv">PN</span><span class="si">}</span><span class="s2">/</span><span class="si">${</span><span class="nv">P</span><span class="si">}</span><span class="s2">.tar.gz&quot;</span>
-
-<span class="w"> </span><span class="nv">LICENSE</span><span class="o">=</span><span class="s2">&quot;MIT&quot;</span>
-<span class="w"> </span><span class="nv">SLOT</span><span class="o">=</span><span class="s2">&quot;0&quot;</span>
-<span class="w"> </span><span class="nv">KEYWORDS</span><span class="o">=</span><span class="s2">&quot;~amd64 ~arm ~arm64 ~ppc64 ~x86 ~amd64-linux ~x86-linux&quot;</span>
-
-<span class="w"> </span><span class="nv">RDEPEND</span><span class="o">=</span><span class="s2">&quot;</span>
-<span class="s2"> dev-python/attrs[</span><span class="si">${</span><span class="nv">PYTHON_USEDEP</span><span class="si">}</span><span class="s2">]</span>
-<span class="s2"> &gt;=dev-python/colorama-0.3.7[</span><span class="si">${</span><span class="nv">PYTHON_USEDEP</span><span class="si">}</span><span class="s2">]</span>
-<span class="s2"> &gt;=dev-python/pyperclip-1.6[</span><span class="si">${</span><span class="nv">PYTHON_USEDEP</span><span class="si">}</span><span class="s2">]</span>
-<span class="s2"> dev-python/six[</span><span class="si">${</span><span class="nv">PYTHON_USEDEP</span><span class="si">}</span><span class="s2">]</span>
-<span class="s2"> dev-python/wcwidth[</span><span class="si">${</span><span class="nv">PYTHON_USEDEP</span><span class="si">}</span><span class="s2">]</span>
-<span class="s2"> &quot;</span>
-<span class="w"> </span><span class="nv">BDEPEND</span><span class="o">=</span><span class="s2">&quot;</span>
-<span class="s2"> dev-python/setuptools_scm[</span><span class="si">${</span><span class="nv">PYTHON_USEDEP</span><span class="si">}</span><span class="s2">]</span>
-<span class="s2"> &quot;</span>
-
-<span class="w"> </span>distutils_enable_tests<span class="w"> </span>pytest
-
-<span class="hll"><span class="w"> </span>src_test<span class="o">()</span><span class="w"> </span><span class="o">{</span>
-</span><span class="hll"><span class="w"> </span><span class="c1"># tests rely on very specific text wrapping...</span>
-</span><span class="hll"><span class="w"> </span><span class="nb">local</span><span class="w"> </span>-x<span class="w"> </span><span class="nv">COLUMNS</span><span class="o">=</span><span class="m">80</span>
-</span><span class="hll"><span class="w"> </span>distutils-r1_src_test
-</span><span class="hll"><span class="w"> </span><span class="o">}</span>
-</span></pre></div>
-</div>
-<p>If the actual test command needs to be customized, or a non-standard
-test tool needs to be used, you can define a <code class="docutils literal notranslate"><span class="pre">python_test()</span></code> sub-phase
-function. This function is called for every enabled Python target
-by the default <code class="docutils literal notranslate"><span class="pre">src_test</span></code> implementation. This can either be combined
-with <code class="docutils literal notranslate"><span class="pre">distutils_enable_tests</span></code> call, or used instead of it. In fact,
-the former function simply defines a <code class="docutils literal notranslate"><span class="pre">python_test()</span></code> function as part
-of its logic.</p>
-<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="c1"># Copyright 1999-2020 Gentoo Authors</span>
-<span class="w"> </span><span class="c1"># Distributed under the terms of the GNU General Public License v2</span>
-
-<span class="w"> </span><span class="nv">EAPI</span><span class="o">=</span><span class="m">7</span>
-
-<span class="w"> </span><span class="nv">PYTHON_COMPAT</span><span class="o">=(</span><span class="w"> </span>python<span class="o">{</span>2_7,3_6,3_7,3_8<span class="o">}</span><span class="w"> </span>pypy3<span class="w"> </span><span class="o">)</span>
-<span class="w"> </span>inherit<span class="w"> </span>distutils-r1
-
-<span class="w"> </span><span class="nv">DESCRIPTION</span><span class="o">=</span><span class="s2">&quot;Bash tab completion for argparse&quot;</span>
-<span class="w"> </span><span class="nv">HOMEPAGE</span><span class="o">=</span><span class="s2">&quot;https://pypi.org/project/argcomplete/&quot;</span>
-<span class="w"> </span><span class="nv">SRC_URI</span><span class="o">=</span><span class="s2">&quot;mirror://pypi/</span><span class="si">${</span><span class="nv">PN</span><span class="p">:</span><span class="nv">0</span><span class="p">:</span><span class="nv">1</span><span class="si">}</span><span class="s2">/</span><span class="si">${</span><span class="nv">PN</span><span class="si">}</span><span class="s2">/</span><span class="si">${</span><span class="nv">P</span><span class="si">}</span><span class="s2">.tar.gz&quot;</span>
-
-<span class="w"> </span><span class="nv">LICENSE</span><span class="o">=</span><span class="s2">&quot;Apache-2.0&quot;</span>
-<span class="w"> </span><span class="nv">SLOT</span><span class="o">=</span><span class="s2">&quot;0&quot;</span>
-<span class="w"> </span><span class="nv">KEYWORDS</span><span class="o">=</span><span class="s2">&quot;~amd64 ~arm ~arm64 ~hppa ~x86 ~amd64-linux ~x86-linux ~x64-macos&quot;</span>
-<span class="hll"><span class="w"> </span><span class="nv">IUSE</span><span class="o">=</span><span class="s2">&quot;test&quot;</span>
-</span><span class="hll"><span class="w"> </span><span class="nv">RESTRICT</span><span class="o">=</span><span class="s2">&quot;!test? ( test )&quot;</span>
-</span>
-<span class="w"> </span><span class="nv">RDEPEND</span><span class="o">=</span><span class="s2">&quot;</span>
-<span class="s2"> </span><span class="k">$(</span>python_gen_cond_dep<span class="w"> </span><span class="s1">&#39;</span>
-<span class="s1"> &lt;dev-python/importlib_metadata-2[${PYTHON_USEDEP}]</span>
-<span class="s1"> &#39;</span><span class="w"> </span>-2<span class="w"> </span>python3_<span class="o">{</span><span class="m">5</span>,6,7<span class="o">}</span><span class="w"> </span>pypy3<span class="k">)</span><span class="s2">&quot;</span>
-<span class="w"> </span><span class="c1"># pip is called as an external tool</span>
-<span class="w"> </span><span class="nv">BDEPEND</span><span class="o">=</span><span class="s2">&quot;</span>
-<span class="s2"> dev-python/setuptools[</span><span class="si">${</span><span class="nv">PYTHON_USEDEP</span><span class="si">}</span><span class="s2">]</span>
-<span class="hll"><span class="s2"> test? (</span>
-</span><span class="hll"><span class="s2"> app-shells/fish</span>
-</span><span class="hll"><span class="s2"> app-shells/tcsh</span>
-</span><span class="hll"><span class="s2"> dev-python/pexpect[</span><span class="si">${</span><span class="nv">PYTHON_USEDEP</span><span class="si">}</span><span class="s2">]</span>
-</span><span class="hll"><span class="s2"> dev-python/pip</span>
-</span><span class="hll"><span class="s2"> )&quot;</span>
-</span>
-<span class="hll"><span class="w"> </span>python_test<span class="o">()</span><span class="w"> </span><span class="o">{</span>
-</span><span class="hll"><span class="w"> </span><span class="s2">&quot;</span><span class="si">${</span><span class="nv">EPYTHON</span><span class="si">}</span><span class="s2">&quot;</span><span class="w"> </span>test/test.py<span class="w"> </span>-v<span class="w"> </span><span class="o">||</span><span class="w"> </span>die
-</span><span class="hll"><span class="w"> </span><span class="o">}</span>
-</span></pre></div>
-</div>
-<p>Note that <code class="docutils literal notranslate"><span class="pre">python_test</span></code> is called by <code class="docutils literal notranslate"><span class="pre">distutils-r1_src_test</span></code>,
-so you must make sure to call it if you override <code class="docutils literal notranslate"><span class="pre">src_test</span></code>.</p>
-</section>
-<section id="customizing-the-test-phase-for-pytest">
-<span id="index-20"></span><h3>Customizing the test phase for pytest<a class="headerlink" href="#customizing-the-test-phase-for-pytest" title="Permalink to this heading">¶</a></h3>
-<p>For the relatively frequent case of pytest-based packages needing
-additional customization, a <code class="docutils literal notranslate"><span class="pre">epytest</span></code> helper is provided. The helper
-runs <code class="docutils literal notranslate"><span class="pre">pytest</span></code> with a standard set of options and automatic handling
-of test failures.</p>
-<p>For example, if upstream uses <code class="docutils literal notranslate"><span class="pre">network</span></code> marker to disable
-network-based tests, you can override the test phase in the following
-way:</p>
-<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>distutils_enable_tests<span class="w"> </span>pytest
-
-python_test<span class="o">()</span><span class="w"> </span><span class="o">{</span>
-<span class="w"> </span>epytest<span class="w"> </span>-m<span class="w"> </span><span class="s1">&#39;not network&#39;</span>
-<span class="o">}</span>
-</pre></div>
-</div>
-</section>
-<section id="running-tests-with-virtualx">
-<span id="index-21"></span><h3>Running tests with virtualx<a class="headerlink" href="#running-tests-with-virtualx" title="Permalink to this heading">¶</a></h3>
-<p>Test suites requiring a display to work correctly can often be appeased
-usng Xvfb. If the package in question does not start Xvfb directly,
-<code class="docutils literal notranslate"><span class="pre">virtualx.eclass</span></code> can be used to do that. Whenever possible, it is
-preferable to run a single server in <code class="docutils literal notranslate"><span class="pre">src_test()</span></code> for all passes
-of the test suite, e.g.:</p>
-<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>distutils_enable_tests<span class="w"> </span>pytest
-
-src_test<span class="o">()</span><span class="w"> </span><span class="o">{</span>
-<span class="w"> </span>virtx<span class="w"> </span>distutils-r1_src_test
-<span class="o">}</span>
-</pre></div>
-</div>
-<p>Note that <code class="docutils literal notranslate"><span class="pre">virtx</span></code> implicitly enables nonfatal mode. This means that
-e.g. <code class="docutils literal notranslate"><span class="pre">epytest</span></code> will no longer terminate the ebuild on failure, and you
-need to use <code class="docutils literal notranslate"><span class="pre">die</span></code> explicitly for it:</p>
-<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>src_test<span class="o">()</span><span class="w"> </span><span class="o">{</span>
-<span class="w"> </span>virtx<span class="w"> </span>distutils-r1_src_test
-<span class="o">}</span>
-
-python_test<span class="o">()</span><span class="w"> </span><span class="o">{</span>
-<span class="w"> </span>epytest<span class="w"> </span>-m<span class="w"> </span><span class="s2">&quot;not network&quot;</span><span class="w"> </span><span class="o">||</span><span class="w"> </span>die<span class="w"> </span><span class="s2">&quot;Tests failed with </span><span class="si">${</span><span class="nv">EPYTHON</span><span class="si">}</span><span class="s2">&quot;</span>
-<span class="o">}</span>
-</pre></div>
-</div>
-<div class="admonition warning">
-<p class="admonition-title">Warning</p>
-<p>Explicit <code class="docutils literal notranslate"><span class="pre">||</span> <span class="pre">die</span></code> is only necessary when overriding <code class="docutils literal notranslate"><span class="pre">python_test</span></code>
-and running <code class="docutils literal notranslate"><span class="pre">epytest</span></code> inside a <code class="docutils literal notranslate"><span class="pre">nonfatal</span></code>. The <code class="docutils literal notranslate"><span class="pre">virtx</span></code> command
-runs its arguments via a <code class="docutils literal notranslate"><span class="pre">nonfatal</span></code>. The default <code class="docutils literal notranslate"><span class="pre">python_test</span></code>
-implementation created by <code class="docutils literal notranslate"><span class="pre">distutils_enable_tests</span></code> accounts for
-this. In other contexts, <code class="docutils literal notranslate"><span class="pre">epytest</span></code> will die on its own.</p>
-</div>
-</section>
+<h2>Enabling tests<a class="headerlink" href="#enabling-tests" title="Permalink to this heading">¶</a></h2>
+<p>The support for test suites is now covered in the <a class="reference internal" href="test.html"><span class="doc">Tests in Python packages</span></a> chapter.</p>
</section>
<section id="building-documentation-via-sphinx">
-<span id="index-22"></span><h2>Building documentation via Sphinx<a class="headerlink" href="#building-documentation-via-sphinx" title="Permalink to this heading">¶</a></h2>
+<span id="index-19"></span><h2>Building documentation via Sphinx<a class="headerlink" href="#building-documentation-via-sphinx" title="Permalink to this heading">¶</a></h2>
<p><code class="docutils literal notranslate"><span class="pre">dev-python/sphinx</span></code> is commonly used to document Python packages.
It comes with a number of plugins and themes that make it convenient
to write and combine large text documents (such as this Guide!),
@@ -1091,10 +762,10 @@ If additional packages need to be installed, the previous variant
must be used instead.</p>
<p>The eclass tries to automatically determine whether <code class="docutils literal notranslate"><span class="pre">--no-autodoc</span></code>
should be used, and issue a warning if it’s missing or incorrect.</p>
-<span class="target" id="index-23"></span></section>
+<span class="target" id="index-20"></span></section>
</section>
<section id="packages-with-optional-python-build-system-usage">
-<span id="index-24"></span><h2>Packages with optional Python build system usage<a class="headerlink" href="#packages-with-optional-python-build-system-usage" title="Permalink to this heading">¶</a></h2>
+<span id="index-21"></span><h2>Packages with optional Python build system usage<a class="headerlink" href="#packages-with-optional-python-build-system-usage" title="Permalink to this heading">¶</a></h2>
<p>The eclass has been written with the assumption that the vast majority
of its consumers will be using the Python build systems unconditionally.
For this reason, it sets the ebuild metadata variables (dependencies,
@@ -1203,7 +874,7 @@ follows:</p>
</div>
</section>
<section id="packages-with-rust-extensions-using-cargo">
-<span id="index-25"></span><h2>Packages with Rust extensions (using Cargo)<a class="headerlink" href="#packages-with-rust-extensions-using-cargo" title="Permalink to this heading">¶</a></h2>
+<span id="index-22"></span><h2>Packages with Rust extensions (using Cargo)<a class="headerlink" href="#packages-with-rust-extensions-using-cargo" title="Permalink to this heading">¶</a></h2>
<p>Some Python build systems include support for writing extensions
in the Rust programming language. Two examples of these are setuptools
using <code class="docutils literal notranslate"><span class="pre">dev-python/setuptools_rust</span></code> plugin and Maturin. Normally,
@@ -1448,7 +1119,6 @@ python_install<span class="o">()</span><span class="w"> </span><span class="o">{
<li class="toctree-l2"><a class="reference internal" href="#dependencies">Dependencies</a></li>
<li class="toctree-l2"><a class="reference internal" href="#python-single-r1-variant">python-single-r1 variant</a></li>
<li class="toctree-l2"><a class="reference internal" href="#pep-517-build-systems">PEP 517 build systems</a></li>
-<li class="toctree-l2"><a class="reference internal" href="#deprecated-pep-517-backends">Deprecated PEP 517 backends</a></li>
<li class="toctree-l2"><a class="reference internal" href="#setuptools-scm-flit-scm-hatch-vcs-and-snapshots">setuptools_scm (flit_scm, hatch-vcs) and snapshots</a></li>
<li class="toctree-l2"><a class="reference internal" href="#packages-using-cython">Packages using Cython</a></li>
<li class="toctree-l2"><a class="reference internal" href="#parallel-build-race-conditions">Parallel build race conditions</a></li>
@@ -1462,10 +1132,10 @@ python_install<span class="o">()</span><span class="w"> </span><span class="o">{
<li class="toctree-l2"><a class="reference internal" href="#installing-packages-without-a-pep-517-build-backend">Installing packages without a PEP 517 build backend</a></li>
</ul>
</li>
+<li class="toctree-l1"><a class="reference internal" href="test.html">Tests in Python packages</a></li>
<li class="toctree-l1"><a class="reference internal" href="distutils-legacy.html">distutils-r1 legacy concepts</a></li>
<li class="toctree-l1"><a class="reference internal" href="helper.html">Common helper functions</a></li>
<li class="toctree-l1"><a class="reference internal" href="depend.html">Advanced dependencies</a></li>
-<li class="toctree-l1"><a class="reference internal" href="test.html">Resolving test suite problems</a></li>
<li class="toctree-l1"><a class="reference internal" href="pytest.html">pytest recipes</a></li>
<li class="toctree-l1"><a class="reference internal" href="concept.html">Advanced concepts</a></li>
<li class="toctree-l1"><a class="reference internal" href="expert-multi.html">Expert python-r1 usage</a></li>
@@ -1482,7 +1152,7 @@ python_install<span class="o">()</span><span class="w"> </span><span class="o">{
<ul>
<li><a href="index.html">Documentation overview</a><ul>
<li>Previous: <a href="multi.html" title="previous chapter">python-r1 — multi-impl packages</a></li>
- <li>Next: <a href="distutils-legacy.html" title="next chapter">distutils-r1 legacy concepts</a></li>
+ <li>Next: <a href="test.html" title="next chapter">Tests in Python packages</a></li>
</ul></li>
</ul>
</div>
diff --git a/guide/genindex.html b/guide/genindex.html
index cf3e6ef..e448a78 100644
--- a/guide/genindex.html
+++ b/guide/genindex.html
@@ -76,11 +76,11 @@
</li>
<li><a href="distutils.html#index-17">DISTUTILS_ARGS</a>
</li>
- <li><a href="distutils.html#index-23">DISTUTILS_DEPS</a>
+ <li><a href="distutils.html#index-20">DISTUTILS_DEPS</a>
</li>
- <li><a href="distutils.html#index-22">distutils_enable_sphinx</a>
+ <li><a href="distutils.html#index-19">distutils_enable_sphinx</a>
</li>
- <li><a href="distutils.html#index-19">distutils_enable_tests</a>
+ <li><a href="test.html#index-0">distutils_enable_tests</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
@@ -88,7 +88,7 @@
</li>
<li><a href="distutils-legacy.html#index-2">distutils_install_for_testing</a>
</li>
- <li><a href="distutils.html#index-24">DISTUTILS_OPTIONAL</a>
+ <li><a href="distutils.html#index-21">DISTUTILS_OPTIONAL</a>
</li>
<li><a href="distutils.html#index-0">DISTUTILS_SINGLE_IMPL</a>
</li>
@@ -104,7 +104,7 @@
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="migration.html#index-1">EAPI 8</a>
</li>
- <li><a href="distutils.html#index-20">epytest</a>
+ <li><a href="test.html#index-1">epytest</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
@@ -279,7 +279,7 @@
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="multi.html#index-2">run_in_build_dir</a>
</li>
- <li><a href="distutils.html#index-25">Rust</a>
+ <li><a href="distutils.html#index-22">Rust</a>
</li>
</ul></td>
</tr></table>
@@ -307,7 +307,7 @@
<h2 id="V">V</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
- <li><a href="distutils.html#index-21">virtx</a>
+ <li><a href="test.html#index-2">virtx</a>
</li>
</ul></td>
</tr></table>
@@ -340,10 +340,10 @@
<li class="toctree-l1"><a class="reference internal" href="single.html">python-single-r1 — single-impl packages</a></li>
<li class="toctree-l1"><a class="reference internal" href="multi.html">python-r1 — multi-impl packages</a></li>
<li class="toctree-l1"><a class="reference internal" href="distutils.html">distutils-r1 — standard Python build systems</a></li>
+<li class="toctree-l1"><a class="reference internal" href="test.html">Tests in Python packages</a></li>
<li class="toctree-l1"><a class="reference internal" href="distutils-legacy.html">distutils-r1 legacy concepts</a></li>
<li class="toctree-l1"><a class="reference internal" href="helper.html">Common helper functions</a></li>
<li class="toctree-l1"><a class="reference internal" href="depend.html">Advanced dependencies</a></li>
-<li class="toctree-l1"><a class="reference internal" href="test.html">Resolving test suite problems</a></li>
<li class="toctree-l1"><a class="reference internal" href="pytest.html">pytest recipes</a></li>
<li class="toctree-l1"><a class="reference internal" href="concept.html">Advanced concepts</a></li>
<li class="toctree-l1"><a class="reference internal" href="expert-multi.html">Expert python-r1 usage</a></li>
diff --git a/guide/index.html b/guide/index.html
index c252b8b..a93b1e4 100644
--- a/guide/index.html
+++ b/guide/index.html
@@ -100,7 +100,6 @@
<li class="toctree-l2"><a class="reference internal" href="distutils.html#dependencies">Dependencies</a></li>
<li class="toctree-l2"><a class="reference internal" href="distutils.html#python-single-r1-variant">python-single-r1 variant</a></li>
<li class="toctree-l2"><a class="reference internal" href="distutils.html#pep-517-build-systems">PEP 517 build systems</a></li>
-<li class="toctree-l2"><a class="reference internal" href="distutils.html#deprecated-pep-517-backends">Deprecated PEP 517 backends</a></li>
<li class="toctree-l2"><a class="reference internal" href="distutils.html#setuptools-scm-flit-scm-hatch-vcs-and-snapshots">setuptools_scm (flit_scm, hatch-vcs) and snapshots</a></li>
<li class="toctree-l2"><a class="reference internal" href="distutils.html#packages-using-cython">Packages using Cython</a></li>
<li class="toctree-l2"><a class="reference internal" href="distutils.html#parallel-build-race-conditions">Parallel build race conditions</a></li>
@@ -114,6 +113,20 @@
<li class="toctree-l2"><a class="reference internal" href="distutils.html#installing-packages-without-a-pep-517-build-backend">Installing packages without a PEP 517 build backend</a></li>
</ul>
</li>
+<li class="toctree-l1"><a class="reference internal" href="test.html">Tests in Python packages</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="test.html#why-is-running-tests-important">Why is running tests important?</a></li>
+<li class="toctree-l2"><a class="reference internal" href="test.html#using-distutils-enable-tests">Using distutils_enable_tests</a></li>
+<li class="toctree-l2"><a class="reference internal" href="test.html#choosing-the-correct-test-runner">Choosing the correct test runner</a></li>
+<li class="toctree-l2"><a class="reference internal" href="test.html#undesirable-test-dependencies">Undesirable test dependencies</a></li>
+<li class="toctree-l2"><a class="reference internal" href="test.html#missing-test-files-in-pypi-packages">Missing test files in PyPI packages</a></li>
+<li class="toctree-l2"><a class="reference internal" href="test.html#importerrors-for-c-extensions">ImportErrors for C extensions</a></li>
+<li class="toctree-l2"><a class="reference internal" href="test.html#checklist-for-dealing-with-test-failures">Checklist for dealing with test failures</a></li>
+<li class="toctree-l2"><a class="reference internal" href="test.html#skipping-problematic-tests">Skipping problematic tests</a></li>
+<li class="toctree-l2"><a class="reference internal" href="test.html#tests-requiring-internet-access">Tests requiring Internet access</a></li>
+<li class="toctree-l2"><a class="reference internal" href="test.html#tests-aborting-due-to-assertions">Tests aborting (due to assertions)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="test.html#installing-extra-dependencies-in-test-environment-pep-517-mode">Installing extra dependencies in test environment (PEP 517 mode)</a></li>
+</ul>
+</li>
<li class="toctree-l1"><a class="reference internal" href="distutils-legacy.html">distutils-r1 legacy concepts</a><ul>
<li class="toctree-l2"><a class="reference internal" href="distutils-legacy.html#different-build-system-variations">Different build system variations</a></li>
<li class="toctree-l2"><a class="reference internal" href="distutils-legacy.html#in-source-vs-out-of-source-builds">In-source vs out-of-source builds</a></li>
@@ -134,17 +147,6 @@
<li class="toctree-l2"><a class="reference internal" href="depend.html#optional-test-suite-dependencies-on-rust-packages">Optional test suite dependencies on Rust packages</a></li>
</ul>
</li>
-<li class="toctree-l1"><a class="reference internal" href="test.html">Resolving test suite problems</a><ul>
-<li class="toctree-l2"><a class="reference internal" href="test.html#choosing-the-correct-test-runner">Choosing the correct test runner</a></li>
-<li class="toctree-l2"><a class="reference internal" href="test.html#missing-test-files-in-pypi-packages">Missing test files in PyPI packages</a></li>
-<li class="toctree-l2"><a class="reference internal" href="test.html#importerrors-for-c-extensions">ImportErrors for C extensions</a></li>
-<li class="toctree-l2"><a class="reference internal" href="test.html#checklist-for-dealing-with-test-failures">Checklist for dealing with test failures</a></li>
-<li class="toctree-l2"><a class="reference internal" href="test.html#skipping-problematic-tests">Skipping problematic tests</a></li>
-<li class="toctree-l2"><a class="reference internal" href="test.html#tests-requiring-internet-access">Tests requiring Internet access</a></li>
-<li class="toctree-l2"><a class="reference internal" href="test.html#tests-aborting-due-to-assertions">Tests aborting (due to assertions)</a></li>
-<li class="toctree-l2"><a class="reference internal" href="test.html#installing-extra-dependencies-in-test-environment-pep-517-mode">Installing extra dependencies in test environment (PEP 517 mode)</a></li>
-</ul>
-</li>
<li class="toctree-l1"><a class="reference internal" href="pytest.html">pytest recipes</a><ul>
<li class="toctree-l2"><a class="reference internal" href="pytest.html#skipping-tests-based-on-markers">Skipping tests based on markers</a></li>
<li class="toctree-l2"><a class="reference internal" href="pytest.html#skipping-tests-based-on-paths-names">Skipping tests based on paths/names</a></li>
@@ -195,6 +197,7 @@
<li class="toctree-l2"><a class="reference internal" href="qawarn.html#improved-qa-warning-reporting-in-portage">Improved QA warning reporting in Portage</a></li>
<li class="toctree-l2"><a class="reference internal" href="qawarn.html#compiled-bytecode-related-warnings">Compiled bytecode-related warnings</a></li>
<li class="toctree-l2"><a class="reference internal" href="qawarn.html#stray-top-level-files-in-site-packages">Stray top-level files in site-packages</a></li>
+<li class="toctree-l2"><a class="reference internal" href="qawarn.html#deprecated-pep-517-backends">Deprecated PEP 517 backends</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="package-maintenance.html">Python package maintenance</a><ul>
@@ -253,10 +256,10 @@
<li class="toctree-l1"><a class="reference internal" href="single.html">python-single-r1 — single-impl packages</a></li>
<li class="toctree-l1"><a class="reference internal" href="multi.html">python-r1 — multi-impl packages</a></li>
<li class="toctree-l1"><a class="reference internal" href="distutils.html">distutils-r1 — standard Python build systems</a></li>
+<li class="toctree-l1"><a class="reference internal" href="test.html">Tests in Python packages</a></li>
<li class="toctree-l1"><a class="reference internal" href="distutils-legacy.html">distutils-r1 legacy concepts</a></li>
<li class="toctree-l1"><a class="reference internal" href="helper.html">Common helper functions</a></li>
<li class="toctree-l1"><a class="reference internal" href="depend.html">Advanced dependencies</a></li>
-<li class="toctree-l1"><a class="reference internal" href="test.html">Resolving test suite problems</a></li>
<li class="toctree-l1"><a class="reference internal" href="pytest.html">pytest recipes</a></li>
<li class="toctree-l1"><a class="reference internal" href="concept.html">Advanced concepts</a></li>
<li class="toctree-l1"><a class="reference internal" href="expert-multi.html">Expert python-r1 usage</a></li>
diff --git a/guide/objects.inv b/guide/objects.inv
index 3083903..9fa4f7d 100644
--- a/guide/objects.inv
+++ b/guide/objects.inv
Binary files differ
diff --git a/guide/qawarn.html b/guide/qawarn.html
index 5e67ad8..d57f1d0 100644
--- a/guide/qawarn.html
+++ b/guide/qawarn.html
@@ -249,6 +249,72 @@ entry:</p>
<p>For reference, see <a class="reference external" href="https://python-poetry.org/docs/pyproject/#include-and-exclude">include and exclude in Poetry documentation</a>.</p>
</section>
</section>
+<section id="deprecated-pep-517-backends">
+<h2>Deprecated PEP 517 backends<a class="headerlink" href="#deprecated-pep-517-backends" title="Permalink to this heading">¶</a></h2>
+<section id="flit-buildapi">
+<h3>flit.buildapi<a class="headerlink" href="#flit-buildapi" title="Permalink to this heading">¶</a></h3>
+<p>Some packages are still found using the historical flit build backend.
+Their <code class="docutils literal notranslate"><span class="pre">pyproject.toml</span></code> files contain a section similar
+to the following:</p>
+<div class="highlight-toml notranslate"><div class="highlight"><pre><span></span><span class="k">[build-system]</span>
+<span class="n">requires</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="s">&quot;flit&quot;</span><span class="p">]</span>
+<span class="n">build-backend</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;flit.buildapi&quot;</span>
+</pre></div>
+</div>
+<p>This backend requires installing the complete flit package manager.
+Instead, the package should be fixed upstream to use flit_core
+per <a class="reference external" href="https://flit.readthedocs.io/en/latest/pyproject_toml.html#build-system-section">flit build system section documentation</a> instead:</p>
+<div class="highlight-toml notranslate"><div class="highlight"><pre><span></span><span class="k">[build-system]</span>
+<span class="n">requires</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="s">&quot;flit_core&quot;</span><span class="p">]</span>
+<span class="n">build-backend</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;flit_core.buildapi&quot;</span>
+</pre></div>
+</div>
+<p>flit_core produces identical artifacts to flit. At the same time, it
+reduces the build-time dependency footprint and therefore makes isolated
+PEP 517 builds faster.</p>
+</section>
+<section id="poetry-masonry-api">
+<h3>poetry.masonry.api<a class="headerlink" href="#poetry-masonry-api" title="Permalink to this heading">¶</a></h3>
+<p>A similar problem applies to the packages using poetry. The respective
+<code class="docutils literal notranslate"><span class="pre">pyproject.toml</span></code> files contain:</p>
+<div class="highlight-toml notranslate"><div class="highlight"><pre><span></span><span class="k">[build-system]</span>
+<span class="n">requires</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="s">&quot;poetry&gt;=0.12&quot;</span><span class="p">]</span>
+<span class="n">build-backend</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;poetry.masonry.api&quot;</span>
+</pre></div>
+</div>
+<p>Instead, the lightweight poetry-core module should be used per <a class="reference external" href="https://python-poetry.org/docs/pyproject/#poetry-and-pep-517">poetry
+PEP-517 documentation</a>:</p>
+<div class="highlight-toml notranslate"><div class="highlight"><pre><span></span><span class="k">[build-system]</span>
+<span class="n">requires</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="s">&quot;poetry_core&gt;=1.0.0&quot;</span><span class="p">]</span>
+<span class="n">build-backend</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;poetry.core.masonry.api&quot;</span>
+</pre></div>
+</div>
+<p>poetry-core produces identical artifacts to poetry. It has smaller
+dependency footprint and makes isolated builds much faster.</p>
+</section>
+<section id="setuptools-build-meta-legacy">
+<h3>setuptools.build_meta:__legacy__<a class="headerlink" href="#setuptools-build-meta-legacy" title="Permalink to this heading">¶</a></h3>
+<p>Some packages using setuptools specify the following:</p>
+<div class="highlight-toml notranslate"><div class="highlight"><pre><span></span><span class="k">[build-system]</span>
+<span class="n">requires</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="s">&quot;setuptools&gt;=40.8.0&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;wheel&quot;</span><span class="p">]</span>
+<span class="n">build-backend</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;setuptools.build_meta:__legacy__&quot;</span>
+</pre></div>
+</div>
+<p>This is incorrect, as the legacy backend is intended to be used only
+as an implicit fallback. All packages should be using the regular
+backend instead:</p>
+<div class="highlight-toml notranslate"><div class="highlight"><pre><span></span><span class="k">[build-system]</span>
+<span class="n">requires</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="s">&quot;setuptools&gt;=40.8.0&quot;</span><span class="p">]</span>
+<span class="n">build-backend</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;setuptools.build_meta&quot;</span>
+</pre></div>
+</div>
+<p>Please also note that the <code class="docutils literal notranslate"><span class="pre">wheel</span></code> package should <em>not</em> be listed
+as a dependency, as it is an implementation detail and it was always
+implicitly returned by the backend. Unfortunately, due to prolonged
+documentation error, a very large number of packages still specifies it,
+and other packages tend to copy that mistake.</p>
+</section>
+</section>
</section>
@@ -278,10 +344,10 @@ entry:</p>
<li class="toctree-l1"><a class="reference internal" href="single.html">python-single-r1 — single-impl packages</a></li>
<li class="toctree-l1"><a class="reference internal" href="multi.html">python-r1 — multi-impl packages</a></li>
<li class="toctree-l1"><a class="reference internal" href="distutils.html">distutils-r1 — standard Python build systems</a></li>
+<li class="toctree-l1"><a class="reference internal" href="test.html">Tests in Python packages</a></li>
<li class="toctree-l1"><a class="reference internal" href="distutils-legacy.html">distutils-r1 legacy concepts</a></li>
<li class="toctree-l1"><a class="reference internal" href="helper.html">Common helper functions</a></li>
<li class="toctree-l1"><a class="reference internal" href="depend.html">Advanced dependencies</a></li>
-<li class="toctree-l1"><a class="reference internal" href="test.html">Resolving test suite problems</a></li>
<li class="toctree-l1"><a class="reference internal" href="pytest.html">pytest recipes</a></li>
<li class="toctree-l1"><a class="reference internal" href="concept.html">Advanced concepts</a></li>
<li class="toctree-l1"><a class="reference internal" href="expert-multi.html">Expert python-r1 usage</a></li>
@@ -292,6 +358,7 @@ entry:</p>
<li class="toctree-l2"><a class="reference internal" href="#improved-qa-warning-reporting-in-portage">Improved QA warning reporting in Portage</a></li>
<li class="toctree-l2"><a class="reference internal" href="#compiled-bytecode-related-warnings">Compiled bytecode-related warnings</a></li>
<li class="toctree-l2"><a class="reference internal" href="#stray-top-level-files-in-site-packages">Stray top-level files in site-packages</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#deprecated-pep-517-backends">Deprecated PEP 517 backends</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="package-maintenance.html">Python package maintenance</a></li>
diff --git a/guide/search.html b/guide/search.html
index 0038101..8ddc958 100644
--- a/guide/search.html
+++ b/guide/search.html
@@ -92,10 +92,10 @@
<li class="toctree-l1"><a class="reference internal" href="single.html">python-single-r1 — single-impl packages</a></li>
<li class="toctree-l1"><a class="reference internal" href="multi.html">python-r1 — multi-impl packages</a></li>
<li class="toctree-l1"><a class="reference internal" href="distutils.html">distutils-r1 — standard Python build systems</a></li>
+<li class="toctree-l1"><a class="reference internal" href="test.html">Tests in Python packages</a></li>
<li class="toctree-l1"><a class="reference internal" href="distutils-legacy.html">distutils-r1 legacy concepts</a></li>
<li class="toctree-l1"><a class="reference internal" href="helper.html">Common helper functions</a></li>
<li class="toctree-l1"><a class="reference internal" href="depend.html">Advanced dependencies</a></li>
-<li class="toctree-l1"><a class="reference internal" href="test.html">Resolving test suite problems</a></li>
<li class="toctree-l1"><a class="reference internal" href="pytest.html">pytest recipes</a></li>
<li class="toctree-l1"><a class="reference internal" href="concept.html">Advanced concepts</a></li>
<li class="toctree-l1"><a class="reference internal" href="expert-multi.html">Expert python-r1 usage</a></li>
diff --git a/guide/searchindex.js b/guide/searchindex.js
index 0f249d4..10f840a 100644
--- a/guide/searchindex.js
+++ b/guide/searchindex.js
@@ -1 +1 @@
-Search.setIndex({"docnames": ["any", "basic", "buildsys", "concept", "depend", "distutils", "distutils-legacy", "eclass", "expert-multi", "helper", "index", "interpreter", "interpreter-maintenance", "migration", "multi", "package-maintenance", "porting", "preface", "pytest", "qawarn", "single", "test"], "filenames": ["any.rst", "basic.rst", "buildsys.rst", "concept.rst", "depend.rst", "distutils.rst", "distutils-legacy.rst", "eclass.rst", "expert-multi.rst", "helper.rst", "index.rst", "interpreter.rst", "interpreter-maintenance.rst", "migration.rst", "multi.rst", "package-maintenance.rst", "porting.rst", "preface.rst", "pytest.rst", "qawarn.rst", "single.rst", "test.rst"], "titles": ["python-any-r1 \u2014 build-time dependency", "Common basics", "Integration with build systems written in Python", "Advanced concepts", "Advanced dependencies", "distutils-r1 \u2014 standard Python build systems", "distutils-r1 legacy concepts", "Choosing between Python eclasses", "Expert python-r1 usage", "Common helper functions", "Gentoo Python Guide", "Python interpreters", "Maintenance of Python implementations", "Migration guides", "python-r1 \u2014 multi-impl packages", "Python package maintenance", "Porting tips", "Preface", "pytest recipes", "QA checks and warnings", "python-single-r1 \u2014 single-impl packages", "Resolving test suite problems"], "terms": {"The": [0, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21], "eclass": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 13, 14, 17, 18, 20, 21], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "enabl": [0, 4, 6, 7, 8, 10, 11, 12, 14, 15, 18, 19], "support": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 13, 14, 16, 17, 18, 19, 20, 21], "packag": [0, 8, 9, 10, 11, 13, 17, 18], "need": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21], "pure": [0, 5, 6, 7, 8, 10, 11, 15], "refer": [0, 1, 5, 9, 11, 13, 14, 17, 19, 20], "5": [0, 2, 5, 7, 8, 9, 11, 14, 15, 16, 18, 20, 21], "defin": [0, 1, 5, 6, 11, 20], "featur": [0, 4, 5, 6, 7, 8, 11, 12, 13, 19, 20, 21], "thi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "pkg_setup": [0, 1, 2, 8, 20], "phase": [0, 1, 3, 6, 7, 8, 9, 10, 13, 14, 15, 19, 20, 21], "It": [0, 1, 3, 4, 5, 6, 9, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21], "normal": [0, 3, 5, 8, 9, 14, 15, 16, 19, 20], "call": [0, 1, 2, 3, 6, 7, 8, 9, 10, 11, 13, 14, 16, 18, 19, 20, 21], "python_setup": [0, 1, 2, 10, 13, 14, 20], "function": [0, 1, 4, 6, 7, 8, 10, 11, 13, 14, 16, 19, 20, 21], "order": [0, 1, 2, 4, 5, 7, 9, 12, 13, 14, 15, 20], "find": [0, 2, 3, 4, 6, 14, 15, 18, 19, 21], "suitabl": [0, 7, 9, 14, 17], "interpret": [0, 1, 2, 5, 6, 7, 9, 10, 13, 14, 15, 16, 18, 19, 20], "global": [0, 1, 5, 8, 13, 14, 18, 20], "environ": [0, 5, 6, 10, 11, 13, 14, 16, 18, 20], "appropri": [0, 2, 4, 5, 6, 7, 9, 11, 12, 15, 20], "mean": [0, 1, 2, 5, 7, 8, 11, 15, 16, 18, 20, 21], "most": [0, 3, 5, 6, 9, 11, 12, 13, 14, 15, 17, 18, 19, 20, 21], "trivial": [0, 5, 12, 16, 20], "an": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 19, 20, 21], "autotool": [0, 5, 6, 10, 16, 20], "compat": [0, 1, 2, 4, 5, 6, 7, 9, 11, 13, 16, 20], "system": [0, 3, 7, 8, 9, 10, 13, 14, 15, 17, 19, 20, 21], "could": [0, 2, 3, 5, 6, 8, 9, 15, 16, 19, 20], "look": [0, 1, 6, 8, 16, 18, 19, 20, 21], "like": [0, 2, 4, 5, 6, 8, 11, 15, 16, 19, 20, 21], "follow": [0, 1, 3, 4, 5, 6, 8, 9, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21], "copyright": [0, 2, 4, 5, 6, 8, 14, 20], "1999": [0, 2, 4, 5, 6, 8, 14, 20], "2020": [0, 2, 4, 5, 6, 8, 13, 14, 16, 20], "gentoo": [0, 1, 2, 4, 5, 6, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21], "author": [0, 2, 4, 5, 6, 8, 9, 10, 12, 14, 19, 20], "distribut": [0, 2, 4, 5, 6, 8, 14, 15, 16, 17, 19, 20, 21], "under": [0, 1, 2, 3, 4, 5, 6, 8, 14, 20], "term": [0, 2, 4, 5, 6, 8, 14, 20], "gnu": [0, 2, 4, 5, 6, 8, 14, 20], "gener": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 18, 19, 20, 21], "public": [0, 2, 4, 5, 6, 8, 11, 14, 20], "licens": [0, 2, 4, 5, 6, 8, 10, 14, 19, 20], "v2": [0, 2, 4, 5, 6, 8, 14, 20], "eapi": [0, 2, 4, 5, 6, 8, 10, 14, 20], "7": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 14, 15, 16, 18, 19, 20, 21], "python_compat": [0, 2, 4, 5, 6, 8, 10, 11, 12, 14, 15, 20], "python3_": [0, 1, 2, 4, 5, 6, 8, 12, 20], "6": [0, 1, 2, 4, 5, 6, 8, 11, 12, 14, 15, 16, 18, 20, 21], "8": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 15, 20, 21], "inherit": [0, 1, 2, 4, 5, 6, 7, 8, 9, 13, 14, 16, 18, 20], "descript": [0, 2, 4, 5, 6, 8, 14, 20], "A": [0, 1, 2, 4, 5, 6, 7, 8, 10, 11, 15, 18], "repositori": [0, 5, 6, 12, 15, 19], "data": [0, 2, 5, 6, 9, 16, 20, 21], "file": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 20], "describ": [0, 5, 6, 8, 9, 15, 19], "media": [0, 2, 8], "player": [0, 4], "capabl": 0, "homepag": [0, 2, 4, 5, 6, 8, 14, 15, 20], "http": [0, 2, 4, 5, 6, 8, 9, 12, 14, 16, 19, 20, 21], "cgit": 0, "freedesktop": 0, "org": [0, 2, 4, 5, 6, 8, 9, 12, 14, 19, 20], "info": [0, 5, 6, 18], "src_uri": [0, 2, 4, 5, 6, 8, 14, 15, 20, 21], "www": [0, 2, 8, 14, 20], "softwar": [0, 1, 4, 8, 14, 15, 16, 21], "pn": [0, 2, 4, 5, 6, 8, 9, 14, 20, 21], "p": [0, 2, 4, 5, 6, 8, 14, 18, 20, 21], "tar": [0, 2, 4, 5, 6, 8, 12, 14, 20, 21], "gz": [0, 2, 4, 5, 6, 8, 14, 20, 21], "bsd": [0, 2, 5, 6, 8, 14, 20], "slot": [0, 2, 4, 5, 6, 8, 11, 14, 20], "0": [0, 2, 4, 5, 6, 8, 10, 11, 12, 14, 15, 16, 18, 20, 21], "keyword": [0, 2, 4, 5, 6, 8, 10, 14, 16, 20], "alpha": [0, 2, 4, 5, 6, 8, 11, 14, 20], "amd64": [0, 2, 4, 5, 6, 8, 12, 14, 20], "arm": [0, 2, 4, 5, 6, 8, 20], "arm64": [0, 2, 4, 5, 6, 8, 14, 20], "hppa": [0, 2, 4, 5, 6, 8, 14, 20], "ia64": [0, 2, 4, 5, 6, 8, 14, 20], "mip": [0, 2, 4, 5, 6, 8, 20], "ppc": [0, 2, 4, 5, 6, 8, 14, 20], "ppc64": [0, 2, 4, 5, 6, 8, 14, 20], "sh": [0, 2, 4, 5, 6, 8, 12, 20], "sparc": [0, 2, 4, 5, 6, 8, 14, 20], "x86": [0, 2, 4, 5, 6, 8, 12, 14, 20], "ius": [0, 2, 4, 5, 8, 14, 20], "rdepend": [0, 1, 2, 4, 5, 6, 8, 13, 14, 20], "virtual": [0, 2, 8, 14], "udev": 0, "208": 0, "bdepend": [0, 1, 2, 4, 5, 6, 8, 12, 14, 18, 20], "python_dep": [0, 2, 4, 5, 8, 10, 14, 20], "pkgconfig": [0, 2, 8, 14], "ebuild": [0, 1, 4, 5, 6, 7, 9, 11, 12, 13, 14, 15, 16, 17, 19, 20, 21], "demonstr": [0, 5, 20], "absolut": [0, 1, 9, 15, 20, 21], "minimum": [0, 15, 20], "work": [0, 3, 5, 6, 7, 8, 9, 11, 12, 13, 15, 16, 18, 20, 21], "code": [0, 1, 3, 5, 6, 7, 8, 9, 11, 13, 14, 16, 18, 19, 20, 21], "onli": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 14, 15, 16, 18, 19, 20, 21], "three": [0, 1, 3, 9, 13, 16, 19], "highlight": [0, 16, 20], "line": [0, 3, 5, 13, 15, 16, 20, 21], "ar": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21], "specif": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 18, 19, 20, 21], "plu": [0, 20], "implicitli": [0, 3, 5, 8, 12, 20], "export": [0, 1, 2, 5, 20], "when": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21], "other": [0, 1, 2, 3, 4, 5, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 20, 21], "declar": [0, 1, 2, 5, 6, 8, 9, 11, 14, 18, 20], "ensur": [0, 1, 4, 5, 6, 9, 12, 14, 19, 20], "would": [0, 2, 4, 5, 7, 11, 12, 14, 15, 16, 20, 21], "built": [0, 1, 3, 5, 6, 7, 8, 11, 12, 14, 16, 17, 20, 21], "against": [0, 4, 7, 9, 11, 12, 14, 15, 20, 21], "implement": [0, 1, 3, 4, 5, 6, 7, 10, 14, 16, 17, 18, 19, 20, 21], "specifi": [0, 1, 2, 5, 6, 7, 8, 14, 15, 18, 19, 20, 21], "get": [0, 5, 6, 12, 13, 18, 21], "replac": [0, 5, 6, 10, 11, 13, 15], "python_gen_any_dep": [0, 2, 8], "match": [0, 2, 4, 5, 6, 8, 9, 11, 12, 15, 19, 20], "python_check_dep": [0, 2, 8], "accept": [0, 1, 4, 5, 6, 9, 12, 15, 16, 18, 19], "templat": [0, 2, 4, 5, 15, 19, 20], "where": [0, 3, 5, 6, 9, 11, 12, 14, 16, 20, 21], "liter": [0, 4, 20], "python_usedep": [0, 2, 4, 5, 8, 10, 12, 14, 15, 18, 20], "substitut": [0, 4, 20], "requir": [0, 1, 2, 3, 4, 5, 7, 8, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20], "all": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21], "same": [0, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 21], "least": [0, 5, 8, 15, 19, 21], "one": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 16, 17, 18, 19, 20, 21], "test": [0, 1, 2, 3, 7, 8, 10, 11, 12, 13, 16, 17, 20], "whether": [0, 1, 4, 5, 6, 7, 15, 18, 20, 21], "question": [0, 1, 5, 7, 14, 18, 21], "In": [0, 1, 2, 3, 4, 5, 7, 8, 10, 11, 12, 14, 15, 16, 18, 19, 20, 21], "particular": [0, 1, 4, 5, 6, 11, 15, 21], "verifi": [0, 1, 5, 6, 8, 13, 19, 21], "branch": [0, 11, 16, 21], "wa": [0, 4, 5, 11, 12, 13, 16, 18, 21], "satisfi": [0, 1, 8, 12], "were": [0, 2, 3, 5, 8, 11, 12, 13, 16, 19], "instal": [0, 1, 3, 4, 7, 8, 10, 11, 12, 13, 16, 18], "current": [0, 5, 6, 11, 12, 13, 15, 18, 21], "For": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 18, 19, 21], "purpos": [0, 6, 9, 12, 14, 16, 20, 21], "variabl": [0, 1, 5, 6, 8, 13, 14, 16, 18, 20], "string": [0, 1, 4, 5, 8, 14, 16, 20], "best": [0, 5, 7, 12, 16, 17, 18], "explain": [0, 1, 6, 19], "exampl": [0, 4, 5, 6, 7, 8, 9, 11, 12, 15, 16, 17, 18, 20, 21], "meson": [0, 4, 5, 7, 10, 15], "manag": [0, 4, 5, 6, 8, 9, 19, 21], "cinnamon": 0, "fork": [0, 11, 12, 15, 21], "from": [0, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 14, 15, 16, 18, 19, 20, 21], "nautilu": 0, "develop": [0, 1, 7, 11, 15, 17, 18, 21], "linuxmint": 0, "com": [0, 2, 4, 5, 6, 8, 12, 14, 16, 21], "project": [0, 1, 5, 8, 9, 10, 14, 17, 18, 19], "html": [0, 5, 8, 19], "github": [0, 2, 4, 5, 6, 8, 12, 14, 17, 20, 21], "nemo": 0, "archiv": [0, 2, 4, 10, 20, 21], "pv": [0, 2, 4, 5, 8, 14, 20, 21], "gpl": [0, 2, 4, 8, 14, 20], "2": [0, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 20, 21], "lgpl": [0, 2, 5, 14, 20], "fdl": [0, 20], "1": [0, 2, 3, 4, 5, 6, 8, 9, 15, 18, 19, 20, 21], "dev": [0, 1, 2, 3, 4, 5, 6, 7, 8, 11, 12, 13, 14, 15, 18, 19, 20, 21], "polib": 0, "pygobject": [0, 14], "3": [0, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 20, 21], "python_has_vers": [0, 2, 8], "provid": [0, 1, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 21], "its": [0, 1, 2, 3, 5, 6, 7, 8, 11, 12, 15, 16, 18, 21], "both": [0, 1, 3, 4, 5, 6, 7, 8, 12, 13, 16, 17, 18, 19, 20, 21], "have": [0, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 14, 15, 16, 18, 19, 20, 21], "dep": [0, 5, 13, 18], "true": [0, 1, 2, 5, 6, 8, 12, 13, 16, 21], "them": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 15, 16, 18, 19, 20, 21], "while": [0, 2, 3, 4, 5, 6, 7, 8, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21], "which": [0, 6, 9, 10, 11, 14, 21], "wrapper": [0, 1, 5, 6, 9, 13, 14, 21], "help": [0, 15, 17, 21], "take": [0, 1, 2, 4, 5, 6, 7, 8, 9, 15, 16, 18, 21], "singl": [0, 1, 4, 6, 9, 10, 14, 15, 16, 18, 19, 21], "option": [0, 1, 3, 6, 8, 10, 13, 15, 18, 19, 20, 21], "class": [0, 1, 5, 16, 18], "flag": [0, 1, 5, 7, 8, 9, 10, 11, 12, 14, 15, 20, 21], "more": [0, 1, 3, 4, 7, 9, 11, 12, 13, 15, 16, 18, 19, 20, 21], "similarli": [0, 1, 5, 15], "has_vers": [0, 4, 12], "root": [0, 5, 6, 13, 20, 21], "can": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 19, 20, 21], "b": 0, "d": [0, 2, 3, 8, 9, 14, 18], "r": [0, 2, 5, 9, 16, 21], "idepend": 0, "pdepend": [0, 2, 8, 12], "pass": [0, 6, 8, 9, 10, 12, 13, 16, 18, 21], "assum": [0, 1, 4, 5, 6, 9, 13, 15, 20], "verbos": [0, 15, 19, 21], "print": [0, 3, 8, 14, 18, 21], "check": [0, 5, 6, 9, 10, 12, 13, 16, 17, 21], "perform": [0, 2, 5, 6, 11, 12, 14, 19, 20, 21], "result": [0, 5, 6, 8, 9, 12, 15, 16, 17, 18, 19, 21], "return": [0, 2, 5, 8, 16, 21], "success": 0, "found": [0, 1, 3, 5, 6, 9, 10, 11, 12, 15, 19, 21], "fals": [0, 2, 5, 8, 12, 15, 16], "otherwis": [0, 6, 7, 8, 9], "note": [0, 1, 4, 5, 6, 8, 9, 10, 11, 13, 14, 15, 16, 18, 19, 20, 21], "invoc": [0, 5, 18, 19], "chain": 0, "abov": [0, 1, 6, 8, 12, 13, 15, 19, 20, 21], "also": [0, 1, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 18, 19, 21], "written": [0, 1, 5, 7, 10, 11, 16, 18], "import": [0, 1, 3, 4, 5, 6, 7, 11, 12, 13, 14, 15, 16, 18, 21], "understand": 0, "correctli": [0, 1, 5, 6, 7, 9, 11, 12, 13, 15, 16, 21], "exactli": [0, 7], "furthermor": [0, 2, 5], "combin": [0, 2, 5, 10, 11, 12, 13, 16, 17, 18, 20, 21], "must": [0, 1, 2, 3, 5, 6, 7, 8, 11, 15, 16, 18, 20, 21], "onc": [0, 5, 8, 11, 12, 19], "invalid": [0, 16], "split": [0, 5, 13, 16], "some": [0, 1, 2, 3, 4, 5, 6, 7, 8, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21], "necessari": [0, 2, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15, 16, 18, 20, 21], "particularli": [0, 5, 6, 7, 11, 13, 15, 18, 21], "common": [0, 3, 5, 6, 7, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21], "suit": [0, 1, 2, 5, 6, 7, 8, 9, 10, 12, 18], "case": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21], "wrap": [0, 5, 6, 9, 13], "programm": [0, 15], "complet": [0, 5, 16, 17], "bash": [0, 5, 7, 8, 9, 20], "scop": 0, "releas": [0, 2, 5, 8, 11, 12, 14, 16, 19], "download": [0, 2, 5, 8, 14], "xz": [0, 4, 12, 14, 20], "s390": [0, 2, 4, 5, 6, 8, 20], "linux": [0, 2, 4, 5, 6, 8, 9, 14, 16, 20, 21], "maco": [0, 4, 5, 6, 8, 20], "x64": [0, 4, 5, 6, 8, 20], "m68k": [0, 4, 5, 6, 8, 20], "mint": 0, "solari": [0, 5, 6, 20], "sparc64": [0, 6], "restrict": [0, 2, 4, 5, 10, 18, 19, 20, 21], "app": [0, 2, 4, 5, 8, 12, 14, 15, 19], "shell": [0, 5, 8, 14], "4": [0, 3, 5, 8, 9, 10, 11, 12, 14, 15, 21], "3_p30": 0, "pexpect": [0, 5], "pytest": [0, 4, 8, 10, 12, 15, 21], "r1_pkg_setup": [0, 2, 20], "anoth": [0, 8, 9, 14, 15, 16, 18, 19, 21], "possibl": [0, 2, 4, 5, 8, 9, 12, 14, 16, 17, 18, 21], "uncondition": [0, 1, 2, 4, 5, 6, 8, 11, 19, 20, 21], "condition": [0, 1, 2, 4, 5, 11, 12, 14, 15, 18, 20], "simplest": [0, 2, 5, 7, 14, 18, 21], "wai": [0, 5, 6, 9, 12, 13, 15, 18, 21], "achiev": [0, 8, 11, 16], "block": [0, 8, 13, 21], "express": [0, 8, 13, 20], "similar": [0, 2, 5, 14, 15, 20, 21], "cmake": [0, 5, 6, 20], "qt": 0, "bind": [0, 2, 5, 8, 14, 20], "telepathi": 0, "bu": 0, "protocol": [0, 2, 20], "dbu": [0, 2], "hardest": 0, "differ": [0, 1, 3, 5, 9, 10, 11, 15, 16, 18, 21], "do": [0, 1, 3, 4, 5, 6, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21], "error": [0, 2, 5, 9, 12, 13, 16, 18, 19, 21], "prone": 0, "move": [0, 4, 5, 12], "insid": [0, 1, 3, 5, 6, 9, 14, 18, 20], "python3_6": [0, 2, 4, 8, 14], "gnome2": [0, 4, 14], "gobject": 0, "librari": [0, 1, 2, 3, 4, 5, 8, 9, 11, 14, 20], "access": [0, 5, 10, 11, 18], "secret": 0, "servic": [0, 15, 21], "api": [0, 2, 9, 10, 11, 13, 14, 16], "wiki": [0, 4, 8, 9, 12, 14, 17], "gnome": [0, 4, 14], "libsecret": 0, "apach": [0, 2, 4, 5, 8], "introspect": 0, "fail": [0, 1, 2, 5, 8, 9, 11, 12, 16, 18, 21], "bug": [0, 5, 6, 12, 19, 21], "655482": 0, "required_us": [0, 1, 2, 4, 5, 7, 8, 13, 14, 20], "mock": [0, 4, 8, 11, 12, 18, 21], "fi": [0, 2, 4, 5, 8, 12, 14, 20], "host": 0, "variou": [1, 5, 6, 9, 13, 16], "r1": [1, 3, 4, 9, 10, 12, 15, 19, 21], "try": [1, 6, 8, 9, 11, 16, 21], "design": [1, 20], "you": [1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21], "probabl": [1, 6, 8, 13, 20], "us": [1, 9, 10, 11, 12, 13, 15, 16, 19, 21], "than": [1, 2, 3, 6, 7, 8, 11, 12, 15, 16, 17, 18, 19, 21], "so": [1, 4, 5, 6, 11, 15, 18, 20, 21], "worthwhil": [1, 21], "shortli": 1, "bit": [1, 12, 17], "well": [1, 5, 7, 8, 11, 13, 15, 19], "non": [1, 6, 7, 9, 12, 14, 16, 18, 21], "obviou": [1, 21], "between": [1, 5, 8, 10, 11, 13, 16], "befor": [1, 4, 8, 9, 10, 12, 14, 16, 21], "thei": [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21], "valid": [1, 5, 8, 15, 16, 19, 21], "valu": [1, 5, 6, 9, 13, 18], "pythonx_i": 1, "cpython": [1, 4, 5, 9, 11, 13, 19], "x": [1, 5, 11, 16, 18, 21], "y": [1, 2, 11, 16], "pypy3": [1, 4, 5, 6, 8, 11, 12, 13, 15, 18, 19], "typic": [1, 14], "ani": [1, 2, 3, 5, 6, 7, 10, 14, 16, 18, 19, 21], "respons": [1, 5], "explicitli": [1, 5, 7, 8, 10, 13, 19, 21], "put": [1, 8], "correct": [1, 5, 6, 7, 9, 10, 15, 18, 19, 20], "meant": [1, 13, 19], "consist": [1, 6, 9, 13, 14, 15], "cover": [1, 5, 6, 13], "time": [1, 3, 4, 5, 6, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 21], "runtim": [1, 2, 3, 5, 8, 10, 13, 14, 15], "form": [1, 4, 12, 17], "doe": [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 14, 15, 16, 18, 19, 21], "appli": [1, 4, 5, 6, 7, 12, 15, 18, 19, 20, 21], "distutil": [1, 3, 4, 9, 10, 13, 14, 18, 19, 20, 21], "assign": 1, "default": [1, 2, 5, 6, 7, 8, 9, 11, 13, 14, 15, 18, 19, 20, 21], "commonli": [1, 2, 3, 5, 6, 9, 11], "concept": [1, 5, 10], "state": 1, "enforc": [1, 4, 5, 7, 8, 11, 18], "whenev": [1, 4, 5, 9, 11, 14, 15, 18, 20], "run": [1, 2, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 19, 21], "two": [1, 5, 6, 8, 9, 11, 13, 16, 18, 19, 20], "being": [1, 3, 5, 6, 8, 9, 11, 12, 15, 16, 18, 21], "epython": [1, 2, 5, 8, 9, 12, 13, 18, 21], "contain": [1, 3, 4, 5, 6, 7, 12, 13, 15, 19], "": [1, 2, 4, 5, 6, 7, 8, 9, 13, 14, 15, 16, 18, 19, 20, 21], "basenam": 1, "identifi": 1, "e": [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21], "g": [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21], "python3": [1, 3, 5, 9, 11, 13, 15, 16, 18, 19, 21], "10": [1, 4, 5, 8, 10, 11, 12, 15, 19], "final": [1, 2, 4, 5, 9, 11, 13, 16, 20, 21], "path": [1, 3, 5, 6, 9, 10, 12, 13, 16, 19, 21], "usr": [1, 2, 3, 5, 7, 8, 9, 18, 19, 21], "bin": [1, 2, 5, 7, 8, 9, 12, 20, 21], "full": [1, 2, 4, 5, 13, 21], "should": [1, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "embed": [1, 2, 9, 11], "program": [1, 2, 5, 6, 11, 16, 18], "shebang": [1, 10, 11, 21], "spawn": 1, "dure": [1, 5, 6, 7, 12, 13, 18, 19], "prefer": [1, 4, 5, 7, 8, 11, 12, 14, 15, 18, 21], "rather": [1, 6, 8, 12, 15, 16, 17, 18, 19, 21], "bypass": 1, "virtualenv": [1, 5, 6, 12, 21], "creat": [1, 3, 4, 5, 6, 12, 13, 15, 16, 19], "pep": [1, 3, 6, 7, 10, 12, 15, 16], "517": [1, 3, 6, 7, 10, 12], "mode": [1, 3, 6, 7, 10, 13, 16, 19], "mai": [1, 3, 4, 5, 6, 8, 11, 12, 13, 15, 16, 18, 21], "caus": [1, 4, 5, 8, 9, 13, 15, 18, 19, 21], "failur": [1, 5, 10, 11, 12, 18], "modul": [1, 3, 4, 5, 6, 7, 8, 10, 11, 14, 15, 16, 18, 21], "previou": [1, 5, 12, 13, 16], "version": [1, 2, 3, 5, 6, 7, 8, 10, 12, 13, 16, 17, 18, 21], "just": [1, 5, 6, 11, 13, 21], "resolv": [1, 5, 6, 10, 16, 18], "problem": [1, 3, 4, 5, 6, 8, 10, 12, 15, 16, 17, 18, 19], "pythonn": 1, "tool": [1, 2, 5, 8, 14, 15, 16, 19, 21], "etc": 1, "via": [1, 2, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 18, 20, 21], "exec": [1, 8, 9, 11, 12, 21], "hardcod": [1, 12, 18], "either": [1, 2, 5, 8, 9, 11, 13, 18, 19, 21], "establish": [1, 5, 13, 21], "local": [1, 2, 3, 4, 5, 8, 9, 12, 13, 14, 18, 19, 20, 21], "scope": [1, 4, 5, 8, 13, 18], "multi": [1, 5, 10, 13, 20], "impl": [1, 5, 10, 13], "python_foreach_impl": [1, 2, 8, 14], "sub": [1, 3, 7, 8, 10, 21], "setup": [1, 3, 6, 7, 10, 13, 15, 18, 19, 21], "done": [1, 5, 6, 8, 9, 14, 15, 18, 21], "directli": [1, 5, 6, 7, 9, 11, 13, 16, 18, 21], "section": [1, 5, 6, 7, 12, 15, 16, 19, 21], "focu": [1, 7, 12, 14], "often": [1, 5, 12, 21], "extern": [1, 2, 5, 6, 7, 11, 12], "languag": [1, 2, 5, 11, 15], "usual": [1, 3, 4, 5, 7, 11, 13, 15, 16, 18, 19, 21], "rule": [1, 2, 6, 7, 8, 13, 14, 15], "classifi": [1, 6], "categori": [1, 15], "present": [1, 5, 6, 15, 19], "script": [1, 2, 5, 6, 7, 8, 10, 11, 12, 14, 16, 20], "usabl": [1, 11], "whose": [1, 5], "therefor": [1, 2, 5, 6, 7, 8, 11, 12, 15, 18, 19], "howev": [1, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 15, 16, 18, 19, 20, 21], "modern": [1, 4, 5, 6, 11, 12, 18, 21], "base": [1, 4, 5, 7, 8, 10, 12, 14, 15, 20, 21], "entri": [1, 5, 12, 18, 19], "point": [1, 5, 11, 13, 15, 18, 21], "refus": [1, 4, 11], "place": [1, 6, 11, 12, 19], "special": [1, 3, 4, 5, 6, 16, 21], "subclass": 1, "extra": [1, 5, 6, 10], "still": [1, 5, 6, 8, 11, 13, 16, 21], "meaningfulli": 1, "handl": [1, 4, 5, 6, 8, 13, 14, 15], "gracefulli": [1, 4, 8], "subset": [1, 4, 5, 7, 8, 11, 12, 14, 15, 19, 21], "without": [1, 4, 10, 11, 13, 14, 15, 18], "There": [1, 3, 5, 8, 9, 15, 16, 18, 19, 21], "multipl": [1, 3, 4, 5, 7, 10, 14, 15, 17, 18, 19, 21], "approach": [1, 5, 7, 8, 12, 16], "ad": [1, 7, 10, 11, 13, 14, 18], "consid": [1, 2, 3, 6, 7, 8, 11, 12, 14, 15, 16, 19], "light": 1, "enough": [1, 5, 11], "inform": [1, 3, 5, 6, 10, 13, 16, 19, 21], "messag": [1, 5, 21], "pkg_postinst": [1, 5], "util": [1, 2, 4, 5, 7, 8, 9, 12, 15, 18, 19, 20, 21], "optfeatur": 1, "cheap": 1, "rebuild": [1, 6, 11], "includ": [1, 2, 3, 4, 5, 6, 7, 9, 11, 12, 15, 16, 17, 18, 19, 20, 21], "__init__": [1, 3, 5, 9, 18, 19, 21], "py": [1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 18, 19, 21], "As": [1, 3, 5, 6, 7, 8, 11, 12, 13, 15, 16, 18, 20, 21], "thumb": [1, 6, 7, 13, 15], "belong": [1, 21], "care": [1, 2, 5, 7, 9, 15, 21], "addit": [1, 2, 4, 6, 8, 9, 10, 11, 12, 13, 15, 18, 21], "plugin": [1, 3, 5, 6, 8, 10, 21], "setuptools_scm": [1, 10], "document": [1, 2, 7, 8, 10, 11, 14, 17, 21], "former": [1, 5, 7, 8, 13, 16, 21], "runner": [1, 5, 7, 10], "sinc": [1, 2, 3, 5, 6, 7, 11, 12, 13, 15, 16, 18, 21], "sometim": [1, 4, 5, 6, 7, 9, 11, 18, 21], "These": [1, 6, 7, 11, 12, 13, 15, 18, 21], "go": [1, 2, 8, 17, 18], "doc": [1, 2, 5, 8, 20], "respect": [1, 3, 4, 5, 12, 14, 15, 18, 19], "maximum": [1, 5], "coverag": [1, 5, 15, 18], "further": [1, 18], "guid": [1, 3, 5, 16, 17, 19], "linter": 1, "report": [1, 6, 9, 10, 12, 15, 21], "actual": [1, 5, 6, 8, 9, 11, 12, 15, 18, 21], "undesir": [1, 18, 21], "again": [1, 2, 15, 21], "conveni": [1, 4, 5, 6, 7, 18, 19, 21], "add": [1, 2, 5, 6, 8, 12, 15, 19, 20, 21], "sphinx": [1, 3, 6, 7, 8, 10, 12, 15], "copi": [1, 3, 5, 6, 9, 11, 15, 20], "c": [1, 2, 5, 6, 8, 9, 10, 11, 14], "extens": [1, 6, 7, 8, 9, 10, 11, 14, 15, 16], "header": [1, 9], "numpi": [1, 2], "If": [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21], "metadata": [1, 5, 6, 14, 15, 20], "pyproject": [1, 5, 7, 12, 19], "toml": [1, 5, 7, 10, 12, 19], "setuptool": [1, 3, 4, 7, 8, 12, 13, 15, 18], "cfg": [1, 3, 5, 6, 15, 18, 19], "custom": [1, 2, 6, 10, 13, 15, 16, 18, 19], "read": [1, 5, 16], "name": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 16, 21], "uncondit": [1, 2, 5, 10, 13, 14, 15], "upstream": [1, 3, 4, 5, 6, 7, 9, 11, 12, 14, 15, 16, 18, 19, 21], "spuriou": 1, "strip": [1, 3, 5, 11, 15, 18, 21], "ommit": 1, "kei": [1, 5, 16, 18, 19, 20], "kind": [1, 3, 5, 7, 9, 11, 21], "621": 1, "older": [1, 11, 15], "flit": [1, 6, 12, 13], "poetri": [1, 6, 13], "indic": [1, 5, 6, 11, 12, 13, 15, 18, 19, 21], "install_requir": [1, 3, 5, 6], "group": [1, 2, 6, 13, 15, 18], "extras_requir": [1, 5], "setup_requir": [1, 5, 18], "deprec": [1, 3, 10, 11, 13], "tests_requir": [1, 5], "tox": [1, 5, 21], "ini": [1, 5, 18, 21], "noxfil": 1, "python_requir": 1, "besid": [2, 6, 11, 14, 18, 19], "few": [2, 4, 6, 12, 18, 21], "make": [2, 3, 4, 5, 6, 7, 11, 12, 13, 15, 16, 18, 19, 20, 21], "proper": [2, 8], "fairli": [2, 15, 20], "recent": [2, 3, 5, 15, 21], "agnost": 2, "henc": [2, 5, 14], "treat": [2, 18], "arbitrari": [2, 13], "ha": [2, 3, 5, 6, 7, 11, 12, 13, 14, 15, 16, 18, 19, 21], "gain": [2, 18], "quit": [2, 4, 6, 11, 12], "At": [2, 5, 11, 15, 17], "mani": [2, 5, 8, 12, 14, 15, 16, 19, 21], "old": [2, 4, 5, 6, 8, 10, 11, 12, 16, 21], "reason": [2, 4, 5, 6, 11, 18, 21], "suffici": [2, 5, 6, 7, 11, 14], "prior": [2, 3, 5, 6, 8, 11, 13, 16, 19, 21], "happen": [2, 3, 4, 6, 7, 8, 11, 20, 21], "natur": [2, 5, 8, 15], "sort": 2, "latter": [2, 5, 7, 8, 13, 15, 16, 18, 21], "set": [2, 4, 5, 6, 7, 10, 11, 12, 14, 15, 16, 18, 19, 20, 21], "much": [2, 5, 21], "compon": [2, 3, 8, 11, 14, 16], "account": [2, 5, 8, 11, 15, 21], "detail": [2, 5, 7, 9, 11, 13, 16, 21], "choic": [2, 6, 7, 13, 21], "chapter": [2, 8, 9], "along": [2, 5, 6, 7, 11, 12, 13, 19, 20, 21], "toolchain": [2, 4, 8], "func": [2, 8], "commit": [2, 21], "6e5e8a57628095d8d0c8bbb38187afb0f3a42112": 2, "userspac": 2, "xbox": 2, "360": 2, "control": [2, 4, 5, 18], "driver": 2, "xboxdrv": 2, "gitlab": [2, 8], "io": [2, 4, 5, 8, 14, 20], "chewi": 2, "workdir": [2, 5], "lib": [2, 3, 5, 7, 9, 16, 18, 19, 21], "boost": [2, 7], "glib": 2, "sy": [2, 5, 8, 11, 14, 15, 16, 21], "libudev": 2, "libusb": 2, "x11": 2, "libx11": 2, "src_compil": [2, 5, 6, 8, 14], "escon": 2, "cxx": 2, "tc": [2, 9], "getcxx": 2, "getar": 2, "ranlib": 2, "getranlib": 2, "cxxflag": 2, "wall": 2, "linkflag": 2, "ldflag": [2, 5], "src_instal": [2, 5, 8, 9, 14, 20], "dobin": [2, 9], "doman": 2, "dodoc": [2, 5], "new": [2, 5, 6, 9, 10, 11, 13, 16, 18], "readm": [2, 12, 19], "md": [2, 19], "todo": [2, 9, 12], "yourself": [2, 4, 21], "becaus": [2, 5, 6, 11, 15, 18, 19, 21], "cannot": [2, 4, 5, 9, 11, 21], "my_p": 2, "src": [2, 5, 9, 21], "_rc": 2, "rc": [2, 11], "high": [2, 4, 11, 12, 15, 20], "open": [2, 16], "sourc": [2, 3, 10, 12, 14, 17, 19, 21], "schema": [2, 15], "free": [2, 15, 21], "orient": [2, 16], "databas": [2, 4], "mongodb": [2, 4], "fastdl": 2, "sspl": 2, "acct": 2, "user": [2, 3, 5, 6, 7, 8, 11, 12, 15, 18, 20, 21], "arch": [2, 5, 8, 11, 12], "snappi": 2, "cpp": 2, "yaml": [2, 3], "70": 2, "thread": [2, 8, 18, 20, 21], "libpcr": 2, "42": 2, "zstd": 2, "snowbal": 2, "stemmer": 2, "net": [2, 8, 11, 14, 15, 20], "libpcap": 2, "zlib": 2, "11": [2, 5, 10, 12, 15, 21], "pymongo": 2, "cheetah3": 2, "psutil": 2, "pyyaml": 2, "type": [2, 3, 6, 13, 15, 16], "ncurs": [2, 14], "readlin": [2, 5, 8, 14], "admin": [2, 8], "mongo": 2, "src_configur": [2, 5, 8, 9, 13, 14, 20], "scons_opt": 2, "cc": [2, 9], "getcc": [2, 9], "disabl": [2, 5, 8, 10, 11, 12, 14, 20, 21], "warn": [2, 3, 5, 10, 16], "pcre": 2, "core": [2, 5, 21], "src_test": [2, 5, 6, 14], "buildscript": 2, "resmok": 2, "dbpathprefix": 2, "job": [2, 18], "makeopts_job": [2, 18], "die": [2, 3, 5, 8, 9, 14, 18, 21], "nostrip": [2, 8], "prefix": [2, 8, 9, 15, 16, 21], "ed": [2, 9, 15], "everyth": [2, 13, 19], "your": [2, 4, 5, 6, 7, 8, 11, 12, 15, 16, 18, 19, 21], "python2_7": [2, 5, 6, 8, 13, 14, 20], "eutil": 2, "molecular": 2, "dynam": 2, "nmr": 2, "analysi": [2, 20], "relax": [2, 18], "gna": 2, "bz2": [2, 8, 20], "python_required_us": [2, 4, 5, 8, 10, 14, 20], "python_gen_cond_dep": [2, 4, 5, 8, 12, 13, 20], "numdifftool": 2, "matplotlib": [2, 5, 20], "python2": [2, 8, 9, 13, 20], "wxpython": [2, 20], "wx_gtk_ver": [2, 20], "sci": [2, 5, 20], "chemistri": 2, "pymol": 2, "bmrblib": 2, "minfx": 2, "scipi": 2, "molmol": 2, "vmd": 2, "visual": 2, "grace": 2, "opendx": 2, "gfx": 2, "pngcrush": 2, "python_moduleinto": [2, 5, 9, 14], "python_domodul": [2, 5, 9, 12, 14, 20], "make_wrapp": [2, 9], "python_get_sitedir": [2, 3, 8, 9], "part": [2, 3, 4, 5, 8, 9, 12, 13, 14, 15, 18, 21], "That": [2, 16, 21], "fortran_need": 2, "fortran": 2, "fortran_standard": 2, "90": [2, 14], "object": [2, 11, 16, 20], "chemic": 2, "kinet": 2, "thermodynam": 2, "transport": 2, "cantera": 2, "v": [2, 4, 5, 10, 13, 14], "pch": 2, "sundial": 2, "eigen": 2, "libfmt": 2, "cython": [2, 10, 14, 20], "2_pkg_setup": 2, "scons_var": 2, "cc_flag": 2, "cxx_flag": 2, "std": 2, "debug": 2, "getfc": 2, "fortranflag": 2, "optimize_flag": 2, "wno": 2, "inlin": [2, 7, 14], "renamed_shared_librari": 2, "use_pch": 2, "usex": [2, 5, 20], "system_fmt": 2, "system_sundi": 2, "system_eigen": 2, "env_var": 2, "extra_inc_dir": 2, "eigen3": 2, "scons_target": 2, "f90_interfac": 2, "n": [2, 16, 18], "python2_packag": 2, "none": [2, 5, 6, 16], "python3_packag": 2, "python3_cmd": 2, "els": [2, 8, 11, 16], "stage_dir": 2, "libdirnam": 2, "get_libdir": [2, 8], "python_optim": [2, 8, 9, 19], "deal": [2, 7, 8, 10, 15], "sens": 2, "plain": [2, 5, 6, 13], "loop": [2, 5, 18], "autom": 2, "pipelin": [2, 21], "poisson": 2, "boltzmann": 2, "electrostat": 2, "calcul": 2, "poissonboltzmann": 2, "apb": 2, "opal": 2, "openbabel": 2, "zsi": 2, "lang": [2, 8, 11, 12, 20], "swig": [2, 20], "src_prepar": [2, 3, 5, 8, 9, 14, 16, 18, 19], "f": [2, 9, 16], "pyc": [2, 9, 19], "o": [2, 5, 19], "pyo": [2, 9, 19], "delet": [2, 3, 14], "eappli": 2, "patch": [2, 4, 5, 6, 8, 11, 12, 19, 21], "eapply_us": 2, "rm": [2, 3, 5, 9], "rf": 2, "python_copy_sourc": [2, 14], "python_configur": 2, "cat": [2, 5], "build_dir": [2, 3, 9, 14, 21], "build_config": 2, "eof": [2, 5], "eprefix": [2, 5, 8, 9], "max_atom": 2, "10000": 2, "build_pdb2pka": 2, "rebuild_swig": 2, "run_in_build_dir": [2, 8, 14], "python_instal": [2, 3, 14], "cd": [2, 5, 9, 12, 21], "let": [2, 4, 8, 16, 20], "independ": [2, 4, 5, 6, 7, 14, 20], "separ": [2, 5, 6, 7, 8, 11, 14, 15, 16, 18, 21], "presum": 2, "manual": [2, 6, 10, 11, 12, 19], "wider": 2, "target": [2, 5, 8, 9, 11, 12, 15, 20], "rang": [2, 5, 12], "recommend": [2, 5, 7, 12, 13, 14, 15, 16, 18, 20, 21], "gp": [2, 8], "daemon": [2, 8], "usb": [2, 8], "serial": [2, 5, 8, 15], "devic": [2, 8], "map": [2, 5, 6, 8, 15, 18], "client": [2, 8, 9, 11, 14], "gpsd": [2, 8], "mirror": [2, 4, 5, 6, 8, 14, 20, 21], "nongnu": [2, 8], "24": [2, 8, 18, 21], "misc": [2, 8], "pp": [2, 8], "20120407": [2, 8], "myesconsarg": [2, 8], "libdir": [2, 8, 9], "udevdir": [2, 8], "get_udevdir": [2, 8], "chrpath": [2, 8], "gpsd_user": [2, 8], "gpsd_group": [2, 8], "uucp": [2, 8], "manbuild": [2, 8], "use_scon": [2, 8], "sconstruct": [2, 8], "py2": [2, 8, 21], "construct": [2, 4, 8, 20], "pkg_config": 2, "shlinkflag": 2, "destdir": [2, 8, 9, 19], "bundl": [2, 5, 12], "simpl": [2, 5, 7, 13, 14, 17], "impli": [2, 9, 11], "python_req_us": [2, 4, 5, 6, 8, 14, 20], "individu": [2, 5, 11, 18], "applic": [2, 9, 11], "had": 2, "instead": [2, 3, 5, 6, 7, 8, 9, 13, 14, 16, 18, 19, 20, 21], "no_waf_libdir": 2, "ye": 2, "unit": 2, "framework": [2, 3, 5, 11, 17], "mrzechonek": 2, "tut": 2, "roughli": [2, 9, 11, 13], "ldap": 2, "ldb": 2, "samba": [2, 20], "ftp": [2, 20], "pub": 2, "elibc_freebsd": 2, "libbsd": 2, "popt": 2, "talloc": [2, 20], "tevent": 2, "9": [2, 5, 10, 12, 15, 19, 21], "31": [2, 15], "tdb": 2, "12": [2, 5, 8, 15, 16, 18, 19], "nd": 2, "openldap": 2, "libxslt": 2, "waf_binari": [2, 20], "buildtool": [2, 20], "filesdir": 2, "27": [2, 8], "optional_packag": 2, "myconf": [2, 8], "rpath": 2, "modulesdir": 2, "builtin": 2, "utils_src_configur": [2, 20], "tradition": 3, "python": [3, 6, 17, 18, 19, 21], "organ": 3, "subpackag": [3, 19], "locat": [3, 5, 19], "parent": [3, 9], "directori": [3, 5, 6, 9, 11, 12, 13, 14, 16, 18, 19, 21], "submodul": 3, "repres": [3, 5], "attribut": [3, 10, 16], "session": [3, 21], "addnod": 3, "site": [3, 5, 6, 9, 10, 11, 16, 18, 21], "fine": [3, 5, 12, 16], "start": [3, 4, 5, 6, 11, 12, 15, 16, 21], "problemat": [3, 5, 6, 10, 18], "top": [3, 5, 9, 10, 18], "level": [3, 9, 10, 11, 21], "layout": [3, 6, 13], "wish": [3, 5, 6], "zope": [3, 15], "share": [3, 5], "interfac": [3, 6, 11, 15, 16], "event": [3, 11, 18], "depend": [3, 6, 7, 9, 10, 11, 12, 13, 15, 16, 17], "far": [3, 12, 20], "concern": 3, "entir": [3, 5, 9, 10, 12, 13, 14, 21], "doabl": 3, "real": [3, 18, 19, 21], "we": [3, 4, 6, 8, 11, 12, 14, 15, 17, 19], "freshli": 3, "build": [3, 9, 10, 11, 15, 16, 19, 21], "abl": [3, 15], "tmp": [3, 5, 9, 18, 19, 21], "portag": [3, 5, 8, 10, 12, 14, 15, 18, 21], "python3_8": 3, "traceback": [3, 5, 21], "last": [3, 5, 16], "stdin": 3, "modulenotfounderror": 3, "No": [3, 5], "now": [3, 6, 8, 13, 14, 21], "around": [3, 5, 6, 11, 12, 21], "back": [3, 6, 16], "better": [3, 6, 11, 12, 13, 14, 19], "solut": [3, 15, 16, 19, 21], "unlik": [3, 5, 6, 11, 15], "tradit": 3, "act": 3, "proxi": [3, 14], "strictli": [3, 5, 6, 15, 21], "bound": [3, 11, 16], "permit": [3, 4, 5, 6, 11, 15], "load": [3, 7, 9, 16, 18, 19, 21], "search": [3, 10, 15, 21], "method": [3, 5, 11, 13, 16, 18, 19, 21], "420": 3, "newer": [3, 4, 5, 6, 11, 12, 15, 16, 19], "pkgutil": 3, "standard": [3, 4, 6, 7, 9, 10, 11, 14, 16, 21], "discourag": [3, 6], "earlier": [3, 13], "ignor": [3, 4, 5, 8, 15, 18, 21], "did": [3, 13, 16, 21], "within": [3, 5, 6, 12, 15, 17, 21], "content": [3, 5, 7], "__path__": 3, "__import__": 3, "extend_path": 3, "__name__": 3, "pkg_resourc": [3, 6], "declare_namespac": 3, "altern": [3, 5, 6, 8, 10, 16, 17, 21], "pth": 3, "automat": [3, 4, 5, 6, 10, 12, 15, 19], "inject": [3, 5, 20], "portabl": 3, "topic": [3, 17], "exact": [3, 5, 11, 20], "detect": [3, 5, 9, 15, 21], "recogn": [3, 5, 15, 16], "lack": [3, 9, 21], "action": [3, 5, 15], "distinguish": [3, 5, 13], "veri": [3, 4, 5, 6, 9, 11, 15, 17], "through": [3, 4, 5, 6, 8, 11, 16, 18, 21], "suspici": 3, "less": [3, 15, 21], "ruamel": 3, "miss": [3, 4, 5, 6, 9, 10, 11, 12, 13, 15, 17, 18, 19], "learn": 3, "about": [3, 6, 13, 15], "collis": [3, 5, 15, 21], "namespace_packag": 3, "per": [3, 5], "remov": [3, 4, 5, 6, 10, 11, 13, 14, 15, 18, 19, 21], "tree": [3, 5, 12, 13, 19, 21], "after": [3, 5, 6, 9, 11, 12, 13, 15, 16, 19], "python_compil": 3, "r1_python_compil": [3, 5], "jaraco": [3, 5, 12, 18], "equival": [3, 6, 8, 9, 13], "r1_python_instal": [3, 5], "python_install_al": [3, 5], "r1_python_install_al": [3, 5], "explicit": [3, 4, 5, 6, 20, 21], "rdep": 3, "sed": [3, 5, 8, 14, 15, 18, 21], "r1_src_prepar": [3, 5, 18], "histor": [3, 5, 6, 11, 13, 16, 19], "process": [3, 5, 7, 12, 16, 19, 20], "retir": 3, "major": [4, 5, 6, 11, 15, 21], "avail": [4, 5, 6, 8, 11, 13, 15, 16, 17], "sqlite3": 4, "sqlite": [4, 8], "xdg": 4, "music": 4, "lollypop": 4, "adishatz": 4, "syntax": [4, 10, 11, 15, 19], "lightweight": [4, 5], "password": 4, "backend": [4, 10, 12, 13], "pwman3": 4, "mysql": [4, 14], "postgr": 4, "fulli": [4, 5, 7, 11], "solv": [4, 17], "python_gen_impl_dep": 4, "helper": [4, 5, 7, 10, 14, 20, 21], "2_7": [4, 5], "3_": 4, "travel": 4, "spulec": 4, "freezegun": [4, 18, 21], "pypi": [4, 5, 6, 8, 10, 11, 13], "dateutil": 4, "six": [4, 5, 8], "nose": [4, 5, 21], "distutils_enable_test": [4, 13, 18, 21], "ll": [4, 14], "backport": [4, 6, 10, 12], "zero": [4, 15], "argument": [4, 6, 10, 13, 16, 21], "output": [4, 5, 6, 9, 16, 19, 21], "everi": [4, 5, 6, 8, 11, 14, 15, 16, 19], "escap": [4, 13, 20], "quot": [4, 20], "partial": [4, 5, 9, 10, 13], "python_single_usedep": [4, 5, 13, 20], "cli": [4, 5], "black": 4, "click": 4, "fnmatch": 4, "style": [4, 5, 13, 16, 17, 18, 21], "wildcard": 4, "stdlib": [4, 13, 16], "rememb": [4, 12], "pattern": [4, 12, 13, 20], "prevent": [4, 5, 11, 20, 21], "filenam": [4, 5], "expans": 4, "expand": 4, "zoneinfo": 4, "advantag": [4, 5, 7, 18, 21], "adjust": [4, 9, 11, 16], "switch": [4, 7, 9, 11, 12, 13, 15, 21], "list": [4, 5, 8, 12, 13, 18, 19], "longer": [4, 5, 6, 11, 13], "silent": 4, "updat": [4, 6, 9, 11, 12, 16], "immedi": [4, 5, 12, 20], "becam": [4, 11], "empti": [4, 5, 15], "importlib_metadata": [4, 5, 6, 15], "python3_7": [4, 8], "facilit": [5, 9], "deriv": [5, 6], "notabl": [5, 15, 16], "effici": [5, 15], "oper": [5, 11, 17], "backward": [5, 11, 16], "incompat": [5, 6, 11, 16, 18, 21], "greater": [5, 7], "number": [5, 7, 12, 15, 18], "cost": [5, 11], "flexibl": [5, 7], "wheel": [5, 11, 12, 15, 18, 19], "zip": [5, 6], "stage": [5, 11, 19, 21], "compil": [5, 6, 10, 11, 21], "mere": [5, 7], "imag": [5, 9, 19], "compliant": [5, 7], "invok": [5, 18, 21], "popul": [5, 15], "addition": [5, 9, 11, 14], "pyproject2setuppi": [5, 6, 13], "hack": [5, 6, 7, 13], "reli": [5, 6, 11, 21], "distutils_use_pep517": [5, 13], "legal": 5, "unset": [5, 6], "By": [5, 6, 11], "2022": [5, 13, 18], "xml": [5, 6], "feel": [5, 15], "json": 5, "martinblech": 5, "xmltodict": 5, "mit": [5, 6], "vast": 5, "index": [5, 10], "sdist": [5, 15, 19, 21], "binari": [5, 9, 12, 16], "mechan": [5, 7, 11], "over": [5, 7, 11, 12, 18, 20, 21], "offici": 5, "instanc": [5, 13, 16], "nonfunct": 5, "append": [5, 14, 15], "uniqu": [5, 14], "suffix": [5, 15, 19], "gh": [5, 21], "request": [5, 8, 10, 12, 15], "distfil": [5, 16, 20], "clearli": [5, 19, 21], "tarbal": [5, 12, 21], "textual": 5, "rich": 5, "implic": 5, "cf": [5, 12], "regener": [5, 12], "anywai": [5, 16], "nevertheless": 5, "even": [5, 8, 9, 11, 18, 21], "pregener": 5, "internet": [5, 10, 18], "nodej": 5, "underli": [5, 6, 7], "txt": [5, 6, 12, 18], "ci": [5, 21], "travi": 5, "yml": 5, "grep": 5, "statement": [5, 19], "indirect": 5, "relev": [5, 6, 13, 17, 18, 21], "unnecessarili": 5, "logic": [5, 6, 12], "long": [5, 11, 12], "quickli": 5, "widest": 5, "avoid": [5, 6, 8, 10, 15, 16, 17, 21], "unpredict": 5, "who": [5, 17], "especi": [5, 7, 18, 19, 21], "distutils_single_impl": [5, 7], "aim": [5, 11, 15, 17, 19], "exist": [5, 10, 11, 12, 16, 19], "rewritten": [5, 20], "layer": [5, 14], "pyroot": 5, "rootpi": 5, "physic": [5, 20], "root_numpi": 5, "pytabl": 5, "termcolor": 5, "determin": [5, 6, 7, 11, 20, 21], "flit_cor": [5, 12], "maintain": [5, 10, 11, 12, 16, 18], "suggest": [5, 8, 13, 15, 17, 18, 19, 21], "tabl": [5, 12, 13, 15, 16, 18], "summar": [5, 16], "use_pep517": 5, "hatchl": 5, "jupyt": 5, "jupyter_packag": 5, "build_api": 5, "maturin": 5, "mesonpi": 5, "see": [5, 9, 16, 18, 19, 21], "below": [5, 8], "pbr": [5, 6], "pdm": [5, 13], "pep517": [5, 19], "sip": [5, 8, 15], "sipbuild": 5, "standalon": [5, 12], "itself": [5, 6, 8, 9, 12, 15, 18], "own": [5, 21], "Their": [5, 6, 9], "fix": [5, 6, 10, 11, 12, 15, 16, 18, 19, 21], "produc": [5, 12, 15], "ident": 5, "artifact": 5, "reduc": 5, "footprint": 5, "isol": 5, "faster": 5, "poetry_cor": 5, "smaller": 5, "40": [5, 12], "incorrect": [5, 6, 19], "intend": [5, 16, 19, 21], "implicit": [5, 14, 21], "fallback": [5, 6], "regular": [5, 7, 21], "pleas": [5, 6, 8, 9, 12, 15, 16, 18, 19, 20, 21], "alwai": [5, 6, 8, 11, 13, 16, 17, 19], "unfortun": [5, 13, 15, 16, 18, 21], "due": [5, 10, 12, 14, 18, 19], "prolong": 5, "larg": [5, 12, 15, 18], "tend": 5, "mistak": [5, 15, 19], "checkout": [5, 12, 21], "abil": [5, 6], "tag": [5, 12, 21], "execut": [5, 6, 7, 9, 11, 12, 13, 14, 21], "143": 5, "_install_setup_requir": 5, "attr": [5, 12], "131": 5, "dist": 5, "dict": [5, 20], "425": 5, "_distribut": 5, "self": [5, 16, 18, 21], "292": 5, "finalize_opt": 5, "717": 5, "ep": 5, "48": 5, "infer_vers": 5, "_get_vers": 5, "config": [5, 9, 12], "148": 5, "parsed_vers": 5, "_do_pars": 5, "110": 5, "rais": [5, 16], "lookuperror": 5, "scm": 5, "unabl": [5, 15, 21], "sure": [5, 15, 18, 21], "re": [5, 8, 15, 21], "intact": 5, "git": [5, 12, 21], "folder": 5, "don": [5, 13], "t": [5, 7, 8, 11, 13, 21], "pip": [5, 12, 21], "proj": 5, "master": [5, 21], "egg": [5, 6, 18], "setuptools_scm_pretend_vers": 5, "static": [5, 8], "write": [5, 6, 7, 12, 16, 17, 19], "hybrid": [5, 10], "expos": [5, 6], "guarante": [5, 6, 10], "taken": [5, 16, 21], "ship": [5, 19], "issu": [5, 6, 13, 15, 16, 18, 21], "forc": [4, 5, 6, 8, 9, 12, 13, 18, 21], "frobnic": 5, "makefil": [5, 14], "jq": 5, "pyx": 5, "unresolv": 5, "regard": 5, "simultan": [5, 11, 17, 21], "link": [5, 7, 9, 16], "editor": 5, "broken": [5, 6, 18, 21], "cryptic": 5, "revers": [5, 7, 12, 15], "miscompil": 5, "panda": 5, "breakag": [5, 21], "dask": [5, 18], "29": 5, "_lib": 5, "hashtabl": 5, "_hashtabl": 5, "tslib": 5, "_tslib": 5, "13": [5, 15, 18, 21], "interv": 5, "init": 5, "30": [5, 11], "convers": [5, 6], "outofboundstimedelta": 5, "localize_pydatetim": 5, "importerror": [5, 6, 10, 11, 16], "38": [5, 19], "x86_64": 5, "undefin": 5, "symbol": 5, "pandas_datetime_to_datetimestruct": 5, "easiest": [5, 15, 20], "workaround": [5, 19], "j1": 5, "origin": [5, 9, 11, 12, 16], "overrid": [5, 9, 14, 21], "extend": [5, 11], "introduc": [5, 11], "src_": 5, "python_": [5, 8], "_all": [5, 8], "compris": 5, "behav": [5, 8], "r1_": 5, "correspond": [5, 11, 12, 15], "python_prepare_al": [5, 18], "each": [5, 6, 7, 11, 14], "foreach": 5, "python_configure_al": 5, "python_compile_al": [5, 8], "python_test_al": 5, "dedic": [5, 6, 12, 14], "chang": [5, 6, 8, 9, 10, 11, 13, 14, 15, 19, 21], "task": [5, 8, 12], "default_src_prepar": 5, "ez_setup": 5, "bootstrap": [5, 6, 10], "end": [5, 6, 7, 9, 11, 14, 18, 21], "dir": [5, 14], "extran": 5, "fixm": 5, "test_pytest_plugin": 5, "test_testcase_no_app": 5, "_": [5, 12, 15, 21], "test_test_util": 5, "pointless": 5, "cov": [5, 18], "addopt": 5, "aiohttp": [5, 18], "r1_python_prepare_al": [5, 18], "duplic": [5, 14, 21], "moment": [5, 11, 13, 15], "modif": 5, "keep": [5, 15, 17], "why": [5, 6, 21], "console_script": [5, 6], "configur": [5, 6, 8, 13, 14, 19, 21], "step": [5, 6, 7, 8, 14], "esetup": [5, 8], "mpi": 5, "distutils_arg": [5, 13], "resourcepath": 5, "compress": 5, "manpag": 5, "distutils_enable_sphinx": [5, 8], "emak": [5, 8, 9], "strongli": [5, 6, 15], "encourag": [5, 15], "testbitvector": 5, "redefin": [5, 18], "too": [5, 11, 21], "collada": 5, "einstalldoc": [5, 8, 14], "docinto": 5, "sample_cod": 5, "docompress": 5, "pf": 5, "main": [5, 9], "manipul": [5, 21], "arrai": 5, "futur": [5, 15], "pillow": 5, "build_ext": [5, 6, 21], "tiff": 5, "webp": 5, "dash": 5, "underscor": [5, 15, 21], "boolean": 5, "disable_tiff": 5, "enable_tiff": 5, "disable_webp": 5, "enable_webp": 5, "modifi": [5, 6, 11, 15, 19, 21], "beforehand": 5, "econf": [5, 20], "paremet": 5, "find_packag": 19, "wrongli": [16, 19, 21], "grab": [13, 19], "attempt": [16, 19, 21], "forbidden": [], "exclud": 19, "paramet": [5, 8, 16, 19], "properli": [6, 13], "intermedi": [], "minim": [5, 11, 15, 16], "precis": [5, 8, 9], "catch": [5, 19], "earli": [5, 7, 8, 12], "anywher": 5, "first": [5, 6, 10, 11, 12, 15, 16, 18, 19, 21], "easi": [5, 16, 19, 21], "whitelist": 5, "sanit": [5, 11, 16], "mozilla": 5, "bleach": 5, "webencod": 5, "unittest": [5, 11, 21], "discoveri": [5, 18, 19, 21], "univers": 5, "encod": [5, 16], "detector": 5, "chardet": [5, 8], "cygwin": [5, 6], "hypothesi": [5, 21], "bottom": 5, "venv": [5, 6, 13], "temporari": [5, 6], "frequent": [5, 18], "littl": [5, 6, 18], "skip": [4, 5, 8, 10, 12, 16, 19], "those": [5, 6, 8, 9, 18, 21], "how": [5, 21], "statist": 5, "want": [5, 6, 8], "across": [5, 11], "irrelev": [5, 21], "pep8": 5, "pycodestyl": 5, "flake8": [5, 18], "thin": [5, 6], "alreadi": [5, 9, 12, 14, 15, 16, 19], "close": 5, "pre": 5, "post": [5, 6, 13, 15], "easili": [5, 14, 18, 21], "r1_src_test": 5, "cmd": 5, "cmd2": 5, "colorama": 5, "pyperclip": 5, "wcwidth": 5, "text": [5, 8, 16], "column": 5, "80": 5, "fact": [5, 21], "simpli": [5, 15, 16, 17, 21], "3_6": [5, 14], "3_7": [5, 14], "3_8": 5, "tab": [5, 15], "argpars": 5, "argcomplet": 5, "fish": 5, "tcsh": 5, "rel": [5, 18, 19, 21], "epytest": [4, 5, 6, 8, 12, 18, 21], "network": [5, 6, 18, 21], "marker": [5, 10], "m": [5, 15, 18, 19, 21], "displai": 5, "appeas": 5, "usng": 5, "xvfb": 5, "server": [5, 21], "virtx": 5, "nonfat": 5, "termin": [5, 21], "context": [5, 20], "come": [5, 13, 18], "theme": [5, 6, 8], "hard": [5, 8, 12], "To": [5, 6, 8, 9, 12, 15, 16, 18, 19, 20], "conf": [5, 6, 19], "ext": 5, "distutils_use_setuptool": [5, 13], "color": 5, "stream": 5, "handler": 5, "log": [5, 19], "coloredlog": 5, "xolox": 5, "readthedoc": 5, "en": 5, "latest": [5, 15], "humanfriendli": 5, "expert": [5, 10, 14, 21], "uncommon": [5, 15], "third": [5, 7, 13, 19], "parti": 5, "inflect": 5, "word": 5, "jazzband": 5, "rst": 5, "linker": [5, 9], "alabast": [5, 6], "python_target": [5, 7, 8, 11, 12], "inspect": 5, "omit": [5, 15, 16], "port": [5, 8, 10], "pyseri": 5, "psf": 5, "tri": 5, "been": [5, 6, 8, 11, 12, 13, 14, 16, 18, 19], "assumpt": 5, "consum": [5, 6, 21], "distutils_opt": 5, "alter": [5, 18], "distutils_dep": 5, "dependneci": 5, "r1_src_compil": 5, "r1_src_instal": 5, "primari": [5, 18], "alongsid": [5, 6], "libfoo": 5, "r1_src_configur": [], "setuptools_rust": 5, "ecosystem": [5, 15, 17], "bump": [5, 12, 15], "lock": 5, "Then": 12, "crate": 5, "cargo_opt": 5, "url": [5, 11, 15, 16], "cargo_crate_uri": 5, "qa_flags_ignor": 5, "posit": [5, 15], "cflag": [5, 9, 21], "cargo_src_unpack": 5, "inflector": 5, "alias": [5, 16], "asn1": 5, "asn1_der": 5, "_rust": 5, "src_unpack": 5, "benefit": [5, 7], "yet": [5, 8, 11, 20], "cyclic": 5, "suppos": [5, 16], "overlap": 5, "machineri": 5, "op": 5, "unless": [5, 6, 8, 15], "merg": [4, 5], "toward": 5, "effect": [5, 8, 11, 19], "pick": [5, 12], "up": [5, 6, 9, 11, 13, 14, 15, 17, 18, 19, 21], "hukkin": 5, "tomli": [5, 12, 15], "pythonhost": 5, "py3": [5, 18], "whl": 5, "unzip": 5, "deliber": 5, "unpack": 5, "gpep517": [5, 19], "python_newscript": [5, 9], "__main__": [5, 21], "exit": [5, 16, 19, 21], "fragment": [5, 16], "emesonarg": 5, "dlint": 5, "meson_src_configur": 5, "meson_src_compil": 5, "meson_src_test": 5, "meson_src_instal": 5, "here": [6, 8, 14, 20], "direct": [6, 14], "convert": [6, 8, 13], "facil": 6, "right": [6, 7], "fit": [6, 21], "profil": [4, 6, 15], "pyproject2toml": 6, "misbehav": 6, "subsequ": [6, 19], "qa": [6, 9, 10, 12, 17], "expect": [6, 11, 16, 18, 19, 21], "sidebar": 6, "bitprophet": 6, "possibli": [6, 21], "snippet": [6, 16, 19], "except": [6, 7, 9, 11, 12, 16], "pm": 6, "cleanli": [6, 12], "condit": [6, 10, 12, 18, 21], "leav": 6, "never": [6, 11, 13, 16], "clean": [6, 11, 13], "requier": 6, "With": [6, 21], "themselv": [6, 18, 19, 21], "entry_point": [6, 18], "dictionari": [6, 20], "our": [6, 18, 21], "interest": [6, 8, 21], "gui_script": 6, "meaning": 6, "importlib": [6, 11, 21], "fall": [6, 16], "remind": 6, "distutils_strict_entry_point": 6, "trigger": [6, 12, 18, 19, 21], "wrong": [6, 13, 15], "leftov": 6, "resourc": [6, 11, 12, 19], "submit": [6, 19], "suppli": 6, "heavi": 6, "speak": [6, 11], "known": [6, 16, 21], "limit": [6, 12, 15, 17], "address": [6, 11, 16], "definit": 6, "subdirectori": [6, 9], "interspers": [6, 19], "closest": 6, "inplac": 6, "shift": [6, 11], "throughout": 6, "2to3": 6, "distutils_in_source_build": 6, "collect": [6, 18, 21], "pypa": 6, "riscv": [6, 8, 20], "pythonpath": [6, 21], "distutils_install_for_test": [6, 13, 18, 21], "alik": [6, 7, 11, 13], "preserv": [6, 11, 15, 16], "extrem": 6, "home": [6, 12, 13], "went": 6, "awai": [6, 7], "python_test": [4, 6, 8, 9, 12, 18, 21], "total": 7, "rare": [7, 9, 18, 21], "simpler": 7, "complex": [7, 16, 20], "primarili": [7, 11], "involv": [7, 8, 13], "graph": [7, 11, 12], "meet": 7, "potenti": [7, 11, 15, 16, 18], "basi": 7, "occur": [7, 11, 18], "libpython": [7, 11, 16], "aforement": [7, 13, 16], "foo": [7, 16], "wise": 7, "abstract": [7, 14], "scon": [7, 8, 10, 19], "second": [7, 13, 19], "easier": [7, 19], "select": [7, 8, 18, 20], "allow": [7, 21], "repeat": [7, 14, 15, 19], "model": 7, "libboost_python": 7, "python_single_target": [7, 11, 12], "Its": [7, 12], "legaci": [7, 10, 13, 16], "power": 8, "harder": [8, 15], "ninja": [8, 15], "train": 8, "opposit": [8, 11, 13], "investig": 8, "human": 8, "beings": 8, "socks5": 8, "ssl": 8, "certifi": [8, 15], "2017": 8, "17": 8, "idna": 8, "urllib3": [8, 12], "26": 8, "pysock": 8, "cryptographi": [8, 15], "pyopenssl": 8, "14": [8, 21], "httpbin": [8, 18], "hang": 8, "continu": [8, 12, 21], "python_gen_useflag": 8, "out": [8, 9, 10, 11, 12, 13, 14, 15, 16], "toolkit": 8, "translat": 8, "format": [8, 12, 15, 16, 19], "subtitl": 8, "pydiff": 8, "iso": 8, "lxml": 8, "pycountri": 8, "18": 8, "levenshtein": 8, "devel": 8, "gettext": 8, "video": 8, "gaupol": 8, "riverbankcomput": 8, "intro": 8, "sip_api_major_nr": 8, "siplib": 8, "h": [8, 9, 20], "bison": 8, "flex": 8, "prepar": [8, 9, 19, 20], "bindir": 8, "incdir": 8, "python_get_includedir": [8, 9, 13], "echo": [8, 19], "distutils_all_subphase_impl": 8, "python3_5": 8, "bzip2": 8, "epydoc": 8, "eselect": 8, "elibc_glibc": 8, "sandbox": [8, 19, 21], "kernel_linux": 8, "pax": 8, "rsync": 8, "userland_gnu": 8, "coreutil": 8, "sphinx_rtd_them": 8, "practic": [8, 11, 12], "big": 8, "imagin": 8, "anymor": [8, 11], "downgrad": 8, "though": [8, 11], "resembl": [8, 18], "presenc": [8, 18], "activ": [8, 17], "behavior": [8, 11, 16], "goal": [8, 12, 21], "side": [8, 11], "someth": [8, 9, 21], "accord": 8, "integr": [8, 9, 10, 11], "won": 8, "reject": [8, 15, 16], "unsupport": [8, 11], "python_is_python3": [8, 13], "basic": [9, 10, 21], "reus": [9, 15], "four": [9, 13, 20], "python_doex": 9, "python_newex": 9, "python_doscript": [9, 14, 20], "recurs": [9, 15, 18], "python_dohead": 9, "python_scriptinto": 9, "affect": [9, 11, 14], "symlink": 9, "onto": 9, "improv": [9, 10, 11, 17], "cropgtk": 9, "sbin": 9, "pynslcd": 9, "anyth": 9, "land": 9, "my_pn": 9, "doin": 9, "libimag": 9, "env": [9, 12], "python_fix_shebang": 9, "sphinxtrain": 9, "openvpn": 9, "vulnkei": 9, "insinto": 9, "kitti": 9, "speed": 9, "nowadai": [9, 12, 13], "pypy2": [9, 11], "_feedparser_sgmllib": 9, "lib64": 9, "byte_compil": 9, "cmake_src_instal": 9, "entropi": 9, "ocassion": 9, "bad": [9, 16], "seri": 9, "getter": [9, 13, 16], "python_get_scriptdir": 9, "python_get_library_path": [9, 13], "python_get_cflag": 9, "preprocessor": 9, "pkg": 9, "python_get_lib": 9, "python_get_python_config": 9, "offset": 9, "mycmakearg": [9, 13, 20], "dpython_dest": 9, "dpython_execut": 9, "dpython_include_dir": 9, "dpython_librari": 9, "cmake_src_configur": [9, 20], "pyinc": 9, "pylib": 9, "micha\u0142": 10, "g\u00f3rny": 10, "creativ": 10, "intern": 10, "prefac": 10, "life": 10, "cycl": [10, 12], "stabil": 10, "choos": [10, 11, 14], "overview": 10, "variant": [10, 11, 16, 18], "flit_scm": 10, "hatch": 10, "vc": [10, 21], "snapshot": [10, 21], "parallel": 10, "race": 10, "command": [10, 14, 15, 18, 19], "usag": 10, "rust": 10, "cargo": 10, "variat": 10, "byte": [10, 16], "queri": [10, 16], "advanc": 10, "cffi": 10, "greenlet": [10, 18], "checklist": 10, "abort": 10, "assert": [10, 19], "recip": 10, "xdist": [10, 12, 21], "autoload": 10, "typeerror": 10, "_make_test_flaki": 10, "got": [10, 13], "unexpect": [10, 19], "rerun": 10, "importpathmismatcherror": 10, "fixtur": [10, 12], "namespac": [10, 18], "disjoint": 10, "waf": [10, 20], "tip": [10, 21], "retroact": 10, "migrat": 10, "bytecod": 10, "relat": [10, 12, 13, 15, 21], "mainten": 10, "co": [10, 21], "monitor": [10, 19], "routin": [10, 14], "page": [10, 16, 17], "increment": 11, "minor": [11, 21], "plan": 11, "On": 11, "hand": [11, 13], "platform": [11, 16, 21], "linux_distribut": 11, "window": 11, "understood": 11, "initi": [11, 21], "enter": 11, "stabl": [11, 12, 15], "prematur": [11, 15], "mask": [4, 11, 12, 15], "beta": 11, "made": [11, 13, 14, 16, 20], "regress": 11, "readi": [11, 12, 15], "dai": 11, "inconsist": [11, 15, 21], "mark": [11, 15, 18, 21], "architectur": [4, 11], "clear": [11, 15], "depenend": 11, "repeatedli": 11, "ask": [11, 15], "push": [11, 12, 15], "forward": 11, "eventu": [11, 12], "becom": [11, 16], "slowli": [11, 15], "discontinu": 11, "next": [11, 12, 15, 18], "june": 11, "juli": 11, "year": 11, "predict": [11, 20], "nears": 11, "great": 11, "obsolet": [11, 13], "feasibl": [4, 11, 15], "vulner": 11, "break": [11, 15, 16], "revert": 11, "enum": 11, "urlsplit": 11, "secur": [11, 12], "abi": 11, "bugfix": 11, "occasion": 11, "remain": [4, 11, 12, 13], "contrari": [11, 16], "hold": [11, 16], "subslot": 11, "fortun": 11, "late": 11, "hous": 11, "rpython": 11, "lot": [11, 15], "good": [11, 15, 17, 18, 21], "gc": 11, "jython": 11, "java": 11, "stand": 11, "alon": 11, "bidirect": 11, "interact": 11, "slow": 11, "pace": 11, "ironpython": 11, "brython": 11, "web": 11, "javascript": 11, "dom": 11, "micropython": 11, "microcontrol": 11, "down": 11, "hardwar": 11, "tauthon": 11, "accompani": 11, "nor": [11, 17, 19], "ideal": [11, 15, 21], "funcsig": 11, "signatur": [11, 16], "afterward": [11, 14, 15], "later": 11, "lzma": 11, "compet": 11, "amount": [11, 12, 21], "ipaddress": 11, "drop": [11, 16], "box": [11, 13], "hexvers": [11, 21], "0x03030000": 11, "trolliu": 11, "asyncio": [11, 18, 21], "nativ": 11, "workflow": 12, "clone": 12, "remot": [12, 15, 21], "fetch": 12, "rebas": 12, "v3": 12, "cherri": 12, "upload": 12, "mkdir": 12, "scp": 12, "precompil": [12, 19], "unusu": 12, "structur": [12, 21], "ex": 12, "technic": 12, "docker": 12, "binpkg": 12, "diff": 12, "mgorni": 12, "desc": 12, "_python_all_impl": 12, "_python_verify_pattern": 12, "_python_set_impl": 12, "_python_impl_match": 12, "python_pkg_dep": 12, "gpyutil": [12, 15], "circular": 12, "eas": [12, 15], "temporarili": [12, 13], "python3_11": 12, "20": 12, "pwd": 12, "round": 12, "signific": [4, 12, 18], "remaind": 12, "pydant": 12, "epytest_deselect": [4, 12, 18], "test_comparison": 12, "test_close_to_now_": 12, "lenient": 12, "deselect": [4, 12, 18, 21], "unblock": 12, "100": 12, "emerg": [12, 19], "previous": 12, "reinstal": 12, "batch": [12, 19], "focus": 12, "reenabl": [12, 18], "face": [12, 21], "goe": [12, 21], "unbundl": 12, "obligatori": [12, 15], "baselin": 12, "ones": 12, "chosen": 12, "fewest": 12, "vendor": [12, 13], "februari": 13, "gross": 13, "serv": 13, "placehold": 13, "transit": [13, 15], "period": [13, 15], "ban": 13, "python_multi_usedep": 13, "know": [13, 16, 21], "given": 13, "repoman": 13, "pkgcheck": [13, 15], "tell": 13, "chose": 13, "reorder": 13, "desir": [13, 16, 19, 21], "scan": [13, 15], "unmatch": 13, "trial": 13, "stuff": 13, "thing": [13, 17, 18], "privat": 13, "python_export": 13, "python_wrapper_setup": 13, "python_gen_usedep": 13, "mydistutilsarg": 13, "renam": [13, 15, 16, 19], "cleanup": 13, "python_gen": 13, "march": 13, "python_get": 13, "python_includedir": 13, "python_libpath": 13, "dpython3_include_dir": 13, "dpython3_librari": 13, "sundri": 13, "stop": [13, 16], "realli": [13, 15, 18, 21], "ugli": 13, "sole": 13, "uppercas": [13, 15, 16], "fourth": 13, "cruft": 13, "short": [13, 18], "evalu": 13, "januari": 13, "safe": 13, "streamlin": 13, "inde": 13, "foundat": 14, "fionet": 14, "psql": 14, "cach": 14, "sourceforg": [14, 20], "replic": 14, "tgz": 14, "libcangji": 14, "cangjian": 14, "i18n": 14, "eautoreconf": [14, 16], "econf_sourc": 14, "la": 14, "multibuild": 14, "unnecessari": [14, 15, 20, 21], "libtool": 14, "buggi": 14, "canva": 14, "widget": 14, "gtk": 14, "cairo": 14, "2d": 14, "draw": 14, "goocanva": 14, "subdir": 14, "am": 14, "gnome2_src_prepar": 14, "gnome2_src_configur": 14, "gnome2_src_instal": 14, "sub_instal": 14, "gi": 14, "_overridesdir": 14, "outsid": [14, 20], "qemu": 14, "kernel": 14, "machin": [14, 19], "userland": 14, "kvm": 14, "qemu_python_instal": 14, "vmxcap": 14, "qmp": 14, "ga": 14, "reach": 15, "eol": [15, 16], "proactiv": 15, "anticip": 15, "soon": 15, "wide": [15, 21], "revis": [12, 15], "newli": 15, "risk": 15, "team": 15, "manpow": 15, "member": 15, "u": 15, "gemato": 15, "carri": 15, "histori": 15, "rss": 15, "comprehens": 15, "opml": 15, "followup": 15, "track": [12, 15], "mail": [12, 15], "suscept": 15, "confus": [15, 18], "sync": [15, 18], "conflict": 15, "cx": 15, "freez": 15, "patchelf": 15, "openapi": 15, "spec": [15, 16], "60": 15, "59": 15, "62": 15, "pin": 15, "httpcore": 15, "15": 15, "httpx": 15, "23": [15, 21], "sphobjinv": 15, "28": 15, "date": [15, 17, 19, 21], "pend": 15, "pip3": 15, "dirti": 15, "equal": [15, 21], "filetyp": 15, "mercuri": 15, "node": 15, "semver": 15, "pyqt": 15, "builder": 15, "pyqt5": 15, "pyqtwebengin": 15, "rout": 15, "dev20220522": 15, "selenium": 15, "141": 15, "sphinxcontrib": 15, "websupport": 15, "dev20220515": 15, "uri": 15, "watchfil": 15, "watchgod": 15, "dev0": 15, "sign": [12, 15], "tag_build": 15, "compar": [15, 16], "tempest": 15, "oslo": 15, "stestr": 15, "versioningit": 15, "wstool": 15, "think": 16, "ve": 16, "hit": 16, "me": 16, "18_p9": 16, "13_p3": 16, "10_p3": 16, "9_p2": 16, "4_p1": 16, "urllib": 16, "pars": 16, "exploit": 16, "verbatim": 16, "worm": 16, "danger": 16, "worst": [16, 21], "unpars": 16, "django": [16, 21], "pr": 16, "14349": 16, "impact": [16, 19], "urlpars": 16, "nurl": 16, "parseresult": 16, "scheme": 16, "netloc": 16, "param": [16, 18], "badurl": 16, "what": 16, "attributeerror": 16, "492": 16, "decor": [16, 21], "async": [16, 18], "def": [16, 18, 21], "yield": 16, "await": 16, "sleep": 16, "callabl": 16, "mostli": [16, 17], "getfullargspec": 16, "p1": 16, "p2": 16, "kp3": 16, "kp4": 16, "kp5": 16, "arg": 16, "kwarg": 16, "argspec": 16, "vararg": 16, "fullargspec": 16, "varkw": 16, "kwonlyarg": 16, "kwonlydefault": 16, "annot": 16, "tupl": 16, "int": 16, "str": 16, "float": 16, "k6": 16, "k7": 16, "k8": 16, "One": [16, 21], "prototyp": 16, "bar": 16, "pretti": 16, "stringif": 16, "automak": 16, "16": 16, "exec_prefix": 16, "met": 16, "pkg_config_path": 16, "python_cflag": 16, "python_lib": 16, "man": 16, "autoreconf": 16, "throw": 16, "get_python_inc": 16, "get_path": 16, "platinclud": 16, "get_python_lib": 16, "purelib": 16, "platlib": 16, "platstdlib": 16, "todai": 16, "encodebyt": 16, "decodebyt": 16, "ought": 16, "unicod": 16, "version_info": 16, "b64_encodebyt": 16, "b64encod": 16, "b64decod": 16, "insert": 16, "newlin": 16, "length": 16, "until": 16, "emb": 16, "lpython3": 16, "7m": 16, "among": 17, "beyond": 17, "reliabl": [17, 21], "deep": 17, "beginn": 17, "peopl": 17, "suboptim": 17, "improp": 17, "fill": 17, "gap": 17, "welcom": 17, "whole": [4, 18, 21], "parametr": 18, "epytest_ignor": 18, "test_client": 18, "test_gener": 18, "test_filenam": 18, "test_transport": 18, "test_transport_work": 18, "eventlet": 18, "test_contextvar": 18, "test_leak": 18, "might": 18, "intent": 18, "Not": 18, "collid": [18, 21], "instabl": 18, "unstabl": 18, "discret": 18, "decid": 18, "justifi": 18, "semi": 18, "random": 18, "multiprocess": 18, "finish": 18, "01": 18, "chanc": 18, "experienc": 18, "insuffici": 18, "nest": 18, "envvar": 18, "pytest_disable_plugin_autoload": 18, "pytest_plugin": 18, "comma": 18, "looponfail": 18, "pytest_fork": 18, "flaki": [18, 21], "rerunfailur": 18, "supposedli": 18, "twice": 18, "_pytest": [18, 21], "pathlib": [18, 21], "posixpath": 18, "signifi": 18, "event_loop": 18, "freezer": 18, "mocker": 18, "captur": [18, 21], "summari": 18, "asgiref": 18, "135": 18, "test_loc": 18, "test_sync": 18, "test_sync_contextvar": 18, "deprecationwarn": 18, "main_event_loop": 18, "get_event_loop": 18, "filterwarn": 18, "fatal": [18, 21], "_____________________": 18, "______________________": 18, "577": 18, "asgitest": 18, "testcas": 18, "583": 18, "test_wrapped_case_is_collect": 18, "interrupt": 18, "world": 18, "elog": 19, "portage_elog_class": 19, "optim": 19, "size": 19, "oo": 19, "docstr": 19, "store": 19, "disk": [19, 21], "permiss": 19, "uninstal": 19, "violat": 19, "auxiliari": 19, "readabl": [19, 21], "trimesh": 19, "__pycache__": 19, "blender_boolean": 19, "310": 19, "opt": 19, "notic": 19, "blueman": 19, "constant": 19, "deviceclass": 19, "sdp": 19, "tmpl": 19, "pair": 19, "docbook": 19, "35": 19, "36": 19, "plot": 20, "voacap": 20, "propag": 20, "qsl": 20, "hz1jw": 20, "pythonprop": 20, "basemap": 20, "gtk2": 20, "doubl": 20, "energi": 20, "yoda": 20, "hepforg": 20, "use_en": 20, "pyext": 20, "extra_opt": 20, "give": 20, "sound": 20, "signal": [20, 21], "composit": 20, "csound": 20, "fordfrog": 20, "dbuild_python_interfac": 20, "dbuild_python_opcod": 20, "superset": 20, "arab": 20, "arabey": 20, "duali": 20, "pyduali": 20, "dict2db": 20, "trans2arab": 20, "arabic2tran": 20, "domain": 21, "firstli": 21, "idea": [15, 21], "nosetest": 21, "secondli": 21, "strict": 21, "thirdli": 21, "wholli": 21, "spew": 21, "seem": 21, "ceas": 21, "downstream": 21, "convinc": [4, 21], "preced": 21, "area": 21, "____________________": 21, "systemd": 21, "test_login": 21, "234": 21, "hint": [12, 21], "578": 21, "_importtestmodul": 21, "mod": 21, "import_path": 21, "fspath": 21, "importmod": 21, "524": 21, "import_modul": 21, "module_nam": 21, "127": 21, "_bootstrap": 21, "_gcd_import": 21, "frozen": 21, "1014": 21, "991": 21, "_find_and_load": 21, "975": 21, "_find_and_load_unlock": 21, "671": 21, "_load_unlock": 21, "rewrit": 21, "170": 21, "exec_modul": 21, "__dict__": 21, "login": 21, "r2": 21, "discov": 21, "pyarg": 21, "guess": 21, "quick": 21, "mayb": 21, "eunittest": 21, "aris": 21, "confirm": 21, "whom": 21, "myself": 21, "subtl": 21, "lead": 21, "But": 21, "bewar": 21, "unexpectedli": 21, "test_start_params_bug": 21, "xfail": 21, "statsmodel": 21, "tsa": 21, "test_arima": 21, "horrend": 21, "space": 21, "mayhem": 21, "5a": 21, "test_null_byt": 21, "skipif": 21, "0x03000000": 21, "unconditioanlli": 21, "test_babel_with_language_": 21, "test_build_latex": 21, "test_polyglossia_with_language_": 21, "altogeth": 21, "replai": 21, "devmanu": 21, "explan": 21, "connect": 21, "pygit2": 21, "no_network": 21, "properti": 21, "test_network": 21, "allow_test": 21, "unclear": 21, "backtrac": 21, "pluggi": 21, "cachedir": 21, "pytest_cach": 21, "rootdir": 21, "var": 21, "sabyenc": 21, "configfil": 21, "item": 21, "test_decod": 21, "test_crc_pickl": 21, "54": 21, "test_empty_size_pickl": 21, "0x00007f748bc47740": 21, "testsupport": 21, "74": 21, "sabyenc3_wrapp": 21, "119": 21, "180": 21, "pytest_pyfunc_cal": 21, "caller": 21, "187": 21, "_multical": 21, "temp": 21, "2934": 21, "66": 21, "dump": [16, 21], "vv": 21, "34": 21, "timeout": 21, "25": 21, "sabyenc3": 21, "596": 21, "decode_usenet_chunk": 21, "pybytearray_check": 21, "pylist_getitem": 21, "py_input_list": 21, "lp": 21, "0x00007fb5db746740": 21, "73": 21, "117": 21, "87": 21, "lambda": 21, "runpi": 21, "85": 21, "_run_cod": 21, "193": 21, "_run_module_as_main": 21, "reproduc": 21, "ubuntu": 21, "dndebug": 21, "leak": 21, "o0": 21, "isort": 21, "distutils_pep517_instal": 21, "destin": 21, "cp": 21, "pushd": 21, "null": 21, "popd": 21, "novemb": 16, "tomllib": [], "w": [], "tomlkit": 16, "edit": 16, "wherea": 16, "input": 16, "tomldecodeerror": 16, "d1": 16, "in1": 16, "in2": 16, "d2": 16, "d3": 16, "rb": 16, "insist": 16, "incompatibilit": 16, "consider": 16, "tomli_w": 16, "wb": 16, "trustm": 4, "test_request": 4, "testrequest": 4, "test_https_warn": 4, "outer": 4, "tl": 4, "pull": 4, "python_vers": 16, "pycargoebuild": 5, "obsolesc": 12, "announc": 12, "proce": 12, "progress": 12, "show": 12, "effort": 12, "rite": [], "_python_historical_impl": 12, "statu": 12, "dead": 12, "polici": 10, "live": [], "2023": [], "conform": 15, "publish": 15, "hyphen": 15, "dot": 15, "crucial": 15, "bugzilla": 15, "illustr": 15, "flask": 15, "babel": 15, "github3": 15, "sphinx_pytest": 15, "redirect": 15, "mismatch": [], "charact": 15, "canon": 15, "id": 15, "unnot": [], "bear": 15, "mind": 15, "doubt": 15, "reserv": 15, "503": 15, "insensit": 15, "letter": 15, "turn": 15, "lowercas": 15, "titl": 15, "423": 15, "incomplet": 5, "strai": 10, "changelog": 19, "wait": 19, "qawarn": 19, "box_logo": [], "png": []}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"python": [0, 1, 2, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 20], "ani": [0, 8], "r1": [0, 2, 5, 6, 7, 8, 13, 14, 20], "build": [0, 1, 2, 5, 6, 7, 8, 12, 13, 14, 20], "time": [0, 2, 7, 8, 14, 20], "depend": [0, 1, 2, 4, 5, 8, 14, 18, 20, 21], "basic": [0, 1, 5, 20], "us": [0, 2, 3, 4, 5, 6, 7, 8, 14, 18, 20], "uncondit": [0, 20], "condit": [0, 2, 4, 5, 14, 20], "addit": [0, 5, 14], "multipl": [0, 11, 20], "set": [0, 8], "common": [1, 9], "python_compat": 1, "python_dep": 1, "python_required_us": 1, "environ": [1, 21], "packag": [1, 2, 3, 4, 5, 6, 7, 12, 14, 15, 16, 19, 20, 21], "The": [1, 5], "most": 1, "type": 1, "find": 1, "list": [1, 15, 16], "from": [1, 13], "system": [1, 2, 5, 6, 12], "integr": [2, 5], "written": 2, "meson": 2, "scon": 2, "extra": [2, 21], "singl": [2, 5, 7, 13, 20], "impl": [2, 7, 14, 20], "instal": [2, 5, 6, 9, 14, 15, 19, 20, 21], "pure": [2, 14], "multi": [2, 7, 14], "hybrid": [2, 20], "waf": 2, "advanc": [3, 4], "concept": [3, 6], "namespac": 3, "hierarch": 3, "structur": 3, "determin": 3, "whether": 3, "ar": [3, 19], "ad": [3, 5, 12, 15], "new": [3, 12, 15], "gentoo": [3, 10], "legaci": [3, 5, 6], "request": 4, "flag": 4, "interpret": [4, 8, 11, 12], "version": [4, 11, 15], "cffi": 4, "greenlet": 4, "distutil": [5, 6, 7, 8, 16], "standard": 5, "pep": [5, 13, 21], "517": [5, 13, 21], "mode": [5, 21], "sourc": [5, 6], "archiv": 5, "variant": 5, "deprec": [5, 16], "backend": 5, "flit": 5, "buildapi": 5, "poetri": [5, 19], "masonri": 5, "api": [5, 8], "setuptool": [5, 6, 19], "build_meta": 5, "__legacy__": 5, "setuptools_scm": 5, "flit_scm": 5, "hatch": 5, "vc": 5, "snapshot": 5, "cython": 5, "parallel": [5, 18], "race": 5, "sub": 5, "phase": 5, "function": [5, 9], "python_prepar": 5, "python_configur": 5, "python_compil": 5, "python_test": 5, "python_instal": 5, "pass": 5, "argument": [5, 18], "setup": 5, "py": 5, "call": 5, "custom": 5, "command": 5, "prevent": [], "test": [4, 5, 6, 15, 18, 19, 21], "directori": [], "being": [], "enabl": 5, "distutils_enable_test": 5, "more": 5, "befor": [5, 6], "run": [5, 18], "undesir": 5, "pytest": [5, 18], "virtualx": 5, "document": [5, 19], "via": [5, 15], "sphinx": 5, "autodoc": 5, "extens": [5, 21], "without": [5, 16], "option": [4, 5], "usag": [5, 8], "rust": [4, 5], "cargo": 5, "manual": [5, 14, 20], "build_dir": 5, "d": 5, "non": 5, "differ": [6, 8], "variat": 6, "distutils_use_setuptool": 6, "entri": 6, "point": 6, "other": [6, 18], "runtim": [6, 7, 20], "pyproject": 6, "toml": [6, 16], "base": [6, 16, 18], "project": [6, 15], "In": 6, "v": [6, 7], "out": 6, "choos": [7, 21], "between": 7, "eclass": [7, 12], "overview": 7, "first": 7, "expert": [8, 18], "partial": 8, "restrict": 8, "implement": [8, 9, 11, 12, 15], "python_setup": 8, "disjoint": 8, "regular": 8, "combin": 8, "helper": 9, "fix": 9, "shebang": 9, "script": 9, "byte": [9, 19], "compil": [9, 19], "modul": [9, 19], "queri": 9, "inform": 9, "guid": [10, 13], "content": 10, "indic": 10, "tabl": 10, "life": 11, "cycl": 11, "stabil": 11, "guarante": 11, "altern": 11, "support": [11, 15], "backport": 11, "mainten": [12, 15], "note": 12, "specif": 12, "cpython": 12, "patchset": 12, "pypi": [12, 15, 21], "profil": 12, "chang": [12, 16], "port": [12, 15, 16], "initi": 12, "bootstrap": 12, "migrat": 13, "old": 13, "python_usedep": 13, "syntax": 13, "eapi": [13, 15], "7": 13, "8": [13, 16], "autotool": 14, "2": 15, "which": 15, "exist": 15, "can": 15, "co": 15, "maintain": 15, "monitor": 15, "releas": 15, "feed": 15, "check": [15, 19], "pip": 15, "repologi": 15, "routin": 15, "outdat": 15, "gpy": 15, "verifi": 15, "dep": 15, "tip": 16, "retroact": 16, "bpo43882": 16, "urlsplit": 16, "now": 16, "strip": 16, "lf": 16, "cr": 16, "ht": 16, "charact": 16, "3": 16, "11": 16, "gener": 16, "coroutin": 16, "remov": [12, 16], "asyncio": 16, "inspect": 16, "getargspec": 16, "formatargspec": 16, "10": 16, "configur": 16, "No": 16, "1": 16, "found": [16, 18], "sysconfig": 16, "9": 16, "base64": 16, "encodestr": 16, "decodestr": 16, "config": 16, "pkg": 16, "longer": 16, "librari": 16, "default": 16, "prefac": 17, "recip": 18, "skip": [18, 21], "marker": 18, "path": 18, "name": [15, 18], "avoid": 18, "runner": [18, 21], "xdist": 18, "plugin": 18, "explicitli": 18, "disabl": 18, "automat": 18, "autoload": 18, "entir": 18, "typeerror": 18, "_make_test_flaki": 18, "got": 18, "an": 18, "unexpect": 18, "keyword": 18, "rerun": 18, "importpathmismatcherror": 18, "fixtur": 18, "warn": [18, 19], "qa": 19, "improv": 19, "report": 19, "portag": 19, "bytecod": 19, "relat": 19, "strai": 19, "A": 20, "resolv": 21, "suit": [4, 21], "problem": 21, "correct": 21, "miss": 21, "file": [19, 21], "importerror": 21, "c": 21, "checklist": 21, "deal": 21, "failur": 21, "problemat": 21, "requir": 21, "internet": 21, "access": 21, "abort": 21, "due": 21, "assert": 21, "awai": [], "introduct": [], "tomllib": 16, "tomli": 16, "fallback": 16, "w": 16, "replac": 16, "prepar": 12, "polici": 15, "top": 19, "level": 19, "site": 19, "exampl": 19}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 57}, "alltitles": {"python-any-r1 \u2014 build-time dependency": [[0, "python-any-r1-build-time-dependency"]], "Basic use for unconditional Python": [[0, "basic-use-for-unconditional-python"], [20, "basic-use-for-unconditional-python"]], "Dependencies": [[0, "dependencies"], [14, "dependencies"], [20, "dependencies"], [5, "dependencies"]], "Conditional Python use": [[0, "conditional-python-use"], [14, "conditional-python-use"], [20, "conditional-python-use"]], "Additional conditional dependencies": [[0, "additional-conditional-dependencies"]], "Multiple sets of conditional dependencies": [[0, "multiple-sets-of-conditional-dependencies"]], "Common basics": [[1, "common-basics"]], "PYTHON_COMPAT": [[1, "python-compat"]], "PYTHON_DEPS and PYTHON_REQUIRED_USE": [[1, "python-deps-and-python-required-use"]], "Python environment": [[1, "python-environment"]], "Dependencies in Python packages": [[1, "dependencies-in-python-packages"]], "The most common dependency types": [[1, "the-most-common-dependency-types"]], "Finding dependency lists from build systems": [[1, "finding-dependency-lists-from-build-systems"]], "Integration with build systems written in Python": [[2, "integration-with-build-systems-written-in-python"]], "Meson": [[2, "meson"]], "SCons": [[2, "scons"]], "Build-time use with no extra dependencies": [[2, "build-time-use-with-no-extra-dependencies"]], "Build-time use with extra dependencies": [[2, "build-time-use-with-extra-dependencies"]], "Single-impl package": [[2, "single-impl-package"], [2, "id1"]], "Single-impl package with conditional Python install": [[2, "single-impl-package-with-conditional-python-install"]], "Pure Python multi-impl package": [[2, "pure-python-multi-impl-package"]], "Hybrid python-r1 + SCons package": [[2, "hybrid-python-r1-scons-package"]], "waf": [[2, "waf"]], "Build-time use": [[2, "build-time-use"]], "Advanced concepts": [[3, "advanced-concepts"]], "Namespace packages": [[3, "namespace-packages"]], "Hierarchical package structure": [[3, "hierarchical-package-structure"]], "Namespace package structure": [[3, "namespace-package-structure"]], "Determining whether namespaces are used": [[3, "determining-whether-namespaces-are-used"]], "Adding new namespace packages to Gentoo": [[3, "adding-new-namespace-packages-to-gentoo"]], "Legacy namespace packages in Gentoo": [[3, "legacy-namespace-packages-in-gentoo"]], "Advanced dependencies": [[4, "advanced-dependencies"]], "Requesting USE flags on the Python interpreter": [[4, "requesting-use-flags-on-the-python-interpreter"]], "Dependencies conditional to Python version": [[4, "dependencies-conditional-to-python-version"]], "Dependencies on CFFI and greenlet": [[4, "dependencies-on-cffi-and-greenlet"]], "Optional test suite dependencies on Rust packages": [[4, "optional-test-suite-dependencies-on-rust-packages"]], "distutils-r1 legacy concepts": [[6, "distutils-r1-legacy-concepts"]], "Different build system variations": [[6, "different-build-system-variations"]], "DISTUTILS_USE_SETUPTOOLS": [[6, "distutils-use-setuptools"]], "distutils and setuptools build systems": [[6, "distutils-and-setuptools-build-systems"]], "Setuptools\u2019 entry points": [[6, "setuptools-entry-points"]], "Other runtime uses of setuptools": [[6, "other-runtime-uses-of-setuptools"]], "pyproject.toml-based projects": [[6, "pyproject-toml-based-projects"]], "In-source vs out-of-source builds": [[6, "in-source-vs-out-of-source-builds"]], "Installing the package before testing": [[6, "installing-the-package-before-testing"]], "Choosing between Python eclasses": [[7, "choosing-between-python-eclasses"]], "Overview": [[7, "overview"]], "Build time vs runtime use": [[7, "build-time-vs-runtime-use"]], "Single-impl vs multi-impl": [[7, "single-impl-vs-multi-impl"]], "Python-first packages (distutils-r1 eclass)": [[7, "python-first-packages-distutils-r1-eclass"]], "Expert python-r1 usage": [[8, "expert-python-r1-usage"]], "Partially restricting Python implementation": [[8, "partially-restricting-python-implementation"]], "Restricting interpreters for python_setup": [[8, "restricting-interpreters-for-python-setup"]], "Disjoint build dependencies (any-r1 API)": [[8, "disjoint-build-dependencies-any-r1-api"]], "Using regular python-r1 API": [[8, "using-regular-python-r1-api"]], "Using any-r1 API with python-r1": [[8, "using-any-r1-api-with-python-r1"]], "Different sets of build-time dependencies": [[8, "different-sets-of-build-time-dependencies"]], "Using any-r1 API with distutils-r1": [[8, "using-any-r1-api-with-distutils-r1"]], "Combining any-r1 API with implementation restrictions": [[8, "combining-any-r1-api-with-implementation-restrictions"]], "Common helper functions": [[9, "common-helper-functions"]], "Install helpers": [[9, "install-helpers"]], "Fixing shebangs on installed scripts": [[9, "fixing-shebangs-on-installed-scripts"]], "Byte-compiling Python modules": [[9, "byte-compiling-python-modules"]], "Querying the implementation information": [[9, "querying-the-implementation-information"]], "Gentoo Python Guide": [[10, "gentoo-python-guide"]], "Contents:": [[10, null]], "Indices and tables": [[10, "indices-and-tables"]], "Python interpreters": [[11, "python-interpreters"]], "Versions of Python": [[11, "versions-of-python"]], "Life cycle of a Python implementation": [[11, "life-cycle-of-a-python-implementation"]], "Stability guarantees of Python implementations": [[11, "stability-guarantees-of-python-implementations"]], "Alternative Python implementations": [[11, "alternative-python-implementations"]], "Support for multiple implementations": [[11, "support-for-multiple-implementations"]], "Backports": [[11, "backports"]], "Migration guides": [[13, "migration-guides"]], "Migrating from old PYTHON_USEDEP syntax in python-single-r1": [[13, "migrating-from-old-python-usedep-syntax-in-python-single-r1"]], "Migrating from EAPI 7 to EAPI 8": [[13, "migrating-from-eapi-7-to-eapi-8"]], "Migrating to PEP 517 builds": [[13, "migrating-to-pep-517-builds"]], "python-r1 \u2014 multi-impl packages": [[14, "python-r1-multi-impl-packages"]], "Manual install": [[14, "manual-install"], [20, "manual-install"]], "Pure Python autotools package": [[14, "pure-python-autotools-package"]], "Additional build-time Python use": [[14, "additional-build-time-python-use"]], "Porting tips": [[16, "porting-tips"]], "Retroactive changes": [[16, "retroactive-changes"]], "bpo43882: urlsplit now strips LF, CR and HT characters": [[16, "bpo43882-urlsplit-now-strips-lf-cr-and-ht-characters"]], "Python 3.11": [[16, "python-3-11"]], "Generator-based coroutine removal (asyncio.coroutine)": [[16, "generator-based-coroutine-removal-asyncio-coroutine"]], "inspect.getargspec() and inspect.formatargspec() removal": [[16, "inspect-getargspec-and-inspect-formatargspec-removal"]], "Python 3.10": [[16, "python-3-10"]], "configure: No package \u2018python-3.1\u2019 found": [[16, "configure-no-package-python-3-1-found"]], "distutils.sysconfig deprecation": [[16, "distutils-sysconfig-deprecation"]], "Python 3.9": [[16, "python-3-9"]], "base64.encodestring / base64.decodestring removal": [[16, "base64-encodestring-base64-decodestring-removal"]], "Python 3.8": [[16, "python-3-8"]], "python-config and pkg-config no longer list Python library by default": [[16, "python-config-and-pkg-config-no-longer-list-python-library-by-default"]], "Replacing the toml package": [[16, "replacing-the-toml-package"]], "Porting to tomllib/tomli without toml fallback": [[16, "porting-to-tomllib-tomli-without-toml-fallback"]], "Porting to tomllib/tomli with toml fallback": [[16, "porting-to-tomllib-tomli-with-toml-fallback"]], "Porting to tomli-w": [[16, "porting-to-tomli-w"]], "Preface": [[17, "preface"]], "pytest recipes": [[18, "pytest-recipes"]], "Skipping tests based on markers": [[18, "skipping-tests-based-on-markers"]], "Skipping tests based on paths/names": [[18, "skipping-tests-based-on-paths-names"]], "Avoiding the dependency on pytest-runner": [[18, "avoiding-the-dependency-on-pytest-runner"]], "Using pytest-xdist to run tests in parallel": [[18, "using-pytest-xdist-to-run-tests-in-parallel"]], "Avoiding dependencies on other pytest plugins": [[18, "avoiding-dependencies-on-other-pytest-plugins"]], "Explicitly disabling automatic pytest plugins": [[18, "explicitly-disabling-automatic-pytest-plugins"]], "Expert: disabling plugin autoloading entirely": [[18, "expert-disabling-plugin-autoloading-entirely"]], "TypeError: _make_test_flaky() got an unexpected keyword argument \u2018reruns\u2019": [[18, "typeerror-make-test-flaky-got-an-unexpected-keyword-argument-reruns"]], "ImportPathMismatchError": [[18, "importpathmismatcherror"]], "fixture \u2018\u2026\u2019 not found": [[18, "fixture-not-found"]], "Warnings": [[18, "warnings"]], "python-single-r1 \u2014 single-impl packages": [[20, "python-single-r1-single-impl-packages"]], "A hybrid: build-time + conditional runtime": [[20, "a-hybrid-build-time-conditional-runtime"]], "Multiple USE conditions": [[20, "multiple-use-conditions"]], "Resolving test suite problems": [[21, "resolving-test-suite-problems"]], "Choosing the correct test runner": [[21, "choosing-the-correct-test-runner"]], "Missing test files in PyPI packages": [[21, "missing-test-files-in-pypi-packages"]], "ImportErrors for C extensions": [[21, "importerrors-for-c-extensions"]], "Checklist for dealing with test failures": [[21, "checklist-for-dealing-with-test-failures"]], "Skipping problematic tests": [[21, "skipping-problematic-tests"]], "Tests requiring Internet access": [[21, "tests-requiring-internet-access"]], "Tests aborting (due to assertions)": [[21, "tests-aborting-due-to-assertions"]], "Installing extra dependencies in test environment (PEP 517 mode)": [[21, "installing-extra-dependencies-in-test-environment-pep-517-mode"]], "Maintenance of Python implementations": [[12, "maintenance-of-python-implementations"]], "Notes specific to Python interpreters": [[12, "notes-specific-to-python-interpreters"]], "CPython patchsets": [[12, "cpython-patchsets"]], "PyPy": [[12, "pypy"]], "Adding a new Python implementation": [[12, "adding-a-new-python-implementation"]], "Eclass and profile changes": [[12, "eclass-and-profile-changes"], [12, "id1"]], "Porting initial packages": [[12, "porting-initial-packages"]], "Removing a Python implementation": [[12, "removing-a-python-implementation"]], "Preparation": [[12, "preparation"]], "Python build system bootstrap": [[12, "python-build-system-bootstrap"]], "Python package maintenance": [[15, "python-package-maintenance"]], "Package name policy": [[15, "package-name-policy"]], "Support for Python 2": [[15, "support-for-python-2"]], "Which implementations to test new packages for?": [[15, "which-implementations-to-test-new-packages-for"]], "Adding new Python implementations to existing packages": [[15, "adding-new-python-implementations-to-existing-packages"]], "Which packages can be (co-)maintained by the Python project?": [[15, "which-packages-can-be-co-maintained-by-the-python-project"]], "Porting packages to a new EAPI": [[15, "porting-packages-to-a-new-eapi"]], "Monitoring new package versions": [[15, "monitoring-new-package-versions"]], "PyPI release feeds": [[15, "pypi-release-feeds"]], "Checking via pip": [[15, "checking-via-pip"]], "Repology": [[15, "repology"]], "Routine checks on installed Python packages": [[15, "routine-checks-on-installed-python-packages"]], "pip check": [[15, "pip-check"]], "pip list --outdated": [[15, "pip-list-outdated"]], "gpy-verify-deps": [[15, "gpy-verify-deps"]], "QA checks and warnings": [[19, "qa-checks-and-warnings"]], "Improved QA warning reporting in Portage": [[19, "improved-qa-warning-reporting-in-portage"]], "Compiled bytecode-related warnings": [[19, "compiled-bytecode-related-warnings"]], "Modules are not byte-compiled": [[19, "modules-are-not-byte-compiled"]], "Stray compiled bytecode": [[19, "stray-compiled-bytecode"]], "Stray top-level files in site-packages": [[19, "stray-top-level-files-in-site-packages"]], "Example or test packages installed by setuptools": [[19, "example-or-test-packages-installed-by-setuptools"]], "Documentation files installed by Poetry": [[19, "documentation-files-installed-by-poetry"]], "distutils-r1 \u2014 standard Python build systems": [[5, "distutils-r1-standard-python-build-systems"]], "The PEP 517 and legacy modes": [[5, "the-pep-517-and-legacy-modes"]], "Basic use (PEP 517 mode)": [[5, "basic-use-pep-517-mode"]], "Source archives": [[5, "source-archives"]], "python-single-r1 variant": [[5, "python-single-r1-variant"]], "PEP 517 build systems": [[5, "pep-517-build-systems"]], "Deprecated PEP 517 backends": [[5, "deprecated-pep-517-backends"]], "flit.buildapi": [[5, "flit-buildapi"]], "poetry.masonry.api": [[5, "poetry-masonry-api"]], "setuptools.build_meta:__legacy__": [[5, "setuptools-build-meta-legacy"]], "setuptools_scm (flit_scm, hatch-vcs) and snapshots": [[5, "setuptools-scm-flit-scm-hatch-vcs-and-snapshots"]], "Packages using Cython": [[5, "packages-using-cython"]], "Parallel build race conditions": [[5, "parallel-build-race-conditions"]], "Sub-phase functions": [[5, "sub-phase-functions"]], "python_prepare": [[5, "python-prepare"]], "python_configure": [[5, "python-configure"]], "python_compile": [[5, "python-compile"]], "python_test": [[5, "python-test"]], "python_install": [[5, "python-install"]], "Passing arguments to setup.py": [[5, "passing-arguments-to-setup-py"]], "Calling custom setup.py commands": [[5, "calling-custom-setup-py-commands"]], "Enabling tests": [[5, "enabling-tests"]], "Using distutils_enable_tests": [[5, "using-distutils-enable-tests"]], "Adding more test dependencies": [[5, "adding-more-test-dependencies"]], "Installing the package before running tests": [[5, "installing-the-package-before-running-tests"]], "Undesirable test dependencies": [[5, "undesirable-test-dependencies"]], "Customizing the test phase": [[5, "customizing-the-test-phase"]], "Customizing the test phase for pytest": [[5, "customizing-the-test-phase-for-pytest"]], "Running tests with virtualx": [[5, "running-tests-with-virtualx"]], "Building documentation via Sphinx": [[5, "building-documentation-via-sphinx"]], "Basic documentation with autodoc": [[5, "basic-documentation-with-autodoc"]], "Additional Sphinx extensions": [[5, "additional-sphinx-extensions"]], "Sphinx without autodoc or extensions": [[5, "sphinx-without-autodoc-or-extensions"]], "Packages with optional Python build system usage": [[5, "packages-with-optional-python-build-system-usage"]], "Packages with Rust extensions (using Cargo)": [[5, "packages-with-rust-extensions-using-cargo"]], "Installing packages without a PEP 517 build backend": [[5, "installing-packages-without-a-pep-517-build-backend"]], "Installing packages manually into BUILD_DIR": [[5, "installing-packages-manually-into-build-dir"]], "Installing packages manually into D": [[5, "installing-packages-manually-into-d"]], "Integrating with a non-PEP 517 build system": [[5, "integrating-with-a-non-pep-517-build-system"]]}, "indexentries": {"cython": [[5, "index-6"]], "distutils_args": [[5, "index-17"]], "distutils_deps": [[5, "index-23"]], "distutils_optional": [[5, "index-24"]], "distutils_single_impl": [[5, "index-0"]], "distutils_use_pep517": [[5, "index-1"]], "rust": [[5, "index-25"]], "setuptools_scm_pretend_version": [[5, "index-2"]], "distutils_enable_sphinx": [[5, "index-22"]], "distutils_enable_tests": [[5, "index-19"]], "epytest": [[5, "index-20"]], "esetup.py": [[5, "index-18"]], "flit_scm": [[5, "index-3"]], "hatch-vcs": [[5, "index-4"]], "python_compile": [[5, "index-11"]], "python_compile_all": [[5, "index-12"]], "python_configure": [[5, "index-9"]], "python_configure_all": [[5, "index-10"]], "python_install": [[5, "index-15"]], "python_install_all": [[5, "index-16"]], "python_prepare": [[5, "index-7"]], "python_prepare_all": [[5, "index-8"]], "python_test": [[5, "index-13"]], "python_test_all": [[5, "index-14"]], "setuptools_scm": [[5, "index-5"]], "virtx": [[5, "index-21"]]}}) \ No newline at end of file
+Search.setIndex({"docnames": ["any", "basic", "buildsys", "concept", "depend", "distutils", "distutils-legacy", "eclass", "expert-multi", "helper", "index", "interpreter", "interpreter-maintenance", "migration", "multi", "package-maintenance", "porting", "preface", "pytest", "qawarn", "single", "test"], "filenames": ["any.rst", "basic.rst", "buildsys.rst", "concept.rst", "depend.rst", "distutils.rst", "distutils-legacy.rst", "eclass.rst", "expert-multi.rst", "helper.rst", "index.rst", "interpreter.rst", "interpreter-maintenance.rst", "migration.rst", "multi.rst", "package-maintenance.rst", "porting.rst", "preface.rst", "pytest.rst", "qawarn.rst", "single.rst", "test.rst"], "titles": ["python-any-r1 \u2014 build-time dependency", "Common basics", "Integration with build systems written in Python", "Advanced concepts", "Advanced dependencies", "distutils-r1 \u2014 standard Python build systems", "distutils-r1 legacy concepts", "Choosing between Python eclasses", "Expert python-r1 usage", "Common helper functions", "Gentoo Python Guide", "Python interpreters", "Maintenance of Python implementations", "Migration guides", "python-r1 \u2014 multi-impl packages", "Python package maintenance", "Porting tips", "Preface", "pytest recipes", "QA checks and warnings", "python-single-r1 \u2014 single-impl packages", "Tests in Python packages"], "terms": {"The": [0, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21], "eclass": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 13, 14, 17, 18, 20, 21], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], "enabl": [0, 4, 6, 7, 8, 10, 11, 12, 14, 15, 18, 19, 21], "support": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 13, 14, 16, 17, 18, 19, 20, 21], "packag": [0, 8, 9, 10, 11, 13, 17, 18], "need": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21], "pure": [0, 5, 6, 7, 8, 10, 11, 15], "refer": [0, 1, 5, 9, 11, 13, 14, 17, 19, 20], "5": [0, 2, 5, 7, 8, 9, 11, 14, 15, 16, 18, 20, 21], "defin": [0, 1, 5, 6, 11, 20, 21], "featur": [0, 4, 5, 6, 7, 8, 11, 12, 13, 19, 20, 21], "thi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "pkg_setup": [0, 1, 2, 8, 20], "phase": [0, 1, 3, 6, 7, 8, 9, 10, 13, 14, 15, 19, 20], "It": [0, 1, 3, 4, 5, 6, 9, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21], "normal": [0, 3, 5, 8, 9, 14, 15, 16, 19, 20, 21], "call": [0, 1, 2, 3, 6, 7, 8, 9, 10, 11, 13, 14, 16, 18, 19, 20, 21], "python_setup": [0, 1, 2, 10, 13, 14, 20], "function": [0, 1, 4, 6, 7, 8, 10, 11, 13, 14, 16, 19, 20, 21], "order": [0, 1, 2, 4, 5, 7, 9, 12, 13, 14, 15, 20, 21], "find": [0, 2, 3, 4, 6, 14, 15, 18, 19, 21], "suitabl": [0, 7, 9, 14, 17], "interpret": [0, 1, 2, 5, 6, 7, 9, 10, 13, 14, 15, 16, 18, 19, 20], "global": [0, 1, 5, 8, 13, 14, 18, 20, 21], "environ": [0, 5, 6, 10, 11, 13, 14, 16, 18, 20], "appropri": [0, 2, 4, 5, 6, 7, 9, 11, 12, 15, 20, 21], "mean": [0, 1, 2, 5, 7, 8, 11, 15, 16, 18, 20, 21], "most": [0, 3, 5, 6, 9, 11, 12, 13, 14, 15, 17, 18, 19, 20, 21], "trivial": [0, 5, 12, 16, 20], "an": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 19, 20, 21], "autotool": [0, 5, 6, 10, 16, 20], "compat": [0, 1, 2, 4, 5, 6, 7, 9, 11, 13, 16, 20], "system": [0, 3, 7, 8, 9, 10, 13, 14, 15, 17, 19, 20, 21], "could": [0, 2, 3, 5, 6, 8, 9, 15, 16, 19, 20], "look": [0, 1, 6, 8, 16, 18, 19, 20, 21], "like": [0, 2, 4, 5, 6, 8, 11, 15, 16, 19, 20, 21], "follow": [0, 1, 3, 4, 5, 6, 8, 9, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21], "copyright": [0, 2, 4, 5, 6, 8, 14, 20, 21], "1999": [0, 2, 4, 5, 6, 8, 14, 20, 21], "2020": [0, 2, 4, 5, 6, 8, 13, 14, 16, 20, 21], "gentoo": [0, 1, 2, 4, 5, 6, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21], "author": [0, 2, 4, 5, 6, 8, 9, 10, 12, 14, 19, 20, 21], "distribut": [0, 2, 4, 5, 6, 8, 14, 15, 16, 17, 19, 20, 21], "under": [0, 1, 2, 3, 4, 5, 6, 8, 14, 20, 21], "term": [0, 2, 4, 5, 6, 8, 14, 20, 21], "gnu": [0, 2, 4, 5, 6, 8, 14, 20, 21], "gener": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 18, 19, 20, 21], "public": [0, 2, 4, 5, 6, 8, 11, 14, 20, 21], "licens": [0, 2, 4, 5, 6, 8, 10, 14, 19, 20, 21], "v2": [0, 2, 4, 5, 6, 8, 14, 20, 21], "eapi": [0, 2, 4, 5, 6, 8, 10, 14, 20, 21], "7": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 14, 15, 16, 18, 19, 20, 21], "python_compat": [0, 2, 4, 5, 6, 8, 10, 11, 12, 14, 15, 20, 21], "python3_": [0, 1, 2, 4, 5, 6, 8, 12, 20, 21], "6": [0, 1, 2, 4, 5, 6, 8, 11, 12, 14, 15, 16, 18, 20, 21], "8": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 15, 19, 20, 21], "inherit": [0, 1, 2, 4, 5, 6, 7, 8, 9, 13, 14, 16, 18, 20, 21], "descript": [0, 2, 4, 5, 6, 8, 14, 20, 21], "A": [0, 1, 2, 4, 6, 7, 8, 10, 11, 15, 18, 19], "repositori": [0, 5, 6, 12, 15, 19], "data": [0, 2, 5, 6, 9, 16, 20, 21], "file": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 20], "describ": [0, 5, 6, 8, 9, 15, 19], "media": [0, 2, 8], "player": [0, 4], "capabl": 0, "homepag": [0, 2, 4, 5, 6, 8, 14, 15, 20, 21], "http": [0, 2, 4, 5, 6, 8, 9, 12, 14, 16, 19, 20, 21], "cgit": 0, "freedesktop": 0, "org": [0, 2, 4, 5, 6, 8, 9, 12, 14, 19, 20, 21], "info": [0, 5, 6, 18], "src_uri": [0, 2, 4, 5, 6, 8, 14, 15, 20, 21], "www": [0, 2, 8, 14, 20], "softwar": [0, 1, 4, 8, 14, 15, 16, 21], "pn": [0, 2, 4, 5, 6, 8, 9, 14, 20, 21], "p": [0, 2, 4, 5, 6, 8, 14, 18, 20, 21], "tar": [0, 2, 4, 5, 6, 8, 12, 14, 20, 21], "gz": [0, 2, 4, 5, 6, 8, 14, 20, 21], "bsd": [0, 2, 5, 6, 8, 14, 20], "slot": [0, 2, 4, 5, 6, 8, 11, 14, 20, 21], "0": [0, 2, 4, 5, 6, 8, 10, 11, 12, 14, 15, 16, 18, 19, 20, 21], "keyword": [0, 2, 4, 5, 6, 8, 10, 14, 16, 20, 21], "alpha": [0, 2, 4, 5, 6, 8, 11, 14, 20, 21], "amd64": [0, 2, 4, 5, 6, 8, 12, 14, 20, 21], "arm": [0, 2, 4, 5, 6, 8, 20, 21], "arm64": [0, 2, 4, 5, 6, 8, 14, 20, 21], "hppa": [0, 2, 4, 5, 6, 8, 14, 20, 21], "ia64": [0, 2, 4, 5, 6, 8, 14, 20, 21], "mip": [0, 2, 4, 5, 6, 8, 20, 21], "ppc": [0, 2, 4, 5, 6, 8, 14, 20, 21], "ppc64": [0, 2, 4, 5, 6, 8, 14, 20, 21], "sh": [0, 2, 4, 5, 6, 8, 12, 20, 21], "sparc": [0, 2, 4, 5, 6, 8, 14, 20, 21], "x86": [0, 2, 4, 5, 6, 8, 12, 14, 20, 21], "ius": [0, 2, 4, 5, 8, 14, 20, 21], "rdepend": [0, 1, 2, 4, 5, 6, 8, 13, 14, 20, 21], "virtual": [0, 2, 8, 14], "udev": 0, "208": 0, "bdepend": [0, 1, 2, 4, 5, 6, 8, 12, 14, 18, 20, 21], "python_dep": [0, 2, 4, 5, 8, 10, 14, 20], "pkgconfig": [0, 2, 8, 14], "ebuild": [0, 1, 4, 5, 6, 7, 9, 11, 12, 13, 14, 15, 16, 17, 19, 20, 21], "demonstr": [0, 5, 20], "absolut": [0, 1, 9, 15, 20, 21], "minimum": [0, 15, 20], "work": [0, 3, 5, 6, 7, 8, 9, 11, 12, 13, 15, 16, 18, 20, 21], "code": [0, 1, 3, 5, 6, 7, 8, 9, 11, 13, 14, 16, 18, 19, 20, 21], "onli": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 14, 15, 16, 18, 19, 20, 21], "three": [0, 1, 3, 9, 13, 16, 19], "highlight": [0, 16, 20], "line": [0, 3, 5, 13, 15, 16, 20, 21], "ar": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21], "specif": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 18, 19, 20, 21], "plu": [0, 20], "implicitli": [0, 3, 5, 8, 12, 19, 20, 21], "export": [0, 1, 2, 5, 20], "when": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21], "other": [0, 1, 2, 3, 4, 5, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 20, 21], "declar": [0, 1, 2, 5, 6, 8, 9, 11, 14, 18, 20, 21], "ensur": [0, 1, 4, 5, 6, 9, 12, 14, 19, 20], "would": [0, 2, 4, 5, 7, 11, 12, 14, 15, 16, 20, 21], "built": [0, 1, 3, 5, 6, 7, 8, 11, 12, 14, 16, 17, 20, 21], "against": [0, 4, 7, 9, 11, 12, 14, 15, 20, 21], "implement": [0, 1, 3, 4, 5, 6, 7, 10, 14, 16, 17, 18, 19, 20, 21], "specifi": [0, 1, 2, 5, 6, 7, 8, 14, 15, 18, 19, 20, 21], "get": [0, 5, 6, 12, 13, 18, 21], "replac": [0, 5, 6, 10, 11, 13, 15], "python_gen_any_dep": [0, 2, 8], "match": [0, 2, 4, 5, 6, 8, 9, 11, 12, 15, 19, 20], "python_check_dep": [0, 2, 8], "accept": [0, 1, 4, 5, 6, 9, 12, 15, 16, 18, 19], "templat": [0, 2, 4, 5, 15, 19, 20], "where": [0, 3, 5, 6, 9, 11, 12, 14, 16, 20, 21], "liter": [0, 4, 20], "python_usedep": [0, 2, 4, 5, 8, 10, 12, 14, 15, 18, 20, 21], "substitut": [0, 4, 20], "requir": [0, 1, 2, 3, 4, 5, 7, 8, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20], "all": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21], "same": [0, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21], "least": [0, 5, 8, 15, 19, 21], "one": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 16, 17, 18, 19, 20, 21], "test": [0, 1, 2, 3, 7, 8, 10, 11, 12, 13, 16, 17, 20], "whether": [0, 1, 4, 5, 6, 7, 15, 18, 20, 21], "question": [0, 1, 5, 7, 14, 18, 21], "In": [0, 1, 2, 3, 4, 5, 7, 8, 10, 11, 12, 14, 15, 16, 18, 19, 20, 21], "particular": [0, 1, 4, 5, 6, 11, 15, 21], "verifi": [0, 1, 5, 6, 8, 13, 19, 21], "branch": [0, 11, 16, 21], "wa": [0, 4, 5, 11, 12, 13, 16, 18, 19, 21], "satisfi": [0, 1, 8, 12], "were": [0, 2, 3, 5, 8, 11, 12, 13, 16, 19], "instal": [0, 1, 3, 4, 7, 8, 10, 11, 12, 13, 16, 18], "current": [0, 5, 6, 11, 12, 13, 15, 18, 21], "For": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 18, 19, 21], "purpos": [0, 6, 9, 12, 14, 16, 20, 21], "variabl": [0, 1, 5, 6, 8, 13, 14, 16, 18, 20, 21], "string": [0, 1, 4, 5, 8, 14, 16, 20], "best": [0, 7, 12, 16, 17, 18], "explain": [0, 1, 6, 19], "exampl": [0, 4, 5, 6, 7, 8, 9, 11, 12, 15, 16, 17, 18, 20, 21], "meson": [0, 4, 5, 7, 10, 15], "manag": [0, 4, 6, 8, 9, 19, 21], "cinnamon": 0, "fork": [0, 11, 12, 15, 21], "from": [0, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 14, 15, 16, 18, 19, 20, 21], "nautilu": 0, "develop": [0, 1, 7, 11, 15, 17, 18, 21], "linuxmint": 0, "com": [0, 2, 4, 5, 6, 8, 12, 14, 16, 21], "project": [0, 1, 5, 8, 9, 10, 14, 17, 18, 19, 21], "html": [0, 5, 8, 19, 21], "github": [0, 2, 4, 5, 6, 8, 12, 14, 17, 20, 21], "nemo": 0, "archiv": [0, 2, 4, 10, 20, 21], "pv": [0, 2, 4, 5, 8, 14, 20, 21], "gpl": [0, 2, 4, 8, 14, 20], "2": [0, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 20, 21], "lgpl": [0, 2, 14, 20, 21], "fdl": [0, 20], "1": [0, 2, 3, 4, 5, 6, 8, 9, 15, 18, 19, 20, 21], "dev": [0, 1, 2, 3, 4, 5, 6, 7, 8, 11, 12, 13, 14, 15, 18, 19, 20, 21], "polib": 0, "pygobject": [0, 14], "3": [0, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 20, 21], "python_has_vers": [0, 2, 8], "provid": [0, 1, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 21], "its": [0, 1, 2, 3, 5, 6, 7, 8, 11, 12, 15, 16, 18, 21], "both": [0, 1, 3, 4, 5, 6, 7, 8, 12, 13, 16, 17, 18, 19, 20, 21], "have": [0, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 14, 15, 16, 18, 19, 20, 21], "dep": [0, 5, 13, 18], "true": [0, 1, 2, 5, 6, 8, 12, 13, 16, 21], "them": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 15, 16, 18, 19, 20, 21], "while": [0, 2, 3, 4, 5, 6, 7, 8, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21], "which": [0, 6, 9, 10, 11, 14, 21], "wrapper": [0, 1, 6, 9, 13, 14, 21], "help": [0, 15, 17, 21], "take": [0, 1, 2, 4, 5, 6, 7, 8, 9, 15, 16, 18, 21], "singl": [0, 1, 4, 6, 9, 10, 14, 15, 16, 18, 19, 21], "option": [0, 1, 3, 6, 8, 10, 13, 15, 18, 19, 20, 21], "class": [0, 1, 5, 16, 18], "flag": [0, 1, 5, 7, 8, 9, 10, 11, 12, 14, 15, 20, 21], "more": [0, 1, 3, 4, 5, 7, 9, 11, 12, 13, 15, 16, 18, 19, 20], "similarli": [0, 1, 5, 15], "has_vers": [0, 4, 12], "root": [0, 5, 6, 13, 20, 21], "can": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 19, 20, 21], "b": 0, "d": [0, 2, 3, 8, 9, 14, 18], "r": [0, 2, 5, 9, 16, 21], "idepend": 0, "pdepend": [0, 2, 8, 12], "pass": [0, 6, 8, 9, 10, 12, 13, 16, 18, 21], "assum": [0, 1, 4, 5, 6, 9, 13, 15, 20], "verbos": [0, 15, 19, 21], "print": [0, 3, 8, 14, 18, 21], "check": [0, 5, 6, 9, 10, 12, 13, 16, 17, 21], "perform": [0, 2, 5, 6, 11, 12, 14, 19, 20, 21], "result": [0, 5, 6, 8, 9, 12, 15, 16, 17, 18, 19, 21], "return": [0, 2, 8, 16, 19, 21], "success": 0, "found": [0, 1, 3, 5, 6, 9, 10, 11, 12, 15, 19, 21], "fals": [0, 2, 5, 8, 12, 15, 16], "otherwis": [0, 6, 7, 8, 9], "note": [0, 1, 4, 5, 6, 8, 9, 10, 11, 13, 14, 15, 16, 18, 19, 20, 21], "invoc": [0, 5, 18, 19], "chain": 0, "abov": [0, 1, 6, 8, 12, 13, 15, 19, 20, 21], "also": [0, 1, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 18, 19, 21], "written": [0, 1, 5, 7, 10, 11, 16, 18], "import": [0, 1, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 18], "understand": 0, "correctli": [0, 1, 5, 6, 7, 9, 11, 12, 13, 15, 16, 21], "exactli": [0, 7], "furthermor": [0, 2, 5], "combin": [0, 2, 5, 10, 11, 12, 13, 16, 17, 18, 20, 21], "must": [0, 1, 2, 3, 5, 6, 7, 8, 11, 15, 16, 18, 20, 21], "onc": [0, 5, 8, 11, 12, 19], "invalid": [0, 16], "split": [0, 5, 13, 16], "some": [0, 1, 2, 3, 4, 5, 6, 7, 8, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21], "necessari": [0, 2, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15, 16, 18, 20, 21], "particularli": [0, 5, 6, 7, 11, 13, 15, 18, 21], "common": [0, 3, 5, 6, 7, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21], "suit": [0, 1, 2, 5, 6, 7, 8, 9, 10, 12, 18, 21], "case": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 18, 19, 20], "wrap": [0, 5, 6, 9, 13, 21], "programm": [0, 15], "complet": [0, 5, 16, 17, 19, 21], "bash": [0, 5, 7, 8, 9, 20, 21], "scop": 0, "releas": [0, 2, 5, 8, 11, 12, 14, 16, 19], "download": [0, 2, 5, 8, 14], "xz": [0, 4, 12, 14, 20], "s390": [0, 2, 4, 5, 6, 8, 20, 21], "linux": [0, 2, 4, 5, 6, 8, 9, 14, 16, 20, 21], "maco": [0, 4, 6, 8, 20, 21], "x64": [0, 4, 6, 8, 20, 21], "m68k": [0, 4, 5, 6, 8, 20, 21], "mint": 0, "solari": [0, 6, 20, 21], "sparc64": [0, 6], "restrict": [0, 2, 4, 5, 10, 18, 19, 20, 21], "app": [0, 2, 4, 5, 8, 12, 14, 15, 19, 21], "shell": [0, 8, 14, 21], "4": [0, 3, 5, 8, 9, 10, 11, 12, 14, 15, 21], "3_p30": 0, "pexpect": [0, 21], "pytest": [0, 4, 5, 8, 10, 12, 15], "r1_pkg_setup": [0, 2, 20], "anoth": [0, 8, 9, 14, 15, 16, 18, 19, 21], "possibl": [0, 2, 4, 5, 8, 9, 12, 14, 16, 17, 18, 21], "uncondition": [0, 1, 2, 4, 5, 6, 8, 11, 19, 20, 21], "condition": [0, 1, 2, 4, 5, 11, 12, 14, 15, 18, 20], "simplest": [0, 2, 5, 7, 14, 18, 21], "wai": [0, 5, 6, 9, 12, 13, 15, 18, 21], "achiev": [0, 8, 11, 16], "block": [0, 8, 13, 21], "express": [0, 8, 13, 20], "similar": [0, 2, 5, 14, 15, 19, 20, 21], "cmake": [0, 5, 6, 20], "qt": 0, "bind": [0, 2, 5, 8, 14, 20], "telepathi": 0, "bu": 0, "protocol": [0, 2, 20], "dbu": [0, 2], "hardest": 0, "differ": [0, 1, 3, 5, 9, 10, 11, 15, 16, 18, 21], "do": [0, 1, 3, 4, 5, 6, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21], "error": [0, 2, 5, 9, 12, 13, 16, 18, 19, 21], "prone": 0, "move": [0, 4, 5, 12], "insid": [0, 1, 3, 5, 6, 9, 14, 18, 20, 21], "python3_6": [0, 2, 4, 8, 14], "gnome2": [0, 4, 14], "gobject": 0, "librari": [0, 1, 2, 3, 4, 8, 9, 11, 14, 20, 21], "access": [0, 5, 10, 11, 18], "secret": 0, "servic": [0, 15, 21], "api": [0, 2, 5, 9, 10, 11, 13, 14, 16], "wiki": [0, 4, 8, 9, 12, 14, 17], "gnome": [0, 4, 14], "libsecret": 0, "apach": [0, 2, 4, 5, 8, 21], "introspect": 0, "fail": [0, 1, 2, 5, 8, 9, 11, 12, 16, 18, 21], "bug": [0, 5, 6, 12, 19, 21], "655482": 0, "required_us": [0, 1, 2, 4, 5, 7, 8, 13, 14, 20], "mock": [0, 4, 8, 11, 12, 18, 21], "fi": [0, 2, 4, 5, 8, 12, 14, 20], "host": 0, "variou": [1, 5, 6, 9, 13, 16], "r1": [1, 3, 4, 9, 10, 12, 15, 19, 21], "try": [1, 6, 8, 9, 11, 16, 21], "design": [1, 20], "you": [1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21], "probabl": [1, 6, 8, 13, 20], "us": [1, 9, 10, 11, 12, 13, 15, 16, 19], "than": [1, 2, 3, 6, 7, 8, 11, 12, 15, 16, 17, 18, 19, 21], "so": [1, 4, 5, 6, 11, 15, 18, 20, 21], "worthwhil": [1, 21], "shortli": 1, "bit": [1, 12, 17], "well": [1, 5, 7, 8, 11, 13, 15, 19], "non": [1, 6, 7, 9, 12, 14, 16, 18, 21], "obviou": [1, 21], "between": [1, 5, 8, 10, 11, 13, 16], "befor": [1, 4, 5, 8, 9, 10, 12, 14, 16], "thei": [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21], "valid": [1, 5, 8, 15, 16, 19, 21], "valu": [1, 5, 6, 9, 13, 18, 21], "pythonx_i": 1, "cpython": [1, 4, 5, 9, 11, 13, 19], "x": [1, 5, 11, 16, 18, 21], "y": [1, 2, 11, 16], "pypy3": [1, 4, 5, 6, 8, 11, 12, 13, 15, 18, 19, 21], "typic": [1, 14], "ani": [1, 2, 3, 5, 6, 7, 10, 14, 16, 18, 19, 21], "respons": [1, 5], "explicitli": [1, 5, 7, 8, 10, 13, 19, 21], "put": [1, 8], "correct": [1, 5, 6, 7, 9, 10, 15, 18, 19, 20], "meant": [1, 13, 19], "consist": [1, 6, 9, 13, 14, 15], "cover": [1, 5, 6, 13, 21], "time": [1, 3, 4, 5, 6, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 21], "runtim": [1, 2, 3, 5, 8, 10, 13, 14, 15], "form": [1, 4, 12, 17], "doe": [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 14, 15, 16, 18, 19, 21], "appli": [1, 4, 5, 6, 7, 12, 15, 18, 19, 20, 21], "distutil": [1, 3, 4, 9, 10, 13, 14, 18, 19, 20, 21], "assign": 1, "default": [1, 2, 5, 6, 7, 8, 9, 11, 13, 14, 15, 18, 19, 20, 21], "commonli": [1, 2, 3, 5, 6, 9, 11], "concept": [1, 5, 10], "state": 1, "enforc": [1, 4, 5, 7, 8, 11, 18, 21], "whenev": [1, 4, 9, 11, 14, 15, 18, 20, 21], "run": [1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 19], "two": [1, 5, 6, 8, 9, 11, 13, 16, 18, 19, 20], "being": [1, 3, 5, 6, 8, 9, 11, 12, 15, 16, 18, 21], "epython": [1, 2, 5, 8, 9, 12, 13, 18, 21], "contain": [1, 3, 4, 5, 6, 7, 12, 13, 15, 19], "": [1, 2, 4, 5, 6, 7, 8, 9, 13, 14, 15, 16, 18, 19, 20, 21], "basenam": 1, "identifi": 1, "e": [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21], "g": [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21], "python3": [1, 3, 5, 9, 11, 13, 15, 16, 18, 19, 21], "10": [1, 4, 5, 8, 10, 11, 12, 15, 19], "final": [1, 2, 4, 5, 9, 11, 13, 16, 20, 21], "path": [1, 3, 5, 6, 9, 10, 12, 13, 16, 19, 21], "usr": [1, 2, 3, 5, 7, 8, 9, 18, 19, 21], "bin": [1, 2, 5, 7, 8, 9, 12, 20, 21], "full": [1, 2, 4, 5, 13, 21], "should": [1, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "embed": [1, 2, 9, 11], "program": [1, 2, 5, 6, 11, 16, 18, 21], "shebang": [1, 10, 11, 21], "spawn": 1, "dure": [1, 5, 6, 7, 12, 13, 18, 19], "prefer": [1, 4, 5, 7, 8, 11, 12, 14, 15, 18, 21], "rather": [1, 6, 8, 12, 15, 16, 17, 18, 19, 21], "bypass": 1, "virtualenv": [1, 6, 12, 21], "creat": [1, 3, 4, 5, 6, 12, 13, 15, 16, 19, 21], "pep": [1, 3, 6, 7, 10, 12, 15, 16], "517": [1, 3, 6, 7, 10, 12], "mode": [1, 3, 6, 7, 10, 13, 16, 19], "mai": [1, 3, 4, 5, 6, 8, 11, 12, 13, 15, 16, 18, 21], "caus": [1, 4, 5, 8, 9, 13, 15, 18, 19, 21], "failur": [1, 5, 10, 11, 12, 18], "modul": [1, 3, 4, 5, 6, 7, 8, 10, 11, 14, 15, 16, 18, 21], "previou": [1, 5, 12, 13, 16], "version": [1, 2, 3, 5, 6, 7, 8, 10, 12, 13, 16, 17, 18, 21], "just": [1, 6, 11, 13, 21], "resolv": [1, 5, 6, 16, 18, 21], "problem": [1, 3, 4, 5, 6, 8, 12, 15, 16, 17, 18, 19, 21], "pythonn": 1, "tool": [1, 2, 5, 8, 14, 15, 16, 19, 21], "etc": 1, "via": [1, 2, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 18, 20, 21], "exec": [1, 8, 9, 11, 12, 21], "hardcod": [1, 12, 18], "either": [1, 2, 5, 8, 9, 11, 13, 18, 19, 21], "establish": [1, 13, 21], "local": [1, 2, 3, 4, 5, 8, 9, 12, 13, 14, 18, 19, 20, 21], "scope": [1, 4, 8, 13, 18, 21], "multi": [1, 5, 10, 13, 20], "impl": [1, 5, 10, 13], "python_foreach_impl": [1, 2, 8, 14], "sub": [1, 3, 7, 8, 10, 21], "setup": [1, 3, 6, 7, 10, 13, 15, 18, 19, 21], "done": [1, 5, 6, 8, 9, 14, 15, 18, 21], "directli": [1, 5, 6, 7, 9, 11, 13, 16, 18, 21], "section": [1, 5, 6, 7, 12, 15, 16, 19, 21], "focu": [1, 7, 12, 14], "often": [1, 5, 12, 21], "extern": [1, 2, 5, 6, 7, 11, 12, 21], "languag": [1, 2, 5, 11, 15], "usual": [1, 3, 4, 5, 7, 11, 13, 15, 16, 18, 19, 21], "rule": [1, 2, 6, 7, 8, 13, 14, 15], "classifi": [1, 6], "categori": [1, 15], "present": [1, 5, 6, 15, 19], "script": [1, 2, 5, 6, 7, 8, 10, 11, 12, 14, 16, 20], "usabl": [1, 11], "whose": [1, 5], "therefor": [1, 2, 5, 6, 7, 8, 11, 12, 15, 18, 19], "howev": [1, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 15, 16, 18, 19, 20, 21], "modern": [1, 4, 5, 6, 11, 12, 18, 21], "base": [1, 4, 5, 7, 8, 10, 12, 14, 15, 20, 21], "entri": [1, 5, 12, 18, 19], "point": [1, 5, 11, 13, 15, 18, 21], "refus": [1, 4, 11], "place": [1, 6, 11, 12, 19], "special": [1, 3, 4, 5, 6, 16, 21], "subclass": 1, "extra": [1, 5, 6, 10], "still": [1, 5, 6, 8, 11, 13, 16, 19, 21], "meaningfulli": 1, "handl": [1, 4, 5, 6, 8, 13, 14, 15, 21], "gracefulli": [1, 4, 8], "subset": [1, 4, 5, 7, 8, 11, 12, 14, 15, 19, 21], "without": [1, 4, 10, 11, 13, 14, 15, 18, 21], "There": [1, 3, 5, 8, 9, 15, 16, 18, 19, 21], "multipl": [1, 3, 4, 5, 7, 10, 14, 15, 17, 18, 19, 21], "approach": [1, 5, 7, 8, 12, 16], "ad": [1, 5, 7, 10, 11, 13, 14, 18], "consid": [1, 2, 3, 6, 7, 8, 11, 12, 14, 15, 16, 19], "light": 1, "enough": [1, 11, 21], "inform": [1, 3, 6, 10, 13, 16, 19, 21], "messag": [1, 5, 21], "pkg_postinst": [1, 5], "util": [1, 2, 4, 5, 7, 8, 9, 12, 15, 18, 19, 20, 21], "optfeatur": 1, "cheap": 1, "rebuild": [1, 6, 11], "includ": [1, 2, 3, 4, 5, 6, 7, 9, 11, 12, 15, 16, 17, 18, 19, 20, 21], "__init__": [1, 3, 5, 9, 18, 19, 21], "py": [1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 18, 19, 21], "As": [1, 3, 5, 6, 7, 8, 11, 12, 13, 15, 16, 18, 20, 21], "thumb": [1, 6, 7, 13, 15], "belong": [1, 21], "care": [1, 2, 5, 7, 9, 15, 21], "addit": [1, 2, 4, 6, 8, 9, 10, 11, 12, 13, 15, 18, 21], "plugin": [1, 3, 5, 6, 8, 10, 21], "setuptools_scm": [1, 10, 21], "document": [1, 2, 7, 8, 10, 11, 14, 17, 21], "former": [1, 5, 7, 8, 13, 16, 21], "runner": [1, 5, 7, 10], "sinc": [1, 2, 3, 5, 6, 7, 11, 12, 13, 15, 16, 18, 21], "sometim": [1, 4, 5, 6, 7, 9, 11, 18, 21], "These": [1, 6, 7, 11, 12, 13, 15, 18, 21], "go": [1, 2, 8, 17, 18], "doc": [1, 2, 5, 8, 20], "respect": [1, 3, 4, 5, 12, 14, 15, 18, 19], "maximum": [1, 5], "coverag": [1, 5, 15, 18, 21], "further": [1, 18], "guid": [1, 3, 5, 16, 17, 19], "linter": 1, "report": [1, 6, 9, 10, 12, 15, 21], "actual": [1, 5, 6, 8, 9, 11, 12, 15, 18, 21], "undesir": [1, 5, 10, 18], "again": [1, 2, 15, 21], "conveni": [1, 4, 5, 6, 7, 18, 19, 21], "add": [1, 2, 5, 6, 8, 12, 15, 19, 20, 21], "sphinx": [1, 3, 6, 7, 8, 10, 12, 15], "copi": [1, 3, 5, 6, 9, 11, 15, 19, 20, 21], "c": [1, 2, 5, 6, 8, 9, 10, 11, 14], "extens": [1, 6, 7, 8, 9, 10, 11, 14, 15, 16], "header": [1, 9], "numpi": [1, 2], "If": [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21], "metadata": [1, 5, 6, 14, 15, 20], "pyproject": [1, 5, 7, 12, 19], "toml": [1, 5, 7, 10, 12, 19], "setuptool": [1, 3, 4, 5, 7, 8, 12, 13, 15, 18, 21], "cfg": [1, 3, 5, 6, 15, 18, 19], "custom": [1, 2, 6, 10, 13, 15, 16, 18, 19], "read": [1, 5, 16, 21], "name": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 16, 21], "uncondit": [1, 2, 5, 10, 13, 14, 15], "upstream": [1, 3, 4, 5, 6, 7, 9, 11, 12, 14, 15, 16, 18, 19, 21], "spuriou": 1, "strip": [1, 3, 5, 11, 15, 18, 21], "ommit": 1, "kei": [1, 5, 16, 18, 19, 20], "kind": [1, 3, 5, 7, 9, 11, 21], "621": 1, "older": [1, 11, 15], "flit": [1, 5, 6, 12, 13], "poetri": [1, 5, 6, 13], "indic": [1, 5, 6, 11, 12, 13, 15, 18, 19, 21], "install_requir": [1, 3, 5, 6], "group": [1, 2, 6, 13, 15, 18], "extras_requir": [1, 5], "setup_requir": [1, 5, 18], "deprec": [1, 3, 5, 10, 11, 13, 21], "tests_requir": [1, 5], "tox": [1, 5, 21], "ini": [1, 5, 18, 21], "noxfil": 1, "python_requir": 1, "besid": [2, 6, 11, 14, 18, 19], "few": [2, 4, 6, 12, 18, 21], "make": [2, 3, 4, 5, 6, 7, 11, 12, 13, 15, 16, 18, 19, 20, 21], "proper": [2, 8], "fairli": [2, 15, 20], "recent": [2, 3, 5, 15, 21], "agnost": 2, "henc": [2, 5, 14], "treat": [2, 18], "arbitrari": [2, 13], "ha": [2, 3, 5, 6, 7, 11, 12, 13, 14, 15, 16, 18, 19, 21], "gain": [2, 18], "quit": [2, 4, 6, 11, 12], "At": [2, 5, 11, 15, 17, 19], "mani": [2, 5, 8, 12, 14, 15, 16, 19, 21], "old": [2, 4, 5, 6, 8, 10, 11, 12, 16, 21], "reason": [2, 4, 5, 6, 11, 18, 21], "suffici": [2, 5, 6, 7, 11, 14], "prior": [2, 3, 5, 6, 8, 11, 13, 16, 19, 21], "happen": [2, 3, 4, 6, 7, 8, 11, 20, 21], "natur": [2, 5, 8, 15], "sort": 2, "latter": [2, 5, 7, 8, 13, 15, 16, 18, 21], "set": [2, 4, 5, 6, 7, 10, 11, 12, 14, 15, 16, 18, 19, 20, 21], "much": [2, 5, 19, 21], "compon": [2, 3, 8, 11, 14, 16], "account": [2, 8, 11, 15, 21], "detail": [2, 7, 9, 11, 13, 16, 19, 21], "choic": [2, 6, 7, 13, 21], "chapter": [2, 5, 8, 9], "along": [2, 5, 6, 7, 11, 12, 13, 19, 20, 21], "toolchain": [2, 4, 8], "func": [2, 8], "commit": [2, 21], "6e5e8a57628095d8d0c8bbb38187afb0f3a42112": 2, "userspac": 2, "xbox": 2, "360": 2, "control": [2, 4, 5, 18], "driver": 2, "xboxdrv": 2, "gitlab": [2, 8], "io": [2, 4, 5, 8, 14, 20], "chewi": 2, "workdir": [2, 5], "lib": [2, 3, 5, 7, 9, 16, 18, 19, 21], "boost": [2, 7], "glib": 2, "sy": [2, 5, 8, 11, 14, 15, 16, 21], "libudev": 2, "libusb": 2, "x11": 2, "libx11": 2, "src_compil": [2, 5, 6, 8, 14], "escon": 2, "cxx": 2, "tc": [2, 9], "getcxx": 2, "getar": 2, "ranlib": 2, "getranlib": 2, "cxxflag": 2, "wall": 2, "linkflag": 2, "ldflag": [2, 5], "src_instal": [2, 5, 8, 9, 14, 20], "dobin": [2, 9], "doman": 2, "dodoc": [2, 5], "new": [2, 5, 6, 9, 10, 11, 13, 16, 18, 21], "readm": [2, 12, 19], "md": [2, 19], "todo": [2, 9, 12], "yourself": [2, 4, 21], "becaus": [2, 5, 6, 11, 15, 18, 19, 21], "cannot": [2, 4, 5, 9, 11, 21], "my_p": 2, "src": [2, 5, 9, 21], "_rc": 2, "rc": [2, 11], "high": [2, 4, 11, 12, 15, 20], "open": [2, 16], "sourc": [2, 3, 10, 12, 14, 17, 19, 21], "schema": [2, 15], "free": [2, 15, 21], "orient": [2, 16], "databas": [2, 4], "mongodb": [2, 4], "fastdl": 2, "sspl": 2, "acct": 2, "user": [2, 3, 5, 6, 7, 8, 11, 12, 15, 18, 20, 21], "arch": [2, 5, 8, 11, 12], "snappi": 2, "cpp": 2, "yaml": [2, 3], "70": 2, "thread": [2, 8, 18, 20, 21], "libpcr": 2, "42": 2, "zstd": 2, "snowbal": 2, "stemmer": 2, "net": [2, 8, 11, 14, 15, 20], "libpcap": 2, "zlib": 2, "11": [2, 5, 10, 12, 15, 21], "pymongo": 2, "cheetah3": 2, "psutil": 2, "pyyaml": 2, "type": [2, 3, 6, 13, 15, 16], "ncurs": [2, 14], "readlin": [2, 5, 8, 14], "admin": [2, 8], "mongo": 2, "src_configur": [2, 5, 8, 9, 13, 14, 20], "scons_opt": 2, "cc": [2, 9], "getcc": [2, 9], "disabl": [2, 5, 8, 10, 11, 12, 14, 20, 21], "warn": [2, 3, 5, 10, 16], "pcre": 2, "core": [2, 5, 19, 21], "src_test": [2, 5, 6, 14, 21], "buildscript": 2, "resmok": 2, "dbpathprefix": 2, "job": [2, 18], "makeopts_job": [2, 18], "die": [2, 3, 5, 8, 9, 14, 18, 21], "nostrip": [2, 8], "prefix": [2, 8, 9, 15, 16, 21], "ed": [2, 9, 15], "everyth": [2, 13, 19], "your": [2, 4, 5, 6, 7, 8, 11, 12, 15, 16, 18, 19, 21], "python2_7": [2, 5, 6, 8, 13, 14, 20, 21], "eutil": 2, "molecular": 2, "dynam": 2, "nmr": 2, "analysi": [2, 20], "relax": [2, 18], "gna": 2, "bz2": [2, 8, 20], "python_required_us": [2, 4, 5, 8, 10, 14, 20], "python_gen_cond_dep": [2, 4, 5, 8, 12, 13, 20, 21], "numdifftool": 2, "matplotlib": [2, 5, 20], "python2": [2, 8, 9, 13, 20], "wxpython": [2, 20], "wx_gtk_ver": [2, 20], "sci": [2, 5, 20], "chemistri": 2, "pymol": 2, "bmrblib": 2, "minfx": 2, "scipi": 2, "molmol": 2, "vmd": 2, "visual": 2, "grace": 2, "opendx": 2, "gfx": 2, "pngcrush": 2, "python_moduleinto": [2, 5, 9, 14], "python_domodul": [2, 5, 9, 12, 14, 20], "make_wrapp": [2, 9], "python_get_sitedir": [2, 3, 8, 9], "part": [2, 3, 4, 5, 8, 9, 12, 13, 14, 15, 18, 21], "That": [2, 16, 21], "fortran_need": 2, "fortran": 2, "fortran_standard": 2, "90": [2, 14], "object": [2, 11, 16, 20], "chemic": 2, "kinet": 2, "thermodynam": 2, "transport": 2, "cantera": 2, "v": [2, 4, 5, 10, 13, 14, 21], "pch": 2, "sundial": 2, "eigen": 2, "libfmt": 2, "cython": [2, 10, 14, 20], "2_pkg_setup": 2, "scons_var": 2, "cc_flag": 2, "cxx_flag": 2, "std": 2, "debug": 2, "getfc": 2, "fortranflag": 2, "optimize_flag": 2, "wno": 2, "inlin": [2, 7, 14], "renamed_shared_librari": 2, "use_pch": 2, "usex": [2, 5, 20], "system_fmt": 2, "system_sundi": 2, "system_eigen": 2, "env_var": 2, "extra_inc_dir": 2, "eigen3": 2, "scons_target": 2, "f90_interfac": 2, "n": [2, 16, 18], "python2_packag": 2, "none": [2, 5, 6, 16], "python3_packag": 2, "python3_cmd": 2, "els": [2, 8, 11, 16], "stage_dir": 2, "libdirnam": 2, "get_libdir": [2, 8], "python_optim": [2, 8, 9, 19], "deal": [2, 7, 8, 10, 15], "sens": 2, "plain": [2, 5, 6, 13], "loop": [2, 5, 18], "autom": 2, "pipelin": [2, 21], "poisson": 2, "boltzmann": 2, "electrostat": 2, "calcul": 2, "poissonboltzmann": 2, "apb": 2, "opal": 2, "openbabel": 2, "zsi": 2, "lang": [2, 8, 11, 12, 20], "swig": [2, 20], "src_prepar": [2, 3, 5, 8, 9, 14, 16, 18, 19], "f": [2, 9, 16], "pyc": [2, 9, 19], "o": [2, 5, 19], "pyo": [2, 9, 19], "delet": [2, 3, 14], "eappli": 2, "patch": [2, 4, 5, 6, 8, 11, 12, 19, 21], "eapply_us": 2, "rm": [2, 3, 5, 9], "rf": 2, "python_copy_sourc": [2, 14], "python_configur": 2, "cat": [2, 5], "build_dir": [2, 3, 9, 14, 21], "build_config": 2, "eof": [2, 5], "eprefix": [2, 5, 8, 9], "max_atom": 2, "10000": 2, "build_pdb2pka": 2, "rebuild_swig": 2, "run_in_build_dir": [2, 8, 14], "python_instal": [2, 3, 14], "cd": [2, 5, 9, 12, 21], "let": [2, 4, 8, 16, 20], "independ": [2, 4, 5, 6, 7, 14, 20], "separ": [2, 5, 6, 7, 8, 11, 14, 15, 16, 18, 21], "presum": 2, "manual": [2, 6, 10, 11, 12, 19], "wider": 2, "target": [2, 8, 9, 11, 12, 15, 20, 21], "rang": [2, 5, 12], "recommend": [2, 5, 7, 12, 13, 14, 15, 16, 18, 20, 21], "gp": [2, 8], "daemon": [2, 8], "usb": [2, 8], "serial": [2, 5, 8, 15], "devic": [2, 8], "map": [2, 5, 6, 8, 15, 18], "client": [2, 8, 9, 11, 14], "gpsd": [2, 8], "mirror": [2, 4, 5, 6, 8, 14, 20, 21], "nongnu": [2, 8], "24": [2, 8, 18, 21], "misc": [2, 8], "pp": [2, 8], "20120407": [2, 8], "myesconsarg": [2, 8], "libdir": [2, 8, 9], "udevdir": [2, 8], "get_udevdir": [2, 8], "chrpath": [2, 8], "gpsd_user": [2, 8], "gpsd_group": [2, 8], "uucp": [2, 8], "manbuild": [2, 8], "use_scon": [2, 8], "sconstruct": [2, 8], "py2": [2, 8, 21], "construct": [2, 4, 8, 20], "pkg_config": 2, "shlinkflag": 2, "destdir": [2, 8, 9, 19], "bundl": [2, 5, 12], "simpl": [2, 5, 7, 13, 14, 17], "impli": [2, 9, 11], "python_req_us": [2, 4, 5, 6, 8, 14, 20], "individu": [2, 5, 11, 18], "applic": [2, 9, 11], "had": 2, "instead": [2, 3, 5, 6, 7, 8, 9, 13, 14, 16, 18, 19, 20, 21], "no_waf_libdir": 2, "ye": 2, "unit": 2, "framework": [2, 3, 5, 11, 17], "mrzechonek": 2, "tut": 2, "roughli": [2, 9, 11, 13], "ldap": 2, "ldb": 2, "samba": [2, 20], "ftp": [2, 20], "pub": 2, "elibc_freebsd": 2, "libbsd": 2, "popt": 2, "talloc": [2, 20], "tevent": 2, "9": [2, 5, 10, 12, 15, 19, 21], "31": [2, 15], "tdb": 2, "12": [2, 8, 15, 16, 18, 19], "nd": 2, "openldap": 2, "libxslt": 2, "waf_binari": [2, 20], "buildtool": [2, 20], "filesdir": 2, "27": [2, 8], "optional_packag": 2, "myconf": [2, 8], "rpath": 2, "modulesdir": 2, "builtin": 2, "utils_src_configur": [2, 20], "tradition": 3, "python": [3, 6, 17, 18, 19], "organ": 3, "subpackag": [3, 19], "locat": [3, 5, 19], "parent": [3, 9], "directori": [3, 5, 6, 9, 11, 12, 13, 14, 16, 18, 19, 21], "submodul": 3, "repres": [3, 5, 21], "attribut": [3, 10, 16], "session": [3, 21], "addnod": 3, "site": [3, 5, 6, 9, 10, 11, 16, 18, 21], "fine": [3, 12, 16], "start": [3, 4, 5, 6, 11, 12, 15, 16, 21], "problemat": [3, 5, 6, 10, 18], "top": [3, 5, 9, 10, 18], "level": [3, 9, 10, 11, 21], "layout": [3, 6, 13], "wish": [3, 6, 21], "zope": [3, 15], "share": [3, 5], "interfac": [3, 6, 11, 15, 16], "event": [3, 11, 18], "depend": [3, 6, 7, 9, 10, 11, 12, 13, 15, 16, 17, 19], "far": [3, 12, 20], "concern": 3, "entir": [3, 5, 9, 10, 12, 13, 14, 21], "doabl": 3, "real": [3, 18, 19, 21], "we": [3, 4, 6, 8, 11, 12, 14, 15, 17, 19], "freshli": 3, "build": [3, 9, 10, 11, 15, 16, 19, 21], "abl": [3, 15], "tmp": [3, 5, 9, 18, 19, 21], "portag": [3, 5, 8, 10, 12, 14, 15, 18, 21], "python3_8": 3, "traceback": [3, 5, 21], "last": [3, 5, 16], "stdin": 3, "modulenotfounderror": 3, "No": [3, 21], "now": [3, 5, 6, 8, 13, 14, 21], "around": [3, 5, 6, 11, 12, 21], "back": [3, 6, 16], "better": [3, 6, 11, 12, 13, 14, 19], "solut": [3, 15, 16, 19, 21], "unlik": [3, 5, 6, 11, 15], "tradit": 3, "act": 3, "proxi": [3, 14], "strictli": [3, 5, 6, 15, 21], "bound": [3, 11, 16], "permit": [3, 4, 5, 6, 11, 15, 21], "load": [3, 7, 9, 16, 18, 19, 21], "search": [3, 10, 15, 21], "method": [3, 5, 11, 13, 16, 18, 19, 21], "420": 3, "newer": [3, 4, 5, 6, 11, 12, 15, 16, 19], "pkgutil": 3, "standard": [3, 4, 6, 7, 9, 10, 11, 14, 16, 21], "discourag": [3, 6], "earlier": [3, 13], "ignor": [3, 4, 5, 8, 15, 18, 21], "did": [3, 13, 16, 21], "within": [3, 5, 6, 12, 15, 17, 21], "content": [3, 5, 7], "__path__": 3, "__import__": 3, "extend_path": 3, "__name__": 3, "pkg_resourc": [3, 6], "declare_namespac": 3, "altern": [3, 5, 6, 8, 10, 16, 17, 21], "pth": 3, "automat": [3, 4, 5, 6, 10, 12, 15, 19, 21], "inject": [3, 20, 21], "portabl": 3, "topic": [3, 17], "exact": [3, 5, 11, 20], "detect": [3, 5, 9, 15, 21], "recogn": [3, 5, 15, 16], "lack": [3, 9, 21], "action": [3, 15, 21], "distinguish": [3, 5, 13], "veri": [3, 4, 5, 6, 9, 11, 15, 17, 19, 21], "through": [3, 4, 5, 6, 8, 11, 16, 18, 21], "suspici": 3, "less": [3, 15, 21], "ruamel": 3, "miss": [3, 4, 5, 6, 9, 10, 11, 12, 13, 15, 17, 18, 19], "learn": 3, "about": [3, 6, 13, 15], "collis": [3, 5, 15, 21], "namespace_packag": 3, "per": [3, 19], "remov": [3, 4, 5, 6, 10, 11, 13, 14, 15, 18, 19, 21], "tree": [3, 5, 12, 13, 19, 21], "after": [3, 6, 9, 11, 12, 13, 15, 16, 19, 21], "python_compil": 3, "r1_python_compil": [3, 5], "jaraco": [3, 5, 12, 18], "equival": [3, 6, 8, 9, 13], "r1_python_instal": [3, 5], "python_install_al": [3, 5], "r1_python_install_al": [3, 5], "explicit": [3, 4, 5, 6, 20, 21], "rdep": 3, "sed": [3, 5, 8, 14, 15, 18, 21], "r1_src_prepar": [3, 5, 18], "histor": [3, 5, 6, 11, 13, 16, 19], "process": [3, 5, 7, 12, 16, 19, 20], "retir": 3, "major": [4, 5, 6, 11, 15, 21], "avail": [4, 5, 6, 8, 11, 13, 15, 16, 17], "sqlite3": 4, "sqlite": [4, 8], "xdg": 4, "music": 4, "lollypop": 4, "adishatz": 4, "syntax": [4, 10, 11, 15, 19], "lightweight": [4, 19], "password": 4, "backend": [4, 10, 12, 13], "pwman3": 4, "mysql": [4, 14], "postgr": 4, "fulli": [4, 5, 7, 11], "solv": [4, 17], "python_gen_impl_dep": 4, "helper": [4, 5, 7, 10, 14, 20, 21], "2_7": [4, 21], "3_": 4, "travel": 4, "spulec": 4, "freezegun": [4, 18, 21], "pypi": [4, 5, 6, 8, 10, 11, 13], "dateutil": 4, "six": [4, 8, 21], "nose": [4, 21], "distutils_enable_test": [4, 5, 10, 13, 18], "ll": [4, 14], "backport": [4, 6, 10, 12], "zero": [4, 15], "argument": [4, 6, 10, 13, 16, 21], "output": [4, 5, 6, 9, 16, 19, 21], "everi": [4, 5, 6, 8, 11, 14, 15, 16, 19, 21], "escap": [4, 13, 20], "quot": [4, 20], "partial": [4, 5, 9, 10, 13], "python_single_usedep": [4, 5, 13, 20], "cli": [4, 5], "black": 4, "click": 4, "fnmatch": 4, "style": [4, 5, 13, 16, 17, 18, 21], "wildcard": 4, "stdlib": [4, 13, 16], "rememb": [4, 12], "pattern": [4, 12, 13, 20], "prevent": [4, 5, 11, 20, 21], "filenam": [4, 5], "expans": 4, "expand": 4, "zoneinfo": 4, "advantag": [4, 5, 7, 18, 21], "adjust": [4, 9, 11, 16], "switch": [4, 7, 9, 11, 12, 13, 15, 21], "list": [4, 5, 8, 12, 13, 18, 19, 21], "longer": [4, 6, 11, 13, 21], "silent": 4, "updat": [4, 6, 9, 11, 12, 16], "immedi": [4, 5, 12, 20], "becam": [4, 11], "empti": [4, 5, 15], "importlib_metadata": [4, 6, 15, 21], "python3_7": [4, 8], "facilit": [5, 9], "deriv": [5, 6], "notabl": [5, 15, 16], "effici": [5, 15], "oper": [5, 11, 17], "backward": [5, 11, 16], "incompat": [5, 6, 11, 16, 18, 21], "greater": [5, 7], "number": [5, 7, 12, 15, 18, 19, 21], "cost": [5, 11], "flexibl": [5, 7], "wheel": [5, 11, 12, 15, 18, 19], "zip": [5, 6], "stage": [5, 11, 19, 21], "compil": [5, 6, 10, 11, 21], "mere": [5, 7], "imag": [5, 9, 19], "compliant": [5, 7], "invok": [5, 18, 21], "popul": [5, 15], "addition": [5, 9, 11, 14], "pyproject2setuppi": [5, 6, 13], "hack": [5, 6, 7, 13], "reli": [5, 6, 11, 21], "distutils_use_pep517": [5, 13], "legal": 5, "unset": [5, 6], "By": [5, 6, 11], "2022": [5, 13, 18], "xml": [5, 6], "feel": [5, 15], "json": 5, "martinblech": 5, "xmltodict": 5, "mit": [5, 6, 21], "vast": 5, "index": [5, 10], "sdist": [5, 15, 19, 21], "binari": [5, 9, 12, 16], "mechan": [5, 7, 11], "over": [5, 7, 11, 12, 18, 20, 21], "offici": 5, "instanc": [5, 13, 16], "nonfunct": 5, "append": [5, 14, 15, 21], "uniqu": [5, 14], "suffix": [5, 15, 19], "gh": [5, 21], "request": [5, 8, 10, 12, 15], "distfil": [5, 16, 20], "clearli": [5, 19, 21], "tarbal": [5, 12, 21], "textual": 5, "rich": 5, "implic": 5, "cf": [5, 12], "regener": [5, 12], "anywai": [5, 16], "nevertheless": 5, "even": [5, 8, 9, 11, 18, 21], "pregener": 5, "internet": [5, 10, 18], "nodej": 5, "underli": [5, 6, 7], "txt": [5, 6, 12, 18], "ci": [5, 21], "travi": 5, "yml": 5, "grep": 5, "statement": [5, 19], "indirect": 5, "relev": [5, 6, 13, 17, 18, 21], "unnecessarili": 5, "logic": [5, 6, 12, 21], "long": [5, 11, 12], "quickli": 5, "widest": 5, "avoid": [5, 6, 8, 10, 15, 16, 17, 21], "unpredict": 5, "who": [5, 17, 21], "especi": [5, 7, 18, 19, 21], "distutils_single_impl": [5, 7], "aim": [5, 11, 15, 17, 19], "exist": [5, 10, 11, 12, 16, 19], "rewritten": [5, 20, 21], "layer": [5, 14], "pyroot": 5, "rootpi": 5, "physic": [5, 20], "root_numpi": 5, "pytabl": 5, "termcolor": 5, "determin": [5, 6, 7, 11, 20, 21], "flit_cor": [5, 12, 19], "maintain": [5, 10, 11, 12, 16, 18], "suggest": [5, 8, 13, 15, 17, 18, 19, 21], "tabl": [5, 12, 13, 15, 16, 18], "summar": [5, 16], "use_pep517": 5, "hatchl": 5, "jupyt": 5, "jupyter_packag": 5, "build_api": 5, "maturin": 5, "mesonpi": 5, "see": [5, 9, 16, 18, 19, 21], "below": [5, 8], "pbr": [5, 6], "pdm": [5, 13], "pep517": [5, 19], "sip": [5, 8, 15], "sipbuild": 5, "standalon": [5, 12], "itself": [5, 6, 8, 9, 12, 15, 18], "own": [5, 21], "Their": [6, 9, 19], "fix": [5, 6, 10, 11, 12, 15, 16, 18, 19, 21], "produc": [12, 15, 19], "ident": 19, "artifact": 19, "reduc": 19, "footprint": 19, "isol": 19, "faster": 19, "poetry_cor": 19, "smaller": 19, "40": [12, 19], "incorrect": [5, 6, 19], "intend": [16, 19, 21], "implicit": [14, 19, 21], "fallback": [6, 19], "regular": [7, 19, 21], "pleas": [5, 6, 8, 9, 12, 15, 16, 18, 19, 20, 21], "alwai": [5, 6, 8, 11, 13, 16, 17, 19], "unfortun": [13, 15, 16, 18, 19, 21], "due": [10, 12, 14, 18, 19], "prolong": 19, "larg": [5, 12, 15, 18, 19], "tend": 19, "mistak": [15, 19], "checkout": [5, 12, 21], "abil": [5, 6], "tag": [5, 12, 21], "execut": [5, 6, 7, 9, 11, 12, 13, 14, 21], "143": 5, "_install_setup_requir": 5, "attr": [5, 12, 21], "131": 5, "dist": 5, "dict": [5, 20], "425": 5, "_distribut": 5, "self": [5, 16, 18, 21], "292": 5, "finalize_opt": 5, "717": 5, "ep": 5, "48": 5, "infer_vers": 5, "_get_vers": 5, "config": [5, 9, 12], "148": 5, "parsed_vers": 5, "_do_pars": 5, "110": 5, "rais": [5, 16], "lookuperror": 5, "scm": 5, "unabl": [5, 15, 21], "sure": [5, 15, 18, 21], "re": [5, 8, 15, 21], "intact": 5, "git": [5, 12, 21], "folder": 5, "don": [5, 13], "t": [5, 7, 8, 11, 13, 21], "pip": [5, 12, 21], "proj": 5, "master": [5, 21], "egg": [5, 6, 18], "setuptools_scm_pretend_vers": 5, "static": [5, 8], "write": [5, 6, 7, 12, 16, 17, 19], "hybrid": [5, 10], "expos": [5, 6, 21], "guarante": [5, 6, 10], "taken": [5, 16, 21], "ship": [5, 19], "issu": [5, 6, 13, 15, 16, 18, 21], "forc": [4, 5, 6, 8, 9, 12, 13, 18, 21], "frobnic": 5, "makefil": [5, 14], "jq": 5, "pyx": 5, "unresolv": 5, "regard": 5, "simultan": [5, 11, 17, 21], "link": [5, 7, 9, 16], "editor": 5, "broken": [5, 6, 18, 21], "cryptic": 5, "revers": [5, 7, 12, 15], "miscompil": 5, "panda": 5, "breakag": [5, 21], "dask": [5, 18], "29": 5, "_lib": 5, "hashtabl": 5, "_hashtabl": 5, "tslib": 5, "_tslib": 5, "13": [5, 15, 18, 21], "interv": 5, "init": 5, "30": [5, 11], "convers": [5, 6], "outofboundstimedelta": 5, "localize_pydatetim": 5, "importerror": [5, 6, 10, 11, 16], "38": [5, 19], "x86_64": 5, "undefin": 5, "symbol": 5, "pandas_datetime_to_datetimestruct": 5, "easiest": [5, 15, 20], "workaround": [5, 19], "j1": 5, "origin": [5, 9, 11, 12, 16], "overrid": [5, 9, 14, 21], "extend": [5, 11], "introduc": [5, 11], "src_": 5, "python_": [5, 8], "_all": [5, 8], "compris": 5, "behav": [5, 8], "r1_": 5, "correspond": [5, 11, 12, 15], "python_prepare_al": [5, 18], "each": [5, 6, 7, 11, 14], "foreach": 5, "python_configure_al": 5, "python_compile_al": [5, 8], "python_test_al": 5, "dedic": [5, 6, 12, 14], "chang": [5, 6, 8, 9, 10, 11, 13, 14, 15, 19, 21], "task": [5, 8, 12], "default_src_prepar": 5, "ez_setup": 5, "bootstrap": [5, 6, 10], "end": [5, 6, 7, 9, 11, 14, 18, 21], "dir": [5, 14], "extran": 5, "fixm": 5, "test_pytest_plugin": 5, "test_testcase_no_app": 5, "_": [5, 12, 15, 21], "test_test_util": 5, "pointless": 5, "cov": [5, 18, 21], "addopt": 5, "aiohttp": [5, 18], "r1_python_prepare_al": [5, 18], "duplic": [5, 14, 21], "moment": [5, 11, 13, 15], "modif": 5, "keep": [5, 15, 17], "why": [5, 6, 10], "console_script": [5, 6], "configur": [5, 6, 8, 13, 14, 19, 21], "step": [5, 6, 7, 8, 14], "esetup": [5, 8], "mpi": 5, "distutils_arg": [5, 13], "resourcepath": 5, "compress": 5, "manpag": 5, "distutils_enable_sphinx": [5, 8], "emak": [5, 8, 9], "strongli": [5, 6, 15], "encourag": [5, 15], "testbitvector": 5, "redefin": [5, 18], "too": [5, 11, 21], "collada": 5, "einstalldoc": [5, 8, 14], "docinto": 5, "sample_cod": 5, "docompress": 5, "pf": 5, "main": [5, 9], "manipul": [5, 21], "arrai": 5, "futur": [5, 15], "pillow": 5, "build_ext": [5, 6, 21], "tiff": 5, "webp": 5, "dash": 5, "underscor": [5, 15, 21], "boolean": 5, "disable_tiff": 5, "enable_tiff": 5, "disable_webp": 5, "enable_webp": 5, "modifi": [5, 6, 11, 15, 19, 21], "beforehand": 5, "econf": [5, 20], "paremet": 5, "find_packag": 19, "wrongli": [16, 19, 21], "grab": [13, 19], "attempt": [16, 19, 21], "forbidden": [], "exclud": 19, "paramet": [8, 16, 19, 21], "properli": [6, 13], "intermedi": [], "minim": [11, 15, 16, 21], "precis": [8, 9, 21], "catch": [19, 21], "earli": [7, 8, 12, 21], "anywher": [], "first": [6, 10, 11, 12, 15, 16, 18, 19, 21], "easi": [16, 19, 21], "whitelist": 21, "sanit": [11, 16, 21], "mozilla": 21, "bleach": 21, "webencod": 21, "unittest": [5, 11, 21], "discoveri": [18, 19, 21], "univers": 21, "encod": [16, 21], "detector": 21, "chardet": [8, 21], "cygwin": [6, 21], "hypothesi": 21, "bottom": 21, "venv": [5, 6, 13, 21], "temporari": [5, 6, 21], "frequent": [18, 21], "littl": [6, 18, 21], "skip": [4, 8, 10, 12, 16, 19], "those": [5, 6, 8, 9, 18, 21], "how": 21, "statist": 21, "want": [6, 8, 21], "across": [5, 11, 21], "irrelev": 21, "pep8": 21, "pycodestyl": 21, "flake8": [18, 21], "thin": [6, 21], "alreadi": [9, 12, 14, 15, 16, 19, 21], "close": 21, "pre": 21, "post": [6, 13, 15, 21], "easili": [5, 14, 18, 21], "r1_src_test": [5, 21], "cmd": 21, "cmd2": 21, "colorama": 21, "pyperclip": 21, "wcwidth": 21, "text": [5, 8, 16, 21], "column": 21, "80": 21, "fact": 21, "simpli": [15, 16, 17, 21], "3_6": [14, 21], "3_7": [14, 21], "3_8": 21, "tab": [15, 21], "argpars": 21, "argcomplet": 21, "fish": 21, "tcsh": 21, "rel": [18, 19, 21], "epytest": [4, 5, 6, 8, 12, 18, 21], "network": [6, 18, 21], "marker": [10, 21], "m": [15, 18, 19, 21], "displai": 21, "appeas": 21, "usng": 21, "xvfb": 21, "server": 21, "virtx": 21, "nonfat": 21, "termin": 21, "context": [20, 21], "come": [5, 13, 18], "theme": [5, 6, 8], "hard": [5, 8, 12], "To": [5, 6, 8, 9, 12, 15, 16, 18, 19, 20], "conf": [5, 6, 19], "ext": 5, "distutils_use_setuptool": [5, 13], "color": 5, "stream": 5, "handler": 5, "log": [5, 19], "coloredlog": 5, "xolox": 5, "readthedoc": 5, "en": 5, "latest": [5, 15], "humanfriendli": 5, "expert": [5, 10, 14, 21], "uncommon": [5, 15], "third": [5, 7, 13, 19], "parti": 5, "inflect": 5, "word": 5, "jazzband": 5, "rst": 5, "linker": [5, 9], "alabast": [5, 6], "python_target": [5, 7, 8, 11, 12], "inspect": 5, "omit": [5, 15, 16], "port": [5, 8, 10], "pyseri": 5, "psf": 5, "tri": 5, "been": [5, 6, 8, 11, 12, 13, 14, 16, 18, 19], "assumpt": 5, "consum": [5, 6, 21], "distutils_opt": 5, "alter": [5, 18], "distutils_dep": 5, "dependneci": 5, "r1_src_compil": 5, "r1_src_instal": 5, "primari": [5, 18], "alongsid": [5, 6], "libfoo": 5, "r1_src_configur": [], "setuptools_rust": 5, "ecosystem": [5, 15, 17], "bump": [5, 12, 15], "lock": 5, "Then": 12, "crate": 5, "cargo_opt": 5, "url": [5, 11, 15, 16], "cargo_crate_uri": 5, "qa_flags_ignor": 5, "posit": [5, 15], "cflag": [5, 9, 21], "cargo_src_unpack": 5, "inflector": 5, "alias": [5, 16], "asn1": 5, "asn1_der": 5, "_rust": 5, "src_unpack": 5, "benefit": [5, 7], "yet": [5, 8, 11, 20], "cyclic": 5, "suppos": [5, 16], "overlap": 5, "machineri": 5, "op": 5, "unless": [5, 6, 8, 15], "merg": [4, 5], "toward": 5, "effect": [5, 8, 11, 19], "pick": [5, 12], "up": [5, 6, 9, 11, 13, 14, 15, 17, 18, 19, 21], "hukkin": 5, "tomli": [5, 12, 15], "pythonhost": 5, "py3": [5, 18], "whl": 5, "unzip": 5, "deliber": 5, "unpack": 5, "gpep517": [5, 19], "python_newscript": [5, 9], "__main__": [5, 21], "exit": [5, 16, 19, 21], "fragment": [5, 16], "emesonarg": 5, "dlint": 5, "meson_src_configur": 5, "meson_src_compil": 5, "meson_src_test": 5, "meson_src_instal": 5, "here": [6, 8, 14, 20], "direct": [6, 14], "convert": [6, 8, 13], "facil": 6, "right": [6, 7], "fit": [6, 21], "profil": [4, 6, 15], "pyproject2toml": 6, "misbehav": 6, "subsequ": [6, 19], "qa": [6, 9, 10, 12, 17], "expect": [6, 11, 16, 18, 19, 21], "sidebar": 6, "bitprophet": 6, "possibli": [6, 21], "snippet": [6, 16, 19], "except": [6, 7, 9, 11, 12, 16], "pm": 6, "cleanli": [6, 12], "condit": [6, 10, 12, 18, 21], "leav": 6, "never": [6, 11, 13, 16], "clean": [6, 11, 13], "requier": 6, "With": [6, 21], "themselv": [6, 18, 19, 21], "entry_point": [6, 18], "dictionari": [6, 20], "our": [6, 18, 21], "interest": [6, 8, 21], "gui_script": 6, "meaning": 6, "importlib": [6, 11, 21], "fall": [6, 16], "remind": 6, "distutils_strict_entry_point": 6, "trigger": [6, 12, 18, 19, 21], "wrong": [6, 13, 15], "leftov": 6, "resourc": [6, 11, 12, 19], "submit": [6, 19], "suppli": 6, "heavi": 6, "speak": [6, 11], "known": [6, 16, 21], "limit": [6, 12, 15, 17], "address": [6, 11, 16], "definit": 6, "subdirectori": [6, 9], "interspers": [6, 19], "closest": 6, "inplac": 6, "shift": [6, 11], "throughout": 6, "2to3": 6, "distutils_in_source_build": 6, "collect": [6, 18, 21], "pypa": 6, "riscv": [6, 8, 20], "pythonpath": [6, 21], "distutils_install_for_test": [6, 13, 18, 21], "alik": [6, 7, 11, 13], "preserv": [6, 11, 15, 16], "extrem": 6, "home": [6, 12, 13], "went": 6, "awai": [6, 7], "python_test": [4, 6, 8, 9, 12, 18, 21], "total": 7, "rare": [7, 9, 18, 21], "simpler": 7, "complex": [7, 16, 20], "primarili": [7, 11], "involv": [7, 8, 13], "graph": [7, 11, 12], "meet": 7, "potenti": [7, 11, 15, 16, 18], "basi": 7, "occur": [7, 11, 18], "libpython": [7, 11, 16], "aforement": [7, 13, 16], "foo": [7, 16], "wise": 7, "abstract": [7, 14], "scon": [7, 8, 10, 19], "second": [7, 13, 19], "easier": [7, 19], "select": [7, 8, 18, 20], "allow": [7, 21], "repeat": [7, 14, 15, 19], "model": 7, "libboost_python": 7, "python_single_target": [7, 11, 12], "Its": [7, 12], "legaci": [7, 10, 13, 16, 19, 21], "power": 8, "harder": [8, 15], "ninja": [8, 15], "train": 8, "opposit": [8, 11, 13], "investig": 8, "human": 8, "beings": 8, "socks5": 8, "ssl": 8, "certifi": [8, 15], "2017": 8, "17": 8, "idna": 8, "urllib3": [8, 12], "26": 8, "pysock": 8, "cryptographi": [8, 15], "pyopenssl": 8, "14": [8, 21], "httpbin": [8, 18], "hang": 8, "continu": [8, 12, 21], "python_gen_useflag": 8, "out": [8, 9, 10, 11, 12, 13, 14, 15, 16], "toolkit": 8, "translat": 8, "format": [8, 12, 15, 16, 19], "subtitl": 8, "pydiff": 8, "iso": 8, "lxml": 8, "pycountri": 8, "18": 8, "levenshtein": 8, "devel": 8, "gettext": 8, "video": 8, "gaupol": 8, "riverbankcomput": 8, "intro": 8, "sip_api_major_nr": 8, "siplib": 8, "h": [8, 9, 20], "bison": 8, "flex": 8, "prepar": [8, 9, 19, 20], "bindir": 8, "incdir": 8, "python_get_includedir": [8, 9, 13], "echo": [8, 19], "distutils_all_subphase_impl": 8, "python3_5": 8, "bzip2": 8, "epydoc": 8, "eselect": 8, "elibc_glibc": 8, "sandbox": [8, 19, 21], "kernel_linux": 8, "pax": 8, "rsync": 8, "userland_gnu": 8, "coreutil": 8, "sphinx_rtd_them": 8, "practic": [8, 11, 12], "big": 8, "imagin": 8, "anymor": [8, 11], "downgrad": 8, "though": [8, 11], "resembl": [8, 18], "presenc": [8, 18], "activ": [8, 17], "behavior": [8, 11, 16], "goal": [8, 12, 21], "side": [8, 11], "someth": [8, 9, 21], "accord": 8, "integr": [8, 9, 10, 11], "won": 8, "reject": [8, 15, 16], "unsupport": [8, 11], "python_is_python3": [8, 13], "basic": [9, 10], "reus": [9, 15], "four": [9, 13, 20], "python_doex": 9, "python_newex": 9, "python_doscript": [9, 14, 20], "recurs": [9, 15, 18], "python_dohead": 9, "python_scriptinto": 9, "affect": [9, 11, 14], "symlink": 9, "onto": 9, "improv": [9, 10, 11, 17], "cropgtk": 9, "sbin": 9, "pynslcd": 9, "anyth": 9, "land": 9, "my_pn": 9, "doin": 9, "libimag": 9, "env": [9, 12], "python_fix_shebang": 9, "sphinxtrain": 9, "openvpn": 9, "vulnkei": 9, "insinto": 9, "kitti": 9, "speed": 9, "nowadai": [9, 12, 13], "pypy2": [9, 11], "_feedparser_sgmllib": 9, "lib64": 9, "byte_compil": 9, "cmake_src_instal": 9, "entropi": 9, "ocassion": 9, "bad": [9, 16], "seri": 9, "getter": [9, 13, 16], "python_get_scriptdir": 9, "python_get_library_path": [9, 13], "python_get_cflag": 9, "preprocessor": 9, "pkg": 9, "python_get_lib": 9, "python_get_python_config": 9, "offset": 9, "mycmakearg": [9, 13, 20], "dpython_dest": 9, "dpython_execut": 9, "dpython_include_dir": 9, "dpython_librari": 9, "cmake_src_configur": [9, 20], "pyinc": 9, "pylib": 9, "micha\u0142": 10, "g\u00f3rny": 10, "creativ": 10, "intern": 10, "prefac": 10, "life": 10, "cycl": [10, 12], "stabil": 10, "choos": [10, 11, 14], "overview": 10, "variant": [10, 11, 16, 18], "flit_scm": 10, "hatch": 10, "vc": [10, 21], "snapshot": [10, 21], "parallel": 10, "race": 10, "command": [10, 14, 15, 18, 19, 21], "usag": 10, "rust": 10, "cargo": 10, "variat": 10, "byte": [10, 16], "queri": [10, 16], "advanc": 10, "cffi": 10, "greenlet": [10, 18], "checklist": 10, "abort": 10, "assert": [10, 19], "recip": 10, "xdist": [10, 12, 21], "autoload": 10, "typeerror": 10, "_make_test_flaki": 10, "got": [10, 13], "unexpect": [10, 19], "rerun": 10, "importpathmismatcherror": 10, "fixtur": [10, 12], "namespac": [10, 18], "disjoint": 10, "waf": [10, 20], "tip": [10, 21], "retroact": 10, "migrat": 10, "bytecod": 10, "relat": [10, 12, 13, 15, 21], "mainten": 10, "co": [10, 21], "monitor": [10, 19], "routin": [10, 14], "page": [10, 16, 17], "increment": 11, "minor": [11, 21], "plan": 11, "On": 11, "hand": [11, 13], "platform": [11, 16, 21], "linux_distribut": 11, "window": 11, "understood": 11, "initi": [11, 21], "enter": 11, "stabl": [11, 12, 15], "prematur": [11, 15], "mask": [4, 11, 12, 15], "beta": 11, "made": [11, 13, 14, 16, 20], "regress": 11, "readi": [11, 12, 15], "dai": 11, "inconsist": [11, 15, 21], "mark": [11, 15, 18, 21], "architectur": [4, 11], "clear": [11, 15], "depenend": 11, "repeatedli": 11, "ask": [11, 15], "push": [11, 12, 15], "forward": 11, "eventu": [11, 12], "becom": [11, 16], "slowli": [11, 15], "discontinu": 11, "next": [11, 12, 15, 18], "june": 11, "juli": 11, "year": 11, "predict": [11, 20], "nears": 11, "great": 11, "obsolet": [11, 13], "feasibl": [4, 11, 15], "vulner": 11, "break": [11, 15, 16], "revert": 11, "enum": 11, "urlsplit": 11, "secur": [11, 12], "abi": 11, "bugfix": 11, "occasion": 11, "remain": [4, 11, 12, 13], "contrari": [11, 16], "hold": [11, 16], "subslot": 11, "fortun": 11, "late": 11, "hous": 11, "rpython": 11, "lot": [11, 15], "good": [11, 15, 17, 18, 21], "gc": 11, "jython": 11, "java": 11, "stand": 11, "alon": 11, "bidirect": 11, "interact": 11, "slow": 11, "pace": 11, "ironpython": 11, "brython": 11, "web": 11, "javascript": 11, "dom": 11, "micropython": 11, "microcontrol": 11, "down": 11, "hardwar": 11, "tauthon": 11, "accompani": 11, "nor": [11, 17, 19], "ideal": [11, 15, 21], "funcsig": 11, "signatur": [11, 16], "afterward": [11, 14, 15], "later": 11, "lzma": 11, "compet": 11, "amount": [11, 12, 21], "ipaddress": 11, "drop": [11, 16], "box": [11, 13], "hexvers": [11, 21], "0x03030000": 11, "trolliu": 11, "asyncio": [11, 18, 21], "nativ": 11, "workflow": 12, "clone": 12, "remot": [12, 15, 21], "fetch": 12, "rebas": 12, "v3": 12, "cherri": 12, "upload": 12, "mkdir": 12, "scp": 12, "precompil": [12, 19], "unusu": 12, "structur": [12, 21], "ex": 12, "technic": 12, "docker": 12, "binpkg": 12, "diff": 12, "mgorni": 12, "desc": 12, "_python_all_impl": 12, "_python_verify_pattern": 12, "_python_set_impl": 12, "_python_impl_match": 12, "python_pkg_dep": 12, "gpyutil": [12, 15], "circular": 12, "eas": [12, 15], "temporarili": [12, 13], "python3_11": 12, "20": 12, "pwd": 12, "round": 12, "signific": [4, 12, 18], "remaind": 12, "pydant": 12, "epytest_deselect": [4, 12, 18], "test_comparison": 12, "test_close_to_now_": 12, "lenient": 12, "deselect": [4, 12, 18, 21], "unblock": 12, "100": 12, "emerg": [12, 19], "previous": 12, "reinstal": 12, "batch": [12, 19], "focus": 12, "reenabl": [12, 18], "face": [12, 21], "goe": [12, 21], "unbundl": 12, "obligatori": [12, 15], "baselin": 12, "ones": 12, "chosen": 12, "fewest": 12, "vendor": [12, 13], "februari": 13, "gross": 13, "serv": 13, "placehold": 13, "transit": [13, 15], "period": [13, 15], "ban": 13, "python_multi_usedep": 13, "know": [13, 16, 21], "given": 13, "repoman": 13, "pkgcheck": [13, 15], "tell": 13, "chose": 13, "reorder": 13, "desir": [13, 16, 19, 21], "scan": [13, 15], "unmatch": 13, "trial": 13, "stuff": 13, "thing": [13, 17, 18], "privat": 13, "python_export": 13, "python_wrapper_setup": 13, "python_gen_usedep": 13, "mydistutilsarg": 13, "renam": [13, 15, 16, 19], "cleanup": 13, "python_gen": 13, "march": 13, "python_get": 13, "python_includedir": 13, "python_libpath": 13, "dpython3_include_dir": 13, "dpython3_librari": 13, "sundri": 13, "stop": [13, 16], "realli": [13, 15, 18, 21], "ugli": 13, "sole": 13, "uppercas": [13, 15, 16], "fourth": 13, "cruft": 13, "short": [13, 18], "evalu": 13, "januari": 13, "safe": 13, "streamlin": 13, "inde": 13, "foundat": 14, "fionet": 14, "psql": 14, "cach": 14, "sourceforg": [14, 20], "replic": 14, "tgz": 14, "libcangji": 14, "cangjian": 14, "i18n": 14, "eautoreconf": [14, 16], "econf_sourc": 14, "la": 14, "multibuild": 14, "unnecessari": [14, 15, 20, 21], "libtool": 14, "buggi": 14, "canva": 14, "widget": 14, "gtk": 14, "cairo": 14, "2d": 14, "draw": 14, "goocanva": 14, "subdir": 14, "am": 14, "gnome2_src_prepar": 14, "gnome2_src_configur": 14, "gnome2_src_instal": 14, "sub_instal": 14, "gi": 14, "_overridesdir": 14, "outsid": [14, 20], "qemu": 14, "kernel": 14, "machin": [14, 19], "userland": 14, "kvm": 14, "qemu_python_instal": 14, "vmxcap": 14, "qmp": 14, "ga": 14, "reach": 15, "eol": [15, 16], "proactiv": 15, "anticip": 15, "soon": 15, "wide": [15, 21], "revis": [12, 15], "newli": 15, "risk": 15, "team": 15, "manpow": 15, "member": 15, "u": 15, "gemato": 15, "carri": 15, "histori": 15, "rss": 15, "comprehens": 15, "opml": 15, "followup": 15, "track": [12, 15], "mail": [12, 15], "suscept": 15, "confus": [15, 18], "sync": [15, 18], "conflict": 15, "cx": 15, "freez": 15, "patchelf": 15, "openapi": 15, "spec": [15, 16], "60": 15, "59": 15, "62": 15, "pin": 15, "httpcore": 15, "15": 15, "httpx": 15, "23": [15, 21], "sphobjinv": 15, "28": 15, "date": [15, 17, 19, 21], "pend": 15, "pip3": 15, "dirti": 15, "equal": [15, 21], "filetyp": 15, "mercuri": 15, "node": 15, "semver": 15, "pyqt": 15, "builder": 15, "pyqt5": 15, "pyqtwebengin": 15, "rout": 15, "dev20220522": 15, "selenium": 15, "141": 15, "sphinxcontrib": 15, "websupport": 15, "dev20220515": 15, "uri": 15, "watchfil": 15, "watchgod": 15, "dev0": 15, "sign": [12, 15], "tag_build": 15, "compar": [15, 16], "tempest": 15, "oslo": 15, "stestr": 15, "versioningit": 15, "wstool": 15, "think": 16, "ve": 16, "hit": 16, "me": 16, "18_p9": 16, "13_p3": 16, "10_p3": 16, "9_p2": 16, "4_p1": 16, "urllib": 16, "pars": 16, "exploit": 16, "verbatim": 16, "worm": 16, "danger": 16, "worst": [16, 21], "unpars": 16, "django": [16, 21], "pr": 16, "14349": 16, "impact": [16, 19], "urlpars": 16, "nurl": 16, "parseresult": 16, "scheme": 16, "netloc": 16, "param": [16, 18], "badurl": 16, "what": 16, "attributeerror": 16, "492": 16, "decor": [16, 21], "async": [16, 18], "def": [16, 18, 21], "yield": 16, "await": 16, "sleep": 16, "callabl": 16, "mostli": [16, 17], "getfullargspec": 16, "p1": 16, "p2": 16, "kp3": 16, "kp4": 16, "kp5": 16, "arg": 16, "kwarg": 16, "argspec": 16, "vararg": 16, "fullargspec": 16, "varkw": 16, "kwonlyarg": 16, "kwonlydefault": 16, "annot": 16, "tupl": 16, "int": 16, "str": 16, "float": 16, "k6": 16, "k7": 16, "k8": 16, "One": [16, 21], "prototyp": 16, "bar": 16, "pretti": 16, "stringif": 16, "automak": 16, "16": 16, "exec_prefix": 16, "met": 16, "pkg_config_path": 16, "python_cflag": 16, "python_lib": 16, "man": 16, "autoreconf": 16, "throw": 16, "get_python_inc": 16, "get_path": 16, "platinclud": 16, "get_python_lib": 16, "purelib": 16, "platlib": 16, "platstdlib": 16, "todai": 16, "encodebyt": 16, "decodebyt": 16, "ought": 16, "unicod": 16, "version_info": 16, "b64_encodebyt": 16, "b64encod": 16, "b64decod": 16, "insert": 16, "newlin": 16, "length": 16, "until": 16, "emb": 16, "lpython3": 16, "7m": 16, "among": 17, "beyond": 17, "reliabl": [17, 21], "deep": 17, "beginn": 17, "peopl": 17, "suboptim": 17, "improp": 17, "fill": 17, "gap": 17, "welcom": 17, "whole": [4, 18, 21], "parametr": 18, "epytest_ignor": 18, "test_client": 18, "test_gener": 18, "test_filenam": 18, "test_transport": 18, "test_transport_work": 18, "eventlet": 18, "test_contextvar": 18, "test_leak": 18, "might": 18, "intent": 18, "Not": 18, "collid": [18, 21], "instabl": 18, "unstabl": 18, "discret": 18, "decid": 18, "justifi": 18, "semi": 18, "random": 18, "multiprocess": 18, "finish": 18, "01": 18, "chanc": 18, "experienc": 18, "insuffici": 18, "nest": 18, "envvar": 18, "pytest_disable_plugin_autoload": 18, "pytest_plugin": 18, "comma": 18, "looponfail": 18, "pytest_fork": 18, "flaki": [18, 21], "rerunfailur": 18, "supposedli": 18, "twice": 18, "_pytest": [18, 21], "pathlib": [18, 21], "posixpath": 18, "signifi": 18, "event_loop": 18, "freezer": 18, "mocker": 18, "captur": [18, 21], "summari": 18, "asgiref": 18, "135": 18, "test_loc": 18, "test_sync": 18, "test_sync_contextvar": 18, "deprecationwarn": 18, "main_event_loop": 18, "get_event_loop": 18, "filterwarn": 18, "fatal": [18, 21], "_____________________": 18, "______________________": 18, "577": 18, "asgitest": 18, "testcas": 18, "583": 18, "test_wrapped_case_is_collect": 18, "interrupt": 18, "world": 18, "elog": 19, "portage_elog_class": 19, "optim": 19, "size": 19, "oo": 19, "docstr": 19, "store": 19, "disk": [19, 21], "permiss": 19, "uninstal": 19, "violat": 19, "auxiliari": 19, "readabl": [19, 21], "trimesh": 19, "__pycache__": 19, "blender_boolean": 19, "310": 19, "opt": 19, "notic": 19, "blueman": 19, "constant": 19, "deviceclass": 19, "sdp": 19, "tmpl": 19, "pair": 19, "docbook": 19, "35": 19, "36": 19, "plot": 20, "voacap": 20, "propag": 20, "qsl": 20, "hz1jw": 20, "pythonprop": 20, "basemap": 20, "gtk2": 20, "doubl": 20, "energi": 20, "yoda": 20, "hepforg": 20, "use_en": 20, "pyext": 20, "extra_opt": 20, "give": 20, "sound": 20, "signal": [20, 21], "composit": 20, "csound": 20, "fordfrog": 20, "dbuild_python_interfac": 20, "dbuild_python_opcod": 20, "superset": 20, "arab": 20, "arabey": 20, "duali": 20, "pyduali": 20, "dict2db": 20, "trans2arab": 20, "arabic2tran": 20, "domain": 21, "firstli": 21, "idea": [15, 21], "nosetest": 21, "secondli": 21, "strict": 21, "thirdli": 21, "wholli": 21, "spew": 21, "seem": 21, "ceas": 21, "downstream": 21, "convinc": [4, 21], "preced": 21, "area": 21, "____________________": 21, "systemd": 21, "test_login": 21, "234": 21, "hint": [12, 21], "578": 21, "_importtestmodul": 21, "mod": 21, "import_path": 21, "fspath": 21, "importmod": 21, "524": 21, "import_modul": 21, "module_nam": 21, "127": 21, "_bootstrap": 21, "_gcd_import": 21, "frozen": 21, "1014": 21, "991": 21, "_find_and_load": 21, "975": 21, "_find_and_load_unlock": 21, "671": 21, "_load_unlock": 21, "rewrit": 21, "170": 21, "exec_modul": 21, "__dict__": 21, "login": 21, "r2": 21, "discov": 21, "pyarg": 21, "guess": 21, "quick": 21, "mayb": 21, "eunittest": 21, "aris": 21, "confirm": 21, "whom": 21, "myself": 21, "subtl": 21, "lead": 21, "But": 21, "bewar": 21, "unexpectedli": 21, "test_start_params_bug": 21, "xfail": 21, "statsmodel": 21, "tsa": 21, "test_arima": 21, "horrend": 21, "space": 21, "mayhem": 21, "5a": 21, "test_null_byt": 21, "skipif": 21, "0x03000000": 21, "unconditioanlli": 21, "test_babel_with_language_": 21, "test_build_latex": 21, "test_polyglossia_with_language_": 21, "altogeth": 21, "replai": 21, "devmanu": 21, "explan": 21, "connect": 21, "pygit2": 21, "no_network": 21, "properti": 21, "test_network": 21, "allow_test": 21, "unclear": 21, "backtrac": 21, "pluggi": 21, "cachedir": 21, "pytest_cach": 21, "rootdir": 21, "var": 21, "sabyenc": 21, "configfil": 21, "item": 21, "test_decod": 21, "test_crc_pickl": 21, "54": 21, "test_empty_size_pickl": 21, "0x00007f748bc47740": 21, "testsupport": 21, "74": 21, "sabyenc3_wrapp": 21, "119": 21, "180": 21, "pytest_pyfunc_cal": 21, "caller": 21, "187": 21, "_multical": 21, "temp": 21, "2934": 21, "66": 21, "dump": [16, 21], "vv": 21, "34": 21, "timeout": 21, "25": 21, "sabyenc3": 21, "596": 21, "decode_usenet_chunk": 21, "pybytearray_check": 21, "pylist_getitem": 21, "py_input_list": 21, "lp": 21, "0x00007fb5db746740": 21, "73": 21, "117": 21, "87": 21, "lambda": 21, "runpi": 21, "85": 21, "_run_cod": 21, "193": 21, "_run_module_as_main": 21, "reproduc": 21, "ubuntu": 21, "dndebug": 21, "leak": 21, "o0": 21, "isort": 21, "distutils_pep517_instal": 21, "destin": 21, "cp": 21, "pushd": 21, "null": 21, "popd": 21, "novemb": 16, "tomllib": [], "w": [], "tomlkit": 16, "edit": 16, "wherea": 16, "input": 16, "tomldecodeerror": 16, "d1": 16, "in1": 16, "in2": 16, "d2": 16, "d3": 16, "rb": 16, "insist": 16, "incompatibilit": 16, "consider": 16, "tomli_w": 16, "wb": 16, "trustm": 4, "test_request": 4, "testrequest": 4, "test_https_warn": 4, "outer": 4, "tl": 4, "pull": 4, "python_vers": 16, "pycargoebuild": 5, "obsolesc": 12, "announc": 12, "proce": 12, "progress": 12, "show": 12, "effort": 12, "rite": [], "_python_historical_impl": 12, "statu": 12, "dead": 12, "polici": 10, "live": [], "2023": [], "conform": 15, "publish": 15, "hyphen": 15, "dot": 15, "crucial": 15, "bugzilla": 15, "illustr": 15, "flask": 15, "babel": 15, "github3": 15, "sphinx_pytest": 15, "redirect": 15, "mismatch": [], "charact": 15, "canon": 15, "id": 15, "unnot": [], "bear": 15, "mind": 15, "doubt": 15, "reserv": 15, "503": 15, "insensit": 15, "letter": 15, "turn": 15, "lowercas": 15, "titl": 15, "423": 15, "incomplet": 5, "strai": 10, "changelog": 19, "wait": 19, "qawarn": 19, "box_logo": [], "png": [], "test_": [], "ref": [], "buildapi": 5, "masonri": 5, "build_meta": 5, "__legacy__": 5}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"python": [0, 1, 2, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 20, 21], "ani": [0, 8], "r1": [0, 2, 5, 6, 7, 8, 13, 14, 20], "build": [0, 1, 2, 5, 6, 7, 8, 12, 13, 14, 20], "time": [0, 2, 7, 8, 14, 20], "depend": [0, 1, 2, 4, 5, 8, 14, 18, 20, 21], "basic": [0, 1, 5, 20, 21], "us": [0, 2, 3, 4, 5, 6, 7, 8, 14, 18, 20, 21], "uncondit": [0, 20], "condit": [0, 2, 4, 5, 14, 20], "addit": [0, 5, 14], "multipl": [0, 11, 20], "set": [0, 8], "common": [1, 9], "python_compat": 1, "python_dep": 1, "python_required_us": 1, "environ": [1, 21], "packag": [1, 2, 3, 4, 5, 6, 7, 12, 14, 15, 16, 19, 20, 21], "The": [1, 5], "most": 1, "type": 1, "find": 1, "list": [1, 15, 16], "from": [1, 13], "system": [1, 2, 5, 6, 12], "integr": [2, 5], "written": 2, "meson": 2, "scon": 2, "extra": [2, 21], "singl": [2, 5, 7, 13, 20], "impl": [2, 7, 14, 20], "instal": [2, 5, 6, 9, 14, 15, 19, 20, 21], "pure": [2, 14], "multi": [2, 7, 14], "hybrid": [2, 20], "waf": 2, "advanc": [3, 4], "concept": [3, 6], "namespac": 3, "hierarch": 3, "structur": 3, "determin": 3, "whether": 3, "ar": [3, 19], "ad": [3, 12, 15, 21], "new": [3, 12, 15], "gentoo": [3, 10], "legaci": [3, 5, 6], "request": 4, "flag": 4, "interpret": [4, 8, 11, 12], "version": [4, 11, 15], "cffi": 4, "greenlet": 4, "distutil": [5, 6, 7, 8, 16], "standard": 5, "pep": [5, 13, 19, 21], "517": [5, 13, 19, 21], "mode": [5, 21], "sourc": [5, 6], "archiv": 5, "variant": 5, "deprec": [16, 19], "backend": [5, 19], "flit": 19, "buildapi": 19, "poetri": 19, "masonri": 19, "api": [8, 19], "setuptool": [6, 19], "build_meta": 19, "__legacy__": 19, "setuptools_scm": 5, "flit_scm": 5, "hatch": 5, "vc": 5, "snapshot": 5, "cython": 5, "parallel": [5, 18], "race": 5, "sub": 5, "phase": [5, 21], "function": [5, 9], "python_prepar": 5, "python_configur": 5, "python_compil": 5, "python_test": 5, "python_instal": 5, "pass": 5, "argument": [5, 18], "setup": 5, "py": 5, "call": 5, "custom": [5, 21], "command": 5, "prevent": [], "test": [4, 5, 6, 15, 18, 19, 21], "directori": [], "being": [], "enabl": 5, "distutils_enable_test": 21, "more": 21, "befor": [6, 21], "run": [18, 21], "undesir": 21, "pytest": [18, 21], "virtualx": 21, "document": [5, 19], "via": [5, 15], "sphinx": 5, "autodoc": 5, "extens": [5, 21], "without": [5, 16], "option": [4, 5], "usag": [5, 8], "rust": [4, 5], "cargo": 5, "manual": [5, 14, 20], "build_dir": 5, "d": 5, "non": 5, "differ": [6, 8], "variat": 6, "distutils_use_setuptool": 6, "entri": 6, "point": 6, "other": [6, 18], "runtim": [6, 7, 20], "pyproject": 6, "toml": [6, 16], "base": [6, 16, 18], "project": [6, 15], "In": 6, "v": [6, 7], "out": 6, "choos": [7, 21], "between": 7, "eclass": [7, 12], "overview": 7, "first": 7, "expert": [8, 18], "partial": 8, "restrict": 8, "implement": [8, 9, 11, 12, 15], "python_setup": 8, "disjoint": 8, "regular": 8, "combin": 8, "helper": 9, "fix": 9, "shebang": 9, "script": 9, "byte": [9, 19], "compil": [9, 19], "modul": [9, 19], "queri": 9, "inform": 9, "guid": [10, 13], "content": 10, "indic": 10, "tabl": 10, "life": 11, "cycl": 11, "stabil": 11, "guarante": 11, "altern": 11, "support": [11, 15], "backport": 11, "mainten": [12, 15], "note": 12, "specif": 12, "cpython": 12, "patchset": 12, "pypi": [12, 15, 21], "profil": 12, "chang": [12, 16], "port": [12, 15, 16], "initi": 12, "bootstrap": 12, "migrat": 13, "old": 13, "python_usedep": 13, "syntax": 13, "eapi": [13, 15], "7": 13, "8": [13, 16], "autotool": 14, "2": 15, "which": 15, "exist": 15, "can": 15, "co": 15, "maintain": 15, "monitor": 15, "releas": 15, "feed": 15, "check": [15, 19], "pip": 15, "repologi": 15, "routin": 15, "outdat": 15, "gpy": 15, "verifi": 15, "dep": 15, "tip": 16, "retroact": 16, "bpo43882": 16, "urlsplit": 16, "now": 16, "strip": 16, "lf": 16, "cr": 16, "ht": 16, "charact": 16, "3": 16, "11": 16, "gener": 16, "coroutin": 16, "remov": [12, 16], "asyncio": 16, "inspect": 16, "getargspec": 16, "formatargspec": 16, "10": 16, "configur": 16, "No": 16, "1": 16, "found": [16, 18], "sysconfig": 16, "9": 16, "base64": 16, "encodestr": 16, "decodestr": 16, "config": 16, "pkg": 16, "longer": 16, "librari": 16, "default": 16, "prefac": 17, "recip": 18, "skip": [18, 21], "marker": 18, "path": 18, "name": [15, 18], "avoid": 18, "runner": [18, 21], "xdist": 18, "plugin": 18, "explicitli": 18, "disabl": 18, "automat": 18, "autoload": 18, "entir": 18, "typeerror": 18, "_make_test_flaki": 18, "got": 18, "an": 18, "unexpect": 18, "keyword": 18, "rerun": 18, "importpathmismatcherror": 18, "fixtur": 18, "warn": [18, 19], "qa": 19, "improv": 19, "report": 19, "portag": 19, "bytecod": 19, "relat": 19, "strai": 19, "A": 20, "resolv": [], "suit": 4, "problem": [], "correct": 21, "miss": 21, "file": [19, 21], "importerror": 21, "c": 21, "checklist": 21, "deal": 21, "failur": 21, "problemat": 21, "requir": 21, "internet": 21, "access": 21, "abort": 21, "due": 21, "assert": 21, "awai": [], "introduct": [], "tomllib": 16, "tomli": 16, "fallback": 16, "w": 16, "replac": 16, "prepar": 12, "polici": 15, "top": 19, "level": 19, "site": 19, "exampl": 19, "why": 21, "i": 21, "import": 21, "case": 21}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 57}, "alltitles": {"python-any-r1 \u2014 build-time dependency": [[0, "python-any-r1-build-time-dependency"]], "Basic use for unconditional Python": [[0, "basic-use-for-unconditional-python"], [20, "basic-use-for-unconditional-python"]], "Dependencies": [[0, "dependencies"], [14, "dependencies"], [20, "dependencies"], [5, "dependencies"]], "Conditional Python use": [[0, "conditional-python-use"], [14, "conditional-python-use"], [20, "conditional-python-use"]], "Additional conditional dependencies": [[0, "additional-conditional-dependencies"]], "Multiple sets of conditional dependencies": [[0, "multiple-sets-of-conditional-dependencies"]], "Common basics": [[1, "common-basics"]], "PYTHON_COMPAT": [[1, "python-compat"]], "PYTHON_DEPS and PYTHON_REQUIRED_USE": [[1, "python-deps-and-python-required-use"]], "Python environment": [[1, "python-environment"]], "Dependencies in Python packages": [[1, "dependencies-in-python-packages"]], "The most common dependency types": [[1, "the-most-common-dependency-types"]], "Finding dependency lists from build systems": [[1, "finding-dependency-lists-from-build-systems"]], "Integration with build systems written in Python": [[2, "integration-with-build-systems-written-in-python"]], "Meson": [[2, "meson"]], "SCons": [[2, "scons"]], "Build-time use with no extra dependencies": [[2, "build-time-use-with-no-extra-dependencies"]], "Build-time use with extra dependencies": [[2, "build-time-use-with-extra-dependencies"]], "Single-impl package": [[2, "single-impl-package"], [2, "id1"]], "Single-impl package with conditional Python install": [[2, "single-impl-package-with-conditional-python-install"]], "Pure Python multi-impl package": [[2, "pure-python-multi-impl-package"]], "Hybrid python-r1 + SCons package": [[2, "hybrid-python-r1-scons-package"]], "waf": [[2, "waf"]], "Build-time use": [[2, "build-time-use"]], "Advanced concepts": [[3, "advanced-concepts"]], "Namespace packages": [[3, "namespace-packages"]], "Hierarchical package structure": [[3, "hierarchical-package-structure"]], "Namespace package structure": [[3, "namespace-package-structure"]], "Determining whether namespaces are used": [[3, "determining-whether-namespaces-are-used"]], "Adding new namespace packages to Gentoo": [[3, "adding-new-namespace-packages-to-gentoo"]], "Legacy namespace packages in Gentoo": [[3, "legacy-namespace-packages-in-gentoo"]], "Advanced dependencies": [[4, "advanced-dependencies"]], "Requesting USE flags on the Python interpreter": [[4, "requesting-use-flags-on-the-python-interpreter"]], "Dependencies conditional to Python version": [[4, "dependencies-conditional-to-python-version"]], "Dependencies on CFFI and greenlet": [[4, "dependencies-on-cffi-and-greenlet"]], "Optional test suite dependencies on Rust packages": [[4, "optional-test-suite-dependencies-on-rust-packages"]], "distutils-r1 legacy concepts": [[6, "distutils-r1-legacy-concepts"]], "Different build system variations": [[6, "different-build-system-variations"]], "DISTUTILS_USE_SETUPTOOLS": [[6, "distutils-use-setuptools"]], "distutils and setuptools build systems": [[6, "distutils-and-setuptools-build-systems"]], "Setuptools\u2019 entry points": [[6, "setuptools-entry-points"]], "Other runtime uses of setuptools": [[6, "other-runtime-uses-of-setuptools"]], "pyproject.toml-based projects": [[6, "pyproject-toml-based-projects"]], "In-source vs out-of-source builds": [[6, "in-source-vs-out-of-source-builds"]], "Installing the package before testing": [[6, "installing-the-package-before-testing"]], "Choosing between Python eclasses": [[7, "choosing-between-python-eclasses"]], "Overview": [[7, "overview"]], "Build time vs runtime use": [[7, "build-time-vs-runtime-use"]], "Single-impl vs multi-impl": [[7, "single-impl-vs-multi-impl"]], "Python-first packages (distutils-r1 eclass)": [[7, "python-first-packages-distutils-r1-eclass"]], "Expert python-r1 usage": [[8, "expert-python-r1-usage"]], "Partially restricting Python implementation": [[8, "partially-restricting-python-implementation"]], "Restricting interpreters for python_setup": [[8, "restricting-interpreters-for-python-setup"]], "Disjoint build dependencies (any-r1 API)": [[8, "disjoint-build-dependencies-any-r1-api"]], "Using regular python-r1 API": [[8, "using-regular-python-r1-api"]], "Using any-r1 API with python-r1": [[8, "using-any-r1-api-with-python-r1"]], "Different sets of build-time dependencies": [[8, "different-sets-of-build-time-dependencies"]], "Using any-r1 API with distutils-r1": [[8, "using-any-r1-api-with-distutils-r1"]], "Combining any-r1 API with implementation restrictions": [[8, "combining-any-r1-api-with-implementation-restrictions"]], "Common helper functions": [[9, "common-helper-functions"]], "Install helpers": [[9, "install-helpers"]], "Fixing shebangs on installed scripts": [[9, "fixing-shebangs-on-installed-scripts"]], "Byte-compiling Python modules": [[9, "byte-compiling-python-modules"]], "Querying the implementation information": [[9, "querying-the-implementation-information"]], "Python interpreters": [[11, "python-interpreters"]], "Versions of Python": [[11, "versions-of-python"]], "Life cycle of a Python implementation": [[11, "life-cycle-of-a-python-implementation"]], "Stability guarantees of Python implementations": [[11, "stability-guarantees-of-python-implementations"]], "Alternative Python implementations": [[11, "alternative-python-implementations"]], "Support for multiple implementations": [[11, "support-for-multiple-implementations"]], "Backports": [[11, "backports"]], "Migration guides": [[13, "migration-guides"]], "Migrating from old PYTHON_USEDEP syntax in python-single-r1": [[13, "migrating-from-old-python-usedep-syntax-in-python-single-r1"]], "Migrating from EAPI 7 to EAPI 8": [[13, "migrating-from-eapi-7-to-eapi-8"]], "Migrating to PEP 517 builds": [[13, "migrating-to-pep-517-builds"]], "python-r1 \u2014 multi-impl packages": [[14, "python-r1-multi-impl-packages"]], "Manual install": [[14, "manual-install"], [20, "manual-install"]], "Pure Python autotools package": [[14, "pure-python-autotools-package"]], "Additional build-time Python use": [[14, "additional-build-time-python-use"]], "Porting tips": [[16, "porting-tips"]], "Retroactive changes": [[16, "retroactive-changes"]], "bpo43882: urlsplit now strips LF, CR and HT characters": [[16, "bpo43882-urlsplit-now-strips-lf-cr-and-ht-characters"]], "Python 3.11": [[16, "python-3-11"]], "Generator-based coroutine removal (asyncio.coroutine)": [[16, "generator-based-coroutine-removal-asyncio-coroutine"]], "inspect.getargspec() and inspect.formatargspec() removal": [[16, "inspect-getargspec-and-inspect-formatargspec-removal"]], "Python 3.10": [[16, "python-3-10"]], "configure: No package \u2018python-3.1\u2019 found": [[16, "configure-no-package-python-3-1-found"]], "distutils.sysconfig deprecation": [[16, "distutils-sysconfig-deprecation"]], "Python 3.9": [[16, "python-3-9"]], "base64.encodestring / base64.decodestring removal": [[16, "base64-encodestring-base64-decodestring-removal"]], "Python 3.8": [[16, "python-3-8"]], "python-config and pkg-config no longer list Python library by default": [[16, "python-config-and-pkg-config-no-longer-list-python-library-by-default"]], "Replacing the toml package": [[16, "replacing-the-toml-package"]], "Porting to tomllib/tomli without toml fallback": [[16, "porting-to-tomllib-tomli-without-toml-fallback"]], "Porting to tomllib/tomli with toml fallback": [[16, "porting-to-tomllib-tomli-with-toml-fallback"]], "Porting to tomli-w": [[16, "porting-to-tomli-w"]], "Preface": [[17, "preface"]], "pytest recipes": [[18, "pytest-recipes"]], "Skipping tests based on markers": [[18, "skipping-tests-based-on-markers"]], "Skipping tests based on paths/names": [[18, "skipping-tests-based-on-paths-names"]], "Avoiding the dependency on pytest-runner": [[18, "avoiding-the-dependency-on-pytest-runner"]], "Using pytest-xdist to run tests in parallel": [[18, "using-pytest-xdist-to-run-tests-in-parallel"]], "Avoiding dependencies on other pytest plugins": [[18, "avoiding-dependencies-on-other-pytest-plugins"]], "Explicitly disabling automatic pytest plugins": [[18, "explicitly-disabling-automatic-pytest-plugins"]], "Expert: disabling plugin autoloading entirely": [[18, "expert-disabling-plugin-autoloading-entirely"]], "TypeError: _make_test_flaky() got an unexpected keyword argument \u2018reruns\u2019": [[18, "typeerror-make-test-flaky-got-an-unexpected-keyword-argument-reruns"]], "ImportPathMismatchError": [[18, "importpathmismatcherror"]], "fixture \u2018\u2026\u2019 not found": [[18, "fixture-not-found"]], "Warnings": [[18, "warnings"]], "python-single-r1 \u2014 single-impl packages": [[20, "python-single-r1-single-impl-packages"]], "A hybrid: build-time + conditional runtime": [[20, "a-hybrid-build-time-conditional-runtime"]], "Multiple USE conditions": [[20, "multiple-use-conditions"]], "Maintenance of Python implementations": [[12, "maintenance-of-python-implementations"]], "Notes specific to Python interpreters": [[12, "notes-specific-to-python-interpreters"]], "CPython patchsets": [[12, "cpython-patchsets"]], "PyPy": [[12, "pypy"]], "Adding a new Python implementation": [[12, "adding-a-new-python-implementation"]], "Eclass and profile changes": [[12, "eclass-and-profile-changes"], [12, "id1"]], "Porting initial packages": [[12, "porting-initial-packages"]], "Removing a Python implementation": [[12, "removing-a-python-implementation"]], "Preparation": [[12, "preparation"]], "Python build system bootstrap": [[12, "python-build-system-bootstrap"]], "Python package maintenance": [[15, "python-package-maintenance"]], "Package name policy": [[15, "package-name-policy"]], "Support for Python 2": [[15, "support-for-python-2"]], "Which implementations to test new packages for?": [[15, "which-implementations-to-test-new-packages-for"]], "Adding new Python implementations to existing packages": [[15, "adding-new-python-implementations-to-existing-packages"]], "Which packages can be (co-)maintained by the Python project?": [[15, "which-packages-can-be-co-maintained-by-the-python-project"]], "Porting packages to a new EAPI": [[15, "porting-packages-to-a-new-eapi"]], "Monitoring new package versions": [[15, "monitoring-new-package-versions"]], "PyPI release feeds": [[15, "pypi-release-feeds"]], "Checking via pip": [[15, "checking-via-pip"]], "Repology": [[15, "repology"]], "Routine checks on installed Python packages": [[15, "routine-checks-on-installed-python-packages"]], "pip check": [[15, "pip-check"]], "pip list --outdated": [[15, "pip-list-outdated"]], "gpy-verify-deps": [[15, "gpy-verify-deps"]], "Gentoo Python Guide": [[10, "gentoo-python-guide"]], "Contents:": [[10, null]], "Indices and tables": [[10, "indices-and-tables"]], "Tests in Python packages": [[21, "tests-in-python-packages"]], "Why is running tests important?": [[21, "why-is-running-tests-important"]], "Using distutils_enable_tests": [[21, "using-distutils-enable-tests"]], "Basic use case": [[21, "basic-use-case"]], "Adding more test dependencies": [[21, "adding-more-test-dependencies"]], "Installing the package before running tests": [[21, "installing-the-package-before-running-tests"]], "Customizing the test phase": [[21, "customizing-the-test-phase"]], "Customizing the test phase for pytest": [[21, "customizing-the-test-phase-for-pytest"]], "Running tests with virtualx": [[21, "running-tests-with-virtualx"]], "Choosing the correct test runner": [[21, "choosing-the-correct-test-runner"]], "Undesirable test dependencies": [[21, "undesirable-test-dependencies"]], "Missing test files in PyPI packages": [[21, "missing-test-files-in-pypi-packages"]], "ImportErrors for C extensions": [[21, "importerrors-for-c-extensions"]], "Checklist for dealing with test failures": [[21, "checklist-for-dealing-with-test-failures"]], "Skipping problematic tests": [[21, "skipping-problematic-tests"]], "Tests requiring Internet access": [[21, "tests-requiring-internet-access"]], "Tests aborting (due to assertions)": [[21, "tests-aborting-due-to-assertions"]], "Installing extra dependencies in test environment (PEP 517 mode)": [[21, "installing-extra-dependencies-in-test-environment-pep-517-mode"]], "distutils-r1 \u2014 standard Python build systems": [[5, "distutils-r1-standard-python-build-systems"]], "The PEP 517 and legacy modes": [[5, "the-pep-517-and-legacy-modes"]], "Basic use (PEP 517 mode)": [[5, "basic-use-pep-517-mode"]], "Source archives": [[5, "source-archives"]], "python-single-r1 variant": [[5, "python-single-r1-variant"]], "PEP 517 build systems": [[5, "pep-517-build-systems"]], "setuptools_scm (flit_scm, hatch-vcs) and snapshots": [[5, "setuptools-scm-flit-scm-hatch-vcs-and-snapshots"]], "Packages using Cython": [[5, "packages-using-cython"]], "Parallel build race conditions": [[5, "parallel-build-race-conditions"]], "Sub-phase functions": [[5, "sub-phase-functions"]], "python_prepare": [[5, "python-prepare"]], "python_configure": [[5, "python-configure"]], "python_compile": [[5, "python-compile"]], "python_test": [[5, "python-test"]], "python_install": [[5, "python-install"]], "Passing arguments to setup.py": [[5, "passing-arguments-to-setup-py"]], "Calling custom setup.py commands": [[5, "calling-custom-setup-py-commands"]], "Enabling tests": [[5, "enabling-tests"]], "Building documentation via Sphinx": [[5, "building-documentation-via-sphinx"]], "Basic documentation with autodoc": [[5, "basic-documentation-with-autodoc"]], "Additional Sphinx extensions": [[5, "additional-sphinx-extensions"]], "Sphinx without autodoc or extensions": [[5, "sphinx-without-autodoc-or-extensions"]], "Packages with optional Python build system usage": [[5, "packages-with-optional-python-build-system-usage"]], "Packages with Rust extensions (using Cargo)": [[5, "packages-with-rust-extensions-using-cargo"]], "Installing packages without a PEP 517 build backend": [[5, "installing-packages-without-a-pep-517-build-backend"]], "Installing packages manually into BUILD_DIR": [[5, "installing-packages-manually-into-build-dir"]], "Installing packages manually into D": [[5, "installing-packages-manually-into-d"]], "Integrating with a non-PEP 517 build system": [[5, "integrating-with-a-non-pep-517-build-system"]], "QA checks and warnings": [[19, "qa-checks-and-warnings"]], "Improved QA warning reporting in Portage": [[19, "improved-qa-warning-reporting-in-portage"]], "Compiled bytecode-related warnings": [[19, "compiled-bytecode-related-warnings"]], "Modules are not byte-compiled": [[19, "modules-are-not-byte-compiled"]], "Stray compiled bytecode": [[19, "stray-compiled-bytecode"]], "Stray top-level files in site-packages": [[19, "stray-top-level-files-in-site-packages"]], "Example or test packages installed by setuptools": [[19, "example-or-test-packages-installed-by-setuptools"]], "Documentation files installed by Poetry": [[19, "documentation-files-installed-by-poetry"]], "Deprecated PEP 517 backends": [[19, "deprecated-pep-517-backends"]], "flit.buildapi": [[19, "flit-buildapi"]], "poetry.masonry.api": [[19, "poetry-masonry-api"]], "setuptools.build_meta:__legacy__": [[19, "setuptools-build-meta-legacy"]]}, "indexentries": {}}) \ No newline at end of file
diff --git a/guide/test.html b/guide/test.html
index 7f7d192..ec74507 100644
--- a/guide/test.html
+++ b/guide/test.html
@@ -6,7 +6,7 @@
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
- <title>Resolving test suite problems &#8212; Gentoo Python Guide documentation</title>
+ <title>Tests in Python packages &#8212; Gentoo Python Guide documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="_static/alabaster.css" />
<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
@@ -14,8 +14,8 @@
<script src="_static/sphinx_highlight.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
- <link rel="next" title="pytest recipes" href="pytest.html" />
- <link rel="prev" title="Advanced dependencies" href="depend.html" />
+ <link rel="next" title="distutils-r1 legacy concepts" href="distutils-legacy.html" />
+ <link rel="prev" title="distutils-r1 — standard Python build systems" href="distutils.html" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
@@ -32,8 +32,249 @@
<div class="body" role="main">
- <section id="resolving-test-suite-problems">
-<h1>Resolving test suite problems<a class="headerlink" href="#resolving-test-suite-problems" title="Permalink to this heading">¶</a></h1>
+ <section id="tests-in-python-packages">
+<h1>Tests in Python packages<a class="headerlink" href="#tests-in-python-packages" title="Permalink to this heading">¶</a></h1>
+<section id="why-is-running-tests-important">
+<h2>Why is running tests important?<a class="headerlink" href="#why-is-running-tests-important" title="Permalink to this heading">¶</a></h2>
+<p>Since Python performs only minimal build-time (or more precisely,
+import-time) checking of correctness, it is important to run tests
+of Python packages in order to catch any problems early. This is
+especially important for permitting others to verify support for new
+Python implementations.</p>
+</section>
+<section id="using-distutils-enable-tests">
+<span id="index-0"></span><h2>Using distutils_enable_tests<a class="headerlink" href="#using-distutils-enable-tests" title="Permalink to this heading">¶</a></h2>
+<section id="basic-use-case">
+<h3>Basic use case<a class="headerlink" href="#basic-use-case" title="Permalink to this heading">¶</a></h3>
+<p>The simplest way of enabling tests is to call <code class="docutils literal notranslate"><span class="pre">distutils_enable_tests</span></code>
+in global scope, passing the test runner name as the first argument.
+This function takes care of declaring test phase, setting appropriate
+dependencies and <code class="docutils literal notranslate"><span class="pre">test</span></code> USE flag if necessary. If called after
+setting <code class="docutils literal notranslate"><span class="pre">RDEPEND</span></code>, it also copies it to test dependencies.</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="c1"># Copyright 1999-2020 Gentoo Authors</span>
+<span class="w"> </span><span class="c1"># Distributed under the terms of the GNU General Public License v2</span>
+
+<span class="w"> </span><span class="nv">EAPI</span><span class="o">=</span><span class="m">7</span>
+
+<span class="w"> </span><span class="nv">PYTHON_COMPAT</span><span class="o">=(</span><span class="w"> </span>python2_7<span class="w"> </span>python3_<span class="o">{</span><span class="m">6</span>,7,8<span class="o">}</span><span class="w"> </span>pypy3<span class="w"> </span><span class="o">)</span>
+<span class="w"> </span>inherit<span class="w"> </span>distutils-r1
+
+<span class="w"> </span><span class="nv">DESCRIPTION</span><span class="o">=</span><span class="s2">&quot;An easy whitelist-based HTML-sanitizing tool&quot;</span>
+<span class="w"> </span><span class="nv">HOMEPAGE</span><span class="o">=</span><span class="s2">&quot;https://github.com/mozilla/bleach https://pypi.org/project/bleach/&quot;</span>
+<span class="w"> </span><span class="nv">SRC_URI</span><span class="o">=</span><span class="s2">&quot;mirror://pypi/</span><span class="si">${</span><span class="nv">PN</span><span class="p">:</span><span class="nv">0</span><span class="p">:</span><span class="nv">1</span><span class="si">}</span><span class="s2">/</span><span class="si">${</span><span class="nv">PN</span><span class="si">}</span><span class="s2">/</span><span class="si">${</span><span class="nv">P</span><span class="si">}</span><span class="s2">.tar.gz&quot;</span>
+
+<span class="w"> </span><span class="nv">LICENSE</span><span class="o">=</span><span class="s2">&quot;Apache-2.0&quot;</span>
+<span class="w"> </span><span class="nv">SLOT</span><span class="o">=</span><span class="s2">&quot;0&quot;</span>
+<span class="w"> </span><span class="nv">KEYWORDS</span><span class="o">=</span><span class="s2">&quot;~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~mips ~ppc ~ppc64 ~s390 ~sparc ~x86&quot;</span>
+
+<span class="w"> </span><span class="nv">RDEPEND</span><span class="o">=</span><span class="s2">&quot;</span>
+<span class="s2"> dev-python/six[</span><span class="si">${</span><span class="nv">PYTHON_USEDEP</span><span class="si">}</span><span class="s2">]</span>
+<span class="s2"> dev-python/webencodings[</span><span class="si">${</span><span class="nv">PYTHON_USEDEP</span><span class="si">}</span><span class="s2">]</span>
+<span class="s2"> &quot;</span>
+
+<span class="hll"><span class="w"> </span>distutils_enable_tests<span class="w"> </span>pytest
+</span></pre></div>
+</div>
+<p>The valid values include:</p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">nose</span></code> for <code class="docutils literal notranslate"><span class="pre">dev-python/nose</span></code> (<em>deprecated</em>)</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">pytest</span></code> for <code class="docutils literal notranslate"><span class="pre">dev-python/pytest</span></code></p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">setup.py</span></code> to call <code class="docutils literal notranslate"><span class="pre">setup.py</span> <span class="pre">test</span></code> (<em>deprecated</em>)</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">unittest</span></code> to use built-in unittest discovery</p></li>
+</ul>
+<p>See <a class="reference internal" href="#choosing-the-correct-test-runner">choosing the correct test runner</a> for more information.</p>
+</section>
+<section id="adding-more-test-dependencies">
+<h3>Adding more test dependencies<a class="headerlink" href="#adding-more-test-dependencies" title="Permalink to this heading">¶</a></h3>
+<p>Additional test dependencies can be specified in <code class="docutils literal notranslate"><span class="pre">test?</span></code> conditional.
+The flag normally does not need to be explicitly declared,
+as <code class="docutils literal notranslate"><span class="pre">distutils_enable_tests</span></code> does that in the majority of cases.</p>
+<p>Please read the section on <a class="reference internal" href="#undesirable-test-dependencies">undesirable test dependencies</a> too.</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="c1"># Copyright 1999-2020 Gentoo Authors</span>
+<span class="w"> </span><span class="c1"># Distributed under the terms of the GNU General Public License v2</span>
+
+<span class="w"> </span><span class="nv">EAPI</span><span class="o">=</span><span class="m">6</span>
+
+<span class="w"> </span><span class="nv">PYTHON_COMPAT</span><span class="o">=(</span><span class="w"> </span>python2_7<span class="w"> </span>python3_<span class="o">{</span><span class="m">6</span>,7,8<span class="o">}</span><span class="w"> </span>pypy3<span class="w"> </span><span class="o">)</span>
+<span class="w"> </span>inherit<span class="w"> </span>distutils-r1
+
+<span class="w"> </span><span class="nv">DESCRIPTION</span><span class="o">=</span><span class="s2">&quot;Universal encoding detector&quot;</span>
+<span class="w"> </span><span class="nv">HOMEPAGE</span><span class="o">=</span><span class="s2">&quot;https://github.com/chardet/chardet https://pypi.org/project/chardet/&quot;</span>
+<span class="w"> </span><span class="nv">SRC_URI</span><span class="o">=</span><span class="s2">&quot;https://github.com/chardet/chardet/archive/</span><span class="si">${</span><span class="nv">PV</span><span class="si">}</span><span class="s2">.tar.gz -&gt; </span><span class="si">${</span><span class="nv">P</span><span class="si">}</span><span class="s2">.tar.gz&quot;</span>
+
+<span class="w"> </span><span class="nv">LICENSE</span><span class="o">=</span><span class="s2">&quot;LGPL-2.1&quot;</span>
+<span class="w"> </span><span class="nv">SLOT</span><span class="o">=</span><span class="s2">&quot;0&quot;</span>
+<span class="w"> </span><span class="nv">KEYWORDS</span><span class="o">=</span><span class="s2">&quot;~alpha amd64 arm arm64 hppa ia64 ~m68k ~mips ppc ppc64 s390 ~sh sparc x86 ~x64-cygwin ~amd64-linux ~x86-linux ~x64-macos ~x86-macos ~x64-solaris&quot;</span>
+
+<span class="w"> </span><span class="nv">DEPEND</span><span class="o">=</span><span class="s2">&quot;</span>
+<span class="hll"><span class="s2"> test? ( dev-python/hypothesis[</span><span class="si">${</span><span class="nv">PYTHON_USEDEP</span><span class="si">}</span><span class="s2">] )</span>
+</span><span class="s2"> &quot;</span>
+
+<span class="hll"><span class="w"> </span>distutils_enable_tests<span class="w"> </span>pytest
+</span></pre></div>
+</div>
+<p>Note that <code class="docutils literal notranslate"><span class="pre">distutils_enable_tests</span></code> modifies variables directly
+in the ebuild environment. This means that if you wish to change their
+values, you need to append to them, i.e. the bottom part of that ebuild
+can be rewritten as:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="w"> </span>distutils_enable_tests<span class="w"> </span>pytest
+
+<span class="hll"><span class="w"> </span><span class="nv">DEPEND</span><span class="o">+=</span><span class="s2">&quot;</span>
+</span><span class="s2"> test? ( dev-python/hypothesis[</span><span class="si">${</span><span class="nv">PYTHON_USEDEP</span><span class="si">}</span><span class="s2">] )</span>
+<span class="s2"> &quot;</span>
+</pre></div>
+</div>
+</section>
+<section id="installing-the-package-before-running-tests">
+<h3>Installing the package before running tests<a class="headerlink" href="#installing-the-package-before-running-tests" title="Permalink to this heading">¶</a></h3>
+<p>In PEP 517 mode, the eclass automatically exposes a venv-style install
+tree to the test phase. No explicit action in necessary.</p>
+<p>In the legacy mode, <code class="docutils literal notranslate"><span class="pre">distutils_enable_tests</span></code> has an optional
+<code class="docutils literal notranslate"><span class="pre">--install</span></code> option that can be used to force performing an install
+to a temporary directory. More information can be found in the legacy
+section.</p>
+</section>
+<section id="customizing-the-test-phase">
+<h3>Customizing the test phase<a class="headerlink" href="#customizing-the-test-phase" title="Permalink to this heading">¶</a></h3>
+<p>If additional pre-/post-test phase actions need to be performed,
+they can be easily injected via overriding <code class="docutils literal notranslate"><span class="pre">src_test()</span></code> and making
+it call <code class="docutils literal notranslate"><span class="pre">distutils-r1_src_test</span></code>:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="c1"># Copyright 1999-2020 Gentoo Authors</span>
+<span class="w"> </span><span class="c1"># Distributed under the terms of the GNU General Public License v2</span>
+
+<span class="w"> </span><span class="nv">EAPI</span><span class="o">=</span><span class="m">7</span>
+
+<span class="w"> </span><span class="nv">PYTHON_COMPAT</span><span class="o">=(</span><span class="w"> </span>python3_<span class="o">{</span><span class="m">6</span>,7,8<span class="o">}</span><span class="w"> </span><span class="o">)</span>
+<span class="w"> </span>inherit<span class="w"> </span>distutils-r1
+
+<span class="w"> </span><span class="nv">DESCRIPTION</span><span class="o">=</span><span class="s2">&quot;Extra features for standard library&#39;s cmd module&quot;</span>
+<span class="w"> </span><span class="nv">HOMEPAGE</span><span class="o">=</span><span class="s2">&quot;https://github.com/python-cmd2/cmd2&quot;</span>
+<span class="w"> </span><span class="nv">SRC_URI</span><span class="o">=</span><span class="s2">&quot;mirror://pypi/</span><span class="si">${</span><span class="nv">PN</span><span class="p">:</span><span class="nv">0</span><span class="p">:</span><span class="nv">1</span><span class="si">}</span><span class="s2">/</span><span class="si">${</span><span class="nv">PN</span><span class="si">}</span><span class="s2">/</span><span class="si">${</span><span class="nv">P</span><span class="si">}</span><span class="s2">.tar.gz&quot;</span>
+
+<span class="w"> </span><span class="nv">LICENSE</span><span class="o">=</span><span class="s2">&quot;MIT&quot;</span>
+<span class="w"> </span><span class="nv">SLOT</span><span class="o">=</span><span class="s2">&quot;0&quot;</span>
+<span class="w"> </span><span class="nv">KEYWORDS</span><span class="o">=</span><span class="s2">&quot;~amd64 ~arm ~arm64 ~ppc64 ~x86 ~amd64-linux ~x86-linux&quot;</span>
+
+<span class="w"> </span><span class="nv">RDEPEND</span><span class="o">=</span><span class="s2">&quot;</span>
+<span class="s2"> dev-python/attrs[</span><span class="si">${</span><span class="nv">PYTHON_USEDEP</span><span class="si">}</span><span class="s2">]</span>
+<span class="s2"> &gt;=dev-python/colorama-0.3.7[</span><span class="si">${</span><span class="nv">PYTHON_USEDEP</span><span class="si">}</span><span class="s2">]</span>
+<span class="s2"> &gt;=dev-python/pyperclip-1.6[</span><span class="si">${</span><span class="nv">PYTHON_USEDEP</span><span class="si">}</span><span class="s2">]</span>
+<span class="s2"> dev-python/six[</span><span class="si">${</span><span class="nv">PYTHON_USEDEP</span><span class="si">}</span><span class="s2">]</span>
+<span class="s2"> dev-python/wcwidth[</span><span class="si">${</span><span class="nv">PYTHON_USEDEP</span><span class="si">}</span><span class="s2">]</span>
+<span class="s2"> &quot;</span>
+<span class="w"> </span><span class="nv">BDEPEND</span><span class="o">=</span><span class="s2">&quot;</span>
+<span class="s2"> dev-python/setuptools_scm[</span><span class="si">${</span><span class="nv">PYTHON_USEDEP</span><span class="si">}</span><span class="s2">]</span>
+<span class="s2"> &quot;</span>
+
+<span class="w"> </span>distutils_enable_tests<span class="w"> </span>pytest
+
+<span class="hll"><span class="w"> </span>src_test<span class="o">()</span><span class="w"> </span><span class="o">{</span>
+</span><span class="hll"><span class="w"> </span><span class="c1"># tests rely on very specific text wrapping...</span>
+</span><span class="hll"><span class="w"> </span><span class="nb">local</span><span class="w"> </span>-x<span class="w"> </span><span class="nv">COLUMNS</span><span class="o">=</span><span class="m">80</span>
+</span><span class="hll"><span class="w"> </span>distutils-r1_src_test
+</span><span class="hll"><span class="w"> </span><span class="o">}</span>
+</span></pre></div>
+</div>
+<p>If the actual test command needs to be customized, or a non-standard
+test tool needs to be used, you can define a <code class="docutils literal notranslate"><span class="pre">python_test()</span></code> sub-phase
+function. This function is called for every enabled Python target
+by the default <code class="docutils literal notranslate"><span class="pre">src_test</span></code> implementation. This can either be combined
+with <code class="docutils literal notranslate"><span class="pre">distutils_enable_tests</span></code> call, or used instead of it. In fact,
+the former function simply defines a <code class="docutils literal notranslate"><span class="pre">python_test()</span></code> function as part
+of its logic.</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="c1"># Copyright 1999-2020 Gentoo Authors</span>
+<span class="w"> </span><span class="c1"># Distributed under the terms of the GNU General Public License v2</span>
+
+<span class="w"> </span><span class="nv">EAPI</span><span class="o">=</span><span class="m">7</span>
+
+<span class="w"> </span><span class="nv">PYTHON_COMPAT</span><span class="o">=(</span><span class="w"> </span>python<span class="o">{</span>2_7,3_6,3_7,3_8<span class="o">}</span><span class="w"> </span>pypy3<span class="w"> </span><span class="o">)</span>
+<span class="w"> </span>inherit<span class="w"> </span>distutils-r1
+
+<span class="w"> </span><span class="nv">DESCRIPTION</span><span class="o">=</span><span class="s2">&quot;Bash tab completion for argparse&quot;</span>
+<span class="w"> </span><span class="nv">HOMEPAGE</span><span class="o">=</span><span class="s2">&quot;https://pypi.org/project/argcomplete/&quot;</span>
+<span class="w"> </span><span class="nv">SRC_URI</span><span class="o">=</span><span class="s2">&quot;mirror://pypi/</span><span class="si">${</span><span class="nv">PN</span><span class="p">:</span><span class="nv">0</span><span class="p">:</span><span class="nv">1</span><span class="si">}</span><span class="s2">/</span><span class="si">${</span><span class="nv">PN</span><span class="si">}</span><span class="s2">/</span><span class="si">${</span><span class="nv">P</span><span class="si">}</span><span class="s2">.tar.gz&quot;</span>
+
+<span class="w"> </span><span class="nv">LICENSE</span><span class="o">=</span><span class="s2">&quot;Apache-2.0&quot;</span>
+<span class="w"> </span><span class="nv">SLOT</span><span class="o">=</span><span class="s2">&quot;0&quot;</span>
+<span class="w"> </span><span class="nv">KEYWORDS</span><span class="o">=</span><span class="s2">&quot;~amd64 ~arm ~arm64 ~hppa ~x86 ~amd64-linux ~x86-linux ~x64-macos&quot;</span>
+<span class="hll"><span class="w"> </span><span class="nv">IUSE</span><span class="o">=</span><span class="s2">&quot;test&quot;</span>
+</span><span class="hll"><span class="w"> </span><span class="nv">RESTRICT</span><span class="o">=</span><span class="s2">&quot;!test? ( test )&quot;</span>
+</span>
+<span class="w"> </span><span class="nv">RDEPEND</span><span class="o">=</span><span class="s2">&quot;</span>
+<span class="s2"> </span><span class="k">$(</span>python_gen_cond_dep<span class="w"> </span><span class="s1">&#39;</span>
+<span class="s1"> &lt;dev-python/importlib_metadata-2[${PYTHON_USEDEP}]</span>
+<span class="s1"> &#39;</span><span class="w"> </span>-2<span class="w"> </span>python3_<span class="o">{</span><span class="m">5</span>,6,7<span class="o">}</span><span class="w"> </span>pypy3<span class="k">)</span><span class="s2">&quot;</span>
+<span class="w"> </span><span class="c1"># pip is called as an external tool</span>
+<span class="w"> </span><span class="nv">BDEPEND</span><span class="o">=</span><span class="s2">&quot;</span>
+<span class="s2"> dev-python/setuptools[</span><span class="si">${</span><span class="nv">PYTHON_USEDEP</span><span class="si">}</span><span class="s2">]</span>
+<span class="hll"><span class="s2"> test? (</span>
+</span><span class="hll"><span class="s2"> app-shells/fish</span>
+</span><span class="hll"><span class="s2"> app-shells/tcsh</span>
+</span><span class="hll"><span class="s2"> dev-python/pexpect[</span><span class="si">${</span><span class="nv">PYTHON_USEDEP</span><span class="si">}</span><span class="s2">]</span>
+</span><span class="hll"><span class="s2"> dev-python/pip</span>
+</span><span class="hll"><span class="s2"> )&quot;</span>
+</span>
+<span class="hll"><span class="w"> </span>python_test<span class="o">()</span><span class="w"> </span><span class="o">{</span>
+</span><span class="hll"><span class="w"> </span><span class="s2">&quot;</span><span class="si">${</span><span class="nv">EPYTHON</span><span class="si">}</span><span class="s2">&quot;</span><span class="w"> </span>test/test.py<span class="w"> </span>-v<span class="w"> </span><span class="o">||</span><span class="w"> </span>die
+</span><span class="hll"><span class="w"> </span><span class="o">}</span>
+</span></pre></div>
+</div>
+<p>Note that <code class="docutils literal notranslate"><span class="pre">python_test</span></code> is called by <code class="docutils literal notranslate"><span class="pre">distutils-r1_src_test</span></code>,
+so you must make sure to call it if you override <code class="docutils literal notranslate"><span class="pre">src_test</span></code>.</p>
+</section>
+<section id="customizing-the-test-phase-for-pytest">
+<span id="index-1"></span><h3>Customizing the test phase for pytest<a class="headerlink" href="#customizing-the-test-phase-for-pytest" title="Permalink to this heading">¶</a></h3>
+<p>For the relatively frequent case of pytest-based packages needing
+additional customization, a <code class="docutils literal notranslate"><span class="pre">epytest</span></code> helper is provided. The helper
+runs <code class="docutils literal notranslate"><span class="pre">pytest</span></code> with a standard set of options and automatic handling
+of test failures.</p>
+<p>For example, if upstream uses <code class="docutils literal notranslate"><span class="pre">network</span></code> marker to disable
+network-based tests, you can override the test phase in the following
+way:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>distutils_enable_tests<span class="w"> </span>pytest
+
+python_test<span class="o">()</span><span class="w"> </span><span class="o">{</span>
+<span class="w"> </span>epytest<span class="w"> </span>-m<span class="w"> </span><span class="s1">&#39;not network&#39;</span>
+<span class="o">}</span>
+</pre></div>
+</div>
+</section>
+<section id="running-tests-with-virtualx">
+<span id="index-2"></span><h3>Running tests with virtualx<a class="headerlink" href="#running-tests-with-virtualx" title="Permalink to this heading">¶</a></h3>
+<p>Test suites requiring a display to work correctly can often be appeased
+usng Xvfb. If the package in question does not start Xvfb directly,
+<code class="docutils literal notranslate"><span class="pre">virtualx.eclass</span></code> can be used to do that. Whenever possible, it is
+preferable to run a single server in <code class="docutils literal notranslate"><span class="pre">src_test()</span></code> for all passes
+of the test suite, e.g.:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>distutils_enable_tests<span class="w"> </span>pytest
+
+src_test<span class="o">()</span><span class="w"> </span><span class="o">{</span>
+<span class="w"> </span>virtx<span class="w"> </span>distutils-r1_src_test
+<span class="o">}</span>
+</pre></div>
+</div>
+<p>Note that <code class="docutils literal notranslate"><span class="pre">virtx</span></code> implicitly enables nonfatal mode. This means that
+e.g. <code class="docutils literal notranslate"><span class="pre">epytest</span></code> will no longer terminate the ebuild on failure, and you
+need to use <code class="docutils literal notranslate"><span class="pre">die</span></code> explicitly for it:</p>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>src_test<span class="o">()</span><span class="w"> </span><span class="o">{</span>
+<span class="w"> </span>virtx<span class="w"> </span>distutils-r1_src_test
+<span class="o">}</span>
+
+python_test<span class="o">()</span><span class="w"> </span><span class="o">{</span>
+<span class="w"> </span>epytest<span class="w"> </span>-m<span class="w"> </span><span class="s2">&quot;not network&quot;</span><span class="w"> </span><span class="o">||</span><span class="w"> </span>die<span class="w"> </span><span class="s2">&quot;Tests failed with </span><span class="si">${</span><span class="nv">EPYTHON</span><span class="si">}</span><span class="s2">&quot;</span>
+<span class="o">}</span>
+</pre></div>
+</div>
+<div class="admonition warning">
+<p class="admonition-title">Warning</p>
+<p>Explicit <code class="docutils literal notranslate"><span class="pre">||</span> <span class="pre">die</span></code> is only necessary when overriding <code class="docutils literal notranslate"><span class="pre">python_test</span></code>
+and running <code class="docutils literal notranslate"><span class="pre">epytest</span></code> inside a <code class="docutils literal notranslate"><span class="pre">nonfatal</span></code>. The <code class="docutils literal notranslate"><span class="pre">virtx</span></code> command
+runs its arguments via a <code class="docutils literal notranslate"><span class="pre">nonfatal</span></code>. The default <code class="docutils literal notranslate"><span class="pre">python_test</span></code>
+implementation created by <code class="docutils literal notranslate"><span class="pre">distutils_enable_tests</span></code> accounts for
+this. In other contexts, <code class="docutils literal notranslate"><span class="pre">epytest</span></code> will die on its own.</p>
+</div>
+</section>
+</section>
<section id="choosing-the-correct-test-runner">
<h2>Choosing the correct test runner<a class="headerlink" href="#choosing-the-correct-test-runner" title="Permalink to this heading">¶</a></h2>
<p>There are a few modules used to run tests in Python packages. The most
@@ -71,6 +312,31 @@ as the latter has ceased development and requires downstream patching.
If you have some free time, convincing upstream to switch from nose
to pytest is a worthwhile goal.</p>
</section>
+<section id="undesirable-test-dependencies">
+<h2>Undesirable test dependencies<a class="headerlink" href="#undesirable-test-dependencies" title="Permalink to this heading">¶</a></h2>
+<p>There is a number of packages that are frequently listed as test
+dependencies upstream but have little to no value for Gentoo users.
+It is recommended to skip those test dependencies whenever possible.
+If tests fail to run without them, it is often preferable to strip
+the dependencies and/or configuration values enforcing them.</p>
+<p><em>Coverage testing</em> establishes how much of the package’s code is covered
+by the test suite. While this is useful statistic upstream, it has
+no value for Gentoo users who just want to install the package. This
+is often represented by dependencies on <code class="docutils literal notranslate"><span class="pre">dev-python/coverage</span></code>,
+<code class="docutils literal notranslate"><span class="pre">dev-python/pytest-cov</span></code>. In the latter case, you usually need
+to strip <code class="docutils literal notranslate"><span class="pre">--cov</span></code> parameter from <code class="docutils literal notranslate"><span class="pre">pytest.ini</span></code>.</p>
+<p><em>PEP-8 testing</em> enforces standard coding style across Python programs.
+Issues found by it are relevant to upstream but entirely irrelevant
+to Gentoo users. If the package uses <code class="docutils literal notranslate"><span class="pre">dev-python/pep8</span></code>,
+<code class="docutils literal notranslate"><span class="pre">dev-python/pycodestyle</span></code>, <code class="docutils literal notranslate"><span class="pre">dev-python/flake8</span></code>, strip that
+dependency.</p>
+<p><code class="docutils literal notranslate"><span class="pre">dev-python/pytest-runner</span></code> is a thin wrapper to run pytest
+from <code class="docutils literal notranslate"><span class="pre">setup.py</span></code>. Do not use it, just call pytest directly.</p>
+<p><code class="docutils literal notranslate"><span class="pre">dev-python/tox</span></code> is a convenient wrapper to run tests for multiple
+Python versions, in a virtualenv. The eclass already provides the logic
+for the former, and an environment close enough to the latter. Do not
+use tox in ebuilds.</p>
+</section>
<section id="missing-test-files-in-pypi-packages">
<h2>Missing test files in PyPI packages<a class="headerlink" href="#missing-test-files-in-pypi-packages" title="Permalink to this heading">¶</a></h2>
<p>One of the more common test-related problems is that PyPI packages
@@ -411,11 +677,11 @@ into it for the purpose of testing. Note that <code class="docutils literal not
<li class="toctree-l1"><a class="reference internal" href="single.html">python-single-r1 — single-impl packages</a></li>
<li class="toctree-l1"><a class="reference internal" href="multi.html">python-r1 — multi-impl packages</a></li>
<li class="toctree-l1"><a class="reference internal" href="distutils.html">distutils-r1 — standard Python build systems</a></li>
-<li class="toctree-l1"><a class="reference internal" href="distutils-legacy.html">distutils-r1 legacy concepts</a></li>
-<li class="toctree-l1"><a class="reference internal" href="helper.html">Common helper functions</a></li>
-<li class="toctree-l1"><a class="reference internal" href="depend.html">Advanced dependencies</a></li>
-<li class="toctree-l1 current"><a class="current reference internal" href="#">Resolving test suite problems</a><ul>
+<li class="toctree-l1 current"><a class="current reference internal" href="#">Tests in Python packages</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="#why-is-running-tests-important">Why is running tests important?</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#using-distutils-enable-tests">Using distutils_enable_tests</a></li>
<li class="toctree-l2"><a class="reference internal" href="#choosing-the-correct-test-runner">Choosing the correct test runner</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#undesirable-test-dependencies">Undesirable test dependencies</a></li>
<li class="toctree-l2"><a class="reference internal" href="#missing-test-files-in-pypi-packages">Missing test files in PyPI packages</a></li>
<li class="toctree-l2"><a class="reference internal" href="#importerrors-for-c-extensions">ImportErrors for C extensions</a></li>
<li class="toctree-l2"><a class="reference internal" href="#checklist-for-dealing-with-test-failures">Checklist for dealing with test failures</a></li>
@@ -425,6 +691,9 @@ into it for the purpose of testing. Note that <code class="docutils literal not
<li class="toctree-l2"><a class="reference internal" href="#installing-extra-dependencies-in-test-environment-pep-517-mode">Installing extra dependencies in test environment (PEP 517 mode)</a></li>
</ul>
</li>
+<li class="toctree-l1"><a class="reference internal" href="distutils-legacy.html">distutils-r1 legacy concepts</a></li>
+<li class="toctree-l1"><a class="reference internal" href="helper.html">Common helper functions</a></li>
+<li class="toctree-l1"><a class="reference internal" href="depend.html">Advanced dependencies</a></li>
<li class="toctree-l1"><a class="reference internal" href="pytest.html">pytest recipes</a></li>
<li class="toctree-l1"><a class="reference internal" href="concept.html">Advanced concepts</a></li>
<li class="toctree-l1"><a class="reference internal" href="expert-multi.html">Expert python-r1 usage</a></li>
@@ -440,8 +709,8 @@ into it for the purpose of testing. Note that <code class="docutils literal not
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
- <li>Previous: <a href="depend.html" title="previous chapter">Advanced dependencies</a></li>
- <li>Next: <a href="pytest.html" title="next chapter">pytest recipes</a></li>
+ <li>Previous: <a href="distutils.html" title="previous chapter">distutils-r1 — standard Python build systems</a></li>
+ <li>Next: <a href="distutils-legacy.html" title="next chapter">distutils-r1 legacy concepts</a></li>
</ul></li>
</ul>
</div>