
    f7                        d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlm	Z	 dZ
 ej                  e
      Z ej                  dej                        Z e j                  e      Z ej$                  d      Z ej$                  d	      ZeresS e       Zej-                  d
       esej%                  dd      dd Zes"ej%                  dd      j/                  dd      Z	  ed ej3                  d      D              Z	  ed ej3                  d      D              Z G d d      ZddZd Z d Z!d Z"d Z#d Z$d dZ%y# e$ r ej9                  d       Y Yw xY w# e$ r ej9                  d       Y Vw xY w)!    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              #   2   K   | ]  }t        |        y wNint.0is     '/usr/share/python3/debpython/version.py	<genexpr>r   5   s     8qCF8   .zcannot read debian_defaultsc              #   z   K   | ]3  }t        d  |j                         j                  d      D               5 yw)c              3   2   K   | ]  }t        |        y wr   r   )r   js     r   r   z<genexpr>.<genexpr>9   s     AqCFAr   r   N)tuplestripsplitr   s     r   r   r   9   s2      6 AAGGIOOC,@AA 6s   9;,c                   h    e Zd Z	 	 ddZd Zd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd ZddZy)VersionNc           	         t        |t        t        f      rdj                  d |D              }t        |t              rdD ]  }t        | |t        ||              y t               }|d= |d= |rMt        j                  |      }	|	r|	j                         j                         ng D ]  \  }}|	||   |||<    |j                         D ]$  \  }}|dk7  r|t        |      }t        | ||       & | j                  st        d      y )Nr   c              3   2   K   | ]  }t        |        y wr   strr   s     r   r   z#Version.__init__.<locals>.<genexpr>C   s     3SV3r   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,   r-   r'   r(   r)   r*   r+   namecompr5   s
             r   __init__zVersion.__init__@   s   eeT]+HH3U33EeW%M :dGE4$89:xLM$$U+E<Au0668r 'e$d);!&DJ'  ::< 	'KD%~%%*;E
D$&	' zz:;;     c                     t        | j                        }| j                  |dj                  | j                        z  }|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'
        .{})r%   r'   r(   format)r,   results     r   __str__zVersion.__str__W   s7     TZZ::!ell4::..Fr<   c                 *    t        t        |             S r   )hashrepr)r,   s    r   __hash__zVersion.__hash__d   s    DJr<   c                     dj                  |       }dD ]*  }t        | |      }|s |dz   S |dj                  |      z  }, |dz   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+   r>   z'))r?   r2   )r,   r@   r9   r-   s       r   __repr__zVersion.__repr__g   s`     %%d+7 	*DD$'E} ell5))F		*
 }r<   c                     t        |       }| j                   |xj                  t        |      z  c_        |S |xj                  t        |      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__zVersion.__add__w   sI     ::LLCJ&L  LLCJ&Lr<   c                     t        |       }| j                  +|xj                  t        |      z  c_        |j                  }n*|xj                  t        |      z  c_        |j                  }|dk  rt	        d      |S )zReturn previous version.

        >>> Version('3.1') - 1
        Version('3.0')
        >>> Version('3') - '1'
        Version('2')
        r   zcannot decrease version further)r!   r(   r'   r   r8   )r,   rI   r@   news       r   __sub__zVersion.__sub__   se     ::LLCJ&L,,CLLCJ&L,,C7>??r<   c                 *    | j                  |      dk(  S Nr   _Version__cmpr,   rI   s     r   __eq__zVersion.__eq__       zz% A%%r<   c                 *    | j                  |      dk  S rO   rP   rR   s     r   __lt__zVersion.__lt__       zz% 1$$r<   c                 *    | j                  |      dk  S rO   rP   rR   s     r   __le__zVersion.__le__   rT   r<   c                 *    | j                  |      dkD  S rO   rP   rR   s     r   __gt__zVersion.__gt__   rW   r<   c                 *    | j                  |      dk\  S rO   rP   rR   s     r   __ge__zVersion.__ge__   rT   r<   c                     t        |t              st        |      }| j                  |j                  | j                  |d      dk  S | j                  |d      dk  S )ak  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)   r.   r!   r(   rQ   rR   s     r   
__lshift__zVersion.__lshift__   Z     %)ENE::!4::eG:4q88::eG:4q88r<   c                     t        |t              st        |      }| j                  |j                  | j                  |d      dkD  S | j                  |d      dkD  S )ao  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(   r_   r   r)   ra   rR   s     r   
__rshift__zVersion.__rshift__   rc   r<   c                    t        |t              st        |      }dD ]k  }||k(  r yt        | |      xs d}t        ||      xs d}|dk(  r+ddddd}|j                  |d      }|j                  |d      }||k(  r`||kD  ||k  z
  c S  y)Nr&   r   r*   )alphabeta	candidatefinal)r.   r!   r2   get)r,   rI   r`   r9   value1value2rmaps          r   __cmpzVersion.__cmp   s    %)ENEI 	9Dv~  T4(-AFUD).QF~%!#Rb1M&!,&!,VO88	9 r<   )NNNNNNr   )__name__
__module____qualname__r;   rA   rE   rG   rJ   rM   rS   rV   rY   r[   r]   rb   re   rQ    r<   r   r!   r!   ?   sN    AE+/<.  &&%&%&9*9*r<   r!   c                    t        | t              rt        |       } | rt        |       ddgk(  rt	        t
              }nU| d   dn| d   | d   dn| d   k(  rt	        t
        v rfn	t                     }nt	        fdt
        D              }|rt	        d |D              }|S |du rt	        d	 |D              }|S )
aJ  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   ry   c              3   @   K   | ]  }|cxk  rk  sn n|  y wr   rv   )r   vmaxvminvs     r   r   z)get_requested_versions.<locals>.<genexpr>   s     D413Ct3C1Ds   
c              3   <   K   | ]  }t        d |z        r|  ywz/usr/bin/python%d.%dNr   r   r{   s     r   r   z)get_requested_versions.<locals>.<genexpr>  s%      >Q !7!!;<  >   Fc              3   <   K   | ]  }t        d |z        s|  ywr   r   r   s     r   r   z)get_requested_versions.<locals>.<genexpr>  s'      BQ$%;a%?@  Br   )r.   r%   parse_vranger/   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                    | dv ryt         j                  |       }|st        d| z        |j                         }t	        |      j                  d      dk(  r(t        d |d   j                  d      D              }||fS dx}}|d	   r|d   }n
|d   }|d   }|r!t        d
 |j                  d      D              nd}|r!t        d |j                  d      D              nd}|r|r||kD  rt        d| z        ||fS )a  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   2   K   | ]  }t        |        y wr   r   r   s     r   r   zparse_vrange.<locals>.<genexpr>%  s     :SV:r   rx   r   r   c              3   2   K   | ]  }t        |        y wr   r   r   s     r   r   zparse_vrange.<locals>.<genexpr>/       1AQ1r   c              3   2   K   | ]  }t        |        y wr   r   r   s     r   r   zparse_vrange.<locals>.<genexpr>0  r   r   )RANGE_REr5   r8   groupsr/   countr   r   )r-   r5   r   r}   r|   s        r   r   r     s     	NN5!E7%?@@\\^FF|$1$:VAY__S%9::TzD4ayayayay5951C11tD5951C11tD7%?@@:r<   c                 `   dx}}t               }| j                  d      D ]  }|j                         }t        j                  d|      }|rd|j                  d      z  }@t        j                  d|      }|rd|j                  d      z  }mt        j                  d|      }|s|j                  d|j                  d      z          t        |      dk(  r&|j                         }t        |      t        |      fS |s|rt        |      d   }|rt        |      nd|rt        |      fS dfS )	a  Parse 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%.3srx   z<<\s*([\d\.]+)z	^[\d\.]+$r   )r   r   r   rer5   groupaddlenpopgetversorted)r-   r}   r|   	hardcodeditemr5   vers          r   parse_pycentral_vranger   8  s    D4IC  3zz|*D1EKKN*D*D1EKKN*Dt,MM&5;;q>123 9~mmoc{F3K''Ii #6$<T46$<IITIIr<   c                 j   | d   | d   cxu ry | d   | d   k(  rdj                  d | d   D              S | d   ddj                  d | d   D              z   S | d   dj                  d | d   D              dz   S dj                  d | d   D              ddj                  d	 | d   D              S )
aM  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   rx   r   r   c              3   2   K   | ]  }t        |        y wr   r$   r   s     r   r   zvrange_str.<locals>.<genexpr>v       21A2r   c              3   2   K   | ]  }t        |        y wr   r$   r   s     r   r   zvrange_str.<locals>.<genexpr>x  s     8c!f8r   c              3   2   K   | ]  }t        |        y wr   r$   r   s     r   r   zvrange_str.<locals>.<genexpr>z  r   r   c              3   2   K   | ]  }t        |        y wr   r$   r   s     r   r   zvrange_str.<locals>.<genexpr>|       "=a3q6"=r   c              3   2   K   | ]  }t        |        y wr   r$   r   s     r   r   zvrange_str.<locals>.<genexpr>}  r   r   )r0   )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                 P   t        | t              r| S t        | t        t        f      s+t        | d   t              rdj                  d | D              S g }| D ]K  }t        |t              r|j                  |       %|j                  dj                  d |D                     M |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'
    r   r   c              3   2   K   | ]  }t        |        y wr   r$   r   s     r   r   zvrepr.<locals>.<genexpr>  s     .1A.r   c              3   2   K   | ]  }t        |        y wr   r$   r   s     r   r   zvrepr.<locals>.<genexpr>  s     ";a3q6";r   )r.   r%   r   r   r   r0   append)r-   r@   versions      r   vreprr     s     %s34E!Hc9Rxx....F =gs#MM'"MM#((";7";;<	=
 Mr<   c                 |    | syt        | t              r| dd S t        d | j                  dd      D              dd 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   2   K   | ]  }t        |        y wr   r   r   s     r   r   zgetver.<locals>.<genexpr>  s     5AQ5r   r   )r.   r   r   )r-   s    r   r   r     sC     %Ray5S!!455bq99r<   c                    g }g }t        |       D ]I  }t        |t              rt        |      }|t        k  r|j                  |       9|j                  |       K |j                  t        |             |r|rt        |      S |S )a  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   r.   r%   r   r
   r   extendreversedr   )r   
return_strr@   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   VERBOSEr4   	getLoggerrs   logrn   
_supported_default_configreadreplacer   r   r
   	Exception	exceptionr   r!   r   r   r   r   r   r   r   rv   r<   r   <module>r      s  ,  	   % 22::m$RZZ 
 %
 g! W[[/0
7;;+,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$    D? ?E ?EEE43E4