U
    ¼~Hj�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ƒ a+ej,ej- Z.Z/da0e 1¡ a2d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?t+ƒ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   ú,/tmp/pip-unpacked-wheel-a0uj37kx/txaio/tx.pyÚ_no_opL   s    r"   c                 C   s   t  | ¡ d S r   )Ú_categoriesÚupdate)Ú
categoriesr   r   r!   Úadd_log_categoriesP   s    r&   c                 C   s,   | d k	r$t jd k	r$t j| k	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t dƒ‚|||d�| _d| _|r0|  |¡ n
|  t¡ t | ¡ d S )Nz$Should not be instantiated directly.)ÚobserverÚ	namespaceF)ÚAssertionErrorÚ_loggerÚ_log_level_set_explicitlyÚset_log_levelÚ_set_log_levelÚ
_log_levelÚ_loggersÚadd)ÚselfÚlevelÚloggerr-   r,   r   r   r!   Ú__init__g   s    
zLogger.__init__c                 C   s   | S r   r   )r6   ZoselfÚtyper   r   r!   Ú__get__u   s    zLogger.__get__c                 O   sD   d|kr,|d t kr,tƒ }t  |d ¡|d< | jj|f|ž|Ž d S )NZlog_categoryÚformat)r#   ÚtupleÚgetr/   Úemit©r6   r7   r   r    r   r   r!   Ú_log}   s    zLogger._logc                 O   sJ   t  | j¡t  |¡k rd S |dkr.| j||ŽS t |¡}| j|f|ž|ŽS )NÚtrace)r   Úindexr3   Ú_tracer   ÚlookupByNamerA   r@   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)r2   r0   )r6   r7   Zkeepr   r   r!   r1   ‘   s    
zLogger.set_log_levelc              	   C   sÒ   t  |¡}tt ƒD ]´\}}|dkr$q||krjt| |d ƒ}|tkrH|d krTt| |tƒ |dkrÆt| dtƒ qt| |d ƒtd fkr|dkr–t| d| jƒ nt| |t| jt	 
|¡ƒƒ |dkrt| d| jƒ q|| _d S )NÚnoneÚerrorÚfailurerB   )r   rC   Ú	enumerateÚgetattrr"   ÚsetattrrD   r   rA   r   rE   Ú_failurer3   )r6   r7   Zdesired_indexÚidxÚnameÚcurrentr   r   r!   r2   ™   s&    
ÿzLogger._set_log_levelc                 O   s   | j j|f|ž|ŽS r   )r/   rH   )r6   r<   r   Úkwr   r   r!   rL   ¸   s    zLogger._failurec                 O   s   | j |ddi|—Ž d S )NZtxaio_traceT)Údebug)r6   r   rP   r   r   r!   rD   »   s    zLogger._trace)NNNN)N)T)N)Ú__name__Ú
__module__Ú__qualname__r9   r;   rA   r?   r1   r2   rL   rD   r   r   r   r!   r   e   s   

	

r   c                 C   sl   t  ¡ j}d|jkr2|jd j}d |j|j¡}n&|jd }|j	j
dkrX|d |j	j
 }t| |||d�}|S )Nr6   z{0}.{1}rR   z<module>Ú.)r7   r-   r8   r,   )ÚinspectÚcurrentframeÚf_backÚf_localsÚ	__class__r<   rS   rR   Ú	f_globalsÚf_codeÚco_namer   )r7   r8   r,   ÚcfÚclsr-   r   r   r!   Úmake_loggerÁ   s    


ÿr`   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.
    )ÚcriticalrG   Úwarnr   rQ   rB   c                 C   s   || _ t|ƒ| _d | _d S r   )Ú_filer   Ú_encodeÚ_levels)r6   Úoutr   r   r!   r9   å   s    
z_LogObserver.__init__c                    s4   ˆ j d kr*t t¡‰‡ ‡fdd„tD ƒˆ _ |ˆ j kS )Nc                    s,   g | ]$}t  |¡ˆkr|d krˆ j| ‘qS )rF   )r   rC   Úto_tx)Ú.0Zlvl©r6   Ztarget_levelr   r!   Ú
<listcomp>î   s    þz2_LogObserver._acceptable_level.<locals>.<listcomp>)rf   r   rC   r3   )r6   r7   r   rj   r!   Ú_acceptable_levelë   s    

þz_LogObserver._acceptable_levelc                 C   sœ   |d d krJd  t|d ƒt|d ƒtj¡}| jr<| d¡}| j |¡ nNd|kr˜|  	|d ¡r˜d  t|d ƒt
|ƒtj¡}| jrŒ| d¡}| j |¡ d S )NZ
log_formatz
{0} {1}{2}Zlog_timeZlog_failureÚutf8Z	log_level)r<   r   Úfailure_format_tracebackÚosÚlinesepre   Úencoderd   Úwriterl   r   )r6   ÚeventÚmsgr   r   r!   Ú__call__õ   s$    

ý

ý
z_LogObserver.__call__N)rR   rS   rT   Ú__doc__r   rb   rG   rc   r   rQ   rh   r9   rl   ru   r   r   r   r!   ra   Õ   s   ú	
ra   c                 C   sb   |t krtd |d t ¡¡ƒ‚tr&dS da|attƒ | rBt| ƒag }trT| 	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_loggingr3   Úset_global_log_levelra   Ú	_observerÚappendr   ZbeginLoggingTo)rg   r7   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d0dd „Zd1d!d"„Zd#d$„ Zd2d&d'„Zd(d)„ Zd*d+„ Zd	S )3r*   c                 C   s
   || _ d S r   )Ú_config)r6   r'   r   r   r!   r9   6  s    z_TxApi.__init__c                 C   s<   zd  |jjj| ¡ ¡W S  tk
r6   d  |¡ Y S X dS )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<   ÚvaluerZ   rR   ZgetErrorMessageÚ	Exception©r6   r	   r   r   r!   Úfailure_message9  s    þz_TxApi.failure_messagec                 C   s   |j S )z\
        :param fail: must be an IFailedFuture
        returns a traceback instance
        )Útbr€   r   r   r!   Úfailure_tracebackF  s    z_TxApi.failure_tracebackc                 C   sB   zt  ¡ }|j|d� | ¡ W S  tk
r<   d |¡ Y S X dS )zP
        :param fail: must be an IFailedFuture
        returns a string
        )Úfilez,Failed to format failure traceback for '{0}'N)ÚioÚStringIOZprintTracebackÚgetvaluer   r<   )r6   r	   Úfr   r   r!   rn   M  s    
z_TxApi.failure_format_tracebackNc                 C   sL   |t k	r|t k	rtdƒ‚t|d�}|t k	r6t||ƒ n|t k	rHt||ƒ |S )Nz"Cannot have both result and error.)Ú	canceller)Ú_unspecifiedÚ
ValueErrorr   ÚresolveÚreject)r6   ÚresultrG   r‰   rˆ   r   r   r!   Úcreate_futureY  s    

z_TxApi.create_futurec                 C   s   t |ƒS r   )r   )r6   rŽ   r   r   r!   Úcreate_future_successd  s    z_TxApi.create_future_successc                 C   s   t t|ƒƒS r   )r	   Úcreate_failure)r6   rG   r   r   r!   Úcreate_future_errorg  s    z_TxApi.create_future_errorc              
   O   sX   t |ƒrHzt|||ŽƒW S  tk
rF } zt|ƒ W Y ¢S d }~X Y nX t|f|ž|ŽS r   )r   r   Ú	TypeErrorr’   r   )r6   Úfunr   r    Úer   r   r!   Ú	as_futurej  s    z_TxApi.as_futurec                 C   s
   t |tƒS r   )Ú
isinstancer   )r6   Úobjr   r   r!   Ú	is_futures  s    z_TxApi.is_futurec                 O   s   t |  ¡ ƒj||f|ž|ŽS r   )r
   Ú	_get_loopÚ	callLater)r6   Ú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   ©r6   r   r!   Úget_secondsˆ  s    z._TxApi.make_batched_timer.<locals>.get_secondsc                    s   ˆ   ¡ j| |f|ž|Ž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_creatorr   )r6   Zbucket_secondsÚ
chunk_sizer¡   r¢   r   r    r!   Úmake_batched_timery  s     ýz_TxApi.make_batched_timerc                 C   s   |j S r   )Úcalled)r6   Úfuturer   r   r!   Ú	is_called”  s    z_TxApi.is_calledc                 C   s   |  |¡ d S r   )Úcallback)r6   r¦   rŽ   r   r   r!   rŒ   —  s    z_TxApi.resolvec                 C   sD   |d krt ƒ }n&t|tƒr$t|ƒ}nt|tƒs6tdƒ‚| |¡ d S )Nz&reject requires a Failure or Exception)r‘   r—   r   r   r)   Úerrback)r6   r¦   rG   r   r   r!   r�   š  s    


z_TxApi.rejectc                 C   s   |  ¡  d S r   )Úcancel)r6   r¦   rt   r   r   r!   rª   ¤  s    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
        r   )r6   Ú	exceptionr   r   r!   r‘   §  s    z_TxApi.create_failurec                 C   s<   |dk	st ‚|dkr,|dk	s t ‚| |¡ n| ||¡ |S )z]
        callback or errback may be None, but at least one must be
        non-None.
        N)r.   Z
addErrbackZaddCallbacks)r6   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¬   )r6   Z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¨   )r6   rœ   Údr   r   r!   ÚsleepÖ  s    z_TxApi.sleepc                 C   s(   | j jdkr ddlm} || j _| j jS )z!
        internal helper
        Nr   )Úreactor)r}   r(   Ztwisted.internetr·   )r6   r·   r   r   r!   rš   á  s    z_TxApi._get_loop)N)rž   )N)N)N)N)T)rR   rS   rT   r9   r�   rƒ   rn   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)r4   r0   r2   r3   )r7   Úitemr   r   r!   ry   î  s    ry   c                   C   s   t S r   )r3   r   r   r   r!   Úget_global_log_levelù  s    r¹   )N)Wr…   ro   ÚsysÚweakrefrV   Ú	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   Zasyncior   Zusing_twistedZusing_asyncior'   ÚstderrÚstdoutÚ_stderrZ_stdoutrz   ÚWeakSetr4   r3   rx   r#   Úregisterr"   r&   r+   Úobjectr`   ra   r|   rŠ   r*   ry   r¹   Z_default_apir�   rƒ   rn   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€   


\< ;