Source code for numistalib.models.mints

"""Numista mints models.

Pydantic models for Numista mint facilities.
"""

from typing import Self

from pydantic import Field, computed_field
from rich.table import Table

from numistalib.models.base import NumistaBaseModel
from numistalib.models.issuer import Issuer

# Constant for mints still in operation
MINT_ACTIVE_END_YEAR = 9999


[docs] class Mint(NumistaBaseModel): """Mint facility information. Maps to Numista mint entity. Parameters ---------- id : int Numista mint ID name : str Mint name in chosen language local_name : str | None Mint name in local language (optional) code : str | None Mint code or abbreviation (optional) place : str | None Place where mint is located (optional) country : Issuer | None Country issuer information (optional) start_year : int | None First year of operation (optional) end_year : int | None Last year of operation, 9999=still active (optional) nomisma_id : str | None Nomisma identifier (optional) wikidata_id : str | None Wikidata identifier (optional) country_code : str | None Issuing country code - deprecated, use country.code (optional) """ id: int = Field(alias="numista_id", gt=0, description="Numista ID") name: str = Field(max_length=255, description="Mint facility name") local_name: str | None = Field(None, max_length=255, description="Mint name in local language") code: str | None = Field(None, max_length=50, description="Mint code or abbreviation") place: str | None = Field(None, max_length=255, description="Place where mint is located") country: Issuer | None = Field(None, description="Country issuer information") start_year: int | None = Field(None, description="First year of operation") end_year: int | None = Field(None, description="Last year of operation (9999=still active)") nomisma_id: str | None = Field(None, max_length=100, description="Nomisma identifier") wikidata_id: str | None = Field(None, max_length=100, description="Wikidata identifier") country_code: str | None = Field(None, max_length=50, description="Issuing country code (deprecated)") @computed_field(description="Formatted mint identifier") def mint_identifier(self) -> str: """Mint code if available, otherwise name.""" return self.code if self.code else self.name
[docs] def render_compact(self) -> str: """Render compact mint display.""" lines = [f"[bold]{self.name}[/bold]"] if self.local_name and self.local_name != self.name: lines.append(f"Local: {self.local_name}") if self.code: lines.append(f"Code: {self.code}") if self.place: lines.append(f"Place: {self.place}") if self.country: lines.append(f"Country: {self.country.name}") elif self.country_code: lines.append(f"[dim]{self.country_code}[/dim]") if self.start_year or self.end_year: years = f"Active: {self.start_year or '?'}-" years += "present" if self.end_year == MINT_ACTIVE_END_YEAR else (str(self.end_year) if self.end_year else "?") lines.append(years) return "\n".join(lines)
[docs] @classmethod def render_table(cls, items: list[Self], title: str = "") -> Table: """Generate table for mint list. Parameters ---------- items : list[Self] List of Mint instances title : str Table title Returns ------- Table Rich table with mint information """ table = Table(show_header=True, box=None, pad_edge=False, title=title) table.add_column("Id", no_wrap=True) table.add_column("Name", no_wrap=True) table.add_column("Code", no_wrap=True) table.add_column("Place", no_wrap=True) table.add_column("Country", no_wrap=True) table.add_column("Years", no_wrap=True) for mint in items: years = "" if mint.start_year and mint.end_year: end = "present" if mint.end_year == MINT_ACTIVE_END_YEAR else str(mint.end_year) years = f"{mint.start_year}-{end}" elif mint.start_year: years = f"{mint.start_year}+" table.add_row( str(mint.id), mint.name, mint.code or "", mint.place or "", mint.country.name if mint.country else (mint.country_code or ""), years ) return table