3
zYði8Z  ã               @   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j	dej
ƒZdd„ Zy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 j| ƒ}|std|  ƒ‚dS )Nz!Not a valid Python identifier: %rT)Ú
IDENTIFIERÚmatchÚ
ValueError)ÚsÚm© r	   ú4/tmp/pip-build-ue6tjl93/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| |ƒ}| j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| ||ƒ}| jj|ƒ}||k	rH|| |< t|ƒtttfkrH| |_||_	|S )N)
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| ||ƒ}| jj|ƒ}||k	r@t|ƒtttfkr@| |_||_	|S )N)
r   Úpopr   r   r   r   r   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| |ƒ}| jj|ƒ}||k	rF|| |< t|ƒtttfkrF| |_||_	|S )N)
Úlistr   r   r   r   r   r   r   r   r   )r   r   r   r    r	   r	   r
   r   l   s    
zConvertingList.__getitem__é   c             C   s<   t j| |ƒ}| jj|ƒ}||k	r8t|ƒtttfkr8| |_|S )N)	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| |ƒ}| jj|ƒ}||k	r>t|ƒtttfkr>| |_||_	|S )N)
Útupler   r   r   r   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jdƒZejdƒZejdƒZejdƒZ	ej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 )N)r   Úconfigr   )r   r2   r	   r	   r
   Ú__init__£   s    
zBaseConfigurator.__init__c       	      C   sÄ   |j dƒ}|jdƒ}y`| j|ƒ}xP|D ]H}|d| 7 }yt||ƒ}W q& tk
rl   | j|ƒ t||ƒ}Y q&X q&W |S  tk
r¾   tjƒ dd… \}}td||f ƒ}|| |_	|_
|‚Y nX dS )z`
        Resolve strings to objects using standard import and attribute
        syntax.
        Ú.r   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
   | j |ƒS )z*Default converter for the ext:// protocol.)rE   )r   r   r	   r	   r
   r.   ¾   s    zBaseConfigurator.ext_convertc             C   s  |}| j j|ƒ}|dkr&td| ƒ‚nØ||jƒ d… }| j|jƒ d  }x´|rü| jj|ƒ}|rp||jƒ d  }nd| jj|ƒ}|rÔ|jƒ d }| jj|ƒs¢|| }n2yt	|ƒ}|| }W n t
k
rÒ   || }Y nX |rê||jƒ d… }qJtd||f ƒ‚qJW |S )z*Default converter for the cfg:// protocol.NzUnable to convert %rr   zUnable to convert %r at %r)ÚWORD_PATTERNr   r   Úendr2   ÚgroupsÚDOT_PATTERNÚINDEX_PATTERNÚDIGIT_PATTERNr   r   )r   r   Úrestr   Údr*   Únr	   r	   r
   r/   Â   s2    
zBaseConfigurator.cfg_convertc             C   sÎ   t |tƒ r&t |tƒr&t|ƒ}| |_n¤t |tƒ rLt |tƒrLt|ƒ}| |_n~t |tƒ rrt |tƒrrt|ƒ}| |_nXt |tj	ƒrÊ| j
j|ƒ}|rÊ|jƒ }|d }| j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!   r7   )r   r   r   rM   rO   Ú	converterrP   r	   r	   r
   r   ä   s*    

zBaseConfigurator.convertc                sŽ   ˆ j dƒ}t|dƒ r8ttdƒr8t|ƒtjkr8| j|ƒ}ˆ j ddƒ}t‡ fdd„ˆ D ƒƒ}|f |Ž}|rŠx |jƒ D ]\}}t|||ƒ qrW |S )z1Configure an object with a user-supplied factory.z()Ú__call__Ú	ClassTyper4   Nc             3   s"   | ]}t |ƒr|ˆ | fV  qd S )N)r   )Ú.0Úk)r2   r	   r
   ú	<genexpr>  s    z4BaseConfigurator.configure_custom.<locals>.<genexpr>)	r#   ÚhasattrÚtypesr   rW   rE   r   ÚitemsÚsetattr)r   r2   ÚcÚpropsÚkwargsr    r>   r   r	   )r2   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,   )r   r   r	   r	   r
   Úas_tuple  s    
zBaseConfigurator.as_tupleN)r$   r%   r&   r'   ÚreÚcompilerR   rF   rI   rJ   rK   rT   Ú
__import__r6   r3   rE   r.   r/   r   rb   rc   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  ƒ‚|jddƒ}i }tjƒ  �z||�rÄ|jd|ƒ}tjdd	… dk�rxŽ|D ]†}|tjkr–td| ƒ‚qzy4tj| }|| }|jddƒ}|rÈ|j	t
|ƒƒ W qz tk
� rþ }	 ztd||	f ƒ‚W Y dd}	~	X qzX qzW |jd|ƒ}
xZ|
D ]R}y| j||
| dƒ W n4 tk
�rd }	 ztd||	f ƒ‚W Y dd}	~	X nX �qW |jddƒ}|�rÆy| j|dƒ W n0 tk
�r¾ }	 ztd|	 ƒ‚W Y dd}	~	X nX �n|jddƒ}tjjƒ  tjdd…= |jd|ƒ}xZ|D ]R}y| j|| ƒ||< W n4 tk
�rF }	 ztd||	f ƒ‚W Y dd}	~	X nX �qøW |jd|ƒ}xZ|D ]R}y| j|| ƒ||< W n4 tk
�r® }	 ztd||	f ƒ‚W Y dd}	~	X nX �q`W |jd|ƒ}xht|ƒD ]\}y | j|| ƒ}||_|||< W n4 tk
�r$ }	 ztd||	f ƒ‚W Y dd}	~	X nX �qÌW tj}t|jjƒ}|jƒ  g }|jd|ƒ}
xÔ|
D ]Ì}||k�rÜ|j|ƒ}|d }t|ƒ}t|ƒ}|d }x<||k �rÐ|| d|… |k�rÐ|j|| ƒ |d }�q–W |j|ƒ y| j||
| ƒ W n4 tk
�r$ }	 ztd||	f ƒ‚W Y dd}	~	X nX �q\W xF|D ]>}|jj| }||k�rbtj|_g |_ d|_!n|�r2d|_"�q2W |jddƒ}|�rÆy| j|ƒ W n0 tk
�rÄ }	 ztd|	 ƒ‚W Y dd}	~	X nX W dtj#ƒ  X dS )zDo the configuration.Úversionz$dictionary doesn't specify a versionr)   zUnsupported version: %sÚincrementalFÚhandlersNé   é   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: %sr4   )rk   rl   )$r2   r   r#   r   Ú_acquireLockr!   r:   Úversion_infoÚ	_handlersÚsetLevelr   ÚStandardErrorÚconfigure_loggerÚconfigure_rootÚclearÚ_handlerListÚconfigure_formatterÚconfigure_filterÚsortedÚconfigure_handlerr>   rn   r(   ÚmanagerÚ
loggerDictÚsortÚindexÚlenÚappendÚremoveÚNOTSETr   rj   Ú	propagateÚdisabledÚ_releaseLock)r   r2   ri   Ú
EMPTY_DICTrj   r>   ÚhandlerÚhandler_configr   rB   rm   rn   Údisable_existingrp   rq   ÚexistingÚchild_loggersÚiÚprefixedÚpflenÚnum_existingÚlogÚloggerr	   r	   r
   Ú	configure  sÐ    



"
$

$
$$



$

zDictConfigurator.configurec             C   sš   d|krr|d }y| j |ƒ}W q– tk
rn } z4dt|ƒkr>‚ |jdƒ|d< ||d< | j |ƒ}W Y dd}~X q–X n$|jddƒ}|jddƒ}tj||ƒ}|S )z(Configure a formatter from a dictionary.z()z'format'ÚformatÚfmtNÚdatefmt)rb   r   r   r#   r!   r   Ú	Formatter)r   r2   Úfactoryr    Úter˜   Údfmtr	   r	   r
   r{   ­  s    z$DictConfigurator.configure_formatterc             C   s.   d|kr| j |ƒ}n|jddƒ}tj|ƒ}|S )z%Configure a filter from a dictionary.z()r>   Ú )rb   r!   r   ÚFilter)r   r2   r    r>   r	   r	   r
   r|   Ã  s
    
z!DictConfigurator.configure_filterc             C   s^   xX|D ]P}y|j | jd | ƒ W q tk
rT } ztd||f ƒ‚W Y dd}~X qX qW dS )z/Add filters to a filterer from a list of names.rq   zUnable to add filter %r: %sN)Ú	addFilterr2   rv   r   )r   Úfiltererrq   ÚfrB   r	   r	   r
   Úadd_filtersÌ  s
    
zDictConfigurator.add_filtersc          -      s@  ˆ j ddƒ}|rVy| jd | }W n2 tk
rT } ztd||f ƒ‚W Y dd}~X nX ˆ j ddƒ}ˆ j ddƒ}dˆ kr´ˆ j dƒ}t|dƒ r®ttd	ƒr®t|ƒtjkr®| j|ƒ}|}nÜ| jˆ j d
ƒƒ}t	|t
jjƒoØdˆ k�r2y| jd ˆ d  ˆ d< W n8 tk
�r. } ztdˆ d |f ƒ‚W Y dd}~X nX nZt	|t
jjƒ�r`dˆ k�r`| jˆ d ƒˆ d< n,t	|t
jjƒ�rŒdˆ k�rŒ| jˆ d ƒˆ d< |}t‡ fdd„ˆ D ƒƒ}	y|f |	Ž}
W nL tk
�r  } z.dt|ƒk�rØ‚ |	j dƒ|	d< |f |	Ž}
W Y dd}~X nX |�r|
j|ƒ |dk	�r*|
jt|ƒƒ |�r<| j|
|ƒ |
S )z&Configure a handler from a dictionary.Ú	formatterNrp   zUnable to set formatter %r: %sr   rq   z()rV   rW   ÚclassÚtargetrj   z#Unable to set target handler %r: %sÚmailhostÚaddressc             3   s"   | ]}t |ƒr|ˆ | fV  qd S )N)r   )rX   rY   )r2   r	   r
   rZ   õ  s    z5DictConfigurator.configure_handler.<locals>.<genexpr>z'stream'ÚstreamÚstrm)r#   r2   rv   r   r[   r\   r   rW   rE   Ú
issubclassr   rj   ÚMemoryHandlerÚSMTPHandlerrc   ÚSysLogHandlerr   r   r   ÚsetFormatterru   r   r£   )r   r2   r¤   rB   r   rq   r_   r›   Úklassra   r    rœ   r	   )r2   r
   r~   Ô  sX    
$

$



z"DictConfigurator.configure_handlerc             C   s^   xX|D ]P}y|j | jd | ƒ W q tk
rT } ztd||f ƒ‚W Y dd}~X qX qW dS )z.Add handlers to a logger from a list of names.rj   zUnable to add handler %r: %sN)Ú
addHandlerr2   rv   r   )r   r•   rj   ÚhrB   r	   r	   r
   Úadd_handlers	  s
    
zDictConfigurator.add_handlersFc             C   s„   |j ddƒ}|dk	r"|jt|ƒƒ |s€x |jdd… D ]}|j|ƒ q6W |j ddƒ}|rd| j||ƒ |j ddƒ}|r€| j||ƒ dS )zU
        Perform configuration which is common to root and non-root loggers.
        r   Nrj   rq   )r!   ru   r   rj   ÚremoveHandlerr³   r£   )r   r•   r2   ri   r   r²   rj   rq   r	   r	   r
   Úcommon_logger_config  s    z%DictConfigurator.common_logger_configc             C   s6   t j|ƒ}| j|||ƒ |jddƒ}|dk	r2||_dS )z.Configure a non-root logger from a dictionary.r‡   N)r   Ú	getLoggerrµ   r!   r‡   )r   r>   r2   ri   r•   r‡   r	   r	   r
   rw   #  s
    
z!DictConfigurator.configure_loggerc             C   s   t jƒ }| j|||ƒ dS )z*Configure a root logger from a dictionary.N)r   r¶   rµ   )r   r2   ri   rn   r	   r	   r
   rx   +  s    zDictConfigurator.configure_rootN)F)F)F)r$   r%   r&   r'   r–   r{   r|   r£   r~   r³   rµ   rw   rx   r	   r	   r	   r
   rg     s    	5

rg   c             C   s   t | ƒjƒ  dS )z%Configure logging using a dictionary.N)ÚdictConfigClassr–   )r2   r	   r	   r
   Ú
dictConfig3  s    r¸   )Ú
__future__r   Úlogging.handlersr   rd   r:   r\   Úpip._vendorr   re   ÚIr   r   r   r9   r   r   r(   r   r,   r   Úobjectr-   rg   r·   r¸   r	   r	   r	   r
   Ú<module>   s*   	&   