o
    wi                     @  sV  d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	m
Z
mZmZmZmZmZmZmZ d dlmZ ddlmZmZmZ e
rNd dlmZ edZdFddZedZedZG dd dZdGdHddZdIddZdJd#d$Z dKd'd(Z!dLd+d,Z"dMd.d/Z#ej$dNd3d4Z%ej$dOd7d8Z&dPd:d;Z'dQd>d?Z(dRdAdBZ)dSdDdEZ*dS )T    )annotationsN)TYPE_CHECKINGAnyDictUnionTypeVarIteratorNoReturn	Coroutine	find_spec   )CoroTypeFuncType	TypeGuard)r   _Tkeystrreturnboolc                 C  s   t j| d dv S )N >   truet1)osenvirongetlower)r    r   C/home/app/Keep/.python/lib/python3.10/site-packages/prisma/utils.py	_env_bool      r    ZPRISMA_PY_DEBUGZPRISMA_PY_DEBUG_GENERATORc                   @  s   e Zd ZdddZdS )	_NoneTyper   r   c                 C  s   dS )NFr   )selfr   r   r   __bool__   s   z_NoneType.__bool__N)r   r   )__name__
__module____qualname__r$   r   r   r   r   r"      s    r"      startfloat	precisionintc                 C  s   t t |  |}| dS )Ns)roundtime	monotonic)r)   r+   deltar   r   r   
time_since"   s   
r2   Nonec                   C  s   t rtdtj  d S d S )NZprisma)DEBUGlogging	getLoggersetLevelr   r   r   r   setup_logging(   s   r8   funcUnion[FuncType, CoroType]argsr   kwargsobjectc                 O  s(   t | rt| |i |S | |i |S N)is_coroutine	async_run)r9   r;   r<   r   r   r   maybe_async_run-   s   rA   coroCoroutine[Any, Any, _T]c                 C  s   t  | S )z,Execute the coroutine and return the result.)get_or_create_event_looprun_until_complete)rB   r   r   r   r@   7   s   r@   objTypeGuard[CoroType]c                 C  s   t | p	t| S r>   )asyncioiscoroutinefunctioninspectisgeneratorfunctionrF   r   r   r   r?   <   s   r?   namec                 C  s   t | d uS r>   r   )rM   r   r   r   module_exists@   s   rN   envDict[str, str]Iterator[None]c                 c  sp    t j }zt j|  d V  W | D ]	}t j|d  qt j| d S | D ]	}t j|d  q't j| w r>   )r   r   copyupdatepop)rO   oldr   r   r   r   temp_env_updateD   s   
rV   attrnewc              
   #  sP    d fdd}t | |zt| || dV  W t| | dS t| | w )	zTemporarily replace a method with a new funtion

    The previously set method is passed as the first argument to the new function
    r;   r   r<   r   c                    s    g| R i |S r>   r   )r;   r<   rX   rU   r   r   patchedY   r!   zmonkeypatch.<locals>.patchedN)r;   r   r<   r   r   r   )getattrsetattr)rF   rW   rX   rZ   r   rY   r   monkeypatchR   s   
r]   asyncio.AbstractEventLoopc               	   C  s|   t  0 t jdtd zt W W  d   S  ty3   t } t|  |  Y W  d   S w 1 s7w   Y  dS )a  Return the currently set event loop or create a new event loop if there
    is no set event loop.

    Starting from python3.10, asyncio.get_event_loop() raises a DeprecationWarning
    when there is no event loop set, this deprecation will be enforced starting from
    python3.12

    This function serves as a future-proof wrapper over asyncio.get_event_loop()
    that preserves the old behaviour.
    ignore)categoryN)	warningscatch_warningsfilterwarningsDeprecationWarningrH   get_event_loopRuntimeErrornew_event_loopset_event_loop)loopr   r   r   rD   e   s   

rD   valuer	   c                 C  s   t dt| j)zkUsed by type checkers for exhaustive match cases.

    https://github.com/microsoft/pyright/issues/767
    zUnhandled type: {})AssertionErrorformattyper%   rj   r   r   r   assert_never{   s   ro   	_T | Nonec                 C  s   | S )zHelper function for type checkers to change the given type to include None.

    This is useful in cases where you do not have an explicit type for a symbol (e.g. modules)
    but want to mark it as potentially None.
    r   rn   r   r   r   make_optional   s   rq   TypeGuard[dict[object, object]]c                 C  s
   t | tS r>   )
isinstancedictrL   r   r   r   is_dict   s   
ru   )r   r   r   r   )r(   )r)   r*   r+   r,   r   r   )r   r3   )r9   r:   r;   r   r<   r   r   r=   )rB   rC   r   r   )rF   r   r   rG   )rM   r   r   r   )rO   rP   r   rQ   )rF   r   rW   r   rX   r   r   r   )r   r^   )rj   r	   r   r	   )rj   r   r   rp   )rF   r=   r   rr   )+
__future__r   r   r/   rH   rJ   r5   ra   
contextlibtypingr   r   r   r   r   r   r	   r
   importlib.utilr   _typesr   r   r   Ztyping_extensionsr   r    r4   ZDEBUG_GENERATORr"   r2   r8   rA   r@   r?   rN   contextmanagerrV   r]   rD   ro   rq   ru   r   r   r   r   <module>   s@    (









	