Private
Public Access
0
0

feat(theme-models): add ThemePalette/ThemeFile schema with TOML loader

This commit is contained in:
2026-06-04 22:31:22 -04:00
parent d21e96de8f
commit e2f698c4a3
4 changed files with 228 additions and 0 deletions
+48
View File
@@ -0,0 +1,48 @@
from pathlib import Path
import pytest
from src.theme_models import ThemeFile, ThemePalette, load_theme_file
FIXTURES = Path(__file__).parent / "fixtures" / "themes"
def test_load_minimal_theme_file():
p = FIXTURES / "minimal.toml"
theme = load_theme_file(p, scope="project")
assert theme.syntax_palette == "dark"
assert theme.palette.window_bg == (10, 20, 30)
assert theme.palette.text == (200, 200, 200)
assert theme.palette.button_hovered == (255, 100, 50)
assert theme.source_path == p
assert theme.scope == "project"
def test_missing_required_keys_raises():
p = FIXTURES / "missing_required.toml"
with pytest.raises(ValueError, match=r"missing required \[colors\]"):
load_theme_file(p, scope="project")
def test_invalid_syntax_palette_raises():
p = FIXTURES / "minimal.toml"
with pytest.raises(ValueError, match=r"invalid syntax_palette"):
ThemeFile(name="x", palette=ThemePalette(), syntax_palette="not_a_real_palette", source_path=p, scope="project")
def test_round_trip_to_from_dict():
p = FIXTURES / "minimal.toml"
loaded = load_theme_file(p, scope="project")
dumped = loaded.to_dict()
reloaded = ThemeFile.from_dict(loaded.name, dumped, source_path=p, scope="project")
assert reloaded.syntax_palette == loaded.syntax_palette
assert reloaded.palette.window_bg == loaded.palette.window_bg
assert reloaded.palette.text == loaded.palette.text
def test_scope_setter():
p = FIXTURES / "minimal.toml"
theme = load_theme_file(p, scope="global")
assert theme.scope == "global"
themed_as_project = theme.with_scope("project")
assert themed_as_project.scope == "project"
assert themed_as_project.name == theme.name