ó
    oñ:iÝM  ã                   óÀ  • S SK r S SKrS SKrS SKJr  S SKJrJr  S SKrS SKJ	r	  \R                  rSSSS.r " S S	\R                  5      rS
 rSS jr " S S\5      r " S S\R&                  5      r " S S\R*                  5      r " S S\5      r\4S jr\4S jr\S:X  a9  S SKr\ R:                  " \R<                  " \R>                  S9R@                  5        gg)é    N©Úwraps)ÚMappingÚCallable)ÚPercentStylez%(levelname)s: %(message)sz%(message)s)Ú*ÚINFOÚDEBUGc                   ó<   ^ • \ rS rSrSrSU 4S jjrU 4S jrSrU =r$ )ÚLevelFormatteré   a�  Log 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
c                 óÀ  >• US:w  a  [        S5      eUc  [        n[        U[        5      (       a  Un0 nOA[        U[        5      (       a  [        U5      nUR                  SS 5      nO[        SU-  5      e[        [        U ]+  XB5        U R                  U l        0 U l        UR                  5        H)  u  pa[        R                   " U5      nXR                  U'   M+     g )NÚ%z:only '%' percent style is supported in both python 2 and 3r   z&fmt must be a str or a dict of str: %r)Ú
ValueErrorÚDEFAULT_FORMATSÚ
isinstanceÚstrr   ÚdictÚpopÚ	TypeErrorÚsuperr   Ú__init__Ú_fmtÚdefault_formatÚcustom_formatsÚitemsÚloggingÚ_checkLevel)ÚselfÚfmtÚdatefmtÚstyler   r   ÚlevelÚ	__class__s          €Ú^/srv/projetos/modelo_ml_acdoc/venv/lib/python3.13/site-packages/fontTools/misc/loggingTools.pyr   ÚLevelFormatter.__init__8   sÌ   ø€ Ø�C‹<ÜØLóð ð ‰;Ü!ˆCÜ�cœ3×ÑØ ˆNØ‰NÜ˜œW×%Ñ%Ü! #›YˆNØ+×/Ñ/°°TÓ:‰NäÐDÀsÑJÓKÐKÜŒn˜dÑ,¨^ÔEØ"Ÿi™iˆÔØ ˆÔØ(×.Ñ.Ö0‰JˆEÜ×'Ò'¨Ó.ˆEØ),×Ñ Ó&ò 1ó    c                 ó  >• U R                   (       aa  U R                   R                  UR                  U R                  5      nU R                  U:w  a!  X l        [
        (       a  [        U5      U l        [        [        U ]'  U5      $ ©N)
r   ÚgetÚlevelnor   r   r   Ú_styler   r   Úformat)r   Úrecordr    r$   s      €r%   r-   ÚLevelFormatter.formatN   sb   ø€ Ø××Ø×%Ñ%×)Ñ)¨&¯.©.¸$×:MÑ:MÓNˆCØ�y‰y˜CÓØ”	ç’<Ü".¨sÓ"3�D”KÜ”^ TÑ1°&Ó9Ð9r'   )r   r,   r   r   )NNr   )	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r-   Ú__static_attributes__Ú__classcell__©r$   s   @r%   r   r      s   ø† ñ÷B-÷,:ó :r'   r   c                  óŠ  • U R                  SS5      nUc  SU ;   a  SU ;   a  [        S5      eOSU ;   d  SU ;   a  [        S5      eUcm  U R                  SS5      nU R                  SS5      nU(       a  [        R                  " X#5      nO(U R                  SS5      n[        R                  " U5      nU/nU R                  S	S
5      nU(       a  [        U[        5      (       a  [        R                  " U5      n[        UR                  S9  U R                  SS5      nU R                  SS5      nU R                  SS5      n	[        XxU	5      n
U R                  S/ 5      nU H]  nUR                  c  UR                  U
5        UR                  (       d  U H  nUR                  U5        M     UR                  U5        M_     UR                  S:w  a  U R                  SS5      Ul        U R                  SS5      nUb  UR#                  U5        U (       a-  SR%                  U R'                  5       5      n[        SU-  5      eg)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``.
ÚhandlersNÚstreamÚfilenamez8'stream' and 'filename' should not be specified togetherzG'stream' or 'filename' should not be specified together with 'handlers'ÚfilemodeÚaÚloggerÚ	fontTools)Úparentr-   r!   r"   r   ÚfiltersÚrootÚ	propagateFr#   z, zUnrecognised argument(s): %s)r   r   r   ÚFileHandlerÚStreamHandlerr   r   Ú	getLoggerÚ_resetExistingLoggersÚnamer   Ú	formatterÚsetFormatterrA   Ú	addFilterÚ
addHandlerrC   ÚsetLevelÚjoinÚkeys)Úkwargsr9   r;   ÚmodeÚhr:   r>   ÚfsÚdfsr"   r    rA   Úfr#   rO   s                  r%   ÚconfigLoggerrV   Y   s  € ðZ �z‰z˜* dÓ+€HØÑØ�vÓ *°Ó"6ÜØMóð øð �vÓ ¨vÓ!5Üð5óð ð ÑØ—:‘:˜j¨$Ó/ˆØ�z‰z˜* cÓ*ˆÞÜ×#Ò# HÓ3‰Aà—Z‘Z ¨$Ó/ˆFÜ×%Ò% fÓ-ˆAØ�3ˆà�Z‰Z˜ +Ó.€FÞ”Z ¬×,Ñ,ä×"Ò" 6Ó*ˆä §¡Ò-à	�‰�H˜dÓ	#€BØ
�*‰*�Y Ó
%€Cà�J‰J�w Ó$€EÜ
˜ %Ó
(€CØ�j‰j˜ BÓ'€GÛˆØ�;‰;ÑØ�N‰N˜3ÔØ�y�yÛ�Ø—‘˜A–ñ à×Ñ˜!Öñ ð ‡{�{�fÓà!Ÿ:™: k°5Ó9ˆÔà�J‰J�w Ó%€EØÑØ�‰˜ÔÞØ�y‰y˜Ÿ™›Ó'ˆÜÐ7¸$Ñ>Ó?Ð?ð r'   c                 ó  • [         R                  n[        UR                  R                  R                  5       5      nU S:X  a  U /U-   nOlX;  a  gX;   aa  U /nUR                  U 5      S-   nU S-   n[        U5      n[        U5      nXG:  a*  X$   SU U:X  a  UR                  X$   5        US-  nXG:  a  M*  W HÉ  nUS:X  av  UR                  [         R                  5        UR                  SS  H  n	UR                  U	5        M     UR                  SS  H  n
UR                  U
5        M     SUl        M  UR                  R                  U   n[         R                   Ul        / Ul        / Ul        SUl        SUl        MË     g)z�Reset the logger named 'parent' and all its children to their initial
state, if they already exist in the current configuration.
rB   Né   Ú.FT)r   rB   ÚsortedÚmanagerÚ
loggerDictrO   ÚindexÚlenÚappendrM   ÚWARNINGr9   ÚremoveHandlerrA   ÚremoveFiltersÚdisabledÚNOTSETr#   rC   )r@   rB   ÚexistingÚloggers_to_resetÚiÚprefixedÚpflenÚnum_existingrH   rR   rU   r>   s               r%   rG   rG   ¼   sc  € ô �<‰<€Dä�d—l‘l×-Ñ-×2Ñ2Ó4Ó5€HØ�Óà"˜8 hÑ.ÑØ	Ó	àØ	Ó	Ø"˜8Ðà�N‰N˜6Ó" QÑ&ˆØ˜C‘<ˆÜ�H“ˆÜ˜8“}ˆØÓØ‰{˜6˜EÐ" hÓ.Ø ×'Ñ'¨©Ô4Ø�‰FˆAð Õó !ˆØ�6‹>Ø�M‰Mœ'Ÿ/™/Ô*Ø—]‘]¡1Ó%�Ø×"Ñ" 1Ö%ñ &à—\‘\¡!“_�Ø×"Ñ" 1Ö%ñ %à!ˆDŽMà—\‘\×,Ñ,¨TÑ2ˆFÜ"Ÿ>™>ˆFŒLØ ˆFŒOØˆFŒNØ#ˆFÔØ#ˆFŽOò !r'   c                   ó¨   • \ rS rSr% Sr\" \R                  5      r\	/ \
4   \S'   SrSrSS jrSS jrS	 rS
 rS rS rS rSS jrS rS rS rSrg)ÚTimeréå   a¥  Keeps 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
Ú_timezelapsed time: %(time).3fszTook %(time).3fs to %(msg)sNc                 óÆ   • U R                  U5        Uc1  S H+  n[        5       R                  U5      c  M  [        SU-  5      e   Xl        Ub  UO[
        U l        X l        g )N)Úmsgr#   z*'%s' can't be specified without a 'logger')ÚresetÚlocalsr*   r   r>   Ú
TIME_LEVELr#   rp   )r   r>   rp   r#   ÚstartÚargs         r%   r   ÚTimer.__init__#  sZ   € Ø�
‰
�5ÔØ‰>Û'�Ü“8—<‘< Ó$Ó0Ü$Ð%QÐTWÑ%WÓXÐXñ (ð ŒØ#Ñ/‘U´ZˆŒ
Ø�r'   c                 ór   • Uc  U R                  5       U l        OXl        U R                  U l        SU l        g)z0Reset timer to 'start_time' or the current time.Nç        )rn   rt   ÚlastÚelapsed)r   rt   s     r%   rq   ÚTimer.reset-  s+   € à‰=ØŸ™›ˆD�JàŒJØ—J‘JˆŒ	Øˆ�r'   c                 ó<   • U R                  5       U R                  -
  $ )z=Return the overall time (in seconds) since the timer started.)rn   rt   ©r   s    r%   ÚtimeÚ
Timer.time6  s   € à�z‰z‹|˜dŸj™jÑ(Ð(r'   c                 ól   • U R                  5       nXR                  -
  U l        Xl        U R                  $ )z=Split and return the lap time (in seconds) in between splits.©rn   ry   rz   )r   Úcurrents     r%   ÚsplitÚTimer.split:  s*   € à—*‘*“,ˆØ§¡Ñ*ˆŒØŒ	Ø�|‰|Ðr'   c                 óº   • U(       d  U R                   nUR                  S5      S:  a  U R                  XS.-  nU$  USU0-  nU$ ! [        [        4 a     U$ f = f)zßFormat '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)r   ©rp   r~   r~   )Údefault_msgÚfindr   ÚKeyErrorr   )r   rp   r~   s      r%   Ú
formatTimeÚTimer.formatTimeA  su   € ö Ø×"Ñ"ˆCØ�8‰8�IÓ Ó"Ø×%Ñ%°Ñ(BÑBˆCð ˆ
ð	Ø˜V T˜NÑ*�ð ˆ
øô œjÐ)ó ØØˆ
ðús   ½A ÁAÁAc                 ó>   • U R                  5       U l        SU l        U $ )zStart a new laprx   r�   r}   s    r%   Ú	__enter__ÚTimer.__enter__R  s   € à—J‘J“LˆŒ	ØˆŒØˆr'   c                 óð   • U R                  5       nU R                  b  U(       a  gU R                  U R                  U5      nU R                  US.nU R                  R	                  U R
                  XV5        g)z|End the current lap. If timer has a logger, log the time elapsed,
using the format string in self.msg (or the default one).
Nr†   )rƒ   r>   rŠ   rp   Úlogr#   )r   Úexc_typeÚ	exc_valueÚ	tracebackr~   ÚmessageÚ	msg_partss          r%   Ú__exit__ÚTimer.__exit__X  sZ   € ð �z‰z‹|ˆØ�;‰;Ñ¦(ð Ø—/‘/ $§(¡(¨DÓ1ˆð !ŸH™H¨dÑ3ˆ	Ø�‰�‰˜Ÿ
™
 GÕ7r'   c                 óP  ^ ^• [        U[        5      (       a>  UmT R                  (       d  STR                  -  T l        [	        T5      UU 4S j5       nU$ U=(       d    UR                  S5      nUR                  ST R                  5      nT R                  T R                  XE5      $ )a.  If 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.
zrun '%s'c                  óN   >• T   T" U 0 UD6sS S S 5        $ ! , (       d  f       g = fr)   © )ÚargsÚkwdsÚfuncr   s     €€r%   ÚwrapperÚTimer.__call__.<locals>.wrappert  s   ø€ âÙ Ð.¨Ñ.÷ —T—Tús   „–
$rp   r#   )	r   r   rp   r0   r   r*   r#   r$   r>   )r   Úfunc_or_msgrP   rž   rp   r#   r�   s   `     @r%   Ú__call__ÚTimer.__call__g  s‡   ù€ ô �k¤8×,Ñ,ØˆDà—8—8Ø%¨¯©Ñ5�”ä�4‹[õ/ó ð/ð ˆNà×2 §¡¨EÓ!2ˆCØ—J‘J˜w¨¯
©
Ó3ˆEØ—>‘> $§+¡+¨sÓ:Ð:r'   c                 ó   • U R                   $ r)   ©rz   r}   s    r%   Ú	__float__ÚTimer.__float__  s   € Ø�|‰|Ðr'   c                 ó,   • [        U R                  5      $ r)   )Úintrz   r}   s    r%   Ú__int__ÚTimer.__int__‚  s   € Ü�4—<‘<Ó Ð r'   c                 ó    • SU R                   -  $ )Nz%.3fr¤   r}   s    r%   Ú__str__ÚTimer.__str__…  s   € Ø˜Ÿ™Ñ$Ð$r'   )rz   ry   r#   r>   rp   rt   )NNNNr)   )r0   r1   r2   r3   r4   ÚstaticmethodÚtimeitÚdefault_timerrn   r   ÚfloatÚ__annotations__r‡   r   r   rq   r~   rƒ   rŠ   r�   r–   r¡   r¥   r©   r¬   r5   rš   r'   r%   rl   rl   å   si   ‡ ñ6ñr ".¨f×.BÑ.BÓ!C€Eˆ8�B˜�IÑÓCØ-€KØ2€Nôôò)òòò"ò8ô;ò0ò!õ%r'   rl   c                   ó$   • \ rS rSrSrS rS rSrg)ÚChannelsFilteri‰  aù  Provides 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                 ó|   • Xl         [        U5      U l        U Vs0 s H  o"[        U5      _M     snU l        g s  snf r)   )Únamesr^   ÚnumÚlengths)r   r¶   Úns      r%   r   ÚChannelsFilter.__init__¤  s1   € ØŒ
Ü�u“:ˆŒÙ+0Ó1ª5 aœ3˜q›6š	©5Ñ1ˆ�ùÒ1s   ›9c                 óü   • U R                   S:X  a  gU R                   H[  nU R                  U   nX!R                  :X  a    gUR                  R	                  USU5      S:X  d  MF  UR                  U   S:X  d  M[    g   g)Nr   TrY   F)r·   r¶   r¸   rH   rˆ   )r   r.   rH   Únlens       r%   ÚfilterÚChannelsFilter.filter©  sl   € Ø�8‰8�q‹=ØØ—J”JˆDØ—<‘< Ñ%ˆDØ—{‘{Ó"ÙØ—‘×!Ñ! $¨¨4Ó0°AÕ5¸&¿+¹+ÀdÑ:KÈsÕ:RÙñ ð r'   )r¸   r¶   r·   N)r0   r1   r2   r3   r4   r   r½   r5   rš   r'   r%   r´   r´   ‰  s   † ñò42õ
	r'   r´   c                   óD   ^ • \ rS rSrU 4S jrS rS rS rSS jrSr	U =r
$ )	ÚCapturingLogHandleriµ  c                 ó¤   >• [         [        U ]  US9  / U l        [	        U[
        5      (       a  [        R                  " U5      U l        g Xl        g )N)r#   )	r   rÀ   r   Úrecordsr   r   r   rF   r>   )r   r>   r#   r$   s      €r%   r   ÚCapturingLogHandler.__init__¶  sA   ø€ ÜÔ! 4Ñ1¸Ð1Ñ>ØˆŒÜ�fœc×"Ñ"Ü!×+Ò+¨FÓ3ˆD�Kà �Kr'   c                 ól  • U R                   R                  U l        U R                   R                  U l        U R                   R
                  U l        U R                   R                  U 5        U R                   R                  U R                  5        SU R                   l        SU R                   l        U $ )NF)	r>   rc   Úoriginal_disabledr#   Úoriginal_levelrC   Úoriginal_propagaterL   rM   r}   s    r%   r�   ÚCapturingLogHandler.__enter__¾  s}   € Ø!%§¡×!5Ñ!5ˆÔØ"Ÿk™k×/Ñ/ˆÔØ"&§+¡+×"7Ñ"7ˆÔà�‰×Ñ˜tÔ$Ø�‰×Ñ˜TŸZ™ZÔ(Ø$ˆ�‰ÔØ %ˆ�‰Ôàˆr'   c                 óò   • U R                   R                  U 5        U R                   R                  U R                  5        U R                  U R                   l        U R                  U R                   l        U $ r)   )r>   ra   rM   rÆ   rÅ   rc   rÇ   rC   )r   ÚtypeÚvaluer“   s       r%   r–   ÚCapturingLogHandler.__exit__Ê  sU   € Ø�‰×!Ñ! $Ô'Ø�‰×Ñ˜T×0Ñ0Ô1Ø#×5Ñ5ˆ�‰ÔØ $× 7Ñ 7ˆ�‰Ôàˆr'   c                 ó:   • U R                   R                  U5        g r)   )rÂ   r_   )r   r.   s     r%   ÚemitÚCapturingLogHandler.emitÒ  s   € Ø�‰×Ñ˜FÕ#r'   c                 ó¼   • SS K nUR                  U5      nU R                   H)  nUR                  UR	                  5       5      (       d  M)    g   Uc  SU-  n U5       e)Nr   Tz(Pattern '%s' not found in logger records)ÚreÚcompilerÂ   ÚsearchÚ
getMessage)r   Úregexprp   rÑ   ÚpatternÚrs         r%   ÚassertRegexÚCapturingLogHandler.assertRegexÕ  sS   € Ûà—*‘*˜VÓ$ˆØ—”ˆAØ�~‰~˜aŸl™l›n×-Ó-Ùñ ð ‰;Ø<¸vÑEˆCØ�#‹ˆqr'   )r>   rÅ   rÆ   rÇ   rÂ   r)   )r0   r1   r2   r3   r   r�   r–   rÎ   rØ   r5   r6   r7   s   @r%   rÀ   rÀ   µ  s!   ø† õ!ò
òò$÷	ò 	r'   rÀ   c                   ó(   • \ rS rSrSr\S 5       rSrg)ÚLogMixiniá  aÚ  Mixin class that adds logging functionality to another class.

You can define a new class that subclasses from ``LogMixin`` as well as
other base classes through multiple inheritance.
All instances of that class will have a ``log`` property that returns
a ``logging.Logger`` named after their respective ``<module>.<class>``.

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
c                 óè   • [        U S5      (       dV  SR                  U R                  R                  U R                  R                  45      n[
        R                  " U5      U l        U R                  $ )NÚ_logrY   )ÚhasattrrN   r$   r1   r0   r   rF   rÝ   )r   rH   s     r%   r�   ÚLogMixin.logý  sR   € ä�t˜V×$Ñ$Ø—8‘8˜TŸ^™^×6Ñ6¸¿¹×8OÑ8OÐPÓQˆDÜ×)Ò)¨$Ó/ˆDŒIØ�y‰yÐr'   )rÝ   N)r0   r1   r2   r3   r4   Úpropertyr�   r5   rš   r'   r%   rÛ   rÛ   á  s   † ñð6 ñó ór'   rÛ   c                 ó>   • [         R                  " U < SU< 3USS9  g)z:Raise a warning about deprecated function argument 'name'.ú is deprecated; é   ©ÚcategoryÚ
stacklevelN)ÚwarningsÚwarn)rH   rp   rå   s      r%   ÚdeprecateArgumentré     s   € ä‡M‚M«D²#Ð6ÀÐVWÓXr'   c                 ó   ^ ^• UU 4S jnU$ )zBDecorator to raise a warning when a deprecated function is called.c                 ó6   >^ • [        T 5      UU U4S j5       nU$ )Nc                  ób   >• [         R                  " TR                  < ST< 3TSS9  T" U 0 UD6$ )Nrâ   é   rä   )rç   rè   r0   )r›   rP   rå   r�   rp   s     €€€r%   rž   Ú5deprecateFunction.<locals>.decorator.<locals>.wrapper  s3   ø€ ä�MŠMØ*.¯-¬-ºÐ=Ø!Øòñ
 ˜Ð( Ñ(Ð(r'   r   )r�   rž   rå   rp   s   ` €€r%   Ú	decoratorÚ$deprecateFunction.<locals>.decorator  s    ù€ Ü	ˆt‹ö	)ó 
ð	)ð ˆr'   rš   )rp   rå   rï   s   `` r%   ÚdeprecateFunctionrñ   
  s   ù€ ö
ð Ðr'   Ú__main__)Úoptionflags)rB   )!Úsysr   r¯   Ú	functoolsr   Úcollections.abcr   r   rç   r   r
   rs   r   Ú	Formatterr   rV   rG   Úobjectrl   ÚFilterr´   ÚHandlerrÀ   rÛ   ÚUserWarningré   rñ   r0   ÚdoctestÚexitÚtestmodÚELLIPSISÚfailedrš   r'   r%   Ú<module>r     sà   ðÛ 
Û Û Ý ß -Û Ý  ð �]‰]€
ð
 
&ØØñ€ô@:�W×&Ñ&ô @:òF`@ôF&$ôRa%ˆFô a%ôH)�W—^‘^ô )ôX)˜'Ÿ/™/ô )ôX!ˆvô !ðH +6ô Yð
 %0ô ð$ ˆzÓÛà‡H‚HˆW�_Š_¨×)9Ñ)9Ñ:×AÑAÕBð r'   