
    ?g/R                    b   S SK J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
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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K!J"r"  S SK#J$r$  S SK%J&r&  \(       a  SSK'J(r(  Sr)SAS jr*      SBS  jr+ " S! S"\5      r,\
\RZ                  " S#S$9 " S% S&5      5       5       r.\" S'\\S(\/4   \04   S)9r1\RZ                   " S* S5      5       r2S#S+.     SCS, jjr3    SDS- jr4SS..SES/ jjr5\(       aB   " S0 S1\25      r6 " S2 S3\25      r7 " S4 S5\25      r8 " S6 S7\25      r9 " S8 S9\25      r: " S: S;\25      r;\
 " S< S=5      5       r<\<" S#S>9r=\
 " S? S@\\>\4   5      5       r?g)F    )annotationsN)Any)Callable)
Collection)final)Iterable)Iterator)Mapping)MutableMapping)
NamedTuple)overload)Sequence)TYPE_CHECKING)TypeVar)Union   )getfslineno)ascii_escaped)NOTSET)
NotSetType)Config)check_ispytest)MARKED_FIXTURE)fail)
_ScopeName)PytestUnknownMarkWarning)Nodeempty_parameter_set_markc                F    [        U 5      =(       a    [        U SS5      S:g  $ )N__name__z<lambda>)callablegetattr)funcs    9/usr/lib/python3/dist-packages/_pytest/mark/structures.py
istestfuncr%   *   s    D>QgdJ
CzQQ    MarkDecoratorc                j   SSK Jn  [        U5      u  pESUUR                  UU4-  nU R	                  [
        5      nUS;   a  [        R                  US9nU$ US:X  a  [        R                  USS9nU$ US	:X  a1  UR                  n	[        U5      u  pUR                  S
XS-   4-  5      e[        U5      e)Nr   )	Collectorz0got empty parameter set %r, function %s at %s:%d) NskipreasonxfailF)r-   runfail_at_collectz&Empty parameter set in '%s' at line %d   )nodesr)   r   r    getiniEMPTY_PARAMETERSET_OPTIONMARK_GENr+   r.   CollectErrorLookupError)configargnamesr#   r)   fslinenor-   requested_markmarkf_name_s              r$   get_empty_parameterset_markr@   .   s     "T"JB?
	C F ]]#<=N++}}F}+ K 
7	"~~V~7 K 
,	,%	$$4
7KK
 	
 .))r&   c                      \ rS rSr% S\S'   S\S'   S\S'   \SS	S
.       SS jj5       r\ S     SS jj5       r\      SS j5       r	\      SS j5       r
\          SS j5       rSrg	)ParameterSetK   zSequence[object | NotSetType]valuesz Collection[MarkDecorator | Mark]marks
str | Noneid NrE   rG   c                  [        U[        5      (       a  U4nO+[        U[        R                  R                  5      (       d   eUb;  [        U[
        5      (       d  [        S[        U5       SU< 35      e[        U5      nU " X1U5      $ )Nz Expected id to be a string, got z: )	
isinstancer'   collectionsabcr   str	TypeErrortyper   )clsrE   rG   rD   s       r$   paramParameterSet.paramP   s{     e]++HEe[__%?%?@@@@>b#&&"B48*Brf UVVr"B6"%%r&   c                f    [        X5      (       a  U$ U(       a  U R                  U5      $ U " U/ SS9$ )a2  Extract from an object or objects.

:param parameterset:
    A legacy style parameterset that may or may not be a tuple,
    and may or may not be wrapped into a mess of mark objects.

:param force_tuple:
    Enforce tuple wrapping so single argument tuple values
    don't get decomposed and break tests.
NrI   )rK   rR   )rQ   parametersetforce_tuples      r$   extract_fromParameterSet.extract_fromb   s8      l((99\** |2$77r&   c                    [        U [        5      (       aV  U R                  S5       Vs/ s H)  oDR                  5       (       d  M  UR                  5       PM+     n n[	        U 5      S:H  nX4$ SnX4$ s  snf )N,r1   F)rK   rN   splitstriplen)r9   	argvaluesargskwargsxrV   s         r$   _parse_parametrize_args$ParameterSet._parse_parametrize_args~   sm     h$$+3>>#+>L+>a'')		+>HLh-1,K $$  K$$	 Ms   A1A1c                T    U  Vs/ s H  n[         R                  X!S9PM     sn$ s  snf )N)rV   )rB   rW   )r^   rV   ra   s      r$   _parse_parametrize_parameters*ParameterSet._parse_parametrize_parameters   s5     LU
KTaL%%a%A9
 	
 
s   %c                   U R                  X5      u  pU R                  X&5      nAU(       as  U Hj  n[        UR                  5      [        U5      :w  d  M'  Sn	[	        U	R                  UUR                  U[        U5      [        UR                  5      S9SS9  Ml     X4$ [        XAU5      n
UR                  [        [        4[        U5      -  U
/S S95        X4$ )Nz{nodeid}: in "parametrize" the number of names ({names_len}):
  {names}
must be equal to the number of values ({values_len}):
  {values})nodeidrD   names	names_len
values_lenFpytrace)rD   rE   rG   )
rb   re   r]   rD   r   formatr@   appendrB   r   )rQ   r9   r^   r#   r8   rh   rV   
parametersrR   msgr=   s              r$   _for_parametrizeParameterSet._for_parametrize   s     !$ ; ;H P66yN
#u||$H5%  

#)#(<<"*&)(m'*5<<'8 #  !&	 $2 ##	 /vFDVIH$=dVPTU ##r&   )rD   objectrE   z0MarkDecorator | Collection[MarkDecorator | Mark]rG   rF   returnrB   F)rU   z(ParameterSet | Sequence[object] | objectrV   boolru   rB   )r9   str | Sequence[str]r^   2Iterable[ParameterSet | Sequence[object] | object]ru   ztuple[Sequence[str], bool])r^   ry   rV   rw   ru   zlist[ParameterSet])
r9   rx   r^   ry   r8   r   rh   rN   ru   z(tuple[Sequence[str], list[ParameterSet]])r    
__module____qualname____firstlineno____annotations__classmethodrR   rW   staticmethodrb   re   rr   __static_attributes__rH   r&   r$   rB   rB   K   s,   ))++N CE	&& @& 	&
 
& &"  "8>8 8 
	8 86 %%%E%
 
$% % 
E

 

 
 '$%'$ F'$
 '$ '$ 
2'$ '$r&   rB   T)frozenc                      \ rS rSr% SrS\S'   S\S'   S\S'   \R                  " S	S
S9rS\S'   \R                  " S	S
S9r	S\S'     SS
S.             SS jjjr
SS jrSS jrSrg	)Mark   zA pytest mark.rN   nametuple[Any, ...]r_   Mapping[str, Any]r`   NF)defaultreprMark | None_param_ids_fromSequence[str] | None_param_ids_generated	_ispytestc                   [        U5        [        R                  U SU5        [        R                  U SU5        [        R                  U SU5        [        R                  U SU5        [        R                  U SU5        g):meta private:r   r_   r`   r   r   N)r   rt   __setattr__)selfr   r_   r`   param_ids_fromparam_ids_generatedr   s          r$   __init__Mark.__init__   si     	y!4.4.4624!2NC4!79LMr&   c                ^    SU R                   ;   =(       d    [        U R                  5      S:  $ )Nids   )r`   r]   r_   r   s    r$   _has_param_idsMark._has_param_ids   s#    #:s499~'::r&   c           	     T   U R                   UR                   :X  d   eSnU R                   S:X  a/  UR                  5       (       a  UnOU R                  5       (       a  U n[        U R                   U R                  UR                  -   [	        U R
                  40 UR
                  D6USS9$ )zReturn a new Mark which is a combination of this
Mark and another Mark.

Combines by appending args and merging kwargs.

:param Mark other: The mark to combine with.
:rtype: Mark
NparametrizeT)r   r   )r   r   r   r_   dictr`   )r   otherr   s      r$   combined_withMark.combined_with   s     yyEJJ&&& '+99%##%%!&$$&&!%IIII

"--)
 	
r&   rH   )NN)r   rN   r_   r   r`   r   r   r   r   r   r   rw   ru   Noneru   rw   )r   r   ru   r   )r    rz   r{   r|   __doc__r}   dataclassesfieldr   r   r   r   r   r   rH   r&   r$   r   r      s      I
 $/#4#4T#NO[N1<1B1B52.  '+48N  NN N "	N
 $N 2N N 
N&;
r&   r   Markable.)boundc                      \ rS rSr% SrS\S'   SS.SS jjr\SS j5       r\SS	 j5       r	\SS
 j5       r
\SS j5       rSS jr\SS j5       r\SS j5       rSS jrSrg)r'   i  a  A decorator for applying a mark on test functions and classes.

``MarkDecorators`` are created with ``pytest.mark``::

    mark1 = pytest.mark.NAME  # Simple MarkDecorator
    mark2 = pytest.mark.NAME(name1=value)  # Parametrized MarkDecorator

and can then be applied as decorators to test functions::

    @mark2
    def test_function():
        pass

When a ``MarkDecorator`` is called, it does the following:

1. If called with a single class as its only positional argument and no
   additional keyword arguments, it attaches the mark to the class so it
   gets applied automatically to all test cases found in that class.

2. If called with a single function as its only positional argument and
   no additional keyword arguments, it attaches the mark to the function,
   containing all the arguments already stored internally in the
   ``MarkDecorator``.

3. When called in any other case, it returns a new ``MarkDecorator``
   instance with the original ``MarkDecorator``'s content updated with
   the arguments passed to this call.

Note: The rules above prevent a ``MarkDecorator`` from storing only a
single function or class reference as its positional argument with no
additional keyword or positional arguments. You can work around this by
using `with_args()`.
r   r=   Fr   c               &    [        U5        Xl        g)r   N)r   r=   )r   r=   r   s      r$   r   MarkDecorator.__init__1  s    y!	r&   c                .    U R                   R                  $ )zAlias for mark.name.)r=   r   r   s    r$   r   MarkDecorator.name6       yy~~r&   c                .    U R                   R                  $ )zAlias for mark.args.)r=   r_   r   s    r$   r_   MarkDecorator.args;  r   r&   c                .    U R                   R                  $ )zAlias for mark.kwargs.)r=   r`   r   s    r$   r`   MarkDecorator.kwargs@  s     yyr&   c                    U R                   $ )r   )r   r   s    r$   marknameMarkDecorator.marknameE  s     yyr&   c                r    [        U R                  XSS9n[        U R                  R	                  U5      SS9$ )zReturn a MarkDecorator with extra arguments added.

Unlike calling the MarkDecorator, with_args() can be used even
if the sole argument is a callable/class.
Tr   )r   r   r'   r=   r   )r   r_   r`   r=   s       r$   	with_argsMarkDecorator.with_argsJ  s2     DIItt<TYY44T:dKKr&   c                    g NrH   r   args     r$   __call__MarkDecorator.__call__V      r&   c                    g r   rH   )r   r_   r`   s      r$   r   r   Z  r   r&   c                    U(       a^  U(       dW  US   n[         R                  " U5      n[        U5      S:X  a-  [        U5      (       d  U(       a  [	        X0R
                  SS9  U$ U R                  " U0 UD6$ )zCall the MarkDecorator.r   r1      
stacklevel)inspectisclassr]   r%   
store_markr=   r   )r   r_   r`   r#   is_classs        r$   r   r   ^  s\    7Dt,H4yA~:d#3#3x4q9~~t.v..r&   )r=   N)r=   r   r   rw   ru   r   ru   rN   )ru   r   )ru   r   )r_   rt   r`   rt   ru   r'   r   r   ru   r   )r_   rt   r`   rt   )r    rz   r{   r|   r   r}   r   propertyr   r_   r`   r   r   r   r   r   rH   r&   r$   r'   r'     s     D J8= 
          L    /r&   consider_mroc                  [        U [        5      (       a  U(       d  U R                  R                  S/ 5      /nO>[	        U R
                  5       Vs/ s H  o3R                  R                  S/ 5      PM      nn/ nU H<  n[        U[        5      (       a  UR                  U5        M+  UR                  U5        M>     O([        U S/ 5      n[        U[        5      (       a  UnOU/n[        [        U5      5      $ s  snf )zObtain the unpacked marks that are stored on an object.

If obj is a class and consider_mro is true, return marks applied to
this class and all of its super-classes in MRO order. If consider_mro
is false, only return marks applied directly to this class.

pytestmark)rK   rP   __dict__getreversed__mro__listextendro   r"   normalize_mark_list)objr   
mark_listsra   	mark_listitemmark_attributes          r$   get_unpacked_marksr   i  s     #t,,**<<=J ;C3;;:O:OQ

|R0:O   	D$%%  &  &	  !lB7nd++&I'(I#I.//s   %C:c              #     #    U  H9  n[        USU5      n[        U[        5      (       d  [        SU< S35      eUv   M;     g7f)z
Normalize an iterable of Mark or MarkDecorator objects into a list of marks
by retrieving the `mark` attribute on MarkDecorator instances.

:param mark_list: marks to normalize
:returns: A new list of the extracted Mark objects
r=   zgot z instead of MarkN)r"   rK   r   rO   )r   r=   mark_objs      r$   r   r     sF      4.(D))d8,.>?@@	 s   AAr   c                   [        U[        5      (       d   U5       eSSKJn  U" U 5      b  [        R
                  " [        US9  / [        U SS9QUPU l        g)zbStore a Mark on an object.

This is used to implement the Mark declarations/decorators correctly.
r   )getfixturemarkerNr   Fr   )	rK   r   fixturesr   warningswarnr   r   r   )r   r=   r   r   s       r$   r   r     sT    
 dD!!'4'!+(n< J)#EBIDICNr&   c                  @    \ rS rSr\SS j5       r\SSS jj5       rSrg)	_SkipMarkDecoratori  c                    g r   rH   r   s     r$   r   _SkipMarkDecorator.__call__      7:r&   c                    g r   rH   )r   r-   s     r$   r   r     s    @Cr&   rH   Nr   .)r-   rN   ru   r'   r    rz   r{   r|   r   r   r   rH   r&   r$   r   r     s    	: 
:	C 
Cr&   r   c                  :    \ rS rSr SSS.       SS jjjrSrg)	_SkipifMarkDecoratori  .r,   c                   g r   rH   )r   	conditionr-   
conditionss       r$   r   _SkipifMarkDecorator.__call__  s    
  r&   rH   Nr   )r   
str | boolr   r   r-   rN   ru   r'   r    rz   r{   r|   r   r   rH   r&   r$   r   r     sA     %(	  		 !	  $	  		 
 	  	 r&   r   c                  j    \ rS rSr\SS j5       r\ S	SSSSS.             S
S jjj5       rSrg)_XfailMarkDecoratori  c                    g r   rH   r   s     r$   r   _XfailMarkDecorator.__call__  r   r&   .)r-   r/   raisesstrictc                   g r   rH   )r   r   r-   r/   r   r   r   s          r$   r   r     s      r&   rH   Nr   rv   )r   r   r   r   r-   rN   r/   rw   r   z<None | type[BaseException] | tuple[type[BaseException], ...]r   rw   ru   r'   r   rH   r&   r$   r   r     s    	: 
:	 %*	  SV	 !	  $	  		 
 	  Q	  	  	  
	 r&   r   c                  @    \ rS rSrSSSS.           SS jjrSrg)_ParametrizeMarkDecoratori  .)indirectr   scopec                   g r   rH   )r   r9   r^   r   r   r   s         r$   r   "_ParametrizeMarkDecorator.__call__  s      r&   rH   N)r9   rx   r^   ry   r   zbool | Sequence[str]r   zQIterable[None | str | float | int | bool] | Callable[[Any], object | None] | Noner   z_ScopeName | Noneru   r'   r   rH   r&   r$   r   r     sT     .1 '*
	 )
	  J
	 
 +
	 
	  %
	  
	  
	 r&   r   c                      \ rS rSrSS jrSrg)_UsefixturesMarkDecoratori  c                    g r   rH   )r   r   s     r$   r   "_UsefixturesMarkDecorator.__call__      r&   rH   N)r   rN   ru   r'   r   rH   r&   r$   r  r        	r&   r  c                      \ rS rSrSS jrSrg)_FilterwarningsMarkDecoratori  c                    g r   rH   )r   filterss     r$   r   %_FilterwarningsMarkDecorator.__call__  r  r&   rH   N)r  rN   ru   r'   r   rH   r&   r$   r
  r
    r  r&   r
  c                      \ rS rSr% Sr\(       a  S\S'   S\S'   S\S'   S	\S
'   S\S'   S\S'   SS.SS jjrSS jrSr	g)MarkGeneratori  zFactory for :class:`MarkDecorator` objects - exposed as
a ``pytest.mark`` singleton instance.

Example::

     import pytest


     @pytest.mark.slowtest
     def test_function():
         pass

applies a 'slowtest' :class:`Mark` on ``test_function``.
r   r+   r   skipifr   r.   r   r   r  usefixturesr
  filterwarningsFr   c               F    [        U5        S U l        [        5       U l        g r   )r   _configset_markers)r   r   s     r$   r   MarkGenerator.__init__  s    y!&*"%%r&   c           	        US   S:X  a  [        S5      eU R                  Gb  XR                  ;  aq  U R                  R                  S5       HR  nUR	                  S5      S   R	                  S5      S   R                  5       nU R                  R                  U5        MT     XR                  ;  a  U R                  R                  R                  (       d%  U R                  R                  R                  (       a  [        U< S3SS	9  US
;   a  Sn[        SU S35        [        R                  " SU S3[        S5        [        [        US0 SS9SS9$ )z:Generate a new :class:`MarkDecorator` with the given name.r   r?   z*Marker name must NOT start with underscoremarkers:(z, not found in `markers` configuration optionFrl   )parameterizeparametriseparameteriseTz	Unknown 'z#' mark, did you mean 'parametrize'?zUnknown pytest.mark.z - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.htmlr   rH   r   )AttributeErrorr  r  r3   r[   r\   addoptionstrict_markersr   r   r   r   r   r'   r   )r   r   linemarker__tracebackhide__s        r$   __getattr__MarkGenerator.__getattr__  s2   7c> !MNN<<# ==( LL//	:D "ZZ_Q/55c:1=CCEFMM%%f- ; ==(<<&&559L9L9S9S("NO % JJ(,%9TF*MNO*4& 1I I - T$B$?4PPr&   )r  r  N)r   rw   ru   r   )r   rN   ru   r'   )
r    rz   r{   r|   r   r   r}   r   r&  r   rH   r&   r$   r  r    s>        $$""....44,1 (
'Qr&   r  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     SS jjr	SS jr
SS	 jrSS
 jrSS jrSrg)NodeKeywordsi0  )nodeparentr  c                X    Xl         UR                  U l        UR                  S0U l        g )NT)r*  r+  r   r  )r   r*  s     r$   r   NodeKeywords.__init__4  s"    	kkD)r&   c                     U R                   U   $ ! [         a*    U R                  c  e U R                  R                  U   s $ f = fr   )r  KeyErrorr+  keywordsr   keys     r$   __getitem__NodeKeywords.__getitem__9  sG    	-==%% 	-{{";;'',,	-s    1AAc                     X R                   U'   g r   )r  )r   r2  values      r$   __setitem__NodeKeywords.__setitem__A  s    "cr&   c                    XR                   ;   =(       d-    U R                  S L=(       a    XR                  R                  ;   $ r   r  r+  r0  r1  s     r$   __contains__NodeKeywords.__contains__G  s7    ==  ,{{$& ,{{+++	
r&   c                p    U R                   R                  U5        U R                   R                  U5        g r   )r  update)r   r   kwdss      r$   r>  NodeKeywords.updateN  s(    
 	U#T"r&   c                    [        S5      e)Nz"cannot delete key in keywords dict)
ValueErrorr1  s     r$   __delitem__NodeKeywords.__delitem__V  s    =>>r&   c              #     #    U R                    S h  vN   U R                  b3  U R                  R                   H  nXR                   ;  d  M  Uv   M     g g  NE7fr   r:  )r   keywords     r$   __iter__NodeKeywords.__iter__Y  sI     ==  ;;";;//--/!M 0 # 	!s   AA7AAc                &    [        S U  5       5      $ )Nc              3  &   #    U  H  nS v   M	     g7f)r1   NrH   ).0rF  s     r$   	<genexpr>'NodeKeywords.__len__.<locals>.<genexpr>d  s     )D1Ds   )sumr   s    r$   __len__NodeKeywords.__len__b  s    )D)))r&   c                "    SU R                    S3$ )Nz<NodeKeywords for node >)r*  r   s    r$   __repr__NodeKeywords.__repr__f  s    (155r&   )r  r*  r+  N)r*  r   ru   r   )r2  rN   ru   r   )r2  rN   r6  r   ru   r   )r2  rt   ru   rw   )rH   )r   z-Mapping[str, Any] | Iterable[tuple[str, Any]]r?  r   ru   r   )r2  rN   ru   r   )ru   zIterator[str])ru   intr   )r    rz   r{   r|   	__slots__r   r3  r7  r;  r>  rC  rG  rO  rS  r   rH   r&   r$   r)  r)  0  sW    .I*
-#
 @B#<# # 
	#?"*6r&   r)  r   )r8   r   r9   zSequence[str]ru   r'   )r   zobject | typer   rw   ru   z
list[Mark])r   zIterable[Mark | MarkDecorator]ru   zIterable[Mark])r=   r   r   rU  ru   r   )@
__future__r   collections.abcrL   r   r   typingr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   _coder   compatr   r   r   _pytest.configr   _pytest.deprecatedr   r   _pytest.outcomesr   _pytest.scoper   _pytest.warning_typesr   r2   r   r4   r%   r@   rB   	dataclassr   rt   rP   r   r'   r   r   r   r   r   r   r   r  r
  r  r5   rN   r)  rH   r&   r$   <module>rb     s   "           !          "   ! - - ! $ :  7 R+:r$: r$j d#@
 @
 $ @
L :U8CK+@$+F%GH Z/ Z/ Z/@ 0	0 0 	0B-" 67 J& D] D }   m   M  M } 
 EQ EQ EQP 4( 66>#s(+ 66 66r&   