From 72fa6dbedc42955e065a738c9fe9f15b957100da Mon Sep 17 00:00:00 2001 From: Maximilian Speicher Date: Wed, 7 Oct 2020 16:50:04 +0200 Subject: [PATCH 1/4] exporter: prepend file for local dependencies --- poetry/utils/exporter.py | 18 +++++++++++------- tests/utils/test_exporter.py | 8 ++++---- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/poetry/utils/exporter.py b/poetry/utils/exporter.py index 4200abd146d..fda3b10f7b5 100644 --- a/poetry/utils/exporter.py +++ b/poetry/utils/exporter.py @@ -87,15 +87,15 @@ def _export_requirements_txt( line += "-e " requirement = dependency.to_pep_508(with_extras=False) - is_direct_reference = ( - dependency.is_vcs() - or dependency.is_url() - or dependency.is_file() - or dependency.is_directory() + is_direct_local_reference = ( + dependency.is_file() or dependency.is_directory() ) + is_direct_remote_reference = dependency.is_vcs() or dependency.is_url() - if is_direct_reference: + if is_direct_remote_reference: line = requirement + elif is_direct_local_reference: + line = requirement.replace("@ ", "@ file://") else: line = "{}=={}".format(package.name, package.version) if ";" in requirement: @@ -103,7 +103,11 @@ def _export_requirements_txt( if markers: line += "; {}".format(markers) - if not is_direct_reference and package.source_url: + if ( + not is_direct_remote_reference + and not is_direct_local_reference + and package.source_url + ): indexes.add(package.source_url) if package.files and with_hashes: diff --git a/tests/utils/test_exporter.py b/tests/utils/test_exporter.py index e26f448f6de..7f99ecb7190 100644 --- a/tests/utils/test_exporter.py +++ b/tests/utils/test_exporter.py @@ -582,7 +582,7 @@ def test_exporter_can_export_requirements_txt_with_directory_packages( content = f.read() expected = """\ -foo @ {}/tests/fixtures/sample_project +foo @ file://{}/tests/fixtures/sample_project """.format( working_directory.as_posix() ) @@ -627,7 +627,7 @@ def test_exporter_can_export_requirements_txt_with_directory_packages_and_marker content = f.read() expected = """\ -foo @ {}/tests/fixtures/sample_project; python_version < "3.7" +foo @ file://{}/tests/fixtures/sample_project; python_version < "3.7" """.format( working_directory.as_posix() ) @@ -671,7 +671,7 @@ def test_exporter_can_export_requirements_txt_with_file_packages( content = f.read() expected = """\ -foo @ {}/tests/fixtures/distributions/demo-0.1.0.tar.gz +foo @ file://{}/tests/fixtures/distributions/demo-0.1.0.tar.gz """.format( working_directory.as_uri() ) @@ -716,7 +716,7 @@ def test_exporter_can_export_requirements_txt_with_file_packages_and_markers( content = f.read() expected = """\ -foo @ {}/tests/fixtures/distributions/demo-0.1.0.tar.gz; python_version < "3.7" +foo @ file://{}/tests/fixtures/distributions/demo-0.1.0.tar.gz; python_version < "3.7" """.format( working_directory.as_uri() ) From cf6860b4ed4eec2aea2252ccbd55260bcb2a1c68 Mon Sep 17 00:00:00 2001 From: Maximilian Speicher Date: Wed, 7 Oct 2020 22:32:17 +0200 Subject: [PATCH 2/4] exporter: use URIs for local dependencies --- poetry/utils/exporter.py | 5 ++++- tests/utils/test_exporter.py | 12 ++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/poetry/utils/exporter.py b/poetry/utils/exporter.py index fda3b10f7b5..8f1ff8a273d 100644 --- a/poetry/utils/exporter.py +++ b/poetry/utils/exporter.py @@ -95,9 +95,12 @@ def _export_requirements_txt( if is_direct_remote_reference: line = requirement elif is_direct_local_reference: - line = requirement.replace("@ ", "@ file://") + dependency_uri = Path(dependency.source_url).resolve().as_uri() + line = "{} @ {}".format(dependency.name, dependency_uri) else: line = "{}=={}".format(package.name, package.version) + + if not is_direct_remote_reference: if ";" in requirement: markers = requirement.split(";", 1)[1].strip() if markers: diff --git a/tests/utils/test_exporter.py b/tests/utils/test_exporter.py index 7f99ecb7190..1ba91697420 100644 --- a/tests/utils/test_exporter.py +++ b/tests/utils/test_exporter.py @@ -582,9 +582,9 @@ def test_exporter_can_export_requirements_txt_with_directory_packages( content = f.read() expected = """\ -foo @ file://{}/tests/fixtures/sample_project +foo @ {}/tests/fixtures/sample_project """.format( - working_directory.as_posix() + working_directory.as_uri() ) assert expected == content @@ -627,9 +627,9 @@ def test_exporter_can_export_requirements_txt_with_directory_packages_and_marker content = f.read() expected = """\ -foo @ file://{}/tests/fixtures/sample_project; python_version < "3.7" +foo @ {}/tests/fixtures/sample_project; python_version < "3.7" """.format( - working_directory.as_posix() + working_directory.as_uri() ) assert expected == content @@ -671,7 +671,7 @@ def test_exporter_can_export_requirements_txt_with_file_packages( content = f.read() expected = """\ -foo @ file://{}/tests/fixtures/distributions/demo-0.1.0.tar.gz +foo @ {}/tests/fixtures/distributions/demo-0.1.0.tar.gz """.format( working_directory.as_uri() ) @@ -716,7 +716,7 @@ def test_exporter_can_export_requirements_txt_with_file_packages_and_markers( content = f.read() expected = """\ -foo @ file://{}/tests/fixtures/distributions/demo-0.1.0.tar.gz; python_version < "3.7" +foo @ {}/tests/fixtures/distributions/demo-0.1.0.tar.gz; python_version < "3.7" """.format( working_directory.as_uri() ) From aab710a1c2c1f9eceef016af7d65cbbb24125216 Mon Sep 17 00:00:00 2001 From: Maximilian Speicher Date: Thu, 8 Oct 2020 01:23:06 +0200 Subject: [PATCH 3/4] exporter: add test for nested local dependencies --- tests/utils/test_exporter.py | 72 ++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/tests/utils/test_exporter.py b/tests/utils/test_exporter.py index 1ba91697420..e14210c95ec 100644 --- a/tests/utils/test_exporter.py +++ b/tests/utils/test_exporter.py @@ -590,6 +590,78 @@ def test_exporter_can_export_requirements_txt_with_directory_packages( assert expected == content +def test_exporter_can_export_requirements_txt_with_nested_directory_packages( + tmp_dir, poetry, working_directory +): + poetry.locker.mock_lock_data( + { + "package": [ + { + "name": "foo", + "version": "1.2.3", + "category": "main", + "optional": False, + "python-versions": "*", + "source": { + "type": "directory", + "url": "tests/fixtures/sample_project", + "reference": "", + }, + }, + { + "name": "bar", + "version": "4.5.6", + "category": "main", + "optional": False, + "python-versions": "*", + "source": { + "type": "directory", + "url": "tests/fixtures/sample_project/../project_with_nested_local/bar", + "reference": "", + }, + }, + { + "name": "baz", + "version": "7.8.9", + "category": "main", + "optional": False, + "python-versions": "*", + "source": { + "type": "directory", + "url": "tests/fixtures/sample_project/../project_with_nested_local/bar/..", + "reference": "", + }, + }, + ], + "metadata": { + "python-versions": "*", + "content-hash": "123456789", + "hashes": {"foo": [], "bar": [], "baz": []}, + }, + } + ) + set_package_requires(poetry) + + exporter = Exporter(poetry) + + exporter.export("requirements.txt", Path(tmp_dir), "requirements.txt") + + with (Path(tmp_dir) / "requirements.txt").open(encoding="utf-8") as f: + content = f.read() + + expected = """\ +bar @ {}/tests/fixtures/project_with_nested_local/bar +baz @ {}/tests/fixtures/project_with_nested_local +foo @ {}/tests/fixtures/sample_project +""".format( + working_directory.as_uri(), + working_directory.as_uri(), + working_directory.as_uri(), + ) + + assert expected == content + + def test_exporter_can_export_requirements_txt_with_directory_packages_and_markers( tmp_dir, poetry, working_directory ): From a6c4f9a79aaed9a88a487069cea9e02d91d4f1fa Mon Sep 17 00:00:00 2001 From: Maximilian Speicher Date: Thu, 8 Oct 2020 09:34:27 +0200 Subject: [PATCH 4/4] exporter: use path_to_url from core --- poetry/utils/exporter.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/poetry/utils/exporter.py b/poetry/utils/exporter.py index 8f1ff8a273d..35ef1681842 100644 --- a/poetry/utils/exporter.py +++ b/poetry/utils/exporter.py @@ -2,6 +2,7 @@ from clikit.api.io import IO +from poetry.core.packages.utils.utils import path_to_url from poetry.poetry import Poetry from poetry.utils._compat import Path from poetry.utils._compat import decode @@ -95,7 +96,7 @@ def _export_requirements_txt( if is_direct_remote_reference: line = requirement elif is_direct_local_reference: - dependency_uri = Path(dependency.source_url).resolve().as_uri() + dependency_uri = path_to_url(dependency.source_url) line = "{} @ {}".format(dependency.name, dependency_uri) else: line = "{}=={}".format(package.name, package.version)