U
    `»{j¨'  ã                   @  s¤  d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	m
Z
 ddl	mZ ddl	mZ ddl	mZ ddl	mZ dd	l	mZ dd
l	mZ ddgZG dd„ dejƒZejdd�G dd„ dƒƒZG dd„ deƒZG dd„ dƒZ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#œZdd$dœd%d&„Zdd'dœd(d)„Z G d*d+„ d+eƒZ!ejG d,d-„ d-ƒƒZ"G d.d/„ d/ee#e"f ƒZ$G d0d„ dƒZ%dS )1a  Evaluate match expressions, as used by `-k` and `-m`.

The grammar is:

expression: expr? EOF
expr:       and_expr ('or' and_expr)*
and_expr:   not_expr ('and' not_expr)*
not_expr:   'not' not_expr | '(' expr ')' | ident kwargs?

ident:      (\w|:|\+|-|\.|\[|\]|\\|/)+
kwargs:     ('(' name '=' value ( ', ' name '=' value )*  ')')
name:       a valid ident, but not a reserved keyword
value:      (unescaped) string literal | (-)?[0-9]+ | 'False' | 'True' | 'None'

The semantics are:

- Empty expression evaluates to False.
- ident evaluates to True or False according to a provided matcher function.
- or/and/not evaluate according to the usual boolean semantics.
- ident with parentheses and keyword arguments evaluates to True or False according to a provided matcher function.
é    )ÚannotationsN)ÚIterator)ÚLiteral)ÚMapping)ÚNoReturn)Úoverload)ÚProtocol)ÚSequenceÚ
ExpressionÚ
ParseErrorc                   @  s4   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdS )Ú	TokenTypezleft parenthesiszright parenthesisÚorÚandÚnotÚ
identifierzend of inputú=zstring literalú,N)Ú__name__Ú
__module__Ú__qualname__ÚLPARENÚRPARENÚORÚANDÚNOTÚIDENTÚEOFÚEQUALÚSTRINGÚCOMMA© r    r    úV/var/www/html/bwave/python/venv/lib/python3.8/site-packages/_pytest/mark/expression.pyr   .   s   r   T)Úfrozenc                   @  s*   e Zd ZU dZded< ded< ded< dS )	ÚToken)ÚtypeÚvalueÚposr   r$   Ústrr%   Úintr&   N)r   r   r   Ú	__slots__Ú__annotations__r    r    r    r!   r#   ;   s   
r#   c                   @  s0   e Zd ZdZddddœdd„Zddœd	d
„ZdS )r   z«The expression contains invalid syntax.

    :param column: The column in the line where the error occurred (1-based).
    :param message: A description of the error.
    r(   r'   ÚNone)ÚcolumnÚmessageÚreturnc                 C  s   || _ || _d S ©N©r,   r-   )Úselfr,   r-   r    r    r!   Ú__init__J   s    zParseError.__init__©r.   c                 C  s   d| j › d| j› �S )Nz
at column z: r0   ©r1   r    r    r!   Ú__str__N   s    zParseError.__str__N)r   r   r   Ú__doc__r2   r5   r    r    r    r!   r   C   s   c                   @  sŠ   e Zd ZdZdddœdd„Zdddœdd	„Zed
dddœdd„ƒZeddœd
dddœdd„ƒZddœd
dddœdd„Zdddœdd„ZdS )ÚScanner)ÚtokensÚcurrentr'   r+   ©Úinputr.   c                 C  s   |   |¡| _t| jƒ| _d S r/   )Úlexr8   Únextr9   )r1   r;   r    r    r!   r2   U   s    zScanner.__init__zIterator[Token]c                 c  s  d}|t |ƒk �r|| dkr(|d7 }q|| dkrNttjd|ƒV  |d7 }q|| dkrtttjd|ƒV  |d7 }q|| dkršttjd|ƒV  |d7 }q|| dkrÀttjd|ƒV  |d7 }q||  }dk�rR| ||d ¡}|d	k�rt|d d
|› d�ƒ‚|||d … }| d¡ }d	k�r4t|d dƒ‚ttj	||ƒV  |t |ƒ7 }qt
 d||d … ¡}|�rè| d¡}|dk�r’ttj||ƒV  nH|dk�r®ttj||ƒV  n,|dk�rÊttj||ƒV  nttj||ƒV  |t |ƒ7 }qt|d d|| › d�ƒ‚qttjd|ƒV  d S )Nr   )ú ú	é   ú(ú)r   r   )ú'ú"éÿÿÿÿzclosing quote "z" is missingú\z4escaping with "\" not supported in marker expressionz(:?\w|:|\+|-|\.|\[|\]|\\|/)+r   r   r   zunexpected character "rD   Ú )Úlenr#   r   r   r   r   r   Úfindr   r   ÚreÚmatchÚgroupr   r   r   r   r   )r1   r;   r&   Z
quote_charZend_quote_posr%   Zbackslash_posrK   r    r    r!   r<   Y   s^    






þþ



þzScanner.lexr   zLiteral[True]r#   )r$   Úrejectr.   c                C  s   d S r/   r    ©r1   r$   rM   r    r    r!   Úaccept�   s    zScanner.acceptF©rM   zLiteral[False]zToken | Nonec                C  s   d S r/   r    rN   r    r    r!   rO   �   s    Úboolc                C  sB   | j j|kr.| j }|jtjk	r*t| jƒ| _ |S |r>|  |f¡ d S r/   )r9   r$   r   r   r=   r8   rM   )r1   r$   rM   Útokenr    r    r!   rO   •   s    zSequence[TokenType]r   )Úexpectedr.   c                 C  s4   t | jjd d d dd„ |D ƒ¡| jjj¡ƒ‚d S )Nr@   zexpected {}; got {}z OR c                 s  s   | ]}|j V  qd S r/   )r%   )Ú.0r$   r    r    r!   Ú	<genexpr>£   s     z!Scanner.reject.<locals>.<genexpr>)r   r9   r&   ÚformatÚjoinr$   r%   )r1   rS   r    r    r!   rM   Ÿ   s    
þþzScanner.rejectN)	r   r   r   r)   r2   r<   r   rO   rM   r    r    r    r!   r7   R   s   4ÿ
r7   ú$zast.Expression)Úsr.   c                 C  s@   |   tj¡rt d¡}nt| ƒ}| j tjdd� t t |¡¡S )NFTrP   )rO   r   r   ÚastÚConstantÚexprÚfix_missing_locationsr
   ©rY   Úretr    r    r!   Ú
expression¯   s
    r`   zast.exprc                 C  s6   t | ƒ}|  tj¡r2t | ƒ}t t ¡ ||g¡}q|S r/   )Úand_exprrO   r   r   rZ   ÚBoolOpÚOr©rY   r_   Úrhsr    r    r!   r\   ¸   s
    r\   c                 C  s6   t | ƒ}|  tj¡r2t | ƒ}t t ¡ ||g¡}q|S r/   )Únot_exprrO   r   r   rZ   rb   ÚAndrd   r    r    r!   ra   À   s
    ra   c                 C  sÂ   |   tj¡r t t ¡ t| ƒ¡S |   tj¡rHt| ƒ}| j tj	dd� |S |   tj
¡}|r¨t t|j t ¡ ¡}|   tj¡r tj|g t| ƒd�}| j tj	dd� n|}|S |  tjtjtj
f¡ d S )NTrP   )ÚfuncÚargsÚkeywords)rO   r   r   rZ   ÚUnaryOpÚNotrf   r   r\   r   r   ÚNameÚIDENT_PREFIXr%   ÚLoadÚCallÚ
all_kwargsrM   )rY   r_   ÚidentÚnamer    r    r!   rf   È   s    rf   F)ÚTrueÚFalser+   zast.keywordc                 C  s  | j tjdd�}|j ¡ s2t|jd d|j› �ƒ‚t |j¡rXt|jd d|j› d�ƒ‚| j tj	dd� |   tj
¡ }rˆ|jdd… }nr| j tjdd�}|j } ¡ sÀ| d¡rÊ|dd …  ¡ rÊt|ƒ}n0|jtkràt|j }nt|jd d	|j› d
�ƒ‚t |jt |¡¡}|S )NTrP   r@   znot a valid python identifier z$unexpected reserved python keyword `ú`rE   ú-zunexpected character/s "rD   )rO   r   r   r%   Úisidentifierr   r&   ÚkeywordÚ	iskeywordr   r   ÚisdigitÚ
startswithr(   ÚBUILTIN_MATCHERSrZ   r[   )rY   Zkeyword_nameZvalue_tokenr%   Únumberr_   r    r    r!   Úsingle_kwargß   s<    

þþÿþý

þr   zlist[ast.keyword]c                 C  s*   t | ƒg}|  tj¡r&| t | ƒ¡ q
|S r/   )r   rO   r   r   Úappendr^   r    r    r!   rq     s    
rq   c                   @  s   e Zd Zddddœdd„ZdS )ÚMatcherCallr'   ústr | int | bool | NonerQ   )rs   Úkwargsr.   c                K  s   d S r/   r    )r1   rs   rƒ   r    r    r!   Ú__call__  ó    zMatcherCall.__call__N)r   r   r   r„   r    r    r    r!   r�   
  s   r�   c                   @  s<   e Zd ZU ded< ded< ddœdd„Zd	dd
œdd„ZdS )ÚMatcherNameAdapterr�   Úmatcherr'   rs   rQ   r3   c                 C  s   |   | j¡S r/   ©r‡   rs   r4   r    r    r!   Ú__bool__  s    zMatcherNameAdapter.__bool__r‚   )rƒ   r.   c                 K  s   | j | jf|ŽS r/   rˆ   )r1   rƒ   r    r    r!   r„     s    zMatcherNameAdapter.__call__N)r   r   r   r*   r‰   r„   r    r    r    r!   r†     s   
r†   c                   @  sL   e Zd ZdZdddœdd„Zddd	œd
d„Zddœdd„Zddœdd„ZdS )ÚMatcherAdapterzDAdapts a matcher function to a locals mapping as required by eval().r�   r+   ©r‡   r.   c                 C  s
   || _ d S r/   )r‡   )r1   r‡   r    r    r!   r2     s    zMatcherAdapter.__init__r'   r†   )Úkeyr.   c                 C  s   t | j|ttƒd … d�S )Nrˆ   )r†   r‡   rH   rn   )r1   rŒ   r    r    r!   Ú__getitem__   s    zMatcherAdapter.__getitem__zIterator[str]r3   c                 C  s
   t ƒ ‚d S r/   ©ÚNotImplementedErrorr4   r    r    r!   Ú__iter__#  s    zMatcherAdapter.__iter__r(   c                 C  s
   t ƒ ‚d S r/   rŽ   r4   r    r    r!   Ú__len__&  s    zMatcherAdapter.__len__N)r   r   r   r6   r2   r�   r�   r‘   r    r    r    r!   rŠ     s
   rŠ   c                   @  sH   e Zd ZdZdZdddœdd„Zedd d	œd
d„ƒZdddœdd„ZdS )r
   zwA compiled match expression as used by -k and -m.

    The expression can be evaluated against different matchers.
    ©Úcodeztypes.CodeTyper+   )r“   r.   c                 C  s
   || _ d S r/   r’   )r1   r“   r    r    r!   r2   2  s    zExpression.__init__r'   r:   c                 C  s"   t t|ƒƒ}t|ddd�}t|ƒS )z\Compile a match expression.

        :param input: The input expression - one line.
        z<pytest match expression>Úeval)ÚfilenameÚmode)r`   r7   Úcompiler
   )r1   r;   Zastexprr“   r    r    r!   r—   5  s    ýzExpression.compiler�   rQ   r‹   c                 C  s   t t| jdi it|ƒƒƒ}|S )a	  Evaluate the match expression.

        :param matcher:
            Given an identifier, should return whether it matches or not.
            Should be prepared to handle arbitrary strings as input.

        :returns: Whether the expression matches or not.
        Ú__builtins__)rQ   r”   r“   rŠ   )r1   r‡   r_   r    r    r!   ÚevaluateC  s    	zExpression.evaluateN)	r   r   r   r6   r)   r2   Úclassmethodr—   r™   r    r    r    r!   r
   *  s   )&r6   Ú
__future__r   rZ   ÚdataclassesÚenumry   rJ   ÚtypesÚtypingr   r   r   r   r   r   r	   Ú__all__ÚEnumr   Ú	dataclassr#   Ú	Exceptionr   r7   rn   r`   r\   ra   rf   r}   r   rq   r�   r†   r'   rŠ   r
   r    r    r    r!   Ú<module>   sF   þ
Z	$