+ ?j7^RIt^RIt^RIHt^RIHt^RIHt^RIH t Rt ]P!] 4t ]P!R]P4t]P!]4t]P$!R4t]P$!R 4t]'d ]'gd]!4t]P-R 4]'g]P%R R 4R ,t]'g#]P%R R4P/RR4t];QJd#.R]P3R44FNK 5M!R]P3R444t];QJd#.R]P3R44FNK 5M!R]P3R444t!RR4tRRltRt Rt!Rt"Rt#Rt$R Rlt%R# ]d]P9R4Li;i ]d]P9R4L]i;i)!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-version:NNzsupported-versionspythonc#8"TFp\V4xK R#5iNint.0is& '/usr/share/python3/debpython/version.py r5s8$7qCFF$7.zcannot read debian_defaultsc#"TFkp\;QJd1.RVP4PR44FNK 5M*!RVP4PR444xKm R#5i)c38"TFp\V4xK R#5irr)rjs& rr.9sA,@qCFF,@rrN)tuplestripsplitrs& rrr9sQ64!eAAGGIOOC,@AeeAAGGIOOC,@AAA4s A5A#A5,c|a]tRt^?toRRltRtRtRtRtRt Rt R t R t R t R tR tRtRRltRtVtR#)VersionNc r\V\\34'dRPRV44p\V\4'd!RFp\ W\ W44K R#\4pVRVRV'd]\PV4p V 'dV P4P4M.FwrqVfK W,eKWV&K VP4F'wrqVR8wdVe \V4p\ WV4K) VP'g \R4hR#)rc38"TFp\V4xK R#5irstrrs& rr#Version.__init__..Cs3USVVUr releaselevelNselfvaluezmajor component is requiredmajorminormicror(serial) isinstancerlistjoinr"setattrgetattrlocals VERSION_REmatch groupdictitemsrr, ValueError) r)r*r,r-r.r(r/namecompr7s &&&&&&& r__init__Version.__init__@s eeT] + +HH3U33E eW % %MGE$89N x L M $$U+E>> str(Version(major=3, minor=2, micro=1, releaselevel='final', serial=4)) '3.2' >>> str(Version(major=2)) '2' .{})r&r,r-format)r)results& r__str__Version.__str__Ws7TZZ :: ! ell4::. .F r?c*\\V44#r)hashrepr)r)s&r__hash__Version.__hash__dsDJr?c RPV4pRF8p\W4pV'g VR,#VRPV4, pK: VR,#)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('{}rAz'))r.r(r/)rBr4)r)rCr;r*s& r__repr__Version.__repr__gsY%%d+7DD'E} ell5) )F 8 }r?c \V4pVPf%V;P\V4, unV#V;P\V4, unV#)z`Return next version. >>> Version('3.1') + 1 Version('3.2') >>> Version('2') + '1' Version('3') )r"r-r,r)r)otherrCs&& r__add__Version.__add__wsI ::  LLCJ &L  LLCJ &L r?c \V4pVPf0V;P\V4,unVPpM.V;P\V4,unVPpV^8d \ R4hV#)zdReturn previous version. >>> Version('3.1') - 1 Version('3.0') >>> Version('3') - '1' Version('2') zcannot decrease version further)r"r-r,rr:)r)rOrCnews&& r__sub__Version.__sub__se ::  LLCJ &L,,C LLCJ &L,,C 7>? ? r?c*VPV4^8H#r _Version__cmpr)rOs&&r__eq__Version.__eq__zz% A%%r?c*VPV4^8#rWrXrZs&&r__lt__Version.__lt__zz% 1$$r?c*VPV4^8*#rWrXrZs&&r__le__Version.__le__r]r?c*VPV4^8#rWrXrZs&&r__gt__Version.__gt__rar?c*VPV4^8#rWrXrZs&&r__ge__Version.__ge__r]r?c \V\4'g \V4pVPeVPfVPVRR7^8#VPVRR7^8#)aCompare 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 r-ignorer.r0r"r-rYrZs&&r __lshift__Version.__lshift__]%))ENE :: !4::eG:4q8 8::eG:4q8 8r?c \V\4'g \V4pVPeVPfVPVRR7^8#VPVRR7^8#)aCompare 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 r-rlr.rnrZs&&r __rshift__Version.__rshift__rqr?c T\V\4'g \V4pRFpW28Xd^#\W4;'g^p\W4;'g^pVR8Xd/RRRRRR R^/pVPV^4pVPV^4pWE8XdKsWE8WE8, u# ^#) r,r(alphabeta candidatefinalr+)r0r"r4get)r)rOrmr;value1value2rmaps&&& r__cmp Version.__cmps%))ENEID~T(--AFU)..QF~%VRb'1M&!,&!,O8 8Jr?)NNNNNNr)__name__ __module__ __qualname____firstlineno__r=rDrIrLrPrTr[r_rcrfrirorsrY__static_attributes____classdictcell__) __classdict__s@rr"r"?sP<.   &&%&%&9*9*r?r"caa\V\4'd \V4pV'd\V4RR.8Xd\ \ 4pMoV^,fRMV^,oV^,fRMV^,oSS8Xd#\ S\ 9dS3M \ 44pM\ VV3Rl\ 44pV'd\ RV44pV#VRJd\ RV44pV#)aReturn 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 Nc3R<"TFpSTu;8:d S8gKMKVxK R#5irr)rvmaxvminvs& rr)get_requested_versions..s"Di413Ct3C13C1is '' 'c3Z"TF!p\RV,4'gKVxK# R#5iz/usr/bin/python%d.%dNrrrs& rrrs%>(Q !7!!;<q(+ +Fc3Z"TF!p\RV,4'dKVxK# R#5irrrs& rrrs&B(Q$%;a%?@q(r)rr)cr)r0r& parse_vranger1set SUPPORTEDr)vrange availableversionsrrs&& @@rget_requested_versionsrs"&#f% T&\dD\1y>*vq !!9,x&) 4<di&7D7UWEHDiDDH>(>> O e B(BB Or?cVR9dR#\PV4pV'g\RV,4hVP4p\ V4P R4^8Xd\\ ;QJd*.RV^,PR44FNK 5M#!RV^,PR444pW33#R;r4V^,'d V^,pMV^,pV^,pV'dK\ ;QJd#.RVPR44FNK 5M!RVPR444MRpV'dK\ ;QJd#.RVPR44FNK 5M!RVPR444MRpV'd!V'dW48d\RV,4hW43#) aOReturn 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 Nzversion range is invalid: %sc38"TFp\V4xK R#5irrrs& rrparse_vrange..%s:%9SVV%9rrc38"TFp\V4xK R#5irrrs& rrr/1AQrc38"TFp\V4xK R#5irrrs& rrr0rr)r -NN)RANGE_REr7r:groupsr1countrr)r*r7rrrs& rrr sH   NN5 !E 7%?@@ \\^F F|$1$u:VAY__S%9:uu:VAY__S%9::zD ayyayayay59551C1551C1 1tD59551C1551C1 1tD 7%?@@ :r?cR;r\4pVPR4FpVP4p\P!RV4pV'dRVP ^4,pKL\P!RV4pV'dRVP ^4,pK\P!RV4pV'gKVP RVP ^4,4K \V4^8Xd'VP4p\V4\V43#V'gV'd\V4^,pV'd \V4MRV'd \V43#R3#)zParse 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) Nr z>=\s*([\d\.]+)z%.3sz<<\s*([\d\.]+)z ^[\d\.]+$) rrrrer7groupaddlenpopgetversorted)r*rr hardcodeditemr7vers& rparse_pycentral_vranger8sDI C zz|*D1 EKKN*D *D1 EKKN*D t, 5 MM&5;;q>1 2! 9~mmoc{F3K'' Ii #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)) '-' rrc38"TFp\V4xK R#5irr%rs& rrvrange_str..v2 1A rc38"TFp\V4xK R#5irr%rs& rrrxs8ic!ffirc38"TFp\V4xK R#5irr%rs& rrrzrrc38"TFp\V4xK R#5irr%rs& rrr|"=9a3q669rc38"TFp\V4xK R#5irr%rs& rrr}rr)r2)rs&r vrange_strrcs ayF1I%%& ayF1Ixx2q 222  SXX8fQi8888  xx2q 22S88(("=6!9"==(("=6!9"==? ?r?c\V\4'dV#\V\\34'g6\V^,\4'dRP RV44#.pVFSp\V\4'dVP V4K,VP RP RV444KU V#)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' rc38"TFp\V4xK R#5irr%rs& rrvrepr..s.1Arc38"TFp\V4xK R#5irr%rs& rrrs";7a3q667r)r0r&rrrr2append)r*rCversions& rvreprrs%  s3 4 4E!Hc9R9Rxx.... F gs # # MM' " MM#((";7";; <  Mr?cV'gR#\V\4'd VR,#\;QJd+.RVPR^44FNK 5R,#!RVPR^444R,#)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 :NNc38"TFp\V4xK R#5irrrs& rrgetver..s5!4AQ!4rr)r0rr)r*s&rrrsc %Ry 55S!!455b 9955S!!45 5b 99r?c<.p.p\V4FSp\V\4'd \V4pV\8dVP V4KBVP V4KU VP \V44V'dV'd \V4#V#)akReturn 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'] ) rr0r&rr rextendreversedr)r return_strrC old_versionsrs&& r debsortedrs|&FL(# gs # #WoG W     ( MM' " $ MM(<()fV} Mr?rr)&loggingrosros.pathr configparserrtypesr RANGE_PATTERNcompilerVERBOSEr6 getLoggerrlogr} _supported_default_configreadreplacerrr Exception exceptionrr"rrrrrrrrr?rrs, %2 ::m $ ZZ  % ![[/ 0 ;;+ ,nG LL56 ;;y*;