U
    b6{i)  ã                   @  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 )Bz˜Handwritten 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-zjp86yhe/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| ||rÊd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 