o b7@sddlZddlZddlmZddlmZddlmZddlm Z dZ e e Z e dej ZeeZedZed ZerAesaeZed esUed d d dZesaed dddZzeddedDZWney}edYnwzeddedDZWneyedYnwGdddZd'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+)?DEBPYTHON3_SUPPORTEDDEBPYTHON3_DEFAULTz"/usr/share/python3/debian_defaultsDEFAULTzdefault-versionzsupported-versionspythoncc|]}t|VqdSNint.0ir'/usr/share/python3/debpython/version.py 5r.zcannot read debian_defaultsccs,|]}tdd|dDVqdS)csr rr)rjrrrr9rz.rN)tuplestripsplitrrrrr9s$,c@seZdZ  dddZddZddZdd Zd d Zd d ZddZ ddZ ddZ ddZ ddZ ddZddZdddZdS) VersionNc Cst|ttfrddd|D}t|tr&dD] }t||t||qdSt}|d=|d=|rSt |} | r>| ngD]\}}|durR||durR|||<q@| D]\}}|dkrg|durgt |}t|||qW|j sutddS) Nrcsr rstrrrrrrCrz#Version.__init__..majorminormicro releaselevelserialselfvaluer%zmajor component is required) isinstancerlistjoinrsetattrgetattrlocals VERSION_REmatch groupdictitemsrr" ValueError) r'r(r"r#r$r%r&namecompr0rrr__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.{})r r"r#format)r'resultrrr__str__Ws  zVersion.__str__cCs tt|Sr)hashrepr)r'rrr__hash__ds zVersion.__hash__cCsBd|}dD]}t||}|s|dS|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&r7z'))r8r-)r'r9r4r(rrr__repr__gs  zVersion.__repr__cCs>t|}|jdur|jt|7_|S|jt|7_|S)zReturn next version. >>> Version('3.1') + 1 Version('3.2') >>> Version('2') + '1' Version('3') N)rr#r"r)r'otherr9rrr__add__ws  zVersion.__add__cCsXt|}|jdur|jt|8_|j}n |jt|8_|j}|dkr*td|S)zReturn previous version. >>> Version('3.1') - 1 Version('3.0') >>> Version('3') - '1' Version('2') Nrzcannot decrease version further)rr#r"rr3)r'r?r9newrrr__sub__s zVersion.__sub__cCs||dkSNr _Version__cmpr'r?rrr__eq__zVersion.__eq__cCs||dkSrCrDrFrrr__lt__rHzVersion.__lt__cCs||dkSrCrDrFrrr__le__rHzVersion.__le__cCs||dkSrCrDrFrrr__gt__rHzVersion.__gt__cCs||dkSrCrDrFrrr__ge__rHzVersion.__ge__cCsJt|ts t|}|jdus|jdur|j|dddkS|j|dddkS)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#rErFrrr __lshift__ zVersion.__lshift__cCsJt|ts t|}|jdus|jdur|j|dddkS|j|dddkS)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#rMrr$rOrFrrr __rshift__rQzVersion.__rshift__cCst|ts t|}dD]<}||krdSt||pd}t||p!d}|dkr9ddddd}||d}||d}||kr>q ||k||kSdS)Nr!rr%)alphabeta candidatefinal)r)rr-get)r'r?rNr4value1value2rmaprrr__cmps    z Version.__cmp)NNNNNNr)__name__ __module__ __qualname__r6r:r=r>r@rBrGrIrJrKrLrPrRrErrrrr?s"  rcst|tr t|}|rt|ddgkrtt}n5|ddur dn|d|ddur,dn|dkrAttvr<fnt}n tfddtD}|rZtdd|D}|S|d urgtd 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)crcc3s,|]}|krkrnn|VqdSrrrvmaxvminvrrrs*z)get_requested_versions..css |] }td|r|VqdSz/usr/bin/python%d.%dNrrdrrrr Fcss |] }td|s|VqdSrirrdrrrrrj)r)r parse_vranger*set SUPPORTEDr)vrange availableversionsrrfrget_requested_versionss  rqcCs|dvrdSt|}|std||}t|ddkr2tdd|dd D}||fSd}}|d r?|d}n|d}|d}|rUtd d|d Dnd}|retd d|d Dnd}|ru|ru||krutd|||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: %sNcsr rrrrrrr%rzparse_vrange..rbrrcsr rrrrrrr/rcsr rrrrrrr0r)RANGE_REr0r3groupsr*countrr)r(r0rvrhrgrrrrk s&      rkcCsd}}t}|dD]8}|}td|}|r"d|d}q td|}|r2d|d}q td|}|rD|d|dq t|dkrW|}t |t |fS|sa|rat |d}|rgt |nd|rot |fSdfS) 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%.3srbz<<\s*([\d\.]+)z ^[\d\.]+$r) rlrrrer0groupaddlenpopgetversorted)r(rhrg hardcodeditemr0verrrrparse_pycentral_vrange8s,     "rcCs|d|durdurdS|d|dkr$ddd|dDS|ddur8dddd|dDS|ddurLdd d|dDdSd dd d|dDdd d|dDfS) 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)) '-' rrbNrrrcsr rrrrrrrvrzvrange_str..csr rrrrrrrxrcsr rrrrrrrzrz%s-%scsr rrrrrrr|rcsr rrrrrrr}r)r+)rnrrr vrange_strcs  rcCst|tr|St|ttfst|dtrddd|DSg}|D]}t|tr0||q#|ddd|Dq#|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' rrcsr rrrrrrrrzvrepr..csr rrrrrrrr)r)r rrlrr+append)r(r9versionrrrvreprs   rcCs@|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 Ncsr rrrrrrrrzgetver..r)r)rr)r(rrrr}s    "r}cCshg}g}t|D]}t|trt|}|tkr||q||q|t||r2|r2t|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~r)r r}r rextendreversedr)rp return_strr9 old_versionsrrrr debsorteds    rrsr)&loggingrxosros.pathr configparserrtypesr RANGE_PATTERNcompileruVERBOSEr/ getLoggerr_logrZ _supported_default_configreadreplacerrr Exception exceptionrmrrqrkrrrr}rrrrrsX             &(,+