"""Shared Alembic environment for plugin migration branches (SPEC ยง11.1). Every plugin reuses this env; the runner (:mod:`app.plugins.migrate`) points ``version_locations`` at the plugin's own revision directory and gives it a dedicated ``version_table`` (``alembic_version_plg_{name}``) so each plugin's migration history is independent of core and of every other plugin. """ from __future__ import annotations import asyncio from alembic import context from sqlalchemy.ext.asyncio import async_engine_from_config from sqlalchemy.pool import NullPool from app.config import get_settings config = context.config config.set_main_option("sqlalchemy.url", get_settings().database_url) _version_table = config.get_main_option("version_table") or "alembic_version" def _do_run_migrations(connection: object) -> None: context.configure(connection=connection, version_table=_version_table) # type: ignore[arg-type] with context.begin_transaction(): context.run_migrations() async def _run_online() -> None: engine = async_engine_from_config( config.get_section(config.config_ini_section, {}), prefix="sqlalchemy.", poolclass=NullPool ) async with engine.connect() as connection: await connection.run_sync(_do_run_migrations) await engine.dispose() asyncio.run(_run_online())