B
    lz]#                 @   sX  d dl mZmZmZmZ d dlm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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 eeZd
ZeeeefZejd  dkrdd Zndd ZG dd de
Z G dd deZ!edd Z"dd Z#e	fddZ$efddZ%efddZ&dd Z'dd Z(e)ed  e(ej*_(ej*j+ej*_,dS )!    )absolute_importdivisionprint_functionunicode_literals)partialN)DEBUGERRORFilter	FormatterINFOStreamHandlerWARN	getLogger   )
CondaError)memoize)attach_stderr_handler)string_types   c             C   s$   t | tr t | ts t| ddS | S )Nzutf-8)encoding)
isinstanceZ
basestringunicode)val r   5lib/python3.7/site-packages/conda/gateways/logging.pyanother_to_unicode   s    r   c             C   s   | S )Nr   )r   r   r   r   r      s    c               @   s*   e Zd ZedZeejdZdd Z	dS )TokenURLFilterz(|https?://)(|\s|(?:(?:\d{1,3}\.){3}\d{1,3})|(?:(?:[a-zA-Z0-9-]{1,20}\.){0,10}(?:[a-zA-Z]{2}[a-zA-Z0-9-]{0,18})))(|:\d{1,5})?/t/[a-z0-9A-Z-]+/z\1\2\3/t/<TOKEN>/c                sF   t  |j|_|jrBt fdd|jD }|j| |_d|_dS )a>  
        Since Python 2's getMessage() is incapable of handling any
        strings that are not unicode when it interpolates the message
        with the arguments, we fix that here by doing it ourselves.

        At the same time we replace tokens in the arguments which was
        not happening until now.
        c             3   s*   | ]"}t |tr t|n|V  qd S )N)r   r   TOKEN_REPLACEr   ).0arg)selfr   r   	<genexpr>9   s   z(TokenURLFilter.filter.<locals>.<genexpr>NT)r   r   msgargstuple)r    recordZnew_argsr   )r    r   filter-   s    
zTokenURLFilter.filterN)
__name__
__module____qualname__recompileZTOKEN_URL_PATTERNr   subr   r&   r   r   r   r   r      s   
r   c                   s8   e Zd ZdZdZ fddZ fddZdd Z  ZS )	StdStreamHandlerz?Log StreamHandler that always writes to the current sys stream.
c                s$   t t| tt| || _| `dS )zr
        Args:
            sys_stream: stream name, either "stdout" or "stderr" (attribute of module sys)
        N)superr-   __init__getattrsys
sys_streamstream)r    r3   )	__class__r   r   r0   F   s    zStdStreamHandler.__init__c                s$   |dkrt t| jS tt| |S )Nr4   )r1   r2   r3   r/   r-   __getattribute__)r    attr)r5   r   r   __getattr__O   s    zStdStreamHandler.__getattr__c          	   C   s.  yt  d}W n tk
r$   d}Y nX y| |}| j}d}|sP|||  nylt|t rt|ddrd}y|||  W q tk
r   ||| |j	 Y qX n|||  W n( t
k
r   |||d  Y nX t|d| j}|| |   W n  tk
r(   | | Y nX dS )a  
        Emit a record.

        If a formatter is specified, it is used to format the record.
        The record is then written to the stream with a trailing newline.  If
        exception information is present, it is formatted using
        traceback.print_exception and appended to the stream.  If the stream
        has an 'encoding' attribute, it is used to determine how to do the
        output to the stream.
        TFz%sr   NzUTF-8
terminator)r   	NameErrorformatr4   writer   r1   UnicodeEncodeErrorencoder   UnicodeErrorr9   flush	ExceptionZhandleError)r    r%   Z_unicoder"   r4   ZfsZufsr9   r   r   r   emith   s6    



zStdStreamHandler.emit)	r'   r(   r)   __doc__r9   r0   r8   rB   __classcell__r   r   )r5   r   r-   A   s
   	r-   c               C   s   t   t  t  d S )N)initialize_root_loggerset_conda_log_levelinitialize_std_loggersr   r   r   r   initialize_logging   s    rH   c              C   s   t d} xdD ]}td| }g |_|t t|}|t ||  || |t	  d|_
td| }g |_|t t|}d|_|t ||  || d|_
qW td}g |_|t td}|t ||  || d|_
d S )	Nz%(message)s)stdoutstderrzconda.%sFzconda.%slog zconda.stdout.verboserI   )r
   r   ZhandlerssetLevelr   r-   ZsetFormatterZ
addHandlerZ	addFilterr   	propagater   r9   )	formatterr4   ZloggerZhandlerZstdlog_loggerZstdlog_handlerZverbose_loggerZverbose_handlerr   r   r   rG      s8    













rG   c             C   s   t |  d S )N)r   )levelr   r   r   rE      s    rE   c             C   s   t d}||  d|_d S )NZcondaT)r   rL   rM   )rO   Zconda_loggerr   r   r   rF      s    
rF   c             C   s@   | t krtdnd }t| |d t|  t| d t| d d S )Nz%(message)s
)rN   Zrequestszrequests.packages.urllib3)r   r
   r   rF   )rO   rN   r   r   r   set_all_logger_level   s
    
rP   c             C   sB   yt t|   W n  tk
r0   td| dY nX td|  d S )Nz,Invalid verbosity level: %(verbosity_level)s)verbosity_levelzverbosity set to %s)rP   VERBOSITY_LEVELS
IndexErrorr   logdebug)rQ   r   r   r   set_verbosity   s    rV   c             O   s    |  tr| jt||f| d S )N)ZisEnabledForTRACEZ_log)r    messager#   kwargsr   r   r   trace   s    
rZ   rW   )-Z
__future__r   r   r   r   	functoolsr   Zloggingr   r   r	   r
   r   r   r   r   r*   r2   rK   r   Z_vendor.auxlib.decoratorsr   Z	common.ior   Zcommon.compatr   r'   rT   rW   rR   version_infor   r   r-   rH   rG   rE   rF   rP   rV   rZ   ZaddLevelNameZLoggerZwarningwarnr   r   r   r   <module>   s6   (
"`$
	