
    @dP:                         d dl Z d dl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        d          Zda G d d          Z G d	 d
          Zd Zd ZddZddZdS )    N)exists)	_defaultsz(-)?(\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+)?dhpythonc                   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        t          d          dS )	zConstruct a new instance.

        >>> Version(major=0, minor=0, micro=0, releaselevel=0, serial=0)
        Version('0.0')
        >>> Version('0.0')
        Version('0.0')
        .c              3   4   K   | ]}t          |          V  d S N)str).0is     (/usr/share/dh-python/dhpython/version.py	<genexpr>z#Version.__init__.<locals>.<genexpr>4   s(      33SVV333333    majorminormicroreleaselevelserialNselfvaluer   zmajor component is required)
isinstancetuplelistjoinr   setattrgetattrlocals
VERSION_REmatch	groupdictitemsintr   
ValueError)
r   r   r   r   r   r   r   namecompr"   s
             r   __init__zVersion.__init__*   sg    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$&&&&::;;; 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__H   s6     TZ:!ell4:...Fr   c                 :    t          t          |                     S r   )hashreprr   s    r   __hash__zVersion.__hash__U   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,   r   )r   r.   r'   r   s       r   __repr__zVersion.__repr__X   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__h   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%   r&   )r   r8   r.   news       r   __sub__zVersion.__sub__w   sp     :LLCJJ&LL,CCLLCJJ&LL,C77>???r   c                 x    	 t          |          }n# t          $ r Y dS w xY w|                     |          dk    S )NFr   )r   	Exception_Version__cmpr   r8   s     r   __eq__zVersion.__eq__   sM    	ENNEE 	 	 	55	zz%  A%%s    
  c                 4    |                      |          dk     S Nr   r?   r@   s     r   __lt__zVersion.__lt__       zz%  1$$r   c                 4    |                      |          dk    S rC   rD   r@   s     r   __le__zVersion.__le__       zz%  A%%r   c                 4    |                      |          dk    S rC   rD   r@   s     r   __gt__zVersion.__gt__   rF   r   c                 4    |                      |          dk    S rC   rD   r@   s     r   __ge__zVersion.__ge__   rI   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   r?   r@   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   rO   r   r   rQ   r@   s     r   
__rshift__zVersion.__rshift__   rS   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   r   get)r   r8   rP   r'   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/   r4   r6   r9   r<   rA   rE   rH   rK   rM   rR   rU   r?    r   r   r   r   (   s        AE+/< < < <<              && & &% % %& & &% % %& & &9 9 9*9 9 9*     r   r   c                   T    e Zd ZddZd Zd Zd Zed             Zed             Z	dS )	VersionRangeNc                     |rt          |          | _        nd | _        |rt          |          | _        nd | _        |r:|                     |          \  }}|r| j        || _        |r| j        || _        d S d S d S d S r   )r   minvermaxverparse)r   r   rj   rk   s       r   r)   zVersionRange.__init__   s     	!&//DKKDK 	!&//DKKDK 	%!ZZ..NFF %$+-$ %$+-$	% 	%% %--r   c                 &    | j         | j        dS dS )NTF)rj   rk   r3   s    r   __bool__zVersionRange.__bool__   s    ;"dk&=4ur   c                 >   | j         dcxu r	| j        u rn ndS | j         | j        k    rt          | j                   S | j         d                    | j                  S | j        d                    | j                   S d                    | j         | j                  S )a  Return version range string from given range.

        >>> str(VersionRange(minver='3.4'))
        '3.4-'
        >>> str(VersionRange(minver='3.4', maxver='3.6'))
        '3.4-3.6'
        >>> str(VersionRange(minver='3.4', maxver='4.0'))
        '3.4-4.0'
        >>> str(VersionRange(maxver='3.7'))
        '-3.7'
        >>> str(VersionRange(minver='3.5', maxver='3.5'))
        '3.5'
        >>> str(VersionRange())
        '-'
        N-z-{}z{}-z{}-{})rj   rk   r   r,   r3   s    r   r/   zVersionRange.__str__   s      ;$----$+-----3;$+%%t{###[ <<,,,[ <<,,,>>$+t{;;;r   c                     d}| j         |d                    | j                   z  }| j        |d                    | j                  z  }|                    dd          }|dz   S )zReturn version range string.

        >>> repr(VersionRange('5.0-'))
        "VersionRange(minver='5.0')"
        >>> repr(VersionRange('3.0-3.5'))
        "VersionRange(minver='3.0', maxver='3.5')"
        zVersionRange(Nzminver='{}'z, maxver='{}'z(, ())rj   r,   rk   replacer-   s     r   r6   zVersionRange.__repr__  sj     !;"m**4;777F;"o,,T[999Fs++|r   c                 @   | dv rdS t                               |           }|s?	 t                              |           \  }}n# t          $ r t          d| z            w xY w|                                }t          |                              d          dk    rt          |d                   }||fS dx}}|d         r	|d         }n|d         }|d         }|rt          |          nd}|rt          |          nd}|r|r||k    rt          d| z            ||fS )a[  Return minimum and maximum Python version from given range.

        >>> VersionRange.parse('3.0-')
        (Version('3.0'), None)
        >>> VersionRange.parse('3.1-3.13')
        (Version('3.1'), Version('3.13'))
        >>> VersionRange.parse('3.2-4.0')
        (Version('3.2'), Version('4.0'))
        >>> VersionRange.parse('-3.7')
        (None, Version('3.7'))
        >>> VersionRange.parse('3.2')
        (Version('3.2'), Version('3.2'))
        >>> VersionRange.parse('') == VersionRange.parse('-')
        True
        >>> VersionRange.parse('>= 4.0')
        (Version('4.0'), None)
        ) rp   NNzversion range is invalid: %sN      r   )
RANGE_REr"   rh   _parse_pycentralr>   r&   groupsr   countr   )r   r"   minvmaxvr|   s        r   rl   zVersionRange.parse  sZ   & I:u%% 	3I)::5AA
dd I I I !?%!GHHHI \\^^FF||!!$''1,,vay))Tz!D4ay !ayayay$(274===dD$(274===dD 	ED 	ETD[[;eCDDDTzs   A Ac                    dx}}t                      }|                     d          D ]}|                                }t          j        d|          }|r|                    d          }Ct          j        d|          }|r|                    d          }pt          j        d|          }|r(|                    |                    d                     t          |          dk    r2|                                }t          |          t          |          fS |s|rt          |          d         }|rt          |          nd|rt          |          ndfS )ay  Parse X-Python3-Version.

        >>> VersionRange._parse_pycentral('>= 3.10')
        (Version('3.10'), None)
        >>> VersionRange._parse_pycentral('<< 4.0')
        (None, Version('4.0'))
        >>> VersionRange._parse_pycentral('3.1')
        (Version('3.1'), Version('3.1'))
        >>> VersionRange._parse_pycentral('3.1, 3.2')
        (Version('3.1'), None)
        N,z>=\s*([\d\.]+)ry   z<<\s*([\d\.]+)z	^[\d\.]+$r   )setsplitstriprer"   groupaddlenpopr   sorted)r   r~   r   	hardcodeditemr"   vers          r   r{   zVersionRange._parse_pycentralM  sL    tEE	KK$$ 	. 	.D::<<DH-t44E {{1~~H-t44E {{1~~H[$//E .ekk!nn---y>>Q--//C3<<-- 	(	 	()$$Q'D $.wt}}}$0O4OOr   )NNN)
rc   rd   re   r)   rn   r/   r6   staticmethodrl   r{   rf   r   r   rh   rh      s        % % % %"  
< < <6    / / \/b 'P 'P \'P 'P 'Pr   rh   c                     | t           j        vrt          d| z            t           j        |          }t          |d         |d                   S )z<Return default interpreter version for given implementation.,interpreter implementation not supported: %rr   ry   r   r   )r   DEFAULTr&   r   )implr   s     r   defaultr   x  sL    9$$$G$NOOO

D
!CQs1v....r   c                 ~    | t           j        vrt          d| z            t           j        |          }d |D             S )zGReturn list of supported interpreter versions for given implementation.r   c                 H    g | ]}t          |d          |d                    S )r   ry   r   r   r   vs     r   
<listcomp>zsupported.<locals>.<listcomp>  s-    >>>G!A$ad+++>>>r   )r   	SUPPORTEDr&   )r   versionss     r   	supportedr     sE    9&&&G$NOOO"4(H>>X>>>>r   c                    t          |t                    rt          |          }|st          t	          |                     }n|j        t          dd          n|j        |j        t          dd          n|j        k    r0t          t	          |           v rgnt                                }n)t          fdt	          |           D                       }|t          ddl
m	a	 |r,t          |           t          fd|D                       }n/|d	u r+t          |           t          fd
|D                       }|S )aO  Return a set of requested and supported Python versions.

    :param impl: interpreter implementation
    :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('cpython3', '')) == sorted(supported('cpython3'))
    True
    >>> sorted(get_requested_versions('cpython3', '-')) == sorted(supported('cpython3'))
    True
    >>> get_requested_versions('cpython3', '>= 5.0')
    set()
    Nr   r   c   c              3   <   K   | ]}|cxk    rk     n n|V  d S r   rf   )r   r   r   r~   s     r   r   z)get_requested_versions.<locals>.<genexpr>  sD      JJ9I9I9I9IT9I9I9I9I9I19I9I9I9IJJr   )Interpreter)r   c              3   `   K   | ](}t                              |                    $|V  )d S r   r   binaryr   r   interpreters     r   r   z)get_requested_versions.<locals>.<genexpr>  sQ       9 9Q !3!3A!6!6779q 9 9 9 9 9 9r   Fc              3   `   K   | ](}t                              |                    $|V  )d S r   r   r   s     r   r   z)get_requested_versions.<locals>.<genexpr>  sQ       = =Q$[%7%7%:%:;;=q = = = = = =r   )r   r   rh   r   r   rj   r   rk   r   r   dhpython.interpreter)r   vrange	availabler   r   r   r~   s       @@@r   get_requested_versionsr     s     &# &f%% Ky'',2M,AwQa((((v}.4m.CwRr****4<<TYt__%<%<D66%''JJHHJJJJJiooJJJJJH 888888 =!t,,, 9 9 9 9( 9 9 9 9 9	e		!t,,, = = = =( = = = = = Or   cpython3c                     t          |          }t          d | D                       }	 |                    |           |                    |           n# t          $ r Y nw xY w|S )aO  Return sorted list of versions in a build friendly order.

    i.e. default version, if among versions, is sorted last.

    >>> build_sorted([(2, 6), (3, 4), default('cpython3'), (3, 6), (2, 7)])[-1] == default('cpython3')
    True
    >>> build_sorted(('3.2', (3, 0), '3.1'))
    [Version('3.0'), Version('3.1'), Version('3.2')]
    c              3   4   K   | ]}t          |          V  d S r   r   r   s     r   r   zbuild_sorted.<locals>.<genexpr>  s(      111GAJJ111111r   )r   r   removeappendr&   )r   r   default_verr.   s       r   build_sortedr     s     $--K1111111F#k""" 	k""""     Ms   A 
A"!A"rw   )r   )loggingr   os.pathr   r   r   RANGE_PATTERNcompilerz   VERBOSEr!   	getLoggerlogr   r   rh   r   r   r   r   rf   r   r   <module>r      sF  *  				            22:m$$RZ 
 % %
 g
##n n n n n n n nb\P \P \P \P \P \P \P \P~/ / /? ? ?+ + + +\     r   