o
    Òó·i�E  ã                   @   sR  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 d dlmZ d dl	m
Z
mZmZ d dl	mZmZ d dlmZ d dlmZ d dlmZmZ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 m!Z!m"Z" d dlm#Z#m$Z$m%Z% d dl	m&Z& d dl'm(Z( dZ)dZ*eƒ Z+ej,ej-Z.Z/da0e 1¡ Z2da3da4i Z5e 6e¡ e 6e ¡ dd„ Z7dd„ Z8d(dd„Z9G dd„ de:ƒZde dfdd„Z;ee"ƒG dd„ de:ƒƒZ<e/dfd d!„Z=e:ƒ Z>G d"d#„ d#e:ƒZ?d$d%„ Z@d&d'„ ZAe?e+ƒZBeBjCZCeBjDZDeBjEZEeBjFZFeBjGZGeBjHZHeBjIZIeBjJZJeBjKZKeBjLZLeBjMZMeBjNZNeBjOZOeBjPZPeBjQZQeBjRZReBjSZSeBjTZTejUZUejVZVdS ))é    N)Úpartial©ÚFailure)ÚmaybeDeferredÚDeferredÚDeferredList)ÚsucceedÚfail)ÚIReactorTime)Úprovider)ÚIFailedFutureÚILoggerÚ
log_levels)Úguess_stream_needs_encoding)Ú_Config©Ú_BatchedTimer)Ú_util)ÚLoggerÚformatEventÚILogObserver)ÚglobalLogBeginnerÚ
formatTimeÚLogLevel)ÚensureDeferred)ÚiscoroutinefunctionTFÚinfoc                  O   s   d S ©N© )ÚargsÚkwargsr   r   úNC:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\txaio/tx.pyÚ_no_opL   ó   r"   c                 C   s   t  | ¡ d S r   )Ú_categoriesÚupdate)Ú
categoriesr   r   r!   Úadd_log_categoriesP   ó   r'   c                 C   s,   | d urt jd urt j| urtdƒ‚tt ƒS )Nz�Twisted has only a single, global reactor. You passed in a reactor different from the one already configured in txaio.config.loop)ÚconfigÚloopÚRuntimeErrorÚ_TxApi)r*   r   r   r!   Úwith_configT   s   ÿr-   c                   @   sT   e Zd Zddd„Zddd„Zdd„ Zdd	„ Zddd„Zdd„ Zddd„Z	dd„ Z
dS )r   Nc                 C   sH   |sJ dƒ‚|||d�| _ d| _|r|  |¡ n|  t¡ t | ¡ d S )Nz$Should not be instantiated directly.)ÚobserverÚ	namespaceF)Ú_loggerÚ_log_level_set_explicitlyÚset_log_levelÚ_set_log_levelÚ
_log_levelÚ_loggersÚadd)ÚselfÚlevelÚloggerr/   r.   r   r   r!   Ú__init__f   s   
zLogger.__init__c                 C   s   | S r   r   )r7   ZoselfÚtyper   r   r!   Ú__get__t   s   zLogger.__get__c                 O   sJ   d|v r|d t v rtƒ }t  |d ¡|d< | jj|g|¢R i |¤Ž d S )NZlog_categoryÚformat)r$   ÚtupleÚgetr0   Úemit©r7   r8   r   r    r   r   r!   Ú_log|   s   zLogger._logc                 O   sT   t  | j¡t  |¡k rd S |dkr| j|i |¤ŽS t |¡}| j|g|¢R i |¤ŽS )NÚtrace)r   Úindexr4   Ú_tracer   ÚlookupByNamerB   rA   r   r   r!   r@   …   s   
zLogger.emitTc                 C   s   |   |¡ || _dS )zt
        Set the log level. If keep is True, then it will not change along with
        global log changes.
        N)r3   r1   )r7   r8   Zkeepr   r   r!   r2   �   s   

zLogger.set_log_levelc              	   C   sÒ   t  |¡}tt ƒD ]Z\}}|dkrq	||kr5t| |d ƒ}|tkr$|d u r*t| |tƒ |dkr4t| dtƒ q	t| |d ƒtd fv rc|dkrKt| d| jƒ nt| |t| jt	 
|¡ƒƒ |dkrct| d| jƒ q	|| _d S )NÚnoneÚerrorÚfailurerC   )r   rD   Ú	enumerateÚgetattrr"   ÚsetattrrE   r   rB   r   rF   Ú_failurer4   )r7   r8   Zdesired_indexÚidxÚnameÚcurrentr   r   r!   r3   ˜   s*   
€ÿ€
zLogger._set_log_levelc                 O   s   | j j|g|¢R i |¤ŽS r   )r0   rI   )r7   r=   r   Úkwr   r   r!   rM   ¸   s   zLogger._failurec                 O   s   | j |ddi|¤Ž d S )NZtxaio_traceT)Údebug)r7   r   rQ   r   r   r!   rE   »   s   zLogger._trace)NNNNr   ©T)Ú__name__Ú
__module__Ú__qualname__r:   r<   rB   r@   r2   r3   rM   rE   r   r   r   r!   r   d   s    

	

 r   c                 C   sl   t  ¡ j}d|jv r|jd j}d |j|j¡}n|jd }|j	j
dkr,|d |j	j
 }t| |||d�}|S )Nr7   z{0}.{1}rT   z<module>Ú.)r8   r/   r9   r.   )ÚinspectÚcurrentframeÚf_backÚf_localsÚ	__class__r=   rU   rT   Ú	f_globalsÚf_codeÚco_namer   )r8   r9   r.   ÚcfÚclsr/   r   r   r!   Úmake_loggerÁ   s   


rb   c                   @   sF   e Zd ZdZejejejejej	ej	dœZ
dd„ Zdd„ Zdd„ Zd	S )
Ú_LogObserverzQ
    Internal helper.

    An observer which formats events to a given file.
    )ÚcriticalrH   Úwarnr   rR   rC   c                 C   s   || _ t|ƒ| _d | _d S r   )Ú_filer   Ú_encodeÚ_levels)r7   Úoutr   r   r!   r:   å   s   

z_LogObserver.__init__c                    s4   ˆ j d u rt t¡‰‡ ‡fdd„tD ƒˆ _ |ˆ j v S )Nc                    s,   g | ]}t  |¡ˆkr|d krˆ j| ‘qS )rG   )r   rD   Úto_tx)Ú.0Zlvl©r7   Ztarget_levelr   r!   Ú
<listcomp>î   s    ýýÿz2_LogObserver._acceptable_level.<locals>.<listcomp>)rh   r   rD   r4   )r7   r8   r   rl   r!   Ú_acceptable_levelë   s   

þ
z_LogObserver._acceptable_levelc                 C   s¦   |d d u r&d  t|d ƒt|d ƒtj¡}| jr| d¡}| j |¡ d S d|v rO|  	|d ¡rQd  t|d ƒt
|ƒtj¡}| jrG| d¡}| j |¡ d S d S d S )NZ
log_formatz
{0} {1}{2}Zlog_timeZlog_failureÚutf8Ú	log_level)r=   r   Úfailure_format_tracebackÚosÚlineseprg   Úencoderf   Úwritern   r   )r7   ÚeventÚmsgr   r   r!   Ú__call__õ   s&   

ý

ý
÷z_LogObserver.__call__N)rT   rU   rV   Ú__doc__r   rd   rH   re   r   rR   rj   r:   rn   rx   r   r   r   r!   rc   Ô   s    ú	
rc   c                 C   sb   |t vrtd |d t ¡¡ƒ‚trdS da|attƒ | r!t| ƒag }tr*| 	t¡ t
 |¡ dS )z[
    Start logging to the file-like object in ``out``. By default, this
    is stdout.
    z'Invalid log level '{0}'; valid are: {1}z, NT)r   r+   r=   ÚjoinÚ_started_loggingr4   Úset_global_log_levelrc   Ú	_observerÚappendr   ZbeginLoggingTo)ri   r8   Z
_observersr   r   r!   Ústart_logging  s"   
ÿÿ
r   c                   @   sÂ   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zeed	fd
d„Zdd„ Z	d,dd„Z
dd„ Zdd„ Zdd„ Zd-dd„Zdd„ Zd,dd„Zd,dd„Zd,dd „Zd,d!d"„Zd#d$„ Zd.d&d'„Zd(d)„ Zd*d+„ Zd	S )/r,   c                 C   s
   || _ d S r   )Ú_config)r7   r)   r   r   r!   r:   6  ó   
z_TxApi.__init__c                 C   s6   zd  |jjj| ¡ ¡W S  ty   d  |¡ Y S w )z_
        :param fail: must be an IFailedFuture
        returns a unicode error-message
        z{0}: {1}z+Failed to produce failure message for "{0}"N)r=   Úvaluer\   rT   ZgetErrorMessageÚ	Exception©r7   r	   r   r   r!   Úfailure_message9  s   þÿz_TxApi.failure_messagec                 C   ó   |j S )z\
        :param fail: must be an IFailedFuture
        returns a traceback instance
        N)Útbr„   r   r   r!   Úfailure_tracebackF  s   z_TxApi.failure_tracebackc                 C   s<   zt  ¡ }|j|d� | ¡ W S  ty   d |¡ Y S w )zP
        :param fail: must be an IFailedFuture
        returns a string
        )Úfilez,Failed to format failure traceback for '{0}'N)ÚioÚStringIOZprintTracebackÚgetvaluerƒ   r=   )r7   r	   Úfr   r   r!   rq   M  s   
ÿz_TxApi.failure_format_tracebackNc                 C   sN   |t ur|t urtdƒ‚t|d�}|t urt||ƒ |S |t ur%t||ƒ |S )Nz"Cannot have both result and error.)Ú	canceller)Ú_unspecifiedÚ
ValueErrorr   ÚresolveÚreject)r7   ÚresultrH   rŽ   r�   r   r   r!   Úcreate_futureY  s   

þ
z_TxApi.create_futurec                 C   s   t |ƒS r   )r   )r7   r“   r   r   r!   Úcreate_future_successd  s   z_TxApi.create_future_successc                 C   s   t t|ƒƒS r   )r	   Úcreate_failure)r7   rH   r   r   r!   Úcreate_future_errorg  ó   z_TxApi.create_future_errorc              
   O   s`   t |ƒr%z
t||i |¤ŽƒW S  ty$ } z
t|ƒW  Y d }~S d }~ww t|g|¢R i |¤ŽS r   )r   r   Ú	TypeErrorr—   r   )r7   Úfunr   r    Úer   r   r!   Ú	as_futurej  s   €ÿz_TxApi.as_futurec                 C   s
   t |tƒS r   )Ú
isinstancer   )r7   Úobjr   r   r!   Ú	is_futures  r�   z_TxApi.is_futurec                 O   s"   t |  ¡ ƒj||g|¢R i |¤ŽS r   )r
   Ú	_get_loopÚ	callLater)r7   Údelayrš   r   r    r   r   r!   Ú
call_laterv  s   "z_TxApi.call_lateréd   c                    s,   ‡ fdd„}‡ fdd„}t |d |||d�S )a&  
        Creates and returns an object implementing
        :class:`txaio.IBatchedTimer`.

        :param bucket_seconds: the number of seconds in each bucket. That
            is, a value of 5 means that any timeout within a 5 second
            window will be in the same bucket, and get notified at the
            same time. This is only accurate to "milliseconds".

        :param chunk_size: when "doing" the callbacks in a particular
            bucket, this controls how many we do at once before yielding to
            the reactor.
        c                      s   ˆ   ¡  ¡ S r   )r    Úsecondsr   ©r7   r   r!   Úget_secondsˆ  r˜   z._TxApi.make_batched_timer.<locals>.get_secondsc                    s   ˆ   ¡ j| |g|¢R i |¤ŽS r   )r    r¡   )r¢   rš   r   r    r¦   r   r!   Úcreate_delayed_call‹  s   z6_TxApi.make_batched_timer.<locals>.create_delayed_callg     @�@)Zseconds_providerZdelayed_call_creatorNr   )r7   Zbucket_secondsÚ
chunk_sizer§   r¨   r   r¦   r!   Úmake_batched_timery  s   üz_TxApi.make_batched_timerc                 C   r†   r   )Úcalled)r7   Úfuturer   r   r!   Ú	is_called•  s   z_TxApi.is_calledc                 C   s   |  |¡ d S r   )Úcallback)r7   r¬   r“   r   r   r!   r‘   ˜  r(   z_TxApi.resolvec                 C   sD   |d u rt ƒ }nt|tƒrt|ƒ}n	t|tƒstdƒ‚| |¡ d S )Nz&reject requires a Failure or Exception)r–   r�   rƒ   r   r+   Úerrback)r7   r¬   rH   r   r   r!   r’   ›  s   


z_TxApi.rejectc                 C   s   |  ¡  d S r   )Úcancel)r7   r¬   rw   r   r   r!   r°   ¥  r˜   z_TxApi.cancelc                 C   s   |rt |ƒS t ƒ S )zß
        Create a Failure instance.

        if ``exception`` is None (the default), we MUST be inside an
        "except" block. This encapsulates the exception into an object
        that implements IFailedFuture
        Nr   )r7   Ú	exceptionr   r   r!   r–   ¨  s   z_TxApi.create_failurec                 C   s>   |dusJ ‚|du r|dusJ ‚|  |¡ |S | ||¡ |S )z]
        callback or errback may be None, but at least one must be
        non-None.
        N)Z
addErrbackZaddCallbacks)r7   r¬   r®   r¯   r   r   r!   Úadd_callbacks´  s   
ÿz_TxApi.add_callbacksTc                    s,   ‡ fdd„}t t|ƒˆ d�}t||d ƒ |S )Nc                    s0   g }| D ]\}}|  |¡ |sˆ s| ¡  q|S r   )r~   ZraiseException)ÚresZrtnÚokr‚   ©Úconsume_exceptionsr   r!   Ú	completedÃ  s   
€z _TxApi.gather.<locals>.completed)ZconsumeErrors)r   Úlistr²   )r7   Úfuturesr¶   r·   Údlr   rµ   r!   ÚgatherÂ  s   z_TxApi.gatherc                 C   s   t ƒ }|  ¡  ||jd¡ |S )z‚
        Inline sleep for use in co-routines.

        :param delay: Time to sleep in seconds.
        :type delay: float
        N)r   r    r¡   r®   )r7   r¢   Údr   r   r!   Úsleep×  s   z_TxApi.sleepc                 C   s(   | j jdu rddlm} || j _| j jS )z!
        internal helper
        Nr   )Úreactor)r€   r*   Ztwisted.internetr¾   )r7   r¾   r   r   r!   r    â  s   z_TxApi._get_loopr   )r¤   rS   )rT   rU   rV   r:   r…   rˆ   rq   r�   r”   r•   r—   rœ   rŸ   r£   rª   r­   r‘   r’   r°   r–   r²   r»   r½   r    r   r   r   r!   r,   4  s*    
	






r,   c                 C   s"   t D ]
}|js| | ¡ q| adS )zH
    Set the global log level on all loggers instantiated by txaio.
    N)r5   r1   r3   r4   )r8   Úitemr   r   r!   r|   ð  s
   
€r|   c                   C   s   t S r   )r4   r   r   r   r!   Úget_global_log_levelû  r#   rÀ   r   )WrŠ   rr   ÚsysÚweakrefrX   Ú	functoolsr   Ztwisted.python.failurer   Ztwisted.internet.deferr   r   r   r   r	   Ztwisted.internet.interfacesr
   Zzope.interfacer   Ztxaio.interfacesr   r   r   Ztxaio._iotyper   Ztxaior   Ztxaio._commonr   r   Ztwisted.loggerr   Z_Loggerr   r   r   r   r   r   Úasyncior   Zusing_twistedZusing_asyncior)   ÚstderrÚstdoutÚ_stderrZ_stdoutr}   ÚWeakSetr5   r4   r{   r$   Úregisterr"   r'   r-   Úobjectrb   rc   r   r�   r,   r|   rÀ   Z_default_apir…   rˆ   rq   r”   r•   r—   rœ   rŸ   r£   rª   r­   r‘   r’   r°   r–   r²   r»   r½   Útime_nsÚperf_counter_nsr   r   r   r!   Ú<module>   s‚   


]= =
