a
    !fk                     @   s\  d 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 ejd	krejZnej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eejdddZeejdddZeejdddZeejdddZG dd  d e
e e!f Z"G d!d
 d
ZdS )"a  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
ident:      (\w|:|\+|-|\.|\[|\]|\\|/)+

The semantics are:

- Empty expression evaluates to False.
- ident evaluates to True of False according to a provided matcher function.
- or/and/not evaluate according to the usual boolean semantics.
    N)Callable)Iterator)Mapping)NoReturn)Optional)Sequence)      
Expression
ParseErrorc                   @   s(   e 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 inputN)
__name__
__module____qualname__LPARENRPARENORANDNOTIDENTEOF r   r   X/var/www/html/python-backend/venv/lib/python3.9/site-packages/_pytest/mark/expression.pyr   *   s   r   T)frozenc                   @   s*   e Zd ZU dZeed< eed< eed< dS )Token)typevalueposr   r    r!   N)r   r   r   	__slots__r   __annotations__strintr   r   r   r   r   4   s   
r   c                   @   s0   e Zd ZdZeeddddZedddZdS )	r   zThe expression contains invalid syntax.

    :param column: The column in the line where the error occurred (1-based).
    :param message: A description of the error.
    N)columnmessagereturnc                 C   s   || _ || _d S Nr&   r'   )selfr&   r'   r   r   r   __init__C   s    zParseError.__init__r(   c                 C   s   d| j  d| j S )Nz
at column z: r*   r+   r   r   r   __str__G   s    zParseError.__str__)r   r   r   __doc__r%   r$   r,   r/   r   r   r   r   r   <   s   c                   @   sd   e Zd ZdZeddddZeee dddZdd	e	e
ee d
ddZee	 edddZdS )Scanner)tokenscurrentNinputr(   c                 C   s   |  || _t| j| _d S r)   )lexr2   nextr3   )r+   r5   r   r   r   r,   N   s    zScanner.__init__c                 c   s4  d}|t |k r || dv r(|d7 }q|| dkrNttjd|V  |d7 }q|| dkrtttjd|V  |d7 }qtd||d  }|r|d}|dkrttj||V  nD|dkrttj	||V  n*|d	krttj
||V  nttj||V  |t |7 }qt|d d
||  dqttjd|V  d S )Nr   ) 	   ()z(:?\w|:|\+|-|\.|\[|\]|\\|/)+r   r   r   zunexpected character "" )lenr   r   r   r   rematchgroupr   r   r   r   r   r   )r+   r5   r!   rA   r    r   r   r   r6   R   s4    



zScanner.lexFreject)r   rD   r(   c                C   sB   | j j|u r.| j }|jtjur*t| j| _ |S |r>| |f d S r)   )r3   r   r   r   r7   r2   rD   )r+   r   rD   tokenr   r   r   acceptq   s    zScanner.accept)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>       z!Scanner.reject.<locals>.<genexpr>)r   r3   r!   formatjoinr   r    )r+   rG   r   r   r   rD   {   s    
zScanner.reject)r   r   r   r"   r$   r,   r   r   r6   r   boolr   rF   r   r   rD   r   r   r   r   r1   K   s
   
r1   $)sr(   c                 C   s>   |  tjrtd}nt| }| j tjdd tt|S )NFTrC   )rF   r   r   astNameConstantexprastfix_missing_locationsr
   )rO   retr   r   r   
expression   s
    
rU   c                 C   s6   t | }| tjr2t | }tt ||g}q|S r)   )and_exprrF   r   r   rR   BoolOpOrrO   rT   rhsr   r   r   rQ      s
    rQ   c                 C   s6   t | }| tjr2t | }tt ||g}q|S r)   )not_exprrF   r   r   rR   rW   AndrY   r   r   r   rV      s
    rV   c                 C   s   |  tjr tt t| S |  tjrHt| }| j tj	dd |S |  tj
}|rntt|j t S | tjtjtj
f d S )NTrC   )rF   r   r   rR   UnaryOpNotr[   r   rQ   r   r   NameIDENT_PREFIXr    LoadrD   )rO   rT   identr   r   r   r[      s    r[   c                   @   sZ   e Zd ZdZeegef ddddZeedddZe	e d	d
dZ
ed	ddZdS )MatcherAdapterzDAdapts a matcher function to a locals mapping as required by eval().Nmatcherr(   c                 C   s
   || _ d S r)   )re   )r+   re   r   r   r   r,      s    zMatcherAdapter.__init__)keyr(   c                 C   s   |  |ttd  S r)   )re   r?   r`   )r+   rf   r   r   r   __getitem__   s    zMatcherAdapter.__getitem__r-   c                 C   s
   t  d S r)   NotImplementedErrorr.   r   r   r   __iter__   s    zMatcherAdapter.__iter__c                 C   s
   t  d S r)   rh   r.   r   r   r   __len__   s    zMatcherAdapter.__len__)r   r   r   r0   r   r$   rM   r,   rg   r   rj   r%   rk   r   r   r   r   rc      s
   rc   c                   @   sT   e Zd ZdZdZejddddZee	d ddd	Z
ee	gef e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.
    codeN)rm   r(   c                 C   s
   || _ d S r)   rl   )r+   rm   r   r   r   r,      s    zExpression.__init__r4   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)rU   r1   compiler
   )r+   r5   Zastexprrm   r   r   r   rq      s    zExpression.compilerd   c                 C   s   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__)rn   rm   rc   )r+   re   rT   r   r   r   evaluate   s    	zExpression.evaluate)r   r   r   r0   r"   typesCodeTyper,   classmethodr$   rq   r   rM   rs   r   r   r   r   r
      s   )#r0   rR   dataclassesenumr@   sysrt   typingr   r   r   r   r   r   version_infoConstantrP   NameConstant__all__Enumr   	dataclassr   	Exceptionr   r1   r`   r
   rU   rQ   rV   r[   r$   rM   rc   r   r   r   r   <module>   s<   


=	