U
    +5iB                  	   @  s   U d dl m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 ddlmZmZmZmZmZ ddlmZ ddlmZ ddlmZmZ dd	lmZ d
ddddddgZddddZeeeeee f ge f Z!e	d Z"ddhZ#ddddhZ$G dd de%Z&G dd de%Z'G dd de%Z(G dd
 d
eZ)d d d!d"d#Z*d$d$d%d&d'Z+dNd)d*d+d,d-d.Z,d/d0 d1d0 d2d0 ej-ej-ej.ej-d3d0 d4Z/d5e0d6< d+d7d8d+d9d:d;d<Z1d+d8d+d=d>d?d@Z2d$dAd9dBdCdDZ3dEd+dFdGdHZ4d
ddIdZ5G dJd dZ6dAdAdKdLdMZ7dS )O    )annotationsN)AbstractSetCallableLiteralMapping	TypedDictUnioncast   )
MarkerAtom
MarkerListOpValueVariable)parse_marker)ParserSyntaxError)InvalidSpecifier	Specifiercanonicalize_nameEnvironmentEvaluateContextInvalidMarkerMarkerUndefinedComparisonUndefinedEnvironmentNamedefault_environmentz	list[str]returnc                   C  s   t S N)__all__ r!   r!   5/tmp/pip-unpacked-wheel-xj899fla/packaging/markers.py__dir__   s    r#   )metadata	lock_filerequirementextrasdependency_groupsimplementation_versionplatform_releasepython_full_versionpython_versionc                   @  s   e Zd ZdZdS )r   zRaised when attempting to create a :class:`Marker` from invalid input.

    This error indicates that the given marker string does not conform to the
    :ref:`specification of dependency specifiers <pypug:dependency-specifiers>`.
    N__name__
__module____qualname____doc__r!   r!   r!   r"   r   6   s   c                   @  s   e Zd ZdZdS )r   zRaised when evaluating an unsupported marker comparison.

    This can happen when marker values are compared as versions but do not
    conform to the :ref:`specification of version specifiers
    <pypug:version-specifiers>`.
    Nr-   r!   r!   r!   r"   r   >   s   c                   @  s   e Zd ZdZdS )r   zJRaised when evaluating a marker that references a missing environment key.Nr-   r!   r!   r!   r"   r   G   s   c                   @  sj   e Zd ZU dZded< ded< ded< ded< ded< ded< ded	< ded
< ded< ded< ded< dS )r   z
    A dictionary that represents a Python environment as captured by
    :func:`default_environment`. All fields are required.
    strimplementation_namer)   os_nameplatform_machiner*   platform_systemplatform_versionr+   platform_python_implementationr,   sys_platformN)r.   r/   r0   r1   __annotations__r!   r!   r!   r"   r   K   s   
zMarkerList | MarkerAtom | str)resultr   c                 C  sp   t | ts| S | \}}}t |tr@|jdkr@t|j}t|}n&t |trf|jdkrft|j}t|}|||fS )Nextra)
isinstancetupler   valuer   r   )r;   lhsoprhsZnormalized_extrar!   r!   r"   _normalize_extras   s    




rC   r   )resultsr   c                 C  s   dd | D S )z!
    Normalize extra values.
    c                 S  s   g | ]}t |qS r!   )rC   ).0rr!   r!   r"   
<listcomp>   s     z+_normalize_extra_values.<locals>.<listcomp>r!   )rD   r!   r!   r"   _normalize_extra_values   s    rH   Tzlist[str] | MarkerAtom | strzbool | Noner2   )markerfirstr   c                 C  s   t | tttfstt | trHt| dkrHt | d ttfrHt| d S t | trdd | D }|rnd|S dd| d S n"t | trddd	 | D S | S d S )
Nr
   r   c                 s  s   | ]}t |d dV  qdS )F)rJ   N)_format_markerrE   mr!   r!   r"   	<genexpr>   s     z!_format_marker.<locals>.<genexpr> ()c                 S  s   g | ]}|  qS r!   )	serializerL   r!   r!   r"   rG      s     z"_format_marker.<locals>.<listcomp>)r=   listr>   r2   AssertionErrorlenrK   join)rI   rJ   innerr!   r!   r"   rK      s     



rK   c                 C  s   | |kS r   r!   r@   rB   r!   r!   r"   <lambda>       rY   c                 C  s   | |kS r   r!   rX   r!   r!   r"   rY      rZ   c                 C  s   dS NFr!   Z_lhsZ_rhsr!   r!   r"   rY      rZ   c                 C  s   dS r[   r!   r\   r!   r!   r"   rY      rZ   )inznot in<z<=z==z!=z>=>zdict[str, Operator]
_operatorsr   zstr | AbstractSet[str]bool)r@   rA   rB   keyr   c                C  s   |  }|tkrHzt| | }W n tk
r8   Y nX |j| ddS t|}|d krvtd|d| d|d|| |S )NT)prereleasesz
Undefined z on z and .)rR   MARKERS_REQUIRING_VERSIONr   r   containsr`   getr   )r@   rA   rB   rb   Zop_strspecoperr!   r!   r"   _eval_op   s    
rj   z"tuple[str, str | AbstractSet[str]])r@   rB   rb   r   c                 C  sb   |dkr"t |tstd| |fS |tkrZt |trDt| t|fS t| dd |D fS | |fS )Nr<   zextra value must be a stringc                 S  s   h | ]}t |qS r!   r   )rE   vr!   r!   r"   	<setcomp>   s     z_normalize.<locals>.<setcomp>)r=   r2   rT   MARKERS_ALLOWING_SETr   )r@   rB   rb   r!   r!   r"   
_normalize   s    
rn   !dict[str, str | AbstractSet[str]])markersenvironmentr   c           
   	   C  s   g g}| D ]}t |tr.|d t|| q
t |tr|\}}}t |trb|j}|| }|j}	n|j}|j}|| }	t |tstdt	||	|d\}}	|d t
|||	|d q
|dkr|g  q
|dkrq
td|q
tdd |D S )	Nzlhs must be a string)rb   orandzUnexpected marker c                 s  s   | ]}t |V  qd S r   )all)rE   itemr!   r!   r"   rN     s     z$_evaluate_markers.<locals>.<genexpr>)r=   rS   append_evaluate_markersr>   r   r?   r2   rT   rn   rj   	TypeErrorany)
rp   rq   groupsrI   r@   rA   rB   Zenvironment_key	lhs_value	rhs_valuer!   r!   r"   rx      s,    



rx   zsys._version_info)infor   c                 C  sB   | j  d| j d| j }| j}|dkr>||d t| j 7 }|S )Nrd   finalr   )majorminormicroreleaselevelr2   serial)r~   versionkindr!   r!   r"   _format_full_version  s
    r   c                  C  s^   t tjj} tjj}|| tjt t t	 t t
 t dt dd tjdS )zReturn the default marker environment for the current Python process.

    This is the base environment used by :meth:`Marker.evaluate`.
    rd   N   )r3   r)   r4   r5   r*   r6   r7   r+   r8   r,   r9   )r   sysimplementationr   nameosplatformmachinereleasesystemr,   python_implementationrV   python_version_tuple)iverr3   r!   r!   r"   r   '  s    c                   @  s   e Zd ZdZdZdddddZe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ZdddddZd d dddZd d dd d!Zd)d$d%dd&d'd(Zd"S )*r   a  Represents a parsed dependency marker expression.

    Marker expressions are parsed according to the
    :ref:`specification of dependency specifiers <pypug:dependency-specifiers>`.

    :param marker: The string representation of a marker expression.
    :raises InvalidMarker: If ``marker`` cannot be parsed.

    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.
    )_markersr2   None)rI   r   c              
   C  sN   g | _ ztt|| _ W n0 tk
rH } ztt||W 5 d }~X Y nX d S r   )r   rH   _parse_markerr   r   r2   )selfrI   er!   r!   r"   __init__S  s
    zMarker.__init__r   )rp   r   c                 C  s   |  | }||_|S )zCreate a Marker instance from a pre-parsed marker tree.

        This avoids re-parsing serialised marker strings when combining markers.
        )__new__r   )clsrp   newr!   r!   r"   _from_markersq  s    
zMarker._from_markersr   c                 C  s
   t | jS r   )rK   r   r   r!   r!   r"   __str__{  s    zMarker.__str__c                 C  s   d| j j dt| dS )Nr^   rP   z)>)	__class__r.   r2   r   r!   r!   r"   __repr__~  s    zMarker.__repr__intc                 C  s   t t| S r   )hashr2   r   r!   r!   r"   __hash__  s    zMarker.__hash__objectra   )otherr   c                 C  s   t |tstS t| t|kS r   )r=   r   NotImplementedr2   r   r   r!   r!   r"   __eq__  s    
zMarker.__eq__c                 C  s   t | S r   )r2   r   r!   r!   r"   __getstate__  s    zMarker.__getstate__)stater   c              
   C  s   t |trTztt|| _W n2 tk
rN } ztd||W 5 d }~X Y nX d S t |trd|kr|d }t |tr|| _d S t |t	rt
|dkr|\}}t |trd|kr|d }t |tr|| _d S td|d S )NzCannot restore Marker from r   r   )r=   r2   rH   r   r   r   ry   dictrS   r>   rU   )r   r   excrp   _Z	slot_dictr!   r!   r"   __setstate__  s&    
"

zMarker.__setstate__c                 C  s"   t |tstS | | jd|jgS )Nrt   r=   r   r   r   r   r   r!   r!   r"   __and__  s    
zMarker.__and__c                 C  s"   t |tstS | | jd|jgS )Nrs   r   r   r!   r!   r"   __or__  s    
zMarker.__or__Nr$   z+Mapping[str, str | AbstractSet[str]] | Noner   )rq   contextr   c                 C  s   t dt }|dkr(|jt t d n|dkr8d|d< |dk	rt|| d|krtt d|d }|rlt|nd|d< t| jt|S )	a"  Evaluate a marker.

        Return the boolean from evaluating this marker against the environment.
        The environment is determined from the current Python process unless
        passed in explicitly.

        :param environment: Mapping containing keys and values to override the
           detected environment.
        :param EvaluateContext context: The context in which the marker is
            evaluated, which influences what marker names are considered valid.
            Accepted values are ``"metadata"`` (for core metadata; default),
            ``"lock_file"``, and ``"requirement"`` (i.e. all other situations).
        :raises UndefinedComparison: If the marker uses a comparison on values
            that are not valid versions per the :ref:`specification of version
            specifiers <pypug:version-specifiers>`.
        :raises UndefinedEnvironmentName: If the marker references a value that
            is missing from the evaluation environment.
        :returns: ``True`` if the marker matches, otherwise ``False``.

        ro   r%   )r'   r(   r$    r<   Nz
str | None)r	   r   update	frozensetr   rx   r   _repair_python_full_version)r   rq   r   current_environmentr<   r!   r!   r"   evaluate  s(      
 zMarker.evaluate)Nr$   )r.   r/   r0   r1   	__slots__r   classmethodr   r   r   r   r   r   r   r   r   r   r!   r!   r!   r"   r   =  s    	  )envr   c                 C  s*   t d| d }|dr&| d| d< | S )z
    Work around platform.python_version() returning something that is not PEP 440
    compliant for non-tagged Python builds.
    r2   r+   +local)r	   endswith)r   r+   r!   r!   r"   r     s    
r   )T)8
__future__r   operatorr   r   r   typingr   r   r   r   r   r   r	   _parserr   r   r   r   r   r   r   
_tokenizerr   
specifiersr   r   utilsr   r    r#   r2   ra   ZOperatorr   rm   re   
ValueErrorr   r   r   r   rC   rH   rK   eqner`   r:   rj   rn   rx   r   r   r   r   r!   r!   r!   r"   <module>   sj    $
	M	 ! &