Source code for anyblok.core

# This file is a part of the AnyBlok project
#
#    Copyright (C) 2014 Jean-Sebastien SUZANNE <jssuzanne@anybox.fr>
#
# This Source Code Form is subject to the terms of the Mozilla Public License,
# v. 2.0. If a copy of the MPL was not distributed with this file,You can
# obtain one at http://mozilla.org/MPL/2.0/.
from anyblok import Declarations
from anyblok.registry import RegistryManager


@Declarations.add_declaration_type()
class Core:
    """The Core class is the base of all the AnyBlok models

    Add new core model::

        @Declarations.register(Declarations.Core)
        class Base:
            pass

    Remove the core model::

        Declarations.unregister(Declarations.Core, 'Base', Base,
                                     blok='MyBlok')

    """

    @classmethod
    def register(self, parent, name, cls_, **kwargs):
        """Add new sub registry in the registry

        :param parent: Existing declaration
        :param name: Name of the new declaration to add it
        :param cls_: Class Interface to add in the declaration
        """
        if not hasattr(parent, name):
            core = type(name, tuple(), {})
            setattr(parent, name, core)

        if parent == Declarations:
            return  # pragma: no cover

        RegistryManager.add_core_in_register(name, cls_)

    @classmethod
    def unregister(self, entry, cls_):
        """Remove the Interface from the registry

        :param entry: entry declaration of the model where the ``cls_``
            must be removed
        :param cls_: Class Interface to remove in the declaration
        """
        RegistryManager.remove_in_register(cls_)


RegistryManager.declare_core("Base")
RegistryManager.declare_core("SqlBase")
RegistryManager.declare_core("SqlViewBase")
RegistryManager.declare_core("Query")
RegistryManager.declare_core("InstrumentedList")