refactor(subtitles): inject default rules into SubtitleRuleSet.resolve()
aggregates.py used to call SubtitleKnowledgeBase().default_rules() via a DEFAULT_RULES() helper, which silently pulled the infrastructure layer (YAML loader) into the domain on every resolve. Make the dependency explicit: resolve() now takes the default rules as a parameter, and the caller (the ManageSubtitles use case) loads them from the KB once and passes them in. Domain stays I/O-free. - Drop DEFAULT_RULES helper and the SubtitleKnowledgeBase import from alfred/domain/subtitles/aggregates.py - SubtitleRuleSet.resolve(default_rules: SubtitleMatchingRules) - manage_subtitles use case passes kb.default_rules() at the call site - Tests use a local SubtitleMatchingRules stand-in instead of relying on KB defaults
This commit is contained in:
@@ -17,6 +17,7 @@ from pathlib import Path
|
||||
|
||||
import yaml
|
||||
|
||||
from alfred.domain.subtitles.value_objects import SubtitleMatchingRules
|
||||
from alfred.infrastructure.persistence.memory.ltm.components.subtitle_preferences import (
|
||||
SubtitlePreferences,
|
||||
)
|
||||
@@ -25,6 +26,15 @@ from alfred.infrastructure.subtitle.rule_repository import (
|
||||
_filter_override,
|
||||
)
|
||||
|
||||
# Stand-in for KB defaults, injected at resolve().
|
||||
_DEFAULT_RULES = SubtitleMatchingRules(
|
||||
preferred_languages=["eng"],
|
||||
preferred_formats=["srt"],
|
||||
allowed_types=["standard"],
|
||||
format_priority=["srt", "ass"],
|
||||
min_confidence=0.7,
|
||||
)
|
||||
|
||||
|
||||
def _write(path: Path, data: dict) -> None:
|
||||
path.parent.mkdir(parents=True, exist_ok=True)
|
||||
@@ -71,17 +81,17 @@ class TestLoad:
|
||||
def test_no_files_returns_global_default(self, tmp_path):
|
||||
repo = RuleSetRepository(tmp_path)
|
||||
rs = repo.load()
|
||||
# Should resolve cleanly using the hardcoded defaults.
|
||||
rules = rs.resolve()
|
||||
assert rules.preferred_languages # non-empty
|
||||
assert rules.min_confidence > 0
|
||||
# With no overrides, resolve returns the injected defaults unchanged.
|
||||
rules = rs.resolve(_DEFAULT_RULES)
|
||||
assert rules.preferred_languages == _DEFAULT_RULES.preferred_languages
|
||||
assert rules.min_confidence == _DEFAULT_RULES.min_confidence
|
||||
|
||||
def test_subtitle_preferences_override_base(self, tmp_path):
|
||||
prefs = SubtitlePreferences(
|
||||
languages=["jpn"], formats=["ass"], types=["standard"]
|
||||
)
|
||||
repo = RuleSetRepository(tmp_path)
|
||||
rules = repo.load(subtitle_preferences=prefs).resolve()
|
||||
rules = repo.load(subtitle_preferences=prefs).resolve(_DEFAULT_RULES)
|
||||
assert rules.preferred_languages == ["jpn"]
|
||||
assert rules.preferred_formats == ["ass"]
|
||||
assert rules.allowed_types == ["standard"]
|
||||
@@ -92,7 +102,7 @@ class TestLoad:
|
||||
{"override": {"languages": ["spa"], "min_confidence": 0.95}},
|
||||
)
|
||||
repo = RuleSetRepository(tmp_path)
|
||||
rules = repo.load().resolve()
|
||||
rules = repo.load().resolve(_DEFAULT_RULES)
|
||||
assert rules.preferred_languages == ["spa"]
|
||||
assert rules.min_confidence == 0.95
|
||||
|
||||
@@ -102,7 +112,7 @@ class TestLoad:
|
||||
{"override": {"format_priority": ["ass", "srt"]}},
|
||||
)
|
||||
repo = RuleSetRepository(tmp_path)
|
||||
rules = repo.load(release_group="KONTRAST").resolve()
|
||||
rules = repo.load(release_group="KONTRAST").resolve(_DEFAULT_RULES)
|
||||
assert rules.format_priority == ["ass", "srt"]
|
||||
|
||||
def test_full_three_level_chain(self, tmp_path):
|
||||
@@ -119,7 +129,9 @@ class TestLoad:
|
||||
{"override": {"min_confidence": 0.99}},
|
||||
)
|
||||
repo = RuleSetRepository(tmp_path)
|
||||
rules = repo.load(release_group="GRP", subtitle_preferences=prefs).resolve()
|
||||
rules = repo.load(release_group="GRP", subtitle_preferences=prefs).resolve(
|
||||
_DEFAULT_RULES
|
||||
)
|
||||
# All three levels visible — local overrides on top
|
||||
assert rules.preferred_languages == ["jpn"]
|
||||
assert rules.format_priority == ["ass"]
|
||||
|
||||
Reference in New Issue
Block a user