o
    Ú­jk  ã                   @   sd  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rGe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dedejfdd„Zdedejfdd„Zdedejfdd„Zdedejf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   úT/var/www/html/CropPilot/venv/lib/python3.10/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                   @   s4   e Zd ZdZdededdfdd„Zdef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.
    ÚcolumnÚmessageÚreturnNc                 C   s   || _ || _d S ©N©r&   r'   )Úselfr&   r'   r   r   r   Ú__init__C   s   
zParseError.__init__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                   @   sn   e Zd ZdZdeddfdd„Zdedee fdd„Zd	d
œde	de
dee fdd„Zdee	 defdd„ZdS )ÚScanner)ÚtokensÚcurrentÚinputr(   Nc                 C   s   |   |¡| _t| jƒ| _d S r)   )Úlexr1   Únextr2   )r+   r3   r   r   r   r,   N   s   zScanner.__init__c                 c   s<  � d}|t |ƒk r”|| dv r|d7 }nz|| dkr'ttjd|ƒV  |d7 }ng|| dkr:ttjd|ƒV  |d7 }nTt d||d … ¡}|r�| d¡}|dkrXttj||ƒV  n"|dkrettj	||ƒV  n|d	krrttj
||ƒV  nttj||ƒV  |t |ƒ7 }nt|d d
|| › d�ƒ‚|t |ƒk s	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+   r3   r!   r?   r    r   r   r   r4   R   s8   €



þézScanner.lexF©Úrejectr   rB   c                C   sB   | j j|u r| j }|jtjurt| jƒ| _ |S |r|  |f¡ d S r)   )r2   r   r   r   r5   r1   rB   )r+   r   rB   Útokenr   r   r   Úacceptq   s   zScanner.acceptÚexpectedc                 C   s0   t | jjd d d dd„ |D ƒ¡| jjj¡ƒ‚)Nr8   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   r2   r!   ÚformatÚjoinr   r    )r+   rE   r   r   r   rB   {   s   
þþzScanner.reject)r   r   r   r"   r$   r,   r   r   r4   r   Úboolr   rD   r   r   rB   r   r   r   r   r0   K   s     
r0   ú$Úsr(   c                 C   s>   |   tj¡rtdƒ}nt| ƒ}| j tjdd� t t |¡¡S )NFTrA   )rD   r   r   ÚastNameConstantÚexprÚastÚfix_missing_locationsr
   )rL   Úretr   r   r   Ú
expression‹   s
   
rR   c                 C   ó@   t | ƒ}|  tj¡rt | ƒ}t t ¡ ||g¡}|  tj¡s
|S r)   )Úand_exprrD   r   r   rO   ÚBoolOpÚOr©rL   rQ   Úrhsr   r   r   rN   ”   ó   þrN   c                 C   rS   r)   )Únot_exprrD   r   r   rO   rU   ÚAndrW   r   r   r   rT   œ   rY   rT   c                 C   sˆ   |   tj¡rt t ¡ t| ƒ¡S |   tj¡r$t| ƒ}| j tj	dd� |S |   tj
¡}|r7t t|j t ¡ ¡S |  tjtjtj
f¡ d S )NTrA   )rD   r   r   rO   ÚUnaryOpÚNotrZ   r   rN   r   r   ÚNameÚIDENT_PREFIXr    ÚLoadrB   )rL   rQ   Úidentr   r   r   rZ   ¤   s   rZ   c                   @   s^   e Zd ZdZdeegef ddfdd„Zdedefdd	„Zde	e fd
d„Z
defdd„ZdS )ÚMatcherAdapterzDAdapts a matcher function to a locals mapping as required by eval().Úmatcherr(   Nc                 C   ó
   || _ d S r)   )rc   )r+   rc   r   r   r   r,   ´   ó   
zMatcherAdapter.__init__Úkeyc                 C   s   |   |ttƒd … ¡S r)   )rc   r=   r_   )r+   rf   r   r   r   Ú__getitem__·   s   zMatcherAdapter.__getitem__c                 C   ó   t ƒ ‚r)   ©ÚNotImplementedErrorr-   r   r   r   Ú__iter__º   ó   zMatcherAdapter.__iter__c                 C   rh   r)   ri   r-   r   r   r   Ú__len__½   rl   zMatcherAdapter.__len__)r   r   r   r/   r   r$   rJ   r,   rg   r   rk   r%   rm   r   r   r   r   rb   ±   s    rb   c                   @   sZ   e Zd ZdZdZdejddfdd„Zede	dd fd	d
„ƒZ
dee	gef defdd„ZdS )r
   zwA compiled match expression as used by -k and -m.

    The expression can be evaluated against different matchers.
    ©Úcodero   r(   Nc                 C   rd   r)   rn   )r+   ro   r   r   r   r,   É   re   zExpression.__init__r3   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)rR   r0   Úcompiler
   )r+   r3   Úastexprro   r   r   r   rs   Ì   s   ýzExpression.compilerc   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__)rp   ro   rb   )r+   rc   rQ   r   r   r   ÚevaluateÚ   s   	zExpression.evaluate)r   r   r   r/   r"   ÚtypesÚCodeTyper,   Úclassmethodr$   rs   r   rJ   rv   r   r   r   r   r
   Á   s     )#r/   rO   ÚdataclassesÚenumr>   Úsysrw   Útypingr   r   r   r   r   r   Úversion_infoÚConstantrM   ÚNameConstantÚ__all__ÚEnumr   Ú	dataclassr   Ú	Exceptionr   r0   r_   r
   rR   rN   rT   rZ   r$   rJ   rb   r   r   r   r   Ú<module>   s>    
þ

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