Source code for bibliopixel.project.importer

from . import load
from . import fields
from distutils.version import LooseVersion

MINIMUM_VERSIONS = {'serial': '2.7'}

INSTALL_NAMES = {
    'BiblioPixelAnimations': 'BiblioPixelAnimations',
    'flask': 'flask',
    'noise': 'noise',
    'serial': 'pyserial',
}


def _validate_typename(typename):
    root_module = typename.split('.')[0]
    min_version = MINIMUM_VERSIONS.get(root_module)
    if not min_version:
        return

    version = __import__(root_module).VERSION

    if LooseVersion(version) < LooseVersion(min_version):  # pragma: no cover
        install_name = INSTALL_NAMES.get(root_module, root_module)
        raise ValueError(VERSION_MESSAGE % (
            root_module, version, min_version, install_name))


def _import(typename, python_path=None, loader=load.code):
    try:
        result = loader(typename, python_path=python_path)
        _validate_typename(typename)
        return result

    except ImportError as e:
        root_module = typename.split('.')[0]
        install_name = INSTALL_NAMES.get(root_module)
        if install_name:
            try:
                __import__(root_module)
            except ImportError:
                msg = MISSING_MESSAGE % (root_module, install_name)
                e.msg = msg + e.msg
        raise


[docs]def import_symbol(typename, python_path=None): return _import(typename, python_path)
[docs]def import_module(typename, python_path=None): return _import(typename, python_path, loader=load.module)
[docs]def make_object(*args, typename=None, python_path=None, datatype=None, **kwds): """Make an object from a symbol.""" datatype = datatype or import_symbol(typename, python_path) field_types = getattr(datatype, 'FIELD_TYPES', fields.FIELD_TYPES) return datatype(*args, **fields.component(kwds, field_types))
VERSION_MESSAGE = """ You have version %s of module '%s' but you need version %s. Please upgrade at the command line with: $ pip install %s --upgrade """ MISSING_MESSAGE = """ You are missing module '%s'. Please install it at the command line with: $ pip install %s """ SERIAL_IS_INSTALLED_NOT_PYSERIAL_MESSAGE = """ You have the module `serial` installed, but you need the package `pyserial` instead. Sorry, it's not our fault that there are two packages whose names are so close! To uninstall that module and install the correct one from the command line: $ pip uninstall -y serial $ pip install pyserial """