dev-python/pip: Sync with Gentoo

It's from Gentoo commit 775157f24a32dfd96ef4ca10ac5c92028d98adf6.
This commit is contained in:
Flatcar Buildbot 2025-05-05 07:07:41 +00:00 committed by Krzesimir Nowak
parent 712aaf8eea
commit 939c1a04cc
4 changed files with 261 additions and 1 deletions

View File

@ -1,3 +1,4 @@
DIST pip-24.1.gh.tar.gz 9188658 BLAKE2B 4a43ff0199d811dd30461e376f655a447f3f706a48dd97fe1d0ccf630f558e72209ccd06d98949a1541cd6b2942a816db23ce8aaa7fbbf9aef429502fb91ab92 SHA512 c60ab329fe91202ff64b5f0f90209085fbf8db0f0a05f0703f952ad69e39e2e3edb5dadc006a3f317cdd4ba4fb5abe56dfbd22792249a2d139702eec272186d1
DIST pip-25.0.1.gh.tar.gz 9224526 BLAKE2B db729b8c75d8e15c6fed1dbc9e08adc4e82114f2bbd953859ec03c7948e521629afd8cea6adb08110b987d6adf48fd600a59a3bcc27774db61ea92675ad90d42 SHA512 a6850c8567082bbf98483a45e523c4de12132136d2b0aa388ac619c02ffd0c8f6aea7d727f7d84167dadec5f1e56dd478b2233b0caa5d9b3e5cadc9e1f3dc12c
DIST pip-25.1.1.gh.tar.gz 9219969 BLAKE2B eb443451deeb71888c2fc56ac5c8cb2d0515ec0efff975fab98cfa65d1fc5e66948243b3acebf1f4b0446e46082abb9fd350816579a4f5af1292c160490ce930 SHA512 ce61c9861265139b3c5ea9be9dc246097cd75c21687cf8301f80a377d02420c4524f0d6307d2ca0232ff8715b1105343bcfdb9cac6b69503780ab2c4645558dc
DIST pip-25.1.gh.tar.gz 9220205 BLAKE2B 3e719b180dd4f039a1bf15cdd2686fdc270e842e4b9ab416306bf9ea40c037541df05af78239fe067dfa3edc27b7370ea04c1d9cec43cc6cfd2f9e8f347f41ee SHA512 d6b93aeabe6a4e046caf85c028fca380936ab65cb3c5028a7fa7dbc61cef2cf7d0c46c499fe548dc0af8f7bc30f7ecace8f257b20a60c0cc905b531f193b5a9d

View File

@ -0,0 +1,76 @@
From 23d20ea18ab4e43a4a4cb2b721d818a8dcd62542 Mon Sep 17 00:00:00 2001
From: Eli Schwartz <eschwartz93@gmail.com>
Date: Mon, 28 Apr 2025 11:42:02 -0400
Subject: [PATCH] Fix new dependency-groups feature to use the stdlib tomllib
where possible
Previously, commit 88c9f31ad8a5ffe0bb31ab500b8ddd1b9ff6a5dd modified pip
to use the stdlib on versions of python where this module is in the
stdlib. As justified there:
Although a tomli copy is vendored, doing this conditional import allows:
- automatically upgrading the code, when the time comes to drop py3.10
support
- slightly simplifying debundling support, as it's no longer necessary
to depend on a tomli(-wheel)? package on sufficiently newer versions
of python.
https://github.com/pypa/pip/pull/13065 added a new feature, including a
vendored "dependency_groups" library that likewise supports using the
stdlib tomllib via `dependency_groups/_toml_compat.py`. But the code in
pip itself to use dependency_groups manually loads pyproject.toml and
passes it to dependency_groups, and fails to use the same compatibility
dispatch as both the pre-existing pip code and dependency_groups itself.
Add back the conditional logic.
---
news/13356.vendor.rst | 1 +
src/pip/_internal/req/req_dependency_group.py | 11 ++++++++---
tests/unit/test_req_dependency_group.py | 2 +-
3 files changed, 10 insertions(+), 4 deletions(-)
create mode 100644 news/13356.vendor.rst
diff --git a/src/pip/_internal/req/req_dependency_group.py b/src/pip/_internal/req/req_dependency_group.py
index 8f124de5b81..e81dd45522a 100644
--- a/src/pip/_internal/req/req_dependency_group.py
+++ b/src/pip/_internal/req/req_dependency_group.py
@@ -1,6 +1,11 @@
+import sys
from typing import Any, Dict, Iterable, Iterator, List, Tuple
-from pip._vendor import tomli
+if sys.version_info >= (3, 11):
+ import tomllib
+else:
+ from pip._vendor import tomli as tomllib
+
from pip._vendor.dependency_groups import DependencyGroupResolver
from pip._internal.exceptions import InstallationError
@@ -65,10 +70,10 @@ def _load_pyproject(path: str) -> Dict[str, Any]:
"""
try:
with open(path, "rb") as fp:
- return tomli.load(fp)
+ return tomllib.load(fp)
except FileNotFoundError:
raise InstallationError(f"{path} not found. Cannot resolve '--group' option.")
- except tomli.TOMLDecodeError as e:
+ except tomllib.TOMLDecodeError as e:
raise InstallationError(f"Error parsing {path}: {e}") from e
except OSError as e:
raise InstallationError(f"Error reading {path}: {e}") from e
diff --git a/tests/unit/test_req_dependency_group.py b/tests/unit/test_req_dependency_group.py
index b596f6fc5d7..1b180f8d7f8 100644
--- a/tests/unit/test_req_dependency_group.py
+++ b/tests/unit/test_req_dependency_group.py
@@ -120,7 +120,7 @@ def epipe_toml_load(*args: Any, **kwargs: Any) -> None:
raise OSError(errno.EPIPE, "Broken pipe")
monkeypatch.setattr(
- "pip._internal.req.req_dependency_group.tomli.load", epipe_toml_load
+ "pip._internal.req.req_dependency_group.tomllib.load", epipe_toml_load
)
with pytest.raises(InstallationError, match=r"Error reading pyproject\.toml"):

View File

@ -53,7 +53,7 @@ BDEPEND="
test? (
$(python_gen_cond_dep '
dev-python/ensurepip-setuptools
<dev-python/ensurepip-wheel-0.46
dev-python/ensurepip-wheel
dev-python/freezegun[${PYTHON_USEDEP}]
dev-python/pretend[${PYTHON_USEDEP}]
dev-python/pytest-rerunfailures[${PYTHON_USEDEP}]
@ -78,6 +78,8 @@ python_prepare_all() {
"${FILESDIR}/pip-23.1-no-coverage.patch"
# prepare to unbundle dependencies
"${FILESDIR}/pip-25.0.1-unbundle.patch"
# https://github.com/pypa/pip/pull/13356
"${FILESDIR}/${P}-tomli-dep.patch"
)
distutils-r1_python_prepare_all

View File

@ -0,0 +1,181 @@
# Copyright 1999-2025 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
# please bump dev-python/ensurepip-pip along with this package!
DISTUTILS_USE_PEP517=setuptools
PYTHON_TESTED=( pypy3_11 python3_{11..13} )
PYTHON_COMPAT=( "${PYTHON_TESTED[@]}" )
PYTHON_REQ_USE="ssl(+),threads(+)"
inherit distutils-r1 shell-completion
DESCRIPTION="The PyPA recommended tool for installing Python packages"
HOMEPAGE="
https://pip.pypa.io/en/stable/
https://pypi.org/project/pip/
https://github.com/pypa/pip/
"
SRC_URI="
https://github.com/pypa/pip/archive/${PV}.tar.gz -> ${P}.gh.tar.gz
"
LICENSE="MIT"
SLOT="0"
KEYWORDS="~amd64 ~mips ~ppc ~riscv ~x86"
IUSE="test-rust"
# see src/pip/_vendor/vendor.txt
RDEPEND="
>=dev-python/cachecontrol-0.14.2[${PYTHON_USEDEP}]
>=dev-python/dependency-groups-1.3.0[${PYTHON_USEDEP}]
>=dev-python/distlib-0.3.9[${PYTHON_USEDEP}]
>=dev-python/distro-1.9.0[${PYTHON_USEDEP}]
>=dev-python/msgpack-1.1.0[${PYTHON_USEDEP}]
>=dev-python/packaging-25.0[${PYTHON_USEDEP}]
>=dev-python/platformdirs-4.3.7[${PYTHON_USEDEP}]
>=dev-python/pyproject-hooks-1.2.0[${PYTHON_USEDEP}]
>=dev-python/requests-2.32.3[${PYTHON_USEDEP}]
>=dev-python/rich-14.0.0[${PYTHON_USEDEP}]
>=dev-python/resolvelib-1.1.0[${PYTHON_USEDEP}]
>=dev-python/setuptools-70.3.0[${PYTHON_USEDEP}]
>=dev-python/tomli-w-1.2.0[${PYTHON_USEDEP}]
>=dev-python/truststore-0.10.1[${PYTHON_USEDEP}]
>=dev-python/typing-extensions-4.13.2[${PYTHON_USEDEP}]
"
BDEPEND="
${RDEPEND}
test? (
$(python_gen_cond_dep '
dev-python/ensurepip-setuptools
dev-python/ensurepip-wheel
dev-python/freezegun[${PYTHON_USEDEP}]
dev-python/pretend[${PYTHON_USEDEP}]
dev-python/pytest-rerunfailures[${PYTHON_USEDEP}]
dev-python/pytest-xdist[${PYTHON_USEDEP}]
dev-python/scripttest[${PYTHON_USEDEP}]
<dev-python/setuptools-80[${PYTHON_USEDEP}]
dev-python/virtualenv[${PYTHON_USEDEP}]
dev-python/werkzeug[${PYTHON_USEDEP}]
dev-python/wheel[${PYTHON_USEDEP}]
test-rust? (
dev-python/cryptography[${PYTHON_USEDEP}]
)
dev-vcs/git
' "${PYTHON_TESTED[@]}")
)
"
distutils_enable_tests pytest
python_prepare_all() {
local PATCHES=(
"${FILESDIR}/pip-23.1-no-coverage.patch"
# prepare to unbundle dependencies
"${FILESDIR}/pip-25.0.1-unbundle.patch"
)
distutils-r1_python_prepare_all
# unbundle dependencies
rm -r src/pip/_vendor || die
find -name '*.py' -exec sed -i \
-e 's:from pip\._vendor import:import:g' \
-e 's:from pip\._vendor\.:from :g' \
{} + || die
if use test; then
local wheels=(
"${BROOT}"/usr/lib/python/ensurepip/{setuptools,wheel}-*.whl
)
mkdir tests/data/common_wheels/ || die
cp "${wheels[@]}" tests/data/common_wheels/ || die
fi
}
python_configure() {
if use test && has_version "dev-python/pip[${PYTHON_USEDEP}]"; then
"${EPYTHON}" -m pip check ||
die "${EPYTHON} -m pip check failed, tests will fail"
fi
}
python_compile_all() {
# 'pip completion' command embeds full $0 into completion script, which confuses
# 'complete' and causes QA warning when running as "${PYTHON} -m pip".
# This trick sets correct $0 while still calling just installed pip.
local pipcmd='import sys; sys.argv[0] = "pip"; __file__ = ""; from pip._internal.cli.main import main; sys.exit(main())'
"${EPYTHON}" -c "${pipcmd}" completion --bash > completion.bash || die
"${EPYTHON}" -c "${pipcmd}" completion --zsh > completion.zsh || die
}
python_test() {
if ! has "${EPYTHON}" "${PYTHON_TESTED[@]/_/.}"; then
einfo "Skipping tests on ${EPYTHON}"
return 0
fi
local EPYTEST_DESELECT=(
tests/functional/test_inspect.py::test_inspect_basic
# Internet
tests/functional/test_config_settings.py::test_backend_sees_config_via_sdist
tests/functional/test_install.py::test_double_install_fail
tests/functional/test_install.py::test_install_sdist_links
tests/functional/test_install_config.py::test_prompt_for_keyring_if_needed
tests/functional/test_lock.py::test_lock_archive
tests/functional/test_lock.py::test_lock_vcs
# broken by system site-packages use
tests/functional/test_freeze.py::test_freeze_with_setuptools
tests/functional/test_pip_runner_script.py::test_runner_work_in_environments_with_no_pip
tests/functional/test_uninstall.py::test_basic_uninstall_distutils
tests/unit/test_base_command.py::test_base_command_global_tempdir_cleanup
tests/unit/test_base_command.py::test_base_command_local_tempdir_cleanup
tests/unit/test_base_command.py::test_base_command_provides_tempdir_helpers
# broken by unbundling
"tests/functional/test_debug.py::test_debug[vendored library versions:]"
tests/functional/test_debug.py::test_debug__library_versions
tests/functional/test_python_option.py::test_python_interpreter
tests/functional/test_uninstall.py::test_uninstall_non_local_distutils
)
local EPYTEST_IGNORE=(
# requires proxy.py
tests/functional/test_proxy.py
)
case ${EPYTHON} in
pypy3*)
EPYTEST_DESELECT+=(
# unexpected tempfiles?
tests/functional/test_install_config.py::test_do_not_prompt_for_authentication
tests/functional/test_install_config.py::test_prompt_for_authentication
)
;;
esac
if ! has_version "dev-python/cryptography[${PYTHON_USEDEP}]"; then
EPYTEST_DESELECT+=(
tests/functional/test_install.py::test_install_sends_client_cert
tests/functional/test_install_config.py::test_do_not_prompt_for_authentication
tests/functional/test_install_config.py::test_prompt_for_authentication
tests/functional/test_install_config.py::test_prompt_for_keyring_if_needed
)
fi
local -x PIP_DISABLE_PIP_VERSION_CHECK=1
local -x PYTEST_DISABLE_PLUGIN_AUTOLOAD=1
local EPYTEST_XDIST=1
# rerunfailures because test suite breaks if packages are installed
# in parallel
epytest -m "not network" -o tmp_path_retention_policy=all \
-p rerunfailures --reruns=5 --use-venv
}
python_install_all() {
local DOCS=( AUTHORS.txt docs/html/**/*.rst )
distutils-r1_python_install_all
newbashcomp completion.bash pip
newzshcomp completion.zsh _pip
}