diff options
author | Takeshi KOMIYA <i.tkomiya@gmail.com> | 2020-03-21 13:39:22 +0300 |
---|---|---|
committer | Takeshi KOMIYA <i.tkomiya@gmail.com> | 2020-03-21 13:48:55 +0300 |
commit | 6f60864d03d3744c7cf8906c8808a3c8f17117f1 (patch) | |
tree | c2dba5f08981b12741543c9221342bfc8828074c /sphinx/util/logging.py | |
parent | 0c45776c07583ca237a134f176d9be2e0aa7043f (diff) |
Add "once" option to logger.warning()
Diffstat (limited to 'sphinx/util/logging.py')
-rw-r--r-- | sphinx/util/logging.py | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/sphinx/util/logging.py b/sphinx/util/logging.py index 6827fd5cd..fbf161ec0 100644 --- a/sphinx/util/logging.py +++ b/sphinx/util/logging.py @@ -118,7 +118,7 @@ class SphinxWarningLogRecord(SphinxLogRecord): class SphinxLoggerAdapter(logging.LoggerAdapter): """LoggerAdapter allowing ``type`` and ``subtype`` keywords.""" - KEYWORDS = ['type', 'subtype', 'location', 'nonl', 'color'] + KEYWORDS = ['type', 'subtype', 'location', 'nonl', 'color', 'once'] def log(self, level: Union[int, str], msg: str, *args: Any, **kwargs: Any) -> None: if isinstance(level, int): @@ -440,6 +440,26 @@ class MessagePrefixFilter(logging.Filter): return True +class OnceFilter(logging.Filter): + """Show the message only once.""" + + def __init__(self, name: str = '') -> None: + super().__init__(name) + self.messages = {} # type: Dict[str, List] + + def filter(self, record: logging.LogRecord) -> bool: + once = getattr(record, 'once', '') + if not once: + return True + else: + params = self.messages.setdefault(record.msg, []) + if record.args in params: + return False + + params.append(record.args) + return True + + class SphinxLogRecordTranslator(logging.Filter): """Converts a log record to one Sphinx expects @@ -557,6 +577,7 @@ def setup(app: "Sphinx", status: IO, warning: IO) -> None: warning_handler.addFilter(WarningSuppressor(app)) warning_handler.addFilter(WarningLogRecordTranslator(app)) warning_handler.addFilter(WarningIsErrorFilter(app)) + warning_handler.addFilter(OnceFilter()) warning_handler.setLevel(logging.WARNING) warning_handler.setFormatter(ColorizeFormatter()) |