o
    Ú­j²*  ã                   @   sª  d Z ddl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m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.é    N©Úpformat)ÚTracebackType)ÚAny)ÚCallable)Ú	Generator)ÚIterator)ÚList)ÚOptional)ÚPattern)ÚTuple)ÚType)ÚTypeVar)ÚUnion)Úfinal)Úoverload)Úcheck_ispytest)ÚWARNS_NONE_ARG)Úfixture)ÚfailÚTÚreturn)ÚWarningsRecorderNNc                  c   sF   � t dd�} | � t d¡ | V  W d  ƒ dS 1 sw   Y  dS )zØReturn 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   úL/var/www/html/CropPilot/venv/lib/python3.10/site-packages/_pytest/recwarn.pyÚrecwarn   s   €

"þr!   .©Úmatchr#   r   c                 C   ó   d S ©Nr   r"   r   r   r    Údeprecated_call*   ó   r&   ÚfuncÚargsÚkwargsc                 O   r$   r%   r   )r(   r)   r*   r   r   r    r&   1   r'   c                 O   s0   d}| dur| f| }t ttfg|¢R i |¤ŽS )a�  Assert that code produces a ``DeprecationWarning`` or ``PendingDeprecationWarning``.

    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)r(   r)   r*   Ú__tracebackhide__r   r   r    r&   8   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+   a   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 sequence
    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 raised (regardless of whether it is an ``expected_warning`` or not).

    This function can be used as a context manager, which will capture all the raised
    warnings inside it::

        >>> 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, 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+   k   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   sB   t | jƒD ]\}}t|j|ƒr| j |¡  S qd}t|›d�ƒ‚)z>Pop the first recorded warning, raise exception if not exists.Tz not found in warning list)Ú	enumerater=   Ú
issubclassÚcategoryÚpopÚAssertionError)r>   rL   rD   Úwr.   r   r   r    rP   Ï   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    rV   Ý   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<   rU   r:   Ú__exit__)r>   rW   rX   rY   r.   r?   r   r    rZ   è   s
   
zWarningsRecorder.__exit__)r   N)r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úboolr;   Úpropertyr	   rC   ÚintrE   r   rI   rK   ÚWarningr   rP   rS   rV   r
   ÚBaseExceptionr   rZ   Ú__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e df f  deeee	e f  de
ddf‡ 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}|d u rtjtdd� d }n+t|tƒr5|D ]}t|t	ƒs1t
|t|ƒ ƒ‚q"|}nt|t	ƒr>|f}nt
|t|ƒ ƒ‚|| _|| _d S )NTr   z/exceptions must be derived from Warning, not %sé   )Ú
stacklevel)r   r:   r;   r   Úwarnr   Ú
isinstanceÚtuplerN   rb   r5   r7   r/   r1   )r>   r/   r1   r   ÚmsgÚexpected_warning_tupÚexcr?   r   r    r;   û   s"   	

ÿ

zWarningsChecker.__init__rW   rX   rY   c                    sò   t ƒ  |||¡ d}‡ fdd„}|d u ro|d u rq|d u rsˆ jd urut‡ fdd„ˆ D ƒƒs=d}tdˆ j› d|ƒ › d�ƒ d S ˆ jd urwˆ D ]}t|jˆ jƒr\t 	ˆ j¡ 
t|jƒ¡r\ d S qDtdˆ j› d	ˆ j› d
|ƒ › �ƒ d S d S d S d S d S d S )NTc                      s   t dd„ ˆ D ƒdd�S )Nc                 S   s   g | ]}|j ‘qS r   )Úmessage)Ú.0r9   r   r   r    Ú
<listcomp>#  s    z?WarningsChecker.__exit__.<locals>.found_str.<locals>.<listcomp>é   )Úindentr   r   rB   r   r    Ú	found_str"  s   z+WarningsChecker.__exit__.<locals>.found_strc                 3   s   � | ]
}t |jˆ jƒV  qd S r%   )rN   rO   r/   )rn   ÚrrB   r   r    Ú	<genexpr>(  s   € z+WarningsChecker.__exit__.<locals>.<genexpr>z"DID NOT WARN. No warnings of type z0 were emitted.
The list of emitted warnings is: Ú.z* matching the regex were emitted.
 Regex: z
 Emitted warnings: )r:   rZ   r/   Úanyr   r1   rN   rO   ÚreÚcompileÚsearchÚstrrm   )r>   rW   rX   rY   r.   rr   rs   r?   rB   r    rZ     s<   

ÿÿ
€ÿþýÿòzWarningsChecker.__exit__)r[   r\   r]   rb   r
   r   r   r   rz   r   r_   r;   rc   r   rZ   rd   r   r   r?   r    r0   ù   s2    ûùÿþûùø
þýüûr%   ).)&r^   rw   r   Úpprintr   Útypesr   Útypingr   r   r   r   r	   r
   r   r   r   r   r   Ú_pytest.compatr   r   Ú_pytest.deprecatedr   r   Ú_pytest.fixturesr   Ú_pytest.outcomesr   r   r!   rz   r&   rb   r+   Úcatch_warningsr   r0   r   r   r   r    Ú<module>   s¸    ÿÿþ
ÿÿÿþÿÿÿÿ

þ ÿýÿýüÿ
þýüû
ÿýÿþýü

û?O