From 4a57e9991095d4e211a72982a3457c4a51f0468c Mon Sep 17 00:00:00 2001 From: Felipe Castro <146021799+castroofelipee@users.noreply.github.com> Date: Sun, 17 Aug 2025 11:03:57 -0300 Subject: [PATCH 1/3] create validator for env variables --- src/venvalid/validator.py | 7 +++++++ tests/test_validator.py | 15 +++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 src/venvalid/validator.py create mode 100644 tests/test_validator.py diff --git a/src/venvalid/validator.py b/src/venvalid/validator.py new file mode 100644 index 0000000..9487c58 --- /dev/null +++ b/src/venvalid/validator.py @@ -0,0 +1,7 @@ +from .errors import EnvSafeError + + +def validate_env_var(name: str, value: str | None): + if not value: + raise EnvSafeError(f"Missing required environment variable: {name}") + return True diff --git a/tests/test_validator.py b/tests/test_validator.py new file mode 100644 index 0000000..256e2aa --- /dev/null +++ b/tests/test_validator.py @@ -0,0 +1,15 @@ +import pytest + +from src.venvalid.errors import EnvSafeError +from src.venvalid.validator import validate_env_var + + +def test_validate_env_var_success(): + assert validate_env_var("API_KEY", "secret") is True + + +def test_validate_env_var_missing(): + with pytest.raises(EnvSafeError) as exc_info: + validate_env_var("API_KEY", None) + + assert "Missing required environment variable: API_KEY" in str(exc_info.value) From 461155bd32c78649ff38f91bac21f48ae65e1d47 Mon Sep 17 00:00:00 2001 From: Felipe Castro <146021799+castroofelipee@users.noreply.github.com> Date: Sun, 17 Aug 2025 11:04:42 -0300 Subject: [PATCH 2/3] add util helper to pretty type errors --- src/venvalid/utils_errors.py | 9 ++++++++ tests/test_utils_errors.py | 40 ++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 src/venvalid/utils_errors.py create mode 100644 tests/test_utils_errors.py diff --git a/src/venvalid/utils_errors.py b/src/venvalid/utils_errors.py new file mode 100644 index 0000000..3dd0c78 --- /dev/null +++ b/src/venvalid/utils_errors.py @@ -0,0 +1,9 @@ +def pretty_print_error(error: Exception) -> None: + """Pretty print errors using rich if available, else fallback to plain text""" + try: + from rich.console import Console + + console = Console() + console.print(f"[bold red]Error:[/bold red] {error}") + except ImportError: + print(f"Error: {error}") diff --git a/tests/test_utils_errors.py b/tests/test_utils_errors.py new file mode 100644 index 0000000..6325aeb --- /dev/null +++ b/tests/test_utils_errors.py @@ -0,0 +1,40 @@ +import sys +import types + +import src.venvalid.utils_errors as utils_errors + + +class DummyConsole: + def __init__(self): + self.last_message = None + + def print(self, msg): + self.last_message = msg + + +def test_pretty_print_error_with_rich(monkeypatch): + dummy_console = DummyConsole() + + fake_rich_pkg = types.ModuleType("rich") + fake_rich_pkg.__path__ = [] # mark as package + + fake_console_mod = types.ModuleType("rich.console") + setattr(fake_console_mod, "Console", lambda: dummy_console) + + monkeypatch.setitem(sys.modules, "rich", fake_rich_pkg) + monkeypatch.setitem(sys.modules, "rich.console", fake_console_mod) + + utils_errors.pretty_print_error(ValueError("boom")) + + assert dummy_console.last_message is not None + assert "boom" in dummy_console.last_message + + +def test_pretty_print_error_without_rich(monkeypatch, capsys): + monkeypatch.delitem(sys.modules, "rich.console", raising=False) + monkeypatch.delitem(sys.modules, "rich", raising=False) + + utils_errors.pretty_print_error(ValueError("fail")) + + out = capsys.readouterr().out + assert "Error: fail" in out From 3c4024d25d762a5bf27c1b6c7f26adf759c4f3bb Mon Sep 17 00:00:00 2001 From: Felipe Castro <146021799+castroofelipee@users.noreply.github.com> Date: Sun, 17 Aug 2025 11:21:55 -0300 Subject: [PATCH 3/3] fix relative paths --- src/venvalid/validator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/venvalid/validator.py b/src/venvalid/validator.py index 9487c58..b5aaa77 100644 --- a/src/venvalid/validator.py +++ b/src/venvalid/validator.py @@ -1,4 +1,4 @@ -from .errors import EnvSafeError +from src.venvalid.errors import EnvSafeError def validate_env_var(name: str, value: str | None):