Skip to content

Commit 6bb8add

Browse files
committed
sort package name in extras to make it reproducible
this fixes python-poetry/poetry#5125
1 parent 3bdd0cf commit 6bb8add

10 files changed

+52
-10
lines changed

src/poetry/core/packages/dependency.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ def base_pep_508_name(self) -> str:
253253
requirement = self.pretty_name
254254

255255
if self.extras:
256-
extras = ",".join(self.extras)
256+
extras = ",".join(sorted(self.extras))
257257
requirement += f"[{extras}]"
258258

259259
if isinstance(self.constraint, VersionUnion):

src/poetry/core/packages/directory_dependency.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ def base_pep_508_name(self) -> str:
119119
requirement = self.pretty_name
120120

121121
if self.extras:
122-
extras = ",".join(self.extras)
122+
extras = ",".join(sorted(self.extras))
123123
requirement += f"[{extras}]"
124124

125125
path = path_to_url(self.path) if self.path.is_absolute() else self.path

src/poetry/core/packages/file_dependency.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ def base_pep_508_name(self) -> str:
105105
requirement = self.pretty_name
106106

107107
if self.extras:
108-
extras = ",".join(self.extras)
108+
extras = ",".join(sorted(self.extras))
109109
requirement += f"[{extras}]"
110110

111111
path = path_to_url(self.path) if self.path.is_absolute() else self.path

src/poetry/core/packages/url_dependency.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ def base_pep_508_name(self) -> str:
4646
requirement = self.pretty_name
4747

4848
if self.extras:
49-
extras = ",".join(self.extras)
49+
extras = ",".join(sorted(self.extras))
5050
requirement += f"[{extras}]"
5151

5252
requirement += f" @ {self._url}"

src/poetry/core/packages/vcs_dependency.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ def base_pep_508_name(self) -> str:
110110
parsed_url = git.ParsedUrl.parse(self._source)
111111

112112
if self.extras:
113-
extras = ",".join(self.extras)
113+
extras = ",".join(sorted(self.extras))
114114
requirement += f"[{extras}]"
115115

116116
if parsed_url.protocol is not None:

tests/packages/test_dependency.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -142,14 +142,14 @@ def test_to_pep_508_in_extras():
142142

143143
def test_to_pep_508_in_extras_parsed():
144144
dependency = Dependency.create_from_pep_508(
145-
'foo[bar] (>=1.23,<2.0) ; extra == "baz"'
145+
'foo[baz,bar] (>=1.23,<2.0) ; extra == "baz"'
146146
)
147147

148148
result = dependency.to_pep_508()
149-
assert result == 'foo[bar] (>=1.23,<2.0); extra == "baz"'
149+
assert result == 'foo[bar,baz] (>=1.23,<2.0); extra == "baz"'
150150

151151
result = dependency.to_pep_508(with_extras=False)
152-
assert result == "foo[bar] (>=1.23,<2.0)"
152+
assert result == "foo[bar,baz] (>=1.23,<2.0)"
153153

154154

155155
def test_to_pep_508_with_single_version_excluded():

tests/packages/test_directory_dependency.py

+11
Original file line numberDiff line numberDiff line change
@@ -61,3 +61,14 @@ def test_directory_dependency_pep_508_local_relative():
6161

6262
requirement = f"demo @ {path}"
6363
_test_directory_dependency_pep_508("demo", path, requirement)
64+
65+
66+
def test_directory_dependency_pep_508_extras():
67+
path = (
68+
Path(__file__).parent.parent
69+
/ "fixtures"
70+
/ "project_with_multi_constraints_dependency"
71+
)
72+
requirement = f"demo[foo,bar] @ file://{path.as_posix()}"
73+
requirement_expected = f"demo[bar,foo] @ file://{path.as_posix()}"
74+
_test_directory_dependency_pep_508("demo", path, requirement, requirement_expected)

tests/packages/test_file_dependency.py

+14
Original file line numberDiff line numberDiff line change
@@ -169,3 +169,17 @@ def test_relative_file_dependency_to_pep_508_with_marker(mocker: "MockerFixture"
169169
requirement,
170170
marker=SingleMarker("sys.platform", "linux"),
171171
)
172+
173+
174+
def test_file_dependency_pep_508_extras(mocker: "MockerFixture"):
175+
wheel = "demo-0.1.0-py2.py3-none-any.whl"
176+
177+
rel_path = Path("..") / "fixtures" / "distributions" / wheel
178+
requirement = f'demo[foo,bar] @ {rel_path.as_posix()} ; sys_platform == "linux"'
179+
_test_file_dependency_pep_508(
180+
mocker,
181+
"demo",
182+
rel_path,
183+
requirement,
184+
f'demo[bar,foo] @ {rel_path.as_posix()} ; sys_platform == "linux"',
185+
)

tests/packages/test_url_dependency.py

+14
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,20 @@ def test_to_pep_508():
1515
assert expected == dependency.to_pep_508()
1616

1717

18+
def test_to_pep_508_with_extras():
19+
dependency = URLDependency(
20+
"pytorch",
21+
"https://download.pytorch.org/whl/cpu/torch-1.5.1%2Bcpu-cp38-cp38-linux_x86_64.whl",
22+
extras=["foo", "bar"],
23+
)
24+
25+
expected = (
26+
"pytorch[bar,foo] @"
27+
" https://download.pytorch.org/whl/cpu/torch-1.5.1%2Bcpu-cp38-cp38-linux_x86_64.whl"
28+
)
29+
assert expected == dependency.to_pep_508()
30+
31+
1832
def test_to_pep_508_with_marker():
1933
dependency = URLDependency(
2034
"pytorch",

tests/packages/test_vcs_dependency.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,13 @@ def test_to_pep_508_ssh():
2525

2626
def test_to_pep_508_with_extras():
2727
dependency = VCSDependency(
28-
"poetry", "git", "https://github.com/python-poetry/poetry.git", extras=["foo"]
28+
"poetry",
29+
"git",
30+
"https://github.com/python-poetry/poetry.git",
31+
extras=["foo", "bar"],
2932
)
3033

31-
expected = "poetry[foo] @ git+https://github.com/python-poetry/poetry.git"
34+
expected = "poetry[bar,foo] @ git+https://github.com/python-poetry/poetry.git"
3235

3336
assert expected == dependency.to_pep_508()
3437

0 commit comments

Comments
 (0)