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: