B
    d$                 @   s  d Z ddlZddlmZmZmZmZmZmZ ddl	m
Z
mZ G dd dZG dd	 d	eZG d
d deZG dd deZeeef Zeeeef ZeZee ZG dd deZeedddZeedddZeeeeee f dddZeeeedddZeee dddZeee dddZeeddd Zeedd!d"Zeedd#d$Zeedd%d&Z eedd'd(Z!eedd)d*Z"eedd+d,Z#eed-d.d/Z$eed0d1d2Z%eedd3d4Z&dS )5zHandwritten parser of dependency specifiers.

The docstring for each __parse_* function contains ENBF-inspired grammar representing
the implementation.
    N)AnyList
NamedTupleOptionalTupleUnion   )DEFAULT_RULES	Tokenizerc               @   sF   e Zd ZeddddZedddZeddd	Zedd
dZdS )NodeN)valuereturnc             C   s
   || _ d S )N)r   )selfr    r   V/var/www/html/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/_parser.py__init__   s    zNode.__init__)r   c             C   s   | j S )N)r   )r   r   r   r   __str__   s    zNode.__str__c             C   s   d| j j d|  dS )N<z('z')>)	__class____name__)r   r   r   r   __repr__   s    zNode.__repr__c             C   s   t d S )N)NotImplementedError)r   r   r   r   	serialize   s    zNode.serialize)r   
__module____qualname__strr   r   r   r   r   r   r   r   r      s   r   c               @   s   e Zd ZedddZdS )Variable)r   c             C   s   t | S )N)r   )r   r   r   r   r      s    zVariable.serializeN)r   r   r   r   r   r   r   r   r   r      s   r   c               @   s   e Zd ZedddZdS )Value)r   c             C   s   d|  dS )N"r   )r   r   r   r   r   !   s    zValue.serializeN)r   r   r   r   r   r   r   r   r   r       s   r   c               @   s   e Zd ZedddZdS )Op)r   c             C   s   t | S )N)r   )r   r   r   r   r   &   s    zOp.serializeN)r   r   r   r   r   r   r   r   r   r   %   s   r   c               @   s>   e Zd ZU eed< eed< ee ed< eed< ee ed< dS )ParsedRequirementnameurlextras	specifiermarkerN)r   r   r   r   __annotations__r   r   
MarkerListr   r   r   r   r    4   s
   
r    )sourcer   c             C   s   t t| tdS )N)rules)_parse_requirementr
   r	   )r(   r   r   r   parse_requirement?   s    r+   )	tokenizerr   c             C   sf   |  d | jddd}|j}|  d t| }|  d t| \}}}| jddd t|||||S )zI
    requirement = WS? IDENTIFIER WS? extras WS? requirement_details
    WS
IDENTIFIERz1package name at the start of dependency specifier)expectedENDzend of dependency specifier)consumeexpecttext_parse_extras_parse_requirement_detailsr    )r,   Z
name_tokenr!   r#   r"   r$   r%   r   r   r   r*   C   s    



r*   c             C   s   d}d}d}|  dr|   | d | j}| jdddj}| j dd	d
rV|||fS | jddd | j dd	d
r||||fS t| |dd}nF| j}t| }| d | j dd	d
r|||fS t| ||rdndd}|||fS )z~
    requirement_details = AT URL (WS requirement_marker?)?
                        | specifier WS? (requirement_marker)?
     NATr-   URLzURL after @)r/   r0   T)peekzwhitespace after URLzURL and whitespace)
span_startafterzversion specifierz#name and no valid version specifier)checkreadr1   positionr2   r3   _parse_requirement_marker_parse_specifier)r,   r$   r"   r%   Z	url_startZspecifier_startr   r   r   r5   X   s4    





r5   )r,   r:   r;   r   c            C   s>   |  ds | jd| d|d |   t| }| d |S )z3
    requirement_marker = SEMICOLON marker WS?
    	SEMICOLONz!Expected end or semicolon (after ))r:   r-   )r<   raise_syntax_errorr=   _parse_markerr1   )r,   r:   r;   r%   r   r   r   r?      s    


r?   c          	   C   sJ   | j dddsg S | dd" | d t| }| d W dQ R X |S )zG
    extras = (LEFT_BRACKET wsp* extras_list? wsp* RIGHT_BRACKET)?
    ZLEFT_BRACKETT)r9   ZRIGHT_BRACKETr-   N)r<   enclosing_tokensr1   _parse_extras_list)r,   r#   r   r   r   r4      s    
r4   c             C   s   g }|  ds|S ||  j x`| d | j dddrH| d n|  dsTP |   | d | jddd}||j q$W |S )	z>
    extras_list = identifier (wsp* ',' wsp* identifier)*
    r.   r-   T)r9   z"Expected comma between extra namesCOMMAzextra name after comma)r/   )r<   appendr=   r3   r1   rC   r2   )r,   r#   Zextra_tokenr   r   r   rF      s    



rF   c          	   C   s8   |  dd" | d t| }| d W dQ R X |S )zr
    specifier = LEFT_PARENTHESIS WS? version_many WS? RIGHT_PARENTHESIS
              | WS? version_many WS?
    LEFT_PARENTHESISRIGHT_PARENTHESISr-   N)rE   r1   _parse_version_many)r,   parsed_specifiersr   r   r   r@      s
    
r@   c             C   sT   d}xJ|  drN||  j7 }| d |  ds4P ||  j7 }| d qW |S )z@
    version_many = (SPECIFIER (WS? COMMA WS? SPECIFIER)*)?
    r6   Z	SPECIFIERr-   rG   )r<   r=   r3   r1   )r,   rL   r   r   r   rK      s    

rK   c             C   s   t t| tdS )N)r)   )rD   r
   r	   )r(   r   r   r   parse_marker   s    rM   c             C   s>   t | g}x.| dr8|  }t | }||j|f qW |S )z4
    marker = marker_atom (BOOLOP marker_atom)+
    BOOLOP)_parse_marker_atomr<   r=   extendr3   )r,   Z
expressiontokenZ
expr_rightr   r   r   rD      s    
rD   c          	   C   sd   |  d | jdddrN| dd" |  d t| }|  d W dQ R X nt| }|  d |S )zw
    marker_atom = WS? LEFT_PARENTHESIS WS? marker WS? RIGHT_PARENTHESIS WS?
                | WS? marker_item WS?
    r-   rI   T)r9   rJ   N)r1   r<   rE   rD   _parse_marker_item)r,   r%   r   r   r   rO      s    


rO   c             C   sJ   |  d t| }|  d t| }|  d t| }|  d |||fS )zG
    marker_item = WS? marker_var WS? marker_op WS? marker_var WS?
    r-   )r1   _parse_marker_var_parse_marker_op)r,   Zmarker_var_leftZ	marker_opZmarker_var_rightr   r   r   rR     s    



rR   c             C   sH   |  dr t|  jddS |  dr8t|  jS | jdd dS )z/
    marker_var = VARIABLE | QUOTED_STRING
    VARIABLE._ZQUOTED_STRINGz+Expected a marker variable or quoted string)messageN)r<   process_env_varr=   r3   replaceprocess_python_strrC   )r,   r   r   r   rS     s    

rS   )env_varr   c             C   s$   | dks| dkrt dS t | S d S )Nplatform_python_implementationpython_implementation)r   )r\   r   r   r   rY   '  s    rY   )
python_strr   c             C   s   t | }tt|S )N)astliteral_evalr   r   )r_   r   r   r   r   r[   1  s    
r[   c             C   sv   |  dr|   tdS |  drP|   | jddd | jddd tdS |  d	rht|  jS | d
S dS )z&
    marker_op = IN | NOT IN | OP
    INinZNOTr-   zwhitespace after 'not')r/   z'in' after 'not'znot inOPzJExpected marker operator, one of <=, <, !=, ==, >=, >, ~=, ===, in, not inN)r<   r=   r   r2   r3   rC   )r,   r   r   r   rT   6  s    


rT   )'__doc__r`   typingr   r   r   r   r   r   Z
_tokenizerr	   r
   r   r   r   r   Z	MarkerVarZ
MarkerItemZ
MarkerAtomr'   r    r   r+   r*   r5   intr?   r4   rF   r@   rK   rM   rD   rO   rR   rS   rY   r[   rT   r   r   r   r   <module>   s<    2
