88 lines
2.1 KiB
Python
88 lines
2.1 KiB
Python
|
# SPDX-License-Identifier: MIT
|
||
|
|
||
|
from __future__ import absolute_import, division, print_function
|
||
|
|
||
|
from functools import total_ordering
|
||
|
|
||
|
from ._funcs import astuple
|
||
|
from ._make import attrib, attrs
|
||
|
|
||
|
|
||
|
@total_ordering
|
||
|
@attrs(eq=False, order=False, slots=True, frozen=True)
|
||
|
class VersionInfo(object):
|
||
|
"""
|
||
|
A version object that can be compared to tuple of length 1--4:
|
||
|
|
||
|
>>> attr.VersionInfo(19, 1, 0, "final") <= (19, 2)
|
||
|
True
|
||
|
>>> attr.VersionInfo(19, 1, 0, "final") < (19, 1, 1)
|
||
|
True
|
||
|
>>> vi = attr.VersionInfo(19, 2, 0, "final")
|
||
|
>>> vi < (19, 1, 1)
|
||
|
False
|
||
|
>>> vi < (19,)
|
||
|
False
|
||
|
>>> vi == (19, 2,)
|
||
|
True
|
||
|
>>> vi == (19, 2, 1)
|
||
|
False
|
||
|
|
||
|
.. versionadded:: 19.2
|
||
|
"""
|
||
|
|
||
|
year = attrib(type=int)
|
||
|
minor = attrib(type=int)
|
||
|
micro = attrib(type=int)
|
||
|
releaselevel = attrib(type=str)
|
||
|
|
||
|
@classmethod
|
||
|
def _from_version_string(cls, s):
|
||
|
"""
|
||
|
Parse *s* and return a _VersionInfo.
|
||
|
"""
|
||
|
v = s.split(".")
|
||
|
if len(v) == 3:
|
||
|
v.append("final")
|
||
|
|
||
|
return cls(
|
||
|
year=int(v[0]), minor=int(v[1]), micro=int(v[2]), releaselevel=v[3]
|
||
|
)
|
||
|
|
||
|
def _ensure_tuple(self, other):
|
||
|
"""
|
||
|
Ensure *other* is a tuple of a valid length.
|
||
|
|
||
|
Returns a possibly transformed *other* and ourselves as a tuple of
|
||
|
the same length as *other*.
|
||
|
"""
|
||
|
|
||
|
if self.__class__ is other.__class__:
|
||
|
other = astuple(other)
|
||
|
|
||
|
if not isinstance(other, tuple):
|
||
|
raise NotImplementedError
|
||
|
|
||
|
if not (1 <= len(other) <= 4):
|
||
|
raise NotImplementedError
|
||
|
|
||
|
return astuple(self)[: len(other)], other
|
||
|
|
||
|
def __eq__(self, other):
|
||
|
try:
|
||
|
us, them = self._ensure_tuple(other)
|
||
|
except NotImplementedError:
|
||
|
return NotImplemented
|
||
|
|
||
|
return us == them
|
||
|
|
||
|
def __lt__(self, other):
|
||
|
try:
|
||
|
us, them = self._ensure_tuple(other)
|
||
|
except NotImplementedError:
|
||
|
return NotImplemented
|
||
|
|
||
|
# Since alphabetically "dev0" < "final" < "post1" < "post2", we don't
|
||
|
# have to do anything special with releaselevel for now.
|
||
|
return us < them
|