Source code for icolos.utils.entry_point_functions.parsing_functions

import os
from typing import Tuple

from icolos.loggers.base_logger import BaseLogger

from icolos.utils.enums.composite_agents_enums import WorkflowEnum
from icolos.utils.enums.entry_points import ExecutorEnum
from icolos.utils.enums.logging_enums import LoggingConfigEnum
from icolos.utils.general.files_paths import move_up_directory

_WE = WorkflowEnum()
_LE = LoggingConfigEnum()
_EE = ExecutorEnum()


[docs]def parse_global(g_input, logger: BaseLogger) -> dict: if g_input is not None: if not isinstance(g_input, list): g_input = [g_input] g_vars = {} for new_var in g_input: parts = new_var.split(":") if len(parts) != 2: logger.log( f"Ignoring global input {new_var} set by command-line, as they must have one key and one value, separated by ':'.", _LE.WARNING, ) continue g_vars[parts[0]] = parts[1] logger.log( f'Parsed global input "{parts[0]}" (value: "{parts[1]}").', _LE.DEBUG ) return g_vars else: return {}
[docs]def add_global(configuration: dict, g_vars: dict, field: str) -> dict: """This function adds (and overwrites) values for global settings and variables. Parameter "field" selects, which key is to be used in the header region.""" header = configuration[_WE.WORKFLOW][_WE.HEADER] if field not in header.keys(): header[field] = {} for key, value in g_vars.items(): header[field][key] = value return configuration
[docs]def get_runtime_global_variables(args_conf: str, entry_point_path: str) -> dict: return { # current workdir _EE.RUNTIME_GLOBAL_VARIABLE_WORKDIR: os.getcwd(), # directory where the entry point lies _EE.RUNTIME_GLOBAL_VARIABLE_ENTRYPOINTDIR: os.path.dirname(entry_point_path), # directory where the JSON lies _EE.RUNTIME_GLOBAL_VARIABLE_CONFIGDIR: os.path.dirname( os.path.abspath(args_conf) ), # top level of Icolos icolos package _EE.RUNTIME_GLOBAL_VARIABLE_PACKAGEDIR: move_up_directory( os.path.dirname(entry_point_path), 3 ), }
[docs]def parse_header(conf: dict, args, entry_point_path: str, logger: BaseLogger) -> dict: # parse global variables from command-line global_vars_CLI = parse_global(g_input=args.global_variables, logger=logger) conf = add_global(conf, global_vars_CLI, _WE.GLOBAL_VARIABLES) # add run-specified global variables (the current directory, the JSONs directory, ...) conf = add_global( conf, get_runtime_global_variables(args.conf, entry_point_path), _WE.GLOBAL_VARIABLES, ) # update global settings; if they are not supported, pydantic will complain later on # TODO: at the moment this implementation ignores stuff that is not understood (e.g. when a typo occurs); this should fail global_settings_CLI = parse_global(g_input=args.global_settings, logger=logger) conf = add_global(conf, global_settings_CLI, _WE.GLOBAL_SETTINGS) return conf
[docs]def get_version_number() -> str: try: # this requires python >= 3.8 from importlib import metadata return metadata.version("icolos") except ImportError: return None
[docs]def get_config_version_number(conf: dict) -> str: try: return str(conf[_WE.WORKFLOW][_WE.HEADER][_WE.VERSION]) except KeyError: return None
[docs]def log_version_number(logger: BaseLogger): version = get_version_number() if version is None: logger.log(f"Could not obtain Icolos version.", _LE.WARNING) version = "unknown" logger.log(f"Icolos version {version} initialized.", _LE.INFO)
[docs]def version_match(conf: dict) -> bool: version_config = get_config_version_number(conf) version_installation = get_version_number() if ( version_config is None or version_installation is None or version_config != version_installation ): return False return True
[docs]def get_versions_as_strings(conf: dict) -> Tuple[str, str]: version_config = get_config_version_number(conf) version_installation = get_version_number() version_config = "unknown" if version_config is None else version_config version_installation = ( "unknown" if version_installation is None else version_installation ) return version_config, version_installation