Thread RP_DEBUG-driven logging through input, detection, rendering, and pager decisions so CLI behavior is inspectable without polluting stdout. Add focused coverage for debug wiring, env parsing, and stderr-only output.
41 lines
1.1 KiB
Python
41 lines
1.1 KiB
Python
"""Debug logging helpers for rp."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
from collections.abc import Callable, Mapping
|
|
|
|
from rich.console import Console
|
|
from rich.text import Text
|
|
|
|
DEBUG_ENV_VAR = "RP_DEBUG"
|
|
_FALSE_DEBUG_VALUES = {"", "0", "false", "no", "off"}
|
|
|
|
type DebugLogger = Callable[[str], None]
|
|
|
|
|
|
def env_debug_enabled(env: Mapping[str, str] | None = None) -> bool:
|
|
"""Return whether debug logging is enabled via ``RP_DEBUG``."""
|
|
source = os.environ if env is None else env
|
|
value = source.get(DEBUG_ENV_VAR)
|
|
if value is None:
|
|
return False
|
|
return value.strip().lower() not in _FALSE_DEBUG_VALUES
|
|
|
|
|
|
def make_debug_logger(console: Console, enabled: bool) -> DebugLogger | None:
|
|
"""Return a console-backed debug logger when debug mode is enabled."""
|
|
if not enabled:
|
|
return None
|
|
|
|
def _log(message: str) -> None:
|
|
console.print(Text.assemble(("[rp debug] ", "dim"), message))
|
|
|
|
return _log
|
|
|
|
|
|
def log_debug(debug: DebugLogger | None, message: str) -> None:
|
|
"""Emit a debug line when a debug logger is configured."""
|
|
if debug is not None:
|
|
debug(message)
|