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

1# /////////////////////////////////////////////////////////////// 

2# UTILS.DIAGNOSTICS - Unified warning helpers 

3# Project: ezqt_app 

4# /////////////////////////////////////////////////////////////// 

5 

6"""Helpers to standardize logger/printer warning outputs.""" 

7 

8from __future__ import annotations 

9 

10# /////////////////////////////////////////////////////////////// 

11# IMPORTS 

12# /////////////////////////////////////////////////////////////// 

13# Third-party imports 

14from ezplog.lib_mode import get_logger 

15 

16# Local imports 

17from .printer import get_printer 

18 

19_LOGGER = get_logger("ezqt_app") 

20 

21 

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}" 

30 

31 

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)) 

35 

36 

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. 

46 

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) 

54 

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}") 

57 

58 

59def info_user(message: str) -> None: 

60 """Emit a user-facing informational message (console only).""" 

61 get_printer().info(message)