commit:     ec67342e2635049fcba3755a0efaab3e02bbbecc
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Sat Jul  5 06:31:02 2025 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Sat Jul 12 05:05:19 2025 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=ec67342e

python-utils-r1.eclass: Add EPYTEST_PLUGIN_LOAD_VIA_ENV

Add an `EPYTEST_PLUGIN_LOAD_VIA_ENV` option to explicitly load plugins
via `PYTEST_PLUGINS` environment variable rather than `-p` options.
This is useful for testing pytest plugins.

While the use case is not very common and therefore may not deserve
explicit eclass support, the value of `PYTEST_PLUGINS` consists
of Python import names that are not trivial to find and have
historically changed across package versions.

Signed-off-by: Michał Górny <mgorny <AT> gentoo.org>
Part-of: https://github.com/gentoo/gentoo/pull/42876
Signed-off-by: Michał Górny <mgorny <AT> gentoo.org>

 eclass/python-utils-r1.eclass | 62 +++++++++++++++++++++++++++++++------------
 1 file changed, 45 insertions(+), 17 deletions(-)

diff --git a/eclass/python-utils-r1.eclass b/eclass/python-utils-r1.eclass
index bbb57901f281..68faa9e2adf9 100644
--- a/eclass/python-utils-r1.eclass
+++ b/eclass/python-utils-r1.eclass
@@ -1312,6 +1312,15 @@ _python_check_occluded_packages() {
 # The recommended way to disable it in EAPI 8 or earlier is to set
 # EPYTEST_PLUGINS (possibly to an empty array).
 
+# @ECLASS_VARIABLE: EPYTEST_PLUGIN_LOAD_VIA_ENV
+# @DEFAULT_UNSET
+# @DESCRIPTION:
+# If set to a non-empty value, plugins will be loaded via PYTEST_PLUGINS
+# environment variable rather than explicit "-p" options.  This ensures
+# that plugins are passed down to subprocess, which may be necessary
+# when testing pytest plugins.  However, this is also more likely
+# to cause duplicate plugin errors.
+
 # @FUNCTION: _set_epytest_plugins
 # @INTERNAL
 # @DESCRIPTION:
@@ -1442,23 +1451,39 @@ epytest() {
 
        if [[ ${PYTEST_DISABLE_PLUGIN_AUTOLOAD} ]]; then
                if [[ ${EPYTEST_PLUGINS[@]} ]]; then
-                       local plugin_args=()
-                       readarray -t -d '' plugin_args < <(
-                               "${EPYTHON}" - "${EPYTEST_PLUGINS[@]}" <<-EOF 
|| die
-                                       import os
-                                       import sys
-                                       from importlib.metadata import 
distribution, entry_points
-
-                                       env_plugins = 
os.environ.get("PYTEST_PLUGINS", "").split(",")
-                                       packages = {distribution(x).name for x 
in sys.argv[1:]}
-                                       eps = {
-                                               f"-p{x.name}" for x in 
entry_points(group="pytest11")
-                                               if x.dist.name in packages and 
x.value not in env_plugins
-                                       }
-                                       
sys.stdout.write("\\0".join(sorted(eps)))
-                               EOF
-                       )
-                       args+=( "${plugin_args[@]}" )
+                       if [[ ${EPYTEST_PLUGIN_LOAD_VIA_ENV} ]]; then
+                               local -x PYTEST_PLUGINS=$(
+                                       "${EPYTHON}" - "${EPYTEST_PLUGINS[@]}" 
<<-EOF || die
+                                               import sys
+                                               from importlib.metadata import 
distribution, entry_points
+
+                                               packages = 
{distribution(x).name for x in sys.argv[1:]}
+                                               plugins = {
+                                                       x.value for x in 
entry_points(group="pytest11")
+                                                       if x.dist.name in 
packages
+                                               }
+                                               
sys.stdout.write(",".join(sorted(plugins)))
+                                       EOF
+                               )
+                       else
+                               local plugin_args=()
+                               readarray -t -d '' plugin_args < <(
+                                       "${EPYTHON}" - "${EPYTEST_PLUGINS[@]}" 
<<-EOF || die
+                                               import os
+                                               import sys
+                                               from importlib.metadata import 
distribution, entry_points
+
+                                               env_plugins = 
os.environ.get("PYTEST_PLUGINS", "").split(",")
+                                               packages = 
{distribution(x).name for x in sys.argv[1:]}
+                                               eps = {
+                                                       f"-p{x.name}" for x in 
entry_points(group="pytest11")
+                                                       if x.dist.name in 
packages and x.value not in env_plugins
+                                               }
+                                               
sys.stdout.write("\\0".join(sorted(eps)))
+                                       EOF
+                               )
+                               args+=( "${plugin_args[@]}" )
+                       fi
                fi
        else
                args+=(
@@ -1541,6 +1566,9 @@ epytest() {
        done
        set -- "${EPYTHON}" -m pytest "${args[@]}" "${@}" ${EPYTEST_FLAGS}
 
+       if [[ ${PYTEST_PLUGINS} ]]; then
+               einfo "PYTEST_PLUGINS=${PYTEST_PLUGINS}"
+       fi
        echo "${@}" >&2
        "${@}"
        local ret=${?}

Reply via email to