import re

from typing import Any

from sqlalchemy.ext.declarative import as_declarative, declared_attr


@as_declarative()
class Base:
    id: Any
    __name__: str
    # Generate __tablename__ automatically
    @declared_attr
    def __tablename__(self) -> str:
        # Ref: https://stackoverflow.com/a/1176023/6133998
        return re.sub(r'(?<!^)(?=[A-Z])', '_', self.__name__).lower()
