Remove `sphinx.util.logging` from the no-any-generics whitelist

This commit is contained in:
Adam Turner 2025-01-22 23:48:43 +00:00
parent 3927b9e211
commit 2a411dcb53
2 changed files with 11 additions and 10 deletions

View File

@ -234,7 +234,6 @@ module = [
"sphinx.domains", "sphinx.domains",
"sphinx.domains.c", "sphinx.domains.c",
"sphinx.domains.cpp", "sphinx.domains.cpp",
"sphinx.util.logging",
"sphinx.util.parallel", "sphinx.util.parallel",
] ]
disallow_any_generics = false disallow_any_generics = false

View File

@ -16,7 +16,7 @@ from sphinx._cli.util.colour import colourise
from sphinx.errors import SphinxWarning from sphinx.errors import SphinxWarning
if TYPE_CHECKING: if TYPE_CHECKING:
from collections.abc import Iterator, Sequence, Set from collections.abc import Iterator, Mapping, Sequence, Set
from typing import IO, Any, NoReturn from typing import IO, Any, NoReturn
from docutils.nodes import Node from docutils.nodes import Node
@ -126,7 +126,7 @@ class SphinxWarningLogRecord(SphinxLogRecord):
return 'WARNING: ' return 'WARNING: '
class SphinxLoggerAdapter(logging.LoggerAdapter): class SphinxLoggerAdapter(logging.LoggerAdapter[logging.Logger]):
"""LoggerAdapter allowing ``type`` and ``subtype`` keywords.""" """LoggerAdapter allowing ``type`` and ``subtype`` keywords."""
KEYWORDS = ['type', 'subtype', 'location', 'nonl', 'color', 'once'] KEYWORDS = ['type', 'subtype', 'location', 'nonl', 'color', 'once']
@ -143,7 +143,7 @@ class SphinxLoggerAdapter(logging.LoggerAdapter):
def verbose(self, msg: str, *args: Any, **kwargs: Any) -> None: def verbose(self, msg: str, *args: Any, **kwargs: Any) -> None:
self.log(VERBOSE, msg, *args, **kwargs) self.log(VERBOSE, msg, *args, **kwargs)
def process(self, msg: str, kwargs: dict) -> tuple[str, dict]: # type: ignore[override] def process(self, msg: str, kwargs: dict[str, Any]) -> tuple[str, dict[str, Any]]: # type: ignore[override]
extra = kwargs.setdefault('extra', {}) extra = kwargs.setdefault('extra', {})
for keyword in self.KEYWORDS: for keyword in self.KEYWORDS:
if keyword in kwargs: if keyword in kwargs:
@ -201,13 +201,13 @@ class SphinxLoggerAdapter(logging.LoggerAdapter):
) )
class WarningStreamHandler(logging.StreamHandler): class WarningStreamHandler(logging.StreamHandler['SafeEncodingWriter']):
"""StreamHandler for warnings.""" """StreamHandler for warnings."""
pass pass
class NewLineStreamHandler(logging.StreamHandler): class NewLineStreamHandler(logging.StreamHandler['SafeEncodingWriter']):
"""StreamHandler which switches line terminator by record.nonl flag.""" """StreamHandler which switches line terminator by record.nonl flag."""
def emit(self, record: logging.LogRecord) -> None: def emit(self, record: logging.LogRecord) -> None:
@ -468,7 +468,9 @@ class OnceFilter(logging.Filter):
def __init__(self, name: str = '') -> None: def __init__(self, name: str = '') -> None:
super().__init__(name) super().__init__(name)
self.messages: dict[str, list] = {} self.messages: dict[
str, list[tuple[object, ...] | Mapping[str, object] | None]
] = {}
def filter(self, record: logging.LogRecord) -> bool: def filter(self, record: logging.LogRecord) -> bool:
once = getattr(record, 'once', '') once = getattr(record, 'once', '')
@ -577,7 +579,7 @@ class ColorizeFormatter(logging.Formatter):
class SafeEncodingWriter: class SafeEncodingWriter:
"""Stream writer which ignores UnicodeEncodeError silently""" """Stream writer which ignores UnicodeEncodeError silently"""
def __init__(self, stream: IO) -> None: def __init__(self, stream: IO[str]) -> None:
self.stream = stream self.stream = stream
self.encoding = getattr(stream, 'encoding', 'ascii') or 'ascii' self.encoding = getattr(stream, 'encoding', 'ascii') or 'ascii'
@ -599,14 +601,14 @@ class SafeEncodingWriter:
class LastMessagesWriter: class LastMessagesWriter:
"""Stream writer storing last 10 messages in memory to save trackback""" """Stream writer storing last 10 messages in memory to save trackback"""
def __init__(self, app: Sphinx, stream: IO) -> None: def __init__(self, app: Sphinx, stream: IO[str]) -> None:
self.app = app self.app = app
def write(self, data: str) -> None: def write(self, data: str) -> None:
self.app.messagelog.append(data) self.app.messagelog.append(data)
def setup(app: Sphinx, status: IO, warning: IO) -> None: def setup(app: Sphinx, status: IO[str], warning: IO[str]) -> None:
"""Setup root logger for Sphinx""" """Setup root logger for Sphinx"""
logger = logging.getLogger(NAMESPACE) logger = logging.getLogger(NAMESPACE)
logger.setLevel(logging.DEBUG) logger.setLevel(logging.DEBUG)