Source code for asyncpg_simpleorm.abstract

import abc
import typing


def _all_checks(Cls, *props) -> bool:
    """Helper for ``__subclasshook__`` methods.

    :param Cls:  The class to check for the attributes in it's ``__mro__``
    :param props:  Attribute names to ensure are in the ``Cls``.

    """
    checks = map(
        lambda x: any(x in vars(Base) for Base in Cls.__mro__),
        props
    )
    return all(checks)


[docs]class ModelABC(metaclass=abc.ABCMeta): """Abstract reperesentation of a database model. """
[docs] @classmethod @abc.abstractmethod def column_names(cls) -> typing.Iterable[str]: # pragma: no cover pass
[docs] @classmethod @abc.abstractmethod def tablename(cls) -> str: # pragma: no cover pass
@classmethod def __subclasshook__(cls, Cls): if cls is ModelABC: return _all_checks(Cls, 'column_names', 'tablename') return NotImplemented # pragma: no cover
[docs]class AsyncModelABC(metaclass=abc.ABCMeta): """Abstract representation of an async database model. """
[docs] @classmethod @abc.abstractmethod def column_names(cls) -> typing.Iterable[str]: # pragma: no cover pass
[docs] @classmethod @abc.abstractmethod def tablename(cls) -> str: # pragma: no cover pass
[docs] @classmethod @abc.abstractmethod def connection(cls) -> 'AsyncContextManagerABC': # pragma: no cover """Return an async context manager, that returns an :class:`asyncpg.Connection` instance. """ pass
[docs] @classmethod @abc.abstractmethod def from_record(cls, record) -> 'AsyncModelABC': # pragma: no cover """Return an instance of the class from an :class:`asyncpg.Record` instance. """ pass
@classmethod @abc.abstractmethod def __init_subclass__(cls, connection=None, **kwargs): # pragma: no cover """Allow a connection manager to be registered with a class in the class declaration. """ pass @classmethod def __subclasshook__(cls, Cls): if cls is AsyncModelABC: return _all_checks(Cls, 'connection', 'from_record', '__init_subclass__', 'column_names', 'tablename') return NotImplemented # pragma: no cover
[docs]class AsyncContextManagerABC(metaclass=abc.ABCMeta): """Abstract representation of an async context manager. Ensures a class has ``__aenter__`` and ``__aexit__`` methods. """ @abc.abstractmethod async def __aenter__(self): # pragma: no cover pass @abc.abstractmethod async def __aexit__(self, exctype, excval, traceback): # pragma: no cover pass @classmethod def __subclasshook__(cls, Cls): if cls is AsyncContextManagerABC: return _all_checks(Cls, '__aenter__', '__aexit__') return NotImplemented # pragma: no cover