|
|
|
|
|
|
|
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: |
|
""" |
|
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 |
|
|
|
|
|
|
|
return us < them |
|
|