From d5a2007e8ff578551a4d6e45ac190faaba6f9832 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Bidoul?= Date: Sun, 25 Oct 2020 15:16:11 +0100 Subject: [PATCH] Avoid AssertionError in pip freeze with editable direct URLs --- news/8996.bugfix.rst | 3 +++ src/pip/_internal/utils/direct_url_helpers.py | 4 ---- tests/unit/test_direct_url_helpers.py | 15 +++++++++++++++ 3 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 news/8996.bugfix.rst diff --git a/news/8996.bugfix.rst b/news/8996.bugfix.rst new file mode 100644 index 000000000..e366a6a66 --- /dev/null +++ b/news/8996.bugfix.rst @@ -0,0 +1,3 @@ +Do not fail in pip freeze when encountering a ``direct_url.jso`` metadata file +with editable=True. Render it as a non-editable ``file://`` URL until modern +editable installs are standardized and supported. diff --git a/src/pip/_internal/utils/direct_url_helpers.py b/src/pip/_internal/utils/direct_url_helpers.py index a355a6c5e..87bd61fa0 100644 --- a/src/pip/_internal/utils/direct_url_helpers.py +++ b/src/pip/_internal/utils/direct_url_helpers.py @@ -43,10 +43,6 @@ def direct_url_as_pep440_direct_reference(direct_url, name): fragments.append(direct_url.info.hash) else: assert isinstance(direct_url.info, DirInfo) - # pip should never reach this point for editables, since - # pip freeze inspects the editable project location to produce - # the requirement string - assert not direct_url.info.editable requirement += direct_url.url if direct_url.subdirectory: fragments.append("subdirectory=" + direct_url.subdirectory) diff --git a/tests/unit/test_direct_url_helpers.py b/tests/unit/test_direct_url_helpers.py index 55cd5855b..b0cb50c6e 100644 --- a/tests/unit/test_direct_url_helpers.py +++ b/tests/unit/test_direct_url_helpers.py @@ -55,6 +55,21 @@ def test_as_pep440_requirement_dir(): ) +def test_as_pep440_requirement_editable_dir(): + # direct_url_as_pep440_direct_reference behaves the same + # irrespective of the editable flag. It's the responsibility of + # callers to render it as editable + direct_url = DirectUrl( + url="file:///home/user/project", + info=DirInfo(editable=True), + ) + direct_url.validate() + assert ( + direct_url_as_pep440_direct_reference(direct_url, "pkg") == + "pkg @ file:///home/user/project" + ) + + def test_as_pep440_requirement_vcs(): direct_url = DirectUrl( url="https:///g.c/u/p.git",