| | |
| |
|
| |
|
| | 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 |
| |
|
| | def __hash__(self): |
| | return hash((self.year, self.minor, self.micro, self.releaselevel)) |
| |
|