Coverage for src / rhiza_tools / console.py: 95%

19 statements  

« prev     ^ index     » next       coverage.py v7.13.4, created at 2026-02-23 01:10 +0000

1"""Console output utilities for rhiza-tools CLI. 

2 

3Provides clean, user-facing output functions using typer.echo/secho, 

4which is the standard approach for Click/Typer-based CLIs. Loguru is 

5reserved for debug/diagnostic output and is only enabled when the user 

6passes --verbose. 

7 

8Usage in commands:: 

9 

10 from rhiza_tools.console import console 

11 

12 console.info("Current version: 1.0.0") 

13 console.success("Version bumped successfully!") 

14 console.warning("Branch is ahead of remote") 

15 console.error("pyproject.toml not found") 

16""" 

17 

18import sys 

19 

20import typer 

21from loguru import logger 

22 

23_verbose: bool = False 

24 

25 

26def configure(*, verbose: bool = False) -> None: 

27 """Configure console output and logging verbosity. 

28 

29 Removes loguru's default stderr handler so that loguru output is 

30 suppressed by default. When *verbose* is ``True``, a handler is 

31 re-added at DEBUG level. 

32 

33 This should be called once from the CLI callback before any command 

34 runs. 

35 

36 Args: 

37 verbose: If True, enable loguru debug output on stderr. 

38 """ 

39 global _verbose 

40 _verbose = verbose 

41 

42 # Remove all default loguru handlers (the default one logs to stderr at DEBUG) 

43 logger.remove() 

44 

45 if verbose: 

46 logger.add(sys.stderr, level="DEBUG") 

47 

48 

49def is_verbose() -> bool: 

50 """Return whether verbose mode is currently enabled.""" 

51 return _verbose 

52 

53 

54def info(message: str) -> None: 

55 """Print an informational message to stdout. 

56 

57 Args: 

58 message: The message to display. 

59 """ 

60 typer.echo(message) 

61 

62 

63def success(message: str) -> None: 

64 """Print a success message to stdout. 

65 

66 Args: 

67 message: The message to display. 

68 """ 

69 typer.echo(message) 

70 

71 

72def warning(message: str) -> None: 

73 """Print a warning message to stderr. 

74 

75 Args: 

76 message: The message to display. 

77 """ 

78 typer.secho(message, fg=typer.colors.YELLOW, err=True) 

79 

80 

81def error(message: str) -> None: 

82 """Print an error message to stderr. 

83 

84 Args: 

85 message: The message to display. 

86 """ 

87 typer.secho(message, fg=typer.colors.RED, err=True)