U
    42i)                     @  s  d Z ddlm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d Ze
eef Ze	eeef Ze
eed f Zee
deef  ZG dd de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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-Z dddd.d/Z!dddd0d1Z"dddd2d3Z#dd4dd5d6Z$dd7dd8d9Z%dd
d:d;d<Z&ddd=d>d?Z'dddd@dAZ(dS )BzHandwritten parser of dependency specifiers.

The docstring for each __parse_* function contains EBNF-inspired grammar representing
the implementation.
    )annotationsN)ListLiteral
NamedTupleSequenceTupleUnion   )DEFAULT_RULES	Tokenizerc                   @  sJ   e Zd ZdZdddddZdddd	Zddd
dZddddZdS )NodevaluestrNone)r   returnc                 C  s
   || _ d S Nr   )selfr    r   5/tmp/pip-unpacked-wheel-7wv4vqcv/packaging/_parser.py__init__   s    zNode.__init__r   c                 C  s   | j S r   r   r   r   r   r   __str__   s    zNode.__str__c                 C  s   d| j j d| jdS )N<(z)>)	__class____name__r   r   r   r   r   __repr__   s    zNode.__repr__c                 C  s   t d S r   )NotImplementedErrorr   r   r   r   	serialize   s    zNode.serializeN)r   
__module____qualname__	__slots__r   r   r   r    r   r   r   r   r      s
   r   c                   @  s   e Zd ZdZddddZdS )Variabler   r   r   c                 C  s   t | S r   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dZddddZdS )Valuer   r   r   c                 C  s   d|  dS )N"r   r   r   r   r   r    )   s    zValue.serializeNr&   r   r   r   r   r'   &   s   r'   c                   @  s   e Zd ZdZddddZdS )Opr   r   r   c                 C  s   t | S r   r%   r   r   r   r   r    0   s    zOp.serializeNr&   r   r   r   r   r)   -   s   r)   )andor
MarkerAtom
MarkerListc                   @  s6   e Zd ZU ded< ded< ded< ded< ded< d	S )
ParsedRequirementr   nameurl	list[str]extras	specifierzMarkerList | NonemarkerN)r   r!   r"   __annotations__r   r   r   r   r.   ;   s
   
r.   r   )sourcer   c                 C  s   t t| tdS N)rules)_parse_requirementr   r
   r6   r   r   r   parse_requirementF   s    r;   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/   r2   r0   r3   r4   r   r   r   r9   J   s    
 

r9   z"tuple[str, str, MarkerList | None]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?   rA   Tpeekzwhitespace after URLz$semicolon (after URL and whitespace))
span_startr@   zEcomma (within version specifier), semicolon (after version specifier)z0semicolon (after name with no version specifier))checkreadrB   positionrC   rD   _parse_requirement_marker_parse_specifier)r<   r3   r0   r4   Z	url_startZspecifier_startr   r   r   rF   _   s>    






rF   int)r<   rL   r@   r   c                C  s@   |  ds"| jd| d|dd |   t| }| d |S )z3
    requirement_marker = SEMICOLON marker WS?
    	SEMICOLONz	Expected z or endNrL   Zspan_endr=   )rM   raise_syntax_errorrN   _parse_markerrB   )r<   rL   r@   r4   r   r   r   rP      s    


rP   r1   c              	   C  sN   | j dddsg S | jdddd" | d t| }| d W 5 Q R X |S )zG
    extras = (LEFT_BRACKET wsp* extras_list? wsp* RIGHT_BRACKET)?
    ZLEFT_BRACKETTrJ   ZRIGHT_BRACKETr2   Zaroundr=   )rM   enclosing_tokensrB   _parse_extras_list)r<   r2   r   r   r   rE      s    
rE   c                 C  s   g }|  ds|S ||  j | d | j dddrF| d n|  dsRq|   | d | jddd}||j q"|S )	z>
    extras_list = identifier (wsp* ',' wsp* identifier)*
    r>   r=   TrJ   z"Expected comma between extra namesCOMMAzextra name after commar?   )rM   appendrN   rD   rB   rU   rC   )r<   r2   Zextra_tokenr   r   r   rY      s    



rY   c              	   C  s<   | j dddd" | d t| }| d W 5 Q R X |S )zr
    specifier = LEFT_PARENTHESIS WS? version_many WS? RIGHT_PARENTHESIS
              | WS? version_many WS?
    LEFT_PARENTHESISRIGHT_PARENTHESISzversion specifierrW   r=   )rX   rB   _parse_version_many)r<   parsed_specifiersr   r   r   rQ      s    
rQ   c                 C  s   d}|  dr| j}||  j7 }| j dddrF| jd|| jd d | j d	ddrf| jd
|| jd | d |  ds|q||  j7 }| d q|S )z@
    version_many = (SPECIFIER (WS? COMMA WS? SPECIFIER)*)?
    rG   Z	SPECIFIERZVERSION_PREFIX_TRAILTrJ   z6.* suffix can only be used with `==` or `!=` operatorsr	   rT   ZVERSION_LOCAL_LABEL_TRAILz@Local version label can only be used with `==` or `!=` operatorsr=   rZ   )rM   rO   rN   rD   rU   rB   )r<   r_   rL   r   r   r   r^      s,    


r^   c                 C  s   t t| tdS r7   )_parse_full_markerr   r
   r:   r   r   r   parse_marker  s    ra   c                 C  s   t | }| jddd |S )NrA   zend of marker expressionr?   )rV   rC   )r<   retvalr   r   r   r`     s    r`   c                 C  s:   t | g}| dr6|  }t | }||j|f q
|S )z4
    marker = marker_atom (BOOLOP marker_atom)+
    BOOLOP)_parse_marker_atomrM   rN   extendrD   )r<   Z
expressiontokenZ
expr_rightr   r   r   rV     s    

rV   c              	   C  sh   |  d | jdddrR| jdddd" |  d t| }|  d W 5 Q R X nt| }|  d |S )zw
    marker_atom = WS? LEFT_PARENTHESIS WS? marker WS? RIGHT_PARENTHESIS WS?
                | WS? marker_item WS?
    r=   r\   TrJ   r]   zmarker expressionrW   )rB   rM   rX   rV   _parse_marker_item)r<   r4   r   r   r   rd     s    


rd   
MarkerItemc                 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=   )rB   _parse_marker_var_parse_marker_op)r<   Zmarker_var_leftZ	marker_opZmarker_var_rightr   r   r   rg   4  s    



rg   	MarkerVarc                 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)rM   process_env_varrN   rD   replaceprocess_python_strrU   r<   r   r   r   ri   B  s    

ri   )env_varr   c                 C  s   | dkrt dS t | S d S )N)platform_python_implementationpython_implementationru   )r$   )rt   r   r   r   rp   P  s    rp   )
python_strr   c                 C  s   t | }tt|S r   )astliteral_evalr'   r   )rw   r   r   r   r   rr   W  s    
rr   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)rM   rN   r)   rC   rD   rU   rs   r   r   r   rj   \  s    


rj   ))__doc__
__future__r   rx   typingr   r   r   r   r   r   
_tokenizerr
   r   r   r$   r'   r)   ZMarkerLogicalrk   rh   r,   r-   r.   r;   r9   rF   rP   rE   rY   rQ   r^   ra   r`   rV   rd   rg   ri   rp   rr   rj   r   r   r   r   <module>   s>    5 