Y8Z @s*ddlmZddlZddlZddlZddlZddlmZej dej Z ddZ yddlm Z Wnek rdd Z YnXGd d d eZGd d d eZGdddeZGdddeZGdddeZeZddZdS))absolute_importN)sixz^[a-z_][a-z0-9_]*$cCs)tj|}|s%td|dS)Nz!Not a valid Python identifier: %rT) IDENTIFIERmatch ValueError)smr 4/tmp/pip-build-3puug3g5/pip/pip/compat/dictconfig.py valid_ident"sr ) _checkLevelcCsmt|tr|}nQt||krY|tjkrItd|tj|}ntd||S)NzUnknown level: %rz*Level not an integer or a valid string: %r) isinstanceintstrloggingZ _levelNamesr TypeError)levelrvr r r r .s  r c@s@eZdZdZddZdddZdddZdS) ConvertingDictz A converting dictionary wrapper.cCsktj||}|jj|}||k rg|||[a-z]+)://(?P.*)$z ^\s*(\w+)\s*z^\.\s*(\w+)\s*z^\[\s*(\w+)\s*\]\s*z^\d+$ext ext_convertcfg cfg_convertcCst||_||j_dS)N)rconfigr)rr2r r r __init__szBaseConfigurator.__init__c Cs|jd}|jd}yz|j|}x`|D]X}|d|7}yt||}Wq7tk r|j|t||}Yq7Xq7W|SWn]tk rtjdd\}}td||f}|||_ |_ |YnXdS)z` Resolve strings to objects using standard import and attribute syntax. .rr)NzCannot resolve %r: %s) splitr#importergetattrAttributeError ImportErrorsysexc_infor __cause__ __traceback__) rrnameusedfoundfragetbvr r r resolves"    zBaseConfigurator.resolvecCs |j|S)z*Default converter for the ext:// protocol.)rE)rrr r r r/szBaseConfigurator.ext_convertc CsY|}|jj|}|dkr7td|n||jd}|j|jd}x|rT|jj|}|r||jd}n|jj|}|r|jd}|jj|s||}n9yt |}||}Wnt k r||}YnX|r;||jd}qgtd||fqgW|S)z*Default converter for the cfg:// protocol.NzUnable to convert %rrzUnable to convert %r at %r) WORD_PATTERNrrendr2groups DOT_PATTERN INDEX_PATTERN DIGIT_PATTERNrr)rrrestrdr*nr r r r1s2     zBaseConfigurator.cfg_convertcCs)t|t r7t|tr7t|}||_nt|t rnt|trnt|}||_nt|t rt|trt|}||_nt|tj 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. prefixNsuffix)r rrrrr(rr,r string_typesCONVERT_PATTERNr groupdictvalue_convertersr!r7)rrrrMrO converterrPr r r rs*          zBaseConfigurator.convertcsjd}t|d rRttdrRt|tjkrR|j|}jdd}tfddD}||}|rx*|jD]\}}t|||qW|S)z1Configure an object with a user-supplied factory.z()__call__ ClassTyper4Nc3s+|]!}t|r||fVqdS)N)r ).0k)r2r r sz4BaseConfigurator.configure_custom..) r#hasattrtypesrrWrEritemssetattr)rr2cpropskwargsr r>rr )r2r configure_customs4 z!BaseConfigurator.configure_customcCst|trt|}|S)z0Utility function which converts lists to tuples.)r r(r,)rrr r r as_tuples zBaseConfigurator.as_tupleN)r$r%r&r'recompilerRrFrIrJrKrT __import__r6r3rEr/r1rrbrcr r r r r-s      "  r-c@seZdZdZddZddZddZdd Zd d Zd d Z dddZ dddZ dddZ dS)DictConfiguratorz] Configure logging using a dictionary-like object to describe the configuration. cCs|j}d|kr!td|ddkrEtd|d|jdd}i}tjz|r5|jd|}tjdd dkrRx|D]}|tjkrtd |qyFtj|}||}|jd d}|r|j t |Wqt k rM} ztd || fWYdd} ~ XqXqW|jd|} xg| D]_}y|j || |dWqkt k r} ztd|| fWYdd} ~ XqkXqkW|jdd} | ry|j | dWqt k r1} ztd| WYdd} ~ XqXn|jdd} tjjtjdd=|jd|} xg| D]_}y|j| || |rnr(manager loggerDictsortindexlenappendremoveNOTSETrrj propagatedisabled _releaseLock)rr2ri EMPTY_DICTrjr>handlerhandler_configrrBrmrndisable_existingrprqexisting child_loggersiprefixedpflen num_existinglogloggerr r r configures        ' '   ' ' '         '      !zDictConfigurator.configurecCsd|kr|d}y|j|}Wqtk r}zFdt|krS|jd|d<||d<|j|}WYdd}~XqXn6|jdd}|jdd}tj||}|S)z(Configure a formatter from a dictionary.z()z'format'formatfmtNdatefmt)rbrrr#r!r Formatter)rr2factoryr terdfmtr r r r{s   %z$DictConfigurator.configure_formattercCsCd|kr|j|}n!|jdd}tj|}|S)z%Configure a filter from a dictionary.z()r>)rbr!rFilter)rr2r r>r r r r|s  z!DictConfigurator.configure_filtercCsoxh|D]`}y|j|jd|Wqtk rf}ztd||fWYdd}~XqXqWdS)z/Add filters to a filterer from a list of names.rqzUnable to add filter %r: %sN) addFilterr2rvr)rfiltererrqfrBr r r add_filterss  zDictConfigurator.add_filtersc -sjdd}|rky|jd|}Wn;tk rj}ztd||fWYdd}~XnXjdd}jdd}dkrjd}t|d rttd rt|tjkr|j|}|}n|jjd }t |t j j rd kry|jd d d .z'stream'streamstrm)r#r2rvrr[r\rrWrE issubclassrrj MemoryHandler SMTPHandlerrc SysLogHandlerrrr setFormatterrur r) rr2rrBrrqr_rklassrar rr )r2r r~sX# 4  *    z"DictConfigurator.configure_handlercCsoxh|D]`}y|j|jd|Wqtk rf}ztd||fWYdd}~XqXqWdS)z.Add handlers to a logger from a list of names.rjzUnable to add handler %r: %sN) addHandlerr2rvr)rrrjhrBr r r add_handlers s  zDictConfigurator.add_handlersFcCs|jdd}|dk r1|jt||sx(|jddD]}|j|qKW|jdd}|r|j|||jdd}|r|j||dS)zU Perform configuration which is common to root and non-root loggers. rNrjrq)r!rur rj removeHandlerrr)rrr2rirrrjrqr r r common_logger_configs z%DictConfigurator.common_logger_configcCsMtj|}|j||||jdd}|dk rI||_dS)z.Configure a non-root logger from a dictionary.rN)r getLoggerrr!r)rr>r2rirrr r r rw#s  z!DictConfigurator.configure_loggercCs#tj}|j|||dS)z*Configure a root logger from a dictionary.N)rrr)rr2rirnr r r rx+s zDictConfigurator.configure_rootN) r$r%r&r'rr{r|rr~rrrwrxr r r r rgs    5 rgcCst|jdS)z%Configure logging using a dictionary.N)dictConfigClassr)r2r r r dictConfig3sr) __future__rlogging.handlersrrdr:r\ pip._vendorrreIrr r r9rrr(rr,robjectr-rgrrr r r r s&      &