diff --git a/detect_secrets/util/color.py b/detect_secrets/util/color.py index 9d9f869b0..12c114bc3 100644 --- a/detect_secrets/util/color.py +++ b/detect_secrets/util/color.py @@ -1,4 +1,11 @@ from enum import Enum +from os import getenv +from sys import stdout + + +def supports_ansi_colors() -> bool: + return (getenv('CLICOLOR', '1') != '0' and stdout.isatty())\ + or getenv('CLICOLOR_FORCE', '0') != '0' class AnsiColor(Enum): @@ -11,6 +18,9 @@ class AnsiColor(Enum): def colorize(text: str, color: AnsiColor) -> str: + if not supports_ansi_colors(): + return text + return '\x1b{}{}\x1b{}'.format( color.value, text, diff --git a/tests/util/color_test.py b/tests/util/color_test.py new file mode 100644 index 000000000..fc70a1b24 --- /dev/null +++ b/tests/util/color_test.py @@ -0,0 +1,44 @@ +from sys import stdout + +from detect_secrets.util.color import AnsiColor +from detect_secrets.util.color import colorize + + +def colorize_enabled(text: str, color: AnsiColor) -> str: + return '\x1b{}{}\x1b{}'.format( + color.value, + text, + AnsiColor.RESET.value, + ) + + +def expect_enabled(text: str): + for color in AnsiColor: + expected = colorize_enabled(text, color) + assert colorize(text, color) == expected + + +def expect_disabled(text: str): + for color in AnsiColor: + assert colorize(text, color) == text + + +def test_colorize_enabled_terminal_disabled_piped(monkeypatch): + monkeypatch.setenv('CLICOLOR', '1') + + if stdout.isatty(): + expect_enabled('abc') + else: + expect_disabled('abc') + + +def test_colorize_enabled_force(monkeypatch): + monkeypatch.setenv('CLICOLOR_FORCE', '1') + + expect_enabled('abc') + + +def test_colorize_disabled(monkeypatch): + monkeypatch.setenv('CLICOLOR', '0') + + expect_disabled('abc')