o
    Zhz5                     @   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)Zwrec r   F/var/www/html/lang_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%   7   s   expected_warningWarningsCheckerc                C   r#   r$   r   )r.   r"   r   r   r   r)   Y   s   r)   c                 O   r#   r$   r   )r.   r&   r'   r(   r   r   r   r)   b   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	TypeErrorr/   callabletype)r.   r"   r'   r(   r-   argnamesr&   r   r   r   r)   l   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.r@   )r=   rC   r   r   r   __getitem__      
zWarningsRecorder.__getitem__c                 C   
   t | jS )z&Iterate through the recorded warnings.)iterr<   rA   r   r   r   __iter__   rE   zWarningsRecorder.__iter__c                 C   rF   )z The number of recorded warnings.)lenr<   rA   r   r   r   __len__   rE   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=   rK   Zbest_idxrC   wr-   r   r   r   rN      s   
zWarningsRecorder.popc                 C   s   g | j dd< dS )z$Clear the list of recorded warnings.Nr@   rA   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;   RuntimeErrorr9   	__enter__r<   r   r   )r=   r-   r<   r>   r   r   rU      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;   rT   r9   __exit__)r=   rV   rW   rX   r-   r>   r   r   rY      s
   
zWarningsRecorder.__exit__)r   N)r   r   )__name__
__module____qualname____doc__boolr:   propertyr
   rB   intrD   r	   rH   rJ   Warningr   rN   rR   rU   r   BaseExceptionr   rY   __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 )r/   NFr   r.   .r0   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   r9   r:   
isinstancetuplerO   ra   r4   r6   r.   r0   )r=   r.   r0   r   msgexcZ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.   rO   rM   r^   r0   researchstrmessage)r=   rh   r   r   r   matches"  s   zWarningsChecker.matchesrV   rW   rX   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   )rl   ).0r8   r   r   r   
<listcomp>>  s    z?WarningsChecker.__exit__.<locals>.found_str.<locals>.<listcomp>   )indentr   r   rA   r   r   	found_str=  s   z+WarningsChecker.__exit__.<locals>.found_strc                 3   s    | ]
}t |j jV  qd S r$   )rO   rM   r.   rn   rQ   rA   r   r   	<genexpr>A  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$   )rm   rs   rA   r   r   rt   F  s    z* matching the regex were emitted.
 Regex: z
 Emitted warnings: )rl   rM   filenamelinenomodulesourcer   z$Warning must be str or Warning, got z (type ))r9   rY   rd   	Exceptionr   rk   anyr   r.   r0   rm   r   warn_explicitrl   rM   rv   rw   r[   ry   r6   UserWarningr'   r4   rZ   )r=   rV   rW   rX   r-   rr   rQ   rf   r>   rA   r   rY   (  s   





zWarningsChecker.__exit__)rZ   r[   r\   ra   r   r   r   r   rk   r   r^   r:   r   WarningMessagerm   rb   r   rY   rc   r   r   r>   r   r/     s0    
r$   ).)%r]   pprintr   ri   typesr   typingr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   Z_pytest.deprecatedr   Z_pytest.fixturesr   Z_pytest.outcomesr   r   r   r    rk   r%   ra   r)   catch_warningsr   r/   r   r   r   r   <module>   s   $

"



@Z