Source code for anyblok.imp

# -*- coding: utf-8 -*-
# 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 .common import python_version

issix = False
try:
    from importlib import reload as reload_module
except ImportError:
    issix = True
    from six.moves import reload_module


def reload_wraper(module):
    if issix:
        module2reload = module

    elif python_version() == (3, 3):
        module2reload = module.__name__
    elif python_version() >= (3, 4):
        module2reload = module
    else:
        raise ImportManagerException(
            "Unknow action to do to reload module %r" %
            module.__name__)

    reload_module(module2reload)


def reload_module_if_blok_is_reloading(module):
    from anyblok.environment import EnvironmentManager

    if EnvironmentManager.get('reload', default=False):
        reload_wraper(module)


[docs]class ImportManagerException(AttributeError): """ Exception for Import Manager """
[docs]class ImportManager: """Used to import bloks or reload the blok imports To add a blok and import its modules:: blok = ImportManager.add('my blok') blok.imports() To reload the modules of a blok:: if ImportManager.has('my blok'): blok = ImportManager.get('my blok') blok.reload() """ modules = {}
[docs] @classmethod def add(cls, blok): """ Store the blok so that we know which bloks to reload if needed :param blok: name of the blok to add :rtype: loader instance :exception: ImportManagerException """ from anyblok.blok import BlokManager if cls.has(blok): return cls.get(blok) if not BlokManager.has(blok): raise ImportManagerException("Unexisting blok") loader = Loader(blok) cls.modules[blok] = loader return loader
[docs] @classmethod def get(cls, blok): """ Return the module imported for this blok :param blok: name of the blok to add :rtype: loader instance :exception: ImportManagerException """ if not cls.has(blok): raise ImportManagerException('Unexisting blok %r' % blok) return cls.modules[blok]
[docs] @classmethod def has(cls, blok): """ Return True if the blok was imported :param blok: name of the blok to add :rtype: boolean """ return blok in cls.modules
class Loader: def __init__(self, blok): self.blok = blok def imports(self): """ Imports modules and / or packages listed in the blok path""" from anyblok.blok import BlokManager from anyblok.registry import RegistryManager RegistryManager.init_blok(self.blok) b = BlokManager.get(self.blok) b.import_declaration_module() def reload(self): """ Reload all the imports for this module :exception: ImportManagerException """ from anyblok.blok import BlokManager from anyblok.registry import RegistryManager from anyblok.environment import EnvironmentManager b = BlokManager.get(self.blok) if not hasattr(b, 'reload_declaration_module'): return try: EnvironmentManager.set('reload', True) RegistryManager.init_blok(self.blok) b.reload_declaration_module(reload_wraper) finally: EnvironmentManager.set('reload', False)