df798f55cc
Domain services (SubtitleIdentifier, PatternDetector) used to import the concrete SubtitleKnowledgeBase class directly from infrastructure for their type hint. With this commit they depend on a structural Protocol in alfred/domain/subtitles/ports/knowledge.py declaring just the 7 read-only query methods the domain actually consumes. The concrete YAML-backed SubtitleKnowledgeBase in infrastructure remains the sole adapter — no rename, no shim. With this change alfred/domain/subtitles/ has zero imports from alfred/infrastructure/. Also extend the changelog entry covering the full domain-io-extraction branch.
39 lines
1.3 KiB
Python
39 lines
1.3 KiB
Python
"""SubtitleKnowledge port — the query surface domain services need from the
|
|
subtitle knowledge base, expressed as a Protocol so the domain never imports
|
|
the infrastructure adapter that backs it.
|
|
|
|
The concrete implementation lives in
|
|
``alfred/infrastructure/knowledge/subtitles/base.py`` (the YAML-backed
|
|
``SubtitleKnowledgeBase``). Tests can supply any object that satisfies this
|
|
structural contract.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Protocol
|
|
|
|
from ..value_objects import SubtitleFormat, SubtitleLanguage, SubtitlePattern, SubtitleType
|
|
|
|
|
|
class SubtitleKnowledge(Protocol):
|
|
"""Read-only query surface for subtitle knowledge consumed by the domain.
|
|
|
|
Only the methods that domain services actually call belong here — anything
|
|
else (defaults loading, reload, pattern groups, raw dicts) stays on the
|
|
concrete class and is reserved for the application layer.
|
|
"""
|
|
|
|
def known_extensions(self) -> set[str]: ...
|
|
|
|
def format_for_extension(self, ext: str) -> SubtitleFormat | None: ...
|
|
|
|
def language_for_token(self, token: str) -> SubtitleLanguage | None: ...
|
|
|
|
def is_known_lang_token(self, token: str) -> bool: ...
|
|
|
|
def type_for_token(self, token: str) -> SubtitleType | None: ...
|
|
|
|
def is_known_type_token(self, token: str) -> bool: ...
|
|
|
|
def patterns(self) -> dict[str, SubtitlePattern]: ...
|