
    [Fi5                        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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 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e
d   fd       Zedddeeeee   f      ddfd       Zededef   d ed!edefd"       Z	 d+deedef      d ed!ededef   fd#Ze	 d,ddd$eee    eee    df   f   deeeee   f      dd%fd&       Z!ed$eee    eee    df   f   dedef   d ed!edef
d'       Z!e fddd$eee    eee    df   f   d edeeeee   f      d!eded%ef   f
d(Z! G d) dejD                        Z#e	 G d* d%e#             Z$y)-z/Record warnings during test function execution.    )pformatN)TracebackType)Any)Callable)final)	Generator)Iterator)List)Optional)overload)Pattern)Tuple)Type)TypeVar)Union)check_ispytest)fixture)Exit)failTreturn)WarningsRecorderNNc               #      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 https://docs.pytest.org/en/latest/how-to/capture-warnings.html for information
    on warning categories.
    T	_ispytestdefaultN)r   warningssimplefilter)wrecs    a/var/www/html/BankruptcyAI-uat/bankruptcy-ai/venv/lib/python3.12/site-packages/_pytest/recwarn.pyrecwarnr!      s<      d+D	 i(
  s   A 4	A =A .matchr#   r   c                      y N r"   s    r    deprecated_callr'   ,   s         funcargskwargsc                      y r%   r&   )r)   r*   r+   s      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(   expected_warningWarningsCheckerc                     y r%   r&   )r3   r#   s     r    r.   r.   X   s    
 r(   c                      y r%   r&   )r3   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	TypeErrorr4   callabletype)r3   r#   r*   r+   r2   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eddf fdZeded   fd	       Zd
e	ddfdZ
ded   fdZde	fdZefdee   ddfdZddZd fdZdeee      dee   dee   ddf 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   r   r   Nc                X    t        |       t        | 	  d       d| _        g | _        y )NT)recordF)r   super__init___entered_list)selfr   	__class__s     r    rD   zWarningsRecorder.__init__   s)    y!%46
r(   zwarnings.WarningMessagec                     | j                   S )zThe list of recorded warnings.rF   rG   s    r    listzWarningsRecorder.list   s     zzr(   ic                      | j                   |   S )z Get a recorded warning by index.rJ   )rG   rM   s     r    __getitem__zWarningsRecorder.__getitem__   s    zz!}r(   c                 ,    t        | j                        S )z&Iterate through the recorded warnings.)iterrF   rK   s    r    __iter__zWarningsRecorder.__iter__   s    DJJr(   c                 ,    t        | j                        S )z The number of recorded warnings.)lenrF   rK   s    r    __len__zWarningsRecorder.__len__   s    4::r(   clsc                    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)	enumeraterF   categorypop
issubclassAssertionError)rG   rV   best_idxrM   wr2   s         r    rZ   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.NrJ   rK   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)rE   RuntimeErrorrC   	__enter__rF   r   r   )rG   r2   rF   rH   s      r    rd   zWarningsRecorder.__enter__   sW    == $thf=>>!#   
h'r(   exc_typeexc_valexc_tbc                 p    | j                   sd}t        d| d      t        |   |||       d| _         y )NTzCannot exit z without entering firstF)rE   rc   rC   __exit__)rG   re   rf   rg   r2   rH   s        r    ri   zWarningsRecorder.__exit__   sA     }} $dX5LMNN7F3 r(   )r   N)r   r   )__name__
__module____qualname____doc__boolrD   propertyr
   rL   intrO   r	   rR   rU   Warningr   rZ   r`   rd   r   BaseExceptionr   ri   __classcell__rH   s   @r    r   r      s    
 -2 7T 7d 7 d45  S %>  (#<=    (/ CtG} C3L C&	4./ -( '	
 
 r(   c            
            e Zd Zedfdddeee   eee   df   f   deeee	e   f      de
ddf fd	Zd
ej                  de
fdZdeee      dee   dee   ddf fdZ xZS )r4   NFr   r3   .r8   r   r   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   rC   rD   
isinstancetupler[   rq   r<   r>   r3   r8   )rG   r3   r8   r   msgexcexpected_warning_tuprH   s          r    rD   zWarningsChecker.__init__  s     	y!4(?&.' 5!#w/#C$s)O445 $4 ($/Jg5
 %5#6 C$'7"8899 4$r(   warningc                     | j                   J t        |j                  | j                         xrL t        | j                  d u xs3 t        j                  | j                  t        |j                                    S r%   )	r3   r[   rY   rn   r8   researchstrmessage)rG   r|   s     r    matcheszWarningsChecker.matches  se    $$000'**D,A,AB 
tOOt#Wryy#gooBV'WH
 	
r(   re   rf   rg   c                 h    t            |||       d}|!t        |t              rt        |t              ry dt
        f 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)NTr   c                  X    t        D  cg c]  } | j                   c} d      S c c} w )N   )indent)r   r   )rB   rG   s    r    	found_strz+WarningsChecker.__exit__.<locals>.found_str9  s"    >vFNN>qII>s   'c              3   ^   K   | ]$  }t        |j                  j                         & y wr%   )r[   rY   r3   .0r^   rG   s     r    	<genexpr>z+WarningsChecker.__exit__.<locals>.<genexpr>=  s"     Sz!**d.C.CDSs   *-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>B  s     7Qa7s   z* matching the regex were emitted.
 Regex: z
 Emitted warnings: )r   rY   filenamelinenomodulesourcer   z$Warning must be str or Warning, got z (type ))rC   ri   rw   	Exceptionr   r   anyr   r3   r8   r   r   warn_explicitr   rY   r   r   rk   r   r>   UserWarningr*   r<   rj   )	rG   re   rf   rg   r2   r   r^   ry   rH   s	   `       r    ri   zWarningsChecker.__exit__$  sy    	7F3  7I.'4(	J3 	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   A8F7 7J1C"J1)rj   rk   rl   rq   r   r   r   r   r   r   rn   rD   r   WarningMessager   rr   r   ri   rs   rt   s   @r    r4   r4     s     MT9=%
  %WuT']C5G/H HI% U3#456%
 % 
%4
x66 
4 
J4./J -(J '	J
 
J Jr(   r%   ).)%rm   pprintr   r~   typesr   typingr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   _pytest.deprecatedr   _pytest.fixturesr   _pytest.outcomesr   r   r   r!   r   r'   rq   r.   catch_warningsr   r4   r&   r(   r    <module>r      s   5  	                - $ ! ! CL 		9: 	 		 
36uS'#,./0 

 
 P(36* P3 P# P! P 
 P *.
8CH%
&69EH
s"#D 
HK 14DM5g1C+DDE E#ws|+,- 	 
 
DM5g1C+DDE
36
  	
  
 IP=- 15=-DM5g1C+DDE=-=- E#ws|+,-=- 	=-
 c!"=-@Vx.. Vr k& k kr(   