R" fl?LdZddlZddlZddlmZmZmZmZmZm Z m Z ddl m Z m Z mZmZgdZe e eefdfZe e ee eeffZe ee e e eefe ee eefffdffZe ee edfeeeefZeeegefZGdd eZd ed d fd ZGddeZGddZdZeZ Gdd eZ deede ee!edfd ee eeffdZ"ejFdZ$deed eefdZ%dede edfdee eefdee eefdee eefdeed efdZ&y) zB .. testsetup:: from packaging.version import parse, Version N)AnyCallable NamedTupleOptional SupportsIntTupleUnion)Infinity InfinityTypeNegativeInfinityNegativeInfinityType)VERSION_PATTERNparseVersionInvalidVersion.ceZdZUeed<eedfed<eeeefed<eeeefed<eeeefed<eeed<y) _Versionepoch.releasedevprepostlocalN) __name__ __module__ __qualname__int__annotations__rrstr LocalType3/usr/lib/python3/dist-packages/packaging/version.pyrr$sY J 38_ %S/ "" %S/ "" 5c? ## I r#rversionreturnrct|S)zParse the given version string. >>> parse('1.0.dev1') :param version: The version string to parse. :raises InvalidVersion: When the version string is not a valid version. )r)r%s r$rr-s 7 r#ceZdZdZy)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$rr9sr#rceZdZUeedfed<defdZdddefdZ dddefdZ de defdZ dddefd Z dddefd Zde defd Zy ) _BaseVersion._keyr&c,t|jSN)hashr,selfs r$__hash__z_BaseVersion.__hash__FsDIIr#otherc`t|tstS|j|jkSr. isinstancer+NotImplementedr,r1r3s r$__lt__z_BaseVersion.__lt__L%%.! !yy5::%%r#c`t|tstS|j|jkSr.r5r8s r$__le__z_BaseVersion.__le__R%%.! !yyEJJ&&r#c`t|tstS|j|jk(Sr.r5r8s r$__eq__z_BaseVersion.__eq__Xr=r#c`t|tstS|j|jk\Sr.r5r8s r$__ge__z_BaseVersion.__ge__^r=r#c`t|tstS|j|jkDSr.r5r8s r$__gt__z_BaseVersion.__gt__dr:r#c`t|tstS|j|jk7Sr.r5r8s r$__ne__z_BaseVersion.__ne__jr=r#N)rrrrrrrr2boolr9r<objectr?rArCrEr"r#r$r+r+Cs S/# &N&t& 'N't' 'F't' 'N't' &N&t& 'F't'r#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
ceZdZUdZej
dezdzejejzZ	e
ed<deddfdZ
defd	Zdefd
ZedefdZedeedffd
ZedeeeeffdZedeefdZedeefdZedeefdZedefdZedefdZedefdZedefdZedefdZedefdZ edefdZ!edefdZ"y)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*$r,r%r&Nc|jj|}|std|dt|j	drt|j	dndt
d|j	djdDt|j	d|j	d	t|j	d
|j	dxs|j	dt|j	d
|j	dt|j	d|_
t|jj|jj|jj|jj|jj |jj"|_y)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: ''rrc32K|]}t|ywr.)r.0is  r$	z#Version.__init__..sLQ#a&Lr.pre_lpre_npost_lpost_n1post_n2dev_ldev_nr)rrrrrrN)_regexsearchrrgrouprtuplesplit_parse_letter_version_parse_local_version_version_cmpkeyrrrrrrr,)r1r%matchs   r$__init__zVersion.__init__sR""7+ #5gYa!@AA!/4{{7/C#ekk'*+L%++i*@*F*Fs*KLL%ekk'&:EKK>> Version('1.0.0')
        
        z
r"r0s r$__repr__zVersion.__repr__sD6%%r#cZg}|jdk7r|j|jd|jdjd|jD|j1|jdjd|jD|j
|jd|j
|j|jd|j|j|jd	|jdj|S)
zA string representation of the version that can be rounded-tripped.

        >>> str(Version("1.0a5"))
        '1.0a5'
        r!rQc32K|]}t|ywr.r rMxs  r$rOz"Version.__str__..;c!f;rPc32K|]}t|ywr.rirjs  r$rOz"Version.__str__..s :AQ :rPz.postz.dev+)rappendjoinrrrrrr1partss  r$__str__zVersion.__str__s::?LLDJJ>> Version("2.0.0").epoch
        0
        >>> Version("1!2.0.0").epoch
        1
        )r`rr0s r$rz
Version.epoch	s}}"""r#.c.|jjS)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.
        )r`rr0s r$rzVersion.releases}}$$$r#c.|jjS)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)
        )r`rr0s r$rzVersion.pre$s}}   r#cd|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)r`rr0s r$rzVersion.post3s*)-

(:(:t}}!!!$DDr#cd|jjr|jjdSdS)zThe development number of the version.

        >>> print(Version("1.2.3").dev)
        None
        >>> Version("1.2.3.dev1").dev
        1
        r
N)r`rr0s r$rzVersion.dev>s*(,}}'8'8t}}  #BdBr#c|jjr,djd|jjDSy)zThe local version segment of the version.

        >>> print(Version("1.2.3").local)
        None
        >>> Version("1.2.3+abc").local
        'abc'
        rQc32K|]}t|ywr.rirjs  r$rOz Version.local..Ss@qCF@rPN)r`rrqr0s r$rz
Version.localIs3==88@DMM,?,?@@@r#c>t|jdddS)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.2.3+abc.dev1").public
        '1.2.3'
        ror
r)r r]r0s r$publiczVersion.publicWs4ysA&q))r#cg}|jdk7r|j|jd|jdjd|jDdj|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.3+abc.dev1").base_version
        '1!1.2.3'

        The "base version" is the public version of the project without any pre or post
        release markers.
        rrgrQc32K|]}t|ywr.rirjs  r$rOz'Version.base_version..yrlrPrm)rrprqrrrs  r$base_versionzVersion.base_versionds\::?LLDJJ|jduxs|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)rrr0s r$
is_prereleasezVersion.is_prerelease}s!xxt#;txxt';;r#c|jduS)zWhether this version is a post-release.

        >>> Version("1.2.3").is_postrelease
        False
        >>> Version("1.2.3.post1").is_postrelease
        True
        N)rr0s r$is_postreleasezVersion.is_postreleasesyy$$r#c|jduS)zWhether this version is a development release.

        >>> Version("1.2.3").is_devrelease
        False
        >>> Version("1.2.3.dev1").is_devrelease
        True
        N)rr0s r$
is_devreleasezVersion.is_devreleasesxxt##r#cTt|jdk\r|jdSdS)zqThe first item of :attr:`release` or ``0`` if unavailable.

        >>> Version("1.2.3").major
        1
        r
rlenrr0s r$majorz
Version.majors'#&dll"3q"8t||A?a?r#cTt|jdk\r|jdSdS)zThe second item of :attr:`release` or ``0`` if unavailable.

        >>> Version("1.2.3").minor
        2
        >>> Version("1").minor
        0
        r
rrr0s r$minorz
Version.minor'#&dll"3q"8t||A?a?r#cTt|jdk\r|jdSdS)zThe third item of :attr:`release` or ``0`` if unavailable.

        >>> Version("1.2.3").micro
        3
        >>> Version("1").micro
        0
        rrrr0s r$microz
Version.microrr#)#rrrr)recompilerVERBOSE
IGNORECASErYCmpKeyrr rcrertpropertyrrrrrrrrrr}rrFrrrrrrr"r#r$rrs.RZZ/1G;RZZ"--=W
XF
L$
$
$
L&#&B#s##
%sCx
%
%!XeCHo.!!EhsmEECXc]CCx}
*
*
*c0|d}|j}|dk(rd}n|dk(rd}n
|dvrd}n|dvrd	}|t|fS|s|rd	}|t|fSy)
Nralphaabetab)crpreviewrc)revrr)lowerr)rrs  r$r^r^s>F
WF
v
F
.
.F
|
#Fs6{""fs6{""r#z[\._-]rcR|%tdtj|DSy)zR
    Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve").
    Nc3rK|]/}|js|jn
t|1ywr.)isdigitrr)rMparts  r$rOz'_parse_local_version..s/
!%DJJLCI=
s57)r\_local_version_separatorsr])rs r$r_r_s4

177>

	
r#rrrrrcttttjdt|}||	|t
}n|t}n|}|t
}n|}|t}	n|}	|t
}
ntd|D}
|||||	|
fS)Nc|dk(S)Nrr")rks r$z_cmpkey..s
AFr#c3TK|] }t|tr|dfnt|f"yw)rmN)r6rr
rLs  r$rOz_cmpkey../s-
IJz!S)QG0@!/DD
s&()r\reversedlist	itertools	dropwhiler
r)rrrrrr_release_pre_post_dev_locals           r$rarasi))*:HWrs"	QQQWW
C%S/3&'	,(#	b@lb@J	!SM!#(e[$)F#G!
eCHo!H'BJJy1	
	(92E	<6<6
38_<6
%S/	"<65c?
#	<6

%S/	"<6I
<6<6r#