U zk^7@sddlZddlZddlmZddlmZddlmZddlm Z dZ e e Z e dej ZeeZedZed ZereseZed esed d d dZesed dddZzeddedDZWnek redYnXzeddedDZWn ek r:edYnXGdddZd'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 5sr.zcannot read debian_defaultsccs*|]"}tdd|dDVqdS)css|]}t|VqdSr r )rjrrrr9sz.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]$\}}|dk r||dkr|||<q| D],\}}|dkr|dk rt |}t|||q|j stddS) Nrcss|]}t|VqdSr strrrrrrCsz#Version.__init__..majorminormicro releaselevelserialselfvaluer!zmajor component is required) isinstancerlistjoinrsetattrgetattrlocals VERSION_REmatch groupdictitemsr r ValueError) r#r$rrr r!r"namecompr,rrr__init__@s(   zVersion.__init__cCs(t|j}|jdk r$|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.{})rrrformat)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"r3z'))r4r))r#r5r0r$rrr__repr__gs  zVersion.__repr__cCs<t|}|jdkr&|jt|7_n|jt|7_|S)zReturn next version. >>> Version('3.1') + 1 Version('3.2') >>> Version('2') + '1' Version('3') N)rrrr )r#otherr5rrr__add__ws  zVersion.__add__cCsXt|}|jdkr,|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)rrrr r/)r#r;r5newrrr__sub__s zVersion.__sub__cCs||dkSNr _Version__cmpr#r;rrr__eq__szVersion.__eq__cCs||dkSr?r@rBrrr__lt__szVersion.__lt__cCs||dkSr?r@rBrrr__le__szVersion.__le__cCs||dkSr?r@rBrrr__gt__szVersion.__gt__cCs||dkSr?r@rBrrr__ge__szVersion.__ge__cCsNt|tst|}|jdks&|jdkr8|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 Nrignorerr r%rrrArBrrr __lshift__s  zVersion.__lshift__cCsNt|tst|}|jdks&|jdkr8|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 NrrHrr rJrBrrr __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;rIr0Zvalue1Zvalue2ZrmaprrrZ__cmps   z Version.__cmp)NNNNNN)N)__name__ __module__ __qualname__r2r6r9r:r<r>rCrDrErFrGrKrLrArrrrr?s"  rcst|trt|}|r&t|ddgkr0tt}nj|ddkr@dn|d|ddkrXdn|dkrttkrxfnt}ntfddtD}|rtdd|D}n|d krtd 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)crWc3s*|]"}|krkrnq|VqdSr rrvmaxvminvrrrs  z)get_requested_versions..css|]}td|r|VqdSz/usr/bin/python%d.%dNrrXrrrrs Fcss|]}td|s|VqdSr]rrXrrrrs )r%r parse_vranger&set SUPPORTEDr)vrangeZ availableversionsrrZrget_requested_versionss  rccCs|dkr 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%szparse_vrange..rVrrcss|]}t|VqdSr r rrrrr/scss|]}t|VqdSr r rrrrr0s)RANGE_REr,r/groupsr&countrr)r$r,rgr\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%.3srVz<<\s*([\d\.]+)z ^[\d\.]+$r) r_rrrer,groupaddlenpopgetversorted)r$r\r[Z hardcodeditemr,Zverrrrparse_pycentral_vrange8s*     rqcCs|d|dkrdkr$nndS|d|dkrLddd|dDS|ddkrtdddd|dDS|ddkrdd 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)) '-' rrVNrdrcss|]}t|VqdSr rrrrrrvszvrange_str..css|]}t|VqdSr rrrrrrxscss|]}t|VqdSr rrrrrrzsz%s-%scss|]}t|VqdSr rrrrrr|scss|]}t|VqdSr rrrrrr}s)r')rarrr vrange_strcs   rrcCst|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 rrrrrrszvrepr..css|]}t|VqdSr rrrrrrs)r%rrr_r r'append)r$r5versionrrrvreprs   rucCs@|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 rrrrrszgetver..r)r%rr)r$rrrrns   rncCshg}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'] ) ror%rrnrrsextendreversedru)rbZ return_strr5Z old_versionsrtrrr debsorteds    ry)NN)N)&Zloggingriosros.pathrZ configparserrtypesrZ RANGE_PATTERNcompilerfVERBOSEr+Z getLoggerrSlogrRZ _supportedZ_defaultZ_configreadreplacerrr ExceptionZ exceptionr`rrcr^rqrrrurnryrrrrsT           & (,+