1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- # SPDX-License-Identifier: MIT
- 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
- # Since alphabetically "dev0" < "final" < "post1" < "post2", we don't
- # have to do anything special with releaselevel for now.
- return us < them
|