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:
@@ -30,9 +30,19 @@ from alfred.domain.subtitles.value_objects import (
|
||||
RuleScope,
|
||||
SubtitleFormat,
|
||||
SubtitleLanguage,
|
||||
SubtitleMatchingRules,
|
||||
SubtitleType,
|
||||
)
|
||||
|
||||
# Test fixture: stand-in for what the KB would provide at runtime.
|
||||
_DEFAULT_RULES = SubtitleMatchingRules(
|
||||
preferred_languages=["eng"],
|
||||
preferred_formats=["srt"],
|
||||
allowed_types=["standard"],
|
||||
format_priority=["srt", "ass"],
|
||||
min_confidence=0.7,
|
||||
)
|
||||
|
||||
# --------------------------------------------------------------------------- #
|
||||
# Value objects #
|
||||
# --------------------------------------------------------------------------- #
|
||||
@@ -230,18 +240,17 @@ class TestAvailableSubtitles:
|
||||
|
||||
|
||||
class TestSubtitleRuleSet:
|
||||
def test_global_default_uses_kb_defaults(self):
|
||||
def test_global_default_returns_injected_defaults(self):
|
||||
rs = SubtitleRuleSet.global_default()
|
||||
rules = rs.resolve()
|
||||
# Loaded from subtitles.yaml — defaults must be non-empty.
|
||||
assert rules.preferred_languages
|
||||
assert rules.preferred_formats
|
||||
assert 0 < rules.min_confidence <= 1
|
||||
rules = rs.resolve(_DEFAULT_RULES)
|
||||
assert rules.preferred_languages == _DEFAULT_RULES.preferred_languages
|
||||
assert rules.preferred_formats == _DEFAULT_RULES.preferred_formats
|
||||
assert rules.min_confidence == _DEFAULT_RULES.min_confidence
|
||||
|
||||
def test_override_persists(self):
|
||||
rs = SubtitleRuleSet.global_default()
|
||||
rs.override(languages=["eng"], min_confidence=0.9)
|
||||
rules = rs.resolve()
|
||||
rules = rs.resolve(_DEFAULT_RULES)
|
||||
assert rules.preferred_languages == ["eng"]
|
||||
assert rules.min_confidence == 0.9
|
||||
|
||||
@@ -252,10 +261,10 @@ class TestSubtitleRuleSet:
|
||||
parent=parent,
|
||||
)
|
||||
child.override(languages=["jpn"])
|
||||
rules = child.resolve()
|
||||
rules = child.resolve(_DEFAULT_RULES)
|
||||
assert rules.preferred_languages == ["jpn"]
|
||||
# min_confidence not overridden at child or parent → falls back to defaults
|
||||
assert rules.min_confidence == parent.resolve().min_confidence
|
||||
assert rules.min_confidence == parent.resolve(_DEFAULT_RULES).min_confidence
|
||||
|
||||
def test_to_dict_only_emits_set_deltas(self):
|
||||
rs = SubtitleRuleSet(scope=RuleScope(level="show", identifier="tt1"))
|
||||
@@ -286,4 +295,4 @@ class TestSubtitleRuleSet:
|
||||
# code uses `is not None` explicitly. Verify 0.0 doesn't fall back.
|
||||
rs = SubtitleRuleSet.global_default()
|
||||
rs.override(min_confidence=0.0)
|
||||
assert rs.resolve().min_confidence == 0.0
|
||||
assert rs.resolve(_DEFAULT_RULES).min_confidence == 0.0
|
||||
|
||||
Reference in New Issue
Block a user