Skip to content

Commit c3f5c52

Browse files
Use monkey patching
1 parent 8b2b96b commit c3f5c52

2 files changed

Lines changed: 22 additions & 3 deletions

File tree

src/fastapi_cli/cli.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,5 @@ def run(
424424
forwarded_allow_ips=forwarded_allow_ips,
425425
)
426426

427-
428427
def main() -> None:
429428
app()

src/fastapi_cli/utils/cli.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,35 @@
44
from rich_toolkit import RichToolkit, RichToolkitTheme
55
from rich_toolkit.styles import TaggedStyle
66
from uvicorn.logging import DefaultFormatter
7+
from uvicorn.server import Server
8+
9+
# Patch uvicorn's Server.handle_exit to set a flag when SIGINT is received
10+
_original_handle_exit = Server.handle_exit
11+
_sigint_received = False
12+
13+
14+
def _patched_handle_exit(self: Server, sig: int, frame: Any) -> None:
15+
global _sigint_received
16+
_sigint_received = True
17+
_original_handle_exit(self, sig, frame)
18+
19+
20+
Server.handle_exit = _patched_handle_exit # type: ignore[method-assign]
721

822

923
class CustomFormatter(DefaultFormatter):
1024
def __init__(self, *args: Any, **kwargs: Any) -> None:
1125
super().__init__(*args, **kwargs)
1226
self.toolkit = get_rich_toolkit()
1327

14-
def formatMessage(self, record: logging.LogRecord) -> str:
15-
return self.toolkit.print_as_string(record.getMessage(), tag=record.levelname)
28+
def format(self, record: logging.LogRecord) -> str:
29+
global _sigint_received
30+
result = self.toolkit.print_as_string(record.getMessage(), tag=record.levelname)
31+
# Prepend newline after ^C to fix alignment
32+
if _sigint_received:
33+
_sigint_received = False
34+
result = "\n" + result
35+
return result
1636

1737

1838
def get_uvicorn_log_config() -> Dict[str, Any]:

0 commit comments

Comments
 (0)