a j`7@sddlZddlZddlmZddlmZddlmZddlm Z dZ e e Z e dej ZeeZedZed ZereseZed esed d d dZesed dddZzeddedDZWneyedYn0zeddedDZWney6edYn0GdddZd'ddZddZ ddZ!dd Z"d!d"Z#d#d$Z$d(d%d&Z%dS))N)environexists) ConfigParser) GeneratorTypez(-)?(\d\.\d+)(?:(-)(\d\.\d+)?)?z (?P\d+)\.? (?P\d+)?\.? (?P\d+)?[.\s]? (?Palpha|beta|candidate|final)?[.\s]? (?P\d+)?ZDEBPYTHON3_SUPPORTEDZDEBPYTHON3_DEFAULTz"/usr/share/python3/debian_defaultsDEFAULTzdefault-versionzsupported-versionspythonccs|]}t|VqdSNint.0ir'/usr/share/python3/debpython/version.py 5r.zcannot read debian_defaultsccs*|]"}tdd|dDVqdS)css|]}t|VqdSr r )rjrrrr9rz.rN)tuplestripsplitrrrrr9s,c@seZdZdddZddZddZdd Zd d Zd d ZddZ ddZ ddZ ddZ ddZ ddZddZdddZdS) VersionNc Cst|ttfr"ddd|D}t|trLdD]}t||t||q0dSt}|d=|d=|rt |} | r|| ngD]$\}}|dur||dur|||<q| D],\}}|dkr|durt |}t|||q|j stddS) Nrcss|]}t|VqdSr strrrrrrCrz#Version.__init__..majorminormicro releaselevelserialselfvaluer"zmajor component is required) isinstancerlistjoinrsetattrgetattrlocals VERSION_REmatch groupdictitemsr r ValueError) r$r%rr r!r"r#namecompr-rrr__init__@s(   zVersion.__init__cCs(t|j}|jdur$|d|j7}|S)zReturn major.minor or major string. >>> str(Version(major=3, minor=2, micro=1, releaselevel='final', serial=4)) '3.2' >>> str(Version(major=2)) '2' N.{})rrr format)r$resultrrr__str__Ws  zVersion.__str__cCs tt|Sr )hashrepr)r$rrr__hash__dszVersion.__hash__cCs<d|}dD]$}t||}|s$q4|d|7}q|dS)zReturn full version string. >>> repr(Version(major=3, minor=2, micro=1, releaselevel='final', serial=4)) "Version('3.2.1.final.4')" >>> repr(Version(major=2)) "Version('2')" z Version('{})r!r"r#r4z'))r5r*)r$r6r1r%rrr__repr__gs  zVersion.__repr__cCs<t|}|jdur&|jt|7_n|jt|7_|S)zReturn next version. >>> Version('3.1') + 1 Version('3.2') >>> Version('2') + '1' Version('3') N)rr rr )r$otherr6rrr__add__ws  zVersion.__add__cCsXt|}|jdur,|jt|8_|j}n|jt|8_|j}|dkrTtd|S)zReturn previous version. >>> Version('3.1') - 1 Version('3.0') >>> Version('3') - '1' Version('2') Nrzcannot decrease version further)rr rr r0)r$r<r6newrrr__sub__s zVersion.__sub__cCs||dkSNr _Version__cmpr$r<rrr__eq__szVersion.__eq__cCs||dkSr@rArCrrr__lt__szVersion.__lt__cCs||dkSr@rArCrrr__le__szVersion.__le__cCs||dkSr@rArCrrr__gt__szVersion.__gt__cCs||dkSr@rArCrrr__ge__szVersion.__ge__cCsNt|tst|}|jdus&|jdur8|j|dddkS|j|dddkSdS)akCompare major.minor or major only (if minor is not set). >>> Version('2.6') << Version('2.7') True >>> Version('2.6') << Version('2.6.6') False >>> Version('3') << Version('2') False >>> Version('3.1') << Version('2') False >>> Version('2') << Version('3.2.1.alpha.3') True Nr ignorerr!r&rr rBrCrrr __lshift__s  zVersion.__lshift__cCsNt|tst|}|jdus&|jdur8|j|dddkS|j|dddkSdS)aoCompare major.minor or major only (if minor is not set). >>> Version('2.6') >> Version('2.7') False >>> Version('2.6.7') >> Version('2.6.6') False >>> Version('3') >> Version('2') True >>> Version('3.1') >> Version('2') True >>> Version('2.1') >> Version('3.2.1.alpha.3') False Nr rIrr!rKrCrrr __rshift__s  zVersion.__rshift__cCst|tst|}dD]v}||kr&qt||p2d}t||p@d}|dkrpddddd}||d}||d}||krzq||k||kSdS)Nrrr")ZalphaZbeta candidatefinal)r&rr*get)r$r<rJr1Zvalue1Zvalue2ZrmaprrrZ__cmps   z Version.__cmp)NNNNNN)N)__name__ __module__ __qualname__r3r7r:r;r=r?rDrErFrGrHrLrMrBrrrrr?s   rcst|trt|}|r&t|ddgkr0tt}nj|ddur@dn|d|ddurXdn|dkrttvrxfnt}ntfddtD}|rtdd|D}n|d urtd d|D}|S) aJReturn a set of requested and supported Python versions. :param available: if set to `True`, return installed versions only, if set to `False`, return requested versions that are not installed. By default returns all requested versions. :type available: bool >>> sorted(get_requested_versions([(3, 0), None])) [(3, 2), (3, 3)] >>> sorted(get_requested_versions('')) == sorted(SUPPORTED) True >>> sorted(get_requested_versions([None, None])) == sorted(SUPPORTED) True >>> get_requested_versions([(5, 0), None]) == set() True Nr)rr)crXc3s*|]"}|krkrnq|VqdSr rrvmaxvminvrrrrz)get_requested_versions..css|]}td|r|VqdSz/usr/bin/python%d.%dNrrYrrrrs Fcss|]}td|s|VqdSr^rrYrrrrs )r&r parse_vranger'set SUPPORTEDr)vrangeZ availableversionsrr[rget_requested_versionss  rdcCs|dvr dSt|}|s&td||}t|ddkrdtdd|dd D}||fSd}}|d r~|d}n|d}|d}|rtd d|d Dnd}|rtd d|d Dnd}|r|r||krtd|||fS) aReturn minimum and maximum Python version from given range. >>> parse_vrange('3.0-') ((3, 0), None) >>> parse_vrange('3.1-3.3') ((3, 1), (3, 3)) >>> parse_vrange('3.2-4.0') ((3, 2), (4, 0)) >>> parse_vrange('-3.7') (None, (3, 7)) >>> parse_vrange('3.2') ((3, 2), (3, 2)) >>> parse_vrange('') == parse_vrange('-') == (None, None) True )r -)NNzversion range is invalid: %sNcss|]}t|VqdSr r rrrrr%rzparse_vrange..rWrrcss|]}t|VqdSr r rrrrr/rcss|]}t|VqdSr r rrrrr0r)RANGE_REr-r0groupsr'countrr)r%r-rhr]r\rrrr_ s&      r_cCsd}}t}|dD]p}|}td|}|rDd|d}qtd|}|rdd|d}qtd|}|r|d|dqt|dkr|}t |t |fS|s|rt |d}|rt |nd|rt |ndfS) aParse X-Python3-Version. >>> parse_pycentral_vrange('>= 3.1') ((3, 1), None) >>> parse_pycentral_vrange('<< 4.0') (None, (4, 0)) >>> parse_pycentral_vrange('3.1') ((3, 1), (3, 1)) >>> parse_pycentral_vrange('3.1, 3.2') ((3, 1), None) Nrz>=\s*([\d\.]+)z%.3srWz<<\s*([\d\.]+)z ^[\d\.]+$r) r`rrrer-groupaddlenpopgetversorted)r%r]r\Z hardcodeditemr-Zverrrrparse_pycentral_vrange8s*     rrcCs|d|durdur$nndS|d|dkrLddd|dDS|ddurtdddd|dDS|ddurdd d|dDdSd dd d|dDdd d|dDfSdS) aMReturn version range string from given range. >>> vrange_str(((3, 4), None)) '3.4-' >>> vrange_str(((3, 4), (3, 6))) '3.4-3.6' >>> vrange_str(((3, 4), (4, 0))) '3.4-4.0' >>> vrange_str((None, (3, 7))) '-3.7' >>> vrange_str(((3, 5), (3, 5))) '3.5' >>> vrange_str((None, None)) '-' rrWNrercss|]}t|VqdSr rrrrrrvrzvrange_str..css|]}t|VqdSr rrrrrrxrcss|]}t|VqdSr rrrrrrzrz%s-%scss|]}t|VqdSr rrrrrr|rcss|]}t|VqdSr rrrrrr}r)r()rbrrr vrange_strcs   rscCst|tr|St|ttfs>t|dtr>ddd|DSg}|D]4}t|tr`||qF|ddd|DqF|S)z >>> vrepr(([3, 4], [3, 2])) ['3.4', '3.2'] >>> vrepr(('2.6', '3.1')) ['2.6', '3.1'] >>> vrepr('3.2') '3.2' >>> vrepr((3, 2)) '3.2' rrcss|]}t|VqdSr rrrrrrrzvrepr..css|]}t|VqdSr rrrrrrr)r&rrr`r r(append)r%r6versionrrrvreprs   rvcCs@|sdSt|tr|ddStdd|ddDddS)zReturn pair of integers that represent version. >>> getver('3.2') (3, 2) >>> getver('3.1.4') (3, 1) >>> getver((3, 3, 1)) (3, 3) >>> getver(None) '' r Ncss|]}t|VqdSr r rrrrrrzgetver..r)r&rr)r%rrrros   rocCshg}g}t|D]4}t|tr&t|}|tkr:||q||q|t||rd|rdt|S|S)aReturn sorted list of versions starting with default Python version (if available) then list of suppored versions greater than default one followed by reversed list of older versions. List of versions sorted this way can be used in Depends field. :param vrepr: return string represenatations of versions, by default the same format is used as in :param:`versions` >>> debsorted([(2, 6), (3, 1), (3, 2), (3, 3), (2, 7)])[0] == DEFAULT True >>> debsorted(('2.4', '3.2', '2.6', '2.7'))[-1] (2, 4) >>> debsorted(set([(2, 1), (2, 2)])) [(2, 2), (2, 1)] >>> debsorted([(2, 1), (2, 2)], return_str=True) ['2.2', '2.1'] ) rpr&rrorrtextendreversedrv)rcZ return_strr6Z old_versionsrurrr debsorteds    rz)NN)N)&Zloggingrjosros.pathrZ configparserrtypesrZ RANGE_PATTERNcompilergVERBOSEr,Z getLoggerrTlogrSZ _supportedZ_defaultZ_configreadreplacerrr ExceptionZ exceptionrarrdr_rrrsrvrorzrrrrsR            & (,+