From 8271f721627717c44be721cefd4a282d900d790b Mon Sep 17 00:00:00 2001 From: Keshav Priyadarshi Date: Mon, 18 Apr 2022 00:39:23 +0530 Subject: [PATCH] fix comparison for OpenSSL pre-release Signed-off-by: Keshav Priyadarshi --- src/univers/versions.py | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/univers/versions.py b/src/univers/versions.py index 1450d03a..d420a7cd 100644 --- a/src/univers/versions.py +++ b/src/univers/versions.py @@ -385,6 +385,19 @@ class LegacyOpensslVersion(Version): univers.versions.InvalidVersion: '3.0.2' is not a valid """ + major = attr.ib(type=int, default=None, repr=False) + minor = attr.ib(type=int, default=None, repr=False) + build = attr.ib(type=int, default=None, repr=False) + patch = attr.ib(type=str, default=None, repr=False) + + def __attrs_post_init__(self): + super().__attrs_post_init__() + major, minor, build, patch = self.value + object.__setattr__(self, "major", major) + object.__setattr__(self, "minor", minor) + object.__setattr__(self, "build", build) + object.__setattr__(self, "patch", patch) + @classmethod def is_valid(cls, string): return bool(cls.parse(string)) @@ -445,7 +458,29 @@ def build_value(cls, string): return cls.parse(string) def __str__(self): - return f"{self.value[0]}.{self.value[1]}.{self.value[2]}{self.value[3]}" + return f"{self.major}.{self.minor}.{self.build}{self.patch}" + + def __lt__(self, other): + if not isinstance(other, self.__class__): + return NotImplemented + # Check if versions have the same base, and `one and only one` of them is a pre-release. + if (self.major, self.minor, self.build) == (other.major, other.minor, other.build) and ( + self.is_prerelease() != other.is_prerelease() + ): + return self.is_prerelease() + return self.value.__lt__(other.value) + + def __gt__(self, other): + if not isinstance(other, self.__class__): + return NotImplemented + if (self.major, self.minor, self.build) == (other.major, other.minor, other.build) and ( + self.is_prerelease() != other.is_prerelease() + ): + return other.is_prerelease() + return self.value.__gt__(other.value) + + def is_prerelease(self): + return self.patch.startswith(("-beta", "-alpha")) @attr.s(frozen=True, order=False, eq=False, hash=True)