From d2b2afe0c32a08d3d2e2f7185b5265cfe6319cc1 Mon Sep 17 00:00:00 2001
From: Frederico Caroli <77297340+fredsensibill@users.noreply.github.com>
Date: Tue, 30 Apr 2024 09:02:24 -0700
Subject: [PATCH] Adding -e flag to editable local references (#258)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: Randy Döring <30527984+radoering@users.noreply.github.com>
---
src/poetry_plugin_export/exporter.py | 21 +++++++-------
tests/test_exporter.py | 41 ++++++++++++++++++++++++++++
2 files changed, 52 insertions(+), 10 deletions(-)
diff --git a/src/poetry_plugin_export/exporter.py b/src/poetry_plugin_export/exporter.py
index a287fc0..7ff5f08 100644
--- a/src/poetry_plugin_export/exporter.py
+++ b/src/poetry_plugin_export/exporter.py
@@ -108,15 +108,13 @@ def _export_generic_txt(
dependency = dependency_package.dependency
package = dependency_package.package
- if package.develop:
- if not allow_editable:
- self._io.write_error_line(
- f"Warning: {package.pretty_name} is locked in develop"
- " (editable) mode, which is incompatible with the"
- " constraints.txt format."
- )
- continue
- line += "-e "
+ if package.develop and not allow_editable:
+ self._io.write_error_line(
+ f"Warning: {package.pretty_name} is locked in develop"
+ " (editable) mode, which is incompatible with the"
+ " constraints.txt format."
+ )
+ continue
requirement = dependency.to_pep_508(with_extras=False, resolved=True)
is_direct_local_reference = (
@@ -129,7 +127,10 @@ def _export_generic_txt(
elif is_direct_local_reference:
assert dependency.source_url is not None
dependency_uri = path_to_url(dependency.source_url)
- line = f"{package.complete_name} @ {dependency_uri}"
+ if package.develop:
+ line = f"-e {dependency_uri}"
+ else:
+ line = f"{package.complete_name} @ {dependency_uri}"
else:
line = f"{package.complete_name}=={package.version}"
diff --git a/tests/test_exporter.py b/tests/test_exporter.py
index 9df8dfb..bbb0fa9 100644
--- a/tests/test_exporter.py
+++ b/tests/test_exporter.py
@@ -1267,6 +1267,47 @@ def test_exporter_can_export_requirements_txt_with_directory_packages(
assert content == expected
+def test_exporter_can_export_requirements_txt_with_directory_packages_editable(
+ tmp_path: Path, poetry: Poetry, fixture_root_uri: str
+) -> None:
+ poetry.locker.mock_lock_data( # type: ignore[attr-defined]
+ {
+ "package": [
+ {
+ "name": "foo",
+ "version": "1.2.3",
+ "optional": False,
+ "python-versions": "*",
+ "develop": True,
+ "source": {
+ "type": "directory",
+ "url": "sample_project",
+ "reference": "",
+ },
+ }
+ ],
+ "metadata": {
+ "python-versions": "*",
+ "content-hash": "123456789",
+ "files": {"foo": []},
+ },
+ }
+ )
+ set_package_requires(poetry)
+
+ exporter = Exporter(poetry, NullIO())
+ exporter.export("requirements.txt", tmp_path, "requirements.txt")
+
+ with (tmp_path / "requirements.txt").open(encoding="utf-8") as f:
+ content = f.read()
+
+ expected = f"""\
+-e {fixture_root_uri}/sample_project ; {MARKER_PY}
+"""
+
+ assert content == expected
+
+
def test_exporter_can_export_requirements_txt_with_nested_directory_packages(
tmp_path: Path, poetry: Poetry, fixture_root_uri: str
) -> None: