B \7@sddlZddlZddlmZddlmZddlmZddlm Z dZ e e Z e dej ZeeZedZed ZereseZed esed d d dZesed dddZyeddedDZWnek redYnXyeddedDZWn ek r:edYnXGdddZd'ddZddZ ddZ!dd Z"d!d"Z#d#d$Z$d(d%d&Z%dS))N)environ)exists) 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|VqdS)N)int).0ir '/usr/share/python3/debpython/version.py 5sr.zcannot read debian_defaultsccs*|]"}tdd|dDVqdS)css|]}t|VqdS)N)r )r jr r rr9sz.rN)tuplestripsplit)r r r r rr9s,c@seZdZdddZddZddZdd Zd d Zd d ZddZ ddZ ddZ ddZ ddZ ddZddZdddZdS) VersionNc Cst|ttfr"ddd|D}t|trPxdD]}t||t||q2WdSt}|d=|d=|rt |} x<| r| ngD]$\}}|dk r||dkr|||<qWx8| D],\}}|dkr|dk rt |}t|||qW|j stddS) Nrcss|]}t|VqdS)N)str)r r r r rrCsz#Version.__init__..)majorminormicro releaselevelserialselfvaluerzmajor component is required) isinstancerlistjoinrsetattrgetattrlocals VERSION_REmatch groupdictitemsr r ValueError) rrrrrrrnamecompr&r r r__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' Nz.{})rrrformat)rresultr r r__str__Ws  zVersion.__str__cCs tt|S)N)hashrepr)rr r r__hash__dszVersion.__hash__cCs>d|}x*dD]"}t||}|s$P|d|7}qW|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('{})rrrz.{}z'))r-r#)rr.r*rr r r__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 )rotherr.r r r__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))rr4r.newr r r__sub__s zVersion.__sub__cCs||dkS)Nr) _Version__cmp)rr4r r r__eq__szVersion.__eq__cCs||dkS)Nr)r8)rr4r r r__lt__szVersion.__lt__cCs||dkS)Nr)r8)rr4r r r__le__szVersion.__le__cCs||dkS)Nr)r8)rr4r r r__gt__szVersion.__gt__cCs||dkS)Nr)r8)rr4r r r__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 Nr)ignorerr)rrrr8)rr4r r r __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 Nr)r>rr)rrrr8)rr4r r r __rshift__s  zVersion.__rshift__cCst|tst|}xxdD]p}||kr&Pt||p2d}t||p@d}|dkrpddddd}||d}||d}||krzq||k||kSWdS)N)rrrrrrr)ZalphaZbeta candidatefinal)rrr#get)rr4r>r*Zvalue1Zvalue2Zrmapr r rZ__cmps    z Version.__cmp)NNNNNN)N)__name__ __module__ __qualname__r,r/r2r3r5r7r9r:r;r<r=r?r@r8r r r rr?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)crKc3s*|]"}|krkrnq|VqdS)Nr )r v)maxvminvr rrsz)get_requested_versions..css|]}td|r|VqdS)z/usr/bin/python%d.%dN)r)r rLr r rrsFcss|]}td|s|VqdS)z/usr/bin/python%d.%dN)r)r rLr r rrs)rr parse_vranger set SUPPORTEDr)vrangeZ availableversionsr )rMrNrget_requested_versionss  rTcCs|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|VqdS)N)r )r r r r rr%szparse_vrange..rJrrcss|]}t|VqdS)N)r )r r r r rr/scss|]}t|VqdS)N)r )r r r r rr0s)RANGE_REr&r)groupsr countrr)rr&rXrNrMr r rrO s&      rOcCsd}}t}x~|dD]p}|}td|}|rFd|d}qtd|}|rfd|d}qtd|}|r|d|dqWt|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%.3srJz<<\s*([\d\.]+)z ^[\d\.]+$r) rPrrrer&groupaddlenpopgetversorted)rrNrMZ hardcodeditemr&Zverr r rparse_pycentral_vrange8s*     rbcCs|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)) '-' rrJNrUrcss|]}t|VqdS)N)r)r r r r rrvszvrange_str..css|]}t|VqdS)N)r)r r r r rrxscss|]}t|VqdS)N)r)r r r r rrzsz%s-%scss|]}t|VqdS)N)r)r r r r rr|scss|]}t|VqdS)N)r)r r r r rr}s)r!)rRr r r vrange_strcs   rccCst|tr|St|ttfs>t|dtr>ddd|DSg}x<|D]4}t|trb||qH|ddd|DqHW|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|VqdS)N)r)r r r r rrszvrepr..css|]}t|VqdS)N)r)r r r r rrs)rrrrPr r!append)rr.versionr r rvreprs    rfcCs@|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|VqdS)N)r )r r r r rrszgetver..r)rrr)rr r rr_s   r_cCslg}g}x@t|D]4}t|tr(t|}|tkr<||q||qW|t||rh|rht|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'] ) r`rrr_rrdextendreversedrf)rSZ return_strr.Z old_versionsrer r r debsorteds  rj)NN)N)&ZloggingrZosros.pathrZ configparserrtypesrZ RANGE_PATTERNcompilerWVERBOSEr%Z getLoggerrGlogrFZ _supportedZ_defaultZ_configreadreplacerrr ExceptionZ exceptionrQrrTrOrbrcrfr_rjr r r rsL           & (,+