
    9bh7                        S SK r S SKrS SKJr  S SKJr  S SKJr  S SKJ	r	  Sr
\R                  " \
5      r\R                  " S\R                  5      r\ R                  " \5      r\R$                  " S5      r\R$                  " S	5      r\(       a  \(       d]  \" 5       r\R-                  S
5        \(       d  \R%                  SS5      SS r\(       d"  \R%                  SS5      R/                  SS5      r \" S \R3                  S5       5       5      r \" S \R3                  S5       5       5      r " S S5      rSS jrS r S r!S r"S r#S r$S S jr%g! \ a    \R9                  S5         N\f = f! \ a    \R9                  S5         NZf = f)!    N)environexists)ConfigParser)GeneratorTypez(-)?(\d\.\d+)(?:(-)(\d\.\d+)?)?z
    (?P<major>\d+)\.?
    (?P<minor>\d+)?\.?
    (?P<micro>\d+)?[.\s]?
    (?P<releaselevel>alpha|beta|candidate|final)?[.\s]?
    (?P<serial>\d+)?DEBPYTHON3_SUPPORTEDDEBPYTHON3_DEFAULTz"/usr/share/python3/debian_defaultsDEFAULTzdefault-version   zsupported-versionspython c              #   8   #    U  H  n[        U5      v   M     g 7fNint.0is     '/usr/share/python3/debpython/version.py	<genexpr>r   5   s     8$7qCFF$7   .zcannot read debian_defaultsc              #      #    U  H4  n[        S  UR                  5       R                  S5       5       5      v   M6     g7f)c              3   8   #    U  H  n[        U5      v   M     g 7fr   r   )r   js     r   r   <genexpr>.<genexpr>9   s     A,@qCFF,@r   r   N)tuplestripsplitr   s     r   r   r   9   s4      64! AAGGIOOC,@AAA4s   <>,c                   t    \ rS rSr  SS jrS rS rS rS rS r	S	 r
S
 rS rS rS rS rS rSS jrSrg)Version?   Nc           	      T   [        U[        [        45      (       a  SR                  S U 5       5      n[        U[        5      (       a  S H  n[        X[        X5      5        M     g [        5       nUS	 US	 U(       aU  [        R                  U5      n	U	(       a  U	R                  5       R                  5       O/  H  u  pqUc  M
  X   b  M  XU'   M     UR                  5        H%  u  pqUS:w  a  Ub  [        U5      n[        XU5        M'     U R                  (       d  [        S5      eg )Nr   c              3   8   #    U  H  n[        U5      v   M     g 7fr   strr   s     r   r   #Version.__init__.<locals>.<genexpr>C   s     3USVVUr   majorminormicroreleaselevelserialselfvaluer-   zmajor component is required)
isinstancer   listjoinr"   setattrgetattrlocals
VERSION_REmatch	groupdictitemsr   r*   
ValueError)
r/   r0   r*   r+   r,   r-   r.   namecompr8   s
             r   __init__Version.__init__@   s    eeT]++HH3U33EeW%%MGE$89 NxLM$$U+E<Au0668rI$);!&J  J  ::<KD~%%*;E
D& ( zz:;;     c                     [        U R                  5      nU R                  b  USR                  U R                  5      -  nU$ )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'
.{})r'   r*   r+   format)r/   results     r   __str__Version.__str__W   s7     TZZ::!ell4::..Fr@   c                 *    [        [        U 5      5      $ r   )hashrepr)r/   s    r   __hash__Version.__hash__d   s    DJr@   c                     SR                  U 5      nS H/  n[        X5      nU(       d    US-   $ USR                  U5      -  nM1     US-   $ )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.   rB   z'))rC   r5   )r/   rD   r<   r0   s       r   __repr__Version.__repr__g   sY     %%d+7DD'E} ell5))F	 8
 }r@   c                     [        U 5      nU R                  c   U=R                  [        U5      -  sl        U$ U=R                  [        U5      -  sl        U$ )z`Return next version.

>>> Version('3.1') + 1
Version('3.2')
>>> Version('2') + '1'
Version('3')
)r"   r+   r*   r   )r/   otherrD   s      r   __add__Version.__add__w   sI     ::LLCJ&L  LLCJ&Lr@   c                    [        U 5      nU R                  c+  U=R                  [        U5      -  sl        UR                  nO*U=R                  [        U5      -  sl        UR                  nUS:  a  [	        S5      eU$ )zdReturn previous version.

>>> Version('3.1') - 1
Version('3.0')
>>> Version('3') - '1'
Version('2')
r   zcannot decrease version further)r"   r+   r*   r   r;   )r/   rP   rD   news       r   __sub__Version.__sub__   se     ::LLCJ&L,,CLLCJ&L,,C7>??r@   c                 *    U R                  U5      S:H  $ Nr   _Version__cmpr/   rP   s     r   __eq__Version.__eq__       zz% A%%r@   c                 *    U R                  U5      S:  $ rX   rY   r[   s     r   __lt__Version.__lt__       zz% 1$$r@   c                 *    U R                  U5      S:*  $ rX   rY   r[   s     r   __le__Version.__le__   r^   r@   c                 *    U R                  U5      S:  $ rX   rY   r[   s     r   __gt__Version.__gt__   rb   r@   c                 *    U R                  U5      S:  $ rX   rY   r[   s     r   __ge__Version.__ge__   r^   r@   c                     [        U[        5      (       d  [        U5      nU R                  b  UR                  c  U R                  USS9S:  $ U R                  USS9S:  $ )a  Compare 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   r,   r1   r"   r+   rZ   r[   s     r   
__lshift__Version.__lshift__   ]     %))ENE::!4::eG:4q88::eG:4q88r@   c                     [        U[        5      (       d  [        U5      nU R                  b  UR                  c  U R                  USS9S:  $ U R                  USS9S:  $ )a  Compare 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+   rm   r   r,   ro   r[   s     r   
__rshift__Version.__rshift__   rr   r@   c                 6   [        U[        5      (       d  [        U5      nS Hs  nX2:X  a    g[        X5      =(       d    Sn[        X5      =(       d    SnUS:X  a+  SSSSS.nUR                  US5      nUR                  US5      nXE:X  a  Mj  XE:  XE:  -
  s  $    g)Nr)   r   r-   )alphabeta	candidatefinal)r1   r"   r5   get)r/   rP   rn   r<   value1value2rmaps          r   __cmpVersion.__cmp   s    %))ENEID~  T(-AFU).QF~%!#Rb1M&!,&!,O88 J r@    )NNNNNNr   )__name__
__module____qualname____firstlineno__r>   rE   rJ   rM   rQ   rU   r\   r`   rd   rg   rj   rp   rt   rZ   __static_attributes__r   r@   r   r"   r"   ?   sN    AE+/<.  &&%&%&9*9*r@   r"   c                   ^^ [        U [        5      (       a  [        U 5      n U (       a  [        U 5      SS/:X  a  [	        [
        5      nO[U S   c  SOU S   mU S   c  SOU S   mTT:X  a!  [	        T[
        ;   a  T4O	[        5       5      nO[	        UU4S j[
         5       5      nU(       a  [	        S U 5       5      nU$ USL a  [	        S	 U 5       5      nU$ )
a  Return 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   )r   r      )c   r   c              3   N   >#    U  H  nTUs=::  a  T:  d  M  O  M  Uv   M     g 7fr   r   )r   vmaxvminvs     r   r   )get_requested_versions.<locals>.<genexpr>   s"     Di413Ct3C13C1is   %%	%c              3   P   #    U  H  n[        S U-  5      (       d  M  Uv   M     g7fz/usr/bin/python%d.%dNr   r   r   s     r   r   r     s%      >(Q !7!!;< q(   &	&Fc              3   P   #    U  H  n[        S U-  5      (       a  M  Uv   M     g7fr   r   r   s     r   r   r     s&      B(Q$%;a%?@ q(r   )r1   r'   parse_vranger2   set	SUPPORTEDr   )vrange	availableversionsr   r   s      @@r   get_requested_versionsr      s    " &#f%T&\dD\1y>*vq	!!9,x&)4<di&7D7UWEHDiDDH >( > > O	 
e	 B( B B Or@   c                 8   U S;   a  g[         R                  U 5      nU(       d  [        SU -  5      eUR                  5       n[	        U5      R                  S5      S:X  a'  [        S US   R                  S5       5       5      nX34$ S=p4US	   (       a  US   nO
US   nUS   nU(       a!  [        S
 UR                  S5       5       5      OSnU(       a!  [        S UR                  S5       5       5      OSnU(       a  U(       a  X4:  a  [        SU -  5      eX44$ )aO  Return 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   -NNzversion range is invalid: %sN   c              3   8   #    U  H  n[        U5      v   M     g 7fr   r   r   s     r   r   parse_vrange.<locals>.<genexpr>%  s     :%9SVV%9r   r   r   r   c              3   8   #    U  H  n[        U5      v   M     g 7fr   r   r   s     r   r   r   /       1AQr   c              3   8   #    U  H  n[        U5      v   M     g 7fr   r   r   s     r   r   r   0  r   r   )RANGE_REr8   r;   groupsr2   countr   r   )r0   r8   r   r   r   s        r   r   r     s      	NN5!E7%?@@\\^FF|$1$:VAY__S%9::zDayayayay5951C11tD5951C11tD7%?@@:r@   c                    S=p[        5       nU R                  S5       H  nUR                  5       n[        R                  " SU5      nU(       a  SUR                  S5      -  nMG  [        R                  " SU5      nU(       a  SUR                  S5      -  nM{  [        R                  " SU5      nU(       d  M  UR                  SUR                  S5      -  5        M     [        U5      S:X  a&  UR                  5       n[        U5      [        U5      4$ U(       d  U(       a  [        U5      S   nU(       a  [        U5      OSU(       a  [        U5      4$ S4$ )	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%.3sr   z<<\s*([\d\.]+)z	^[\d\.]+$r   )r   r   r   rer8   groupaddlenpopgetversorted)r0   r   r   	hardcodeditemr8   vers          r   parse_pycentral_vranger   8  s    DIC zz|*D1EKKN*D*D1EKKN*Dt,5MM&5;;q>12 ! 9~mmoc{F3K''Ii #6$<T46$<IITIIr@   c                 z   U S   U S   s=L a  c   g  U S   U S   :X  a  SR                  S U S    5       5      $ U S   c  SSR                  S U S    5       5      -   $ U S   c  SR                  S U S    5       5      S-   $ SR                  S U S    5       5      < SSR                  S	 U S    5       5      < 3$ )
a  Return 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))
'-'
r   r   r   r   c              3   8   #    U  H  n[        U5      v   M     g 7fr   r&   r   s     r   r   vrange_str.<locals>.<genexpr>v       2	1A	r   c              3   8   #    U  H  n[        U5      v   M     g 7fr   r&   r   s     r   r   r   x  s     8ic!ffir   c              3   8   #    U  H  n[        U5      v   M     g 7fr   r&   r   s     r   r   r   z  r   r   c              3   8   #    U  H  n[        U5      v   M     g 7fr   r&   r   s     r   r   r   |       "=9a3q669r   c              3   8   #    U  H  n[        U5      v   M     g 7fr   r&   r   s     r   r   r   }  r   r   )r3   )r   s    r   
vrange_strr   c  s      ayF1I% &ayF1Ixx2q	222		SXX8fQi8888		xx2q	22S88(("=6!9"==(("=6!9"==? 	?r@   c                 ~   [        U [        5      (       a  U $ [        U [        [        45      (       d0  [        U S   [        5      (       a  SR                  S U  5       5      $ / nU  HR  n[        U[        5      (       a  UR                  U5        M+  UR                  SR                  S U 5       5      5        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'
r   r   c              3   8   #    U  H  n[        U5      v   M     g 7fr   r&   r   s     r   r   vrepr.<locals>.<genexpr>  s     .1Ar   c              3   8   #    U  H  n[        U5      v   M     g 7fr   r&   r   s     r   r   r     s     ";7a3q667r   )r1   r'   r   r   r   r3   append)r0   rD   versions      r   vreprr     s     %s344E!Hc9R9Rxx....Fgs##MM'"MM#((";7";;<	 
 Mr@   c                     U (       d  g[        U [        5      (       a  U SS $ [        S U R                  SS5       5       5      SS $ )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   N   c              3   8   #    U  H  n[        U5      v   M     g 7fr   r   r   s     r   r   getver.<locals>.<genexpr>  s     5!4AQ!4r   r   )r1   r   r   )r0   s    r   r   r     sF     %Ray5S!!455bq99r@   c                 4   / n/ n[        U 5       HQ  n[        U[        5      (       a  [        U5      nU[        :  a  UR                  U5        M@  UR                  U5        MS     UR                  [        U5      5        U(       a  U(       a  [        U5      $ U$ )ak  Return 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   r1   r'   r   r
   r   extendreversedr   )r   
return_strrD   old_versionsr   s        r   	debsortedr     s|    & FL(#gs##WoGW(MM'" $ MM(<()fV}Mr@   r   r   )&loggingr   osr   os.pathr   configparserr   typesr   RANGE_PATTERNcompiler   VERBOSEr7   	getLoggerr   logr~   
_supported_default_configreadreplacer   r   r
   	Exception	exceptionr   r"   r   r   r   r   r   r   r   r   r@   r   <module>r      s  ,  	   % 2::m$ZZ 
 %
 ! [[/0
;;+,nGLL56;;y*;<QR@[[,@AWXr" 	18HNN3$788G1 6)//46 6Ib bJ%P)X(JV?:2:&m  1MM/01
  1MM/01s$   4E E2 E/.E/2FF