Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 19 additions & 4 deletions src/poetry/core/packages/utils/utils.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from __future__ import annotations

import dataclasses
import functools
import re
import sys
Expand Down Expand Up @@ -288,8 +289,15 @@ def create_nested_marker(
and not constraint.include_min
and version.precision < 3
):
padding = ".0" * (3 - version.precision)
part = f'python_full_version > "{version}{padding}"'
release = version.release
release = dataclasses.replace(
release,
major=release.major or 0,
minor=release.minor or 0,
patch=release.patch or 0,
)
version = dataclasses.replace(version, release=release)
part = f'python_full_version > "{version}"'
else:
part = f'{min_name} {op} "{version.stable}"'

Expand All @@ -306,8 +314,15 @@ def create_nested_marker(
and constraint.include_max
and version.precision < 3
):
padding = ".0" * (3 - version.precision)
part = f'python_full_version <= "{version}{padding}"'
release = version.release
release = dataclasses.replace(
release,
major=release.major or 0,
minor=release.minor or 0,
patch=release.patch or 0,
)
version = dataclasses.replace(version, release=release)
part = f'python_full_version <= "{version}"'
else:
part = f'{max_name} {op} "{version.stable}"'

Expand Down
1 change: 0 additions & 1 deletion src/poetry/core/version/pep440/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,6 @@ def parse(cls, value: str, version_class: type[T]) -> T:
post=cls._get_postrelease(match),
dev=cls._get_devrelease(match),
local=cls._get_local(match),
text=value,
)


Expand Down
7 changes: 2 additions & 5 deletions src/poetry/core/version/pep440/version.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ class PEP440Version:
post: ReleaseTag | None = dataclasses.field(default=None, compare=False)
dev: ReleaseTag | None = dataclasses.field(default=None, compare=False)
local: LocalSegmentType = dataclasses.field(default=None, compare=False)
text: str = dataclasses.field(default="", compare=False)
text: str = dataclasses.field(init=False, compare=False)
_compare_key: tuple[
int, Release, ReleaseTag, ReleaseTag, ReleaseTag, tuple[int | str, ...]
] = dataclasses.field(init=False, compare=True)
Expand All @@ -69,10 +69,7 @@ def __post_init__(self) -> None:
if isinstance(self.release, tuple):
object.__setattr__(self, "release", Release(*self.release))

# we do this here to handle both None and tomlkit string values
object.__setattr__(
self, "text", self.to_string() if not self.text else str(self.text)
)
object.__setattr__(self, "text", self.to_string())

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

Expand Down
10 changes: 5 additions & 5 deletions tests/constraints/version/test_parse_constraint.py
Original file line number Diff line number Diff line change
Expand Up @@ -445,15 +445,15 @@ def test_parse_constraints_with_trailing_comma(
("^1", ">=1,<2"),
("^1.0", ">=1.0,<2.0"),
("^1.0.0", ">=1.0.0,<2.0.0"),
("^1.0.0-alpha.1", ">=1.0.0-alpha.1,<2.0.0"),
("^1.0.0-alpha.1", ">=1.0.0a1,<2.0.0"),
("^0", ">=0,<1"),
("^0.1", ">=0.1,<0.2"),
("^0.0.2", ">=0.0.2,<0.0.3"),
("^0.1.2", ">=0.1.2,<0.2.0"),
("^0-alpha.1", ">=0-alpha.1,<1"),
("^0.1-alpha.1", ">=0.1-alpha.1,<0.2"),
("^0.0.2-alpha.1", ">=0.0.2-alpha.1,<0.0.3"),
("^0.1.2-alpha.1", ">=0.1.2-alpha.1,<0.2.0"),
("^0-alpha.1", ">=0a1,<1"),
("^0.1-alpha.1", ">=0.1a1,<0.2"),
("^0.0.2-alpha.1", ">=0.0.2a1,<0.0.3"),
("^0.1.2-alpha.1", ">=0.1.2a1,<0.2.0"),
("~1", ">=1,<2"),
("~1.0", ">=1.0,<1.1"),
("~1.0.0", ">=1.0.0,<1.1.0"),
Expand Down
54 changes: 35 additions & 19 deletions tests/constraints/version/test_version.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,31 +16,47 @@


@pytest.mark.parametrize(
"text,version",
"text,version,normalized",
[
("1.0.0", Version.from_parts(1, 0, 0)),
("1", Version.from_parts(1, 0, 0)),
("1.0", Version.from_parts(1, 0, 0)),
("1b1", Version.from_parts(1, 0, 0, pre=ReleaseTag("beta", 1))),
("1.0b1", Version.from_parts(1, 0, 0, pre=ReleaseTag("beta", 1))),
("1.0.0b1", Version.from_parts(1, 0, 0, pre=ReleaseTag("beta", 1))),
("1.0.0-b1", Version.from_parts(1, 0, 0, pre=ReleaseTag("beta", 1))),
("1.0.0-beta.1", Version.from_parts(1, 0, 0, pre=ReleaseTag("beta", 1))),
("1.0.0+1", Version.from_parts(1, 0, 0, local=1)),
("1.0.0-1", Version.from_parts(1, 0, 0, post=ReleaseTag("post", 1))),
("1.0.0.0", Version.from_parts(1, 0, 0, extra=0)),
("1.0.0-post", Version.from_parts(1, 0, 0, post=ReleaseTag("post"))),
("1.0.0-post1", Version.from_parts(1, 0, 0, post=ReleaseTag("post", 1))),
("0.6c", Version.from_parts(0, 6, 0, pre=ReleaseTag("rc", 0))),
("0.6pre", Version.from_parts(0, 6, 0, pre=ReleaseTag("preview", 0))),
("1!2.3.4", Version.from_parts(2, 3, 4, epoch=1)),
("1.0.0", Version.from_parts(1, 0, 0), "1.0.0"),
("1", Version.from_parts(1, 0, 0), "1"),
("1.0", Version.from_parts(1, 0, 0), "1.0"),
("1b1", Version.from_parts(1, 0, 0, pre=ReleaseTag("beta", 1)), "1b1"),
("1.0b1", Version.from_parts(1, 0, 0, pre=ReleaseTag("beta", 1)), "1.0b1"),
("1.0.0b1", Version.from_parts(1, 0, 0, pre=ReleaseTag("beta", 1)), "1.0.0b1"),
("1.0.0-b1", Version.from_parts(1, 0, 0, pre=ReleaseTag("beta", 1)), "1.0.0b1"),
(
"1.0.0-beta.1",
Version.from_parts(1, 0, 0, pre=ReleaseTag("beta", 1)),
"1.0.0b1",
),
("1.0.0+1", Version.from_parts(1, 0, 0, local=1), "1.0.0+1"),
(
"1.0.0-1",
Version.from_parts(1, 0, 0, post=ReleaseTag("post", 1)),
"1.0.0.post1",
),
("1.0.0.0", Version.from_parts(1, 0, 0, extra=0), "1.0.0.0"),
(
"1.0.0-post",
Version.from_parts(1, 0, 0, post=ReleaseTag("post")),
"1.0.0.post0",
),
(
"1.0.0-post1",
Version.from_parts(1, 0, 0, post=ReleaseTag("post", 1)),
"1.0.0.post1",
),
("0.6c", Version.from_parts(0, 6, 0, pre=ReleaseTag("rc", 0)), "0.6rc0"),
("0.6pre", Version.from_parts(0, 6, 0, pre=ReleaseTag("preview", 0)), "0.6rc0"),
("1!2.3.4", Version.from_parts(2, 3, 4, epoch=1), "1!2.3.4"),
],
)
def test_parse_valid(text: str, version: Version) -> None:
def test_parse_valid(text: str, version: Version, normalized: str) -> None:
parsed = Version.parse(text)

assert parsed == version
assert parsed.text == text
assert parsed.text == normalized


@pytest.mark.parametrize("value", [None, "example"])
Expand Down
2 changes: 2 additions & 0 deletions tests/packages/utils/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ def test_create_nested_marker_base_constraint(constraint: str, expected: str) ->
(">3.9", 'python_full_version > "3.9.0"'),
(">3.9.0", 'python_full_version > "3.9.0"'),
(">3.9.1", 'python_full_version > "3.9.1"'),
(">3.14rc1", 'python_full_version > "3.14.0rc1"'),
# max
("<3", 'python_version < "3"'),
("<3.9", 'python_version < "3.9"'),
Expand All @@ -133,6 +134,7 @@ def test_create_nested_marker_base_constraint(constraint: str, expected: str) ->
("<=3.9", 'python_full_version <= "3.9.0"'),
("<=3.9.0", 'python_full_version <= "3.9.0"'),
("<=3.9.1", 'python_full_version <= "3.9.1"'),
("<=3.14rc1", 'python_full_version <= "3.14.0rc1"'),
# min and max
(">=3.7, <3.9", 'python_version >= "3.7" and python_version < "3.9"'),
(">=3.7, <=3.9", 'python_version >= "3.7" and python_full_version <= "3.9.0"'),
Expand Down