From eed035791239501f1ad47d30412a97be0b2e0128 Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Wed, 7 Dec 2022 00:35:12 -0500 Subject: [PATCH 1/4] Add news fragment. --- news/5479.bugfix.rst | 1 + pipenv/utils/dependencies.py | 21 ++++++++++----------- pipenv/utils/locking.py | 9 ++++----- 3 files changed, 15 insertions(+), 16 deletions(-) create mode 100644 news/5479.bugfix.rst diff --git a/news/5479.bugfix.rst b/news/5479.bugfix.rst new file mode 100644 index 00000000..c1b40e96 --- /dev/null +++ b/news/5479.bugfix.rst @@ -0,0 +1 @@ +Fix regression where ``path`` is not propagated to the ``Pipfile.lock``. diff --git a/pipenv/utils/dependencies.py b/pipenv/utils/dependencies.py index 34798d88..effb220c 100644 --- a/pipenv/utils/dependencies.py +++ b/pipenv/utils/dependencies.py @@ -208,17 +208,16 @@ def clean_resolved_dep(dep, is_top_level=False, pipfile_entry=None): lockfile[key] = dep[key] # In case we lock a uri or a file when the user supplied a path # remove the uri or file keys from the entry and keep the path - fs_key = next(iter(k for k in ["path", "file"] if k in dep), None) - pipfile_fs_key = None - if pipfile_entry: - pipfile_fs_key = next( - iter(k for k in ["path", "file"] if k in pipfile_entry), None - ) - if fs_key and pipfile_fs_key and fs_key != pipfile_fs_key: - lockfile[pipfile_fs_key] = pipfile_entry[pipfile_fs_key] - elif fs_key is not None: - lockfile[fs_key] = dep[fs_key] - + preferred_file_keys = ["path", "file"] + dependency_file_key = next(iter(k for k in preferred_file_keys if k in dep), None) + if dependency_file_key: + lockfile[dependency_file_key] = dep[dependency_file_key] + # Pipfile entry overrides path/file from resolver + if pipfile_entry and isinstance(pipfile_entry, dict): + for k in preferred_file_keys: + if k in pipfile_entry.keys(): + lockfile[k] = pipfile_entry[k] + break # If a package is **PRESENT** in the pipfile but has no markers, make sure we # **NEVER** include markers in the lockfile if "markers" in dep and dep.get("markers", "").strip(): diff --git a/pipenv/utils/locking.py b/pipenv/utils/locking.py index 3b6e3247..811bae9d 100644 --- a/pipenv/utils/locking.py +++ b/pipenv/utils/locking.py @@ -45,12 +45,11 @@ def get_locked_dep(dep, pipfile_section, prefer_pipfile=True): # TODO: Is this implementation clear? How can it be improved? entry = None cleaner_kwargs = {"is_top_level": False, "pipfile_entry": None} - if isinstance(dep, Mapping) and dep.get("name", ""): + if isinstance(dep, Mapping) and dep.get("name"): dep_name = pep423_name(dep["name"]) - name = next( - iter(k for k in pipfile_section.keys() if pep423_name(k) == dep_name), None - ) - entry = pipfile_section[name] if name else None + for pipfile_key, pipfile_entry in pipfile_section.items(): + if pep423_name(pipfile_key) == dep_name: + entry = pipfile_entry if entry: cleaner_kwargs.update({"is_top_level": True, "pipfile_entry": entry}) From caa5ad26a2746693ea5bf1bc01b2cc3a339d66f9 Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Wed, 7 Dec 2022 00:45:39 -0500 Subject: [PATCH 2/4] Simplify method --- pipenv/utils/locking.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/pipenv/utils/locking.py b/pipenv/utils/locking.py index 811bae9d..f063abfe 100644 --- a/pipenv/utils/locking.py +++ b/pipenv/utils/locking.py @@ -39,10 +39,7 @@ def format_requirement_for_lockfile(req, markers_lookup, index_lookup, hashes=No return name, entry -def get_locked_dep(dep, pipfile_section, prefer_pipfile=True): - # the prefer pipfile flag is not used yet, but we are introducing - # it now for development purposes - # TODO: Is this implementation clear? How can it be improved? +def get_locked_dep(dep, pipfile_section): entry = None cleaner_kwargs = {"is_top_level": False, "pipfile_entry": None} if isinstance(dep, Mapping) and dep.get("name"): @@ -62,8 +59,7 @@ def get_locked_dep(dep, pipfile_section, prefer_pipfile=True): lockfile_version = lockfile_dict.get("version", "") # Keep pins from the lockfile if ( - prefer_pipfile - and lockfile_version != version + lockfile_version != version and version.startswith("==") and "*" not in version ): From 7514a581acbea0a1a14cf7426c4620d74c87bb20 Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Wed, 7 Dec 2022 01:08:11 -0500 Subject: [PATCH 3/4] fix lint. --- pipenv/utils/locking.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/pipenv/utils/locking.py b/pipenv/utils/locking.py index f063abfe..c4333b67 100644 --- a/pipenv/utils/locking.py +++ b/pipenv/utils/locking.py @@ -58,11 +58,7 @@ def get_locked_dep(dep, pipfile_section): lockfile_name, lockfile_dict = lockfile_entry.copy().popitem() lockfile_version = lockfile_dict.get("version", "") # Keep pins from the lockfile - if ( - lockfile_version != version - and version.startswith("==") - and "*" not in version - ): + if lockfile_version != version and version.startswith("==") and "*" not in version: lockfile_dict["version"] = version lockfile_entry[lockfile_name] = lockfile_dict return lockfile_entry From 5fb04ff8b3443ec986bf5ba7f784e9806d6d6cdf Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Wed, 7 Dec 2022 20:33:45 -0500 Subject: [PATCH 4/4] Add basic test case. --- tests/integration/test_install_uri.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/integration/test_install_uri.py b/tests/integration/test_install_uri.py index 81518a9e..40816694 100644 --- a/tests/integration/test_install_uri.py +++ b/tests/integration/test_install_uri.py @@ -60,6 +60,10 @@ def test_file_urls_work(pipenv_instance_pypi, pip_src_dir): assert c.returncode == 0 assert "six" in p.pipfile["packages"] assert "file" in p.pipfile["packages"]["six"] + assert 'six' in p.lockfile["default"] + assert 'file' in p.lockfile["default"]["six"] + assert "six-1.11.0-py2.py3-none-any.whl" in p.lockfile["default"]["six"]["file"] + @pytest.mark.e