
    F-Ph'                       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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&dS )0a  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)Mapping)Sequence)Literal)NoReturn)overload)Protocol
Expression
ParseErrorc                  6    e Zd ZdZd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 input=zstring literal,N)__name__
__module____qualname__LPARENRPARENORANDNOTIDENTEOFEQUALSTRINGCOMMA     W/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/_pytest/mark/expression.pyr   r   .   s@        F F	B
C
CE
CEFEEEr#   r   T)frozenc                  2    e Zd ZU dZded<   ded<   ded<   dS )	Token)postypevaluer   r)   strr*   intr(   N)r   r   r   	__slots____annotations__r"   r#   r$   r'   r'   ;   s0         (IOOOJJJHHHHHr#   r'   c                  "    e Zd ZdZddZ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.
    columnr,   messager+   returnNonec                "    || _         || _        d S Nr0   r1   )selfr0   r1   s      r$   __init__zParseError.__init__J   s    r#   c                &    d| j          d| j         S )Nz
at column z: r6   r7   s    r$   __str__zParseError.__str__N   s    9DK994<999r#   N)r0   r,   r1   r+   r2   r3   )r2   r+   )r   r   r   __doc__r8   r;   r"   r#   r$   r   r   C   sF            : : : : : :r#   c                  n    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dS )!Scanner)currenttokensinputr+   r2   r3   c                l    |                      |          | _        t          | j                  | _        d S r5   )lexr@   nextr?   )r7   rA   s     r$   r8   zScanner.__init__U   s(    hhuooDK((r#   Iterator[Token]c              #  n  K   d}|t          |          k     r||         dv r|dz  }nZ||         dk    r$t          t          j        d|          V  |dz  }n*||         dk    r$t          t          j        d|          V  |dz  }n||         dk    r$t          t          j        d|          V  |dz  }n||         dk    r$t          t          j        d|          V  |dz  }n||         x}dv r|                    ||dz             }|d	k    rt          |dz   d
| d          |||dz            }|                    d          x}d	k    rt          |dz   d          t          t          j	        ||          V  |t          |          z  }nt          j        d||d                    }|r|                    d          }|dk    rt          t          j        ||          V  ne|dk    rt          t          j        ||          V  nA|dk    rt          t          j        ||          V  nt          t          j        ||          V  |t          |          z  }nt          |dz   d||          d          |t          |          k     t          t          j        d|          V  d S )Nr   ) 	   ()r   r   )'"zclosing quote "z" is missing\z4escaping with "\" not supported in marker expressionz(:?\w|:|\+|-|\.|\[|\]|\\|/)+r   r   r   zunexpected character "rM    )lenr'   r   r   r   r   r!   findr   r    rematchgroupr   r   r   r   r   )r7   rA   r(   
quote_charend_quote_posr*   backslash_posrT   s           r$   rC   zScanner.lexY   s     CJJSz[((qss""I,c377777qss""I,c377777qss""IOS#66666qss""IOS#66666q %c
**z99 %

:sQw ? ? B&&$aB*BBB   cMA$556%*ZZ%5%55M"<<$%)O   I,eS99999s5zz!!@%+NN !KKNNE}}#IL%======%#IM5#>>>>>>%#IM5#>>>>>>#IOUC@@@@@3u::%CC$a>s>>>  Y CJJ` IM2s+++++++r#   r)   r   rejectLiteral[True]r'   c                   d S r5   r"   r7   r)   rY   s      r$   acceptzScanner.accept   s    JM#r#   FrY   Literal[False]Token | Nonec                   d S r5   r"   r\   s      r$   r]   zScanner.accept   s	     sr#   boolc                   | j         j        |u r5| j         }|j        t          j        urt	          | j                  | _         |S |r|                     |f           d S r5   )r?   r)   r   r   rD   r@   rY   )r7   r)   rY   tokens       r$   r]   zScanner.accept   s_    <$$LEz..#DK00L 	!KK   tr#   expectedSequence[TokenType]r   c           	         t          | j        j        dz   d                    d                    d |D                       | j        j        j                            )NrI   zexpected {}; got {}z OR c              3  $   K   | ]}|j         V  d S r5   )r*   ).0r)   s     r$   	<genexpr>z!Scanner.reject.<locals>.<genexpr>   s$      <<4DJ<<<<<<r#   )r   r?   r(   formatjoinr)   r*   )r7   re   s     r$   rY   zScanner.reject   s]    Lq !((<<8<<<<<!' 
 
 	
r#   N)rA   r+   r2   r3   )rA   r+   r2   rE   )r)   r   rY   rZ   r2   r'   )r)   r   rY   r_   r2   r`   )r)   r   rY   rb   r2   r`   )re   rf   r2   r   )	r   r   r   r-   r8   rC   r	   r]   rY   r"   r#   r$   r>   r>   R   s        %I) ) ) )2, 2, 2, 2,h MMM XM;@     X 9>      
 
 
 
 
 
r#   r>   $sr2   ast.Expressionc                   |                      t          j                  rt          j        d          }n0t          |           }|                      t          j        d           t          j        t          j        |                    S )NFTr^   )r]   r   r   astConstantexprfix_missing_locationsr   rn   rets     r$   
expressionrw      sg    xx	 -U++1gg	t,,,$S^C%8%8999r#   ast.exprc                   t          |           }|                     t          j                  rVt          |           }t	          j        t	          j                    ||g          }|                     t          j                  V|S r5   )and_exprr]   r   r   rq   BoolOpOrrn   rv   rhss      r$   rs   rs      sh    
1++C
((9<
 
  /qkkjC:.. ((9<
 
  / Jr#   c                   t          |           }|                     t          j                  rVt          |           }t	          j        t	          j                    ||g          }|                     t          j                  V|S r5   )not_exprr]   r   r   rq   r{   Andr}   s      r$   rz   rz      sh    
1++C
((9=
!
! 0qkkjS#J// ((9=
!
! 0 Jr#   c                2   |                      t          j                  r3t          j        t          j                    t          |                     S |                      t          j                  r2t          |           }|                      t          j	        d           |S |                      t          j
                  }|rt          j        t          |j        z   t          j                              }|                      t          j                  rFt          j        |g t!          |                     }|                      t          j	        d           n|}|S |                     t          j        t          j        t          j
        f           d S )NTr^   )funcargskeywords)r]   r   r   rq   UnaryOpNotr   r   rs   r   r   NameIDENT_PREFIXr*   LoadCall
all_kwargsrY   )rn   rv   identnames       r$   r   r      s.   xx	 3{3799hqkk222xx	 !! 1gg	!$///
HHY_%%E xu{2CHJJ??88I$%% 	(2
1FFFCHHY%dH3333C
HHimY-y?@@@@@r#   F)TrueFalser3   ast.keywordc                   |                      t          j        d          }|j                                        s t          |j        dz   d|j                   t          j        |j                  r!t          |j        dz   d|j         d          |                      t          j	        d           |                      t          j
                  x}r|j        dd         }n|                      t          j        d          }|j        x}                                s1|                    d          r,|dd                                          rt          |          }nB|j        t          v rt          |j                 }n!t          |j        dz   d	|j         d
          t          j        |j        t          j        |                    }|S )NTr^   rI   znot a valid python identifier z$unexpected reserved python keyword ``rN   -zunexpected character/s "rM   )r]   r   r   r*   isidentifierr   r(   keyword	iskeywordr   r    isdigit
startswithr,   BUILTIN_MATCHERSrq   rr   )rn   keyword_namevalue_tokenr*   numberrv   s         r$   single_kwargr      s   88IOD899L**,, 
q A\-?AA
 
 	
 +,, 
q H<3EHHH
 
 	
 HHY_TH***hhy/000{ )4):1R4)@hhyth<<!''F0022 
	c""
	'-abbz'9'9';';
	 KKEE"222$[%67EE!#?;+<???  
 +l(#,u*=*=
>
>CJr#   list[ast.keyword]c                    t          |           g}|                     t          j                  rA|                    t          |                      |                     t          j                  A|S r5   )r   r]   r   r!   appendru   s     r$   r   r     s[    ??
C
((9?
#
# $

<??### ((9?
#
# $Jr#   c                      e Zd Zd	dZdS )
MatcherCallr   r+   kwargsstr | int | bool | Noner2   rb   c                   d S r5   r"   )r7   r   r   s      r$   __call__zMatcherCall.__call__	  s      r#   N)r   r+   r   r   r2   rb   )r   r   r   r   r"   r#   r$   r   r     s        TTTTTTr#   r   c                  4    e Zd ZU ded<   ded<   ddZdd
ZdS )MatcherNameAdapterr   matcherr+   r   r2   rb   c                6    |                      | j                  S r5   r   r   r:   s    r$   __bool__zMatcherNameAdapter.__bool__  s    ||DI&&&r#   r   r   c                (     | j         | j        fi |S r5   r   )r7   r   s     r$   r   zMatcherNameAdapter.__call__  s    t|DI00000r#   N)r2   rb   )r   r   r2   rb   )r   r   r   r.   r   r   r"   r#   r$   r   r     sS         III' ' ' '1 1 1 1 1 1r#   r   c                  2    e Zd ZdZddZdd
ZddZddZdS )MatcherAdapterzDAdapts a matcher function to a locals mapping as required by eval().r   r   r2   r3   c                    || _         d S r5   )r   )r7   r   s     r$   r8   zMatcherAdapter.__init__  s    r#   keyr+   r   c                b    t          | j        |t          t                    d                    S )Nr   )r   r   rQ   r   )r7   r   s     r$   __getitem__zMatcherAdapter.__getitem__  s*    !$,S\ARARATAT=UVVVVr#   Iterator[str]c                    t                      r5   NotImplementedErrorr:   s    r$   __iter__zMatcherAdapter.__iter__!      !###r#   r,   c                    t                      r5   r   r:   s    r$   __len__zMatcherAdapter.__len__$  r   r#   N)r   r   r2   r3   )r   r+   r2   r   )r2   r   )r2   r,   )r   r   r   r<   r8   r   r   r   r"   r#   r$   r   r     sn        NN   W W W W$ $ $ $$ $ $ $ $ $r#   r   c                  >    e Zd ZdZdZddZedd
            ZddZdS )r   zwA compiled match expression as used by -k and -m.

    The expression can be evaluated against different matchers.
    coder   types.CodeTyper2   r3   c                    || _         d S r5   r   )r7   r   s     r$   r8   zExpression.__init__0  s    			r#   rA   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)rw   r>   compiler   )clsrA   astexprr   s       r$   r   zExpression.compile3  sD     WU^^,,&0 
  
  

 $r#   r   r   rb   c           	     j    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__)rb   r   r   r   )r7   r   rv   s      r$   evaluatezExpression.evaluateA  s1     di.")=~g?V?VWWXX
r#   N)r   r   r2   r3   )rA   r+   r2   r   )r   r   r2   rb   )	r   r   r   r<   r-   r8   classmethodr   r   r"   r#   r$   r   r   (  sm         
 I          [ 
 
 
 
 
 
r#   )rn   r>   r2   ro   )rn   r>   r2   rx   )rn   r>   r2   r   )rn   r>   r2   r   )'r<   
__future__r   rq   collections.abcr   r   r   dataclassesenumr   rS   typestypingr   r   r	   r
   __all__Enumr   	dataclassr'   	Exceptionr   r>   r   rw   rs   rz   r   r   r   r   r   r   r+   r   r   r"   r#   r$   <module>r      s   , # " " " " " 



 $ $ $ $ $ $ # # # # # # $ $ $ $ $ $       				                          
 
 
 
 
	 
 
 
 d###       $#: : : : : : : :T
 T
 T
 T
 T
 T
 T
 T
t : : : :      A A A A( !5$??    D   U U U U U( U U U 1 1 1 1 1 1 1 1$ $ $ $ $WS"445 $ $ $ # # # # # # # # # #r#   