Source code for pykiso.lib.robot_framework.loader

##########################################################################
# Copyright (c) 2010-2022 Robert Bosch GmbH
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License 2.0 which is available at
# http://www.eclipse.org/legal/epl-2.0.
#
# SPDX-License-Identifier: EPL-2.0
##########################################################################

"""
Dynamic Loader plugin
*********************

:module: loader

:synopsis: implementation of existing magic import mechanism from ITF
    for Robot framework usage.

.. currentmodule:: loader

"""

import importlib
import sys
from pathlib import Path
from typing import List

from robot.api import logger
from robot.api.deco import keyword, library

from ...cli import parse_config
from ...test_setup.config_registry import ConfigRegistry
from ...test_setup.dynamic_loader import PACKAGE
from ..auxiliaries.proxy_auxiliary import ProxyAuxiliary


[docs]@library(version="0.1.0") class RobotLoader: """Robot framework plugin for ITF magic import mechanism.""" ROBOT_LIBRARY_SCOPE = "GLOBAL" def __init__(self, config_file: Path): """Initialize attributes. :param config_file : yaml configuration file path """ self.config_file = parse_config(config_file) self.auxiliaries = {} def _detect_proxy_auxes(self) -> List[str]: """Detect all proxy auxiliaires from yaml configuration file. :return: list containing all proxy auxiliairies alias """ proxy_aux_alias = [] for alias, aux_conf in self.config_file["auxiliaries"].items(): if ProxyAuxiliary.__name__ in aux_conf["type"]: proxy_aux_alias.append(alias) return proxy_aux_alias
[docs] @keyword(name="install") def install(self) -> None: """Provide, create and import auxiliaires/connectors present within yaml configuration file. :raises: re-raise the caught exception (Exception level) """ try: ConfigRegistry.register_aux_con(self.config_file) proxy_auxes = self._detect_proxy_auxes() auxes_alias = ConfigRegistry.get_auxes_alias() # import all auxiliaries except proxy ones for alias in auxes_alias: if alias not in proxy_auxes: self.auxiliaries[alias] = importlib.import_module( f".{alias}", f"{PACKAGE}.auxiliaries" ) # finally install proxy auxiliaries for alias in proxy_auxes: self.auxiliaries[alias] = importlib.import_module( f".{alias}", f"{PACKAGE}.auxiliaries" ) logger.info(f"auxiliaries {self.auxiliaries} installed") except Exception as error: logger.error( f"An error occurred during auxiliaries creation, reason : {error}" ) raise
[docs] @keyword(name="uninstall") def uninstall(self) -> None: """Uninstall all created instances of auxiliaires/connectors. :raises: re-raise the caught exception (Exception level) """ try: ConfigRegistry.delete_aux_con() for alias in self.auxiliaries: sys.modules.pop(f"{PACKAGE}.auxiliaries.{alias}") logger.info(f"auxiliaries {self.auxiliaries} uninstalled") except Exception as error: logger.error( f"An error occurred during auxiliaries deletion, reason : {error}" ) raise