diff --git a/components/l4d2-host-lib/src/l4d2host/spec.py b/components/l4d2-host-lib/src/l4d2host/spec.py new file mode 100644 index 0000000..5f16ccc --- /dev/null +++ b/components/l4d2-host-lib/src/l4d2host/spec.py @@ -0,0 +1,22 @@ +from dataclasses import dataclass, field +from pathlib import Path + +import yaml + + +@dataclass(slots=True) +class InstanceSpec: + port: int + overlays: list[str] = field(default_factory=list) + arguments: list[str] = field(default_factory=list) + config: list[str] = field(default_factory=list) + + +def load_spec(path: Path) -> InstanceSpec: + raw = yaml.safe_load(path.read_text()) or {} + return InstanceSpec( + port=int(raw["port"]), + overlays=[str(item) for item in raw.get("overlays", [])], + arguments=[str(item) for item in raw.get("arguments", [])], + config=[str(item) for item in raw.get("config", [])], + ) diff --git a/components/l4d2-host-lib/tests/test_spec.py b/components/l4d2-host-lib/tests/test_spec.py new file mode 100644 index 0000000..44dd13f --- /dev/null +++ b/components/l4d2-host-lib/tests/test_spec.py @@ -0,0 +1,36 @@ +from pathlib import Path + +import pytest + +from l4d2host.spec import load_spec + + +def test_minimal_spec_parses(tmp_path: Path) -> None: + path = tmp_path / "server.yaml" + path.write_text("port: 27015\noverlays: [standard]\n") + spec = load_spec(path) + assert spec.port == 27015 + assert spec.overlays == ["standard"] + + +def test_defaults_are_empty_lists(tmp_path: Path) -> None: + path = tmp_path / "server.yaml" + path.write_text("port: 27015\n") + spec = load_spec(path) + assert spec.overlays == [] + assert spec.arguments == [] + assert spec.config == [] + + +def test_missing_port_fails(tmp_path: Path) -> None: + path = tmp_path / "server.yaml" + path.write_text("overlays: [standard]\n") + with pytest.raises((KeyError, ValueError, TypeError)): + load_spec(path) + + +def test_unknown_keys_ignored(tmp_path: Path) -> None: + path = tmp_path / "server.yaml" + path.write_text("port: 27015\nfoo: bar\n") + spec = load_spec(path) + assert spec.port == 27015