B
    d                 @   s8  d 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 eeef ZededZeeegef Zee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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 )z
.. testsetup::

    from packaging.specifiers import Specifier, SpecifierSet, InvalidSpecifier
    from packaging.version import Version
    N)	CallableIterableIteratorListOptionalSetTupleTypeVarUnion   )canonicalize_version)VersionUnparsedVersionVar)bound)versionreturnc             C   s   t | tst| } | S )N)
isinstancer   )r    r   Y/var/www/html/venv/lib/python3.7/site-packages/setuptools/_vendor/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edddZejedddZeje	e
dddZe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)r   c             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__5   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 )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__B   s    zBaseSpecifier.__eq__c             C   s   dS )zWhether 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   prereleasesK   s    zBaseSpecifier.prereleasesN)valuer   c             C   s   dS )zQSetter for :attr:`prereleases`.

        :param value: The value to set.
        Nr   )r   r"   r   r   r   r!   T   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   contains[   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   r%   r!   r   r   r   filtera   s    zBaseSpecifier.filter)N)N)r   r   r   abcabstractmethodstrr   intr   objectboolr    propertyr   r!   setterr$   r   r   r   r&   r   r   r   r   r   4   s    r   )	metaclassc            	   @   s  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dFeee ddddZeedddZejeddddZeedddZee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ed+d,d-Z eeed+d.d/Z!eeed+d0d1Z"eeed+d2d3Z#eeed+d4d5Z$eeed6d7d8Z%eeed6d9d:Z&eeed+d;d<Z'e(eef ed=d>d?Z)dGe*ee ed@dAdBZ+dHe,e- ee e.e- dCdDdEZ/dS )I	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~=z==z!=z<=z>=<>z=== N)specr!   r   c             C   sH   | j |}|s td| 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   r<   r!   matchr   r   r   __init__   s    zSpecifier.__init__)r   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)z==z>=z<=z~=z===z==z.*TF)rD   rC   endswithr   is_prerelease)r   r>   r   r   r   r   r!      s    


zSpecifier.prereleases)r"   r   c             C   s
   || _ d S )N)rD   )r   r"   r   r   r   r!     s    c             C   s
   | j d S )z`The operator of this specifier.

        >>> Specifier("==1.2.3").operator
        '=='
        r   )rC   )r   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   )rC   )r   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)>
        Nz, prereleases=r;   r9   (z)>)rD   r!   	__class__r   r)   )r   prer   r   r   __repr__-  s    zSpecifier.__repr__c             C   s   dj | j S )zA 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{}{})formatrC   )r   r   r   r   r   ?  s    zSpecifier.__str__c             C   s*   t | jd | jd dkd}| jd |fS )Nr   r   z~=)strip_trailing_zero)r   rC   )r   Zcanonical_versionr   r   r   _canonical_specI  s    zSpecifier._canonical_specc             C   s
   t | jS )N)hashrP   )r   r   r   r   r   Q  s    zSpecifier.__hash__)r   r   c             C   sP   t |tr4y| t|}W qD tk
r0   tS X nt || jsDt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)   rK   r   NotImplementedrP   )r   r   r   r   r   r    T  s    
zSpecifier.__eq__)opr   c             C   s   t | d| j|  }|S )N	_compare_)getattr
_operators)r   rS   operator_callabler   r   r   _get_operatorq  s    zSpecifier._get_operator)prospectiver<   r   c             C   sJ   d tttt|d d }|d7 }| d||oH| d||S )N.z.*z>=z==)joinlist	itertools	takewhile_is_not_suffix_version_splitrX   )r   rY   r<   prefixr   r   r   _compare_compatiblew  s
    
zSpecifier._compare_compatiblec             C   s   | dr^t|j}t|d d dd}t|}t|}t||\}}|d t| }	|	|kS t|}
|
jsvt|j}||
kS d S )Nz.*rG   F)rO   )rH   r   publicra   _pad_versionlenr   local)r   rY   r<   Znormalized_prospectiveZnormalized_spec
split_specsplit_prospectivepadded_prospective_shortened_prospectivespec_versionr   r   r   _compare_equal  s    


zSpecifier._compare_equalc             C   s   |  || S )N)rn   )r   rY   r<   r   r   r   _compare_not_equal  s    zSpecifier._compare_not_equalc             C   s   t |jt |kS )N)r   rd   )r   rY   r<   r   r   r   _compare_less_than_equal  s    z"Specifier._compare_less_than_equalc             C   s   t |jt |kS )N)r   rd   )r   rY   r<   r   r   r   _compare_greater_than_equal  s    z%Specifier._compare_greater_than_equal)rY   spec_strr   c             C   s<   t |}||k sdS |js8|jr8t |jt |jkr8dS dS )NFT)r   rI   base_version)r   rY   rr   r<   r   r   r   _compare_less_than  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 )NFT)r   is_postreleasers   rg   )r   rY   rr   r<   r   r   r   _compare_greater_than  s    
zSpecifier._compare_greater_thanc             C   s   t | t | kS )N)r)   lower)r   rY   r<   r   r   r   _compare_arbitrary  s    zSpecifier._compare_arbitrary)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")
        False
        >>> "1.3.0a1" in Specifier(">=1.2.3", prereleases=True)
        True
        )r$   )r   r#   r   r   r   __contains__  s    zSpecifier.__contains__)r#   r!   r   c             C   s<   |dk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   rI   rX   r>   r   )r   r#   r!   normalized_itemrW   r   r   r   r$     s    
zSpecifier.contains)r%   r!   r   c             c   s   d}g }d|dk	r|ndi}xH|D ]@}t |}| j|f|r"|jrX|sX| jsX|| q"d}|V  q"W |s|rx|D ]
}|V  qtW 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$   rI   r!   append)r   r%   r!   yieldedfound_prereleaseskwr   parsed_versionr   r   r   r&   B  s    



zSpecifier.filter)r;   N)N)N)0r   r   r   r   Z_operator_regex_strZ_version_regex_strrecompileVERBOSE
IGNORECASEr?   rV   r)   r   r,   rF   r-   r!   r.   r>   r   rM   r   r   rP   r*   r   r+   r    CallableOperatorrX   r   rc   rn   ro   rp   rq   rt   rv   rx   r
   ry   UnparsedVersionr$   r   r   r   r&   r   r   r   r   r0   k   sV   ]
'
-r0   z^([0-9]+)((?:a|b|c|rc)[0-9]+)$c             C   sD   g }x:|  dD ],}t|}|r2||  q|| qW |S )NrZ   )split_prefix_regexr@   extendgroupsr{   )r   resultr#   rE   r   r   r   ra     s    
ra   )segmentr   c                s   t  fdddD  S )Nc             3   s   | ]}  |V  qd S )N)
startswith).0rb   )r   r   r   	<genexpr>  s    z!_is_not_suffix.<locals>.<genexpr>)devabrcpost)any)r   r   )r   r   r`     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 )N)isdigit)xr   r   r   <lambda>      z_pad_version.<locals>.<lambda>c             S   s   |   S )N)r   )r   r   r   r   r     r   r   r   0)r{   r]   r^   r_   rf   insertmaxchain)r   r   
left_splitright_splitr   r   r   re     s    
,,re   c               @   s  e Zd ZdZd$eee ddddZeee ddd	Z	e	j
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dddZee dddZeedddZd%eee ee eddd Zd&ee ee ee d!d"d#ZdS )'SpecifierSetzThis 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.
    r;   N)
specifiersr!   r   c             C   sJ   dd | dD }t }x|D ]}|t| q W t|| _|| _dS )aN  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.
        :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   )rB   )r   sr   r   r   
<listcomp>  s    z)SpecifierSet.__init__.<locals>.<listcomp>,N)r   setaddr0   	frozenset_specsrD   )r   r   r!   split_specifiersparsed	specifierr   r   r   rF     s    

zSpecifierSet.__init__)r   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 )N)r!   )r   r   r   r   r   r     s    z+SpecifierSet.prereleases.<locals>.<genexpr>)rD   r   r   )r   r   r   r   r!     s
    
zSpecifierSet.prereleases)r"   r   c             C   s
   || _ d S )N)rD   )r   r"   r   r   r   r!     s    c             C   s.   | j dk	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)>
        Nz, prereleases=r;   z<SpecifierSet(z)>)rD   r!   r)   )r   rL   r   r   r   rM     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 )N)r)   )r   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 )N)rQ   r   )r   r   r   r   r     s    zSpecifierSet.__hash__)r   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 )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   rR   r   r   rD   
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 )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)   r0   r   rR   r   )r   r   r   r   r   r    *  s
    
zSpecifierSet.__eq__c             C   s
   t | jS )z7Returns the number of specifiers in this specifier set.)rf   r   )r   r   r   r   __len__D  s    zSpecifierSet.__len__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   )r   r   r   r   __iter__H  s    zSpecifierSet.__iter__)r#   r   c             C   s
   |  |S )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   ry   R  s    zSpecifierSet.__contains__)r#   r!   	installedr   c                s\   t  tst  dkr | js. jr.dS |rB jrBt 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!   N)r$   )r   r   )r#   r!   r   r   r     s    z(SpecifierSet.contains.<locals>.<genexpr>)r   r   r!   rI   rs   allr   )r   r#   r!   r   r   )r#   r!   r   r$   g  s    



zSpecifierSet.contains)r%   r!   r   c             C   s   |dkr| j }| jr>x | jD ]}|j|t|d}qW t|S g }g }x8|D ]0}t|}|jrr|sr|s||| qL|| qLW |s|r|dkrt|S t|S d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']
        N)r!   )r!   r   r&   r,   r   r   rI   r{   )r   r%   r!   r<   filteredr}   r#   r   r   r   r   r&     s"    ,

zSpecifierSet.filter)r;   N)NN)N)r   r   r   r   r)   r   r,   rF   r-   r!   r.   rM   r   r*   r   r
   r   r+   r    r   r   r0   r   r   ry   r$   r   r   r&   r   r   r   r   r     s(   
! 
 5r   )#r   r'   r^   r   typingr   r   r   r   r   r   r   r	   r
   utilsr   r   r   r)   r   r   r,   r   r   r   r   ABCMetar   r0   r   r   ra   r`   re   r   r   r   r   r   <module>	   s,   ,7    
*