U
    +5øiZ ã                   @  s4  U d Z ddlmZ ddlZddlZ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 ddlmZ ddlmZmZ ejdkrªdd	l	mZ ne
rºdd	lmZ d
dddgZddœdd„Zdddœdd„Zdddœdd„ZedƒZeee f Z!ede!d�Z"eee ge#f Z$edƒZ%de&d < d!d!d"œd#d$„Z'G d%d&„ d&ej(ƒZ)ej*G d'd(„ d(ƒƒZ+ej*G d)d*„ d*ƒƒZ,ej*G d+d,„ d,ƒƒZ-e	j
�r´eee+df Z.e/e,e-f Z0e,dd-ƒZ1e-dd-ƒZ2e1e2ffZ3d.e&d/< d*d,d0d1œd2d3„Z4d4d4d5d6œd7d8„Z5d9d9d:œd;d<„Z6d9d9d:œd=d>„Z7d?d@d:œdAdB„Z8d9d9d:œdCdD„Z9d9d9d:œdEdF„Z:d9d9d:œdGdH„Z;dId@dJœdKdL„Z<G dMd„ de=ƒZ>G dNd
„ d
ej?dO�Z@G dPd„ de@ƒZAe BdQ¡ZCdRdSdTdUœdVdW„ZDdXdd:œdYdZ„ZEddXd[œd\d]„ZFdXd0d^œd_d`„ZGddadbœdcdd„ZHddaddeœdfdg„ZIdhdadiœdjdk„ZJG dld„ de@ƒZKdS )mzŠ
.. testsetup::

    from packaging.specifiers import Specifier, SpecifierSet, InvalidSpecifier
    from packaging.version import Version
é    )ÚannotationsN)	ÚTYPE_CHECKINGÚAnyÚCallableÚFinalÚIterableÚIteratorÚSequenceÚTypeVarÚUnioné   )Úcanonicalize_version)ÚInvalidVersionÚVersion)é   é
   )Ú	TypeGuardÚBaseSpecifierÚInvalidSpecifierÚ	SpecifierÚSpecifierSetz	list[str]©Úreturnc                   C  s   t S ©N)Ú__all__© r   r   ú8/tmp/pip-unpacked-wheel-xj899fla/packaging/specifiers.pyÚ__dir__0   s    r   ÚobjectzTypeGuard[tuple[str, str]]©Úspecr   c                C  s2   t | tƒo0t| ƒdko0t | d tƒo0t | d tƒS )Né   r   r   )Ú
isinstanceÚtupleÚlenÚstr)r    r   r   r   Ú_validate_spec4   s    

ÿþür&   zTypeGuard[bool | None])Úprer   c                C  s   | d kpt | tƒS r   )r"   Úbool)r'   r   r   r   Ú_validate_pre=   s    r)   ÚTÚUnparsedVersionVar)Úboundz0.dev0zFinal[Version]Ú_MIN_VERSIONztuple[int, ...])Úreleaser   c                 C  sF   t | ƒ}|dkr*| |d  dkr*|d8 }q|t | ƒkr:| S | d|… S )zDStrip trailing zeros from a release tuple for normalized comparison.r   r   N)r$   )r.   Úendr   r   r   Ú_trim_releaseJ   s    
r0   c                   @  s    e Zd ZdZe ¡ Ze ¡ ZdS )Ú_BoundaryKindz5Where a boundary marker sits in the version ordering.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚenumÚautoÚAFTER_LOCALSÚAFTER_POSTSr   r   r   r   r1   R   s   r1   c                   @  sr   e Zd ZdZdZddddœdd„Zdd	d
œdd„Zdd	d
œdd„Zdd	d
œdd„Zddœdd„Z	ddœdd„Z
dS )Ú_BoundaryVersiona  A point on the version line between two real PEP 440 versions.

    Some specifier semantics imply boundaries between real versions:
    ``<=1.0`` includes ``1.0+local`` and ``>1.0`` excludes
    ``1.0.post0``.  No real :class:`Version` falls on those boundaries,
    so this class creates values that sort between the real versions
    on either side.

    Two kinds exist, shown relative to a base version V::

        V < V+local < AFTER_LOCALS(V) < V.post0 < AFTER_POSTS(V)

    ``AFTER_LOCALS`` sits after V and every V+local, but before
    V.post0.  Upper bound of ``<=V``, ``==V``, ``!=V``.

    ``AFTER_POSTS`` sits after every V.postN, but before the next
    release segment.  Lower bound of ``>V`` (final or pre-release V)
    to exclude post-releases per PEP 440.
    )Ú_kindÚ_trimmed_releaseÚversionr   r1   ÚNone)r=   Úkindr   c                 C  s   || _ || _t|jƒ| _d S r   )r=   r;   r0   r.   r<   )Úselfr=   r?   r   r   r   Ú__init__q   s    z_BoundaryVersion.__init__r(   ©Úotherr   c                 C  sl   | j }|j|jkr.t|jƒ| jkr.|j|jks2dS | jtjkrV|j	|j	koT|j
|j
kS |j
|j
kpj|j	dk	S )z6Is ``other`` a version that this boundary sorts above?FN)r=   Úepochr0   r.   r<   r'   r;   r1   r8   ÚpostÚdev)r@   rC   Úvr   r   r   Ú
_is_familyv   s    
ÿþ
ýz_BoundaryVersion._is_familyr   c                 C  s&   t |tƒr"| j|jko | j|jkS tS r   )r"   r:   r=   r;   ÚNotImplemented©r@   rC   r   r   r   Ú__eq__…   s    
z_BoundaryVersion.__eq__z_BoundaryVersion | Versionc                 C  sH   t |tƒr2| j|jkr"| j|jk S | jj|jjk S |  |¡ oF| j|k S r   )r"   r:   r=   r;   ÚvaluerH   rJ   r   r   r   Ú__lt__Š   s
    
z_BoundaryVersion.__lt__Úintr   c                 C  s   t | j| jfƒS r   )Úhashr=   r;   ©r@   r   r   r   Ú__hash__‘   s    z_BoundaryVersion.__hash__r%   c                 C  s    | j j› d| j›d| jj› d�S )Nú(z, ú))Ú	__class__r2   r=   r;   ÚnamerP   r   r   r   Ú__repr__”   s    z_BoundaryVersion.__repr__N)r2   r3   r4   r5   Ú	__slots__rA   rH   rK   rM   rQ   rV   r   r   r   r   r:   Y   s   r:   c                   @  sb   e Zd ZdZdZddddœdd„Zd	dd
œdd„Zd dd
œdd„Zddœdd„Zddœdd„Z	dS )Ú_LowerBoundzÂLower bound of a version range.

    A version *v* of ``None`` means unbounded below (-inf).
    At equal versions, ``[v`` sorts before ``(v`` because an inclusive
    bound starts earlier.
    ©Ú	inclusiver=   Ú_VersionOrBoundaryr(   r>   ©r=   rZ   r   c                 C  s   || _ || _d S r   ©r=   rZ   ©r@   r=   rZ   r   r   r   rA   £   s    z_LowerBound.__init__r   rB   c                 C  s&   t |tƒstS | j|jko$| j|jkS r   ©r"   rX   rI   r=   rZ   rJ   r   r   r   rK   §   s    
z_LowerBound.__eq__c                 C  sV   t |tƒstS | jd kr"|jd k	S |jd kr0dS | j|jkrH| j|jk S | joT|j S )NFr_   rJ   r   r   r   rM   ¬   s    



z_LowerBound.__lt__rN   r   c                 C  s   t | j| jfƒS r   ©rO   r=   rZ   rP   r   r   r   rQ   ¹   s    z_LowerBound.__hash__r%   c                 C  s*   | j r
dnd}d| jj› d|› | j›d�S )Nú[rR   ú<ú ú>©rZ   rT   r2   r=   ©r@   Zbracketr   r   r   rV   ¼   s    z_LowerBound.__repr__N©
r2   r3   r4   r5   rW   rA   rK   rM   rQ   rV   r   r   r   r   rX   ˜   s   rX   c                   @  sb   e Zd ZdZdZddddœdd„Zd	dd
œdd„Zd dd
œdd„Zddœdd„Zddœdd„Z	dS )Ú_UpperBoundzÀUpper bound of a version range.

    A version *v* of ``None`` means unbounded above (+inf).
    At equal versions, ``v)`` sorts before ``v]`` because an exclusive
    bound ends earlier.
    rY   r[   r(   r>   r\   c                 C  s   || _ || _d S r   r]   r^   r   r   r   rA   Ì   s    z_UpperBound.__init__r   rB   c                 C  s&   t |tƒstS | j|jko$| j|jkS r   ©r"   rh   rI   r=   rZ   rJ   r   r   r   rK   Ð   s    
z_UpperBound.__eq__c                 C  sP   t |tƒstS | jd krdS |jd kr*dS | j|jkrB| j|jk S | j oN|jS ©NFTri   rJ   r   r   r   rM   Õ   s    


z_UpperBound.__lt__rN   r   c                 C  s   t | j| jfƒS r   r`   rP   r   r   r   rQ   â   s    z_UpperBound.__hash__r%   c                 C  s*   | j r
dnd}d| jj› d| j›|› d�S )Nú]rS   rb   rc   rd   re   rf   r   r   r   rV   å   s    z_UpperBound.__repr__Nrg   r   r   r   r   rh   Á   s   rh   Fztuple[_VersionRange]Ú_FULL_RANGEr(   )ÚlowerÚupperr   c                 C  s>   | j dks|j dkrdS | j |j kr2| jo.|j S | j |j kS )zHTrue when the range defined by *lower* and *upper* contains no versions.NFr]   )rm   rn   r   r   r   Ú_range_is_emptyö   s
    ro   úSequence[_VersionRange]úlist[_VersionRange])ÚleftÚrightr   c                 C  sˆ   g }d }}|t | ƒk r„|t |ƒk r„| | \}}|| \}}t||ƒ}	t||ƒ}
t|	|
ƒsh| |	|
f¡ ||k rz|d7 }q|d7 }q|S )zFIntersect two sorted, non-overlapping range lists (two-pointer merge).r   r   )r$   ÚmaxÚminro   Úappend)rr   rs   ÚresultZ
left_indexZright_indexZ
left_lowerZ
left_upperZright_lowerZright_upperrm   rn   r   r   r   Ú_intersect_rangesÿ   s    




rx   r   ©r=   r   c                 C  s0   | j dd… | j d d f˜}tj| j|dd�S )z5Smallest version in the next prefix: 1.2 -> 1.3.dev0.Néÿÿÿÿr   r   ©rD   r.   rF   )r.   r   Ú
from_partsrD   )r=   r.   r   r   r   Ú_next_prefix_dev0  s    r}   c                 C  s   t j| j| jdd�S )z7The .dev0 of a version's base release: 1.2 -> 1.2.dev0.r   r{   )r   r|   rD   r.   ©r=   r   r   r   Ú
_base_dev0  s    r   ÚUnparsedVersionúVersion | Nonec                 C  s2   t | tƒs.zt| ƒ} W n tk
r,   Y d S X | S r   )r"   r   r   r~   r   r   r   Ú_coerce_version$  s    
r‚   c                 C  s   | j d kr| S | jd d�S )N)Úlocal)rƒ   Ú__replace__r~   r   r   r   Ú_public_version-  s    
r…   c                 C  s   | j dddd�S )zyThe version that *version* is a post-release of.

    1.0.post1 -> 1.0, 1.0a1.post0 -> 1.0a1, 1.0.post0.dev1 -> 1.0.
    N©rE   rF   rƒ   ©r„   r~   r   r   r   Ú
_post_base3  s    rˆ   c                 C  s   | j ddd�S )zZEarliest pre-release of *version*.

    1.2 -> 1.2.dev0, 1.2.post1 -> 1.2.post1.dev0.
    r   N©rF   rƒ   r‡   r~   r   r   r   Ú_earliest_prerelease;  s    rŠ   r[   )rG   r   c                 C  sr   | dkrdS t | tƒrX| j}|jr2|jdddd�S |jdk	rF|jd nd}|j|dd�S | jsb| S | jdddd�S )z:Smallest non-pre-release version at or above *v*, or None.N)r'   rF   rƒ   r   r   )rE   rƒ   )r"   r:   r=   Úis_prereleaser„   rE   )rG   ÚinnerÚkr   r   r   Ú_nearest_non_prereleaseC  s    
rŽ   c                   @  s   e Zd ZdZdS )r   a  
    Raised when attempting to create a :class:`Specifier` with a specifier
    string that is invalid.

    >>> Specifier("lolwat")
    Traceback (most recent call last):
        ...
    packaging.specifiers.InvalidSpecifier: Invalid specifier: 'lolwat'
    N)r2   r3   r4   r5   r   r   r   r   r   X  s   c                   @  s   e Zd ZdZdZeddœdd„ƒZejddœdd„ƒZ	ejd	dœd
d„ƒZ
ejdddœdd„ƒZeejddœdd„ƒƒZejdddœdd„ƒZejd)ddddœdd„ƒZejd*dddddœdd „ƒZejd+d!dd"d#dœd$d „ƒZejd,d%dd&d'dœd(d „ƒZdS )-r   r   )Ú_strr%   r   c                 C  s   t | ƒS )z Internal property for match_args©r%   rP   r   r   r   r�   h  s    zBaseSpecifier._strc                 C  s   dS )zŽ
        Returns the str representation of this Specifier-like object. This
        should be representative of the Specifier itself.
        Nr   rP   r   r   r   Ú__str__m  s    zBaseSpecifier.__str__rN   c                 C  s   dS )zF
        Returns a hash value for this Specifier-like object.
        Nr   rP   r   r   r   rQ   t  s    zBaseSpecifier.__hash__r   r(   rB   c                 C  s   dS )z«
        Returns a boolean representing whether or not the two Specifier-like
        objects are equal.

        :param other: The other object to check against.
        Nr   rJ   r   r   r   rK   z  s    zBaseSpecifier.__eq__úbool | Nonec                 C  s   dS )zîWhether or not pre-releases as a whole are allowed.

        This can be set to either ``True`` or ``False`` to explicitly enable or disable
        prereleases or it can be set to ``None`` (the default) to use default semantics.
        Nr   rP   r   r   r   Úprereleasesƒ  s    zBaseSpecifier.prereleasesr>   ©rL   r   c                 C  s   dS )zQSetter for :attr:`prereleases`.

        :param value: The value to set.
        Nr   ©r@   rL   r   r   r   r“   Œ  s    N©Ú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   Úcontains“  s    zBaseSpecifier.contains.úIterable[UnparsedVersionVar]úIterator[UnparsedVersionVar]©Úiterabler“   Úkeyr   c                 C  s   d S r   r   ©r@   r�   r“   rž   r   r   r   Úfilter™  s    zBaseSpecifier.filterúIterable[T]úCallable[[T], UnparsedVersion]úIterator[T]c                 C  s   d S r   r   rŸ   r   r   r   r    ¡  s    úIterable[Any]ú'Callable[[Any], UnparsedVersion] | NoneúIterator[Any]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Ÿ   r   r   r   r    ©  s    )N)N.)N.)NN)r2   r3   r4   rW   Z__match_args__Úpropertyr�   ÚabcÚabstractmethodr‘   rQ   rK   r“   Úsetterr™   ÚtypingÚoverloadr    r   r   r   r   r   d  s:     ü  ü  ü)Ú	metaclassc                	   @  s’  e Zd ZU d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ded< dwddddœdd„Zdddœdd„Zdddœdd„Zdd œd!d"„Zddd#d$œd%d&„Zddd#d$œd'd(„Zedd œd)d*„ƒZejddd+œd,d*„ƒZd-d œd.d/„Zd0dd1œd2d3„Zedd œd4d5„ƒZedd œd6d7„ƒZdd œd8d9„Zdd œd:d;„Zed<d œd=d>„ƒZd?d œd@dA„Zd0dBdCœdDdE„ZddFdGœdHdI„ZdddBdJœdKdL„Z ddMdNœdOdP„Z!dddBdJœdQdR„Z"dddBdJœdSdT„Z#dddBdJœdUdV„Z$dddBdJœdWdX„Z%dddBdYœdZd[„Z&dddBdYœd\d]„Z'd^ddBdJœd_d`„Z(dadBdbœdcdd„Z)dxdeddBdfœdgdh„Z*e+j,dydjdddkdlœdmdn„ƒZ-e+j,dzdoddpdqdlœdrdn„ƒZ-d{dsddtdudlœdvdn„Z-dS )|r   aí  This class abstracts handling of version specifiers.

    .. tip::

        It is generally not required to instantiate this manually. You should instead
        prefer to work with :class:`SpecifierSet` instead, which can parse
        comma-separated version specifiers (which is what package metadata contains).

    Instances are safe to serialize with :mod:`pickle`. They use a stable
    format so the same pickle can be loaded in future packaging releases.

    .. versionchanged:: 26.2

        Added a stable pickle format. Pickles created with packaging 26.2+ can
        be unpickled with future releases.  Backward compatibility with pickles
        from packaging < 26.2 is supported but may be removed in a future
        release.
    )Ú_prereleasesÚ_rangesÚ_specÚ_spec_versionÚ_wildcard_splita  
        (?:
            (?:
                # 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;)]*  # The arbitrary version can be just about anything,
                          # we match everything except for whitespace, a
                          # semi-colon for marker support, and a closing paren
                          # since versions can be enclosed in them.
            )
            |
            (?:
                # 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

                # You cannot use a wild card and a pre-release, post-release, a dev or
                # local version together so group them with a | and make them optional.
                (?:
                    \.\*  # Wild card syntax of .*
                    |
                    (?a:                                  # pre release
                        [-_\.]?
                        (alpha|beta|preview|pre|a|b|c|rc)
                        [-_\.]?
                        [0-9]*
                    )?
                    (?a:                                  # post release
                        (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
                    )?
                    (?a:[-_\.]?dev[-_\.]?[0-9]*)?         # dev release
                    (?a:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local
                )?
            )
            |
            (?:
                # 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
                    [-_\.]?
                    (alpha|beta|preview|pre|a|b|c|rc)
                    [-_\.]?
                    [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.
                (?:<=|>=|<|>)

                \s*
                v?
                (?:[0-9]+!)?          # epoch
                [0-9]+(?:\.[0-9]+)*   # release
                (?a:                   # pre release
                    [-_\.]?
                    (alpha|beta|preview|pre|a|b|c|rc)
                    [-_\.]?
                    [0-9]*
                )?
                (?a:                                   # post release
                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
                )?
                (?a:[-_\.]?dev[-_\.]?[0-9]*)?          # dev release
            )
        )
        z\s*Ú
compatibleÚequalÚ	not_equalÚless_than_equalÚgreater_than_equalÚ	less_thanÚgreater_thanÚ	arbitrary)ú~=ú==ú!=ú<=ú>=rb   rd   ú===r   Ú
_operatorsÚ Nr%   r’   r>   )r    r“   r   c                 C  sº   | j  |¡std|›�ƒ‚| ¡ }| d¡rL|dd… |dd…  ¡  }}nH| d¡rv|dd… |dd…  ¡  }}n|dd… |dd…  ¡  }}||f| _|| _d| _d| _d| _	dS )að  Initialize a Specifier instance.

        :param spec:
            The string representation of a specifier which will be parsed and
            normalized before use.
        :param prereleases:
            This tells the specifier if it should accept prerelease versions if
            applicable or not. The default of ``None`` will autodetect it from the
            given specifiers.
        :raises InvalidSpecifier:
            If the given specifier is invalid (i.e. bad syntax).
        zInvalid specifier: rÀ   Nr   )r»   r¼   r½   r¾   r¿   r!   r   )
Ú_regexÚ	fullmatchr   ÚstripÚ
startswithr°   r®   r±   r²   r¯   )r@   r    r“   Úoperatorr=   r   r   r   rA   =  s    
 
 
zSpecifier.__init__r�   ry   c                 C  sD   | j dk	r"| j d |kr"| j d S t|ƒ}|dkr6dS ||f| _ |S )zDOne element cache, as only one spec Version is needed per Specifier.Nr   r   )r±   r‚   )r@   r=   Zversion_specifierr   r   r   Ú_get_spec_versionc  s    

zSpecifier._get_spec_versionr   c                 C  s   |   |¡}|dk	st‚|S )zÕGet spec version, asserting it's valid (not for === operator).

        This method should only be called for operators where version
        strings are guaranteed to be valid PEP 440 versions (not ===).
        N)rÈ   ÚAssertionError)r@   r=   Úspec_versionr   r   r   Ú_require_spec_versiono  s    
zSpecifier._require_spec_versionrp   r   c                 C  s\   | j dk	r| j S | j}| j}|dkr.t| _ tS | d¡rF|  ||¡}n|  ||¡}|| _ |S )zØConvert this specifier to sorted, non-overlapping version ranges.

        Each standard operator maps to one or two ranges.  ``===`` is
        modeled as full range (actual check done separately).  Cached.
        NrÀ   ú.*)r¯   rÇ   r=   rl   ÚendswithÚ_wildcard_rangesÚ_standard_ranges)r@   ÚopÚver_strrw   r   r   r   Ú
_to_rangesy  s    

zSpecifier._to_rangesrq   )rÐ   rÑ   r   c                 C  s\   |   |d d… ¡}t|ƒ}t|ƒ}|dkr@t|dƒt|dƒfgS tt|dƒft|dƒtfgS )Néþÿÿÿr¼   TF)rË   r   r}   rX   rh   Ú_NEG_INFÚ_POS_INF)r@   rÐ   rÑ   Úbaserm   rn   r   r   r   rÎ   ‘  s    þzSpecifier._wildcard_rangesc           
      C  s°  |   |¡}|dkr"t|dƒtfgS |dkrBttt|tjƒdƒfgS |dkrÀ|jd k	rx|j	|jd d d�}t|dƒtfgS |j
d k	r¨|j	|j
d dd d�}t|dƒtfgS tt|tjƒd	ƒtfgS |d
krü|jrÒ|n|j	dd d�}|tkrìg S tt|d	ƒfgS d|k}t|tjƒ}|�r|n|}|dk�r>t|dƒt|dƒfgS |dk�rdtt|d	ƒft|d	ƒtfgS |dk�rž|j	|jd d… d�}	t|dƒtt|	ƒd	ƒfgS td|›�ƒ‚d S )Nr¿   Tr¾   rd   r   r‰   r   r†   Frb   ú+r¼   r½   r»   rz   )r.   úUnknown operator: )rË   rX   rÕ   rÔ   rh   r:   r1   r8   rF   r„   rE   r9   r‹   r-   r.   r}   Ú
ValueError)
r@   rÐ   rÑ   rG   Z	lower_verr,   Z	has_localZafter_localsrn   Úprefixr   r   r   rÏ   ž  sL    
þÿ

þÿ

þ
ÿzSpecifier._standard_rangesc                 C  sX   | j d k	r| j S | j\}}|dkr&dS |dkr<| d¡r<dS |  |¡}|d krRd S |jS )Nr½   Fr¼   rÌ   )r®   r°   rÍ   rÈ   r‹   )r@   rÇ   Úversion_strr=   r   r   r   r“   Ü  s    


zSpecifier.prereleasesr”   c                 C  s
   || _ d S r   )r®   r•   r   r   r   r“   ø  s    z#tuple[tuple[str, str], bool | None]c                 C  s   | j | jfS r   )r°   r®   rP   r   r   r   Ú__getstate__ü  s    zSpecifier.__getstate__r   ©Ústater   c                 C  sú   d | _ d | _d | _t|tƒr¨t|ƒdkrP|\}}t|ƒrPt|ƒrP|| _|| _	d S t|ƒdkr¨t|d t
ƒr¨|\}}| d¡}| dd¡}t|ƒr¨t|ƒr¨|| _|| _	d S t|t
ƒrè| d¡}| dd¡}t|ƒrèt|ƒrè|| _|| _	d S td|›�ƒ‚d S )Nr!   r   r°   r®   ÚinvalidzCannot restore Specifier from )r±   r²   r¯   r"   r#   r$   r&   r)   r°   r®   ÚdictÚgetÚ	TypeError)r@   rÞ   r    r“   Ú_Ú	slot_dictr   r   r   Ú__setstate__  s4    



zSpecifier.__setstate__c                 C  s
   | j d S )z`The operator of this specifier.

        >>> Specifier("==1.2.3").operator
        '=='
        r   ©r°   rP   r   r   r   rÇ   $  s    zSpecifier.operatorc                 C  s
   | j d S )zaThe version of this specifier.

        >>> Specifier("==1.2.3").version
        '1.2.3'
        r   ræ   rP   r   r   r   r=   -  s    zSpecifier.versionc                 C  s8   | j dk	rd| j›�nd}d| jj› dt| ƒ›|› d�S )aT  A representation of the Specifier that shows all internal state.

        >>> Specifier('>=1.0.0')
        <Specifier('>=1.0.0')>
        >>> Specifier('>=1.0.0', prereleases=False)
        <Specifier('>=1.0.0', prereleases=False)>
        >>> Specifier('>=1.0.0', prereleases=True)
        <Specifier('>=1.0.0', prereleases=True)>
        Nú, prereleases=rÂ   rb   rR   ú)>©r®   r“   rT   r2   r%   ©r@   r'   r   r   r   rV   6  s
    ÿýzSpecifier.__repr__c                 C  s   dj | jŽ S )zÐA string representation of the Specifier that can be round-tripped.

        >>> str(Specifier('>=1.0.0'))
        '>=1.0.0'
        >>> str(Specifier('>=1.0.0', prereleases=False))
        '>=1.0.0'
        z{}{})Úformatr°   rP   r   r   r   r‘   H  s    zSpecifier.__str__ztuple[str, str]c                 C  sF   | j \}}|dks| d¡r$||fS |  |¡}t||dkd�}||fS )NrÀ   rÌ   r»   ©Zstrip_trailing_zero)r°   rÍ   rË   r   )r@   rÇ   r=   rÊ   Zcanonical_versionr   r   r   Ú_canonical_specR  s    

 ÿzSpecifier._canonical_specrN   c                 C  s
   t | jƒS r   )rO   rí   rP   r   r   r   rQ   `  s    zSpecifier.__hash__r(   rB   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 )a>  Whether or not the two Specifier-like objects are equal.

        :param other: The other object to check against.

        The value of :attr:`prereleases` is ignored.

        >>> Specifier("==1.2.3") == Specifier("== 1.2.3.0")
        True
        >>> (Specifier("==1.2.3", prereleases=False) ==
        ...  Specifier("==1.2.3", prereleases=True))
        True
        >>> Specifier("==1.2.3") == "==1.2.3"
        True
        >>> Specifier("==1.2.3") == Specifier("==1.2.4")
        False
        >>> Specifier("==1.2.3") == Specifier("~=1.2.3")
        False
        )r"   r%   rT   r   rI   rí   rJ   r   r   r   rK   c  s    
zSpecifier.__eq__ÚCallableOperator)rÐ   r   c                 C  s   t | d| j| › �ƒ}|S )NZ	_compare_)ÚgetattrrÁ   )r@   rÐ   Úoperator_callabler   r   r   Ú_get_operator€  s
     ÿzSpecifier._get_operator)Úprospectiver    r   c                 C  s@   t tt tt|ƒ¡ƒd d… ƒ}|d7 }|  ||¡o>|  ||¡S )Nrz   rÌ   )Ú_version_joinÚlistÚ	itertoolsÚ	takewhileÚ_is_not_suffixÚ_version_splitÚ_compare_greater_than_equalÚ_compare_equal)r@   rò   r    rÚ   r   r   r   Ú_compare_compatible†  s    	ÿ
ÿzSpecifier._compare_compatibleztuple[list[str], int]r   c                 C  s@   | j }|dkr<t|dd… dd�}t|ƒ}|t|ƒf}|| _ |S )zýCached split of a wildcard spec into components and numeric length.

        >>> Specifier("==1.*")._get_wildcard_split("1.*")
        (['0', '1'], 2)
        >>> Specifier("==3.10.*")._get_wildcard_split("3.10.*")
        (['0', '3', '10'], 3)
        NrÓ   Frì   )r²   r   rø   Ú_numeric_prefix_len)r@   r    Zwildcard_splitÚ
normalizedÚ
split_specr   r   r   Ú_get_wildcard_splitš  s    zSpecifier._get_wildcard_splitc           
      C  sv   |  d¡rR|  |¡\}}tt|ƒdd�}t|ƒ}t||ƒ}|d t|ƒ… }||kS |  |¡}	|	jsjt|ƒ}||	kS d S )NrÌ   Frì   )	rÍ   rÿ   r   r…   rø   Ú	_left_padr$   rË   rƒ   )
r@   rò   r    rþ   Zspec_numeric_lenZnormalized_prospectiveÚsplit_prospectiveÚpadded_prospectiveÚshortened_prospectiverÊ   r   r   r   rú   ª  s    
 ÿ

zSpecifier._compare_equalc                 C  s   |   ||¡ S r   )rú   ©r@   rò   r    r   r   r   Ú_compare_not_equalÎ  s    zSpecifier._compare_not_equalc                 C  s   t |ƒ|  |¡kS r   ©r…   rË   r  r   r   r   Ú_compare_less_than_equalÑ  s    z"Specifier._compare_less_than_equalc                 C  s   t |ƒ|  |¡kS r   r  r  r   r   r   rù   ×  s    z%Specifier._compare_greater_than_equal)rò   Úspec_strr   c                 C  s6   |   |¡}||k sdS |js2|jr2|t|ƒkr2dS dS rj   )rË   r‹   rŠ   ©r@   rò   r  r    r   r   r   Ú_compare_less_thanÝ  s    
ÿþ
ýzSpecifier._compare_less_thanc                 C  sP   |   |¡}||ksdS |js2|jr2t|ƒ|kr2dS |jd k	rLt|ƒ|krLdS dS rj   )rË   Úis_postreleaserˆ   rƒ   r…   r	  r   r   r   Ú_compare_greater_thanö  s    
ÿþ
ýzSpecifier._compare_greater_thanzVersion | strc                 C  s   t |ƒ ¡ t |ƒ ¡ kS r   ©r%   rm   r  r   r   r   Ú_compare_arbitrary  s    zSpecifier._compare_arbitraryzstr | Version©r—   r   c                 C  s
   |   |¡S )a:  Return whether or not the item is contained in this specifier.

        :param item: The item to check for.

        This is used for the ``in`` operator and behaves the same as
        :meth:`contains` with no ``prereleases`` argument passed.

        >>> "1.2.3" in Specifier(">=1.2.3")
        True
        >>> Version("1.2.3") in Specifier(">=1.2.3")
        True
        >>> "1.0.0" in Specifier(">=1.2.3")
        False
        >>> "1.3.0a1" in Specifier(">=1.2.3")
        True
        >>> "1.3.0a1" in Specifier(">=1.2.3", prereleases=True)
        True
        ©r™   ©r@   r—   r   r   r   Ú__contains__  s    zSpecifier.__contains__r€   r–   c                 C  s   t t| j|g|d�ƒƒS )as  Return whether or not the item is contained in this specifier.

        :param item:
            The item to check for, which can be a version string or a
            :class:`Version` instance.
        :param prereleases:
            Whether or not to match prereleases with this Specifier. If set to
            ``None`` (the default), it will follow the recommendation from
            :pep:`440` and match prereleases, as there are no other versions.

        >>> Specifier(">=1.2.3").contains("1.2.3")
        True
        >>> Specifier(">=1.2.3").contains(Version("1.2.3"))
        True
        >>> Specifier(">=1.2.3").contains("1.0.0")
        False
        >>> Specifier(">=1.2.3").contains("1.3.0a1")
        True
        >>> Specifier(">=1.2.3", prereleases=False).contains("1.3.0a1")
        False
        >>> Specifier(">=1.2.3").contains("1.3.0a1")
        True
        ©r“   )r(   rô   r    r˜   r   r   r   r™   .  s    zSpecifier.contains.rš   r›   rœ   c                 C  s   d S r   r   rŸ   r   r   r   r    I  s    zSpecifier.filterr¡   r¢   r£   c                 C  s   d S r   r   rŸ   r   r   r   r    Q  s    r¤   r¥   r¦   c                 c  s  g }d}|dk	r|n| j }|  | j¡}|D ]¼}t|dkr<|n||ƒƒ}	d}
|	dkrr| jdkr¨|  || j¡r¨|V  n6| jdkrœ|  |dkrŒ|n||ƒ| j¡}
n||	| jƒ}
|
r*|	dk	r*|	jr¾|rÊd}|V  q*|dkr*| jdk	r*| |¡ q*|�s|dk�r| jdk	�r|E dH  dS )a€  Filter items in the given iterable, that match the specifier.

        :param iterable:
            An iterable that can contain version strings and :class:`Version` instances.
            The items in the iterable will be filtered according to the specifier.
        :param prereleases:
            Whether or not to allow prereleases in the returned iterator. If set to
            ``None`` (the default), it will follow the recommendation from :pep:`440`
            and match prereleases if there are no other versions.
        :param key:
            A callable that takes a single argument (an item from the iterable) and
            returns a version string or :class:`Version` instance to be used for
            filtering.

        >>> list(Specifier(">=1.2.3").filter(["1.2", "1.3", "1.5a1"]))
        ['1.3']
        >>> list(Specifier(">=1.2.3").filter(["1.2", "1.2.3", "1.3", Version("1.4")]))
        ['1.2.3', '1.3', <Version('1.4')>]
        >>> list(Specifier(">=1.2.3").filter(["1.2", "1.5a1"]))
        ['1.5a1']
        >>> list(Specifier(">=1.2.3").filter(["1.3", "1.5a1"], prereleases=True))
        ['1.3', '1.5a1']
        >>> list(Specifier(">=1.2.3", prereleases=True).filter(["1.3", "1.5a1"]))
        ['1.3', '1.5a1']
        >>> list(Specifier(">=1.2.3").filter(
        ... [{"ver": "1.2"}, {"ver": "1.3"}],
        ... key=lambda x: x["ver"]))
        [{'ver': '1.3'}]
        FNrÀ   T)	r“   rñ   rÇ   r‚   r  r=   r‹   r®   rv   )r@   r�   r“   rž   Zprereleases_versionsZfound_non_prereleasesZinclude_prereleasesrð   r=   Úparsed_versionÚmatchr   r   r   r    Y  sB    #ÿ ÿ
 ÿ
ÿþý)rÂ   N)N)N.)N.)NN).r2   r3   r4   r5   rW   Z_specifier_regex_strÚreÚcompileÚVERBOSEÚ
IGNORECASErÃ   rÁ   Ú__annotations__rA   rÈ   rË   rÒ   rÎ   rÏ   r§   r“   rª   rÜ   rå   rÇ   r=   rV   r‘   rí   rQ   rK   rñ   rû   rÿ   rú   r  r  rù   r
  r  r  r  r™   r«   r¬   r    r   r   r   r   r   ¶  sz   
\
 
ÿø&
>"
$   ü  ü
  üz([0-9]+)((?:a|b|c|rc)[0-9]+)r¤   r¥   r¦   )r�   rž   r   c                 c  s˜   g }g }d}| D ]t}t |dkr"|n||ƒƒ}|dkrV|r@|V  q| |¡ | |¡ q|jsv|sn|E dH  d}|V  q|s| |¡ q|s”|E dH  dS )z?Filter per PEP 440: exclude prereleases unless no finals exist.FNT)r‚   rv   r‹   )r�   rž   Zall_nonfinalZarbitrary_stringsZfound_finalr—   Úparsedr   r   r   Ú_pep440_filter_prereleases®  s*    


r  r%   c                 C  s^   g }|   d¡\}}}| |pd¡ | d¡D ],}t |¡}|rN| | ¡ ¡ q,| |¡ q,|S )a  Split version into components.

    The split components are intended for version comparison. The logic does
    not attempt to retain the original version string, so joining the
    components back with :func:`_version_join` may not produce the original
    version string.
    ú!Ú0Ú.)Ú
rpartitionrv   ÚsplitÚ_prefix_regexrÄ   ÚextendÚgroups)r=   rw   rD   rã   Úrestr—   r  r   r   r   rø   Ø  s    
rø   )Ú
componentsr   c                 C  s   | ^}}|› dd  |¡› �S )zñJoin split version components into a version string.

    This function assumes the input came from :func:`_version_split`, where the
    first component must be the epoch (either empty or numeric), and all other
    components numeric.
    r  r  )Újoin)r&  rD   r%  r   r   r   ró   î  s    ró   )Úsegmentr   c                   s   t ‡ fdd„dD ƒƒ S )Nc                 3  s   | ]}ˆ   |¡V  qd S r   )rÆ   )Ú.0rÚ   ©r(  r   r   Ú	<genexpr>ú  s    z!_is_not_suffix.<locals>.<genexpr>)rF   ÚaÚbÚrcrE   )Úanyr*  r   r*  r   r÷   ù  s    ÿr÷   rN   )r!  r   c                 C  s&   d}| D ]}|  ¡ s q"|d7 }q|S )zƒCount leading numeric components in a :func:`_version_split` result.

    >>> _numeric_prefix_len(["0", "1", "2", "a1"])
    3
    r   r   )Úisdigit)r!  Úcountr(  r   r   r   rü   ÿ  s    
rü   )r!  Útarget_numeric_lenr   c                 C  s<   t | ƒ}|| }|dkr| S | d|… dg| | |d… •S )zÝPad a :func:`_version_split` result with ``"0"`` segments to reach
    ``target_numeric_len`` numeric components.  Suffix segments are preserved.

    >>> _left_pad(["0", "1", "a1"], 4)
    ['0', '1', '0', '0', 'a1']
    r   Nr  )rü   )r!  r2  Znumeric_lenZ
pad_neededr   r   r   r     s
    r   z!tuple[CallableOperator, str, str])Úop_entryr   c                 C  st   | \}}}|dkr$|  d¡s dS dS |dkr0dS |dkr<dS |dkrV|  d¡sRd	S d
S |dkrbdS td|›�ƒ‚dS )aL  Sort key for Cost Based Ordering of specifier operators in _filter_versions.

    Operators run sequentially on a shrinking candidate set, so operators that
    reject the most versions should run first to minimize work for later ones.

    Tier 0: Exact equality (==, ===), likely to narrow candidates to one version
    Tier 1: Range checks (>=, <=, >, <), cheap and usually reject a large portion
    Tier 2: Wildcard equality (==.*) and compatible release (~=), more expensive
    Tier 3: Exact !=, cheap but rarely rejects
    Tier 4: Wildcard !=.*, expensive and rarely rejects
    r¼   rÌ   r   r!   )r¿   r¾   rd   rb   r   r»   r½   r   é   rÀ   rØ   N)rÍ   rÙ   )r3  rã   ÚverrÐ   r   r   r   Ú_operator_cost  s    
r6  c                   @  s¤  e Zd ZdZdZdOddddœd	d
„Zddœdd„Zeddœdd„ƒZej	dddœdd„ƒZddœdd„Z
dddœdd„Zddœdd„Zddœdd„Zddœd d!„Zd"d d#œd$d%„Zdd&d#œd'd(„Zddœd)d*„Zd+dœd,d-„Zd.dœd/d0„Zd&dœd1d2„Zd&dœd3d4„Zd&dœd5d6„Zd7d&d8œd9d:„ZdPd7ddd&d;œd<d=„ZejdQd?ddd@dAœdBdC„ƒZejdRdDddEdFdAœdGdC„ƒZdSdHddIdJdAœdKdC„ZdTdHdIddJdLœdMdN„ZdS )Ur   a…  This class abstracts handling of a set of version specifiers.

    It can be passed a single specifier (``>=3.0``), a comma-separated list of
    specifiers (``>=3.0,!=3.1``), or no specifier at all.

    Instances are safe to serialize with :mod:`pickle`. They use a stable
    format so the same pickle can be loaded in future packaging
    releases.

    .. versionchanged:: 26.2

        Added a stable pickle format. Pickles created with
        packaging 26.2+ can be unpickled with future releases.
        Backward compatibility with pickles from
        packaging < 26.2 is supported but may be removed in a future
        release.
    )Ú_canonicalizedÚ_has_arbitraryÚ_is_unsatisfiabler®   Ú_resolved_opsÚ_specsrÂ   Nzstr | Iterable[Specifier]r’   r>   )Ú
specifiersr“   r   c                 C  s€   t |tƒr:dd„ | d¡D ƒ}ttt|ƒƒ| _d|k| _n t|ƒ| _tdd„ | jD ƒƒ| _t	| jƒdk| _
d| _|| _d| _dS )	a´  Initialize a SpecifierSet instance.

        :param specifiers:
            The string representation of a specifier or a comma-separated list of
            specifiers which will be parsed and normalized before use.
            May also be an iterable of ``Specifier`` instances, which will be used
            as is.
        :param prereleases:
            This tells the SpecifierSet if it should accept prerelease versions if
            applicable or not. The default of ``None`` will autodetect it from the
            given specifiers.

        :raises InvalidSpecifier:
            If the given ``specifiers`` are not parseable than this exception will be
            raised.
        c                 S  s   g | ]}|  ¡ r|  ¡ ‘qS r   )rÅ   ©r)  Úsr   r   r   Ú
<listcomp>k  s      z)SpecifierSet.__init__.<locals>.<listcomp>ú,rÀ   c                 s  s   | ]}d t |ƒkV  qdS ©rÀ   Nr�   r=  r   r   r   r+  t  s     z(SpecifierSet.__init__.<locals>.<genexpr>r   N)r"   r%   r!  r#   Úmapr   r;  r8  r/  r$   r7  r:  r®   r9  )r@   r<  r“   Úsplit_specifiersr   r   r   rA   R  s    

zSpecifierSet.__init__ztuple[Specifier, ...]r   c                 C  s8   | j s2tt t| jtd�¡ƒ| _d| _ d| _d| _| jS )zBDeduplicate, sort, and cache specs for order-sensitive operations.©rž   TN)	r7  r#   rà   ÚfromkeysÚsortedr;  r%   r:  r9  rP   r   r   r   Ú_canonical_specs  s    zSpecifierSet._canonical_specsc                 C  s6   | j d k	r| j S | jsd S tdd„ | jD ƒƒr2dS d S )Nc                 s  s   | ]}|j V  qd S r   r  r=  r   r   r   r+  —  s     z+SpecifierSet.prereleases.<locals>.<genexpr>T)r®   r;  r/  rP   r   r   r   r“   ˆ  s    
zSpecifierSet.prereleasesr”   c                 C  s   || _ d | _d S r   )r®   r9  r•   r   r   r   r“   œ  s    z)tuple[tuple[Specifier, ...], bool | None]c                 C  s   | j | jfS r   )r;  r®   rP   r   r   r   rÜ   ¡  s    zSpecifierSet.__getstate__r   rÝ   c                 C  sè  d | _ d | _t|tƒ�r8t|ƒdkr‚|\}}t|tƒr‚tdd„ |D ƒƒr‚t|ƒr‚|| _|| _t|ƒdk| _	t
dd„ |D ƒƒ| _d S t|ƒdk�r8t|d tƒ�r8|\}}| dd¡}| d¡}t|tƒrØtt|td	�ƒ}t|tƒ�r8td
d„ |D ƒƒ�r8t|ƒ�r8|| _|| _t| jƒdk| _	t
dd„ | jD ƒƒ| _d S t|tƒ�rÖ| dd¡}| d¡}t|tƒ�rvtt|td	�ƒ}t|tƒ�rÖtdd„ |D ƒƒ�rÖt|ƒ�rÖ|| _|| _t| jƒdk| _	t
dd„ | jD ƒƒ| _d S td|›�ƒ‚d S )Nr!   c                 s  s   | ]}t |tƒV  qd S r   ©r"   r   r=  r   r   r   r+  ²  s     z,SpecifierSet.__setstate__.<locals>.<genexpr>r   c                 s  s   | ]}d t |ƒkV  qdS rA  r�   r=  r   r   r   r+  ¸  s     r;  r   r®   rD  c                 s  s   | ]}t |tƒV  qd S r   rH  r=  r   r   r   r+  Ä  s     c                 s  s   | ]}d t |ƒkV  qdS rA  r�   r=  r   r   r   r+  Ê  s     c                 s  s   | ]}t |tƒV  qd S r   rH  r=  r   r   r   r+  Õ  s     c                 s  s   | ]}d t |ƒkV  qdS rA  r�   r=  r   r   r   r+  Û  s     z!Cannot restore SpecifierSet from )r:  r9  r"   r#   r$   Úallr)   r;  r®   r7  r/  r8  rà   rá   Ú	frozensetrF  r%   râ   )r@   rÞ   Úspecsr“   rã   rä   r   r   r   rå   §  sd    ÿþý

ÿþý
ÿþýzSpecifierSet.__setstate__r%   c                 C  s8   | j dk	rd| j›�nd}d| jj› dt| ƒ›|› d�S )a  A representation of the specifier set that shows all internal state.

        Note that the ordering of the individual specifiers within the set may not
        match the input string.

        >>> SpecifierSet('>=1.0.0,!=2.0.0')
        <SpecifierSet('!=2.0.0,>=1.0.0')>
        >>> SpecifierSet('>=1.0.0,!=2.0.0', prereleases=False)
        <SpecifierSet('!=2.0.0,>=1.0.0', prereleases=False)>
        >>> SpecifierSet('>=1.0.0,!=2.0.0', prereleases=True)
        <SpecifierSet('!=2.0.0,>=1.0.0', prereleases=True)>
        Nrç   rÂ   rb   rR   rè   ré   rê   r   r   r   rV   à  s
    ÿýzSpecifierSet.__repr__c                 C  s   d  dd„ |  ¡ D ƒ¡S )an  A string representation of the specifier set that can be round-tripped.

        Note that the ordering of the individual specifiers within the set may not
        match the input string.

        >>> str(SpecifierSet(">=1.0.0,!=1.0.1"))
        '!=1.0.1,>=1.0.0'
        >>> str(SpecifierSet(">=1.0.0,!=1.0.1", prereleases=False))
        '!=1.0.1,>=1.0.0'
        r@  c                 s  s   | ]}t |ƒV  qd S r   r�   r=  r   r   r   r+     s     z'SpecifierSet.__str__.<locals>.<genexpr>)r'  rG  rP   r   r   r   r‘   õ  s    zSpecifierSet.__str__rN   c                 C  s   t |  ¡ ƒS r   )rO   rG  rP   r   r   r   rQ     s    zSpecifierSet.__hash__zSpecifierSet | strrB   c                 C  sš   t |tƒrt|ƒ}nt |tƒs"tS tƒ }| j|j |_t|jƒdk|_| jpP|j|_d|_| j	dksp| j	|j	krz|j	|_	n|j	dkrŽ| j	|_	nt
dƒ‚|S )a‚  Return a SpecifierSet which is a combination of the two sets.

        :param other: The other object to combine with.

        >>> SpecifierSet(">=1.0.0,!=1.0.1") & '<=2.0.0,!=2.0.1'
        <SpecifierSet('!=1.0.1,!=2.0.1,<=2.0.0,>=1.0.0')>
        >>> SpecifierSet(">=1.0.0,!=1.0.1") & SpecifierSet('<=2.0.0,!=2.0.1')
        <SpecifierSet('!=1.0.1,!=2.0.1,<=2.0.0,>=1.0.0')>
        r   NzFCannot combine SpecifierSets with True and False prerelease overrides.)r"   r%   r   rI   r;  r$   r7  r8  r:  r®   rÙ   )r@   rC   Ú	specifierr   r   r   Ú__and__  s"    






ÿzSpecifierSet.__and__r(   c                 C  s:   t |ttfƒrtt|ƒƒ}nt |tƒs*tS |  ¡ | ¡ kS )a¡  Whether or not the two SpecifierSet-like objects are equal.

        :param other: The other object to check against.

        The value of :attr:`prereleases` is ignored.

        >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0,!=1.0.1")
        True
        >>> (SpecifierSet(">=1.0.0,!=1.0.1", prereleases=False) ==
        ...  SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True))
        True
        >>> SpecifierSet(">=1.0.0,!=1.0.1") == ">=1.0.0,!=1.0.1"
        True
        >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0")
        False
        >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0,!=1.0.2")
        False
        )r"   r%   r   r   rI   rG  rJ   r   r   r   rK   &  s
    
zSpecifierSet.__eq__c                 C  s
   t | jƒS )z7Returns the number of specifiers in this specifier set.)r$   r;  rP   r   r   r   Ú__len__@  s    zSpecifierSet.__len__zIterator[Specifier]c                 C  s
   t | jƒS )zð
        Returns an iterator over all the underlying :class:`Specifier` instances
        in this specifier set.

        >>> sorted(SpecifierSet(">=1.0.0,!=1.0.1"), key=str)
        [<Specifier('!=1.0.1')>, <Specifier('>=1.0.0')>]
        )Úiterr;  rP   r   r   r   Ú__iter__D  s    zSpecifierSet.__iter__rp   c                 C  sP   | j }d}|D ],}|dkr$| ¡ }qt|| ¡ ƒ}|s q<q|dkrLtdƒ‚|S )a  Intersect all specifiers into a single list of version ranges.

        Returns an empty list when unsatisfiable.  ``===`` specs are
        modeled as full range; string matching is checked separately
        by :meth:`_check_arbitrary_unsatisfiable`.
        Nz _get_ranges called with no specs)r;  rÒ   rx   ÚRuntimeError)r@   rK  rw   r>  r   r   r   Ú_get_rangesN  s    
zSpecifierSet._get_rangesc                 C  sX   | j }|dk	r|S | js"d| _ dS |  ¡  }|s8|  ¡ }|sN| jdkrN|  ¡ }|| _ |S )a¦  Check whether this specifier set can never be satisfied.

        Returns True if no version can satisfy all specifiers simultaneously.

        >>> SpecifierSet(">=2.0,<1.0").is_unsatisfiable()
        True
        >>> SpecifierSet(">=1.0,<2.0").is_unsatisfiable()
        False
        >>> SpecifierSet("").is_unsatisfiable()
        False
        >>> SpecifierSet("==1.0,!=1.0").is_unsatisfiable()
        True
        NF)r9  r;  rR  Ú_check_arbitrary_unsatisfiabler“   Ú_check_prerelease_only_ranges)r@   Úcachedrw   r   r   r   Úis_unsatisfiabled  s    
zSpecifierSet.is_unsatisfiablec                 C  s^   |   ¡ D ]P\}}t|jƒ}|dkr( dS |jdks<||jk rB dS ||jkr|jr dS qdS )z€With prereleases=False, check if every range contains only
        pre-release versions (which would be excluded from matching).NFT)rR  rŽ   r=   rZ   )r@   rm   rn   Znearestr   r   r   rT  …  s    
z*SpecifierSet._check_prerelease_only_rangesc                   s®   dd„ | j D ƒ}|sdS |d j ¡ ‰t‡fdd„|dd… D ƒƒrHd	S t|d jƒ‰ | jdkrrˆ dk	rrˆ jrrd	S d
d„ | j D ƒ}|sŠdS ˆ dkr–d	S t‡ fdd„|D ƒƒ S )a  Check === (arbitrary equality) specs for unsatisfiability.

        === uses case-insensitive string comparison, so the only candidate
        that can match ``===V`` is the literal string V.  This method
        checks whether that candidate is excluded by other specifiers.
        c                 S  s   g | ]}|j d kr|‘qS ©rÀ   ©rÇ   r=  r   r   r   r?  ™  s     
 z?SpecifierSet._check_arbitrary_unsatisfiable.<locals>.<listcomp>Fr   c                 3  s   | ]}|j  ¡ ˆ kV  qd S r   )r=   rm   r=  )Úfirstr   r   r+  Ÿ  s     z>SpecifierSet._check_arbitrary_unsatisfiable.<locals>.<genexpr>r   NTc                 S  s   g | ]}|j d kr|‘qS rW  rX  r=  r   r   r   r?  ¯  s     
 c                 3  s   | ]}|  ˆ ¡V  qd S r   r  r=  )Ú	candidater   r   r+  ·  s     )r;  r=   rm   r/  r‚   r“   r‹   rI  )r@   rº   Ústandardr   )rZ  rY  r   rS  ’  s(    ÿþýz+SpecifierSet._check_arbitrary_unsatisfiabler€   r  c                 C  s
   |   |¡S )aq  Return whether or not the item is contained in this specifier.

        :param item: The item to check for.

        This is used for the ``in`` operator and behaves the same as
        :meth:`contains` with no ``prereleases`` argument passed.

        >>> "1.2.3" in SpecifierSet(">=1.0.0,!=1.0.1")
        True
        >>> Version("1.2.3") in SpecifierSet(">=1.0.0,!=1.0.1")
        True
        >>> "1.0.1" in SpecifierSet(">=1.0.0,!=1.0.1")
        False
        >>> "1.3.0a1" in SpecifierSet(">=1.0.0,!=1.0.1")
        True
        >>> "1.3.0a1" in SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True)
        True
        r  r  r   r   r   r  ¹  s    zSpecifierSet.__contains__)r—   r“   Ú	installedr   c                 C  sX   t |ƒ}|dk	r|r|jrd}|dks6| jr<t|tƒs<|}n|}tt| j|g|d�ƒƒS )a‡  Return whether or not the item is contained in this SpecifierSet.

        :param item:
            The item to check for, which can be a version string or a
            :class:`Version` instance.
        :param prereleases:
            Whether or not to match prereleases with this SpecifierSet. If set to
            ``None`` (the default), it will follow the recommendation from :pep:`440`
            and match prereleases, as there are no other versions.
        :param installed:
            Whether or not the item is installed. If set to ``True``, it will
            accept prerelease versions even if the specifier does not allow them.

        >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.2.3")
        True
        >>> SpecifierSet(">=1.0.0,!=1.0.1").contains(Version("1.2.3"))
        True
        >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.0.1")
        False
        >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.3.0a1")
        True
        >>> SpecifierSet(">=1.0.0,!=1.0.1", prereleases=False).contains("1.3.0a1")
        False
        >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.3.0a1", prereleases=True)
        True
        NTr  )r‚   r‹   r8  r"   r   r(   rô   r    )r@   r—   r“   r\  r=   Z
check_itemr   r   r   r™   Î  s     zSpecifierSet.contains.rš   r›   rœ   c                 C  s   d S r   r   rŸ   r   r   r   r    û  s    zSpecifierSet.filterr¡   r¢   r£   c                 C  s   d S r   r   rŸ   r   r   r   r      s    r¤   r¥   r¦   c                   s¸   |dkr| j dk	r| j }| jr‚t| jƒdkrP| jd j||dkrDdn|ˆ d�}n| j|ˆ |dkrddn|d�}|dk	rx|S t|ˆ ƒS |dkr’t|ƒS |dkr®‡ ‡fdd	„|D ƒS t|ˆ ƒS )
ac  Filter items in the given iterable, that match the specifiers in this set.

        :param iterable:
            An iterable that can contain version strings and :class:`Version` instances.
            The items in the iterable will be filtered according to the specifier.
        :param prereleases:
            Whether or not to allow prereleases in the returned iterator. If set to
            ``None`` (the default), it will follow the recommendation from :pep:`440`
            and match prereleases if there are no other versions.
        :param key:
            A callable that takes a single argument (an item from the iterable) and
            returns a version string or :class:`Version` instance to be used for
            filtering.

        >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.3", "1.5a1"]))
        ['1.3']
        >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.3", Version("1.4")]))
        ['1.3', <Version('1.4')>]
        >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.5a1"]))
        ['1.5a1']
        >>> list(SpecifierSet(">=1.2.3").filter(["1.3", "1.5a1"], prereleases=True))
        ['1.3', '1.5a1']
        >>> list(SpecifierSet(">=1.2.3", prereleases=True).filter(["1.3", "1.5a1"]))
        ['1.3', '1.5a1']
        >>> list(SpecifierSet(">=1.2.3").filter(
        ... [{"ver": "1.2"}, {"ver": "1.3"}],
        ... key=lambda x: x["ver"]))
        [{'ver': '1.3'}]

        An "empty" SpecifierSet will filter items based on the presence of prerelease
        versions in the set.

        >>> list(SpecifierSet("").filter(["1.3", "1.5a1"]))
        ['1.3']
        >>> list(SpecifierSet("").filter(["1.5a1"]))
        ['1.5a1']
        >>> list(SpecifierSet("", prereleases=True).filter(["1.3", "1.5a1"]))
        ['1.3', '1.5a1']
        >>> list(SpecifierSet("").filter(["1.3", "1.5a1"], prereleases=True))
        ['1.3', '1.5a1']
        Nr   r   T)r“   rž   r  Fc                 3  s8   | ]0}t ˆ d kr|nˆ |ƒƒ ‰d ks,ˆjs|V  qd S r   )r‚   r‹   )r)  r—   ©rž   r=   r   r   r+  ^  s   ÿûz&SpecifierSet.filter.<locals>.<genexpr>)r“   r;  r$   r    Ú_filter_versionsr  rO  )r@   r�   r“   rž   Úfilteredr   r]  r   r      s0    2
ýý
þ)r�   rž   r“   r   c                 #  sª   | j dkr$tdd„ | jD ƒtd�| _ | j }|dk}|D ]n‰ tˆdkrHˆ nˆˆ ƒƒ‰ˆdkrxt‡ fdd„|D ƒƒr¤ˆ V  q6|r„ˆjr„q6t‡ ‡‡fdd„|D ƒƒr6ˆ V  q6dS )a?  Filter versions against all specifiers in a single pass.

        Uses Cost Based Ordering: specifiers are sorted by _operator_cost so
        that cheap range operators reject versions early, avoiding expensive
        wildcard or compatible operators on versions that would have been
        rejected anyway.
        Nc                 s  s$   | ]}|  |j¡|j|jfV  qd S r   )rñ   rÇ   r=   )r)  r    r   r   r   r+  {  s   ÿz0SpecifierSet._filter_versions.<locals>.<genexpr>rD  Fc                 3  s0   | ](\}}}|d ko&t ˆ ƒ ¡ | ¡ kV  qdS rA  r  )r)  rã   r5  rÐ   )r—   r   r   r+  ‰  s   ÿc                 3  sJ   | ]B\}}}|d kr8t ˆdkr"ˆ nˆˆ ƒƒ ¡ | ¡ kn|ˆ|ƒV  qdS rA  r  )r)  Zop_fnr5  rÐ   ©r—   rž   r  r   r   r+  �  s   þÿ&)r:  rF  r;  r6  r‚   rI  r‹   )r@   r�   rž   r“   ÚopsZexclude_prereleasesr   r`  r   r^  k  s,    
þûþ
üzSpecifierSet._filter_versions)rÂ   N)NN)N.)N.)NN)N)r2   r3   r4   r5   rW   rA   rG  r§   r“   rª   rÜ   rå   rV   r‘   rQ   rM  rK   rN  rP  rR  rV  rT  rS  r  r™   r«   r¬   r    r^  r   r   r   r   r   6  sP     ý-	9!
!'  ü-  ü  ü
  üd ü)Lr5   Ú
__future__r   r¨   r6   Ú	functoolsrõ   r  Úsysr«   r   r   r   r   r   r   r	   r
   r   Úutilsr   r=   r   r   Úversion_infor   Ztyping_extensionsr   r   r&   r)   r*   r%   r€   r+   r(   rî   r-   r  r0   ÚEnumr1   Útotal_orderingr:   rX   rh   r[   r#   Z_VersionRangerÔ   rÕ   rl   ro   rx   r}   r   r‚   r…   rˆ   rŠ   rŽ   rÙ   r   ÚABCMetar   r   r  r"  r  rø   ró   r÷   rü   r   r6  r   r   r   r   r   Ú<module>   sˆ   ,
ü	>((

		R     z
*