o
    üÞhwœ  ã                   @  s  d Z ddlm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 ddlmZ ddlmZ eeef Ze
ded	�Zeeegef Zd*dd„ZG dd„ deƒZG dd„ dejd�ZG dd„ deƒZe d¡Zd+dd„Zd,dd„Zd-d!d"„Zd.d&d'„Z G d(d)„ d)eƒZ!dS )/zŠ
.. testsetup::

    from packaging.specifiers import Specifier, SpecifierSet, InvalidSpecifier
    from packaging.version import Version
é    )ÚannotationsN)ÚCallableÚIterableÚIteratorÚTypeVarÚUnioné   )Úcanonicalize_version)ÚVersionÚUnparsedVersionVar)ÚboundÚversionÚUnparsedVersionÚreturnr
   c                 C  s   t | tƒs	t| ƒ} | S ©N)Ú
isinstancer
   )r   © r   úT/var/www/html/premium_crap/venv/lib/python3.10/site-packages/packaging/specifiers.pyÚ_coerce_version   s   
r   c                   @  s   e Zd ZdZdS )ÚInvalidSpecifiera  
    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)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r       s    r   c                   @  s†   e Zd Zejddd„ƒZejddd„ƒZejddd„ƒZeejd dd„ƒƒZ	e	j
d!dd„ƒZ	ejd"d#dd„ƒZej	d"d$dd„ƒZdS )%ÚBaseSpecifierr   Ústrc                 C  ó   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__-   ó    zBaseSpecifier.__str__Úintc                 C  r   )zF
        Returns a hash value for this Specifier-like object.
        Nr   r   r   r   r   Ú__hash__4   r    zBaseSpecifier.__hash__ÚotherÚobjectÚboolc                 C  r   )z«
        Returns a boolean representing whether or not the two Specifier-like
        objects are equal.

        :param other: The other object to check against.
        Nr   ©r   r#   r   r   r   Ú__eq__:   r    zBaseSpecifier.__eq__úbool | Nonec                 C  r   )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   r   r   r   r   ÚprereleasesC   r    zBaseSpecifier.prereleasesÚvalueÚNonec                 C  r   )zQSetter for :attr:`prereleases`.

        :param value: The value to set.
        Nr   ©r   r*   r   r   r   r)   L   r    NÚitemr)   c                 C  r   )zR
        Determines if the given item is contained within this specifier.
        Nr   )r   r-   r)   r   r   r   ÚcontainsS   r    zBaseSpecifier.containsÚiterableúIterable[UnparsedVersionVar]úIterator[UnparsedVersionVar]c                 C  r   )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   r   ÚfilterY   r    zBaseSpecifier.filter©r   r   ©r   r!   ©r#   r$   r   r%   ©r   r(   ©r*   r%   r   r+   r   )r-   r   r)   r(   r   r%   ©r/   r0   r)   r(   r   r1   )r   r   r   ÚabcÚabstractmethodr   r"   r'   Úpropertyr)   Úsetterr.   r2   r   r   r   r   r   ,   s"    ÿr   )Ú	metaclassc                	   @  sH  e Zd ZdZdZdZe de e d ejej	B ¡Z
dddd	d
ddddœZdSdTdd„ZedUdd„ƒZejdVdd„ƒZedWdd„ƒZedWd d!„ƒZdWd"d#„ZdWd$d%„ZedXd'd(„ƒZdYd*d+„ZdZd.d/„Zd[d2d3„Zd\d6d7„Zd\d8d9„Zd\d:d;„Zd\d<d=„Zd\d>d?„Zd]dAdB„Zd]dCdD„Zd\dEdF„Zd^dIdJ„Z d_d`dLdM„Z!	d_dadQdR„Z"dS )bÚ	Specifiera?  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).
    z8
        (?P<operator>(~=|==|!=|<=|>=|<|>|===))
        aÈ  
        (?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;)]*  # 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 .*
                    |
                    (?:                                  # 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
                    (?:\+[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.
                (?<!==|!=|~=)         # 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
                    [-_\.]?
                    (alpha|beta|preview|pre|a|b|c|rc)
                    [-_\.]?
                    [0-9]*
                )?
                (?:                                   # post release
                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
                )?
                (?:[-_\.]?dev[-_\.]?[0-9]*)?          # dev release
            )
        )
        z^\s*z\s*$Ú
compatibleÚequalÚ	not_equalÚless_than_equalÚgreater_than_equalÚ	less_thanÚgreater_thanÚ	arbitrary)ú~=ú==z!=ú<=ú>=ú<ú>ú===Ú NÚspecr   r)   r(   r   r+   c                 C  sF   | j  |¡}|std|›�ƒ‚| d¡ ¡ | d¡ ¡ f| _|| _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: Úoperatorr   N)Ú_regexÚsearchr   ÚgroupÚstripÚ_specÚ_prereleases)r   rO   r)   Úmatchr   r   r   Ú__init__Þ   s   þ
zSpecifier.__init__r%   c                 C  sR   | j d ur| j S | j\}}|dv r'|dkr | d¡r |d d… }t|ƒjr'dS dS )N)rH   rJ   rI   rG   rM   rL   rK   rH   ú.*éþÿÿÿTF)rV   rU   Úendswithr
   Úis_prerelease)r   rP   r   r   r   r   r)   ø   s   


zSpecifier.prereleasesr*   c                 C  ó
   || _ d S r   ©rV   r,   r   r   r   r)     ó   
c                 C  ó
   | j d S )z`The operator of this specifier.

        >>> Specifier("==1.2.3").operator
        '=='
        r   ©rU   r   r   r   r   rP     ó   
zSpecifier.operatorc                 C  r`   )zaThe version of this specifier.

        >>> Specifier("==1.2.3").version
        '1.2.3'
        r   ra   r   r   r   r   r     rb   zSpecifier.versionc                 C  s8   | j du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=rN   rK   ú(ú)>)rV   r)   Ú	__class__r   r   ©r   Úprer   r   r   Ú__repr__&  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{}{})ÚformatrU   r   r   r   r   r   8  s   zSpecifier.__str__útuple[str, str]c                 C  s*   t | jd | jd dkd�}| jd |fS )Nr   r   rG   ©Ústrip_trailing_zero)r	   rU   )r   Úcanonical_versionr   r   r   Ú_canonical_specB  s
   þzSpecifier._canonical_specr!   c                 C  ó
   t | jƒS r   )Úhashro   r   r   r   r   r"   J  ó   
zSpecifier.__hash__r#   r$   c                 C  sP   t |tƒrz	|  t|ƒ¡}W n ty   t Y S w t || jƒs"t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   rf   r   ÚNotImplementedro   r&   r   r   r   r'   M  s   
ÿzSpecifier.__eq__ÚopÚCallableOperatorc                 C  s   t | d| j| › �ƒ}|S )NÚ	_compare_)ÚgetattrÚ
_operators)r   rt   Úoperator_callabler   r   r   Ú_get_operatorj  s   ÿzSpecifier._get_operatorÚprospectiver
   c                 C  sH   t tt tt|ƒ¡ƒd d… ƒ}|d7 }|  d¡||ƒo#|  d¡||ƒS )NéÿÿÿÿrY   rJ   rH   )Ú_version_joinÚlistÚ	itertoolsÚ	takewhileÚ_is_not_suffixÚ_version_splitrz   )r   r{   rO   Úprefixr   r   r   Ú_compare_compatiblep  s   	ÿÿzSpecifier._compare_compatiblec                 C  s‚   |  d¡r1t|jdd�}t|d d… dd�}t|ƒ}t|ƒ}t||ƒ\}}|d t|ƒ… }	|	|kS t|ƒ}
|
js=t|jƒ}||
kS )NrY   Frl   rZ   )r[   r	   Úpublicr‚   Ú_pad_versionÚlenr
   Úlocal)r   r{   rO   Únormalized_prospectiveÚnormalized_specÚ
split_specÚsplit_prospectiveÚpadded_prospectiveÚ_Úshortened_prospectiveÚspec_versionr   r   r   Ú_compare_equal„  s   
ÿ
zSpecifier._compare_equalc                 C  s   |   ||¡ S r   )r‘   ©r   r{   rO   r   r   r   Ú_compare_not_equal¬  s   zSpecifier._compare_not_equalc                 C  s   t |jƒt |ƒkS r   ©r
   r…   r’   r   r   r   Ú_compare_less_than_equal¯  ó   z"Specifier._compare_less_than_equalc                 C  s   t |jƒt |ƒkS r   r”   r’   r   r   r   Ú_compare_greater_than_equalµ  r–   z%Specifier._compare_greater_than_equalÚspec_strc                 C  s<   t |ƒ}||k s
dS |js|jrt |jƒt |jƒkrdS dS ©NFT)r
   r\   Úbase_version©r   r{   r˜   rO   r   r   r   Ú_compare_less_than»  s   zSpecifier._compare_less_thanc                 C  s^   t |ƒ}||ks
dS |js|jrt |jƒt |jƒkrdS |jd ur-t |jƒt |jƒkr-dS dS r™   )r
   Úis_postreleaserš   rˆ   r›   r   r   r   Ú_compare_greater_thanÓ  s   
zSpecifier._compare_greater_thanc                 C  s   t |ƒ ¡ t |ƒ ¡ kS r   )r   Úlowerr’   r   r   r   Ú_compare_arbitraryñ  s   zSpecifier._compare_arbitraryr-   ústr | Versionc                 C  ó
   |   |¡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")
        False
        >>> "1.3.0a1" in Specifier(">=1.2.3", prereleases=True)
        True
        ©r.   ©r   r-   r   r   r   Ú__contains__ô  ó   
zSpecifier.__contains__r   c                 C  s<   |du r| j }t|ƒ}|jr|sdS |  | j¡}||| jƒS )al  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 uses :attr:`prereleases` to determine
            whether or not prereleases are allowed.

        >>> 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")
        False
        >>> Specifier(">=1.2.3", prereleases=True).contains("1.3.0a1")
        True
        >>> Specifier(">=1.2.3").contains("1.3.0a1", prereleases=True)
        True
        NF)r)   r   r\   rz   rP   r   )r   r-   r)   Únormalized_itemry   r   r   r   r.   	  s   
zSpecifier.containsr/   r0   r1   c                 c  sŒ   � d}g }d|dur|ndi}|D ]"}t |ƒ}| j|fi |¤Žr3|jr.|s.| js.| |¡ qd}|V  q|s@|rB|D ]	}|V  q:dS dS dS )aO  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 be intelligently decide whether to allow
            prereleases or not (based on the :attr:`prereleases` attribute, and
            whether the only versions matching are prereleases).

        This method is smarter than just ``filter(Specifier().contains, [...])``
        because it implements the rule from :pep:`440` that a prerelease item
        SHOULD be accepted if no other versions match the given specifier.

        >>> 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']
        Fr)   NT)r   r.   r\   r)   Úappend)r   r/   r)   ÚyieldedÚfound_prereleasesÚkwr   Úparsed_versionr   r   r   r2   5  s*   €ÿÿ€þzSpecifier.filter©rN   N)rO   r   r)   r(   r   r+   )r   r%   r7   r3   )r   rk   r4   r5   )rt   r   r   ru   )r{   r
   rO   r   r   r%   )r{   r
   r˜   r   r   r%   )r-   r¡   r   r%   r   )r-   r   r)   r(   r   r%   r8   )#r   r   r   r   Ú_operator_regex_strÚ_version_regex_strÚreÚcompileÚVERBOSEÚ
IGNORECASErQ   rx   rX   r;   r)   r<   rP   r   ri   r   ro   r"   r'   rz   r„   r‘   r“   r•   r—   rœ   rž   r    r¥   r.   r2   r   r   r   r   r>   c   sZ    	^
þø








(





-ÿr>   z^([0-9]+)((?:a|b|c|rc)[0-9]+)$r   ú	list[str]c                 C  s^   g }|   d¡\}}}| |pd¡ | d¡D ]}t |¡}|r'| | ¡ ¡ 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Ú.)Ú
rpartitionr¨   ÚsplitÚ_prefix_regexrR   ÚextendÚgroups)r   ÚresultÚepochrŽ   Úrestr-   rW   r   r   r   r‚   v  s   
r‚   Ú
componentsc                 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À   r¾   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   )Ú
startswith)Ú.0rƒ   ©rÂ   r   r   Ú	<genexpr>˜  s   € 

ÿz!_is_not_suffix.<locals>.<genexpr>)ÚdevÚaÚbÚrcÚpost)ÚanyrÅ   r   rÅ   r   r�   —  s   
ÿr�   ÚleftÚrightútuple[list[str], list[str]]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 r   ©Úisdigit©Úxr   r   r   Ú<lambda>¡  ó    z_pad_version.<locals>.<lambda>c                 S  rÐ   r   rÑ   rÓ   r   r   r   rÕ   ¢  rÖ   r   r   r¶   )	r¨   r~   r   r€   r‡   ÚinsertÚmaxÚchainÚfrom_iterable)rÍ   rÎ   Ú
left_splitÚright_splitr   r   r   r†   �  s   
,,þr†   c                   @  s¬   e Zd ZdZ		d1d2d
d„Zed3dd„ƒZejd4dd„ƒZd5dd„Zd5dd„Z	d6dd„Z
d7dd„Zd8dd„Zd6d d!„Zd9d#d$„Zd:d'd(„Z		d;d<d*d+„Z	d=d>d/d0„ZdS )?ÚSpecifierSetzÌ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.
    rN   NÚ
specifiersústr | Iterable[Specifier]r)   r(   r   r+   c                 C  sD   t |tƒrdd„ | d¡D ƒ}ttt|ƒƒ| _nt|ƒ| _|| _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   )rT   ©rÄ   Úsr   r   r   Ú
<listcomp>Ò  s    z)SpecifierSet.__init__.<locals>.<listcomp>ú,N)r   r   r¹   Ú	frozensetÚmapr>   Ú_specsrV   )r   rÞ   r)   Úsplit_specifiersr   r   r   rX   ¹  s
   


zSpecifierSet.__init__c                 C  s.   | j d ur| j S | jsd S tdd„ | jD ƒƒS )Nc                 s  s   � | ]}|j V  qd S r   ©r)   rà   r   r   r   rÆ   î  s   € z+SpecifierSet.prereleases.<locals>.<genexpr>)rV   ræ   rÌ   r   r   r   r   r)   ß  s
   
zSpecifierSet.prereleasesr*   r%   c                 C  r]   r   r^   r,   r   r   r   r)   ð  r_   r   c                 C  s.   | j durd| j›�nd}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)>
        Nrc   rN   z<SpecifierSet(re   )rV   r)   r   rg   r   r   r   ri   ô  s
   
ÿýzSpecifierSet.__repr__c                 C  s   d  tdd„ | j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Á   Úsortedræ   r   r   r   r   r   	  s   zSpecifierSet.__str__r!   c                 C  rp   r   )rq   ræ   r   r   r   r   r"     rr   zSpecifierSet.__hash__r#   úSpecifierSet | strc                 C  sš   t |tƒr
t|ƒ}nt |tƒstS tƒ }t| j|jB ƒ|_| jdu r-|jdur-|j|_|S | jdur=|jdu r=| j|_|S | j|jkrI| j|_|S tdƒ‚)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')>
        NzFCannot combine SpecifierSets with True and False prerelease overrides.)r   r   rÝ   rs   rä   ræ   rV   Ú
ValueError)r   r#   Ú	specifierr   r   r   Ú__and__  s$   




÷ùüÿzSpecifierSet.__and__r$   c                 C  s6   t |ttfƒrtt|ƒƒ}nt |tƒstS | j|j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Ý   rs   ræ   r&   r   r   r   r'   8  s
   
zSpecifierSet.__eq__c                 C  rp   )z7Returns the number of specifiers in this specifier set.)r‡   ræ   r   r   r   r   Ú__len__R  r_   zSpecifierSet.__len__úIterator[Specifier]c                 C  rp   )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æ   r   r   r   r   Ú__iter__V  s   
zSpecifierSet.__iter__r-   r   c                 C  r¢   )ar  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")
        False
        >>> "1.3.0a1" in SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True)
        True
        r£   r¤   r   r   r   r¥   `  r¦   zSpecifierSet.__contains__Ú	installedc                   s\   t ˆ tƒs	tˆ ƒ‰ ˆdu r| j‰ˆsˆ jrdS |r!ˆ jr!tˆ jƒ‰ t‡ ‡fdd„| j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 uses :attr:`prereleases` to determine
            whether or not prereleases are allowed.

        >>> 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")
        False
        >>> SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True).contains("1.3.0a1")
        True
        >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.3.0a1", prereleases=True)
        True
        NFc                 3  s   � | ]
}|j ˆ ˆd �V  qdS )rè   Nr£   rà   ©r-   r)   r   r   rÆ   ¬  s   € z(SpecifierSet.contains.<locals>.<genexpr>)r   r
   r)   r\   rš   Úallræ   )r   r-   r)   rò   r   ró   r   r.   u  s   



zSpecifierSet.containsr/   r0   r1   c                 C  s˜   |du r| j }| jr| jD ]}|j|t|ƒd�}qt|ƒS g }g }|D ]}t|ƒ}|jr6|s6|s5| |¡ q#| |¡ q#|sH|rH|du rHt|ƒS t|ƒS )a.  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 be intelligently decide whether to allow
            prereleases or not (based on the :attr:`prereleases` attribute, and
            whether the only versions matching are prereleases).

        This method is smarter than just ``filter(SpecifierSet(...).contains, [...])``
        because it implements the rule from :pep:`440` that a prerelease item
        SHOULD be accepted if no other versions match the given specifier.

        >>> 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"]))
        []
        >>> 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']

        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)   ræ   r2   r%   rð   r   r\   r¨   )r   r/   r)   rO   Úfilteredrª   r-   r¬   r   r   r   r2   ®  s$   ,


€zSpecifierSet.filterr­   )rÞ   rß   r)   r(   r   r+   r6   r7   r3   r4   )r#   rê   r   rÝ   r5   )r   rï   )r-   r   r   r%   )NN)r-   r   r)   r(   rò   r(   r   r%   r   r8   )r   r   r   r   rX   r;   r)   r<   ri   r   r"   rí   r'   rî   rñ   r¥   r.   r2   r   r   r   r   rÝ   ²  s,    ý&








ü:ÿrÝ   )r   r   r   r
   )r   r   r   r´   )rÀ   r´   r   r   )rÂ   r   r   r%   )rÍ   r´   rÎ   r´   r   rÏ   )"r   Ú
__future__r   r9   r   r°   Útypingr   r   r   r   r   Úutilsr	   r   r
   r   r   r   r%   ru   r   rë   r   ÚABCMetar   r>   r±   rº   r‚   r}   r�   r†   rÝ   r   r   r   r   Ú<module>   s2   
7    




