*g7SSKrSSKrSSKJr SSKJr SSKJr SSKJ r Sr \R"\ 5r \R"S\R5r\R"\5r\R$"S5r\R$"S 5r\(a\(d]\"5r\R-S 5 \(d\R%S S 5S Sr\(d"\R%S S5R/SS5r\"S\R3S555r\"S\R3S555r"SS5rSSjrSr Sr!Sr"Sr#Sr$S Sjr%g!\a \R9S5 N\f=f!\a \R9S5 NZf=f)!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#8# UHn[U5v M g7fNint.0is '/usr/share/python3/debpython/version.py r5s8$7qCFF$7.zcannot read debian_defaultsc## UH4n[SUR5RS555v M6 g7f)c38# UHn[U5v M g7frr)rjs rr.9sA,@qCFF,@rrN)tuplestripsplitrs rrr9s464!AAGGIOOC,@AAA4s<>,ct\rSrSrSSjrSrSrSrSrSr S r S r S r S r S rSrSrSSjrSrg)Version?Nc T[U[[45(aSRSU55n[U[5(aSHn[ X[ X55 M g[5nUS US U(aU[RU5n U (aU R5R5O/HupqUcM XbMXU'M UR5H%upqUS:waUb [U5n[ XU5 M' UR(d [S5eg)Nrc38# UHn[U5v M g7frstrrs rr#Version.__init__..Cs3USVVUrmajorminormicro releaselevelserialselfvaluer-zmajor component is required) isinstancerlistjoinr"setattrgetattrlocals VERSION_REmatch groupdictitemsrr* ValueError) r/r0r*r+r,r-r.namecompr8s 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*[[U55$r)hashrepr)r/s r__hash__Version.__hash__dsDJr@cSRU5nSH/n[X5nU(d US-$USRU5- nM1 US-$)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.rBz'))rCr5)r/rDr<r0s r__repr__Version.__repr__gsY%%d+7DD'E} ell5) )F 8 }r@c[U5nURc U=R[U5- slU$U=R[U5- slU$)z`Return next version. >>> Version('3.1') + 1 Version('3.2') >>> Version('2') + '1' Version('3') )r"r+r*r)r/otherrDs r__add__Version.__add__wsI ::  LLCJ &L  LLCJ &L r@c[U5nURc+U=R[U5-slURnO*U=R[U5-slURnUS:a [ S5eU$)zdReturn previous version. >>> Version('3.1') - 1 Version('3.0') >>> Version('3') - '1' Version('2') rzcannot decrease version further)r"r+r*rr;)r/rPrDnews r__sub__Version.__sub__se ::  LLCJ &L,,C LLCJ &L,,C 7>? ? r@c*URU5S:H$Nr _Version__cmpr/rPs r__eq__Version.__eq__zz% A%%r@c*URU5S:$rXrYr[s r__lt__Version.__lt__zz% 1$$r@c*URU5S:*$rXrYr[s r__le__Version.__le__r^r@c*URU5S:$rXrYr[s r__gt__Version.__gt__rbr@c*URU5S:$rXrYr[s r__ge__Version.__ge__r^r@c[U[5(d [U5nURb URcURUSS9S:$URUSS9S:$)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+ignorerr,r1r"r+rZr[s r __lshift__Version.__lshift__]%))ENE :: !4::eG:4q8 8::eG:4q8 8r@c[U[5(d [U5nURb URcURUSS9S:$URUSS9S:$)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+rmrr,ror[s r __rshift__Version.__rshift__rrr@c6[U[5(d [U5nSHsnX2:Xa g[X5=(d Sn[X5=(d SnUS:Xa+SSSSS.nURUS5nURUS5nXE:XaMjXE:XE:- s $ g)Nr)rr-)alphabeta candidatefinal)r1r"r5get)r/rPrnr<value1value2rmaps r__cmp Version.__cmps%))ENEID~T(-AFU).QF~%!#Rb1M&!,&!,O8 8Jr@)NNNNNNr)__name__ __module__ __qualname____firstlineno__r>rErJrMrQrUr\r`rdrgrjrprtrZ__static_attributes__rr@rr"r"?sNAE+/<.   &&%&%&9*9*r@r"c^^[U[5(a [U5nU(a[U5SS/:Xa[ [ 5nO[UScSOUSmUScSOUSmTT:Xa![ T[ ;aT4O [ 55nO[ UU4Sj[ 55nU(a[ SU55nU$USLa[ S U55nU$) 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 Nr)rr)crc3N># UHnTUs=::aT:dMO MUv M g7frr)rvmaxvminvs rr)get_requested_versions..s"Di413Ct3C13C1is %% %c3P# UHn[SU-5(dMUv M g7fz/usr/bin/python%d.%dNrrrs rrrs%>(Q !7!!;<q(& &Fc3P# UHn[SU-5(aMUv M g7frrrs rrrs&B(Q$%;a%?@q(r)r1r' parse_vranger2set SUPPORTEDr)vrange availableversionsrrs @@rget_requested_versionsrs"&#f% T&\dD\1y>*vq !!9,x&) 4<di&7D7UWEHDiDDH>(>> O e B(BB Or@c8US;ag[RU5nU(d[SU-5eUR5n[ U5R S5S:Xa'[ SUSRS555nX34$S=p4US (aUSnO USnUSnU(a![ S URS555OSnU(a![ S URS555OSnU(aU(aX4:a[SU-5eX44$) 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 )r -NNzversion range is invalid: %sNc38# UHn[U5v M g7frrrs rrparse_vrange..%s:%9SVV%9rrrrc38# UHn[U5v M g7frrrs rrr/1AQrc38# UHn[U5v M g7frrrs rrr0rr)RANGE_REr8r;groupsr2countrr)r0r8rrrs rrr s   NN5 !E 7%?@@ \\^F F|$1$:VAY__S%9::zD ayayayay5951C1 1tD5951C1 1tD 7%?@@ :r@cS=p[5nURS5HnUR5n[R"SU5nU(aSUR S5-nMG[R"SU5nU(aSUR S5-nM{[R"SU5nU(dMUR SUR S5-5 M [U5S:Xa&UR5n[U5[U54$U(dU(a[U5SnU(a [U5OSU(a [U54$S4$) 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%.3srz<<\s*([\d\.]+)z ^[\d\.]+$r) rrrrer8groupaddlenpopgetversorted)r0rr hardcodeditemr8vers 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)) '-' rrrrc38# UHn[U5v M g7frr&rs rrvrange_str..v2 1A rc38# UHn[U5v M g7frr&rs rrrxs8ic!ffirc38# UHn[U5v M g7frr&rs rrrzrrc38# UHn[U5v M g7frr&rs rrr|"=9a3q669rc38# UHn[U5v M g7frr&rs rrr}rr)r3)rs r vrange_strrcs ayF1I%& ayF1Ixx2q 222  SXX8fQi8888  xx2q 22S88(("=6!9"==(("=6!9"==? ?r@c~[U[5(aU$[U[[45(d0[US[5(aSR SU55$/nUHRn[U[5(aUR U5 M+UR SR SU555 MT U$)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' rrc38# UHn[U5v M g7frr&rs rrvrepr..s.1Arc38# UHn[U5v M g7frr&rs rrrs";7a3q667r)r1r'rrrr3append)r0rDversions rvreprrs%  s3 4 4E!Hc9R9Rxx.... F gs # # MM' " MM#((";7";; <  Mr@cU(dg[U[5(aUSS$[SURSS555SS$)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 Nc38# UHn[U5v M g7frrrs rrgetver..s5!4AQ!4rr)r1rr)r0s rrrsF %Ray 5S!!45 5bq 99r@c4/n/n[U5HQn[U[5(a [U5nU[:aUR U5 M@UR U5 MS UR [U55 U(aU(a [U5$U$)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'] ) rr1r'rr rextendreversedr)r return_strrD old_versionsrs r debsortedrs|&FL(# gs # #WoG W     ( MM' " $ MM(<()fV} Mr@rr)&loggingrosros.pathr configparserrtypesr RANGE_PATTERNcompilerVERBOSEr7 getLoggerrlogr~ _supported_default_configreadreplacerrr Exception exceptionrr"rrrrrrrrr@rrs, %2 ::m $ ZZ  % ![[/ 0 ;;+ ,nG LL56 ;;y*;