Skip to content

Commit 65c105a

Browse files
maxispeicherkasteph
authored andcommitted
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
1 parent 23a1c98 commit 65c105a

File tree

2 files changed

+89
-9
lines changed

2 files changed

+89
-9
lines changed

poetry/utils/exporter.py

+15-7
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
from cleo.io.io import IO
99

10+
from poetry.core.packages.utils.utils import path_to_url
1011
from poetry.poetry import Poetry
1112
from poetry.utils._compat import decode
1213

@@ -71,23 +72,30 @@ def _export_requirements_txt(
7172
line += "-e "
7273

7374
requirement = dependency.to_pep_508(with_extras=False)
74-
is_direct_reference = (
75-
dependency.is_vcs()
76-
or dependency.is_url()
77-
or dependency.is_file()
78-
or dependency.is_directory()
75+
is_direct_local_reference = (
76+
dependency.is_file() or dependency.is_directory()
7977
)
78+
is_direct_remote_reference = dependency.is_vcs() or dependency.is_url()
8079

81-
if is_direct_reference:
80+
if is_direct_remote_reference:
8281
line = requirement
82+
elif is_direct_local_reference:
83+
dependency_uri = path_to_url(dependency.source_url)
84+
line = "{} @ {}".format(dependency.name, dependency_uri)
8385
else:
8486
line = "{}=={}".format(package.name, package.version)
87+
88+
if not is_direct_remote_reference:
8589
if ";" in requirement:
8690
markers = requirement.split(";", 1)[1].strip()
8791
if markers:
8892
line += "; {}".format(markers)
8993

90-
if not is_direct_reference and package.source_url:
94+
if (
95+
not is_direct_remote_reference
96+
and not is_direct_local_reference
97+
and package.source_url
98+
):
9199
indexes.add(package.source_url)
92100

93101
if package.files and with_hashes:

tests/utils/test_exporter.py

+74-2
Original file line numberDiff line numberDiff line change
@@ -1026,7 +1026,79 @@ def test_exporter_can_export_requirements_txt_with_directory_packages(
10261026
expected = """\
10271027
foo @ {}/tests/fixtures/sample_project
10281028
""".format(
1029-
working_directory.as_posix()
1029+
working_directory.as_uri()
1030+
)
1031+
1032+
assert expected == content
1033+
1034+
1035+
def test_exporter_can_export_requirements_txt_with_nested_directory_packages(
1036+
tmp_dir, poetry, working_directory
1037+
):
1038+
poetry.locker.mock_lock_data(
1039+
{
1040+
"package": [
1041+
{
1042+
"name": "foo",
1043+
"version": "1.2.3",
1044+
"category": "main",
1045+
"optional": False,
1046+
"python-versions": "*",
1047+
"source": {
1048+
"type": "directory",
1049+
"url": "tests/fixtures/sample_project",
1050+
"reference": "",
1051+
},
1052+
},
1053+
{
1054+
"name": "bar",
1055+
"version": "4.5.6",
1056+
"category": "main",
1057+
"optional": False,
1058+
"python-versions": "*",
1059+
"source": {
1060+
"type": "directory",
1061+
"url": "tests/fixtures/sample_project/../project_with_nested_local/bar",
1062+
"reference": "",
1063+
},
1064+
},
1065+
{
1066+
"name": "baz",
1067+
"version": "7.8.9",
1068+
"category": "main",
1069+
"optional": False,
1070+
"python-versions": "*",
1071+
"source": {
1072+
"type": "directory",
1073+
"url": "tests/fixtures/sample_project/../project_with_nested_local/bar/..",
1074+
"reference": "",
1075+
},
1076+
},
1077+
],
1078+
"metadata": {
1079+
"python-versions": "*",
1080+
"content-hash": "123456789",
1081+
"hashes": {"foo": [], "bar": [], "baz": []},
1082+
},
1083+
}
1084+
)
1085+
set_package_requires(poetry)
1086+
1087+
exporter = Exporter(poetry)
1088+
1089+
exporter.export("requirements.txt", Path(tmp_dir), "requirements.txt")
1090+
1091+
with (Path(tmp_dir) / "requirements.txt").open(encoding="utf-8") as f:
1092+
content = f.read()
1093+
1094+
expected = """\
1095+
bar @ {}/tests/fixtures/project_with_nested_local/bar
1096+
baz @ {}/tests/fixtures/project_with_nested_local
1097+
foo @ {}/tests/fixtures/sample_project
1098+
""".format(
1099+
working_directory.as_uri(),
1100+
working_directory.as_uri(),
1101+
working_directory.as_uri(),
10301102
)
10311103

10321104
assert expected == content
@@ -1071,7 +1143,7 @@ def test_exporter_can_export_requirements_txt_with_directory_packages_and_marker
10711143
expected = """\
10721144
foo @ {}/tests/fixtures/sample_project; python_version < "3.7"
10731145
""".format(
1074-
working_directory.as_posix()
1146+
working_directory.as_uri()
10751147
)
10761148

10771149
assert expected == content

0 commit comments

Comments
 (0)