Source code for codegen_database.extension

from __future__ import annotations

from dataclasses import dataclass, field
from typing import TYPE_CHECKING, ClassVar

from codegen_database.errors import CodegenDatabaseValidationError

if TYPE_CHECKING:
    from sqlalchemy import MetaData


[docs] @dataclass(frozen=True, eq=True) class CodegenDatabaseExtension: name: str depends_on: ClassVar[list[str]] = field(default=[], init=False, repr=False)
[docs] def configure_metadata(self, metadata: MetaData) -> None: """Register extension-owned objects on application metadata."""
[docs] def configure_alembic(self) -> None: """Register Alembic comparators, renderers, or rewriters."""
[docs] def register_cli(self, app: object) -> None: """Register extension commands on an application CLI."""
[docs] def validate(self, registered_names: frozenset[str]) -> None: """Validate against the complete resolved extension set."""
def validate_extension_deps( extensions: set[CodegenDatabaseExtension], ) -> None: names = frozenset(extension.name for extension in extensions) missing = [ dependency for extension in extensions for dependency in extension.depends_on if dependency not in names ] if missing: msg = f"Extension depends on {missing!r}, which is not registered." raise CodegenDatabaseValidationError(msg) for extension in extensions: extension.validate(names)