
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<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rd}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   d|j j|jf S )Nz%s.%s)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#   r/   r$   Namer2   r   allowed_valuesr&   )r   r+   validkeyresultr   r   r   do_attributej   s    


zEvaluator.do_attributec             C   sx   | j |jd }|jjtjk}|jjtjk}|r4|s>|rt| rtx4|jdd  D ]"}| j |}|rd|sn|rN| rNP qNW |S )Nr   r   )r.   valuesopr'   r$   ZOrZAnd)r   r+   r7   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| ||}|sP |}|}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rhsnoder5   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lhsr7   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)r0   r   r4   r&   )r   r+   r5   r7   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__rB   sysplatformversion_infoversionsplitosnamestrr   releasemachiner   r4   r   r   r   r.   r2   r8   r<   rC   rD   rE   rF   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)rI   r$   rO   rJ   rK   compatr   r   utilr   __all__objectr   r   r   r   r   r   <module>   s    "