o
    #if5                     @   s  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dZedddeeeee f  ddfdd Zed!edef d"ed#edefd$d Z	d.d!eedef  d"ed#ededef fd%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(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*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+d)Z!G d,d dej"Z#e	G d-d' d'e#Z$dS )0z/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                  c   sF    t dd} |  td | V  W d   dS 1 sw   Y  dS )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)wrec r   H/var/www/html/corbot_env/lib/python3.10/site-packages/_pytest/recwarn.pyrecwarn   s   

"r!   .matchr#   r   c                 C      d S Nr   r"   r   r   r    deprecated_call,   s   r&   funcargskwargsc                 O   r$   r%   r   )r'   r(   r)   r   r   r    r&   2   s   c                 O   s4   d}| dur| g|R }t tttfg|R 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.
    TN)warnsDeprecationWarningPendingDeprecationWarningFutureWarning)r'   r(   r)   __tracebackhide__r   r   r    r&   6   s   expected_warningWarningsCheckerc                C   r$   r%   r   )r/   r#   r   r   r    r*   X   s   r*   c                 O   r$   r%   r   )r/   r'   r(   r)   r   r   r    r*   `   s   c                O   s   d}|s|rd t|}td| dt| |ddS |d }t|s0t|dt| dt| dd	 ||d
d i |W  d   S 1 sLw   Y  dS )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)r/   r#   r(   r)   r.   argnamesr'   r   r   r    r*   i   s   /
$c                       s   e Zd ZdZdddeddf fddZeded	 fd
dZde	dd	fddZ
ded	 fddZde	fddZefdee dd	fddZdddZd  fddZdeee  dee dee ddf fddZ  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                   s&   t | t jdd d| _g | _d S )NT)recordF)r   super__init___entered_list)selfr   	__class__r   r    r;      s   
zWarningsRecorder.__init__zwarnings.WarningMessagec                 C   s   | j S )zThe list of recorded warnings.r=   r>   r   r   r    list   s   zWarningsRecorder.listic                 C   s
   | j | S )z Get a recorded warning by index.rA   )r>   rD   r   r   r    __getitem__      
zWarningsRecorder.__getitem__c                 C   
   t | jS )z&Iterate through the recorded warnings.)iterr=   rB   r   r   r    __iter__   rF   zWarningsRecorder.__iter__c                 C   rG   )z The number of recorded warnings.)lenr=   rB   r   r   r    __len__   rF   zWarningsRecorder.__len__clsc                 C   s   d}t | jD ]'\}}|j|kr| j|  S t|j|r.|du s,t|j| j| js.|}q|dur9| 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)	enumerater=   categorypop
issubclassAssertionError)r>   rL   best_idxrD   wr.   r   r   r    rO      s   
zWarningsRecorder.popc                 C   s   g | j dd< dS )z$Clear the list of recorded warnings.NrA   rB   r   r   r    clear   s   zWarningsRecorder.clearc                    sD   | j rd}td| dt  }|d usJ || _td | S )NTzCannot enter z twicealways)r<   RuntimeErrorr:   	__enter__r=   r   r   )r>   r.   r=   r?   r   r    rW      s   

zWarningsRecorder.__enter__exc_typeexc_valexc_tbc                    s4   | j sd}td| dt ||| d| _ d S )NTzCannot exit z without entering firstF)r<   rV   r:   __exit__)r>   rX   rY   rZ   r.   r?   r   r    r[      s
   
zWarningsRecorder.__exit__)r   N)r   r   )__name__
__module____qualname____doc__boolr;   propertyr
   rC   intrE   r	   rI   rK   Warningr   rO   rT   rW   r   BaseExceptionr   r[   __classcell__r   r   r?   r    r      s(    

c                
       s   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	d
Zdejde
fddZdeee  dee dee ddf fddZ  ZS )r0   NFr   r/   .r1   r   r   c                   s   t | t jdd d}t|tr'|D ]}t|ts#t|t| q|}nt|tr5t|tr5|f}nt|t| || _	|| _
d S )NTr   z/exceptions must be derived from Warning, not %s)r   r:   r;   
isinstancetuplerP   rc   r5   r7   r/   r1   )r>   r/   r1   r   msgexcexpected_warning_tupr?   r   r    r;     s    


zWarningsChecker.__init__warningc                 C   s>   | j d usJ t|j| j ot| jd u pt| jt|jS r%   )	r/   rP   rN   r`   r1   researchstrmessage)r>   rk   r   r   r    matches  s   zWarningsChecker.matchesrX   rY   rZ   c                    s  t  ||| d}|d urt|trt|trd S dtf fdd}z~t fdd D s=td j d|  d	 nt fd
d D sYtd j d j	 d|  d	 W  D ]} 
|sttj|j|j|j|j|j|jd q\ D ](}t|jturqw|jjsqw|jjd }t|trqwtd|dt|j dd S  D ]} 
|stj|j|j|j|j|j|jd q D ](}t|jturq|jjsq|jjd }t|trqtd|dt|j dw )NTr   c                      s   t dd  D ddS )Nc                 S   s   g | ]}|j qS r   )ro   ).0r9   r   r   r    
<listcomp>:  s    z?WarningsChecker.__exit__.<locals>.found_str.<locals>.<listcomp>   )indentr   r   rB   r   r    	found_str9  s   z+WarningsChecker.__exit__.<locals>.found_strc                 3   s    | ]
}t |j jV  qd S r%   )rP   rN   r/   rq   rS   rB   r   r    	<genexpr>=  s    z+WarningsChecker.__exit__.<locals>.<genexpr>z"DID NOT WARN. No warnings of type z" were emitted.
 Emitted warnings: .c                 3   s    | ]}  |V  qd S r%   )rp   rv   rB   r   r    rw   B  s    z* matching the regex were emitted.
 Regex: z
 Emitted warnings: )ro   rN   filenamelinenomodulesourcer   z$Warning must be str or Warning, got z (type ))r:   r[   rf   	Exceptionr   rn   anyr   r/   r1   rp   r   warn_explicitro   rN   ry   rz   r]   r|   r7   UserWarningr(   r5   r\   )r>   rX   rY   rZ   r.   ru   rS   rh   r?   rB   r    r[   $  s   





zWarningsChecker.__exit__)r\   r]   r^   rc   r   r   r   r   rn   r   r`   r;   r   WarningMessagerp   rd   r   r[   re   r   r   r?   r    r0     s0    
r%   ).)%r_   pprintr   rl   typesr   typingr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   _pytest.deprecatedr   _pytest.fixturesr   _pytest.outcomesr   r   r   r!   rn   r&   rc   r*   catch_warningsr   r0   r   r   r   r    <module>   s   $

"
	

@Y