
    9[g3                       d Z ddlm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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lmZ er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mZ  ed      Zed"d       Zeddd#d       Zed$d       Z	 d%	 	 	 	 	 	 	 d&dZe	 d'dd	 	 	 	 	 d(d       Ze	 	 	 	 	 	 	 	 	 	 d)d       Ze fdd	 	 	 	 	 	 	 	 	 d*dZ G d  dejB                        Z"e G d! de"             Z#y)+z/Record warnings during test function execution.    )annotations)pformatN)TracebackType)Any)Callable)final)	Generator)Iterator)overload)Pattern)TYPE_CHECKING)TypeVar)Self)check_ispytest)fixture)Exit)failTc               #     K   t        d      } | 5  t        j                  d       |  ddd       y# 1 sw Y   yxY ww)zReturn a :class:`WarningsRecorder` instance that records all warnings emitted by test functions.

    See :ref:`warnings` for information on warning categories.
    T	_ispytestdefaultN)WarningsRecorderwarningssimplefilter)wrecs    J/var/www/html/bid-api/venv/lib/python3.12/site-packages/_pytest/recwarn.pyrecwarnr   "   s1      d+D	i(
 
s   A 4	A =A .matchr   c                     y N r   s    r   deprecated_callr$   .   s    TW    c                     y r"   r#   )funcargskwargss      r   r$   r$   2   s    MPr%   c                R    d}| | g|}t        t        t        t        fg|i |S )a  Assert that code produces a ``DeprecationWarning`` or ``PendingDeprecationWarning`` or ``FutureWarning``.

    This function can be used as a context manager::

        >>> import warnings
        >>> def api_call_v2():
        ...     warnings.warn('use v3 of this api', DeprecationWarning)
        ...     return 200

        >>> import pytest
        >>> with pytest.deprecated_call():
        ...    assert api_call_v2() == 200

    It can also be used by passing a function and ``*args`` and ``**kwargs``,
    in which case it will ensure calling ``func(*args, **kwargs)`` produces one of
    the warnings types above. The return value is the return value of the function.

    In the context manager form you may use the keyword argument ``match`` to assert
    that the warning matches a text or regex.

    The context manager produces a list of :class:`warnings.WarningMessage` objects,
    one for each warning raised.
    T)warnsDeprecationWarningPendingDeprecationWarningFutureWarning)r'   r(   r)   __tracebackhide__s       r   r$   r$   6   sC    4 }t}	6FIMQW r%   WarningsCheckerc                    y r"   r#   )expected_warningr    s     r   r+   r+   X   s    
 r%   c                     y r"   r#   )r2   r'   r(   r)   s       r   r+   r+   `   s     	r%   c               ,   d}|s9|r)dj                  t        |            }t        d| d      t        | |d      S |d   }t	        |      st        |dt        |       d      t        | d	      5   ||d
d i |cddd       S # 1 sw Y   yxY w)a  Assert that code raises a particular class of warning.

    Specifically, the parameter ``expected_warning`` can be a warning class or tuple
    of warning classes, and the code inside the ``with`` block must issue at least one
    warning of that class or classes.

    This helper produces a list of :class:`warnings.WarningMessage` objects, one for
    each warning emitted (regardless of whether it is an ``expected_warning`` or not).
    Since pytest 8.0, unmatched warnings are also re-emitted when the context closes.

    This function can be used as a context manager::

        >>> import pytest
        >>> with pytest.warns(RuntimeWarning):
        ...    warnings.warn("my warning", RuntimeWarning)

    In the context manager form you may use the keyword argument ``match`` to assert
    that the warning matches a text or regex::

        >>> with pytest.warns(UserWarning, match='must be 0 or None'):
        ...     warnings.warn("value must be 0 or None", UserWarning)

        >>> with pytest.warns(UserWarning, match=r'must be \d+$'):
        ...     warnings.warn("value must be 42", UserWarning)

        >>> with pytest.warns(UserWarning):  # catch re-emitted warning
        ...     with pytest.warns(UserWarning, match=r'must be \d+$'):
        ...         warnings.warn("this is not here", UserWarning)
        Traceback (most recent call last):
          ...
        Failed: DID NOT WARN. No warnings of type ...UserWarning... were emitted...

    **Using with** ``pytest.mark.parametrize``

    When using :ref:`pytest.mark.parametrize ref` it is possible to parametrize tests
    such that some runs raise a warning and others do not.

    This could be achieved in the same way as with exceptions, see
    :ref:`parametrizing_conditional_raising` for an example.

    Tz, z5Unexpected keyword arguments passed to pytest.warns: z"
Use context-manager form instead?)
match_exprr   r   z object (type: z) must be callabler      N)joinsorted	TypeErrorr0   callabletype)r2   r    r(   r)   r/   argnamesr'   s          r   r+   r+   i   s    ^ yy0HGz56  /ETRRAw~thod4j\ASTUU->ab,V, ?>>s   5B

Bc                       e Zd ZdZddd fdZedd       ZddZddZddZ	e
fdd	Zdd
Zd fdZ	 	 	 	 	 	 	 	 d fdZ xZS )r   aF  A context manager to record raised warnings.

    Each recorded warning is an instance of :class:`warnings.WarningMessage`.

    Adapted from `warnings.catch_warnings`.

    .. note::
        ``DeprecationWarning`` and ``PendingDeprecationWarning`` are treated
        differently; see :ref:`ensuring_function_triggers`.

    Fr   c               X    t        |       t        | 	  d       d| _        g | _        y )NT)recordF)r   super__init___entered_list)selfr   	__class__s     r   rA   zWarningsRecorder.__init__   s)    y!%46
r%   c                    | j                   S )zThe list of recorded warnings.rC   rD   s    r   listzWarningsRecorder.list   s     zzr%   c                     | j                   |   S )z Get a recorded warning by index.rG   )rD   is     r   __getitem__zWarningsRecorder.__getitem__   s    zz!}r%   c                ,    t        | j                        S )z&Iterate through the recorded warnings.)iterrC   rH   s    r   __iter__zWarningsRecorder.__iter__   s    DJJr%   c                ,    t        | j                        S )z The number of recorded warnings.)lenrC   rH   s    r   __len__zWarningsRecorder.__len__   s    4::r%   c                   d}t        | j                        D ]z  \  }}|j                  |k(  r| j                  j                  |      c S t	        |j                  |      sI|.t	        |j                  | j                  |   j                        ry|}| || j                  j                  |      S d}t        |d      )zPop the first recorded warning which is an instance of ``cls``,
        but not an instance of a child class of any other match.
        Raises ``AssertionError`` if there is no match.
        NTz not found in warning list)	enumeraterC   categorypop
issubclassAssertionError)rD   clsbest_idxrK   wr/   s         r   rV   zWarningsRecorder.pop   s    
  $djj)DAqzzS zz~~a((!**c* !!**djj.B.K.KL * ::>>(++ w&@ABBr%   c                "    g | j                   dd y)z$Clear the list of recorded warnings.NrG   rH   s    r   clearzWarningsRecorder.clear   s    

1r%   c                    | j                   rd}t        d| d      t        |          }|J || _        t        j                  d       | S )NTzCannot enter z twicealways)rB   RuntimeErrorr@   	__enter__rC   r   r   )rD   r/   rC   rE   s      r   ra   zWarningsRecorder.__enter__   sW    == $thf=>>!#   
h'r%   c                p    | j                   sd}t        d| d      t        |   |||       d| _         y )NTzCannot exit z without entering firstF)rB   r`   r@   __exit__)rD   exc_typeexc_valexc_tbr/   rE   s        r   rc   zWarningsRecorder.__exit__   sA     }} $dX5LMNN7F3 r%   )r   boolreturnNone)rh   zlist[warnings.WarningMessage])rK   intrh   warnings.WarningMessage)rh   z!Iterator[warnings.WarningMessage])rh   rj   )rY   ztype[Warning]rh   rk   )rh   ri   )rh   r   rd   ztype[BaseException] | Nonere   zBaseException | Nonerf   zTracebackType | Nonerh   ri   )__name__
__module____qualname____doc__rA   propertyrI   rL   rO   rR   WarningrV   r]   ra   rc   __classcell__rE   s   @r   r   r      sz    
 -2 7    (/ C&	, & %	
 
 r%   c                  ^     e Zd Zedfdd	 	 	 	 	 	 	 d fdZddZ	 	 	 	 	 	 	 	 d	 fdZ xZS )
r0   NFr   c               T   t        |       t        | 	  d       d}t        |t              r1|D ])  }t        |t              rt        |t        |      z         |}n;t        |t              rt        |t              r|f}nt        |t        |      z        || _	        || _
        y )NTr   z/exceptions must be derived from Warning, not %s)r   r@   rA   
isinstancetuplerW   rr   r9   r;   r2   r5   )rD   r2   r5   r   msgexcexpected_warning_tuprE   s          r   rA   zWarningsChecker.__init__  s     	y!4(?&.'!#w/#C$s)O44 ( $4 ($/Jg5
 %5#6 C$'7"8899 4$r%   c                    | j                   J t        |j                  | j                         xrL t        | j                  d u xs3 t        j                  | j                  t        |j                                    S r"   )	r2   rW   rU   rg   r5   researchstrmessage)rD   warnings     r   matcheszWarningsChecker.matches  se    $$000'**D,A,AB 
tOOt#Wryy#gooBV'WH
 	
r%   c                \    t            |||       d}|!t        |t              rt        |t              ry d fd}	 t         fd D              s"t        d j                   d |        d       nBt         fd D              s.t        d j                   d j                   d	 |        d        D ]k  } j                  |      rt        j                  |j                  |j                  |j                  |j                  |j                   |j"                  
       m  D ]  }t%        |j                        t&        ur|j                  j(                  s6|j                  j(                  d   }t        |t*              r`t-        d|dt%        |      j.                   d       y #  D ]k  } j                  |      rt        j                  |j                  |j                  |j                  |j                  |j                   |j"                  
       m  D ]  }t%        |j                        t&        ur|j                  j(                  s6|j                  j(                  d   }t        |t*              r`t-        d|dt%        |      j.                   d       w xY w)NTc                 X    t        D  cg c]  } | j                   c} d      S c c} w )N   )indent)r   r   )r?   rD   s    r   	found_strz+WarningsChecker.__exit__.<locals>.found_str7  s&    >vFNN>qII>s   'c              3  ^   K   | ]$  }t        |j                  j                         & y wr"   )rW   rU   r2   .0r[   rD   s     r   	<genexpr>z+WarningsChecker.__exit__.<locals>.<genexpr>;  s#     Sdz!**d.C.CDds   *-z"DID NOT WARN. No warnings of type z" were emitted.
 Emitted warnings: .c              3  @   K   | ]  }j                  |        y wr"   )r   r   s     r   r   z+WarningsChecker.__exit__.<locals>.<genexpr>@  s     7$Qa$s   z* matching the regex were emitted.
 Regex: z
 Emitted warnings: )r   rU   filenamelinenomodulesourcer   z$Warning must be str or Warning, got z (type ))rh   r   )r@   rc   rw   	Exceptionr   anyr   r2   r5   r   r   warn_explicitr   rU   r   r   rn   r   r;   UserWarningr(   r   r9   rm   )	rD   rd   re   rf   r/   r   r[   ry   rE   s	   `       r   rc   zWarningsChecker.__exit__"  s]    	7F3  7I.'4(	J2	SdSS89N9N8O P**3+a9 7$7789N9N8O P#/ 0**3+a9 ||A** !		!"!" xx || xx & 		?+5 yy~~iinnQ'c3'  :3'cI[I[H\\]^  ' ||A** !		!"!" xx || xx & 		?+5 yy~~iinnQ'c3'  :3'cI[I[H\\]^  s    A8F1 1J+	C"J+)r2   )type[Warning] | tuple[type[Warning], ...]r5   str | Pattern[str] | Noner   rg   rh   ri   )r   rk   rh   rg   rl   )rm   rn   ro   rr   rA   r   rc   rs   rt   s   @r   r0   r0      s}     GN04%
  %C% .%
 % 
%4
J,J &J %	J
 
J Jr%   )rh   zGenerator[WarningsRecorder])r    r   rh   r   )r'   Callable[..., T]r(   r   r)   r   rh   r   r"   )r'   zCallable[..., Any] | Noner(   r   r)   r   rh   zWarningsRecorder | Any).)r2   r   r    r   rh   r0   )
r2   r   r'   r   r(   r   r)   r   rh   r   )
r2   r   r(   r   r    r   r)   r   rh   zWarningsChecker | Any)$rp   
__future__r   pprintr   r}   typesr   typingr   r   r   r	   r
   r   r   r   r   typing_extensionsr   r   _pytest.deprecatedr   _pytest.fixturesr   _pytest.outcomesr   r   r   r   r$   r+   rr   catch_warningsr   r0   r#   r%   r   <module>r      s   5 "  	            &  - $ ! ! CL 	 	 
:= W 
 W 
 P 
 P '+
#36BED 
BE (+? % 	 
 
?
  	
  
 CJ=- (,=-?=-=- %=- 	=-
 =-@Tx.. Tn k& k kr%   