From 90a70972ed9914b90b3f20e6d1538e0a8ea9139b Mon Sep 17 00:00:00 2001 From: Andy Kluger Date: Wed, 2 Mar 2022 02:43:38 -0500 Subject: [PATCH] Construct relative req lines to match what pip install understands Based on findings at https://github.com/jazzband/pip-tools/pull/1329#issuecomment-1056409415 --- piptools/utils.py | 19 ++++++++++++++----- tests/test_cli_compile.py | 2 +- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/piptools/utils.py b/piptools/utils.py index ae96c35ba..8df21f9df 100644 --- a/piptools/utils.py +++ b/piptools/utils.py @@ -153,7 +153,14 @@ def format_requirement( else: fragment = fragment_string(ireq) extras = f"[{','.join(sorted(ireq.extras))}]" if ireq.extras else "" - delimiter = "#" if extras and not fragment else "" + # pip install needs different relpath formats, depending on extras and fragments: + # https://github.com/jazzband/pip-tools/pull/1329#issuecomment-1056409415 + if fragment or not extras: + prefix = "file:" + delimiter = "" + else: + prefix = "" + delimiter = "#" if not from_dir: line = ( f"-e {path_to_url(ireq.local_file_path)}{fragment}{delimiter}{extras}" @@ -162,9 +169,9 @@ def format_requirement( ) else: try: - path_url = "file:" + os.path.relpath( - ireq.local_file_path, from_dir - ).replace(os.path.sep, "/") + relpath = os.path.relpath(ireq.local_file_path, from_dir).replace( + os.path.sep, "/" + ) except ValueError: # On Windows, a relative path is not always possible (no common ancestor) line = ( @@ -173,7 +180,9 @@ def format_requirement( else _build_direct_reference_best_efforts(ireq) ) else: - line = f"{'-e ' if ireq.editable else ''}{path_url}{fragment}{delimiter}{extras}" + if not prefix and not relpath.startswith("."): + prefix = "./" + line = f"{'-e ' if ireq.editable else ''}{prefix}{relpath}{fragment}{extras}" if marker: line = f"{line} ; {marker}" diff --git a/tests/test_cli_compile.py b/tests/test_cli_compile.py index 6fd8de785..e84b9bafc 100644 --- a/tests/test_cli_compile.py +++ b/tests/test_cli_compile.py @@ -643,7 +643,7 @@ def test_local_file_uri_package( ), pytest.param( "./small_fake_with_extras[dev,test]", - "file:small_fake_with_extras#[dev,test]", + "./small_fake_with_extras[dev,test]", id="relative path with extras", ), pytest.param(