
    ґ2d7                     D   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sk e            Ze                    d
           ese                    dd          dd         Zes*e                    dd                              dd          Z	  ed e                    d          D                       Zn # e$ r e                    d           Y nw xY w	  ed e                    d          D                       Zn # e$ r e                    d           Y nw xY w G d d          ZddZd Z d Z!d Z"d Z#d Z$d dZ%dS )!    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              #   4   K   | ]}t          |          V  d S Nint.0is     '/usr/share/python3/debpython/version.py	<genexpr>r   5   s(      88qCFF888888    .zcannot read debian_defaultsc              #      K   | ]B}t          d  |                                                    d          D                       V  CdS )c              3   4   K   | ]}t          |          V  d S r   r   )r   js     r   r   z<genexpr>.<genexpr>9   s(      AAqCFFAAAAAAr   r   N)tuplestripsplitr   s     r   r   r   9   sa       6 6 AAAGGIIOOC,@,@AAAAA 6 6 6 6 6 6r   ,c                   j    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dS )VersionNc           	         t          |t          t          f          rd                    d |D                       }t          |t                    r&dD ]!}t          | |t          ||                     "d S t                      }|d= |d= |rYt          	                    |          }	|	r&|	
                                                                ng D ]\  }}|||         |||<   |                                D ]-\  }}|dk    r|t          |          }t          | ||           .| j        st          d          d S )Nr   c              3   4   K   | ]}t          |          V  d S r   strr   s     r   r   z#Version.__init__.<locals>.<genexpr>C   s(      33SVV33333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__@   si   eeT]++ 	4HH33U33333EeW%% 	M : :dGE4$8$89999FxxLM 	'$$U++E<AIu0066888r ' 'e$d);!&DJ::<< 	' 	'KD%~%%%*;E

D$&&&&z 	<:;;;	< 	<r   c                 v    t          | j                  }| j        |d                    | 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'
        N.{})r%   r'   r(   format)r,   results     r   __str__zVersion.__str__W   s6     TZ:!ell4:...Fr   c                 :    t          t          |                     S r   )hashrepr)r,   s    r   __hash__zVersion.__hash__d   s    DJJr   c                     d                     |           }dD ].}t          | |          }|s n|d                     |          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   sd     %%d++7 	* 	*DD$''E ell5)))FF}r   c                     t          |           }| j        |xj        t          |          z  c_        n|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   sJ     :LLCJJ&LLLLLCJJ&LL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')
        Nr   zcannot decrease version further)r!   r(   r'   r   r8   )r,   rH   r?   news       r   __sub__zVersion.__sub__   sp     :LLCJJ&LL,CCLLCJJ&LL,C77>???r   c                 4    |                      |          dk    S Nr   _Version__cmpr,   rH   s     r   __eq__zVersion.__eq__       zz%  A%%r   c                 4    |                      |          dk     S rN   rO   rQ   s     r   __lt__zVersion.__lt__       zz%  1$$r   c                 4    |                      |          dk    S rN   rO   rQ   s     r   __le__zVersion.__le__   rS   r   c                 4    |                      |          dk    S rN   rO   rQ   s     r   __gt__zVersion.__gt__   rV   r   c                 4    |                      |          dk    S rN   rO   rQ   s     r   __ge__zVersion.__ge__   rS   r   c                     t          |t                    st          |          }| j        |j        |                     |d          dk     S |                     |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
        Nr(   ignorer   r)   r.   r!   r(   rP   rQ   s     r   
__lshift__zVersion.__lshift__   f     %)) 	#ENNE:!4::eG:44q88::eG:44q88r   c                     t          |t                    st          |          }| j        |j        |                     |d          dk    S |                     |d          dk    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
        Nr(   r^   r   r)   r`   rQ   s     r   
__rshift__zVersion.__rshift__   rb   r   c                 L   t          |t                    st          |          }dD ]|}||k    r nst          | |          pd}t          ||          pd}|dk    r3ddddd}|                    |d          }|                    |d          }||k    rn||k    ||k     z
  c S dS )Nr&   r   r*   )alphabeta	candidatefinal)r.   r!   r2   get)r,   rH   r_   r9   value1value2rmaps          r   __cmpzVersion.__cmp   s    %)) 	#ENNEI 	9 	9Dv~~T4((-AFUD)).QF~%%!#Rb1MM&!,,&!,,VO8888qr   )NNNNNNr   )__name__
__module____qualname__r;   r@   rD   rF   rI   rL   rR   rU   rX   rZ   r\   ra   rd   rP    r   r   r!   r!   ?   s        AE+/< < < <.              && & &% % %& & &% % %& & &9 9 9*9 9 9*     r   r!   c                    t          | t                    rt          |           } | rt          |           ddgk    rt	          t
                    }ns| 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                       }n|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   rx   c              3   <   K   | ]}|cxk    rk     n n|V  d S r   ru   )r   vmaxvminvs     r   r   z)get_requested_versions.<locals>.<genexpr>   sD      DD413C3C3C3Ct3C3C3C3C3C13C3C3C3CDDr   c              3   >   K   | ]}t          d |z            |V  dS z/usr/bin/python%d.%dNr   r   rz   s     r   r   z)get_requested_versions.<locals>.<genexpr>  sH       > >Q !7!!;<<>q > > > > > >r   Fc              3   >   K   | ]}t          d |z            |V  dS r~   r   r   s     r   r   z)get_requested_versions.<locals>.<genexpr>  sQ       B BQ$%;a%?@@Bq B B B B B Br   )r.   r%   parse_vranger/   set	SUPPORTEDr   )vrange	availableversionsr{   r|   s      @@r   get_requested_versionsr      sD   " &# &f%% ET&\\dD\11y>>*vvq	!!9,xx&)4<<di&7&7D77UWWEEHHDDDDDiDDDDDH B > >( > > > > >	e		 B B( B B B B B Or   c                    | dv rdS t                               |           }|st          d| z            |                                }t	          |                              d          dk    r6t          d |d                             d          D                       }||fS dx}}|d	         r	|d         }n|d         }|d         }|r,t          d
 |                    d          D                       nd}|r,t          d |                    d          D                       nd}|r|r||k    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   4   K   | ]}t          |          V  d S r   r   r   s     r   r   zparse_vrange.<locals>.<genexpr>%  s(      ::SVV::::::r   rw   r   r   c              3   4   K   | ]}t          |          V  d S r   r   r   s     r   r   zparse_vrange.<locals>.<genexpr>/  (      11AQ111111r   c              3   4   K   | ]}t          |          V  d S 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     sn     	zNN5!!E A7%?@@@\\^^FF||$1$$::VAY__S%9%9:::::TzD4ay ayayay59C511C111111tD59C511C111111tD A A7%?@@@:r   c                    dx}}t                      }|                     d          D ]}|                                }t          j        d|          }|rd|                    d          z  }Ft          j        d|          }|rd|                    d          z  }vt          j        d|          }|r+|                    d|                    d          z             t          |          dk    r2|                                }t          |          t          |          fS |s|rt          |          d         }|rt          |          nd|rt          |          n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%.3srw   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 3zz||*D11 	EKKNN*D*D11 	EKKNN*Dt,, 	3MM&5;;q>>1222
9~~mmooc{{F3KK'' $I $i  #)6$<<<T4+I6$<<<TIIr   c                    | d         | d         cxu rn ndS | d         | d         k    r%d                     d | d         D                       S | d         (dd                     d | d         D                       z   S | d         (d                     d | d         D                       dz   S d                     d	 | d         D                       dd                     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   rw   Nr   r   c              3   4   K   | ]}t          |          V  d S r   r$   r   s     r   r   zvrange_str.<locals>.<genexpr>v  (      221A222222r   c              3   4   K   | ]}t          |          V  d S r   r$   r   s     r   r   zvrange_str.<locals>.<genexpr>x  s(      88c!ff888888r   c              3   4   K   | ]}t          |          V  d S r   r$   r   s     r   r   zvrange_str.<locals>.<genexpr>z  r   r   c              3   4   K   | ]}t          |          V  d S r   r$   r   s     r   r   zvrange_str.<locals>.<genexpr>|  (      "="=a3q66"="="="="="=r   c              3   4   K   | ]}t          |          V  d S r   r$   r   s     r   r   zvrange_str.<locals>.<genexpr>}  r   r   )r0   )r   s    r   
vrange_strr   c  s%     ayF1I%%%%%%%%sayF1Ixx22q	222222		SXX88fQi8888888		xx22q	22222S88(("="=6!9"="="=====(("="=6!9"="="====? 	?r   c                    t          | t                    r| S t          | t          t          f          s:t          | d         t                    rd                    d | D                       S g }| D ]_}t          |t                    r|                    |           -|                    d                    d |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'
    r   r   c              3   4   K   | ]}t          |          V  d S r   r$   r   s     r   r   zvrepr.<locals>.<genexpr>  s(      ..1A......r   c              3   4   K   | ]}t          |          V  d S r   r$   r   s     r   r   zvrepr.<locals>.<genexpr>  s(      ";";a3q66";";";";";";r   )r.   r%   r   r   r   r0   append)r-   r?   versions      r   vreprr     s     % /s344 /E!Hc9R9R /xx........F = =gs## 	=MM'""""MM#((";";7";";";;;<<<<Mr   c                     | sdS t          | t                    r
| dd         S t          d |                     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   4   K   | ]}t          |          V  d S r   r   r   s     r   r   zgetver.<locals>.<genexpr>  s(      55AQ555555r   r   )r.   r   r   )r-   s    r   r   r     se      r% RaRy55S!!4!455555bqb99r   c                 P   g }g }t          |           D ]\}t          |t                    rt          |          }|t          k     r|                    |           G|                    |           ]|                    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## 	&WooGW((((MM'""""
MM(<(())) f V}}Mr   r   r   )&loggingr   osr   os.pathr   configparserr   typesr   RANGE_PATTERNcompiler   VERBOSEr4   	getLoggerrr   logrm   
_supported_default_configreadreplacer   r   r
   	Exception	exceptionr   r!   r   r   r   r   r   r   r   ru   r   r   <module>r      s  ,  				             % % % % % %      22:m$$RZ 
 % %
 g!! W[/00
7;+,, # #lnnGLL5666 A;;y*;<<QRR@ #[[,@AAWXr"" 	1e88HNN3$7$788888GG 1 1 1MM/0000011 6 6)//446 6 6 6 6II 1 1 1MM/000001b b b b b b b bJ% % % %P) ) )X(J (J (JV? ? ?:  2: : :&     s$   )(D D/.D/3(E E98E9