From 4b7df6c49197eb569b9f58fc4bdae11ef2a9d667 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Coavoux?= Date: Fri, 30 Jun 2023 14:07:39 -0400 Subject: [PATCH] Ensure version match operator when building specifier from pipfile --- .../requirementslib/models/requirements.py | 6 +++++- tests/integration/test_install_basic.py | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/pipenv/vendor/requirementslib/models/requirements.py b/pipenv/vendor/requirementslib/models/requirements.py index 1f91923687..70cd4475a9 100644 --- a/pipenv/vendor/requirementslib/models/requirements.py +++ b/pipenv/vendor/requirementslib/models/requirements.py @@ -34,7 +34,7 @@ from pipenv.patched.pip._internal.req.req_install import InstallRequirement from pipenv.patched.pip._internal.utils.temp_dir import global_tempdir_manager from pipenv.patched.pip._internal.utils.urls import path_to_url, url_to_path -from pipenv.patched.pip._vendor.distlib.util import cached_property +from pipenv.patched.pip._vendor.distlib.util import cached_property, COMPARE_OP from pipenv.patched.pip._vendor.packaging.markers import Marker from pipenv.patched.pip._vendor.packaging.requirements import Requirement as PackagingRequirement from pipenv.patched.pip._vendor.packaging.specifiers import ( @@ -2551,6 +2551,10 @@ def from_pipfile(cls, name, pipfile): if hasattr(pipfile, "keys"): _pipfile = dict(pipfile).copy() _pipfile["version"] = get_version(pipfile) + + # We ensure version contains an operator. Default to equals (==) + if COMPARE_OP.match(_pipfile["version"]) is None: + _pipfile["version"] = "=={}".format(_pipfile["version"]) vcs = next(iter([vcs for vcs in VCS_LIST if vcs in _pipfile]), None) if vcs: _pipfile["vcs"] = vcs diff --git a/tests/integration/test_install_basic.py b/tests/integration/test_install_basic.py index afd0bd998e..c0fece5d8d 100644 --- a/tests/integration/test_install_basic.py +++ b/tests/integration/test_install_basic.py @@ -92,6 +92,23 @@ def test_install_without_dev(pipenv_instance_private_pypi): @pytest.mark.basic @pytest.mark.install +def test_install_with_version_req(pipenv_instance_pypi): + """Ensure that running `pipenv install` work when spec is package = "X.Y.Z". """ + with pipenv_instance_pypi(chdir=True) as p: + with open(p.pipfile_path, "w") as f: + contents = """ +[packages] +fastapi = "0.95.0" + """.strip() + f.write(contents) + c = p.pipenv("install") + assert c.returncode == 0 + assert "fastapi" in p.pipfile["packages"] + + +@pytest.mark.basic +@pytest.mark.install +@pytest.mark.resolver def test_install_without_dev_section(pipenv_instance_pypi): with pipenv_instance_pypi() as p: with open(p.pipfile_path, "w") as f: