U
    KQh8Z                     @   s   d dl mZ d dlZd dlZd dlZd dlZd dlmZ e	dej
Zdd Zzd dlmZ W n ek
rz   dd	 ZY nX G d
d deZG dd deZG dd deZG dd deZG dd deZeZdd ZdS )    )absolute_importN)sixz^[a-z_][a-z0-9_]*$c                 C   s   t | }|std|  dS )Nz!Not a valid Python identifier: %rT)
IDENTIFIERmatch
ValueError)sm r	   4/tmp/pip-build-tlro1kwj/pip/pip/compat/dictconfig.pyvalid_ident"   s    
r   )_checkLevelc                 C   sN   t | tr| }n:t| | kr>| tjkr2td|  tj|  }ntd|  |S )NzUnknown level: %rz*Level not an integer or a valid string: %r)
isinstanceintstrloggingZ_levelNamesr   	TypeError)levelrvr	   r	   r
   r   .   s    

r   c                   @   s,   e Zd ZdZdd Zd	ddZd
ddZdS )ConvertingDictz A converting dictionary wrapper.c                 C   sJ   t | |}| j|}||k	rF|| |< t|tttfkrF| |_||_	|S N)
dict__getitem__configuratorconverttyper   ConvertingListConvertingTupleparentkeyselfr   valueresultr	   r	   r
   r   G   s    
zConvertingDict.__getitem__Nc                 C   sL   t | ||}| j|}||k	rH|| |< t|tttfkrH| |_||_	|S r   )
r   getr   r   r   r   r   r   r   r   r    r   defaultr!   r"   r	   r	   r
   r#   S   s    
zConvertingDict.getc                 C   sD   t | ||}| j|}||k	r@t|tttfkr@| |_||_	|S r   )
r   popr   r   r   r   r   r   r   r   r$   r	   r	   r
   r&   _   s    
zConvertingDict.pop)N)N)__name__
__module____qualname____doc__r   r#   r&   r	   r	   r	   r
   r   D   s   
r   c                   @   s"   e Zd ZdZdd ZdddZdS )	r   zA converting list wrapper.c                 C   sJ   t | |}| j|}||k	rF|| |< t|tttfkrF| |_||_	|S r   )
listr   r   r   r   r   r   r   r   r   r   r	   r	   r
   r   l   s    
zConvertingList.__getitem__c                 C   s<   t | |}| j|}||k	r8t|tttfkr8| |_|S r   )	r+   r&   r   r   r   r   r   r   r   )r    idxr!   r"   r	   r	   r
   r&   x   s    
zConvertingList.popN)r,   )r'   r(   r)   r*   r   r&   r	   r	   r	   r
   r   j   s   r   c                   @   s   e Zd ZdZdd ZdS )r   zA converting tuple wrapper.c                 C   sB   t | |}| j|}||k	r>t|tttfkr>| |_||_	|S r   )
tupler   r   r   r   r   r   r   r   r   r   r	   r	   r
   r      s    
zConvertingTuple.__getitem__N)r'   r(   r)   r*   r   r	   r	   r	   r
   r      s   r   c                   @   s   e Zd ZdZedZedZedZedZ	edZ
ddd	ZeZd
d Zdd Zdd Zdd Zdd Zdd Zdd ZdS )BaseConfiguratorzI
    The configurator base class which defines some useful defaults.
    z%^(?P<prefix>[a-z]+)://(?P<suffix>.*)$z^\s*(\w+)\s*z^\.\s*(\w+)\s*z^\[\s*(\w+)\s*\]\s*z^\d+$ext_convertcfg_convert)extcfgc                 C   s   t || _| | j_d S r   )r   configr   )r    r4   r	   r	   r
   __init__   s    
zBaseConfigurator.__init__c           	   	   C   s   | d}|d}z^| |}|D ]H}|d| 7 }zt||}W q$ tk
rj   | | t||}Y q$X q$|W S  tk
r   t dd \}}td||f }|| |_	|_
|Y nX dS )z`
        Resolve strings to objects using standard import and attribute
        syntax.
        .r      NzCannot resolve %r: %s)splitr&   importergetattrAttributeErrorImportErrorsysexc_infor   	__cause____traceback__)	r    r   nameusedfoundfragetbvr	   r	   r
   resolve   s"    



zBaseConfigurator.resolvec                 C   s
   |  |S )z*Default converter for the ext:// protocol.)rH   r    r!   r	   r	   r
   r0      s    zBaseConfigurator.ext_convertc                 C   s   |}| j |}|dkr&td| n|| d }| j| d  }|r| j|}|rn|| d  }nd| j|}|r| d }| j|s|| }n2zt	|}|| }W n t
k
r   || }Y nX |r|| d }qHtd||f qH|S )z*Default converter for the cfg:// protocol.NzUnable to convert %rr   zUnable to convert %r at %r)WORD_PATTERNr   r   endr4   groupsDOT_PATTERNINDEX_PATTERNDIGIT_PATTERNr   r   )r    r!   restr   dr-   nr	   r	   r
   r1      s4    
zBaseConfigurator.cfg_convertc                 C   s   t |ts$t |tr$t|}| |_nt |tsHt |trHt|}| |_n|t |tslt |trlt|}| |_nXt |tj	r| j
|}|r| }|d }| j|d}|r|d }t| |}||}|S )z
        Convert values to an appropriate type. dicts, lists and tuples are
        replaced by their converting alternatives. Strings are checked to
        see if they have a conversion format and are converted if they do.
        prefixNsuffix)r   r   r   r   r   r+   r   r.   r   string_typesCONVERT_PATTERNr   	groupdictvalue_convertersr#   r:   )r    r!   r   rQ   rS   	converterrT   r	   r	   r
   r      s,    

zBaseConfigurator.convertc                    s     d}t|ds6ttdr6t|tjkr6| |}  dd}t fdd D }|f |}|r| D ]\}}t||| qn|S )z1Configure an object with a user-supplied factory.()__call__	ClassTyper6   Nc                 3   s"   | ]}t |r| | fV  qd S r   r   .0kr4   r	   r
   	<genexpr>  s      z4BaseConfigurator.configure_custom.<locals>.<genexpr>)	r&   hasattrtypesr   r\   rH   r   itemssetattr)r    r4   cpropskwargsr"   rA   r!   r	   ra   r
   configure_custom   s    
"

z!BaseConfigurator.configure_customc                 C   s   t |trt|}|S )z0Utility function which converts lists to tuples.)r   r+   r.   rI   r	   r	   r
   as_tuple  s    
zBaseConfigurator.as_tupleN)r'   r(   r)   r*   recompilerV   rJ   rM   rN   rO   rX   
__import__r9   r5   rH   r0   r1   r   rj   rk   r	   r	   r	   r
   r/      s"   




"r/   c                   @   s^   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dddZ
dddZdddZdS )DictConfiguratorz]
    Configure logging using a dictionary-like object to describe the
    configuration.
    c                 C   s  | j }d|krtd|d dkr2td|d  |dd}i }t  zX|r|d|}tjdd	 d
kr|D ]}|tj	krtd| qvz4tj	| }|| }|dd}|r|
t| W qv tk
r }	 ztd||	f W 5 d}	~	X Y qvX qv|d|}
|
D ]R}z| ||
| d W n4 tk
rZ }	 ztd||	f W 5 d}	~	X Y nX q|dd}|rz| |d W n0 tk
r }	 ztd|	 W 5 d}	~	X Y nX n|dd}tj	  tjdd= |d|}|D ]R}z| || ||< W n4 tk
r8 }	 ztd||	f W 5 d}	~	X Y nX q|d|}|D ]R}z| || ||< W n4 tk
r }	 ztd||	f W 5 d}	~	X Y nX qN|d|}t|D ]\}z | || }||_|||< W n4 tk
r }	 ztd||	f W 5 d}	~	X Y nX qtj}t|jj}|  g }|d|}
|
D ]}||kr||}|d }t|}t|}|d }||k r|| d| |kr|||  |d }qz|| z| ||
|  W n4 tk
r }	 ztd||	f W 5 d}	~	X Y nX qB|D ]>}|jj| }||kr@tj|_ g |_!d|_"n|rd|_#q|dd}|rz| | W n0 tk
r }	 ztd|	 W 5 d}	~	X Y nX W 5 t  X dS )zDo the configuration.versionz$dictionary doesn't specify a versionr7   zUnsupported version: %sincrementalFhandlersN   )rs      zNo handler found with name %rr   z"Unable to configure handler %r: %sloggersTz!Unable to configure logger %r: %srootz#Unable to configure root logger: %sdisable_existing_loggers
formattersz$Unable to configure formatter %r: %sfiltersz!Unable to configure filter %r: %sr6   )$r4   r   r&   r   _acquireLock_releaseLockr#   r=   version_info	_handlerssetLevelr   StandardErrorconfigure_loggerconfigure_rootclear_handlerListconfigure_formatterconfigure_filtersortedconfigure_handlerrA   rv   r+   manager
loggerDictsortindexlenappendremoveNOTSETr   rr   	propagatedisabled)r    r4   rq   
EMPTY_DICTrr   rA   handlerhandler_configr   rE   ru   rv   disable_existingrx   ry   existingchild_loggersiprefixedpflennum_existinglogloggerr	   r	   r
   	configure  s    








zDictConfigurator.configurec              
   C   s   d|krr|d }z|  |}W q tk
rn } z2dt|kr> |d|d< ||d< |  |}W 5 d}~X Y qX n$|dd}|dd}t||}|S )z(Configure a formatter from a dictionary.rZ   z'format'formatfmtNdatefmt)rj   r   r   r&   r#   r   	Formatter)r    r4   factoryr"   ter   dfmtr	   r	   r
   r     s    z$DictConfigurator.configure_formatterc                 C   s.   d|kr|  |}n|dd}t|}|S )z%Configure a filter from a dictionary.rZ   rA    )rj   r#   r   Filter)r    r4   r"   rA   r	   r	   r
   r     s
    
z!DictConfigurator.configure_filterc                 C   sZ   |D ]P}z| | jd |  W q tk
rR } ztd||f W 5 d}~X Y qX qdS )z/Add filters to a filterer from a list of names.ry   zUnable to add filter %r: %sN)	addFilterr4   r   r   )r    filtererry   frE   r	   r	   r
   add_filters  s
    zDictConfigurator.add_filtersc              
      s@    dd}|rVz| jd | }W n2 tk
rT } ztd||f W 5 d}~X Y nX   dd}  dd}d kr  d}t|dsttd	rt|tjkr| |}|}n|   d
}t	|t
jjr2d kr2z| jd  d   d< W n8 tk
r. } ztd d |f W 5 d}~X Y nX nZt	|t
jjr`d kr`|  d  d< n,t	|t
jjrd kr|  d  d< |}t fdd D }	z|f |	}
W nL tk
r  } z,dt|kr؂ |	 d|	d< |f |	}
W 5 d}~X Y nX |r|
| |dk	r*|
t| |r<| |
| |
S )z&Configure a handler from a dictionary.	formatterNrx   zUnable to set formatter %r: %sr   ry   rZ   r[   r\   classtargetrr   z#Unable to set target handler %r: %smailhostaddressc                 3   s"   | ]}t |r| | fV  qd S r   r]   r^   ra   r	   r
   rb     s      z5DictConfigurator.configure_handler.<locals>.<genexpr>z'stream'streamstrm)r&   r4   r   r   rc   rd   r   r\   rH   
issubclassr   rr   MemoryHandlerSMTPHandlerrk   SysLogHandlerr   r   r   setFormatterr~   r   r   )r    r4   r   rE   r   ry   rg   r   klassri   r"   r   r	   ra   r
   r     sb    
"



z"DictConfigurator.configure_handlerc                 C   sZ   |D ]P}z| | jd |  W q tk
rR } ztd||f W 5 d}~X Y qX qdS )z.Add handlers to a logger from a list of names.rr   zUnable to add handler %r: %sN)
addHandlerr4   r   r   )r    r   rr   hrE   r	   r	   r
   add_handlers	  s
    zDictConfigurator.add_handlersFc                 C   s   | dd}|dk	r"|t| |s||jdd D ]}|| q4| dd}|r`| || | dd}|r|| || dS )zU
        Perform configuration which is common to root and non-root loggers.
        r   Nrr   ry   )r#   r~   r   rr   removeHandlerr   r   )r    r   r4   rq   r   r   rr   ry   r	   r	   r
   common_logger_config  s    z%DictConfigurator.common_logger_configc                 C   s6   t |}| ||| |dd}|dk	r2||_dS )z.Configure a non-root logger from a dictionary.r   N)r   	getLoggerr   r#   r   )r    rA   r4   rq   r   r   r	   r	   r
   r   #  s
    
z!DictConfigurator.configure_loggerc                 C   s   t  }| ||| dS )z*Configure a root logger from a dictionary.N)r   r   r   )r    r4   rq   rv   r	   r	   r
   r   +  s    zDictConfigurator.configure_rootN)F)F)F)r'   r(   r)   r*   r   r   r   r   r   r   r   r   r   r	   r	   r	   r
   ro     s    	5

ro   c                 C   s   t |   dS )z%Configure logging using a dictionary.N)dictConfigClassr   ra   r	   r	   r
   
dictConfig3  s    r   )
__future__r   logging.handlersr   rl   r=   rd   pip._vendorr   rm   Ir   r   r   r<   r   r   r+   r   r.   r   objectr/   ro   r   r   r	   r	   r	   r
   <module>   s*   	&   