Skip to content

Commit acc1bc9

Browse files
authored
fix normalization of python_full_version markers with pre-release versions (#893)
1 parent d46a257 commit acc1bc9

File tree

6 files changed

+63
-34
lines changed

6 files changed

+63
-34
lines changed

src/poetry/core/packages/utils/utils.py

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import annotations
22

3+
import dataclasses
34
import functools
45
import re
56
import sys
@@ -288,8 +289,15 @@ def create_nested_marker(
288289
and not constraint.include_min
289290
and version.precision < 3
290291
):
291-
padding = ".0" * (3 - version.precision)
292-
part = f'python_full_version > "{version}{padding}"'
292+
release = version.release
293+
release = dataclasses.replace(
294+
release,
295+
major=release.major or 0,
296+
minor=release.minor or 0,
297+
patch=release.patch or 0,
298+
)
299+
version = dataclasses.replace(version, release=release)
300+
part = f'python_full_version > "{version}"'
293301
else:
294302
part = f'{min_name} {op} "{version.stable}"'
295303

@@ -306,8 +314,15 @@ def create_nested_marker(
306314
and constraint.include_max
307315
and version.precision < 3
308316
):
309-
padding = ".0" * (3 - version.precision)
310-
part = f'python_full_version <= "{version}{padding}"'
317+
release = version.release
318+
release = dataclasses.replace(
319+
release,
320+
major=release.major or 0,
321+
minor=release.minor or 0,
322+
patch=release.patch or 0,
323+
)
324+
version = dataclasses.replace(version, release=release)
325+
part = f'python_full_version <= "{version}"'
311326
else:
312327
part = f'{max_name} {op} "{version.stable}"'
313328

src/poetry/core/version/pep440/parser.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,6 @@ def parse(cls, value: str, version_class: type[T]) -> T:
7676
post=cls._get_postrelease(match),
7777
dev=cls._get_devrelease(match),
7878
local=cls._get_local(match),
79-
text=value,
8079
)
8180

8281

src/poetry/core/version/pep440/version.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class PEP440Version:
5757
post: ReleaseTag | None = dataclasses.field(default=None, compare=False)
5858
dev: ReleaseTag | None = dataclasses.field(default=None, compare=False)
5959
local: LocalSegmentType = dataclasses.field(default=None, compare=False)
60-
text: str = dataclasses.field(default="", compare=False)
60+
text: str = dataclasses.field(init=False, compare=False)
6161
_compare_key: tuple[
6262
int, Release, ReleaseTag, ReleaseTag, ReleaseTag, tuple[int | str, ...]
6363
] = dataclasses.field(init=False, compare=True)
@@ -69,10 +69,7 @@ def __post_init__(self) -> None:
6969
if isinstance(self.release, tuple):
7070
object.__setattr__(self, "release", Release(*self.release))
7171

72-
# we do this here to handle both None and tomlkit string values
73-
object.__setattr__(
74-
self, "text", self.to_string() if not self.text else str(self.text)
75-
)
72+
object.__setattr__(self, "text", self.to_string())
7673

7774
object.__setattr__(self, "_compare_key", self._make_compare_key())
7875

tests/constraints/version/test_parse_constraint.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -445,15 +445,15 @@ def test_parse_constraints_with_trailing_comma(
445445
("^1", ">=1,<2"),
446446
("^1.0", ">=1.0,<2.0"),
447447
("^1.0.0", ">=1.0.0,<2.0.0"),
448-
("^1.0.0-alpha.1", ">=1.0.0-alpha.1,<2.0.0"),
448+
("^1.0.0-alpha.1", ">=1.0.0a1,<2.0.0"),
449449
("^0", ">=0,<1"),
450450
("^0.1", ">=0.1,<0.2"),
451451
("^0.0.2", ">=0.0.2,<0.0.3"),
452452
("^0.1.2", ">=0.1.2,<0.2.0"),
453-
("^0-alpha.1", ">=0-alpha.1,<1"),
454-
("^0.1-alpha.1", ">=0.1-alpha.1,<0.2"),
455-
("^0.0.2-alpha.1", ">=0.0.2-alpha.1,<0.0.3"),
456-
("^0.1.2-alpha.1", ">=0.1.2-alpha.1,<0.2.0"),
453+
("^0-alpha.1", ">=0a1,<1"),
454+
("^0.1-alpha.1", ">=0.1a1,<0.2"),
455+
("^0.0.2-alpha.1", ">=0.0.2a1,<0.0.3"),
456+
("^0.1.2-alpha.1", ">=0.1.2a1,<0.2.0"),
457457
("~1", ">=1,<2"),
458458
("~1.0", ">=1.0,<1.1"),
459459
("~1.0.0", ">=1.0.0,<1.1.0"),

tests/constraints/version/test_version.py

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,31 +16,47 @@
1616

1717

1818
@pytest.mark.parametrize(
19-
"text,version",
19+
"text,version,normalized",
2020
[
21-
("1.0.0", Version.from_parts(1, 0, 0)),
22-
("1", Version.from_parts(1, 0, 0)),
23-
("1.0", Version.from_parts(1, 0, 0)),
24-
("1b1", Version.from_parts(1, 0, 0, pre=ReleaseTag("beta", 1))),
25-
("1.0b1", Version.from_parts(1, 0, 0, pre=ReleaseTag("beta", 1))),
26-
("1.0.0b1", Version.from_parts(1, 0, 0, pre=ReleaseTag("beta", 1))),
27-
("1.0.0-b1", Version.from_parts(1, 0, 0, pre=ReleaseTag("beta", 1))),
28-
("1.0.0-beta.1", Version.from_parts(1, 0, 0, pre=ReleaseTag("beta", 1))),
29-
("1.0.0+1", Version.from_parts(1, 0, 0, local=1)),
30-
("1.0.0-1", Version.from_parts(1, 0, 0, post=ReleaseTag("post", 1))),
31-
("1.0.0.0", Version.from_parts(1, 0, 0, extra=0)),
32-
("1.0.0-post", Version.from_parts(1, 0, 0, post=ReleaseTag("post"))),
33-
("1.0.0-post1", Version.from_parts(1, 0, 0, post=ReleaseTag("post", 1))),
34-
("0.6c", Version.from_parts(0, 6, 0, pre=ReleaseTag("rc", 0))),
35-
("0.6pre", Version.from_parts(0, 6, 0, pre=ReleaseTag("preview", 0))),
36-
("1!2.3.4", Version.from_parts(2, 3, 4, epoch=1)),
21+
("1.0.0", Version.from_parts(1, 0, 0), "1.0.0"),
22+
("1", Version.from_parts(1, 0, 0), "1"),
23+
("1.0", Version.from_parts(1, 0, 0), "1.0"),
24+
("1b1", Version.from_parts(1, 0, 0, pre=ReleaseTag("beta", 1)), "1b1"),
25+
("1.0b1", Version.from_parts(1, 0, 0, pre=ReleaseTag("beta", 1)), "1.0b1"),
26+
("1.0.0b1", Version.from_parts(1, 0, 0, pre=ReleaseTag("beta", 1)), "1.0.0b1"),
27+
("1.0.0-b1", Version.from_parts(1, 0, 0, pre=ReleaseTag("beta", 1)), "1.0.0b1"),
28+
(
29+
"1.0.0-beta.1",
30+
Version.from_parts(1, 0, 0, pre=ReleaseTag("beta", 1)),
31+
"1.0.0b1",
32+
),
33+
("1.0.0+1", Version.from_parts(1, 0, 0, local=1), "1.0.0+1"),
34+
(
35+
"1.0.0-1",
36+
Version.from_parts(1, 0, 0, post=ReleaseTag("post", 1)),
37+
"1.0.0.post1",
38+
),
39+
("1.0.0.0", Version.from_parts(1, 0, 0, extra=0), "1.0.0.0"),
40+
(
41+
"1.0.0-post",
42+
Version.from_parts(1, 0, 0, post=ReleaseTag("post")),
43+
"1.0.0.post0",
44+
),
45+
(
46+
"1.0.0-post1",
47+
Version.from_parts(1, 0, 0, post=ReleaseTag("post", 1)),
48+
"1.0.0.post1",
49+
),
50+
("0.6c", Version.from_parts(0, 6, 0, pre=ReleaseTag("rc", 0)), "0.6rc0"),
51+
("0.6pre", Version.from_parts(0, 6, 0, pre=ReleaseTag("preview", 0)), "0.6rc0"),
52+
("1!2.3.4", Version.from_parts(2, 3, 4, epoch=1), "1!2.3.4"),
3753
],
3854
)
39-
def test_parse_valid(text: str, version: Version) -> None:
55+
def test_parse_valid(text: str, version: Version, normalized: str) -> None:
4056
parsed = Version.parse(text)
4157

4258
assert parsed == version
43-
assert parsed.text == text
59+
assert parsed.text == normalized
4460

4561

4662
@pytest.mark.parametrize("value", [None, "example"])

tests/packages/utils/test_utils.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ def test_create_nested_marker_base_constraint(constraint: str, expected: str) ->
124124
(">3.9", 'python_full_version > "3.9.0"'),
125125
(">3.9.0", 'python_full_version > "3.9.0"'),
126126
(">3.9.1", 'python_full_version > "3.9.1"'),
127+
(">3.14rc1", 'python_full_version > "3.14.0rc1"'),
127128
# max
128129
("<3", 'python_version < "3"'),
129130
("<3.9", 'python_version < "3.9"'),
@@ -133,6 +134,7 @@ def test_create_nested_marker_base_constraint(constraint: str, expected: str) ->
133134
("<=3.9", 'python_full_version <= "3.9.0"'),
134135
("<=3.9.0", 'python_full_version <= "3.9.0"'),
135136
("<=3.9.1", 'python_full_version <= "3.9.1"'),
137+
("<=3.14rc1", 'python_full_version <= "3.14.0rc1"'),
136138
# min and max
137139
(">=3.7, <3.9", 'python_version >= "3.7" and python_version < "3.9"'),
138140
(">=3.7, <=3.9", 'python_version >= "3.7" and python_full_version <= "3.9.0"'),

0 commit comments

Comments
 (0)