from pathlib import Path from alembic.config import Config from alembic.script import ScriptDirectory from sqlalchemy import inspect, text from sqlalchemy.engine import Connection def expected_alembic_heads(project_root: Path | None = None) -> tuple[str, ...]: """Return the repository's configured Alembic heads.""" root = project_root or Path(__file__).resolve().parents[3] config = Config(str(root / "alembic.ini")) config.set_main_option("script_location", str(root / "alembic")) return tuple(sorted(ScriptDirectory.from_config(config).get_heads())) def current_alembic_revisions(connection: Connection) -> tuple[str, ...] | None: """Return database revisions, or ``None`` when it was never versioned.""" if "alembic_version" not in inspect(connection).get_table_names(): return None revisions = connection.execute( text("SELECT version_num FROM alembic_version ORDER BY version_num") ).scalars() return tuple(str(revision) for revision in revisions)