o uaG @sUdZddlZddlZddlmZddlmZddlmZm Z m Z m Z m Z m Z mZmZmZmZddlmZddlmZddlmZdd lmZdd lmZe rUdd lmZd Zd ZeddZ e e!e"fe#d<e $ej%ej%ej&ej'ej(eej)deddZ*e e"e"fe#d<e*$ej(eej)deddej&dej'dej)diZ+de!ddfddZ,de ej-ddfdd Z.Gd!d"d"ej-Z/Gd#d$d$e/Z0Gd%d&d&e/Z1Gd'ddej2Z3Gd(d)d)ej4Z5Gd*d+d+ej4Z6Gd,d-d-ej7j8Z9ede ej:ddffd.d/Z;ede e9ddffd0d1Zde d6fd7d8Z?ed9e!de d6fd:d;Z@Gdd?d?ejBZCd@e!dAe!dBe e!de>fdCdDZDGdEdFdFejBZEGdGdHdHejBZFGdIdJdJejBZGGdKdLdLejBZHGdMdNdNejBZIGdOdPdPejBZJGdQdRdReJZKGdSdTdTeJZLdUedee!fdVdWZMGdXdYdYejNZOGdZd[d[ZPGd\d]d]ZQd^d_d`edaeddfdbdcZRdS)ez sphinx.util.logging ~~~~~~~~~~~~~~~~~~~ Logging utility functions for Sphinx. :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. N) defaultdict)contextmanager) IO TYPE_CHECKINGAnyDict GeneratorListOptionalTupleTypeUnion)nodes)Nodeget_source_line) SphinxWarning)colorize)SphinxsphinxcCstjSN)loggingWARNINGrr5/usr/lib/python3/dist-packages/sphinx/util/logging.pysr LEVEL_NAMES)CRITICALSEVEREERRORrINFOVERBOSEDEBUGcCdS)Nrrrrrrr* VERBOSITY_MAP)rcCr$)Nbluerrrrrr1r%darkredreddarkgraynamereturnSphinxLoggerAdaptercCs"ttd|}d|_t|iS)aGet logger wrapped by :class:`sphinx.util.logging.SphinxLoggerAdapter`. Sphinx logger always uses ``sphinx.*`` namespace to be independent from settings of root logger. It ensures logging is consistent even if a third-party extension or imported application resets logger settings. Example usage:: >>> from sphinx.util import logging >>> logger = logging.getLogger(__name__) >>> logger.info('Hello, this is an extension!') Hello, this is an extension! .F)r getLogger NAMESPACEdisabledr/)r-loggerrrrr19s r1recordscCs@|D]}||_d|_t|dd}t|tjrt||_qdS)zConvert LogRecord serializable.rlocationN) getMessagemsgargsgetattr isinstancerrget_node_locationr6)r5rr6rrrconvert_serializableOs    r>cs8eZdZUdZdZdZeed<deffdd Z Z S)SphinxLogRecordz$Log record class supporting locationNr6r.csFt}t|dd}|rd||j|f}|S|j|vr!|j|}|S)Nr6z%s: %s%s)superr7r:prefix)selfmessager6 __class__rrr7`s   zSphinxLogRecord.getMessage) __name__ __module__ __qualname____doc__rBr6r__annotations__strr7 __classcell__rrrErr?[s  r?c@eZdZdZdZdS)SphinxInfoLogRecordz)Info log record class supporting locationr@NrGrHrIrJrBrrrrrOkrOc@rN)SphinxWarningLogRecordz,Warning log record class supporting locationz WARNING: NrPrrrrrRprQrRc seZdZdZgdZdeeefdedededdf fd d Z dedededdfd d Z dede de ee ffd dZ dejddfddZZS)r/z9LoggerAdapter allowing ``type`` and ``subtype`` keywords.)typesubtyper6nonlcoloroncelevelr8r9kwargsr.NcsRt|trtj||g|Ri|dSt|}tj||g|Ri|dSr)r;intrAlogr)rCrXr8r9rYlevelnorErrr[ys   zSphinxLoggerAdapter.logcOs|jt|g|Ri|dSr)r[r")rCr8r9rYrrrverboseszSphinxLoggerAdapter.verbosecCs6|di}|jD] }||vr||||<q ||fS)Nextra) setdefaultKEYWORDSpop)rCr8rYr^keywordrrrprocesss  zSphinxLoggerAdapter.processrecordcCs|j|dSr)r4handlerCrdrrrrezSphinxLoggerAdapter.handle)rGrHrIrJr`r rZrLrr[r]rr rcr LogRecordrerMrrrErr/us*c@seZdZdZdS)WarningStreamHandlerzStreamHandler for warnings.N)rGrHrIrJrrrrrisrics,eZdZdZdejddffdd ZZS)NewLineStreamHandlerzAStreamHandler which switches line terminator by record.nonl flag.rdr.NcsLz|t|ddrd|_t|Wd|_|dSd|_|w)NrUFr@ )acquirer: terminatorrAemitreleaserfrErrrns   zNewLineStreamHandler.emit)rGrHrIrJrrhrnrMrrrErrjs rjcsxeZdZUdZeejed<dfdd Zdejde fdd Z dd d Z d ej ddfd dZ deejfddZZS) MemoryHandlerzHandler buffering all logs.bufferr.NcstddS)N)rA__init__rCrErrrsrgzMemoryHandler.__init__rdcCr$)NFrrfrrr shouldFlushszMemoryHandler.shouldFlushcCsdSrrrtrrrflushszMemoryHandler.flushr4cCs>|z|jD]}||qg|_W|dS|wr)rlrqrero)rCr4rdrrrflushTos   zMemoryHandler.flushTocCs|jg}|_|Sr)rq)rCrqrrrclearszMemoryHandler.clearr.N)rGrHrIrJr rrhrKrsboolrurvLoggerrwrxrMrrrErrps   rpc cstt}t}|tjz:g}|jddD]}t|tr*| || |q| ||VW| ||D]}| |q;| |dS| ||D]}| |qQ| |w)zgContext manager to postpone logging warnings temporarily. Similar to :func:`pending_logging`. N) rr1r2rpsetLevelrhandlersr;ri removeHandlerappend addHandlerrwr4 memhandlerr}handlerrrrpending_warningss*           rc cstt}t}z0g}|jddD] }||||q|||VW|||D]}||q0dS|||D]}||qAw)zContext manager to suppress logging all logs temporarily. For example:: >>> with suppress_logging(): >>> logger.warning('Warning message!') # suppressed >>> some_long_process() >>> N)rr1r2rpr}r~rrrrrrsuppress_loggings$        rc csftt}z&t }|VWdn1swYW||dSW||dS||w)a$Context manager to postpone logging all logs temporarily. For example:: >>> with pending_logging(): >>> logger.warning('Warning message!') # not flushed yet >>> some_long_process() >>> Warning message! # the warning is flushed here N)rr1r2rrw)r4rrrrpending_loggings rTskipNNNc csztt}|durdVdSz!t}|jD] }|jd|qdVW|jD]}||q'dS|jD]}||q4w)z9Context manager to skip WarningIsErrorFilter temporarily.FNr)rr1r2DisableWarningIsErrorFilterr}filtersinsert removeFilter)rr4disablerrrrrskip_warningiserrors      rrBc cstt}d}|jD] }t|tr|}nq dVdSd}|jD] }t|tr,|}nq!|rCz|j}||_dVW||_dS||_wt|}z| |dVW| |dS| |w)zContext manager to prepend prefix to all warning log records temporarily. For example:: >>> with prefixed_warnings("prefix:"): >>> logger.warning('Warning message!') # => prefix: Warning message! .. versionadded:: 2.0 N) rr1r2r}r;rirMessagePrefixFilterrB addFilterr)rBr4warning_handlerr prefix_filter_filterpreviousrrrprefixed_warnings"s6      rc@s,eZdZdddZededfddZdS) LogCollectorr.NcCs g|_dSr)logsrtrrrrsQ zLogCollector.__init__rccs>t}dV||_WddS1swYdSr)rrxr)rCrrrrcollectTs  "zLogCollector.collectry)rGrHrIrsrrrrrrrrPs rc@$eZdZdZdejdefddZdS) InfoFilterz"Filter error and warning messages.rdr.cCs|jtjkrdSdS)NTF)r\rrrfrrrfilter_s zInfoFilter.filterNrGrHrIrJrrhrzrrrrrr\rrSrTsuppress_warningscCst|durdS|D]/}d|vr|dd\}}n|d}}||kr7|dur(|dus4|dus4||ks4|dkr7dSqdS)z/Check whether the warning is suppressed or not.NFr0r'*T)split)rSrTr warning_typetarget subtargetrrris_suppressed_warningfs rc6eZdZdZd fdd Zdejdefd d ZZ S) WarningSuppressorz#Filter logs by `suppress_warnings`.apprr.Nc||_tdSrrrArsrCrrErrrszWarningSuppressor.__init__rdcCsbt|dd}t|dd}z|jjj}Wn tyg}Ynwt|||r'dS|jjd7_dS)NrSrTFr'T)r:rconfigrAttributeErrorr _warncount)rCrdrSrTrrrrrs    zWarningSuppressor.filterrrr.N rGrHrIrJrsrrhrzrrMrrrErr}rcr) WarningIsErrorFilterz#Raise exception if warning emitted.rrr.NcrrrrrErrrsrzWarningIsErrorFilter.__init__rdc Cst|ddrdS|jjrGt|dd}z|j|j}Wnttfy(|j}Ynw|r6t|dt|}nt|}|j durE||j d|dS)Nskip_warningsiserrorFTr6r@:r') r:rwarningiserrorr8r9 TypeError ValueErrorrrLexc_info)rCrdr6rDexcrrrrs     zWarningIsErrorFilter.filterrrrrrErrrrc@r)rz6Disable WarningIsErrorFilter if this filter installed.rdr.cCs d|_dS)NT)rrfrrrrsz"DisableWarningIsErrorFilter.filterNrrrrrrrrcs>eZdZdZdeddffdd Zdejdefdd Z Z S) rz"Prepend prefix to all log records.rBr.Ncrr)rBrArs)rCrBrErrrsrzMessagePrefixFilter.__init__rdcCs|jr |jd|j|_dS)N T)rBr8rfrrrrszMessagePrefixFilter.filter rGrHrIrJrLrsrrhrzrrMrrrErrsrcs@eZdZdZd deddffdd Zdejdefd d Z Z S) OnceFilterzShow the message only once.r@r-r.Ncst|i|_dSr)rArsmessages)rCr-rErrrss  zOnceFilter.__init__rdcCsBt|dd}|s dS|j|jg}|j|vrdS||jdS)NrWr@TF)r:rr_r8r9r)rCrdrWparamsrrrrs   zOnceFilter.filter)r@rrrrErrsrcsDeZdZUdZeejed<d fdd Zd e de fd d Z Z S) SphinxLogRecordTranslatorzConverts a log record to one Sphinx expects * Make a instance of SphinxLogRecord * docname to path if location given LogRecordClassrrr.NcrrrrrErrrsrz"SphinxLogRecordTranslator.__init__rdcCst|tjr |j|_t|dd}t|tr>|\}}|r+|r+d|jj ||f|_ dS|r9d|jj ||_ dSd|_ dSt|t j rKt ||_ dS|r[d|vr[d|jj ||_ dS)Nr6%s:%sz%srT)r;rrhrrFr:tuplerenvdoc2pathr6rrr<)rCrdr6docnamelinenorrrrs&      z SphinxLogRecordTranslator.filterr) rGrHrIrJr rrhrKrsrRrzrrMrrrErrs rc@eZdZdZeZdS)InfoLogRecordTranslatorz/LogRecordTranslator for INFO level log records.N)rGrHrIrJrOrrrrrrrQrc@r)WarningLogRecordTranslatorz2LogRecordTranslator for WARNING level log records.N)rGrHrIrJrRrrrrrrrQrnodecCs<t|\}}|r|rd||fS|rd|S|rd|SdS)Nrz%s:z :%sr)rsourcelinerrrr<s  r<cs(eZdZdejdeffdd ZZS)ColorizeFormatterrdr.cs>t|}t|dd}|durt|j}|rt||S|S)NrV)rAformatr: COLOR_MAPgetr\r)rCrdrDrVrErrrs    zColorizeFormatter.format)rGrHrIrrhrLrrMrrrErrs rc@s>eZdZdZdeddfddZdeddfdd Zd d d ZdS) SafeEncodingWriterz7Stream writer which ignores UnicodeEncodeError silentlystreamr.NcCs||_t|ddp d|_dS)Nencodingascii)rr:r)rCrrrrrs#szSafeEncodingWriter.__init__datac CsFz |j|WdSty"|j||jd|jYdSw)Nreplace)rwriteUnicodeEncodeErrorencoderdecoderCrrrrr's  $zSafeEncodingWriter.writecCst|jdr |jdSdS)Nrv)hasattrrrvrtrrrrv/s zSafeEncodingWriter.flushry) rGrHrIrJrrsrLrrvrrrrr!s rc@s8eZdZdZdddeddfddZd eddfd d ZdS) LastMessagesWriterzBStream writer storing last 10 messages in memory to save trackbackrrrr.NcCs ||_dSr)r)rCrrrrrrs6rzLastMessagesWriter.__init__rcCs|jj|dSr)r messagelogrrrrrr9szLastMessagesWriter.write)rGrHrIrJrrsrLrrrrrr4srrrstatuswarningcCs0tt}|tjd|_|jddD]}||qtt |}| t | t ||t |j|ttt |}| t|| t|| t|| t|tj|ttt||}| t |t |j|t||||||dS)zSetup root logger for SphinxFN)rr1r2r|r# propagater}r~rjrrrrr& verbosity setFormatterrrirrrrr StreamHandlerrr)rrrr4r info_handlerrmessagelog_handlerrrrsetup=s0              r)T)SrJrlogging.handlers collectionsr contextlibrtypingrrrrrr r r r r docutilsrdocutils.nodesrdocutils.utilsr sphinx.errorsrsphinx.util.consolersphinx.applicationrr2r"rrLrZrKupdaterr rr!r#r&rr1rhr>r?rOrR LoggerAdapterr/rrirjr}BufferingHandlerrpHandlerrrrrzrrrFilterrrrrrrrrrrr< Formatterrrrrrrrrs   0        -   "