o knh$A @sxdZddlmZddlZddlZddlmZmZmZm Z m Z m Z ddl m Z mZmZmZgdZe e eefdfZe eee eeffZe ee e e eefe ee eefffdffZe ee edfeeeefZeeegefZGd d d eZd/ddZGdddeZGdddZdZeZ GdddeZ!Gddde!Z"d0ddZ#e$d Z%d1d#d$Z&d2d-d.Z'dS)3zB .. testsetup:: from packaging.version import parse, Version ) annotationsN)AnyCallable NamedTuple SupportsIntTupleUnion)Infinity InfinityTypeNegativeInfinityNegativeInfinityType)VERSION_PATTERNInvalidVersionVersionparse.c@s>eZdZUded<ded<ded<ded<ded<d ed <d S) _Versionintepochtuple[int, ...]releasetuple[str, int] | NonedevprepostLocalType | NonelocalN)__name__ __module__ __qualname____annotations__r!r!>> parse('1.0.dev1') :param version: The version string to parse. :raises InvalidVersion: When the version string is not a valid version. )r)r#r!r!r"r/ rc@seZdZdZdS)rzRaised when a version string is not a valid version. >>> Version("invalid") Traceback (most recent call last): ... packaging.version.InvalidVersion: Invalid version: 'invalid' N)rrr__doc__r!r!r!r"r;src@s\eZdZUded<dddZdd d Zdd d ZdddZdddZdddZ dddZ dS) _BaseVersionztuple[Any, ...]_keyr%rcCs t|jSN)hashr)selfr!r!r"__hash__Hs z_BaseVersion.__hash__otherboolcCst|tstS|j|jkSr* isinstancer(NotImplementedr)r-r/r!r!r"__lt__N  z_BaseVersion.__lt__cCst|tstS|j|jkSr*r1r4r!r!r"__le__Tr6z_BaseVersion.__le__objectcCst|tstS|j|jkSr*r1r4r!r!r"__eq__Zr6z_BaseVersion.__eq__cCst|tstS|j|jkSr*r1r4r!r!r"__ge__`r6z_BaseVersion.__ge__cCst|tstS|j|jkSr*r1r4r!r!r"__gt__fr6z_BaseVersion.__gt__cCst|tstS|j|jkSr*r1r4r!r!r"__ne__lr6z_BaseVersion.__ne__Nr%r)r/r(r%r0)r/r8r%r0) rrrr r.r5r7r9r:r;r<r!r!r!r"r(Es       r(a v? (?: (?:(?P[0-9]+)!)? # epoch (?P[0-9]+(?:\.[0-9]+)*) # release segment (?P
                                          # pre-release
            [-_\.]?
            (?Palpha|a|beta|b|preview|pre|c|rc)
            [-_\.]?
            (?P[0-9]+)?
        )?
        (?P                                         # post release
            (?:-(?P[0-9]+))
            |
            (?:
                [-_\.]?
                (?Ppost|rev|r)
                [-_\.]?
                (?P[0-9]+)?
            )
        )?
        (?P                                          # dev release
            [-_\.]?
            (?Pdev)
            [-_\.]?
            (?P[0-9]+)?
        )?
    )
    (?:\+(?P[a-z0-9]+(?:[-_\.][a-z0-9]+)*))?       # local version
c@seZdZUdZededejejBZ	de
d<d3d
dZd4dd
Zd4ddZ
ed5ddZed6ddZed7ddZed8ddZed8ddZed9dd Zed4d!d"Zed4d#d$Zed:d&d'Zed:d(d)Zed:d*d+Zed5d,d-Zed5d.d/Zed5d0d1Zd2S);raThis class abstracts handling of a project's versions.

    A :class:`Version` instance is comparison aware and can be compared and
    sorted using the standard Python interfaces.

    >>> v1 = Version("1.0a5")
    >>> v2 = Version("1.0")
    >>> v1
    
    >>> v2
    
    >>> v1 < v2
    True
    >>> v1 == v2
    False
    >>> v1 > v2
    False
    >>> v1 >= v2
    False
    >>> v1 <= v2
    True
    z^\s*z\s*$CmpKeyr)r#r$r%Nonec
Cs|j|}|std|t|drt|dndtdd|ddDt|d|d	t|d
|dpC|dt|d
|dt	|dd|_
t|j
j|j
j
|j
j|j
j|j
j|j
j|_dS)aCInitialize a Version object.

        :param version:
            The string representation of a version which will be parsed and normalized
            before use.
        :raises InvalidVersion:
            If the ``version`` does not conform to PEP 440 in any way then this
            exception will be raised.
        zInvalid version: rrcs|]}t|VqdSr*)r.0ir!r!r"	z#Version.__init__..r.pre_lpre_npost_lpost_n1post_n2dev_ldev_nr)rrrrrrN)_regexsearchrrgrouprtuplesplit_parse_letter_version_parse_local_version_version_cmpkeyrrrrrrr))r-r#matchr!r!r"__init__s*
zVersion.__init__cCsd|dS)zA representation of the Version that shows all internal state.

        >>> Version('1.0.0')
        
        z
r!r,r!r!r"__repr__szVersion.__repr__cCsg}|jdkr||jd|ddd|jD|jdur1|ddd|jD|jdur?|d	|j|jdurM|d
|j|jdur[|d|jd|S)z}A string representation of the version that can be round-tripped.

        >>> str(Version("1.0a5"))
        '1.0a5'
        r!rFcsr@r*r$rBxr!r!r"rDrEz"Version.__str__..Ncsr@r*r[r\r!r!r"rDrEz.postz.dev+)rappendjoinrrrrrr-partsr!r!r"__str__s





zVersion.__str__rcC|jjS)zThe epoch of the version.

        >>> Version("2.0.0").epoch
        0
        >>> Version("1!2.0.0").epoch
        1
        )rUrr,r!r!r"rr&z
Version.epochrcCre)adThe components of the "release" segment of the version.

        >>> Version("1.2.3").release
        (1, 2, 3)
        >>> Version("2.0.0").release
        (2, 0, 0)
        >>> Version("1!2.0.0.post0").release
        (2, 0, 0)

        Includes trailing zeroes but not the epoch or any pre-release / development /
        post-release suffixes.
        )rUrr,r!r!r"rszVersion.releasercCre)aThe pre-release segment of the version.

        >>> print(Version("1.2.3").pre)
        None
        >>> Version("1.2.3a1").pre
        ('a', 1)
        >>> Version("1.2.3b1").pre
        ('b', 1)
        >>> Version("1.2.3rc1").pre
        ('rc', 1)
        )rUrr,r!r!r"r&s
zVersion.pre
int | NonecC|jjr
|jjdSdS)zThe post-release number of the version.

        >>> print(Version("1.2.3").post)
        None
        >>> Version("1.2.3.post1").post
        1
        r	N)rUrr,r!r!r"r5	zVersion.postcCrg)zThe development number of the version.

        >>> print(Version("1.2.3").dev)
        None
        >>> Version("1.2.3.dev1").dev
        1
        r	N)rUrr,r!r!r"r@rhzVersion.dev
str | NonecCs$|jjrddd|jjDSdS)zThe local version segment of the version.

        >>> print(Version("1.2.3").local)
        None
        >>> Version("1.2.3+abc").local
        'abc'
        rFcsr@r*r[r\r!r!r"rDUrEz Version.local..N)rUrrar,r!r!r"rKs	z
Version.localcCst|dddS)zThe public portion of the version.

        >>> Version("1.2.3").public
        '1.2.3'
        >>> Version("1.2.3+abc").public
        '1.2.3'
        >>> Version("1!1.2.3dev1+abc").public
        '1!1.2.3.dev1'
        r_r	r)r$rRr,r!r!r"publicYszVersion.publiccCsFg}|jdkr||jd|ddd|jDd|S)a\The "base version" of the version.

        >>> Version("1.2.3").base_version
        '1.2.3'
        >>> Version("1.2.3+abc").base_version
        '1.2.3'
        >>> Version("1!1.2.3dev1+abc").base_version
        '1!1.2.3'

        The "base version" is the public version of the project without any pre or post
        release markers.
        rrZrFcsr@r*r[r\r!r!r"rD{rEz'Version.base_version..r^)rr`rarrbr!r!r"base_versionfs


zVersion.base_versionr0cCs|jdup	|jduS)aTWhether this version is a pre-release.

        >>> Version("1.2.3").is_prerelease
        False
        >>> Version("1.2.3a1").is_prerelease
        True
        >>> Version("1.2.3b1").is_prerelease
        True
        >>> Version("1.2.3rc1").is_prerelease
        True
        >>> Version("1.2.3dev1").is_prerelease
        True
        N)rrr,r!r!r"
is_prereleaseszVersion.is_prereleasecC
|jduS)zWhether this version is a post-release.

        >>> Version("1.2.3").is_postrelease
        False
        >>> Version("1.2.3.post1").is_postrelease
        True
        N)rr,r!r!r"is_postrelease
	zVersion.is_postreleasecCrm)zWhether this version is a development release.

        >>> Version("1.2.3").is_devrelease
        False
        >>> Version("1.2.3.dev1").is_devrelease
        True
        N)rr,r!r!r"
is_devreleaserozVersion.is_devreleasecCst|jdkr|jdSdS)zqThe first item of :attr:`release` or ``0`` if unavailable.

        >>> Version("1.2.3").major
        1
        r	rlenrr,r!r!r"majorsz
Version.majorcCt|jdkr|jdSdS)zThe second item of :attr:`release` or ``0`` if unavailable.

        >>> Version("1.2.3").minor
        2
        >>> Version("1").minor
        0
        r	rrqr,r!r!r"minor	z
Version.minorcCrt)zThe third item of :attr:`release` or ``0`` if unavailable.

        >>> Version("1.2.3").micro
        3
        >>> Version("1").micro
        0
        rurrqr,r!r!r"microrwz
Version.microN)r#r$r%r?)r%r$r=r%r)r%r)r%rf)r%ri)r%r0)rrrr'recompilerVERBOSE
IGNORECASErNr rXrYrdpropertyrrrrrrrjrkrlrnrprsrvryr!r!r!r"rsF


&
!






cs"eZdZedfddZZS)_TrimmedReleaser%rcs6tj}ddt|D}t|dd}|d|dS)z
        Release segment without any trailing zeros.

        >>> _TrimmedRelease('1.0.0').release
        (1,)
        >>> _TrimmedRelease('0.0').release
        (0,)
        css|]	\}}|r|VqdSr*r!)rBindexvalr!r!r"rDsz*_TrimmedRelease.release..r)defaultNr	)superr	enumeratemax)r-relnonzeroslast_nonzero	__class__r!r"rs
z_TrimmedRelease.releaserz)rrrrr
__classcell__r!r!rr"rsrletterrinumber str | bytes | SupportsInt | NonercCsz|r-|durd}|}|dkrd}n|dkrd}n
|dvr!d}n|dvr'd	}|t|fS|r1J|r;d	}|t|fSdS)
Nralphaabetab)crpreviewrc)revrr)lowerr)rrr!r!r"rSs$rSz[\._-]rrcCs$|durtddt|DSdS)zR
    Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve").
    Ncss(|]}|s|nt|VqdSr*)isdigitrr)rBpartr!r!r"rDs

z'_parse_local_version..)rQ_local_version_separatorsrR)rr!r!r"rTs
rTrrrrrrrr>cCsttttddt|}|dur|dur|durt}n	|dur&t}n|}|dur/t}n|}|dur8t}	n|}	|durAt}
n	tdd|D}
|||||	|
fS)NcSs|dkS)Nrr!)r]r!r!r"sz_cmpkey..css*|]}t|tr
|dfnt|fVqdS)r^N)r2rrrAr!r!r"rDBs
z_cmpkey..)rQreversedlist	itertools	dropwhilerr
)rrrrrr_release_pre_post_dev_localr!r!r"rVs(
	rV)r#r$r%r)rrirrr%r)rrir%r)rrrrrrrrrrrrr%r>)(r'
__future__rrr{typingrrrrrr_structuresr
rrr
__all__rr$	LocalTypeCmpPrePostDevTypeCmpLocalTyper>r0VersionComparisonMethodrr
ValueErrorrr(_VERSION_PATTERNrrrrSr|rrTrVr!r!r!r"sN *

	
0'

%