11
11
from io import StringIO
12
12
from logging import LogRecord
13
13
from pathlib import Path
14
+ from types import TracebackType
14
15
from typing import AbstractSet
15
16
from typing import Dict
16
17
from typing import final
17
18
from typing import Generator
19
+ from typing import Generic
18
20
from typing import List
19
21
from typing import Literal
20
22
from typing import Mapping
21
23
from typing import Optional
22
24
from typing import Tuple
25
+ from typing import Type
23
26
from typing import TYPE_CHECKING
24
27
from typing import TypeVar
25
28
from typing import Union
@@ -62,7 +65,7 @@ class DatetimeFormatter(logging.Formatter):
62
65
:func:`time.strftime` in case of microseconds in format string.
63
66
"""
64
67
65
- def formatTime (self , record : LogRecord , datefmt = None ) -> str :
68
+ def formatTime (self , record : LogRecord , datefmt : Optional [ str ] = None ) -> str :
66
69
if datefmt and "%f" in datefmt :
67
70
ct = self .converter (record .created )
68
71
tz = timezone (timedelta (seconds = ct .tm_gmtoff ), ct .tm_zone )
@@ -331,7 +334,7 @@ def add_option_ini(option, dest, default=None, type=None, **kwargs):
331
334
332
335
333
336
# Not using @contextmanager for performance reasons.
334
- class catching_logs :
337
+ class catching_logs ( Generic [ _HandlerType ]) :
335
338
"""Context manager that prepares the whole logging machinery properly."""
336
339
337
340
__slots__ = ("handler" , "level" , "orig_level" )
@@ -340,7 +343,7 @@ def __init__(self, handler: _HandlerType, level: Optional[int] = None) -> None:
340
343
self .handler = handler
341
344
self .level = level
342
345
343
- def __enter__ (self ):
346
+ def __enter__ (self ) -> _HandlerType :
344
347
root_logger = logging .getLogger ()
345
348
if self .level is not None :
346
349
self .handler .setLevel (self .level )
@@ -350,7 +353,12 @@ def __enter__(self):
350
353
root_logger .setLevel (min (self .orig_level , self .level ))
351
354
return self .handler
352
355
353
- def __exit__ (self , type , value , traceback ):
356
+ def __exit__ (
357
+ self ,
358
+ exc_type : Optional [Type [BaseException ]],
359
+ exc_val : Optional [BaseException ],
360
+ exc_tb : Optional [TracebackType ],
361
+ ) -> None :
354
362
root_logger = logging .getLogger ()
355
363
if self .level is not None :
356
364
root_logger .setLevel (self .orig_level )
@@ -421,7 +429,7 @@ def handler(self) -> LogCaptureHandler:
421
429
return self ._item .stash [caplog_handler_key ]
422
430
423
431
def get_records (
424
- self , when : " Literal[' setup', ' call', ' teardown']"
432
+ self , when : Literal [" setup" , " call" , " teardown" ]
425
433
) -> List [logging .LogRecord ]:
426
434
"""Get the logging records for one of the possible test phases.
427
435
@@ -742,7 +750,7 @@ def set_log_path(self, fname: str) -> None:
742
750
if old_stream :
743
751
old_stream .close ()
744
752
745
- def _log_cli_enabled (self ):
753
+ def _log_cli_enabled (self ) -> bool :
746
754
"""Return whether live logging is enabled."""
747
755
enabled = self ._config .getoption (
748
756
"--log-cli-level"
0 commit comments