
    ?g'                       S 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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
K	Jr  SS/r " S S\R$                  5      r\R(                  " SS9 " S S5      5       r " S S\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!\R(                   " S! S"5      5       r" " S# S$\\#\"4   5      r$ " S% S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.
- 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                  <    \ 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)	TokenType.   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       9/usr/lib/python3/dist-packages/_pytest/mark/expression.pyr   r   .   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;   )typevalueposr   r,   strr-   intr.   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rg)	r   C   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                    Xl         X l        g Ncolumnmessage)selfr8   r9   s      r'   __init__ParseError.__init__J   s    r&   c                :    SU R                    SU R                   3$ )Nz
at column z: r7   r:   s    r'   __str__ParseError.__str__N   s    DKK=4<<.99r&   r7   N)r8   r0   r9   r/   returnNone)rA   r/   )r   r   r   r   __doc__r;   r?   r%   r   r&   r'   r   r   C   s    :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)ScannerR   )tokenscurrentc                d    U R                  U5      U l        [        U R                  5      U l        g r6   )lexrG   nextrH   )r:   inputs     r'   r;   Scanner.__init__U   s!    hhuoDKK(r&   c              #    #    SnU[        U5      :  Ga:  X   S;   a  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   S:X  a$  [        [        R                  SU5      v   US-  nGOiX   =nS;   a  UR                  X2S-   5      nUS	:X  a  [        US-   S
U S35      eXUS-    nUR                  S5      =nS	:w  a  [        US-   S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[        US-   SX    S35      eU[        U5      :  a  GM:  [        [        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 "rU    )lenr*   r   r   r   r"   r$   findr   r#   rematchgroupr   r   r   r    r!   )r:   rL   r.   
quote_charend_quote_posr-   backslash_posr\   s           r'   rJ   Scanner.lexY   sC    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&$a)*\B  MA$56%*ZZ%55M"<$%)O  I,,e99s5z!!@%+N!KKNE}#ILL%==%#IMM5>>%#IMM5>>#IOOU@@3u:%C$a0A> Y CJ` IMM2s++s   I
I-I-c                   g r6   r   r:   r,   rejects      r'   acceptScanner.accept   s    JMr&   Frd   c                   g r6   r   rc   s      r'   re   rf      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 r6   )rH   r,   r   r!   rK   rG   rd   )r:   r,   rd   tokens       r'   re   rf      sV    <<$LLEzz.#DKK0LKK r&   c           	         [        U R                  R                  S-   SR                  SR	                  S U 5       5      U R                  R
                  R                  5      5      e)NrQ   zexpected {}; got {}z OR c              3  8   #    U  H  oR                   v   M     g 7fr6   )r-   ).0r,   s     r'   	<genexpr>!Scanner.reject.<locals>.<genexpr>   s     <84JJ8s   )r   rH   r.   formatjoinr,   r-   )r:   expecteds     r'   rd   Scanner.reject   sT    LLq !((<8<<!!''
 	
r&   )rH   rG   N)rL   r/   rA   rB   )rL   r/   rA   zIterator[Token])r,   r   rd   zLiteral[True]rA   r*   )r,   r   rd   zLiteral[False]rA   Token | None)r,   r   rd   boolrA   rt   )rr   zSequence[TokenType]rA   r   )r   r   r   r   r1   r;   rJ   r   re   rd   r%   r   r&   r'   rE   rE   R   s^    %I)2,h M M;@*8	  9> 
r&   rE   $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      $ )NFTrg   )re   r   r!   astConstantexprfix_missing_locationsr   srets     r'   
expressionr      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$ r6   )and_exprre   r   r   rx   BoolOpOrr}   r~   rhss      r'   rz   rz      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$ r6   )not_exprre   r   r   rx   r   Andr   s      r'   r   r      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 )NTrg   )funcargskeywords)re   r   r   rx   UnaryOpNotr   r   rz   r   r    NameIDENT_PREFIXr-   LoadCall
all_kwargsrd   )r}   r~   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FalserB   c                   U R                  [        R                  SS9nUR                  R	                  5       (       d&  [        UR                  S-   SUR                   35      e[        R                  " UR                  5      (       a'  [        UR                  S-   SUR                   S3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OOUR                  [        ;   a  [        UR                     nO'[        UR                  S-   S	UR                   S
35      e[        R                  " UR                  [        R                   " U5      5      nU$ )NTrg   rQ   znot a valid python identifier z$unexpected reserved python keyword ``rV   -zunexpected character/s "rU   )re   r   r    r-   isidentifierr   r.   keyword	iskeywordr"   r#   isdigit
startswithr0   BUILTIN_MATCHERSrx   ry   )r}   keyword_namevalue_tokenr-   numberr~   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3  %%qr
""$$KE"22$[%6%67E!#*;+<+<*=Q? 
 ++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$ r6   )r   re   r   r$   appendr|   s     r'   r   r     sK    ?
C
((9??
#
#

<?# ((9??
#
#Jr&   c                      \ rS rSrSS jrSrg)MatcherCalli
  c                   g r6   r   )r:   r   kwargss      r'   __call__MatcherCall.__call__  s    QTr&   r   N)r   r/   r   str | int | bool | NonerA   ru   )r   r   r   r   r   r%   r   r&   r'   r   r   
  s    Tr&   r   c                  >    \ rS rSr% S\S'   S\S'   S
S jrSS jrSrg	)MatcherNameAdapteri  r   matcherr/   r   c                8    U R                  U R                  5      $ r6   r   r   r>   s    r'   __bool__MatcherNameAdapter.__bool__  s    ||DII&&r&   c                <    U R                   " U R                  40 UD6$ r6   r   )r:   r   s     r'   r   MatcherNameAdapter.__call__  s    ||DII000r&   r   N)rA   ru   )r   r   rA   ru   )r   r   r   r   r2   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 r6   r   )r:   r   s     r'   r;   MatcherAdapter.__init__  s    r&   c                J    [        U R                  U[        [        5      S  S9$ )Nr   )r   r   rY   r   )r:   keys     r'   __getitem__MatcherAdapter.__getitem__   s     !$,,S\ARAT=UVVr&   c                    [        5       er6   NotImplementedErrorr>   s    r'   __iter__MatcherAdapter.__iter__#      !##r&   c                    [        5       er6   r   r>   s    r'   __len__MatcherAdapter.__len__&  r   r&   r   N)r   r   rA   rB   )r   r/   rA   r   )rA   zIterator[str])rA   r0   )
r   r   r   r   rC   r;   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   i*  zoA compiled match expression as used by -k and -m.

The expression can be evaluated against different matchers.
codec                    Xl         g r6   r   )r:   r   s     r'   r;   Expression.__init__2  s    	r&   c                V    [        [        U5      5      n[        USSS9n[        U5      $ )zLCompile a match expression.

:param input: The input expression - one line.
z<pytest match expression>eval)filenamemode)r   rE   compiler   )r:   rL   astexprr   s       r'   r   Expression.compile5  s2     WU^,&0 

 $r&   c           	     \    [        [        U R                  S0 0[        U5      5      5      nU$ )zEvaluate 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__)ru   r   r   r   )r:   r   r~   s      r'   evaluateExpression.evaluateC  s*     dii.")=~g?VWX
r&   N)r   ztypes.CodeTyperA   rB   )rL   r/   rA   r   )r   r   rA   ru   )r   r   r   r   rC   r1   r;   classmethodr   r   r%   r   r&   r'   r   r   *  s,    
 I    
r&   )r}   rE   rA   zast.Expression)r}   rE   rA   zast.expr)r}   rE   rA   zast.keyword)r}   rE   rA   zlist[ast.keyword])&rC   
__future__r   rx   dataclassesenumr   r[   typestypingr   r   r   r   r   r	   r
   __all__Enumr   	dataclassr*   	Exceptionr   rE   r   r   rz   r   r   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&   