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 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)