Ye7DddlZddlZddlmZddlmZddlmZddlm Z dZ ej e Z ej dej ZejeZejdZejd ZereskeZed esed d d dZes*ed dddZ ededDZn #e$redYnwxYw ededDZn #e$redYnwxYwGddZddZdZ dZ!dZ"dZ#dZ$d dZ%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-versionspythonc#4K|]}t|VdSNint.0is '/usr/share/python3/debpython/version.py r5s(88qCFF888888.zcannot read debian_defaultsc#K|]B}td|dDVCdS)c34K|]}t|VdSrr)rjs rrz.9s(AAqCFFAAAAAArrN)tuplestripsplitrs rrr9sa66AAAGGIIOOC,@,@AAAAA666666r,cjeZdZ ddZdZdZdZdZdZdZ d Z d Z d Z d Z d ZdZddZdS)VersionNc t|ttfrdd|D}t|tr&dD]!}t ||t ||"dSt}|d=|d=|rYt |} | r&| ngD]\}}| |||||<| D]-\}}|dkr|t|}t |||.|j stddS)Nrc34K|]}t|VdSrstrrs rrz#Version.__init__..Cs(33SVV333333rmajorminormicro releaselevelserialselfvaluer*zmajor component is required) isinstancerlistjoinr!setattrgetattrlocals VERSION_REmatch groupdictitemsrr' ValueError) r,r-r'r(r)r*r+namecompr5s r__init__zVersion.__init__@si eeT] + + 4HH33U33333E eW % % M : :dGE4$8$89999 Fxx L M  '$$U++E>> 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,results r__str__zVersion.__str__Ws6TZ : ! ell4:.. .F rc:tt|Sr)hashrepr)r,s r__hash__zVersion.__hash__dsDJJrcd|}dD].}t||}|sn|d|z }/|dzS)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+r=z'))r>r2)r,r?r9r-s r__repr__zVersion.__repr__gsd%%d++7 * *DD$''E  ell5)) )FF}rct|}|j|xjt|z c_n|xjt|z c_|S)zReturn next version. >>> Version('3.1') + 1 Version('3.2') >>> Version('2') + '1' Version('3') )r!r(r'r)r,otherr?s r__add__zVersion.__add__wsJ :  LLCJJ &LLL LLCJJ &LL rct|}|j%|xjt|zc_|j}n$|xjt|zc_|j}|dkrt d|S)zReturn previous version. >>> Version('3.1') - 1 Version('3.0') >>> Version('3') - '1' Version('2') Nrzcannot decrease version further)r!r(r'rr8)r,rHr?news r__sub__zVersion.__sub__sp :  LLCJJ &LL,CC LLCJJ &LL,C 77>?? ? rc4||dkSNr _Version__cmpr,rHs r__eq__zVersion.__eq__zz%  A%%rc4||dkSrNrOrQs r__lt__zVersion.__lt__zz%  1$$rc4||dkSrNrOrQs r__le__zVersion.__le__rSrc4||dkSrNrOrQs r__gt__zVersion.__gt__rVrc4||dkSrNrOrQs r__ge__zVersion.__ge__rSrct|tst|}|j|j||ddkS||ddkS)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.r!r(rPrQs r __lshift__zVersion.__lshift__f%)) #ENNE : !4::eG:44q8 8::eG:44q8 8rct|tst|}|j|j||ddkS||ddkS)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)r`rQs r __rshift__zVersion.__rshift__rbrcLt|tst|}dD]|}||krnst||pd}t||pd}|dkr3ddddd}||d}||d}||krn||k||kz cSdS)Nr&rr*)alphabeta candidatefinal)r.r!r2get)r,rHr_r9value1value2rmaps r__cmpz Version.__cmps%)) #ENNEI 9 9Dv~~T4((-AFUD)).QF~%%!#Rb1MM&!,,&!,,VO8 8 8 8qr)NNNNNNr)__name__ __module__ __qualname__r;r@rDrFrIrLrRrUrXrZr\rardrPrrr!r!?sAE+/<<<<.         &&&&%%%&&&%%%&&&999*999*rr!ct|trt|}|rt|ddgkrt t }ns|ddn|d|ddn|dkr(t t vrfn t }n!t fdt D}|rt d|D}n|durt 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)crxc3<K|]}|cxkrknn|VdSrru)rvmaxvminvs rrz)get_requested_versions..sDDD413C3C3C3Ct3C3C3C3C3C13C3C3C3CDDrc3>K|]}td|z|VdSz/usr/bin/python%d.%dNrrrzs rrz)get_requested_versions..sH>>Q !7!!;<<>q>>>>>>rFc3>K|]}td|z|VdSr~rrs rrz)get_requested_versions..sQBBQ$%;a%?@@BqBBBBBBr)r.r% parse_vranger/set SUPPORTEDr)vrange availableversionsr{r|s @@rget_requested_versionsrsD"&#&f%% ET&\\dD\11y>>*vvq !!9,xx&) 4<<di&7&7D77UWWEEHHDDDDDiDDDDDHB>>(>>>>> e  BB(BBBBB Orc|dvrdSt|}|std|z|}t |ddkr6t d|ddD}||fSdx}}|d r |d}n|d}|d}|r,t d |dDnd}|r,t d |dDnd}|r|r||krtd|z||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: %sNc34K|]}t|VdSrrrs rrzparse_vrange..%s(::SVV::::::rrwrrc34K|]}t|VdSrrrs rrzparse_vrange../(11AQ111111rc34K|]}t|VdSrrrs rrzparse_vrange..0rr)RANGE_REr5r8groupsr/countrr)r-r5rr|r{s rrr sn  z NN5 ! !E A7%?@@@ \\^^F F||$1$$::VAY__S%9%9:::::TzD4 ayayayay59 C511C111 1 1 1tD59 C511C111 1 1 1tD AA7%?@@@ :rcdx}}t}|dD]}|}tjd|}|rd|dz}Ftjd|}|rd|dz}vtjd|}|r+|d|dzt|dkr2|}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) rrrrer5groupaddlenpopgetversorted)r-r|r{ hardcodeditemr5vers rparse_pycentral_vranger8s[D4I C  3 3zz||*D11  EKKNN*D *D11  EKKNN*D t,,  3 MM&5;;q>>1 2 2 2 9~~mmooc{{F3KK'' $I$i  # )6$<<>> 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)) '-' rrwNrrc34K|]}t|VdSrr$rs rrzvrange_str..v(221A222222rc34K|]}t|VdSrr$rs rrzvrange_str..xs(88c!ff888888rc34K|]}t|VdSrr$rs rrzvrange_str..zrrc34K|]}t|VdSrr$rs rrzvrange_str..|("="=a3q66"="="="="="=rc34K|]}t|VdSrr$rs rrzvrange_str..}rr)r0)rs r vrange_strrcs% ayF1I%%%%%%%%s ayF1Ixx22q 222222  SXX88fQi8888888  xx22q 22222S88(("="=6!9"="="=====(("="=6!9"="="====? ?rct|tr|St|ttfs:t|dtrdd|DSg}|D]_}t|tr||-|dd|D`|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' rrc34K|]}t|VdSrr$rs rrzvrepr..s(..1A......rc34K|]}t|VdSrr$rs rrzvrepr..s(";";a3q66";";";";";";r)r.r%rrrr0append)r-r?versions rvreprrs%/  s3 4 4/E!Hc9R9R/xx........ F== gs # # = MM' " " " " MM#((";";7";";";;; < < < < Mrc|sdSt|tr |ddStd|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 Nc34K|]}t|VdSrrrs rrzgetver..s(55AQ555555rr)r.rr)r-s rrrse r%RaRy 55S!!4!4555 5 5bqb 99rcPg}g}t|D]\}t|trt|}|tkr||G||]|t||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'] ) rr.r%rr rextendreversedr)r return_strr? old_versionsrs r debsortedrs&FL(#### gs # # &WooG W      ( ( ( ( MM' " " " " MM(<(()))fV}} Mrrr)&loggingrosros.pathr configparserrtypesr RANGE_PATTERNcompilerVERBOSEr4 getLoggerrrlogrm _supported_default_configreadreplacerrr Exception exceptionrr!rrrrrrrrurrrs, %%%%%%2 2:m $ $ RZ  %% g!!W[/ 0 0 7;+ , ,##lnnG LL5666 A;;y*;<