
    עi+                       U d Z ddlmZ ddlZddlmZ ddlm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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dZded<    G d de	j.                        Z ej2                  d       G d d             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j2                   G d$ d%             Z% G d& d'ee&e%f         Z'e 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.
- 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                  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     X/sites/domain-asset-master/.venv/lib/python3.12/site-packages/_pytest/mark/expression.pyr   r   3   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)postypevaluer   r-   strr.   intr,   N)r   r   r   	__slots____annotations__r&   r'   r(   r+   r+   @   s    (I
OJ	Hr'   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)currentinputtokensc                r    || _         | j                  |      | _        t        | j                        | _        y N)r6   lexr7   nextr5   )selfr6   s     r(   __init__zScanner.__init__K   s(    
hhuoDKK(r'   c              #     K   d}|t        |      k  rL||   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  }n~||   x}dv r|j                  ||dz         }|d	k(  rt        d
| dt        d|dz   |f      |||dz    }|j                  d      x}d	k7  rt        dt        d|dz   |f      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||    dt        d|dz   |f      |t        |      k  rLt        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 "rE    )lenr+   r   r   r   r#   r%   findSyntaxErrorr   r$   rematchgroupr   r   r    r!   r"   )r<   r6   r,   
quote_charend_quote_posr.   backslash_posrM   s           r(   r:   zScanner.lexP   s}    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&%)*\B"AsQw6  cMA$56%*ZZ%55M"<%O"A}q'8%@  I,,eS99s5z!!@%+N!KKNE}#ILL%==%#IMM5#>>%#IMM5#>>#IOOUC@@3u:%C%0sA>"AsQw6 Y CJ` IMM2s++s   II> I>c                    y r9   r&   r<   r-   rejects      r(   acceptzScanner.accept   s    JMr'   FrT   c                    y r9   r&   rS   s      r(   rU   zScanner.accept   s     r'   c                   | j                   j                  |u rD| j                   }|j                  t        j                  urt	        | j
                        | _         |S |r| j                  |f       y r9   )r5   r-   r   r"   r;   r7   rT   )r<   r-   rT   tokens       r(   rU   zScanner.accept   sV    <<$LLEzz.#DKK0LKK r'   c                    t        dj                  dj                  d |D              | j                  j                  j
                        t        d| j                  j                  dz   | j                  f      )Nzexpected {}; got {}z OR c              3  4   K   | ]  }|j                     y wr9   )r.   ).0r-   s     r(   	<genexpr>z!Scanner.reject.<locals>.<genexpr>   s     <4DJJ<s   rA   )	rK   formatjoinr5   r-   r.   r   r,   r6   )r<   expecteds     r(   rT   zScanner.reject   sc    !((<8<<!!'' 4<<++a/<
 	
r'   N)r6   r/   returnNone)r6   r/   ra   zIterator[Token])r-   r   rT   zLiteral[True]ra   r+   )r-   r   rT   zLiteral[False]ra   Token | None)r-   r   rT   boolra   rc   )r`   zSequence[TokenType]ra   r
   )	r   r   r   r1   r=   r:   r   rU   rT   r&   r'   r(   r4   r4   H   s^    .I)
2,h M M;@*8	  9> 
r'   r4   $c                   | j                  t        j                        rt        j                  d      }n,t        |       }| j                  t        j                  d       t        j                  t        j                  |            S )NFTrV   )rU   r   r"   astConstantexprfix_missing_locationsr   srets     r(   
expressionrn      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 r9   )and_exprrU   r   r   rg   BoolOpOrrl   rm   rhss      r(   ri   ri      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 r9   )not_exprrU   r   r   rg   rq   Andrs   s      r(   rp   rp      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 )NTrV   )funcargskeywords)rU   r   r    rg   UnaryOpNotrv   r   ri   r   r!   NameIDENT_PREFIXr.   LoadCall
all_kwargsrT   )rl   rm   identnames       r(   rv   rv      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Falserb   c                >   | j                  t        j                  d      }|j                  j	                         s8t        d|j                   t        d|j                  dz   | j                  f      t        j                  |j                        r9t        d|j                   dt        d|j                  dz   | j                  f      | 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        |      }n_|j                  t         v rt         |j                     }n9t        d	|j                   d
t        d|j                  dz   | j                  f      t#        j                  |j                  t#        j$                  |            }|S )NTrV   znot a valid python identifier rA   z$unexpected reserved python keyword ``rF   -zunexpected character/s "rE   )rU   r   r!   r.   isidentifierrK   r   r,   r6   keyword	iskeywordr#   r$   isdigit
startswithr0   BUILTIN_MATCHERSrg   rh   )rl   keyword_namevalue_tokenr.   numberrm   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c"vabz'9'9';KE"22$[%6%67E*;+<+<*=Q?A{2AGG< 
 ++l((#,,u*=
>CJr'   c                    t        |       g}| j                  t        j                        r:|j	                  t        |              | j                  t        j                        r:|S r9   )r   rU   r   r%   appendrk   s     r(   r   r      sE    ?
C
((9??
#

<?# ((9??
#Jr'   c                      e Zd ZdZddZy)r   aC  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                    y r9   r&   )r<   r   kwargss      r(   __call__zExpressionMatcher.__call__  s    r'   N)r   r/   r   str | int | bool | Nonera   rd   )r   r   r   __doc__r   r&   r'   r(   r   r      s    . U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 r9   r   r   r<   s    r(   __bool__zMatcherNameAdapter.__bool__  s    ||DII&&r'   c                <     | j                   | j                  fi |S r9   r   )r<   r   s     r(   r   zMatcherNameAdapter.__call__"  s    t||DII000r'   N)ra   rd   )r   r   ra   rd   )r   r   r   r2   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 r9   )r   r<   r   s     r(   r=   zMatcherAdapter.__init__)  s	    r'   c                P    t        | j                  |t        t              d        S )Nr   )r   r   rI   r   )r<   keys     r(   __getitem__zMatcherAdapter.__getitem__,  s     !$,,S\ARAT=UVVr'   c                    t               r9   NotImplementedErrorr   s    r(   __iter__zMatcherAdapter.__iter__/      !##r'   c                    t               r9   r   r   s    r(   __len__zMatcherAdapter.__len__2  r   r'   N)r   r   ra   rb   )r   r/   ra   r   )ra   zIterator[str])ra   r0   )r   r   r   r   r=   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.
    )_coder6   c                     || _         || _        y r9   )r6   r   )r<   r6   codes      r(   r=   zExpression.__init__?  s    !
 
r'   c                ^    t        t        |            }t        |dd      }t        ||      S )zCompile a match expression.

        :param input: The input expression - one line.

        :raises SyntaxError: If the expression is malformed.
        r   eval)filenamemode)rn   r4   compiler   )clsr6   astexprr   s       r(   r   zExpression.compileD  s4     WU^,0

 %&&r'   c           	     X    t        t        | j                  di it        |                  S )a  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__)rd   r   r   r   r   s     r(   evaluatezExpression.evaluateT  s&     Dnb%9>';RSTTr'   N)r6   r/   r   ztypes.CodeTypera   rb   )r6   r/   ra   r   )r   r   ra   rd   )	r   r   r   r   r1   r=   classmethodr   r   r&   r'   r(   r   r   6  s-    
 #I!
 ' 'Ur'   )rl   r4   ra   zast.Expression)rl   r4   ra   zast.expr)rl   r4   ra   zast.keyword)rl   r4   ra   zlist[ast.keyword]))r   
__future__r   rg   collections.abcr   r   r   dataclassesenumr   rL   typestypingr   r   r	   r
   r   r   __all__r   r2   Enumr   	dataclassr+   r4   r   rn   ri   rp   rv   r   r   r   r   r   r/   r   r   r&   r'   r(   <module>r      s0  , # 
 $ # $    	         /	5 .
		 
 d#  $U
 U
v :A( !5$? DU U6 1 1 1$WS"445 $  *U *U *Ur'   