o
    Œõ±j>  ã                   @   s    d Z ddlZddlZddlmZ zddlmZmZmZm	Z	 W n	 e
y'   Y nw ddlmZ G dd„ dejƒZd	d
„ Zdd„ Zedefdd„ƒZedd„ ƒZdS )zB
Helper functionality for interoperability with stdlib `logging`.
é    N)Úcontextmanager)ÚIteratorÚListÚOptionalÚTypeé   )Útqdmc                       s(   e Zd Zef‡ fdd„	Zdd„ Z‡  ZS )Ú_TqdmLoggingHandlerc                    s   t ƒ  ¡  || _d S ©N)ÚsuperÚ__init__Ú
tqdm_class)Úselfr   ©Ú	__class__© ú‡/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/tqdm/contrib/logging.pyr      s   

z_TqdmLoggingHandler.__init__c              	   C   sT   z|   |¡}| jj|| jd� |  ¡  W d S  ttfy   ‚    |  |¡ Y d S )N)Úfile)Úformatr   ÚwriteÚstreamÚflushÚKeyboardInterruptÚ
SystemExitÚhandleError)r   ÚrecordÚmsgr   r   r   Úemit   s   
z_TqdmLoggingHandler.emit)Ú__name__Ú
__module__Ú__qualname__Ústd_tqdmr   r   Ú__classcell__r   r   r   r   r	      s    þr	   c                 C   s   t | tjƒo| jtjtjhv S r
   )Ú
isinstanceÚloggingÚStreamHandlerr   ÚsysÚstdoutÚstderr)Úhandlerr   r   r   Ú_is_console_logging_handler#   s   ÿr*   c                 C   s   | D ]
}t |ƒr|  S qd S r
   ©r*   )Úhandlersr)   r   r   r   Ú(_get_first_found_console_logging_handler(   s
   ÿÿr-   c              	   c   sÊ   � | du r	t jg} dd„ | D ƒ}zF| D ]0}t|ƒ}t|jƒ}|dur7| |j¡ |j|_|jD ]}| 	|¡ q/dd„ |jD ƒ|g |_qdV  W t
| |ƒD ]\}}||_qMdS t
| |ƒD ]\}}||_q\w )aõ  
    Context manager redirecting console logging to `tqdm.write()`, leaving
    other logging handlers (e.g. log files) unaffected.

    Parameters
    ----------
    loggers  : list, optional
      Which handlers to redirect (default: [logging.root]).
    tqdm_class  : optional

    Example
    -------
    ```python
    import logging
    from tqdm import trange
    from tqdm.contrib.logging import logging_redirect_tqdm

    LOG = logging.getLogger(__name__)

    if __name__ == '__main__':
        logging.basicConfig(level=logging.INFO)
        with logging_redirect_tqdm():
            for i in trange(9):
                if i == 4:
                    LOG.info("console logging redirected to `tqdm.write()`")
        # logging restored
    ```
    Nc                 S   s   g | ]}|j ‘qS r   )r,   )Ú.0Úloggerr   r   r   Ú
<listcomp>R   s    z)logging_redirect_tqdm.<locals>.<listcomp>c                 S   s   g | ]}t |ƒs|‘qS r   r+   )r.   r)   r   r   r   r0   \   s    þÿ)r$   Úrootr	   r-   r,   ÚsetFormatterÚ	formatterr   ÚfiltersÚ	addFilterÚzip)Úloggersr   Úoriginal_handlers_listr/   Útqdm_handlerÚorig_handlerÚ
log_filterÚoriginal_handlersr   r   r   Úlogging_redirect_tqdm.   s0   €"

ÿþÿÿr=   c               	   o   s˜   � |  ¡ }| dd¡}| dt¡}|| i |¤Ž�*}t||d�� |V  W d  ƒ n1 s-w   Y  W d  ƒ dS W d  ƒ dS 1 sEw   Y  dS )ap  
    Convenience shortcut for:
    ```python
    with tqdm_class(*args, **tqdm_kwargs) as pbar:
        with logging_redirect_tqdm(loggers=loggers, tqdm_class=tqdm_class):
            yield pbar
    ```

    Parameters
    ----------
    tqdm_class  : optional, (default: tqdm.std.tqdm).
    loggers  : optional, list.
    **tqdm_kwargs  : passed to `tqdm_class`.
    r7   Nr   )r7   r   )ÚcopyÚpopr!   r=   )ÚargsÚkwargsÚtqdm_kwargsr7   r   Úpbarr   r   r   Útqdm_logging_redirecte   s   €ÿÿ"ÿrD   )Ú__doc__r$   r&   Ú
contextlibr   Útypingr   r   r   r   ÚImportErrorÚstdr   r!   r%   r	   r*   r-   r=   rD   r   r   r   r   Ú<module>   s&    ÿþ6