)EjOddlZddlZddlZddlmZddlmZmZddlZddlm Z ej Z ddddZ Gdd ej Zd Zdd ZGd deZGddejZGddejZGddeZefdZefdZedkr/ddlZejejejj dSdS)Nwraps)MappingCallable) PercentStylez%(levelname)s: %(message)sz %(message)s)*INFODEBUGc.eZdZdZdfd ZfdZxZS)LevelFormatteraLog formatter with level-specific formatting. Formatter class which optionally takes a dict of logging levels to format strings, allowing to customise the log records appearance for specific levels. Attributes: fmt: A dictionary mapping logging levels to format strings. The ``*`` key identifies the default format string. datefmt: As per py:class:`logging.Formatter` style: As per py:class:`logging.Formatter` >>> import sys >>> handler = logging.StreamHandler(sys.stdout) >>> formatter = LevelFormatter( ... fmt={ ... '*': '[%(levelname)s] %(message)s', ... 'DEBUG': '%(name)s [%(levelname)s] %(message)s', ... 'INFO': '%(message)s', ... }) >>> handler.setFormatter(formatter) >>> log = logging.getLogger('test') >>> log.setLevel(logging.DEBUG) >>> log.addHandler(handler) >>> log.debug('this uses a custom format string') test [DEBUG] this uses a custom format string >>> log.info('this also uses a custom format string') this also uses a custom format string >>> log.warning("this one uses the default format string") [WARNING] this one uses the default format string N%c|dkrtd|t}t|tr|}i}nMt|tr&t |}|dd}ntd|ztt| |||j |_ i|_ |D]#\}}tj|}||j |<$dS)Nr z:only '%' percent style is supported in both python 2 and 3rz&fmt must be a str or a dict of str: %r) ValueErrorDEFAULT_FORMATS isinstancestrrdictpop TypeErrorsuperr __init___fmtdefault_formatcustom_formatsitemslogging _checkLevel)selffmtdatefmtstylerrlevel __class__s MC:\PYTHON\MyICR_Suite\python\Lib\site-packages\fontTools/misc/loggingTools.pyrzLevelFormatter.__init__8s C<<L  ;!C c3   L NNN W % % L!#YYN+//T::NNDsJKK K nd##,,^WEEE"i (..00 - -JE3'..E),D  & & - -c|jrR|j|j|j}|j|kr"||_t rt ||_tt| |SN) rgetlevelnorrr_stylerr format)rrecordrr#s r$r+zLevelFormatter.formatNst   4%))&.$:MNNCyC 4".s"3"3DK^T**11&999r%)NNr )__name__ __module__ __qualname____doc__rr+ __classcell__r#s@r$r r saB------,:::::::::r%r c |dd}|d|vrd|vrtdnd|vsd|vrtd|q|dd}|dd}|rtj||}n*|dd}tj|}|g}|d d }|rt |t rtj|}t|j |d d}|d d}|dd} t||| } |dg} |D]T}|j | | |j s| D]} || ||U|j dkr|dd|_|dd} | || |r9d|}td|zdS)a A more sophisticated logging system configuation manager. This is more or less the same as :py:func:`logging.basicConfig`, with some additional options and defaults. The default behaviour is to create a ``StreamHandler`` which writes to sys.stderr, set a formatter using the ``DEFAULT_FORMATS`` strings, and add the handler to the top-level library logger ("fontTools"). A number of optional keyword arguments may be specified, which can alter the default behaviour. Args: logger: Specifies the logger name or a Logger instance to be configured. (Defaults to "fontTools" logger). Unlike ``basicConfig``, this function can be called multiple times to reconfigure a logger. If the logger or any of its children already exists before the call is made, they will be reset before the new configuration is applied. filename: Specifies that a ``FileHandler`` be created, using the specified filename, rather than a ``StreamHandler``. filemode: Specifies the mode to open the file, if filename is specified. (If filemode is unspecified, it defaults to ``a``). format: Use the specified format string for the handler. This argument also accepts a dictionary of format strings keyed by level name, to allow customising the records appearance for specific levels. The special ``'*'`` key is for 'any other' level. datefmt: Use the specified date/time format. level: Set the logger level to the specified level. stream: Use the specified stream to initialize the StreamHandler. Note that this argument is incompatible with ``filename`` - if both are present, ``stream`` is ignored. handlers: If specified, this should be an iterable of already created handlers, which will be added to the logger. Any handler in the list which does not have a formatter assigned will be assigned the formatter created in this function. filters: If specified, this should be an iterable of already created filters. If the ``handlers`` do not already have filters assigned, these filters will be added to them. propagate: All loggers have a ``propagate`` attribute which determines whether to continue searching for handlers up the logging hierarchy. If not provided, the "propagate" attribute will be set to ``False``. handlersNstreamfilenamez8'stream' and 'filename' should not be specified togetherzG'stream' or 'filename' should not be specified together with 'handlers'filemodealogger fontTools)parentr+r r!r filtersroot propagateFr"z, zUnrecognised argument(s): %s)rrr FileHandler StreamHandlerrr getLogger_resetExistingLoggersnamer formatter setFormatterr< addFilter addHandlerr>setLeveljoinkeys)kwargsr4r6modehr5r9fsdfsr!rr<fr"rJs r$ configLoggerrQYsZzz*d++H v  *"6"6M  v  v!5!55 ::j$//zz*c**  .#Hd33AAZZ$//F%f--A3 ZZ+ . .F +Z,,+"6**---- Hd # #B **Y % %C JJw $ $E S% ( (CjjB''G  ;  NN3   y    A! {f!::k599 JJw % %E  @yy''7$>???@@r%r=ctj}t|jj}|dkr|g|z}n||vrdS||vr~|g}||dz}|dz}t|}t|}||kr:||d||kr||||dz }||k:|D]}|dkru| tj |j ddD]} | | |j ddD]} || d|_}|jj|} tj| _g| _ g| _ d| _d| _dS)zReset the logger named 'parent' and all its children to their initial state, if they already exist in the current configuration. r=N.FT)rr=sortedmanager loggerDictrJindexlenappendrHWARNINGr4 removeHandlerr< removeFiltersdisabledNOTSETr"r>) r;r=existingloggers_to_resetiprefixedpflen num_existingrCrMrPr9s r$rBrBs > MM'/ * * *]111% & &""1%%%%\!!!_ & &""1%%%%!DMM\,T2F">FL FOFN#F #FOO$$r%ceZdZUdZeejZege fe d<dZ dZ ddZ ddZdZd Zd Zd Zd Zdd ZdZdZdZdS)TimeraYKeeps track of overall time and split/lap times. >>> import time >>> timer = Timer() >>> time.sleep(0.01) >>> print("First lap:", timer.split()) First lap: ... >>> time.sleep(0.02) >>> print("Second lap:", timer.split()) Second lap: ... >>> print("Overall time:", timer.time()) Overall time: ... Can be used as a context manager inside with-statements. >>> with Timer() as t: ... time.sleep(0.01) >>> print("%0.3f seconds" % t.elapsed) 0... seconds If initialised with a logger, it can log the elapsed time automatically upon exiting the with-statement. >>> import logging >>> log = logging.getLogger("my-fancy-timer-logger") >>> configLogger(logger=log, level="DEBUG", format="%(message)s", stream=sys.stdout) >>> with Timer(log, 'do something'): ... time.sleep(0.01) Took ... to do something The same Timer instance, holding a reference to a logger, can be reused in multiple with-statements, optionally with different messages or levels. >>> timer = Timer(log) >>> with timer(): ... time.sleep(0.01) elapsed time: ...s >>> with timer('redo it', level=logging.INFO): ... time.sleep(0.02) Took ... to redo it It can also be used as a function decorator to log the time elapsed to run the decorated function. >>> @timer() ... def test1(): ... time.sleep(0.01) >>> @timer('run test 2', level=logging.INFO) ... def test2(): ... time.sleep(0.02) >>> test1() Took ... to run 'test1' >>> test2() Took ... to run test 2 _timezelapsed time: %(time).3fszTook %(time).3fs to %(msg)sNc|||8dD]5}t|td|z6||_||nt |_||_dS)N)msgr"z*'%s' can't be specified without a 'logger')resetlocalsr(rr9 TIME_LEVELr"rj)rr9rjr"startargs r$rzTimer.__init__#s| 5 >' Y Y88<<$$0$%QTW%WXXX1 #/UUZ r%cr|||_n||_|j|_d|_dS)z0Reset timer to 'start_time' or the current time.N)rhrnlastelapsed)rrns r$rkz Timer.reset-s3 =DJJDJJ  r%c:||jz S)z=Return the overall time (in seconds) since the timer started.)rhrnrs r$timez Timer.time6szz||dj((r%cd|}||jz |_||_|jS)z=Split and return the lap time (in seconds) in between splits.rhrrrs)rcurrents r$splitz Timer.split:s,**,,*  |r%c|s|j}|ddkr|j||dz}n |d|iz}n#ttf$rYnwxYw|S)zFormat 'time' value in 'msg' and return formatted string. If 'msg' contains a '%(time)' format string, try to use that. Otherwise, use the predefined 'default_format'. If 'msg' is empty or None, fall back to 'default_msg'. z%(time)rrjrvrv) default_msgfindrKeyErrorr)rrjrvs r$ formatTimezTimer.formatTimeAs  #"C 88I   " "%T(B(BBCC VTN*j)     s:A AcF||_d|_|S)zStart a new laprqrxrus r$ __enter__zTimer.__enter__RsJJLL   r%c|}|j|rdS||j|}|j|d}|j|j||dS)zEnd the current lap. If timer has a logger, log the time elapsed, using the format string in self.msg (or the default one). Nr|)rzr9rrjlogr")rexc_type exc_value tracebackrvmessage msg_partss r$__exit__zTimer.__exit__Xskzz|| ; (  F//$(D11!Hd33   GY77777r%c 6t|tr5|jsdjz_t fd}|S|p|d}|dj}j||S)aVIf the first argument is a function, return a decorator which runs the wrapped function inside Timer's context manager. Otherwise, treat the first argument as a 'msg' string and return an updated Timer instance, referencing the same logger. A 'level' keyword can also be passed to override self.level. zrun '%s'cL5|i|cdddS#1swxYwYdSr')argskwdsfuncrs r$wrapperzTimer.__call__..wrapperts//4...//////////////////s rjr") rrrjr-rr(r"r#r9)r func_or_msgrKrrjr"rs` @r$__call__zTimer.__call__gs k8 , , ;D8 6% 5 4[[ / / / / /[ /N2E!2!2CJJw 33E>>$+sE:: :r%c|jSr'rsrus r$ __float__zTimer.__float__s |r%c*t|jSr')intrsrus r$__int__z Timer.__int__s4<   r%cd|jzS)Nz%.3frrus r$__str__z Timer.__str__s $$r%)NNNNr')r-r.r/r0 staticmethodtimeit default_timerrhrfloat__annotations__r}rrrkrvrzrrrrrrrrr%r$rgrgs66r".f.B!C!CE8BI CCC-K2N)))" 8 8 8;;;;0!!!%%%%%r%rgceZdZdZdZdZdS)ChannelsFilteraQProvides a hierarchical filter for log entries based on channel names. Filters out records emitted from a list of enabled channel names, including their children. It works the same as the ``logging.Filter`` class, but allows the user to specify multiple channel names. >>> import sys >>> handler = logging.StreamHandler(sys.stdout) >>> handler.setFormatter(logging.Formatter("%(message)s")) >>> filter = ChannelsFilter("A.B", "C.D") >>> handler.addFilter(filter) >>> root = logging.getLogger() >>> root.addHandler(handler) >>> root.setLevel(level=logging.DEBUG) >>> logging.getLogger('A.B').debug('this record passes through') this record passes through >>> logging.getLogger('A.B.C').debug('records from children also pass') records from children also pass >>> logging.getLogger('C.D').debug('this one as well') this one as well >>> logging.getLogger('A.B.').debug('also this one') also this one >>> logging.getLogger('A.F').debug('but this one does not!') >>> logging.getLogger('C.DE').debug('neither this one!') c^||_t||_d|D|_dS)Nc.i|]}|t|Sr)rY).0ns r$ z+ChannelsFilter.__init__..s 111a3q66111r%)namesrYnumlengths)rrs r$rzChannelsFilter.__init__s/ u::115111 r%c|jdkrdS|jD]Q}|j|}||jkrdS|j|d|dkr|j|dkrdSRdS)NrTrTF)rrrrCr~)rr,rCnlens r$filterzChannelsFilter.filters 8q==4J  D<%Dv{""tt!!$400A55&+d:Ks:R:Rttur%N)r-r.r/r0rrrr%r$rrs<4222     r%rc8eZdZfdZdZdZdZddZxZS)CapturingLogHandlerctt||g|_t |t rt j||_dS||_dS)N)r") rrrrecordsrrrrAr9)rr9r"r#s r$rzCapturingLogHandler.__init__s_ !4((111>>> fc " " !!+F33DKKK DKKKr%c|jj|_|jj|_|jj|_|j||j|jd|j_d|j_|S)NF) r9r^original_disabledr"original_levelr>original_propagaterGrHrus r$rzCapturingLogHandler.__enter__sp!%!5"k/"&+"7 t$$$ TZ((($  %  r%c|j||j|j|j|j_|j|j_|Sr')r9r\rHrrr^rr>)rtypevaluers r$rzCapturingLogHandler.__exit__sP !!$''' T0111#5  $ 7  r%c:|j|dSr')rrZ)rr,s r$emitzCapturingLogHandler.emits F#####r%Ncddl}||}|jD],}||rdS-|d|z}J|)NrTz(Pattern '%s' not found in logger records)recompilersearch getMessage)rregexprjrpatternrs r$ assertRegexzCapturingLogHandler.assertRegexso **V$$  A~~allnn-- tt  ;.``. For example: >>> class BaseClass(object): ... pass >>> class MyClass(LogMixin, BaseClass): ... pass >>> a = MyClass() >>> isinstance(a.log, logging.Logger) True >>> print(a.log.name) fontTools.misc.loggingTools.MyClass >>> class AnotherClass(MyClass): ... pass >>> b = AnotherClass() >>> isinstance(b.log, logging.Logger) True >>> print(b.log.name) fontTools.misc.loggingTools.AnotherClass ct|dsDd|jj|jjf}t j||_|jS)N_logrT)hasattrrIr#r.r-rrAr)rrCs r$rz LogMixin.logsNtV$$ 088T^68OPQQD)$//DIyr%N)r-r.r/r0propertyrrr%r$rrs96Xr%rc>tj|d||ddS)z:Raise a warning about deprecated function argument 'name'. is deprecated; category stacklevelN)warningswarn)rCrjrs r$deprecateArgumentrs+ MDDD##6VWXXXXXXr%cfd}|S)zBDecorator to raise a warning when a deprecated function is called.cBtfd}|S)NcVtjjdd|i|S)Nrr)rrr-)rrKrrrjs r$rz5deprecateFunction..decorator..wrappersI M*.---=!     4((( (r%r)rrrrjs` r$ decoratorz$deprecateFunction..decorator s> t ) ) ) ) ) )  )r%r)rjrrs`` r$deprecateFunctionr s*       r%__main__) optionflags)r=)!sysrr functoolsrcollections.abcrrrrr rmr Formatterr rQrBobjectrgFilterrHandlerrr UserWarningrrr-doctestexittestmodELLIPSISfailedrr%r$rs  -------- ] &  @:@:@:@:@:W&@:@:@:F`@`@`@F&$&$&$&$Ra%a%a%a%a%Fa%a%a%H)))))W^)))X)))))'/)))X!!!!!v!!!H+6YYYY %0$ zNNN CH_W_)9 : : : ABBBBBr%