Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/venvalid/utils_errors.py
Original file line number Diff line number Diff line change
@@ -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}")
7 changes: 7 additions & 0 deletions src/venvalid/validator.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from src.venvalid.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
40 changes: 40 additions & 0 deletions tests/test_utils_errors.py
Original file line number Diff line number Diff line change
@@ -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
15 changes: 15 additions & 0 deletions tests/test_validator.py
Original file line number Diff line number Diff line change
@@ -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)