o
    h3                     @  s  d 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 ddlmZ ddlmZ erPd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d2ddZeddd3ddZed4d$dZ	d5d6d'dZe	d7ddd8d+d,Zed9d-d,Ze fddd:d/d,ZG d0d dej!Z"eG d1d* d*e"Z#dS );z/Record warnings during test function execution.    )annotations)Callable)	Generator)IteratorpformatN)TracebackType)Any)final)overload)TYPE_CHECKING)TypeVar)Self)check_ispytest)fixture)Exit)failTreturnGenerator[WarningsRecorder]c                  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 :ref:`warnings` for information on warning categories.
    T	_ispytestdefaultN)WarningsRecorderwarningssimplefilter)wrec r   P/var/www/html/openai_agents/venv/lib/python3.10/site-packages/_pytest/recwarn.pyrecwarn!   s   

"r   .matchr!   str | re.Pattern[str] | Noner   c                 C     d S Nr   r    r   r   r   deprecated_call-   s   r%   funcCallable[..., T]argsr	   kwargsc                 O  r#   r$   r   )r&   r(   r)   r   r   r   r%   3   s   Callable[..., Any] | NoneWarningsRecorder | Anyc                 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)type[Warning] | tuple[type[Warning], ...]WarningsCheckerc                C  r#   r$   r   )r1   r!   r   r   r   r,   Y   s   r,   c                 O  r#   r$   r   )r1   r&   r(   r)   r   r   r   r,   a   s   WarningsChecker | Anyc                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	TypeErrorr3   callabletype)r1   r!   r(   r)   r0   argnamesr&   r   r   r   r,   j   s   /
$c                      s   e Zd ZdZddd( fdd	Zed)ddZd*ddZd+ddZd,ddZ	e
fd-ddZd.ddZd/ fddZd0 fd&d'Z  ZS )1r   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   boolr   Nonec                  s&   t | t jdd d| _g | _d S )NT)recordF)r   super__init___entered_list)selfr   	__class__r   r   rA      s   
zWarningsRecorder.__init__list[warnings.WarningMessage]c                 C  s   | j S )zThe list of recorded warnings.rC   rD   r   r   r   list   s   zWarningsRecorder.listiintwarnings.WarningMessagec                 C  s
   | j | S )z Get a recorded warning by index.rH   )rD   rK   r   r   r   __getitem__      
zWarningsRecorder.__getitem__!Iterator[warnings.WarningMessage]c                 C  
   t | jS )z&Iterate through the recorded warnings.)iterrC   rI   r   r   r   __iter__   rO   zWarningsRecorder.__iter__c                 C  rQ   )z The number of recorded warnings.)lenrC   rI   r   r   r   __len__   rO   zWarningsRecorder.__len__clstype[Warning]c                 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)	enumeraterC   categorypop
issubclassAssertionError)rD   rV   best_idxrK   wr0   r   r   r   rZ      s   
zWarningsRecorder.popc                 C  s   g | j dd< dS )z$Clear the list of recorded warnings.NrH   rI   r   r   r   clear   s   zWarningsRecorder.clearr   c                   sD   | j rd}td| dt  }|d usJ || _td | S )NTzCannot enter z twicealways)rB   RuntimeErrorr@   	__enter__rC   r   r   )rD   r0   rC   rE   r   r   rb      s   

zWarningsRecorder.__enter__exc_typetype[BaseException] | Noneexc_valBaseException | Noneexc_tbTracebackType | Nonec                   s4   | j sd}td| dt ||| d| _ d S )NTzCannot exit z without entering firstF)rB   ra   r@   __exit__)rD   rc   re   rg   r0   rE   r   r   ri      s
   
zWarningsRecorder.__exit__)r   r=   r   r>   )r   rG   )rK   rL   r   rM   )r   rP   )r   rL   )rV   rW   r   rM   )r   r>   )r   r   rc   rd   re   rf   rg   rh   r   r>   )__name__
__module____qualname____doc__rA   propertyrJ   rN   rS   rU   WarningrZ   r_   rb   ri   __classcell__r   r   rE   r   r      s    



c                      sB   e Zd Zedfddd fddZdddZd fddZ  ZS )r3   NFr   r1   r2   r5   r"   r   r=   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@   rA   
isinstancetupler[   rp   r9   r;   r1   r5   )rD   r1   r5   r   msgexcexpected_warning_tuprE   r   r   rA     s    


zWarningsChecker.__init__warningrM   c                 C  s>   | j d usJ t|j| j ot| jd u pt| jt|jS r$   )	r1   r[   rY   r=   r5   researchstrmessage)rD   rw   r   r   r   matches  s   zWarningsChecker.matchesrc   rd   re   rf   rg   rh   c                   s  t  ||| d}|d urt|trt|trd S d fdd}z~t fdd D s;td j d	|  d
 nt fdd D sWtd j d j d|  d
 W  D ]} 	|srt
j|j|j|j|j|j|jd qZ D ](}t|jturqu|jjsqu|jjd }t|trqut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   rz   c                     s   t dd  D ddS )Nc                 S  s   g | ]}|j qS r   )r{   ).0r?   r   r   r   
<listcomp>9  s    z?WarningsChecker.__exit__.<locals>.found_str.<locals>.<listcomp>   )indentr   r   rI   r   r   	found_str8  s   z+WarningsChecker.__exit__.<locals>.found_strc                 3  s    | ]
}t |j jV  qd S r$   )r[   rY   r1   r}   r^   rI   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$   )r|   r   rI   r   r   r   A  s    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 ))r   rz   )r@   ri   rr   	Exceptionr   anyr   r1   r5   r|   r   warn_explicitr{   rY   r   r   rl   r   r;   UserWarningr(   rz   r9   rk   )rD   rc   re   rg   r0   r   r^   rt   rE   rI   r   ri   #  s   





zWarningsChecker.__exit__)r1   r2   r5   r"   r   r=   r   r>   )rw   rM   r   r=   rj   )rk   rl   rm   rp   rA   r|   ri   rq   r   r   rE   r   r3     s    
)r   r   )r!   r"   r   r   )r&   r'   r(   r	   r)   r	   r   r   r$   )r&   r*   r(   r	   r)   r	   r   r+   ).)r1   r2   r!   r"   r   r3   )
r1   r2   r&   r'   r(   r	   r)   r	   r   r   )
r1   r2   r(   r	   r!   r"   r)   r	   r   r4   )$rn   
__future__r   collections.abcr   r   r   pprintr   rx   typesr   typingr	   r
   r   r   r   typing_extensionsr   r   _pytest.deprecatedr   _pytest.fixturesr   _pytest.outcomesr   r   r   r   r%   r,   rp   catch_warningsr   r3   r   r   r   r   <module>   sX   "	@W