From 45e859dac4159a395192d893ab7dadb99b45f42f Mon Sep 17 00:00:00 2001 From: Artem Akymenko Date: Sun, 5 Jul 2026 15:17:13 +0000 Subject: [PATCH] feat: Add TTSBackendMetadata model --- abogen/tts_backend.py | 24 +++++++++++++++++++++++- tests/test_tts_backend.py | 29 +++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 tests/test_tts_backend.py diff --git a/abogen/tts_backend.py b/abogen/tts_backend.py index 16212a6..dd8d471 100644 --- a/abogen/tts_backend.py +++ b/abogen/tts_backend.py @@ -1,12 +1,30 @@ """ TTS Backend Interface -This module defines the protocol for TTS backends. +This module defines the protocol for TTS backends and the +metadata model that describes a backend implementation. """ +from dataclasses import dataclass from typing import Protocol, List, Dict, Any +@dataclass(frozen=True) +class TTSBackendMetadata: + """ + Immutable metadata describing a TTS backend implementation. + + Attributes: + id: Unique backend identifier (e.g. ``"kokoro"``, ``"supertonic"``). + name: Human-readable display name. + description: Short description of the backend. + """ + + id: str + name: str + description: str + + class TTSBackend(Protocol): """ Protocol for TTS backends. @@ -15,6 +33,10 @@ class TTSBackend(Protocol): with the application. """ + @property + def metadata(self) -> TTSBackendMetadata: + ... + def __init__(self, **kwargs) -> None: """ Initialize the TTS backend. diff --git a/tests/test_tts_backend.py b/tests/test_tts_backend.py new file mode 100644 index 0000000..0f1e532 --- /dev/null +++ b/tests/test_tts_backend.py @@ -0,0 +1,29 @@ +from dataclasses import dataclass + +from abogen.tts_backend import TTSBackendMetadata + + +class TestTTSBackendMetadata: + def test_is_frozen_dataclass(self): + assert dataclass(TTSBackendMetadata) + + def test_fields_are_present(self): + meta = TTSBackendMetadata( + id="test", + name="Test Backend", + description="A test backend", + ) + assert meta.id == "test" + assert meta.name == "Test Backend" + assert meta.description == "A test backend" + + def test_is_immutable(self): + import pytest + + meta = TTSBackendMetadata( + id="kokoro", + name="Kokoro", + description="Test", + ) + with pytest.raises(Exception): + meta.id = "changed"