Commit 65c105ab by Maximilian Committed by Steph Samson

exporter: ensure local references use uri

This change ensures that when exporting `requirements.txt`, local 
direct reference dependencies are exported as uri and not paths.

Resolves: #3189
parent 23a1c98d
...@@ -7,6 +7,7 @@ from typing import Union ...@@ -7,6 +7,7 @@ from typing import Union
from cleo.io.io import IO from cleo.io.io import IO
from poetry.core.packages.utils.utils import path_to_url
from poetry.poetry import Poetry from poetry.poetry import Poetry
from poetry.utils._compat import decode from poetry.utils._compat import decode
...@@ -71,23 +72,30 @@ class Exporter(object): ...@@ -71,23 +72,30 @@ class Exporter(object):
line += "-e " line += "-e "
requirement = dependency.to_pep_508(with_extras=False) requirement = dependency.to_pep_508(with_extras=False)
is_direct_reference = ( is_direct_local_reference = (
dependency.is_vcs() dependency.is_file() or dependency.is_directory()
or dependency.is_url()
or 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 line = requirement
elif is_direct_local_reference:
dependency_uri = path_to_url(dependency.source_url)
line = "{} @ {}".format(dependency.name, dependency_uri)
else: else:
line = "{}=={}".format(package.name, package.version) line = "{}=={}".format(package.name, package.version)
if not is_direct_remote_reference:
if ";" in requirement: if ";" in requirement:
markers = requirement.split(";", 1)[1].strip() markers = requirement.split(";", 1)[1].strip()
if markers: if markers:
line += "; {}".format(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) indexes.add(package.source_url)
if package.files and with_hashes: if package.files and with_hashes:
......
...@@ -1026,7 +1026,79 @@ def test_exporter_can_export_requirements_txt_with_directory_packages( ...@@ -1026,7 +1026,79 @@ def test_exporter_can_export_requirements_txt_with_directory_packages(
expected = """\ expected = """\
foo @ {}/tests/fixtures/sample_project foo @ {}/tests/fixtures/sample_project
""".format( """.format(
working_directory.as_posix() working_directory.as_uri()
)
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 assert expected == content
...@@ -1071,7 +1143,7 @@ def test_exporter_can_export_requirements_txt_with_directory_packages_and_marker ...@@ -1071,7 +1143,7 @@ def test_exporter_can_export_requirements_txt_with_directory_packages_and_marker
expected = """\ expected = """\
foo @ {}/tests/fixtures/sample_project; python_version < "3.7" foo @ {}/tests/fixtures/sample_project; python_version < "3.7"
""".format( """.format(
working_directory.as_posix() working_directory.as_uri()
) )
assert expected == content assert expected == content
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment