Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 0 additions & 75 deletions pycroft/model/alembic.ini

This file was deleted.

3 changes: 3 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,9 @@ include-package-data = true
[tool.setuptools.packages]
find = {namespaces = false}

[tool.alembic]
script_location = "pycroft/model/alembic"

# TOOLS
[tool.black]
line-length = 100
Expand Down
110 changes: 21 additions & 89 deletions scripts/alembic_wrapper.py
Original file line number Diff line number Diff line change
@@ -1,110 +1,41 @@
#!/usr/bin/env python3
import logging
import sys
import typing as t
from dataclasses import dataclass

import click
from alembic import command
from alembic import autogenerate as autogen
from alembic.migration import MigrationContext
from alembic.config import Config
from rich import print
from alembic.config import Config, CommandLine
from rich.console import RenderableType
from rich.table import Table
from rich.text import Text
from sqlalchemy import Connection

from pycroft.model.alembic import get_alembic_config

Check failure on line 12 in scripts/alembic_wrapper.py

View workflow job for this annotation

GitHub Actions / python-lint

Ruff (F401)

scripts/alembic_wrapper.py:12:35: F401 `pycroft.model.alembic.get_alembic_config` imported but unused
from pycroft.model.base import ModelBase

from .connection import get_connection_string, try_create_connection

logger = logging.getLogger(__name__)

@dataclass
class ContextObject:
alembic_cfg: Config
conn: Connection
logger: logging.Logger
# TODO this is nice and all for a new custom command, but this does not
# solve the problem of making `alembic` work in a production context
# (where the files do not exist in $PWD, but in the `pycroft` package's
# installation site)
def main():
cli = CommandLine()
cli.register_command(diff)
cli.main()


@click.group()
@click.pass_context
@click.option('--verbose', '-v', is_flag=True,
help="Verbose, i.e. create the connection with `echo=True`")
def cli(ctx, verbose: bool):
logger = logging.getLogger('alembic_wrapper')
logger.setLevel(logging.INFO)
logger.addHandler(logging.StreamHandler(sys.stdout))

conn, engine = try_create_connection(get_connection_string(), logger=logger, wait_for_db=False,
echo=verbose)
ctx.obj = ContextObject(
conn=conn,
logger=logger,
alembic_cfg=get_alembic_config(),
)


assert isinstance(cli, click.Group)


@cli.command(help=command.current.__doc__)
@click.pass_obj
def current(obj: ContextObject):
command.current(obj.alembic_cfg)


@cli.command(help=command.check.__doc__)
@click.pass_obj
def check(obj: ContextObject):
command.check(obj.alembic_cfg)


@cli.command()
@click.pass_obj
def diff(obj: ContextObject):
# https://alembic.sqlalchemy.org/en/latest/api/autogenerate.html#getting-diffs
migration_context = MigrationContext.configure(obj.conn)
def diff(config: Config) -> None:
"""Produce a diff of the code-defined schema and actual schema."""
breakpoint()
conn, _ = try_create_connection(get_connection_string(), logger=logger, wait_for_db=False,
echo=False)
migration_context = MigrationContext.configure(conn)
metadata = ModelBase.metadata
print(render_diffset(autogen.compare_metadata(migration_context, metadata)))


@cli.command(help=command.upgrade.__doc__)
@click.pass_obj
@click.argument('revision')
@click.option("--sql", is_flag=True)
@click.option("--tag")
def upgrade(
obj: ContextObject,
revision: str,
sql: bool = False,
tag: str | None = None,
):
command.upgrade(obj.alembic_cfg, revision)


@cli.command(help=command.downgrade.__doc__)
@click.pass_obj
@click.argument('revision')
def downgrade(obj: ContextObject, revision: str):
command.downgrade(obj.alembic_cfg, revision)


@cli.command(help=command.stamp.__doc__)
@click.pass_obj
@click.argument("revision")
def stamp(obj: ContextObject, revision: str):
command.stamp(obj.alembic_cfg, revision)


@cli.command(help=command.revision.__doc__)
@click.pass_obj
@click.option("-m", "--message", "message")
@click.option("--autogenerate", is_flag=True, default=False)
def revision(obj: ContextObject, message: str, autogenerate: bool):
command.revision(obj.alembic_cfg, message=message, autogenerate=autogenerate)

diff_table = render_diffset(autogen.compare_metadata(migration_context, metadata))
from rich import print
print(diff_table)

def render_diffset(diffs) -> t.Iterator[tuple[t.Any, ...]]:
table = Table(show_header=False, box=None)
Expand Down Expand Up @@ -151,4 +82,5 @@


if __name__ == '__main__':
cli()
# cli()
main()
Loading