'L i+ UdZddlmZddlZddlmZddlmZddlmZddlZddl Z ddl Z ddl Z ddl Z ddl mZddl mZdd l mZdd l mZdd l mZdd l mZd dgZdZded<Gdde j.Zej2dGddZGddZdZd)dZd*dZd*dZd*dZ dddd Z!d+d!Z"d,d"Z#Gd#deZ$ej2Gd$d%Z%Gd&d'ee&e%fZ'eGd(d Z(y)-aEvaluate 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 ExpressionExpressionMatcherr FILE_NAMEc4eZdZdZdZdZdZdZdZdZ dZ d Z d Z y ) TokenTypezleft parenthesiszright parenthesisorandnot identifierz end of input=zstring literal,N) __name__ __module__ __qualname__LPARENRPARENORANDNOTIDENTEOFEQUALSTRINGCOMMA]/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/_pytest/mark/expression.pyrr3s4 F F B C C E C E F Er'rT)frozenc0eZdZUdZded<ded<ded<y) Token)postypevaluerr-strr.intr,N)rrr __slots____annotations__r&r'r(r+r+@s(I O J Hr'r+cjeZdZdZd dZd dZed dZedd ddZddddZdd Zy )Scanner)currentinputtokenscr||_|j||_t|j|_yN)r6lexr7nextr5)selfr6s r(__init__zScanner.__init__Ks( hhuo DKK( r'c#Kd}|t|krL||dvr|dz }n.||dk(r$ttjd||dz }n||dk(r$ttjd||dz }n||dk(r$ttj d||dz }n||dk(r$ttj d||dz }n~||x}dvr|j||dz}|d k(rtd |d td|dz|f|||dz}|jd x}d k7rtd td|dz|fttj|||t|z }ntjd||d}|r|jd}|dk(rttj||nc|dk(rttj||n@|dk(rttj ||nttj"|||t|z }ntd||dtd|dz|f|t|krLttj$d|yw)Nr)  ()rr)'"zclosing quote "z " is missing\z4escaping with "\" not supported in marker expressionz(:?\w|:|\+|-|\.|\[|\]|\\|/)+rrrzunexpected character "rE)lenr+rrrr#r%find SyntaxErrorrr$rematchgrouprrr r!r")r<r6r, quote_char end_quote_posr. backslash_posrMs r(r:z Scanner.lexPs}CJSz[(qss"I,,c377qss"I,,c377qss"IOOS#66qss"IOOS#66q %c **z9 % :sQw ?  B&%)*\B"AsQw6cMA$56%*ZZ%55M"<%O"A}q'8%@I,,eS99s5z!!@%+N!KKNE}#ILL%==%#IMM5#>>%#IMM5#>>#IOOUC@@3u:%C%0s A>"AsQw6YCJ`IMM2s++s II> I>cyr9r&r<r-rejects r(acceptzScanner.acceptsJMr'FrTcyr9r&rSs r(rUzScanner.acceptsr'c|jj|urD|j}|jtjurt |j |_|S|r|j |fyr9)r5r-rr"r;r7rT)r<r-rTtokens r(rUzScanner.acceptsV <<   $LLEzz.#DKK0 L  KK r'ctdjdjd|D|jjj t d|jjdz|jf)Nzexpected {}; got {}z OR c34K|]}|jywr9)r.).0r-s r( z!Scanner.reject..s<4DJJ r'r4$c|jtjrtjd}n,t |}|jtjdtj tj|S)NFTrV)rUrr"astConstantexprfix_missing_locationsr srets r( expressionrnsWxx  U+1g t,  $ $S^^C%8 99r'ct|}|jtjrUt|}t j t j ||g}|jtjrU|Sr9)and_exprrUrrrgBoolOpOrrlrmrhss r(ririsW 1+C ((9<< qkjjC:. ((9<<  Jr'ct|}|jtjrUt|}t j t j ||g}|jtjrU|Sr9)not_exprrUrrrgrqAndrss r(rprpsW 1+C ((9== !qkjjS#J/ ((9== ! Jr'c<|jtjr1tjtj t |S|jtjr.t|}|jtjd|S|jtj}|rtjt|jztj}|jtjrDtj|gt!|}|jtjd|S|}|S|j#tjtjtjfy)NTrV)funcargskeywords)rUrr rgUnaryOpNotrvrrirr!Name IDENT_PREFIXr.LoadCall all_kwargsrT)rlrmidentnames r(rvrvs xx {{3779hqk22xx   !1g !!$/ HHY__ %E xx u{{2CHHJ? 88I$$ %((2 1 FC HHY%%dH 3 C HHimmY--y ?@r'F)TrueFalserbc>|jtjd}|jj s8t d|jt d|jdz|jftj|jr9t d|jdt d|jdz|jf|jtjd|jtjx}r|jdd}n|jtjd}|jx}js$|jdr|ddjr t|}n_|jt vrt |j}n9t d |jd t d|jdz|jft#j|jt#j$|}|S) NTrVznot a valid python identifier rAz$unexpected reserved python keyword ``rF-zunexpected character/s "rE)rUrr!r. isidentifierrKrr,r6keyword iskeywordr#r$isdigit startswithr0BUILTIN_MATCHERSrgrh)rl keyword_name value_tokenr.numberrms r( single_kwargrs88IOOD89L    * * ,,\-?-?,@ A <++a/ 9  ++,2<3E3E2Fa H <++a/ 9  HHY__TH*hhy//00{0)4):):1R)@hhyth< !'' 'F 0 0 2   c "vabz'9'9';KE   "2 2$[%6%67E*;+<+<*=Q?A{2AGG<  ++l((#,,u*= >C Jr'ct|g}|jtjr:|j t||jtjr:|Sr9)rrUrr%appendrks r(rrsE ? C ((9?? # <?# ((9?? # Jr'ceZdZdZddZy)raCA 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 yr9r&)r<rkwargss r(__call__zExpressionMatcher.__call__sr'N)rr/rstr | int | bool | Nonerard)rrr__doc__rr&r'r(rrs .Ur'c2eZdZUded<ded<ddZd dZy) MatcherNameAdapterrmatcherr/rc8|j|jSr9rrr<s r(__bool__zMatcherNameAdapter.__bool__s||DII&&r'c <|j|jfi|Sr9r)r<rs r(rzMatcherNameAdapter.__call__"st||DII000r'N)rard)rrrard)rrrr2rrr&r'r(rrs  I'1r'rc0eZdZdZddZddZd dZd dZy) MatcherAdapterzDAdapts a matcher function to a locals mapping as required by eval().c||_yr9)rr<rs r(r=zMatcherAdapter.__init__)s  r'cPt|j|ttdS)Nr)rrrIr)r<keys r( __getitem__zMatcherAdapter.__getitem__,s !$,,S\ARAT=UVVr'ctr9NotImplementedErrorrs r(__iter__zMatcherAdapter.__iter__/ !##r'ctr9rrs r(__len__zMatcherAdapter.__len__2rr'N)rrrarb)rr/rar)raz Iterator[str])rar0)rrrrr=rrrr&r'r(rr&sNW$$r'rc6eZdZdZdZddZeddZd dZy) r zwA compiled match expression as used by -k and -m. The expression can be evaluated against different matchers. )_coder6c ||_||_yr9)r6r)r<r6codes r(r=zExpression.__init__?s!   r'c^tt|}t|dd}t||S)zCompile a match expression. :param input: The input expression - one line. :raises SyntaxError: If the expression is malformed. reval)filenamemode)rnr4compiler )clsr6astexprrs r(rzExpression.compileDs4WU^, 0  %&&r'c Xtt|jdiit|S)aEvaluate 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__)rdrrrrs r(evaluatezExpression.evaluateTs&Dnb%9>';RSTTr'N)r6r/rztypes.CodeTyperarb)r6r/rar )rrrard) rrrrr1r= classmethodrrr&r'r(r r 6s- #I!  ' ' Ur')rlr4razast.Expression)rlr4razast.expr)rlr4raz ast.keyword)rlr4razlist[ast.keyword]))r __future__rrgcollections.abcrrr dataclassesenumrrLtypestypingrrr r r r __all__rr2Enumr dataclassr+r4rrnrirprvrrrrrr/rr r&r'r(rs0,# $#$    / 5.  d#  $ U U v :A(!5$?DUU6 111 $WS"445 $ *U*U*Ur'