pX7@sddlZddlZddlmZddlmZddlmZddlm Z dZ ej e Z ej dej ZejeZejdZejd Ze se reZejd esejd d d dZesejd djddZy&eddejdDZWnek r`ejdYnXy&eddejdDZWnek rejdYnXGdddZddddZddZ ddZ!dd Z"d!d"Z#d#d$Z$dd%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_defaultsccs7|]-}tdd|jjdDVqdS)css|]}t|VqdS)N)r )r jr r rr9sz.rN)tuplestripsplit)r r r r rr9s,c@seZdZddddddddZddZddZdd Zd d Zd d ZddZ ddZ ddZ ddZ ddZ ddZddZdddZdS)VersionNc CsYt|ttfr1djdd|D}t|trnx'd D]}t||t||qGWdSt}|d =|d =|rtj |} xR| r| j j ngD]2\}}|dk r||dkr|||.majorminormicro releaselevelserialselfvaluezmajor component is required)rrrrr) isinstancerlistjoinrsetattrgetattrlocals VERSION_REmatch groupdictitemsr r ValueError) rrrrrrrnamecompr&r r r__init__@s(  +  zVersion.__init__cCs8t|j}|jdk r4|dj|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__WszVersion.__str__cCstt|S)N)hashrepr)rr r r__hash__dszVersion.__hash__cCsQdj|}x7dD]/}t||}|s2P|dj|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'))rrr)r-r#)rr.r*rr r r__repr__gs zVersion.__repr__cCsLt|}|jdkr3|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__cCsvt|}|jdkr<|jt|8_|j}n|jt|8_|j}|dkrrtd|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|j|dkS)Nr) _Version__cmp)rr4r r r__eq__szVersion.__eq__cCs|j|dkS)Nr)r8)rr4r r r__lt__szVersion.__lt__cCs|j|dkS)Nr)r8)rr4r r r__le__szVersion.__le__cCs|j|dkS)Nr)r8)rr4r r r__gt__szVersion.__gt__cCs|j|dkS)Nr)r8)rr4r r r__ge__szVersion.__ge__cCsot|tst|}|jdks9|jdkrR|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 Nignorerrr)rrrr8)rr4r r r __lshift__s  zVersion.__lshift__cCsot|tst|}|jdks9|jdkrR|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>rrr)rrrr8)rr4r r r __rshift__s  zVersion.__rshift__c Cst|tst|}xdD]}||kr5Pt||pGd}t||p\d}|dkrddd dd dd di}|j|d}|j|d}||krq"||k||kSWdS)NrrrrrrZalphaZbeta candidatefinal)rrrrr)rrr#get)rr4r>r*Zvalue1Zvalue2Zrmapr r rZ__cmps     z Version.__cmp)__name__ __module__ __qualname__r,r/r2r3r5r7r9r:r;r<r=r?r@r8r r r rr?s             rcs)t|trt|}| s:t|ddgkrItt}n|ddkr_d n|d|ddkrd n|dkrttkrfnt}n"tfddtD}|rtdd|D}n%|dkr%td 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 NrrDcc3s1|]'}|ko knr|VqdS)Nr )r v)maxvminvr rrsz)get_requested_versions..css%|]}td|r|VqdS)z/usr/bin/python%d.%dN)r)r rNr r rrsFcss%|]}td|s|VqdS)z/usr/bin/python%d.%dN)r)r rNr r rrs)rr)rMrM)rr parse_vranger set SUPPORTEDr)vrange availableversionsr )rOrPrget_requested_versionss    '" rWcCsO|d krdStj|}|s5td||j}t|jddkrtdd|djd D}||fSd}}|d r|d}n|d}|d}|rtd d|jd Dnd}|rtd d|jd Dnd}|rE|rE||krEtd|||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 -Nzversion range is invalid: %srAcss|]}t|VqdS)N)r )r r r r rr%szparse_vrange..rDrrcss|]}t|VqdS)N)r )r r r r rr/scss|]}t|VqdS)N)r )r r r r rr0s)r rX)NN)RANGE_REr&r)groupsr countrr)rr&rZrPrOr r rrQ s&  &      ..rQcCsFd}}t}x|jdD]}|j}tjd|}|rcd|jd}q#tjd|}|rd|jd}q#tjd|}|r#|jd|jdq#Wt|dkr|j}t |t |fS| r|rt |d}|r*t |nd|r?t |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%.3srDz<<\s*([\d\.]+)z ^[\d\.]+$r) rRrrrer&groupaddlenpopgetversorted)rrPrOZ hardcodeditemr&Zverr r rparse_pycentral_vrange8s*     rdcCs|d|dkodknr(dS|d|dkrZdjdd|dDS|ddkrddjdd|dDS|ddkrdjd d|dDdSd djd d|dDdjd 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)) '-' rrDNrXrcss|]}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!)rTr r r vrange_strcs$"" recCst|tr|St|ttf rVt|dtrVdjdd|DSg}xP|D]H}t|tr|j|qc|jdjdd|DqcW|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)rrrrRr r!append)rr.versionr r rvreprs ) 'rhcCsT|s dSt|tr'|ddStdd|jddDddS)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 NrBcss|]}t|VqdS)N)r )r r r r rrszgetver..r)rrr)rr r rras racCsg}g}xXt|D]J}t|tr:t|}|tkrV|j|q|j|qW|jt||r|rt|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'] ) rbrrrarrfextendreversedrh)rVZ return_strr.Z old_versionsrgr r r debsorteds    rk)&loggingr\osros.pathr configparserrtypesrZ RANGE_PATTERNcompilerYVERBOSEr% getLoggerrJlogrIZ _supportedZ_defaultZ_configreadreplacerrr Exception exceptionrSrrWrQrdrerhrarkr r r rsJ     &   ( , +