Skip to content

Commit c0f15cb

Browse files
committed
feat: add ui.set_level() and ui.is_verbose()
Provide a single way to reset the whole module for tests.
1 parent 09fd615 commit c0f15cb

File tree

6 files changed

+59
-15
lines changed

6 files changed

+59
-15
lines changed

ggshield/cmd/utils/debug.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,3 @@ def setup_debug_mode(*, filename: Optional[str] = None) -> None:
3333

3434
logger.debug("args=%s", sys.argv)
3535
logger.debug("py-gitguardian=%s", pygitguardian.__version__)
36-
37-
38-
def reset_debug_mode() -> None:
39-
"""
40-
This function is used by unit-tests.
41-
"""
42-
log_utils.reset_log_handler()
43-
ui.set_level(ui.Level.INFO)

ggshield/core/ui/__init__.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,18 @@ def set_level(level: Level) -> None:
2121
_ui.level = level
2222

2323

24+
def get_level() -> Level:
25+
return _ui.level
26+
27+
28+
def is_verbose() -> bool:
29+
"""
30+
Convenient function to check if verbose messages are visible. Use this if displaying
31+
verbose messages is costly (for example displaying a list of files)
32+
"""
33+
return _ui.level >= Level.VERBOSE
34+
35+
2436
def set_ui(ui: GGShieldUI) -> None:
2537
"""Change the GGShieldUI instance used to output messages. Takes care of
2638
carrying existing settings from the old instance to the new one."""
@@ -67,3 +79,8 @@ def create_scanner_ui(total: int, verbose: bool = False) -> ScannerUI:
6779

6880
def create_message_only_scanner_ui(verbose: bool = False) -> ScannerUI:
6981
return _ui.create_message_only_scanner_ui(verbose=verbose)
82+
83+
84+
def _reset_ui():
85+
global _ui
86+
_ui = PlainTextGGShieldUI()

ggshield/core/ui/log_utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def set_log_handler(filename: Optional[str] = None) -> None:
4444
logging.basicConfig(level=logging.DEBUG, force=True, handlers=[_log_handler])
4545

4646

47-
def reset_log_handler():
47+
def _reset_log_handler():
4848
"""Remove our log handler. Used by unit tests."""
4949
global _log_handler
5050
if _log_handler:

ggshield/core/ui/reset.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from . import _reset_ui
2+
from .log_utils import _reset_log_handler
3+
4+
5+
def reset():
6+
"""
7+
This function is only used by unit-tests to reset the UI
8+
"""
9+
_reset_log_handler()
10+
_reset_ui()

tests/unit/conftest.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
from pygitguardian.models import ScanResult, SecretIncident
1515
from requests.utils import DEFAULT_CA_BUNDLE_PATH, extract_zipped_paths
1616

17-
from ggshield.cmd.utils.debug import reset_debug_mode
1817
from ggshield.core.cache import Cache
18+
from ggshield.core.ui.reset import reset
1919
from ggshield.core.url_utils import dashboard_to_api_url
2020
from ggshield.utils.git_shell import (
2121
_get_git_path,
@@ -706,15 +706,12 @@ def clear_cache():
706706

707707

708708
@pytest.fixture(autouse=True)
709-
def _reset_debug_mode():
709+
def _reset_ui_fixture():
710710
"""
711711
Enabling debug mode has global side effects. Reset it to ensure a test touching the
712712
log or debug configuration does not affect other tests.
713713
"""
714-
try:
715-
yield
716-
finally:
717-
reset_debug_mode()
714+
reset()
718715

719716

720717
SECRET_INCIDENT_MOCK = SecretIncident.from_dict(

tests/unit/core/ui/test_ui.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
from typing import Optional
2+
3+
import pytest
4+
5+
from ggshield.core import ui
6+
from ggshield.core.ui import Level
7+
8+
9+
def test_level():
10+
assert ui.get_level() == Level.INFO
11+
12+
ui.set_level(Level.VERBOSE)
13+
assert ui.get_level() == Level.VERBOSE
14+
15+
16+
@pytest.mark.parametrize(
17+
("level", "expected"),
18+
(
19+
(None, False),
20+
(Level.VERBOSE, True),
21+
(Level.DEBUG, True),
22+
(Level.ERROR, False),
23+
),
24+
)
25+
def test_is_verbose(level: Optional[Level], expected: bool):
26+
if level:
27+
ui.set_level(level)
28+
assert ui.is_verbose() == expected

0 commit comments

Comments
 (0)