Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/sphinx-doc/sphinx.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakeshi KOMIYA <i.tkomiya@gmail.com>2020-03-21 13:39:22 +0300
committerTakeshi KOMIYA <i.tkomiya@gmail.com>2020-03-21 13:48:55 +0300
commit6f60864d03d3744c7cf8906c8808a3c8f17117f1 (patch)
treec2dba5f08981b12741543c9221342bfc8828074c /sphinx/util/logging.py
parent0c45776c07583ca237a134f176d9be2e0aa7043f (diff)
Add "once" option to logger.warning()
Diffstat (limited to 'sphinx/util/logging.py')
-rw-r--r--sphinx/util/logging.py23
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())