U
    +5ø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                   @  sx   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dœdd„Zdddœdd„Z	d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-xj899fla/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.serializec                 C  s   | j S r   r   r   r   r   r   Ú__getstate__   s    zNode.__getstate__Úobjectc                 C  s,   t |tƒs"td| jj› d|›�ƒ‚|| _d S )NúCannot restore z value from )Ú
isinstancer   Ú	TypeErrorr   r   r   r   r   r   r   Ú_restore_value"   s
    
ÿzNode._restore_value)Ústater   c                 C  sš   t |tƒr|  |¡ d S t |tƒrZt|ƒdkrZ|\}}t |tƒrZd|krZ|  |d ¡ d S t |tƒr~d|kr~|  |d ¡ d S td| jj› d|›�ƒ‚d S )Né   r   r$   z from )	r%   r   r'   ÚtupleÚlenÚdictr&   r   r   )r   r(   Ú_Z	slot_dictr   r   r   Ú__setstate__)   s    

zNode.__setstate__N)r   Ú
__module__Ú__qualname__Ú	__slots__r   r   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 )ÚVariabler   r   r   c                 C  s   t | ƒS r   ©r   r   r   r   r   r!   >   s    zVariable.serializeN©r   r/   r0   r1   r!   r   r   r   r   r2   ;   s   r2   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!   E   s    zValue.serializeNr4   r   r   r   r   r5   B   s   r5   c                   @  s   e Zd ZdZddœdd„ZdS )ÚOpr   r   r   c                 C  s   t | ƒS r   r3   r   r   r   r   r!   L   s    zOp.serializeNr4   r   r   r   r   r7   I   s   r7   )Ú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/   r0   Ú__annotations__r   r   r   r   r<   W   s
   
r<   r   )Úsourcer   c                 C  s   t t| td�ƒS ©N)Úrules)Ú_parse_requirementr   r
   ©rD   r   r   r   Úparse_requirementb   s    rI   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<   )rJ   Z
name_tokenr=   r@   r>   rA   rB   r   r   r   rG   f   s    
 ÿ

rG   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ÚATrK   ÚURLzURL after @rM   rO   T©Úpeekzwhitespace after URLz$semicolon (after URL and whitespace))Ú
span_startrN   zEcomma (within version specifier), semicolon (after version specifier)z0semicolon (after name with no version specifier))ÚcheckÚreadrP   ÚpositionrQ   rR   Ú_parse_requirement_markerÚ_parse_specifier)rJ   rA   r>   rB   Z	url_startZspecifier_startr   r   r   rT   {   s>    



ý

ÿú
rT   Úint)rJ   rZ   rN   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©rZ   Zspan_endrK   )r[   Úraise_syntax_errorr\   Ú_parse_markerrP   )rJ   rZ   rN   rB   r   r   r   r^   °   s    

ý
r^   r?   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_BRACKETTrX   ZRIGHT_BRACKETr@   ©ZaroundrK   )r[   Úenclosing_tokensrP   Ú_parse_extras_list)rJ   r@   r   r   r   rS   Å   s    ý
rS   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)*
    rL   rK   TrX   z"Expected comma between extra namesÚCOMMAzextra name after commarM   )r[   Úappendr\   rR   rP   rc   rQ   )rJ   r@   Zextra_tokenr   r   r   rg   Ø   s    



rg   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 specifierre   rK   )rf   rP   Ú_parse_version_many)rJ   Úparsed_specifiersr   r   r   r_   ó   s    ý
r_   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)*)?
    rU   Z	SPECIFIERZVERSION_PREFIX_TRAILTrX   z6.* suffix can only be used with `==` or `!=` operatorsr	   rb   ZVERSION_LOCAL_LABEL_TRAILz@Local version label can only be used with `==` or `!=` operatorsrK   rh   )r[   r]   r\   rR   rc   rP   )rJ   rm   rZ   r   r   r   rl     s,    
ýý

rl   c                 C  s   t t| td�ƒS rE   )Ú_parse_full_markerr   r
   rH   r   r   r   Úparse_marker$  s    ro   c                 C  s   t | ƒ}| jddd� |S )NrO   zend of marker expressionrM   )rd   rQ   )rJ   Úretvalr   r   r   rn   (  s    rn   c                 C  s:   t | ƒg}|  d¡r6|  ¡ }t | ƒ}| |j|f¡ q
|S )z4
    marker = marker_atom (BOOLOP marker_atom)+
    ÚBOOLOP)Ú_parse_marker_atomr[   r\   ÚextendrR   )rJ   Z
expressionÚtokenZ
expr_rightr   r   r   rd   .  s    

rd   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?
    rK   rj   TrX   rk   zmarker expressionre   )rP   r[   rf   rd   Ú_parse_marker_item)rJ   rB   r   r   r   rr   :  s    
ý

rr   Ú
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?
    rK   )rP   Ú_parse_marker_varÚ_parse_marker_op)rJ   Zmarker_var_leftZ	marker_opZmarker_var_rightr   r   r   ru   P  s    



ru   Ú	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Ú.r-   ZQUOTED_STRINGz+Expected a marker variable or quoted string)ÚmessageN)r[   Úprocess_env_varr\   rR   ÚreplaceÚprocess_python_strrc   ©rJ   r   r   r   rw   ^  s    

ÿrw   )Úenv_varr   c                 C  s   | dkrt dƒS t | ƒS d S )N)Úplatform_python_implementationÚpython_implementationr‚   )r2   )r�   r   r   r   r}   l  s    r}   )Ú
python_strr   c                 C  s   t  | ¡}tt|ƒƒS r   )ÚastÚliteral_evalr5   r   )r„   r   r   r   r   r   s  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NOTrK   zwhitespace after 'not'rM   z'in' after 'not'znot inÚOPzJExpected marker operator, one of <=, <, !=, ==, >=, >, ~=, ===, in, not inN)r[   r\   r7   rQ   rR   rc   r€   r   r   r   rx   x  s    


ÿrx   ))Ú__doc__Ú
__future__r   r…   Útypingr   r   r   r   r   r   Ú
_tokenizerr
   r   r   r2   r5   r7   ZMarkerLogicalry   rv   r:   r;   r<   rI   rG   rT   r^   rS   rg   r_   rl   ro   rn   rd   rr   ru   rw   r}   r   rx   r   r   r   r   Ú<module>   s>    ,5 