diff --git a/docs/html/cli/pip_install.rst b/docs/html/cli/pip_install.rst index 2403f8370cb..1362b490ba3 100644 --- a/docs/html/cli/pip_install.rst +++ b/docs/html/cli/pip_install.rst @@ -379,7 +379,7 @@ Finding Packages pip searches for packages on `PyPI`_ using the `HTTP simple interface `_, -which is documented `here `_ +which is documented `here `_ and `there `_. pip offers a number of package index options for modifying how packages are @@ -620,7 +620,7 @@ option in pip's command line. ^^^^^^^^^^^^^^^^^^^ "Editable" installs are fundamentally `"setuptools develop mode" -`_ +`_ installs. You can install local projects or VCS projects in "editable" mode: @@ -653,7 +653,7 @@ Controlling setup_requires -------------------------- Setuptools offers the ``setup_requires`` `setup() keyword -`_ +`_ for specifying dependencies that need to be present in order for the ``setup.py`` script to run. Internally, Setuptools uses ``easy_install`` to fulfill these dependencies. @@ -693,7 +693,7 @@ the following commands:: The ``egg_info`` command should create egg metadata for the package, as described in the setuptools documentation at -https://setuptools.readthedocs.io/en/latest/setuptools.html#egg-info-create-egg-metadata-and-set-build-tags +https://setuptools.readthedocs.io/en/latest/userguide/commands.html#egg-info-create-egg-metadata-and-set-build-tags The ``install`` command should implement the complete process of installing the package to the target directory XXX. diff --git a/docs/html/user_guide.rst b/docs/html/user_guide.rst index ecdfd806240..2d059709271 100644 --- a/docs/html/user_guide.rst +++ b/docs/html/user_guide.rst @@ -180,7 +180,7 @@ In practice, there are 4 common uses of Requirements files: It's important to be clear that pip determines package dependencies using `install_requires metadata -`_, +`_, not by discovering ``requirements.txt`` files embedded in projects. See also: diff --git a/news/10430.doc.rst b/news/10430.doc.rst new file mode 100644 index 00000000000..89610b84ac3 --- /dev/null +++ b/news/10430.doc.rst @@ -0,0 +1 @@ +Update links of setuptools as setuptools moved these documents. The Simple Repository link now points to PyPUG as that is the canonical place of packaging specification, and setuptools's ``easy_install`` is deprecated. diff --git a/news/19777e4a-49f0-4b33-8cbd-84727ececfb4.trivial.rst b/news/19777e4a-49f0-4b33-8cbd-84727ececfb4.trivial.rst new file mode 100644 index 00000000000..e69de29bb2d diff --git a/news/753e9f4f-32d3-4986-a78a-f84406ea752a.trivial.rst b/news/753e9f4f-32d3-4986-a78a-f84406ea752a.trivial.rst new file mode 100644 index 00000000000..e69de29bb2d diff --git a/news/b27bb979-edeb-4ad2-ad20-1237de12968d.trivial.rst b/news/b27bb979-edeb-4ad2-ad20-1237de12968d.trivial.rst new file mode 100644 index 00000000000..e69de29bb2d diff --git a/news/b27c8011-c478-4a7e-adb7-6d08c4f0ba41.trivial.rst b/news/b27c8011-c478-4a7e-adb7-6d08c4f0ba41.trivial.rst new file mode 100644 index 00000000000..e69de29bb2d diff --git a/news/e0fbc910-7f57-4fda-b17a-d1a6aa873e8e.trivial.rst b/news/e0fbc910-7f57-4fda-b17a-d1a6aa873e8e.trivial.rst new file mode 100644 index 00000000000..e69de29bb2d diff --git a/noxfile.py b/noxfile.py index 3cab71848d0..910e61eb51b 100644 --- a/noxfile.py +++ b/noxfile.py @@ -171,7 +171,7 @@ def lint(session: nox.Session) -> None: @nox.session def vendoring(session: nox.Session) -> None: - session.install("vendoring>=0.3.0") + session.install("vendoring~=1.0.0") if "--upgrade" not in session.posargs: session.run("vendoring", "sync", ".", "-v") diff --git a/pyproject.toml b/pyproject.toml index fbebfd081d8..a479b968d6d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -53,9 +53,6 @@ distro = [] [tool.vendoring.license.directories] setuptools = "pkg_resources" -msgpack-python = "msgpack" [tool.vendoring.license.fallback-urls] -pytoml = "https://github.com/avakar/pytoml/raw/master/LICENSE" -resolvelib = "https://github.com/sarugaku/resolvelib/raw/master/LICENSE" webencodings = "https://github.com/SimonSapin/python-webencodings/raw/master/LICENSE" diff --git a/src/pip/_internal/resolution/resolvelib/provider.py b/src/pip/_internal/resolution/resolvelib/provider.py index 632854d3bc5..a3250b35161 100644 --- a/src/pip/_internal/resolution/resolvelib/provider.py +++ b/src/pip/_internal/resolution/resolvelib/provider.py @@ -112,9 +112,9 @@ def get_preference( for _, parent in information[identifier] ) inferred_depth = min(d for d in parent_depths) + 1.0 - self._known_depths[identifier] = inferred_depth else: inferred_depth = 1.0 + self._known_depths[identifier] = inferred_depth requested_order = self._user_requested.get(identifier, math.inf) diff --git a/src/pip/_vendor/idna.pyi b/src/pip/_vendor/idna.pyi deleted file mode 100644 index 7410d72fe7d..00000000000 --- a/src/pip/_vendor/idna.pyi +++ /dev/null @@ -1 +0,0 @@ -from idna import * \ No newline at end of file diff --git a/src/pip/_vendor/packaging.pyi b/src/pip/_vendor/packaging.pyi deleted file mode 100644 index 3458a3d6374..00000000000 --- a/src/pip/_vendor/packaging.pyi +++ /dev/null @@ -1 +0,0 @@ -from packaging import * \ No newline at end of file diff --git a/src/pip/_vendor/resolvelib.pyi b/src/pip/_vendor/resolvelib.pyi deleted file mode 100644 index b4ef4e108c4..00000000000 --- a/src/pip/_vendor/resolvelib.pyi +++ /dev/null @@ -1 +0,0 @@ -from resolvelib import * \ No newline at end of file diff --git a/src/pip/_vendor/tenacity.pyi b/src/pip/_vendor/tenacity.pyi deleted file mode 100644 index baf1de9dd9f..00000000000 --- a/src/pip/_vendor/tenacity.pyi +++ /dev/null @@ -1 +0,0 @@ -from tenacity import * \ No newline at end of file diff --git a/src/pip/_vendor/tomli.pyi b/src/pip/_vendor/tomli.pyi deleted file mode 100644 index b894db6919b..00000000000 --- a/src/pip/_vendor/tomli.pyi +++ /dev/null @@ -1 +0,0 @@ -from tomli import * \ No newline at end of file diff --git a/src/pip/_vendor/urllib3/contrib/pyopenssl.py b/src/pip/_vendor/urllib3/contrib/pyopenssl.py index c43146279d3..3130f51ac06 100644 --- a/src/pip/_vendor/urllib3/contrib/pyopenssl.py +++ b/src/pip/_vendor/urllib3/contrib/pyopenssl.py @@ -28,8 +28,8 @@ .. code-block:: python try: - import urllib3.contrib.pyopenssl - urllib3.contrib.pyopenssl.inject_into_urllib3() + import pip._vendor.urllib3.contrib.pyopenssl as pyopenssl + pyopenssl.inject_into_urllib3() except ImportError: pass diff --git a/src/pip/_vendor/urllib3/contrib/securetransport.py b/src/pip/_vendor/urllib3/contrib/securetransport.py index b9755545418..b4ca80b88be 100644 --- a/src/pip/_vendor/urllib3/contrib/securetransport.py +++ b/src/pip/_vendor/urllib3/contrib/securetransport.py @@ -19,8 +19,8 @@ To use this module, simply import and inject it:: - import urllib3.contrib.securetransport - urllib3.contrib.securetransport.inject_into_urllib3() + import pip._vendor.urllib3.contrib.securetransport as securetransport + securetransport.inject_into_urllib3() Happy TLSing! diff --git a/tests/functional/test_install_reqs.py b/tests/functional/test_install_reqs.py index 914524630ac..b8f8925ce30 100644 --- a/tests/functional/test_install_reqs.py +++ b/tests/functional/test_install_reqs.py @@ -62,7 +62,7 @@ def test_requirements_file(script, with_wheel): Test installing from a requirements file. """ - other_lib_name, other_lib_version = "anyjson", "0.3" + other_lib_name, other_lib_version = "peppercorn", "0.6" script.scratch_path.joinpath("initools-req.txt").write_text( textwrap.dedent( f"""\ @@ -157,7 +157,7 @@ def test_multiple_requirements_files(script, tmpdir, with_wheel): Test installing from multiple nested requirements files. """ - other_lib_name, other_lib_version = "anyjson", "0.3" + other_lib_name, other_lib_version = "six", "1.16.0" script.scratch_path.joinpath("initools-req.txt").write_text( textwrap.dedent( """ diff --git a/tests/functional/test_install_upgrade.py b/tests/functional/test_install_upgrade.py index f81dc14a784..edeebb0b9b4 100644 --- a/tests/functional/test_install_upgrade.py +++ b/tests/functional/test_install_upgrade.py @@ -1,6 +1,5 @@ import itertools import os -import sys import textwrap import pytest @@ -352,54 +351,6 @@ def test_upgrade_vcs_req_with_dist_found(script): assert "pypi.org" not in result.stdout, result.stdout -class TestUpgradeDistributeToSetuptools: - """ - From pip1.4 to pip6, pip supported a set of "hacks" (see Issue #1122) to - allow distribute to conflict with setuptools, so that the following would - work to upgrade distribute: - - ``pip install -U setuptools`` - - In pip7, the hacks were removed. This test remains to at least confirm pip - can upgrade distribute to setuptools using: - - ``pip install -U distribute`` - - The reason this works is that a final version of distribute (v0.7.3) was - released that is simple wrapper with: - - install_requires=['setuptools>=0.7'] - - The test use a fixed set of packages from our test packages dir. Note that - virtualenv-1.9.1 contains distribute-0.6.34 and virtualenv-1.10 contains - setuptools-0.9.7 - """ - - def prep_ve(self, script, version, pip_src, distribute=False): - self.script = script - self.script.pip_install_local(f"virtualenv=={version}") - args = ["virtualenv", self.script.scratch_path / "VE"] - if distribute: - args.insert(1, "--distribute") - if version == "1.9.1" and not distribute: - # setuptools 0.6 didn't support PYTHONDONTWRITEBYTECODE - del self.script.environ["PYTHONDONTWRITEBYTECODE"] - self.script.run(*args) - if sys.platform == "win32": - bindir = "Scripts" - else: - bindir = "bin" - self.ve_bin = self.script.scratch_path / "VE" / bindir - self.script.run(self.ve_bin / "pip", "uninstall", "-y", "pip") - self.script.run( - self.ve_bin / "python", - "setup.py", - "install", - cwd=pip_src, - expect_stderr=True, - ) - - @pytest.mark.parametrize( "req1, req2", list( diff --git a/tests/functional/test_new_resolver.py b/tests/functional/test_new_resolver.py index c07b9bba957..d0f5a3c8621 100644 --- a/tests/functional/test_new_resolver.py +++ b/tests/functional/test_new_resolver.py @@ -16,16 +16,6 @@ from tests.lib.wheel import make_wheel -# TODO: Remove me. -def assert_installed(script, **kwargs): - script.assert_installed(**kwargs) - - -# TODO: Remove me. -def assert_not_installed(script, *args): - script.assert_not_installed(*args) - - def assert_editable(script, *args): # This simply checks whether all of the listed packages have a # corresponding .egg-link file installed. @@ -67,7 +57,7 @@ def test_new_resolver_can_install(script): script.scratch_path, "simple", ) - assert_installed(script, simple="0.1.0") + script.assert_installed(simple="0.1.0") def test_new_resolver_can_install_with_version(script): @@ -84,7 +74,7 @@ def test_new_resolver_can_install_with_version(script): script.scratch_path, "simple==0.1.0", ) - assert_installed(script, simple="0.1.0") + script.assert_installed(simple="0.1.0") def test_new_resolver_picks_latest_version(script): @@ -106,7 +96,7 @@ def test_new_resolver_picks_latest_version(script): script.scratch_path, "simple", ) - assert_installed(script, simple="0.2.0") + script.assert_installed(simple="0.2.0") def test_new_resolver_picks_installed_version(script): @@ -128,7 +118,7 @@ def test_new_resolver_picks_installed_version(script): script.scratch_path, "simple==0.1.0", ) - assert_installed(script, simple="0.1.0") + script.assert_installed(simple="0.1.0") result = script.pip( "install", @@ -139,7 +129,7 @@ def test_new_resolver_picks_installed_version(script): "simple", ) assert "Collecting" not in result.stdout, "Should not fetch new version" - assert_installed(script, simple="0.1.0") + script.assert_installed(simple="0.1.0") def test_new_resolver_picks_installed_version_if_no_match_found(script): @@ -161,11 +151,11 @@ def test_new_resolver_picks_installed_version_if_no_match_found(script): script.scratch_path, "simple==0.1.0", ) - assert_installed(script, simple="0.1.0") + script.assert_installed(simple="0.1.0") result = script.pip("install", "--no-cache-dir", "--no-index", "simple") assert "Collecting" not in result.stdout, "Should not fetch new version" - assert_installed(script, simple="0.1.0") + script.assert_installed(simple="0.1.0") def test_new_resolver_installs_dependencies(script): @@ -188,7 +178,7 @@ def test_new_resolver_installs_dependencies(script): script.scratch_path, "base", ) - assert_installed(script, base="0.1.0", dep="0.1.0") + script.assert_installed(base="0.1.0", dep="0.1.0") def test_new_resolver_ignore_dependencies(script): @@ -212,8 +202,8 @@ def test_new_resolver_ignore_dependencies(script): script.scratch_path, "base", ) - assert_installed(script, base="0.1.0") - assert_not_installed(script, "dep") + script.assert_installed(base="0.1.0") + script.assert_not_installed("dep") @pytest.mark.parametrize( @@ -247,7 +237,7 @@ def test_new_resolver_installs_extras(tmpdir, script, root_dep): "-r", req_file, ) - assert_installed(script, base="0.1.0", dep="0.1.0") + script.assert_installed(base="0.1.0", dep="0.1.0") def test_new_resolver_installs_extras_warn_missing(script): @@ -273,7 +263,7 @@ def test_new_resolver_installs_extras_warn_missing(script): ) assert "does not provide the extra" in result.stderr, str(result) assert "missing" in result.stderr, str(result) - assert_installed(script, base="0.1.0", dep="0.1.0") + script.assert_installed(base="0.1.0", dep="0.1.0") def test_new_resolver_installed_message(script): @@ -336,7 +326,7 @@ def test_new_resolver_installs_editable(script): "--editable", source_dir, ) - assert_installed(script, base="0.1.0", dep="0.1.0") + script.assert_installed(base="0.1.0", dep="0.1.0") assert_editable(script, "dep") @@ -388,7 +378,7 @@ def test_new_resolver_requires_python( script.pip(*args) - assert_installed(script, base="0.1.0", dep=dep_version) + script.assert_installed(base="0.1.0", dep=dep_version) def test_new_resolver_requires_python_error(script): @@ -513,7 +503,7 @@ def test_new_resolver_only_builds_sdists_when_needed(script): script.scratch_path, "base", ) - assert_installed(script, base="0.1.0", dep="0.2.0") + script.assert_installed(base="0.1.0", dep="0.2.0") # We merge criteria here, as we have two "dep" requirements script.pip( @@ -525,7 +515,7 @@ def test_new_resolver_only_builds_sdists_when_needed(script): "base", "dep", ) - assert_installed(script, base="0.1.0", dep="0.2.0") + script.assert_installed(base="0.1.0", dep="0.2.0") def test_new_resolver_install_different_version(script): @@ -554,7 +544,7 @@ def test_new_resolver_install_different_version(script): assert "Uninstalling base-0.1.0" in result.stdout, str(result) assert "Successfully uninstalled base-0.1.0" in result.stdout, str(result) result.did_update(script.site_packages / "base", message="base not upgraded") - assert_installed(script, base="0.2.0") + script.assert_installed(base="0.2.0") def test_new_resolver_force_reinstall(script): @@ -584,7 +574,7 @@ def test_new_resolver_force_reinstall(script): assert "Uninstalling base-0.1.0" in result.stdout, str(result) assert "Successfully uninstalled base-0.1.0" in result.stdout, str(result) result.did_update(script.site_packages / "base", message="base not reinstalled") - assert_installed(script, base="0.1.0") + script.assert_installed(base="0.1.0") @pytest.mark.parametrize( @@ -617,7 +607,7 @@ def test_new_resolver_handles_prerelease( script.scratch_path, *pip_args, ) - assert_installed(script, pkg=expected_version) + script.assert_installed(pkg=expected_version) @pytest.mark.parametrize( @@ -641,8 +631,8 @@ def test_new_reolver_skips_marker(script, pkg_deps, root_deps): script.scratch_path, *root_deps, ) - assert_installed(script, pkg="1.0") - assert_not_installed(script, "dep") + script.assert_installed(pkg="1.0") + script.assert_not_installed("dep") @pytest.mark.parametrize( @@ -670,8 +660,8 @@ def test_new_resolver_constraints(script, constraints): constraints_file, "pkg", ) - assert_installed(script, pkg="1.0") - assert_not_installed(script, "constraint_only") + script.assert_installed(pkg="1.0") + script.assert_not_installed("constraint_only") def test_new_resolver_constraint_no_specifier(script): @@ -689,7 +679,7 @@ def test_new_resolver_constraint_no_specifier(script): constraints_file, "pkg", ) - assert_installed(script, pkg="1.0") + script.assert_installed(pkg="1.0") @pytest.mark.parametrize( @@ -745,8 +735,8 @@ def test_new_resolver_constraint_on_dependency(script): constraints_file, "base", ) - assert_installed(script, base="1.0") - assert_installed(script, dep="2.0") + script.assert_installed(base="1.0") + script.assert_installed(dep="2.0") @pytest.mark.parametrize( @@ -810,7 +800,7 @@ def test_new_resolver_constraint_only_marker_match(script): script.scratch_path, "pkg", ) - assert_installed(script, pkg="1.0") + script.assert_installed(pkg="1.0") def test_new_resolver_upgrade_needs_option(script): @@ -839,7 +829,7 @@ def test_new_resolver_upgrade_needs_option(script): ) assert "Requirement already satisfied" in result.stdout, str(result) - assert_installed(script, pkg="1.0.0") + script.assert_installed(pkg="1.0.0") # This should upgrade result = script.pip( @@ -855,7 +845,7 @@ def test_new_resolver_upgrade_needs_option(script): assert "Uninstalling pkg-1.0.0" in result.stdout, str(result) assert "Successfully uninstalled pkg-1.0.0" in result.stdout, str(result) result.did_update(script.site_packages / "pkg", message="pkg not upgraded") - assert_installed(script, pkg="2.0.0") + script.assert_installed(pkg="2.0.0") def test_new_resolver_upgrade_strategy(script): @@ -870,8 +860,8 @@ def test_new_resolver_upgrade_strategy(script): "base", ) - assert_installed(script, base="1.0.0") - assert_installed(script, dep="1.0.0") + script.assert_installed(base="1.0.0") + script.assert_installed(dep="1.0.0") # Now release new versions create_basic_wheel_for_package(script, "base", "2.0.0", depends=["dep"]) @@ -889,8 +879,8 @@ def test_new_resolver_upgrade_strategy(script): # With upgrade strategy "only-if-needed" (the default), dep should not # be upgraded. - assert_installed(script, base="2.0.0") - assert_installed(script, dep="1.0.0") + script.assert_installed(base="2.0.0") + script.assert_installed(dep="1.0.0") create_basic_wheel_for_package(script, "base", "3.0.0", depends=["dep"]) script.pip( @@ -905,8 +895,8 @@ def test_new_resolver_upgrade_strategy(script): ) # With upgrade strategy "eager", dep should be upgraded. - assert_installed(script, base="3.0.0") - assert_installed(script, dep="2.0.0") + script.assert_installed(base="3.0.0") + script.assert_installed(dep="2.0.0") class TestExtraMerge: @@ -983,7 +973,7 @@ def test_new_resolver_extra_merge_in_package( script.scratch_path, requirement + "[dev]", ) - assert_installed(script, pkg="1.0.0", dep="1.0.0", depdev="1.0.0") + script.assert_installed(pkg="1.0.0", dep="1.0.0", depdev="1.0.0") def test_new_resolver_build_directory_error_zazo_19(script): @@ -1028,7 +1018,7 @@ def test_new_resolver_build_directory_error_zazo_19(script): "pkg-a", "pkg-b", ) - assert_installed(script, pkg_a="3.0.0", pkg_b="1.0.0") + script.assert_installed(pkg_a="3.0.0", pkg_b="1.0.0") def test_new_resolver_upgrade_same_version(script): @@ -1043,7 +1033,7 @@ def test_new_resolver_upgrade_same_version(script): script.scratch_path, "pkg", ) - assert_installed(script, pkg="2") + script.assert_installed(pkg="2") script.pip( "install", @@ -1054,7 +1044,7 @@ def test_new_resolver_upgrade_same_version(script): "--upgrade", "pkg", ) - assert_installed(script, pkg="2") + script.assert_installed(pkg="2") def test_new_resolver_local_and_req(script): @@ -1127,7 +1117,7 @@ def test_new_resolver_prefers_installed_in_upgrade_if_latest(script): "--upgrade", "pkg", ) - assert_installed(script, pkg="2") + script.assert_installed(pkg="2") @pytest.mark.parametrize("N", [2, 10, 20]) @@ -1168,7 +1158,7 @@ def test_new_resolver_presents_messages_when_backtracking_a_lot(script, N): "A", ) - assert_installed(script, A="1.0.0", B="1.0.0", C="1.0.0") + script.assert_installed(A="1.0.0", B="1.0.0", C="1.0.0") # These numbers are hard-coded in the code. if N >= 1: assert "This could take a while." in result.stdout @@ -1218,7 +1208,7 @@ def test_new_resolver_check_wheel_version_normalized( script.scratch_path, "simple", ) - assert_installed(script, simple="0.1.0+local.1") + script.assert_installed(simple="0.1.0+local.1") def test_new_resolver_does_reinstall_local_sdists(script): @@ -1233,7 +1223,7 @@ def test_new_resolver_does_reinstall_local_sdists(script): "--no-index", archive_path, ) - assert_installed(script, pkg="1.0") + script.assert_installed(pkg="1.0") result = script.pip( "install", @@ -1244,7 +1234,7 @@ def test_new_resolver_does_reinstall_local_sdists(script): ) assert "Installing collected packages: pkg" in result.stdout, str(result) assert "DEPRECATION" in result.stderr, str(result) - assert_installed(script, pkg="1.0") + script.assert_installed(pkg="1.0") def test_new_resolver_does_reinstall_local_paths(script): @@ -1255,7 +1245,7 @@ def test_new_resolver_does_reinstall_local_paths(script): "--no-index", pkg, ) - assert_installed(script, pkg="1.0") + script.assert_installed(pkg="1.0") result = script.pip( "install", @@ -1264,7 +1254,7 @@ def test_new_resolver_does_reinstall_local_paths(script): pkg, ) assert "Installing collected packages: pkg" in result.stdout, str(result) - assert_installed(script, pkg="1.0") + script.assert_installed(pkg="1.0") def test_new_resolver_does_not_reinstall_when_from_a_local_index(script): @@ -1281,7 +1271,7 @@ def test_new_resolver_does_not_reinstall_when_from_a_local_index(script): script.scratch_path, "simple", ) - assert_installed(script, simple="0.1.0") + script.assert_installed(simple="0.1.0") result = script.pip( "install", @@ -1294,7 +1284,7 @@ def test_new_resolver_does_not_reinstall_when_from_a_local_index(script): # Should not reinstall! assert "Installing collected packages: simple" not in result.stdout, str(result) assert "Requirement already satisfied: simple" in result.stdout, str(result) - assert_installed(script, simple="0.1.0") + script.assert_installed(simple="0.1.0") def test_new_resolver_skip_inconsistent_metadata(script): @@ -1317,7 +1307,7 @@ def test_new_resolver_skip_inconsistent_metadata(script): assert ( " inconsistent version: filename has '3', but metadata has '2'" ) in result.stderr, str(result) - assert_installed(script, a="1") + script.assert_installed(a="1") @pytest.mark.parametrize( @@ -1357,9 +1347,9 @@ def test_new_resolver_lazy_fetch_candidates(script, upgrade): # pip should install the version preferred by the strategy... if upgrade: - assert_installed(script, myuberpkg="3") + script.assert_installed(myuberpkg="3") else: - assert_installed(script, myuberpkg="1") + script.assert_installed(myuberpkg="1") # But should reach there in the best route possible, without trying # candidates it does not need to. @@ -1424,8 +1414,8 @@ def test_new_resolver_does_not_install_unneeded_packages_with_url_constraint(scr "installed", ) - assert_installed(script, installed="0.1.0") - assert_not_installed(script, "not_installed") + script.assert_installed(installed="0.1.0") + script.assert_not_installed("not_installed") def test_new_resolver_installs_packages_with_url_constraint(script): @@ -1442,7 +1432,7 @@ def test_new_resolver_installs_packages_with_url_constraint(script): "install", "--no-cache-dir", "--no-index", "-c", constraints_file, "installed" ) - assert_installed(script, installed="0.1.0") + script.assert_installed(installed="0.1.0") def test_new_resolver_reinstall_link_requirement_with_constraint(script): @@ -1475,7 +1465,7 @@ def test_new_resolver_reinstall_link_requirement_with_constraint(script): # TODO: strengthen assertion to "second invocation does no work" # I don't think this is true yet, but it should be in the future. - assert_installed(script, installed="0.1.0") + script.assert_installed(installed="0.1.0") def test_new_resolver_prefers_url_constraint(script): @@ -1507,7 +1497,7 @@ def test_new_resolver_prefers_url_constraint(script): "test_pkg", ) - assert_installed(script, test_pkg="0.1.0") + script.assert_installed(test_pkg="0.1.0") def test_new_resolver_prefers_url_constraint_on_update(script): @@ -1537,7 +1527,7 @@ def test_new_resolver_prefers_url_constraint_on_update(script): "test_pkg", ) - assert_installed(script, test_pkg="0.2.0") + script.assert_installed(test_pkg="0.2.0") script.pip( "install", @@ -1550,7 +1540,7 @@ def test_new_resolver_prefers_url_constraint_on_update(script): "test_pkg", ) - assert_installed(script, test_pkg="0.1.0") + script.assert_installed(test_pkg="0.1.0") @pytest.mark.parametrize("version_option", ["--constraint", "--requirement"]) @@ -1594,7 +1584,7 @@ def test_new_resolver_fails_with_url_constraint_and_incompatible_version( "because these package versions have conflicting dependencies." ) in result.stderr, str(result) - assert_not_installed(script, "test_pkg") + script.assert_not_installed("test_pkg") # Assert that pip works properly in the absence of the constraints file. script.pip( @@ -1645,8 +1635,8 @@ def test_new_resolver_ignores_unneeded_conflicting_constraints(script): "installed", ) - assert_not_installed(script, "test_pkg") - assert_installed(script, installed="0.1.0") + script.assert_not_installed("test_pkg") + script.assert_installed(installed="0.1.0") def test_new_resolver_fails_on_needed_conflicting_constraints(script): @@ -1686,7 +1676,7 @@ def test_new_resolver_fails_on_needed_conflicting_constraints(script): "dependencies." ) in result.stderr, str(result) - assert_not_installed(script, "test_pkg") + script.assert_not_installed("test_pkg") # Assert that pip works properly in the absence of the constraints file. script.pip( @@ -1731,7 +1721,7 @@ def test_new_resolver_fails_on_conflicting_constraint_and_requirement(script): "because these package versions have conflicting dependencies." ) in result.stderr, str(result) - assert_not_installed(script, "test_pkg") + script.assert_not_installed("test_pkg") # Assert that pip works properly in the absence of the constraints file. script.pip( @@ -1776,7 +1766,7 @@ def test_new_resolver_succeeds_on_matching_constraint_and_requirement(script, ed *last_args, ) - assert_installed(script, test_pkg="0.1.0") + script.assert_installed(test_pkg="0.1.0") if editable: assert_editable(script, "test-pkg") @@ -1813,7 +1803,7 @@ def test_new_resolver_applies_url_constraint_to_dep(script): "base", ) - assert_installed(script, dep="0.1.0") + script.assert_installed(dep="0.1.0") def test_new_resolver_handles_compatible_wheel_tags_in_constraint_url( @@ -1885,7 +1875,7 @@ def test_new_resolver_handles_incompatible_wheel_tags_in_constraint_url( "dependencies." ) in result.stderr, str(result) - assert_not_installed(script, "base") + script.assert_not_installed("base") def test_new_resolver_avoids_incompatible_wheel_tags_in_constraint_url( @@ -1926,8 +1916,8 @@ def test_new_resolver_avoids_incompatible_wheel_tags_in_constraint_url( "base", ) - assert_installed(script, base="0.1.0") - assert_not_installed(script, "dep") + script.assert_installed(base="0.1.0") + script.assert_not_installed("dep") @pytest.mark.parametrize( @@ -2018,9 +2008,9 @@ def test_new_resolver_direct_url_equivalent( ) if suffixes_equivalent: - assert_installed(script, pkga="1", pkgb="1") + script.assert_installed(pkga="1", pkgb="1") else: - assert_not_installed(script, "pkga", "pkgb") + script.assert_not_installed("pkga", "pkgb") def test_new_resolver_direct_url_with_extras(tmp_path, script): @@ -2058,7 +2048,7 @@ def test_new_resolver_direct_url_with_extras(tmp_path, script): "pkg3", ) - assert_installed(script, pkg1="1", pkg2="1", pkg3="1") + script.assert_installed(pkg1="1", pkg2="1", pkg3="1") assert not get_created_direct_url(result, "pkg1") assert get_created_direct_url(result, "pkg2") assert not get_created_direct_url(result, "pkg3") @@ -2095,7 +2085,7 @@ def test_new_resolver_modifies_installed_incompatible(script): script.scratch_path, "d==1", ) - assert_installed(script, d="1", c="2", b="2", a="2") + script.assert_installed(d="1", c="2", b="2", a="2") def test_new_resolver_transitively_depends_on_unnamed_local(script): @@ -2122,8 +2112,7 @@ def test_new_resolver_transitively_depends_on_unnamed_local(script): f"{certbot}[docs]", certbot_apache, ) - assert_installed( - script, + script.assert_installed( certbot="99.99.0.dev0", certbot_apache="99.99.0.dev0", certbot_docs="1", diff --git a/tests/lib/__init__.py b/tests/lib/__init__.py index 94533309fa8..18d6aa3db3b 100644 --- a/tests/lib/__init__.py +++ b/tests/lib/__init__.py @@ -991,19 +991,6 @@ def _change_test_package_version(script, version_pkg_path): _git_commit(script, version_pkg_path, message="messed version", stage_modified=True) -def assert_raises_regexp(exception, reg, run, *args, **kwargs): - """Like assertRaisesRegexp in unittest""" - __tracebackhide__ = True - - try: - run(*args, **kwargs) - assert False, f"{exception} should have been thrown" - except exception: - e = sys.exc_info()[1] - p = re.compile(reg) - assert p.search(str(e)), str(e) - - @contextmanager def requirements_file(contents, tmpdir): """Return a Path to a requirements file of given contents. diff --git a/tests/unit/test_req.py b/tests/unit/test_req.py index f4c1d48d93f..f6f552a8fe7 100644 --- a/tests/unit/test_req.py +++ b/tests/unit/test_req.py @@ -38,7 +38,7 @@ from pip._internal.req.req_tracker import get_requirement_tracker from pip._internal.resolution.legacy.resolver import Resolver from pip._internal.utils.urls import path_to_url -from tests.lib import assert_raises_regexp, make_test_finder, requirements_file +from tests.lib import make_test_finder, requirements_file def get_processed_req_from_line(line, fname="file", lineno=1): @@ -117,15 +117,15 @@ def test_no_reuse_existing_build_dir(self, data): reqset.add_requirement(req) finder = make_test_finder(find_links=[data.find_links]) with self._basic_resolver(finder) as resolver: - assert_raises_regexp( + with pytest.raises( PreviousBuildDirError, - r"pip can't proceed with [\s\S]*{req}[\s\S]*{build_dir_esc}".format( - build_dir_esc=build_dir.replace("\\", "\\\\"), req=req + match=( + r"pip can't proceed with [\s\S]*{req}[\s\S]*{build_dir_esc}".format( + build_dir_esc=build_dir.replace("\\", "\\\\"), req=req + ) ), - resolver.resolve, - reqset.all_requirements, - True, - ) + ): + resolver.resolve(reqset.all_requirements, True) def test_environment_marker_extras(self, data): """ @@ -151,16 +151,16 @@ def test_missing_hash_with_require_hashes(self, data): finder = make_test_finder(find_links=[data.find_links]) with self._basic_resolver(finder, require_hashes=True) as resolver: - assert_raises_regexp( + with pytest.raises( HashErrors, - r"Hashes are required in --require-hashes mode, but they are " - r"missing .*\n" - r" simple==1.0 --hash=sha256:393043e672415891885c9a2a0929b1" - r"af95fb866d6ca016b42d2e6ce53619b653$", - resolver.resolve, - reqset.all_requirements, - True, - ) + match=( + r"Hashes are required in --require-hashes mode, but they are " + r"missing .*\n" + r" simple==1.0 --hash=sha256:393043e672415891885c9a2a0929b1" + r"af95fb866d6ca016b42d2e6ce53619b653$" + ), + ): + resolver.resolve(reqset.all_requirements, True) def test_missing_hash_with_require_hashes_in_reqs_file(self, data, tmpdir): """--require-hashes in a requirements file should make its way to the @@ -203,20 +203,20 @@ def test_unsupported_hashes(self, data): sep = "\\\\" # This needs to be escaped for the regex with self._basic_resolver(finder, require_hashes=True) as resolver: - assert_raises_regexp( + with pytest.raises( HashErrors, - r"Can't verify hashes for these requirements because we don't " - r"have a way to hash version control repositories:\n" - r" git\+git://github\.com/pypa/pip-test-package \(from -r " - r"file \(line 1\)\)\n" - r"Can't verify hashes for these file:// requirements because " - r"they point to directories:\n" - r" file://.*{sep}data{sep}packages{sep}FSPkg " - r"\(from -r file \(line 2\)\)".format(sep=sep), - resolver.resolve, - reqset.all_requirements, - True, - ) + match=( + r"Can't verify hashes for these requirements because we don't " + r"have a way to hash version control repositories:\n" + r" git\+git://github\.com/pypa/pip-test-package \(from -r " + r"file \(line 1\)\)\n" + r"Can't verify hashes for these file:// requirements because " + r"they point to directories:\n" + r" file://.*{sep}data{sep}packages{sep}FSPkg " + r"\(from -r file \(line 2\)\)".format(sep=sep) + ), + ): + resolver.resolve(reqset.all_requirements, True) def test_unpinned_hash_checking(self, data): """Make sure prepare_files() raises an error when a requirement is not @@ -241,16 +241,16 @@ def test_unpinned_hash_checking(self, data): ) finder = make_test_finder(find_links=[data.find_links]) with self._basic_resolver(finder, require_hashes=True) as resolver: - assert_raises_regexp( + with pytest.raises( HashErrors, # Make sure all failing requirements are listed: - r"versions pinned with ==. These do not:\n" - r" simple .* \(from -r file \(line 1\)\)\n" - r" simple2>1.0 .* \(from -r file \(line 2\)\)", - resolver.resolve, - reqset.all_requirements, - True, - ) + match=( + r"versions pinned with ==. These do not:\n" + r" simple .* \(from -r file \(line 1\)\)\n" + r" simple2>1.0 .* \(from -r file \(line 2\)\)" + ), + ): + resolver.resolve(reqset.all_requirements, True) def test_hash_mismatch(self, data): """A hash mismatch should raise an error.""" @@ -264,17 +264,17 @@ def test_hash_mismatch(self, data): ) finder = make_test_finder(find_links=[data.find_links]) with self._basic_resolver(finder, require_hashes=True) as resolver: - assert_raises_regexp( + with pytest.raises( HashErrors, - r"THESE PACKAGES DO NOT MATCH THE HASHES.*\n" - r" file:///.*/data/packages/simple-1\.0\.tar\.gz .*:\n" - r" Expected sha256 badbad\n" - r" Got 393043e672415891885c9a2a0929b1af95fb" - r"866d6ca016b42d2e6ce53619b653$", - resolver.resolve, - reqset.all_requirements, - True, - ) + match=( + r"THESE PACKAGES DO NOT MATCH THE HASHES.*\n" + r" file:///.*/data/packages/simple-1\.0\.tar\.gz .*:\n" + r" Expected sha256 badbad\n" + r" Got 393043e672415891885c9a2a0929b1af95fb" + r"866d6ca016b42d2e6ce53619b653$" + ), + ): + resolver.resolve(reqset.all_requirements, True) def test_unhashed_deps_on_require_hashes(self, data): """Make sure unhashed, unpinned, or otherwise unrepeatable @@ -291,15 +291,15 @@ def test_unhashed_deps_on_require_hashes(self, data): ) with self._basic_resolver(finder, require_hashes=True) as resolver: - assert_raises_regexp( + with pytest.raises( HashErrors, - r"In --require-hashes mode, all requirements must have their " - r"versions pinned.*\n" - r" TopoRequires from .*$", - resolver.resolve, - reqset.all_requirements, - True, - ) + match=( + r"In --require-hashes mode, all requirements must have their " + r"versions pinned.*\n" + r" TopoRequires from .*$" + ), + ): + resolver.resolve(reqset.all_requirements, True) def test_hashed_deps_on_require_hashes(self): """Make sure hashed dependencies get installed when --require-hashes diff --git a/tools/vendoring/patches/requests.patch b/tools/vendoring/patches/requests.patch index d1bb4309b37..04e6339f484 100644 --- a/tools/vendoring/patches/requests.patch +++ b/tools/vendoring/patches/requests.patch @@ -6,7 +6,7 @@ index 0f8ae0d38..9582fa730 100644 import sys -try: -- from pip._vendor import chardet +- import chardet -except ImportError: - import charset_normalizer as chardet - import warnings @@ -40,7 +40,7 @@ diff --git a/src/pip/_vendor/requests/__init__.py b/src/pip/_vendor/requests/__i index 973497f5e..4f80e28fc 100644 --- a/src/pip/_vendor/requests/__init__.py +++ b/src/pip/_vendor/requests/__init__.py -@@ -44,10 +44,7 @@ from pip._vendor import urllib3 +@@ -44,10 +44,7 @@ import urllib3 import warnings from .exceptions import RequestsDependencyWarning @@ -51,7 +51,7 @@ index 973497f5e..4f80e28fc 100644 +charset_normalizer_version = None try: - from pip._vendor.chardet import __version__ as chardet_version + from chardet import __version__ as chardet_version @@ -107,6 +104,11 @@ except (AssertionError, ValueError): # if the standard library doesn't support SNI or the # 'ssl' library isn't available. @@ -74,10 +74,10 @@ index 409b7b028..9e2937167 100644 """ -try: -- from pip._vendor import chardet +- import chardet -except ImportError: - import charset_normalizer as chardet -+from pip._vendor import chardet ++import chardet import sys @@ -105,7 +105,7 @@ diff --git a/src/pip/_vendor/requests/help.py b/src/pip/_vendor/requests/help.py index 3a843404c..745f0d7b3 100644 --- a/src/pip/_vendor/requests/help.py +++ b/src/pip/_vendor/requests/help.py -@@ -11,10 +11,7 @@ from pip._vendor import urllib3 +@@ -11,10 +11,7 @@ import urllib3 from . import __version__ as requests_version @@ -116,4 +116,4 @@ index 3a843404c..745f0d7b3 100644 +charset_normalizer = None try: - from pip._vendor import chardet + import chardet diff --git a/tools/vendoring/patches/urllib3.patch b/tools/vendoring/patches/urllib3.patch new file mode 100644 index 00000000000..3ca7226fa6d --- /dev/null +++ b/tools/vendoring/patches/urllib3.patch @@ -0,0 +1,29 @@ +diff --git a/src/pip/_vendor/urllib3/contrib/securetransport.py b/src/pip/_vendor/urllib3/contrib/securetransport.py +index b97555454..189132baa 100644 +--- a/src/pip/_vendor/urllib3/contrib/securetransport.py ++++ b/src/pip/_vendor/urllib3/contrib/securetransport.py +@@ -19,8 +19,8 @@ + + To use this module, simply import and inject it:: + +- import urllib3.contrib.securetransport +- urllib3.contrib.securetransport.inject_into_urllib3() ++ import urllib3.contrib.securetransport as securetransport ++ securetransport.inject_into_urllib3() + + Happy TLSing! + +diff --git a/src/pip/_vendor/urllib3/contrib/pyopenssl.py b/src/pip/_vendor/urllib3/contrib/pyopenssl.py +index c43146279..4cded53f6 100644 +--- a/src/pip/_vendor/urllib3/contrib/pyopenssl.py ++++ b/src/pip/_vendor/urllib3/contrib/pyopenssl.py +@@ -28,7 +28,7 @@ + .. code-block:: python + + try: +- import urllib3.contrib.pyopenssl +- urllib3.contrib.pyopenssl.inject_into_urllib3() ++ import urllib3.contrib.pyopenssl as pyopenssl ++ pyopenssl.inject_into_urllib3() + except ImportError: + pass diff --git a/tox.ini b/tox.ini index a46ad04b7b3..23738ad1ae5 100644 --- a/tox.ini +++ b/tox.ini @@ -70,7 +70,7 @@ basepython = python3 skip_install = True commands_pre = deps = - vendoring~=0.3.3 + vendoring~=1.0.0 # Required, otherwise we interpret --no-binary :all: as # "do not build wheels", which fails for PEP 517 requirements pip>=19.3.1