Coverage for src / ezqt_app / utils / diagnostics.py: 85.71%
17 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-06 13:12 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-06 13:12 +0000
1# ///////////////////////////////////////////////////////////////
2# UTILS.DIAGNOSTICS - Unified warning helpers
3# Project: ezqt_app
4# ///////////////////////////////////////////////////////////////
6"""Helpers to standardize logger/printer warning outputs."""
8from __future__ import annotations
10# ///////////////////////////////////////////////////////////////
11# IMPORTS
12# ///////////////////////////////////////////////////////////////
13# Third-party imports
14from ezplog.lib_mode import get_logger
16# Local imports
17from .printer import get_printer
19_LOGGER = get_logger("ezqt_app")
22# ///////////////////////////////////////////////////////////////
23# FUNCTIONS
24# ///////////////////////////////////////////////////////////////
25def _format_log_message(code: str, message: str, error: Exception | None = None) -> str:
26 """Build a codified warning line for file logs."""
27 if error is None:
28 return f"[{code}] {message}"
29 return f"[{code}] {message}: {error}"
32def warn_tech(code: str, message: str, error: Exception | None = None) -> None:
33 """Log a technical warning (logger only, no console output)."""
34 _LOGGER.warning(_format_log_message(code=code, message=message, error=error))
37def warn_user(
38 code: str,
39 user_message: str,
40 *,
41 log_message: str | None = None,
42 error: Exception | None = None,
43 show_error_details_in_verbose: bool = True,
44) -> None:
45 """Emit a user-facing warning and a codified log warning.
47 Console output should stay concise and readable for end users,
48 while logs keep technical details and stable error codes.
49 """
50 _LOGGER.warning(
51 _format_log_message(code=code, message=log_message or user_message, error=error)
52 )
53 get_printer().warning(user_message)
55 if error is not None and show_error_details_in_verbose: 55 ↛ 56line 55 didn't jump to line 56 because the condition on line 55 was never true
56 get_printer().verbose_msg(f"[{code}] {type(error).__name__}: {error}")
59def info_user(message: str) -> None:
60 """Emit a user-facing informational message (console only)."""
61 get_printer().info(message)