U
    Hax                     @   s  d dl Z d dlZd dlZd dlZd dlZd dlmZmZmZm	Z	m
Z
mZmZmZmZmZmZ ddlmZ ddlmZmZmZ eeef Zeeeef ZededZeeegef ZG dd	 d	eZG d
d de jdZ G dd de Z!G dd de!Z"edeegef edeegef dddZ#G dd de!Z$e%dZ&ee
e dddZ'eedddZ(e
e e
e ee
e e
e f dddZ)G d d! d!e Z*dS )"    N)CallableDictIterableIteratorListOptionalPatternSetTupleTypeVarUnion   )canonicalize_version)LegacyVersionVersionparseVersionTypeVar)boundc                   @   s   e Zd ZdZdS )InvalidSpecifierzH
    An invalid specifier was found, users should refer to PEP 440.
    N)__name__
__module____qualname____doc__ r   r   8/tmp/pip-unpacked-wheel-j379e8h0/packaging/specifiers.pyr   !   s   r   c                   @   s   e Zd ZejedddZejedddZeje	e
dddZeje	e
dd	d
Zejee
 dddZeje
ddddZejdeee
 e
dddZejdee ee
 ee dddZdS )BaseSpecifierreturnc                 C   s   dS )z
        Returns the str representation of this Specifier like object. This
        should be representative of the Specifier itself.
        Nr   selfr   r   r   __str__(   s    zBaseSpecifier.__str__c                 C   s   dS )zF
        Returns a hash value for this Specifier like object.
        Nr   r   r   r   r   __hash__/   s    zBaseSpecifier.__hash__otherr   c                 C   s   dS )zq
        Returns a boolean representing whether or not the two Specifier like
        objects are equal.
        Nr   r   r#   r   r   r   __eq__5   s    zBaseSpecifier.__eq__c                 C   s   dS )zu
        Returns a boolean representing whether or not the two Specifier like
        objects are not equal.
        Nr   r$   r   r   r   __ne__<   s    zBaseSpecifier.__ne__c                 C   s   dS )zg
        Returns whether or not pre-releases as a whole are allowed by this
        specifier.
        Nr   r   r   r   r   prereleasesC   s    zBaseSpecifier.prereleasesNvaluer   c                 C   s   dS )zd
        Sets whether or not pre-releases as a whole are allowed by this
        specifier.
        Nr   r   r)   r   r   r   r'   J   s    itemr'   r   c                 C   s   dS )zR
        Determines if the given item is contained within this specifier.
        Nr   r   r,   r'   r   r   r   containsQ   s    zBaseSpecifier.containsiterabler'   r   c                 C   s   dS )z
        Takes an iterable of items and filters them so that only items which
        are contained within this specifier are allowed in it.
        Nr   )r   r0   r'   r   r   r   filterW   s    zBaseSpecifier.filter)N)N)r   r   r   abcabstractmethodstrr    intr!   objectboolr%   r&   abstractpropertyr   r'   setterr.   r   r   r1   r   r   r   r   r   '   s*     r   )	metaclassc                   @   sb  e Zd ZU i Zeeef ed< ee ed< d-eee	 ddddZ
edd	d
ZedddZeeeef dddZedddZee	dddZee	dddZeedddZeedddZeedddZeedddZeee	 dd d!Zeje	dd"d#d!Zee	d$d%d&Zd.eee	 e	d'd(d)Zd/e e! ee	 e e! d*d+d,Z"dS )0_IndividualSpecifier
_operators_regex Nspecr'   r   c                 C   sH   | j |}|s td| d|d |d f| _|| _d S )NzInvalid specifier: ''operatorversion)r=   searchr   groupstrip_spec_prereleases)r   r@   r'   matchr   r   r   __init__f   s    z_IndividualSpecifier.__init__r   c                 C   s0   | j d k	rd| jnd}d| jjt| |S )N, prereleases=r>   z<{}({!r}{})>)rH   r'   format	__class__r   r4   r   prer   r   r   __repr__s   s
    z_IndividualSpecifier.__repr__c                 C   s   dj | j S )Nz{}{})rL   rG   r   r   r   r   r    |   s    z_IndividualSpecifier.__str__c                 C   s   | j d t| j d fS )Nr   r   )rG   r   r   r   r   r   _canonical_spec   s    z$_IndividualSpecifier._canonical_specc                 C   s
   t | jS N)hashrQ   r   r   r   r   r!      s    z_IndividualSpecifier.__hash__r"   c                 C   sT   t |tr8z| t|}W qH tk
r4   t Y S X nt || jsHtS | j|jkS rR   )
isinstancer4   rM   r   NotImplementedrQ   r$   r   r   r   r%      s    
z_IndividualSpecifier.__eq__c                 C   sT   t |tr8z| t|}W qH tk
r4   t Y S X nt || jsHtS | j|jkS rR   )rT   r4   rM   r   rU   rG   r$   r   r   r   r&      s    
z_IndividualSpecifier.__ne__)opr   c                 C   s   t | d| j|  }|S )NZ	_compare_)getattrr<   )r   rV   operator_callabler   r   r   _get_operator   s
     z"_IndividualSpecifier._get_operatorrC   r   c                 C   s   t |ttfst|}|S rR   )rT   r   r   r   r   rC   r   r   r   _coerce_version   s    z$_IndividualSpecifier._coerce_versionc                 C   s
   | j d S )Nr   rG   r   r   r   r   rB      s    z_IndividualSpecifier.operatorc                 C   s
   | j d S )Nr   r]   r   r   r   r   rC      s    z_IndividualSpecifier.versionc                 C   s   | j S rR   rH   r   r   r   r   r'      s    z _IndividualSpecifier.prereleasesr(   c                 C   s
   || _ d S rR   r^   r*   r   r   r   r'      s    r,   r   c                 C   s
   |  |S rR   r.   r   r,   r   r   r   __contains__   s    z!_IndividualSpecifier.__contains__r+   c                 C   s>   |d kr| j }| |}|jr&|s&dS | | j}||| jS NF)r'   r\   is_prereleaserY   rB   rC   )r   r,   r'   normalized_itemrX   r   r   r   r.      s    

z_IndividualSpecifier.containsr/   c                 c   s   d}g }d|d k	r|ndi}|D ]B}|  |}| j|f|r |jrX|sX| jsX|| q d}|V  q |s||r||D ]
}|V  qpd S )NFr'   T)r\   r.   rd   r'   append)r   r0   r'   yieldedfound_prereleaseskwrC   parsed_versionr   r   r   r1      s"    
z_IndividualSpecifier.filter)r>   N)N)N)#r   r   r   r<   r   r4   __annotations__r   r   r7   rJ   rP   r    propertyr
   rQ   r5   r!   r6   r%   r&   CallableOperatorrY   UnparsedVersionParsedVersionr\   rB   rC   r'   r9   rb   r.   r   r   r1   r   r   r   r   r;   a   sB   
	    r;   c                       s   e Zd ZdZede d ejejB Zdddddd	d
Z	d e
ee dd fddZeedddZee
edddZee
edddZee
edddZee
edddZee
edddZee
edddZ  ZS )!LegacySpecifiera  
        (?P<operator>(==|!=|<=|>=|<|>))
        \s*
        (?P<version>
            [^,;\s)]* # Since this is a "legacy" specifier, and the version
                      # string can be just about anything, we match everything
                      # except for whitespace, a semi-colon for marker support,
                      # a closing paren since versions can be enclosed in
                      # them, and a comma since it's a version separator.
        )
        ^\s*\s*$equal	not_equalless_than_equalgreater_than_equal	less_thangreater_than)==!=<=>=<>r>   Nr?   c                    s   t  || tdt d S )NzZCreating a LegacyVersion has been deprecated and will be removed in the next major release)superrJ   warningswarnDeprecationWarning)r   r@   r'   rM   r   r   rJ     s
    zLegacySpecifier.__init__rZ   c                 C   s   t |tstt|}|S rR   )rT   r   r4   r[   r   r   r   r\     s    
zLegacySpecifier._coerce_versionprospectiver@   r   c                 C   s   ||  |kS rR   r\   r   r   r@   r   r   r   _compare_equal  s    zLegacySpecifier._compare_equalc                 C   s   ||  |kS rR   r   r   r   r   r   _compare_not_equal  s    z"LegacySpecifier._compare_not_equalc                 C   s   ||  |kS rR   r   r   r   r   r   _compare_less_than_equal"  s    z(LegacySpecifier._compare_less_than_equalc                 C   s   ||  |kS rR   r   r   r   r   r   _compare_greater_than_equal%  s    z+LegacySpecifier._compare_greater_than_equalc                 C   s   ||  |k S rR   r   r   r   r   r   _compare_less_than*  s    z"LegacySpecifier._compare_less_thanc                 C   s   ||  |kS rR   r   r   r   r   r   _compare_greater_than-  s    z%LegacySpecifier._compare_greater_than)r>   N)r   r   r   
_regex_strrecompileVERBOSE
IGNORECASEr=   r<   r4   r   r7   rJ   rn   r   r\   r   r   r   r   r   r   __classcell__r   r   r   r   rp      s(   		 rp   	Specifier)fnr   c                    s&   t  dtttd fdd}|S )Nr   )r   r   r@   r   c                    s   t |tsdS  | ||S rc   )rT   r   r   r   r   r   wrapped4  s    
z)_require_version_compare.<locals>.wrapped)	functoolswrapsro   r4   r7   )r   r   r   r   r   _require_version_compare1  s    r   c                	   @   s  e Zd ZdZede d ejejB Zdddddd	d
ddZ	e
eeedddZe
eeedddZe
eeedddZe
eeedddZe
eeedddZe
eeedddZe
eeedddZeeedddZeedd d!Zejed"d#d$d!Zd"S )%r   a  
        (?P<operator>(~=|==|!=|<=|>=|<|>|===))
        (?P<version>
            (?:
                # The identity operators allow for an escape hatch that will
                # do an exact string match of the version you wish to install.
                # This will not be parsed by PEP 440 and we cannot determine
                # any semantic meaning from it. This operator is discouraged
                # but included entirely as an escape hatch.
                (?<====)  # Only match for the identity operator
                \s*
                [^\s]*    # We just match everything, except for whitespace
                          # since we are only testing for strict identity.
            )
            |
            (?:
                # The (non)equality operators allow for wild card and local
                # versions to be specified so we have to define these two
                # operators separately to enable that.
                (?<===|!=)            # Only match for equals and not equals

                \s*
                v?
                (?:[0-9]+!)?          # epoch
                [0-9]+(?:\.[0-9]+)*   # release
                (?:                   # pre release
                    [-_\.]?
                    (a|b|c|rc|alpha|beta|pre|preview)
                    [-_\.]?
                    [0-9]*
                )?
                (?:                   # post release
                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
                )?

                # You cannot use a wild card and a dev or local version
                # together so group them with a | and make them optional.
                (?:
                    (?:[-_\.]?dev[-_\.]?[0-9]*)?         # dev release
                    (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local
                    |
                    \.\*  # Wild card syntax of .*
                )?
            )
            |
            (?:
                # The compatible operator requires at least two digits in the
                # release segment.
                (?<=~=)               # Only match for the compatible operator

                \s*
                v?
                (?:[0-9]+!)?          # epoch
                [0-9]+(?:\.[0-9]+)+   # release  (We have a + instead of a *)
                (?:                   # pre release
                    [-_\.]?
                    (a|b|c|rc|alpha|beta|pre|preview)
                    [-_\.]?
                    [0-9]*
                )?
                (?:                                   # post release
                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
                )?
                (?:[-_\.]?dev[-_\.]?[0-9]*)?          # dev release
            )
            |
            (?:
                # All other operators only allow a sub set of what the
                # (non)equality operators do. Specifically they do not allow
                # local versions to be specified nor do they allow the prefix
                # matching wild cards.
                (?<!==|!=|~=)         # We have special cases for these
                                      # operators so we want to make sure they
                                      # don't match here.

                \s*
                v?
                (?:[0-9]+!)?          # epoch
                [0-9]+(?:\.[0-9]+)*   # release
                (?:                   # pre release
                    [-_\.]?
                    (a|b|c|rc|alpha|beta|pre|preview)
                    [-_\.]?
                    [0-9]*
                )?
                (?:                                   # post release
                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
                )?
                (?:[-_\.]?dev[-_\.]?[0-9]*)?          # dev release
            )
        )
        rq   rr   
compatiblers   rt   ru   rv   rw   rx   	arbitrary)~=ry   rz   r{   r|   r}   r~   ===r   c                 C   sJ   d tttt|d d }|d7 }| d||oH| d||S )N..*r|   ry   )joinlist	itertools	takewhile_is_not_suffix_version_splitrY   )r   r   r@   prefixr   r   r   _compare_compatible  s     zSpecifier._compare_compatiblec           	      C   sz   | drVt|j}t|d d }tt|}|d t| }t||\}}||kS t|}|jsnt|j}||kS d S )Nr   )endswithr   publicr   r4   len_pad_versionlocal)	r   r   r@   
split_specsplit_prospectiveshortened_prospectivepadded_specpadded_prospectivespec_versionr   r   r   r     s    

 
zSpecifier._compare_equalc                 C   s   |  || S rR   )r   r   r   r   r   r     s    zSpecifier._compare_not_equalc                 C   s   t |jt |kS rR   r   r   r   r   r   r   r     s    z"Specifier._compare_less_than_equalc                 C   s   t |jt |kS rR   r   r   r   r   r   r     s    z%Specifier._compare_greater_than_equal)r   spec_strr   c                 C   s<   t |}||k sdS |js8|jr8t |jt |jkr8dS dS NFT)r   rd   base_versionr   r   r   r@   r   r   r   r     s    zSpecifier._compare_less_thanc                 C   s^   t |}||ksdS |js8|jr8t |jt |jkr8dS |jd k	rZt |jt |jkrZdS dS r   )r   is_postreleaser   r   r   r   r   r   r     s    
zSpecifier._compare_greater_thanc                 C   s   t | t | kS rR   )r4   lowerr   r   r   r   _compare_arbitrary7  s    zSpecifier._compare_arbitraryr   c                 C   sR   | j d k	r| j S | j\}}|dkrN|dkr@|dr@|d d }t|jrNdS dS )N)ry   r|   r{   r   r   ry   r   r   TF)rH   rG   r   r   rd   )r   rB   rC   r   r   r   r'   :  s    


zSpecifier.prereleasesNr(   c                 C   s
   || _ d S rR   r^   r*   r   r   r   r'   S  s    )r   r   r   r   r   r   r   r   r=   r<   r   ro   r4   r7   r   r   r   r   r   r   r   r   r   rl   r'   r9   r   r   r   r   r   =  sB   ]' 	z^([0-9]+)((?:a|b|c|rc)[0-9]+)$rZ   c                 C   s@   g }|  dD ],}t|}|r0||  q|| q|S )Nr   )split_prefix_regexrD   extendgroupsrf   )rC   resultr,   rI   r   r   r   r   [  s    
r   )segmentr   c                    s   t  fdddD  S )Nc                 3   s   | ]}  |V  qd S rR   )
startswith).0r   r   r   r   	<genexpr>g  s    z!_is_not_suffix.<locals>.<genexpr>)devabrcpost)anyr   r   r   r   r   f  s    r   )leftrightr   c              
   C   s   g g  }}| ttdd |  | ttdd | | | t|d d   | |t|d d   |ddgtdt|d t|d    |ddgtdt|d t|d    ttj| ttj| fS )Nc                 S   s   |   S rR   isdigitxr   r   r   <lambda>p      z_pad_version.<locals>.<lambda>c                 S   s   |   S rR   r   r   r   r   r   r   q  r   r   r   0)rf   r   r   r   r   insertmaxchain)r   r   
left_splitright_splitr   r   r   r   l  s    
,,r   c                   @   s  e Zd Zd%eee ddddZedddZedd	d
Ze	dddZ
ed ef d dddZeedddZeedddZe	dddZee dddZeee dddZejeddddZeedddZd&eee edd d!Zd'ee ee ee d"d#d$ZdS )(SpecifierSetr>   N)
specifiersr'   r   c              	   C   sn   dd | dD }t }|D ]:}z|t| W q tk
rV   |t| Y qX qt|| _|| _d S )Nc                 S   s   g | ]}|  r|  qS r   )rF   r   sr   r   r   
<listcomp>  s      z)SpecifierSet.__init__.<locals>.<listcomp>,)	r   setaddr   r   rp   	frozenset_specsrH   )r   r   r'   split_specifiersparsed	specifierr   r   r   rJ     s    
zSpecifierSet.__init__r   c                 C   s*   | j d k	rd| jnd}dt| |S )NrK   r>   z<SpecifierSet({!r}{})>)rH   r'   rL   r4   rN   r   r   r   rP     s
    zSpecifierSet.__repr__c                 C   s   d tdd | jD S )Nr   c                 s   s   | ]}t |V  qd S rR   )r4   r   r   r   r   r     s     z'SpecifierSet.__str__.<locals>.<genexpr>)r   sortedr   r   r   r   r   r      s    zSpecifierSet.__str__c                 C   s
   t | jS rR   )rS   r   r   r   r   r   r!     s    zSpecifierSet.__hash__r"   c                 C   s   t |trt|}nt |ts"tS t }t| j|jB |_| jd krX|jd k	rX|j|_n<| jd k	rv|jd krv| j|_n| j|jkr| j|_ntd|S )NzFCannot combine SpecifierSets with True and False prerelease overrides.)rT   r4   r   rU   r   r   rH   
ValueError)r   r#   r   r   r   r   __and__  s     





zSpecifierSet.__and__c                 C   s6   t |ttfrtt|}nt |ts*tS | j|jkS rR   rT   r4   r;   r   rU   r   r$   r   r   r   r%     s
    
zSpecifierSet.__eq__c                 C   s6   t |ttfrtt|}nt |ts*tS | j|jkS rR   r   r$   r   r   r   r&     s
    
zSpecifierSet.__ne__c                 C   s
   t | jS rR   )r   r   r   r   r   r   __len__  s    zSpecifierSet.__len__c                 C   s
   t | jS rR   )iterr   r   r   r   r   __iter__  s    zSpecifierSet.__iter__c                 C   s.   | j d k	r| j S | jsd S tdd | jD S )Nc                 s   s   | ]}|j V  qd S rR   r'   r   r   r   r   r     s     z+SpecifierSet.prereleases.<locals>.<genexpr>)rH   r   r   r   r   r   r   r'     s
    
zSpecifierSet.prereleasesr(   c                 C   s
   || _ d S rR   r^   r*   r   r   r   r'     s    r_   c                 C   s
   |  |S rR   r`   ra   r   r   r   rb     s    zSpecifierSet.__contains__r+   c                    sL   t  ttfst  d kr$| js2 jr2dS t fdd| jD S )NFc                 3   s   | ]}|j  d V  qdS )r   Nr`   r   r,   r'   r   r   r     s     z(SpecifierSet.contains.<locals>.<genexpr>)rT   r   r   r   r'   rd   allr   r-   r   r   r   r.     s    
zSpecifierSet.containsr/   c                 C   s   |d kr| j }| jr6| jD ]}|j|t|d}q|S g }g }|D ]P}t|ttfs^t|}n|}t|trnqB|jr|s|s|	| qB|	| qB|s|r|d kr|S |S d S )Nr   )
r'   r   r1   r7   rT   r   r   r   rd   rf   )r   r0   r'   r@   filteredrh   r,   rj   r   r   r   r1   	  s*    



zSpecifierSet.filter)r>   N)N)N)r   r   r   r4   r   r7   rJ   rP   r    r5   r!   r   r   r6   r%   r&   r   r   r;   r   rl   r'   r9   rn   rb   r.   r   r   r1   r   r   r   r   r   ~  s@       	    r   )+r2   r   r   r   r   typingr   r   r   r   r   r   r   r	   r
   r   r   utilsr   rC   r   r   r   ro   r4   rn   r   r7   rm   r   r   ABCMetar   r;   rp   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s6   4: =  
*