You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			90 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
# 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
 | 
						|
 | 
						|
    def __hash__(self):
 | 
						|
        return hash((self.year, self.minor, self.micro, self.releaselevel))
 |