This commit is contained in:
lz_db
2026-10-16 22:48:30 +08:00
parent 190de72571
commit 0b36fd3383
3161 changed files with 12787 additions and 77274 deletions
@@ -26,9 +26,9 @@ Every version number class implements the following interface:
of the same class, thus must follow the same rules)
"""
import contextlib
import re
import warnings
import contextlib
@contextlib.contextmanager
@@ -53,13 +53,14 @@ class Version:
if vstring:
self.parse(vstring)
warnings.warn(
"distutils Version classes are deprecated. Use packaging.version instead.",
"distutils Version classes are deprecated. "
"Use packaging.version instead.",
DeprecationWarning,
stacklevel=2,
)
def __repr__(self):
return f"{self.__class__.__name__} ('{self}')"
return "{} ('{}')".format(self.__class__.__name__, str(self))
def __eq__(self, other):
c = self._cmp(other)
@@ -110,6 +111,7 @@ class Version:
class StrictVersion(Version):
"""Version numbering for anal retentives and software idealists.
Implements the standard interface for version number classes as
described above. A version number consists of two or three
@@ -152,7 +154,7 @@ class StrictVersion(Version):
def parse(self, vstring):
match = self.version_re.match(vstring)
if not match:
raise ValueError(f"invalid version number '{vstring}'")
raise ValueError("invalid version number '%s'" % vstring)
(major, minor, patch, prerelease, prerelease_num) = match.group(1, 2, 4, 5, 6)
@@ -167,6 +169,7 @@ class StrictVersion(Version):
self.prerelease = None
def __str__(self):
if self.version[2] == 0:
vstring = '.'.join(map(str, self.version[0:2]))
else:
@@ -177,36 +180,42 @@ class StrictVersion(Version):
return vstring
def _cmp(self, other):
def _cmp(self, other): # noqa: C901
if isinstance(other, str):
with suppress_known_deprecation():
other = StrictVersion(other)
elif not isinstance(other, StrictVersion):
return NotImplemented
if self.version == other.version:
# versions match; pre-release drives the comparison
return self._cmp_prerelease(other)
if self.version != other.version:
# numeric versions don't match
# prerelease stuff doesn't matter
if self.version < other.version:
return -1
else:
return 1
return -1 if self.version < other.version else 1
# have to compare prerelease
# case 1: neither has prerelease; they're equal
# case 2: self has prerelease, other doesn't; other is greater
# case 3: self doesn't have prerelease, other does: self is greater
# case 4: both have prerelease: must compare them!
def _cmp_prerelease(self, other):
"""
case 1: self has prerelease, other doesn't; other is greater
case 2: self doesn't have prerelease, other does: self is greater
case 3: both or neither have prerelease: compare them!
"""
if self.prerelease and not other.prerelease:
if not self.prerelease and not other.prerelease:
return 0
elif self.prerelease and not other.prerelease:
return -1
elif not self.prerelease and other.prerelease:
return 1
if self.prerelease == other.prerelease:
return 0
elif self.prerelease < other.prerelease:
return -1
elif self.prerelease and other.prerelease:
if self.prerelease == other.prerelease:
return 0
elif self.prerelease < other.prerelease:
return -1
else:
return 1
else:
return 1
assert False, "never get here"
# end class StrictVersion
@@ -278,6 +287,7 @@ class StrictVersion(Version):
class LooseVersion(Version):
"""Version numbering for anarchists and software realists.
Implements the standard interface for version number classes as
described above. A version number consists of a series of numbers,
@@ -329,7 +339,7 @@ class LooseVersion(Version):
return self.vstring
def __repr__(self):
return f"LooseVersion ('{self}')"
return "LooseVersion ('%s')" % str(self)
def _cmp(self, other):
if isinstance(other, str):