From 364f025f2d912f86af0a880453b85ac986d0354a Mon Sep 17 00:00:00 2001 From: Arun Babu Neelicattu Date: Sat, 3 Apr 2021 02:49:16 +0200 Subject: [PATCH] pep440: support post/local for semver allows This change ensures that post and local releases are taken into consideration when checking if semver version instance allows post and local build releases. The following conditions now hold `poetry.core.semver.Version.allows`. - `3.0.0` allows `3.0.0+local.1`, `3.0.0-1` - `3.0.0+local.1` disallows `3.0.0+local.2`, allows `3.0.0-1` - `3.0.0-1` disallows ``3.0.0`, `3.0.0+local.1`, allows `3.0.0-1+local.1` --- poetry/core/semver/version.py | 27 +++++++++++++++++++++++---- tests/semver/test_version.py | 24 +++++++++++++++++++++++- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/poetry/core/semver/version.py b/poetry/core/semver/version.py index 6ed622fc9..3246d0f34 100644 --- a/poetry/core/semver/version.py +++ b/poetry/core/semver/version.py @@ -80,10 +80,29 @@ def is_empty(self) -> bool: return False def allows(self, version: "Version") -> bool: - return self == version + if version is None: + return False + + _this, _other = self, version + + # allow weak equality to allow `3.0.0+local.1` for `3.0.0` + if not _this.is_local() and _other.is_local(): + _other = _other.without_local() + elif _this.is_local() and not _other.is_local(): + _this = _this.without_local() + + # allow weak equality to allow `3.0.0-1` for `3.0.0` + if not _this.is_postrelease() and _other.is_postrelease(): + _other = _other.without_postrelease() + elif _this.without_postrelease() and not _other.without_postrelease(): + _this = _this.without_postrelease() + + return _this == _other def allows_all(self, other: "VersionTypes") -> bool: - return other.is_empty() or other == self + return other.is_empty() or ( + self.allows(other) if isinstance(other, self.__class__) else other == self + ) def allows_any(self, other: "VersionTypes") -> bool: return other.allows(self) @@ -101,7 +120,7 @@ def union(self, other: "VersionTypes") -> "VersionTypes": return other if isinstance(other, VersionRangeConstraint): - if other.min == self: + if self.allows(other.min): return VersionRange( other.min, other.max, @@ -109,7 +128,7 @@ def union(self, other: "VersionTypes") -> "VersionTypes": include_max=other.include_max, ) - if other.max == self: + if self.allows(other.max): return VersionRange( other.min, other.max, diff --git a/tests/semver/test_version.py b/tests/semver/test_version.py index 499fafe4a..eb7734a69 100644 --- a/tests/semver/test_version.py +++ b/tests/semver/test_version.py @@ -113,7 +113,29 @@ def test_allows(): assert not v.allows(Version.parse("1.3.3")) assert not v.allows(Version.parse("1.2.4")) assert not v.allows(Version.parse("1.2.3-dev")) - assert not v.allows(Version.parse("1.2.3+build")) + assert v.allows(Version.parse("1.2.3+build")) + assert v.allows(Version.parse("1.2.3-1")) + assert v.allows(Version.parse("1.2.3-1+build")) + + +def test_allows_with_local(): + v = Version.parse("1.2.3+build.1") + assert v.allows(v) + assert not v.allows(Version.parse("1.3.3")) + assert not v.allows(Version.parse("1.2.3-dev")) + assert not v.allows(Version.parse("1.2.3+build.2")) + assert v.allows(Version.parse("1.2.3-1")) + assert v.allows(Version.parse("1.2.3-1+build.1")) + + +def test_allows_with_post(): + v = Version.parse("1.2.3-1") + assert v.allows(v) + assert not v.allows(Version.parse("1.2.3")) + assert not v.allows(Version.parse("2.2.3")) + assert not v.allows(Version.parse("1.2.3-dev")) + assert not v.allows(Version.parse("1.2.3+build.2")) + assert v.allows(Version.parse("1.2.3-1+build.1")) def test_allows_all():