
    Xi+                       % S r SSKJr  SSKrSSKJr  SSKJr  SSKJr  SSKrSSK	r	SSK
r
SSKrSSKrSSKJr  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJr  SS/rSrS\S'    " S S\	R.                  5      r\R2                  " SS9 " S S5      5       r " S S5      rSrS)S jrS*S jrS*S jrS*S jr SSSS .r!S+S! jr"S,S" jr# " S# S\5      r$\R2                   " S$ S%5      5       r% " S& S'\\&\%4   5      r'\ " S( S5      5       r(g)-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.
- ident with parentheses and keyword arguments evaluates to True or False according to a provided matcher function.
- or/and/not evaluate according to the usual boolean semantics.
    )annotationsN)Iterator)Mapping)Sequence)Final)final)Literal)NoReturn)overload)Protocol
ExpressionExpressionMatcher<pytest match expression>r   	FILE_NAMEc                  <    \ rS rSrSrSrSrSrSrSr	Sr
S	rS
rSrSrg)	TokenType3   zleft parenthesiszright parenthesisorandnot
identifierzend of input=zstring literal, N)__name__
__module____qualname____firstlineno__LPARENRPARENORANDNOTIDENTEOFEQUALSTRINGCOMMA__static_attributes__r       J/var/www/html/venv/lib/python3.13/site-packages/_pytest/mark/expression.pyr   r   3   s4    F F	B
C
CE
CEFEr*   r   T)frozenc                  8    \ rS rSr% SrS\S'   S\S'   S\S'   S	rg
)Token@   )postypevaluer   r1   strr2   intr0   r   N)r   r   r   r   	__slots____annotations__r)   r   r*   r+   r.   r.   @   s    (I
OJ	Hr*   r.   c                      \ rS rSrSrSS jrSS jr\SS j5       r\SS.     SS jj5       rSS.SS	 jjrSS
 jr	Sr
g)ScannerH   )currentinputtokensc                p    Xl         U R                  U5      U l        [        U R                  5      U l        g N)r;   lexr<   nextr:   )selfr;   s     r+   __init__Scanner.__init__K   s&    
hhuoDKK(r*   c              #    #    SnU[        U5      :  GaR  X   S;   a  US-  nGO1X   S:X  a$  [        [        R                  SU5      v   US-  nGOX   S:X  a$  [        [        R                  SU5      v   US-  nGOX   S:X  a$  [        [        R
                  SU5      v   US-  nGOX   S:X  a$  [        [        R                  SU5      v   US-  nGOX   =nS;   a  UR                  X2S-   5      nUS	:X  a  [        S
U S3[        SUS-   U45      eXUS-    nUR                  S5      =nS	:w  a  [        S[        SUS-   U45      e[        [        R                  XR5      v   U[        U5      -  nO[        R                  " SXS  5      nU(       a  UR                  S5      nUS:X  a  [        [        R                  XR5      v   ObUS:X  a  [        [        R                  XR5      v   O?US:X  a  [        [        R                   XR5      v   O[        [        R"                  XR5      v   U[        U5      -  nO[        SX    S3[        SUS-   U45      eU[        U5      :  a  GMR  [        [        R$                  SU5      v   g 7f)Nr   ) 	   ()r   r   )'"zclosing quote "z" is missing\z4escaping with "\" not supported in marker expressionz(:?\w|:|\+|-|\.|\[|\]|\\|/)+r   r   r   zunexpected character "rK    )lenr.   r   r   r    r&   r(   findSyntaxErrorr   r'   rematchgroupr!   r"   r#   r$   r%   )rA   r;   r0   
quote_charend_quote_posr2   backslash_posrS   s           r+   r?   Scanner.lexP   s^    CJz[(qs"I,,c377qs"I,,c377qs"IOOS#66qs"IOOS#66q %
**z9 %

:Qw ? B&%)*\B"AsQw6  MA$56%*ZZ%55M"<%O"A}q'8%@  I,,e99s5z!!@%+N!KKNE}#ILL%==%#IMM5>>%#IMM5>>#IOOU@@3u:%C%0A>"AsQw6 Y CJ` IMM2s++s   I"J'Jc                   g r>   r   rA   r1   rejects      r+   acceptScanner.accept   s    JMr*   Fr[   c                   g r>   r   rZ   s      r+   r\   r]      s     r*   c                   U R                   R                  UL aE  U R                   nUR                  [        R                  La  [	        U R
                  5      U l         U$ U(       a  U R                  U45        g r>   )r:   r1   r   r%   r@   r<   r[   )rA   r1   r[   tokens       r+   r\   r]      sV    <<$LLEzz.#DKK0LKK r*   c                    [        SR                  SR                  S U 5       5      U R                  R                  R
                  5      [        SU R                  R                  S-   U R                  45      e)Nzexpected {}; got {}z OR c              3  8   #    U  H  oR                   v   M     g 7fr>   )r2   ).0r1   s     r+   	<genexpr>!Scanner.reject.<locals>.<genexpr>   s     <84JJ8s   rG   )	rQ   formatjoinr:   r1   r2   r   r0   r;   )rA   expecteds     r+   r[   Scanner.reject   sc    !((<8<<!!'' 4<<++a/<
 	
r*   N)r;   r3   returnNone)r;   r3   rk   zIterator[Token])r1   r   r[   zLiteral[True]rk   r.   )r1   r   r[   zLiteral[False]rk   Token | None)r1   r   r[   boolrk   rm   )ri   zSequence[TokenType]rk   r
   )r   r   r   r   r5   rB   r?   r   r\   r[   r)   r   r*   r+   r8   r8   H   s^    .I)
2,h M M;@*8	  9> 
r*   r8   $c                   U R                  [        R                  5      (       a  [        R                  " S5      nO)[        U 5      nU R                  [        R                  SS9  [        R                  " [        R                  " U5      5      $ )NFTr^   )r\   r   r%   astConstantexprfix_missing_locationsr   srets     r+   
expressionrx      sZ    xx	U+1g	t,$$S^^C%899r*   c                   [        U 5      nU R                  [        R                  5      (       a\  [        U 5      n[        R
                  " [        R                  " 5       X/5      nU R                  [        R                  5      (       a  M\  U$ r>   )and_exprr\   r   r!   rq   BoolOpOrrv   rw   rhss      r+   rs   rs      s[    
1+C
((9<<
 
 qkjjC:. ((9<<
 
  Jr*   c                   [        U 5      nU R                  [        R                  5      (       a\  [        U 5      n[        R
                  " [        R                  " 5       X/5      nU R                  [        R                  5      (       a  M\  U$ r>   )not_exprr\   r   r"   rq   r{   Andr}   s      r+   rz   rz      s[    
1+C
((9==
!
!qkjjSJ/ ((9==
!
! Jr*   c                \   U R                  [        R                  5      (       a3  [        R                  " [        R
                  " 5       [        U 5      5      $ U R                  [        R                  5      (       a+  [        U 5      nU R                  [        R                  SS9  U$ U R                  [        R                  5      nU(       a  [        R                  " [        UR                  -   [        R                  " 5       5      nU R                  [        R                  5      (       a?  [        R                  " U/ [!        U 5      S9nU R                  [        R                  SS9  U$ UnU$ U R#                  [        R                  [        R                  [        R                  45        g )NTr^   )funcargskeywords)r\   r   r#   rq   UnaryOpNotr   r   rs   r    r$   NameIDENT_PREFIXr2   LoadCall
all_kwargsr[   )rv   rw   identnames       r+   r   r      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Falserl   c                r   U R                  [        R                  SS9nUR                  R	                  5       (       d8  [        SUR                   3[        SUR                  S-   U R                  45      e[        R                  " UR                  5      (       a9  [        SUR                   S3[        SUR                  S-   U R                  45      eU R                  [        R                  SS9  U R                  [        R                  5      =n(       a  UR                  SS nOU R                  [        R                  SS9nUR                  =nR                  5       (       d.  UR                  S5      (       a$  USS  R                  5       (       a  [        U5      nOaUR                  [         ;   a  [         UR                     nO9[        S	UR                   S
3[        SUR                  S-   U R                  45      e["        R                  " UR                  ["        R$                  " U5      5      nU$ )NTr^   znot a valid python identifier rG   z$unexpected reserved python keyword ``rL   -zunexpected character/s "rK   )r\   r   r$   r2   isidentifierrQ   r   r0   r;   keyword	iskeywordr&   r'   isdigit
startswithr4   BUILTIN_MATCHERSrq   rr   )rv   keyword_namevalue_tokenr2   numberrw   s         r+   single_kwargr      s   88IOOD89L**,,,\-?-?,@A<++a/9
 	
 ++,,2<3E3E2FaH<++a/9
 	
 HHY__TH*hhy//00{0)4):):1R)@hhyth<!'''F0022c""vabz'9'9';';KE"22$[%6%67E*;+<+<*=Q?A{2AGG< 
 ++l((#,,u*=
>CJr*   c                    [        U 5      /nU R                  [        R                  5      (       a@  UR	                  [        U 5      5        U R                  [        R                  5      (       a  M@  U$ r>   )r   r\   r   r(   appendru   s     r+   r   r      sK    ?
C
((9??
#
#

<?# ((9??
#
#Jr*   c                  "    \ rS rSrSrSS jrSrg)r      a  A callable which, given an identifier and optional kwargs, should return
whether it matches in an :class:`Expression` evaluation.

Should be prepared to handle arbitrary strings as input.

If no kwargs are provided, the expression of the form `foo`.
If kwargs are provided, the expression is of the form `foo(1, b=True, "s")`.

If the expression is not supported (e.g. don't want to accept the kwargs
syntax variant), should raise :class:`~pytest.UsageError`.

Example::

    def matcher(name: str, /, **kwargs: str | int | bool | None) -> bool:
        # Match `cat`.
        if name == "cat" and not kwargs:
            return True
        # Match `dog(barks=True)`.
        if name == "dog" and kwargs == {"barks": False}:
            return True
        return False
c                   g r>   r   )rA   r   kwargss      r+   __call__ExpressionMatcher.__call__  s    QTr*   r   N)r   r3   r   str | int | bool | Nonerk   rn   )r   r   r   r   __doc__r   r)   r   r*   r+   r   r      s    . Ur*   c                  >    \ rS rSr% S\S'   S\S'   S
S jrSS jrSrg	)MatcherNameAdapteri  r   matcherr3   r   c                8    U R                  U R                  5      $ r>   r   r   rA   s    r+   __bool__MatcherNameAdapter.__bool__  s    ||DII&&r*   c                <    U R                   " U R                  40 UD6$ r>   r   )rA   r   s     r+   r   MatcherNameAdapter.__call__"  s    ||DII000r*   r   N)rk   rn   )r   r   rk   rn   )r   r   r   r   r6   r   r   r)   r   r*   r+   r   r     s    
I'1r*   r   c                  @    \ rS rSrSrS	S jrS
S jrSS jrSS jrSr	g)MatcherAdapteri&  zDAdapts a matcher function to a locals mapping as required by eval().c                    Xl         g r>   r   rA   r   s     r+   rB   MatcherAdapter.__init__)  s    r*   c                J    [        U R                  U[        [        5      S  S9$ )Nr   )r   r   rO   r   )rA   keys     r+   __getitem__MatcherAdapter.__getitem__,  s     !$,,S\ARAT=UVVr*   c                    [        5       er>   NotImplementedErrorr   s    r+   __iter__MatcherAdapter.__iter__/      !##r*   c                    [        5       er>   r   r   s    r+   __len__MatcherAdapter.__len__2  r   r*   r   N)r   r   rk   rl   )r   r3   rk   r   )rk   zIterator[str])rk   r4   )
r   r   r   r   r   rB   r   r   r   r)   r   r*   r+   r   r   &  s    NW$$r*   r   c                  D    \ rS rSrSrSrSS jr\S	S j5       rS
S jr	Sr
g)r   i6  zoA compiled match expression as used by -k and -m.

The expression can be evaluated against different matchers.
)_coder;   c                    Xl         X l        g r>   )r;   r   )rA   r;   codes      r+   rB   Expression.__init__?  s    !
 
r*   c                V    [        [        U5      5      n[        USSS9n[        X5      $ )zCompile a match expression.

:param input: The input expression - one line.

:raises SyntaxError: If the expression is malformed.
r   eval)filenamemode)rx   r8   compiler   )clsr;   astexprr   s       r+   r   Expression.compileD  s2     WU^,0

 %&&r*   c           	     X    [        [        U R                  S0 0[        U5      5      5      $ )at  Evaluate the match expression.

:param matcher:
    A callback which determines whether an identifier matches or not.
    See the :class:`ExpressionMatcher` protocol for details and example.

:returns: Whether the expression matches or not.

:raises UsageError:
    If the matcher doesn't support the expression. Cannot happen if the
    matcher supports all expressions.
__builtins__)rn   r   r   r   r   s     r+   evaluateExpression.evaluateT  s&     Dnb%9>';RSTTr*   N)r;   r3   r   ztypes.CodeTyperk   rl   )r;   r3   rk   r   )r   r   rk   rn   )r   r   r   r   r   r5   rB   classmethodr   r   r)   r   r*   r+   r   r   6  s-    
 #I!
 ' 'Ur*   )rv   r8   rk   zast.Expression)rv   r8   rk   zast.expr)rv   r8   rk   zast.keyword)rv   r8   rk   zlist[ast.keyword]))r   
__future__r   rq   collections.abcr   r   r   dataclassesenumr   rR   typestypingr   r   r	   r
   r   r   __all__r   r6   Enumr   	dataclassr.   r8   r   rx   rs   rz   r   r   r   r   r   r   r3   r   r   r   r*   r+   <module>r      s.  , # 
 $ # $    	         /	5 .
		 
 d#  $U
 U
v :A( !5$? DU U6 1 1 1$WS"445 $  *U *U *Ur*   