feat: MbBrowser seam and FakeMbBrowser test double

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jonathan
2026-07-11 12:12:17 +02:00
parent ec85016d88
commit 2ca0f7a385
3 changed files with 57 additions and 0 deletions
+28
View File
@@ -0,0 +1,28 @@
from dataclasses import dataclass, field
from typing import Protocol
@dataclass(frozen=True)
class ArtistHit:
mbid: str
name: str
disambiguation: str = ""
@dataclass(frozen=True)
class ReleaseGroupInfo:
rg_mbid: str
title: str
primary_type: str = ""
secondary_types: tuple[str, ...] = ()
first_release_date: str = ""
class MbBrowser(Protocol):
def search_artist(self, name: str) -> list[ArtistHit]:
"""Artist name search → ranked hits (best first)."""
...
def browse_release_groups(self, artist_mbid: str) -> list[ReleaseGroupInfo]:
"""All official release-groups for an artist MBID."""
...