
    g'                       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ej$                        Z ej(                  d       G d d             Z G d de      Z G d d      ZdZd&dZd'dZd'dZd'dZddddZd(dZd)dZ  G d d e      Z!ej(                   G d! d"             Z" G d# d$ee#e"f         Z$ G d% d      Z%y)*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 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                  4    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
Zy)	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     L/var/www/openai/venv/lib/python3.12/site-packages/_pytest/mark/expression.pyr   r   .   s4    F F	B
C
CE
CEFEr#   r   T)frozenc                  0    e Zd ZU dZded<   ded<   ded<   y)	Token)typevalueposr   r(   strr)   intr*   N)r   r   r   	__slots____annotations__r"   r#   r$   r'   r'   ;   s    (I
OJ	Hr#   r'   c                       e Zd ZdZddZddZy)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.
    c                     || _         || _        y Ncolumnmessage)selfr3   r4   s      r$   __init__zParseError.__init__J   s    r#   c                :    d| j                    d| j                   S )Nz
at column z: r2   r5   s    r$   __str__zParseError.__str__N   s    DKK=4<<.99r#   N)r3   r,   r4   r+   returnNone)r:   r+   )r   r   r   __doc__r6   r9   r"   r#   r$   r   r   C   s    :r#   c                  j    e Zd ZdZddZddZedd       Zedd	 	 	 	 	 dd       ZddddZdd	Zy
)Scanner)tokenscurrentc                d    | j                  |      | _        t        | j                        | _        y r1   )lexr?   nextr@   )r5   inputs     r$   r6   zScanner.__init__U   s!    hhuoDKK(r#   c              #    K   d}|t        |      k  r4||   dv r|dz  }n||   dk(  r$t        t        j                  d|       |dz  }n||   dk(  r$t        t        j                  d|       |dz  }n||   dk(  r$t        t        j
                  d|       |dz  }n||   dk(  r$t        t        j                  d|       |dz  }nf||   x}dv r|j                  ||dz         }|d	k(  rt        |dz   d
| d      |||dz    }|j                  d      x}d	k7  rt        |dz   d      t        t        j                  ||       |t        |      z  }nt        j                  d||d        }|r|j                  d      }|dk(  rt        t        j                  ||       nc|dk(  rt        t        j                  ||       n@|dk(  rt        t        j                  ||       nt        t        j                   ||       |t        |      z  }nt        |dz   d||    d      |t        |      k  r4t        t        j"                  d|       y w)Nr   ) 	   ()r   r   )'"zclosing quote "z" is missing\z4escaping with "\" not supported in marker expressionz(:?\w|:|\+|-|\.|\[|\]|\\|/)+r   r   r   zunexpected character "rL    )lenr'   r   r   r   r   r!   findr   r    rematchgroupr   r   r   r   r   )r5   rD   r*   
quote_charend_quote_posr)   backslash_posrS   s           r$   rB   zScanner.lexY   sb    CJSz[(qss"I,,c377qss"I,,c377qss"IOOS#66qss"IOOS#66q %c
**z9 %

:sQw ? B&$a)*\B  cMA$56%*ZZ%55M"<$%)O  I,,eS99s5z!!@%+N!KKNE}#ILL%==%#IMM5#>>%#IMM5#>>#IOOUC@@3u:%C$a0sA> Y CJ` IMM2s++s   II&I&c                    y r1   r"   r5   r(   rejects      r$   acceptzScanner.accept   s    JMr#   FrZ   c                    y r1   r"   rY   s      r$   r[   zScanner.accept   s     r#   c                   | j                   j                  |u rD| j                   }|j                  t        j                  urt	        | j
                        | _         |S |r| j                  |f       y r1   )r@   r(   r   r   rC   r?   rZ   )r5   r(   rZ   tokens       r$   r[   zScanner.accept   sV    <<$LLEzz.#DKK0LKK r#   c           	         t        | j                  j                  dz   dj                  dj	                  d |D              | j                  j
                  j                              )NrH   zexpected {}; got {}z OR c              3  4   K   | ]  }|j                     y wr1   )r)   ).0r(   s     r$   	<genexpr>z!Scanner.reject.<locals>.<genexpr>   s     <84DJJ8s   )r   r@   r*   formatjoinr(   r)   )r5   expecteds     r$   rZ   zScanner.reject   sT    LLq !((<8<<!!''
 	
r#   N)rD   r+   r:   r;   )rD   r+   r:   zIterator[Token])r(   r   rZ   zLiteral[True]r:   r'   )r(   r   rZ   zLiteral[False]r:   Token | None)r(   r   rZ   boolr:   rg   )rf   zSequence[TokenType]r:   r   )	r   r   r   r-   r6   rB   r   r[   rZ   r"   r#   r$   r>   r>   R   s^    %I)2,h M M;@*8	  9> 
r#   r>   $c                   | j                  t        j                        rt        j                  d      }n,t        |       }| j                  t        j                  d       t        j                  t        j                  |            S )NFTr\   )r[   r   r   astConstantexprfix_missing_locationsr   srets     r$   
expressionrr      sW    xx	U+1g	t,$$S^^C%899r#   c                   t        |       }| j                  t        j                        rUt        |       }t	        j
                  t	        j                         ||g      }| j                  t        j                        rU|S r1   )and_exprr[   r   r   rk   BoolOpOrrp   rq   rhss      r$   rm   rm      sW    
1+C
((9<<
 qkjjC:. ((9<<
  Jr#   c                   t        |       }| j                  t        j                        rUt        |       }t	        j
                  t	        j                         ||g      }| j                  t        j                        rU|S r1   )not_exprr[   r   r   rk   ru   Andrw   s      r$   rt   rt      sW    
1+C
((9==
!qkjjS#J/ ((9==
! Jr#   c                <   | j                  t        j                        r1t        j                  t        j
                         t        |             S | j                  t        j                        r.t        |       }| j                  t        j                  d       |S | j                  t        j                        }|rt        j                  t        |j                  z   t        j                               }| j                  t        j                        rDt        j                  |g t!        |             }| j                  t        j                  d       |S |}|S | j#                  t        j                  t        j                  t        j                  f       y )NTr\   )funcargskeywords)r[   r   r   rk   UnaryOpNotrz   r   rm   r   r   NameIDENT_PREFIXr)   LoadCall
all_kwargsrZ   )rp   rq   identnames       r$   rz   rz      s	   xx	{{3779hqk22xx	  !1g	!!$/
HHY__%Exxu{{2CHHJ?88I$$%((2
1FCHHY%%dH3 
 C
HHimmY--y?@r#   F)TrueFalser;   c                   | j                  t        j                  d      }|j                  j	                         s&t        |j                  dz   d|j                         t        j                  |j                        r't        |j                  dz   d|j                   d      | j                  t        j                  d       | j                  t        j                        x}r|j                  dd }n| j                  t        j                  d      }|j                  x}j                         s$|j                  d      r|dd  j                         rt        |      }nM|j                  t        v rt        |j                     }n't        |j                  dz   d	|j                   d
      t        j                  |j                  t        j                   |            }|S )NTr\   rH   znot a valid python identifier z$unexpected reserved python keyword ``rM   -zunexpected character/s "rL   )r[   r   r   r)   isidentifierr   r*   keyword	iskeywordr   r    isdigit
startswithr,   BUILTIN_MATCHERSrk   rl   )rp   keyword_namevalue_tokenr)   numberrq   s         r$   single_kwargr      s   88IOOD89L**,q ,\-?-?,@A
 	
 ++,q 2<3E3E2FaH
 	
 HHY__TH*hhy//00{0)4):):1R)@hhyth<"(((V113  %qr
""$KE"22$[%6%67E!#*;+<+<*=Q? 
 ++l((#,,u*=
>CJr#   c                    t        |       g}| j                  t        j                        r:|j	                  t        |              | j                  t        j                        r:|S r1   )r   r[   r   r!   appendro   s     r$   r   r     sE    ?
C
((9??
#

<?# ((9??
#Jr#   c                      e Zd ZddZy)MatcherCallc                    y r1   r"   )r5   r   kwargss      r$   __call__zMatcherCall.__call__  s    QTr#   N)r   r+   r   str | int | bool | Noner:   rh   )r   r   r   r   r"   r#   r$   r   r   
  s    Tr#   r   c                  2    e Zd ZU ded<   ded<   ddZd	dZy)
MatcherNameAdapterr   matcherr+   r   c                8    | j                  | j                        S r1   r   r   r8   s    r$   __bool__zMatcherNameAdapter.__bool__  s    ||DII&&r#   c                <     | j                   | j                  fi |S r1   r   )r5   r   s     r$   r   zMatcherNameAdapter.__call__  s    t||DII000r#   N)r:   rh   )r   r   r:   rh   )r   r   r   r.   r   r   r"   r#   r$   r   r     s    
I'1r#   r   c                  0    e Zd ZdZddZddZd	dZd
dZy)MatcherAdapterzDAdapts a matcher function to a locals mapping as required by eval().c                    || _         y r1   )r   )r5   r   s     r$   r6   zMatcherAdapter.__init__  s	    r#   c                P    t        | j                  |t        t              d        S )Nr   )r   r   rP   r   )r5   keys     r$   __getitem__zMatcherAdapter.__getitem__   s     !$,,S\ARAT=UVVr#   c                    t               r1   NotImplementedErrorr8   s    r$   __iter__zMatcherAdapter.__iter__#      !##r#   c                    t               r1   r   r8   s    r$   __len__zMatcherAdapter.__len__&  r   r#   N)r   r   r:   r;   )r   r+   r:   r   )r:   zIterator[str])r:   r,   )r   r   r   r<   r6   r   r   r   r"   r#   r$   r   r     s    NW$$r#   r   c                  6    e Zd ZdZdZddZedd       Zd	dZy)
r   zwA compiled match expression as used by -k and -m.

    The expression can be evaluated against different matchers.
    codec                    || _         y r1   r   )r5   r   s     r$   r6   zExpression.__init__2  s	    	r#   c                \    t        t        |            }t        |dd      }t        |      S )z\Compile a match expression.

        :param input: The input expression - one line.
        z<pytest match expression>eval)filenamemode)rr   r>   compiler   )r5   rD   astexprr   s       r$   r   zExpression.compile5  s2     WU^,&0 

 $r#   c           	     \    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__)rh   r   r   r   )r5   r   rq   s      r$   evaluatezExpression.evaluateC  s*     dii.")=~g?VWX
r#   N)r   ztypes.CodeTyper:   r;   )rD   r+   r:   r   )r   r   r:   rh   )	r   r   r   r<   r-   r6   classmethodr   r   r"   r#   r$   r   r   *  s,    
 I    
r#   )rp   r>   r:   zast.Expression)rp   r>   r:   zast.expr)rp   r>   r:   zast.keyword)rp   r>   r:   zlist[ast.keyword])&r<   
__future__r   rk   dataclassesenumr   rR   typestypingr   r   r   r   r   r	   r
   __all__Enumr   	dataclassr'   	Exceptionr   r>   r   rr   rm   rt   rz   r   r   r   r   r   r+   r   r   r"   r#   r$   <module>r      s  , # 
    	         
		 
 d#  $: :T
 T
t :A( !5$? !HU( U 1 1 1$WS"445 $ # #r#   