<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
3
ÝPfŠ  ã               @   sd   d Z ddlZddlZddlZddlZddlmZmZ ddlm	Z	 dgZ
G dd„ deƒZd
d	d„ZdS )zEParser for the environment markers micro-language defined in PEP 345.é    Né   )Úpython_implementationÚstring_types)Úin_venvÚ	interpretc            
   @   sô   e Zd ZdZdd„ dd„ dd„ dd„ dd„ dd„ d	d„ d
d„ dd„ dœ	Zejdejdd…  ejj	ddƒd e
jeeƒ ƒejƒ ejƒ ejƒ eƒ dœ	Zd*dd„Zdd„ Zdd„ Zd+dd„Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ ZdS ),Ú	Evaluatorz5
    A limited evaluator for Python expressions.
    c             C   s   | |kS )N© )ÚxÚyr   r   ú/usr/lib/python3.6/markers.pyÚ<lambda>   s    zEvaluator.<lambda>c             C   s   | |kS )Nr   )r	   r
   r   r   r   r      s    c             C   s   | |kS )Nr   )r	   r
   r   r   r   r      s    c             C   s   | |kS )Nr   )r	   r
   r   r   r   r      s    c             C   s   | |k S )Nr   )r	   r
   r   r   r   r      s    c             C   s   | |kS )Nr   )r	   r
   r   r   r   r      s    c             C   s   |  S )Nr   )r	   r   r   r   r       s    c             C   s   | |kS )Nr   )r	   r
   r   r   r   r   !   s    c             C   s   | |kS )Nr   )r	   r
   r   r   r   r   "   s    )	ÚeqÚgtZgteÚinÚltZlteÚnotZnoteqZnotinz%s.%sNé   ú r   r   )	Zsys_platformZpython_versionZpython_full_versionZos_nameZplatform_in_venvZplatform_releaseZplatform_versionZplatform_machineZplatform_python_implementationc             C   s   |pi | _ d| _dS )zu
        Initialise an instance.

        :param context: If specified, names are looked up in this mapping.
        N)ÚcontextÚsource)Úselfr   r   r   r   Ú__init__3   s    
zEvaluator.__init__c             C   s8   d}d| j ||| …  }|| t| j ƒk r4|d7 }|S )zH
        Get the part of the source which is causing a problem.
        é
   z%rz...)r   Úlen)r   ÚoffsetZfragment_lenÚsr   r   r   Úget_fragment<   s
    zEvaluator.get_fragmentc             C   s   t | d| dƒS )z@
        Get a handler for the specified AST node type.
        zdo_%sN)Úgetattr)r   Ú	node_typer   r   r   Úget_handlerF   s    zEvaluator.get_handlerc             C   sÄ   t |tƒrr|| _ddi}|r$||d< ytj|f|Ž}W n: tk
rp } z| j|jƒ}td| ƒ‚W Y dd}~X nX |jj	j
ƒ }| j|ƒ}|dkr¼| jdkr d}n| j|jƒ}td||f ƒ‚||ƒS )zf
        Evaluate a source string or node, using ``filename`` when
        displaying errors.
        ÚmodeÚevalÚfilenamezsyntax error %sNz(source not available)z don't know how to evaluate %r %s)Ú
isinstancer   r   ÚastÚparseÚSyntaxErrorr   r   Ú	__class__Ú__name__Úlowerr   Ú
col_offset)r   Únoder"   ÚkwargsÚer   r   Zhandlerr   r   r   ÚevaluateL   s&    


zEvaluator.evaluatec             C   s&   t |tjƒstdƒ‚d|jj|jf S )Nzattribute node expectedz%s.%s)r#   r$   Z	AttributeÚAssertionErrorÚvalueÚidÚattr)r   r+   r   r   r   Úget_attr_keyf   s    zEvaluator.get_attr_keyc             C   sf   t |jtjƒsd}n| j|ƒ}|| jkp0|| jk}|sBtd| ƒ‚|| jkrX| j| }n
| j| }|S )NFzinvalid expression: %s)r#   r0   r$   ÚNamer3   r   Úallowed_valuesr&   )r   r+   ÚvalidÚkeyÚresultr   r   r   Údo_attributej   s    


zEvaluator.do_attributec             C   s„   | j |jd ƒ}|jjtjk}|jjtjk}|s8|s8t‚|r@|sJ|r€| r€x4|jdd … D ]"}| j |ƒ}|rp|sz|rZ| rZP qZW |S )Nr   r   )r.   ÚvaluesÚopr'   r$   ZOrZAndr/   )r   r+   r8   Zis_orZis_andÚnr   r   r   Ú	do_boolopx   s    
zEvaluator.do_boolopc       	         s–   ‡ ‡fdd„}ˆ j }ˆj|ƒ}d}xntˆ jˆ jƒD ]\\}}|||ƒ |jjjƒ }|ˆjkrft	d| ƒ‚ˆj|ƒ}ˆj| ||ƒ}|s†P |}|}q2W |S )Nc                s@   d}t | tjƒr t |tjƒr d}|s<ˆjˆ jƒ}td| ƒ‚d S )NTFzInvalid comparison: %s)r#   r$   ZStrr   r*   r&   )ÚlhsnodeÚrhsnoder6   r   )r+   r   r   r   Úsanity_check…   s    z*Evaluator.do_compare.<locals>.sanity_checkTzunsupported operation: %r)
Úleftr.   ÚzipZopsZcomparatorsr'   r(   r)   Ú	operatorsr&   )	r   r+   r@   r>   Zlhsr8   r;   r?   Zrhsr   )r+   r   r   Ú
do_compare„   s     



zEvaluator.do_comparec             C   s   | j |jƒS )N)r.   Zbody)r   r+   r   r   r   Údo_expression¢   s    zEvaluator.do_expressionc             C   sT   d}|j | jkr"d}| j|j  }n|j | jkr>d}| j|j  }|sPtd|j  ƒ‚|S )NFTzinvalid expression: %s)r1   r   r5   r&   )r   r+   r6   r8   r   r   r   Údo_name¥   s    zEvaluator.do_namec             C   s   |j S )N)r   )r   r+   r   r   r   Údo_str±   s    zEvaluator.do_str)N)N)r(   Ú
__module__Ú__qualname__Ú__doc__rC   ÚsysÚplatformÚversion_infoÚversionÚsplitÚosÚnameÚstrr   ÚreleaseÚmachiner   r5   r   r   r   r.   r3   r9   r=   rD   rE   rF   rG   r   r   r   r   r      s<   

	

r   c             C   s   t |ƒj| jƒ ƒS )zò
    Interpret a marker and return a result depending on environment.

    :param marker: The marker to interpret.
    :type marker: str
    :param execution_context: The context used for name lookup.
    :type execution_context: mapping
    )r   r.   Ústrip)ZmarkerZexecution_contextr   r   r   r   µ   s    	)N)rJ   r$   rP   rK   rL   Úcompatr   r   Úutilr   Ú__all__Úobjectr   r   r   r   r   r   Ú<module>   s    "