Source code for fastiot.cli.import_configure

import logging
import importlib
import importlib.util
import os
import sys

from fastiot.cli import find_deployments, find_services
from fastiot.cli.constants import CONFIGURE_FILE_NAME, IMPORT_NAME_CONFIGURE_PY
from fastiot.cli.model import ProjectContext


[docs]def import_configure(project_context: ProjectContext, file_name: str = ''): """ Imports the :file:`configure.py` in the project root (if not specified otherwise) and sets project config accordingly. """ file_name = file_name or os.path.join(os.getcwd(), CONFIGURE_FILE_NAME) try: config = _import_configure_py(file_name) except FileNotFoundError: logging.warning("No file configure.py found in %s. Trying to continue.", os.path.dirname(file_name)) return for field in ProjectContext.__fields__: if hasattr(config, field): setattr(project_context, field, getattr(config, field)) if project_context.extensions: _import_extensions(project_context.extensions) if not project_context.deployments: project_context.deployments = find_deployments( path=project_context.project_root_dir ) if not project_context.services: project_context.services = find_services(path=project_context.project_root_dir)
[docs]def configure_py_to_dict(file_name: str = "") -> dict: """ Reads the :file:`configure.py` in the project root dir (if not specified otherwise) and returns its values as a dictionary. Use this method if you want to use config options not available in the default context (:class:`fastiot.cli.model.project.ProjectContext`) in your own commands.""" file_name = file_name or os.path.join(os.getcwd(), CONFIGURE_FILE_NAME) try: return _import_configure_py(file_name).__dict__ except FileNotFoundError: logging.warning("No file configure.py found in %s. Trying to continue.", os.path.dirname(file_name)) return {}
def _import_configure_py(file_name): if not os.path.isfile(file_name): raise FileNotFoundError(f"Could not find configure file '{file_name}'.") spec = importlib.util.spec_from_file_location(IMPORT_NAME_CONFIGURE_PY, file_name) config = importlib.util.module_from_spec(spec) sys.modules[IMPORT_NAME_CONFIGURE_PY] = config spec.loader.exec_module(config) return config def _import_extensions(extensions): for extension in extensions: try: importlib.import_module(extension) logging.debug("Imported extension '%s' successfully", extension) except ImportError as exception: # This will cause some commands to be missed, but a message at this places disturbs autocompletion. logging.debug("Import error raised during import of extension '%s'", extension) logging.debug("%s", str(exception))