feat(l4d2): add spec parser with required port and permissive fields
This commit is contained in:
parent
f2ef7e2f24
commit
7d3cf66ed4
2 changed files with 58 additions and 0 deletions
22
components/l4d2-host-lib/src/l4d2host/spec.py
Normal file
22
components/l4d2-host-lib/src/l4d2host/spec.py
Normal file
|
|
@ -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", [])],
|
||||
)
|
||||
36
components/l4d2-host-lib/tests/test_spec.py
Normal file
36
components/l4d2-host-lib/tests/test_spec.py
Normal file
|
|
@ -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
|
||||
Loading…
Reference in a new issue