
The entrypoint will make it easier to install powertrain-build to an isolated venv without having to call python -m powertrain_build. Change-Id: I3850c97d17707f9bc03640bd1d997508637d97ba
122 lines
3.7 KiB
Python
122 lines
3.7 KiB
Python
# Copyright 2024 Volvo Car Corporation
|
|
# Licensed under Apache 2.0.
|
|
|
|
"""Module to export information of global variables from powertrain_build projects."""
|
|
|
|
import argparse
|
|
import os
|
|
import sys
|
|
from typing import Dict, List, Optional, Tuple
|
|
|
|
from ruamel.yaml import YAML
|
|
|
|
from powertrain_build.build_proj_config import BuildProjConfig
|
|
from powertrain_build.feature_configs import FeatureConfigs
|
|
from powertrain_build.unit_configs import UnitConfigs
|
|
|
|
|
|
PARSER_HELP = "Export global variables."
|
|
|
|
|
|
def get_global_variables(project_config_path: str) -> Dict:
|
|
"""Get global variables connected to PyBuild project.
|
|
|
|
Args:
|
|
project_config_path (str): Path to ProjectCfg.json file.
|
|
Returns:
|
|
(Dict): Dict containing project name and its global variables (name, type).
|
|
"""
|
|
project_name, project_unit_config = _get_project_data(project_config_path)
|
|
|
|
variable_types = ["outports", "local_vars", "calib_consts", "nvm"]
|
|
variables = []
|
|
for variable_type in variable_types:
|
|
if variable_type not in project_unit_config:
|
|
continue
|
|
|
|
variables_info = [
|
|
{"name": variable, "type": _get_variable_type(variable_info)}
|
|
for variable, variable_info in project_unit_config[variable_type].items()
|
|
]
|
|
variables.extend(variables_info)
|
|
return {"name": project_name, "variables": variables}
|
|
|
|
|
|
def _get_variable_type(variable_info: Dict) -> str:
|
|
"""Get variable type from variable info.
|
|
|
|
Args:
|
|
variable_info (Dict): Dictionary with the variable info.
|
|
|
|
Returns:
|
|
str: Variable type.
|
|
"""
|
|
unit_name = list(variable_info.keys())[0] # Getting any unit name, since variable type should be the same
|
|
return variable_info[unit_name]["type"]
|
|
|
|
|
|
def _get_project_data(project_config_path: str) -> Tuple[str, Dict]:
|
|
"""Gets data for a powertrain-build project.
|
|
|
|
Args:
|
|
project_config_path (str): Path to ProjectCfg.json file.
|
|
Returns:
|
|
project_name (str): Name of PyBuild project.
|
|
project_unit_config (dict): Dict mapping variable types to variables and their data.
|
|
"""
|
|
build_cfg = BuildProjConfig(os.path.normpath(project_config_path))
|
|
feature_cfg = FeatureConfigs(build_cfg)
|
|
unit_cfg = UnitConfigs(build_cfg, feature_cfg)
|
|
project_unit_config = unit_cfg.get_per_cfg_unit_cfg()
|
|
return build_cfg.name, project_unit_config
|
|
|
|
|
|
def _export_yaml(data: Dict, file_path: str) -> None:
|
|
"""Exports data from dictionary to a yaml file.
|
|
|
|
Args:
|
|
data (Dict): Dictionary with data.
|
|
file_path (str): Path of the file to export data.
|
|
"""
|
|
with open(file_path, "w", encoding="utf-8") as yaml_file:
|
|
yaml = YAML()
|
|
yaml.default_flow_style = False
|
|
yaml.dump(data, yaml_file)
|
|
|
|
|
|
def export_global_vars(args: argparse.Namespace):
|
|
"""Exports global variables as yaml file."""
|
|
global_variables = get_global_variables(args.project_config)
|
|
_export_yaml(global_variables, args.output_file)
|
|
|
|
|
|
def _main(argv: Optional[List[str]] = None):
|
|
"""Main function for CLI."""
|
|
parser = argparse.ArgumentParser(description=PARSER_HELP)
|
|
configure_parser(parser)
|
|
args = parser.parse_args(argv)
|
|
args.func(args)
|
|
|
|
|
|
def configure_parser(parser: argparse.ArgumentParser):
|
|
"""Configures the argument parser for the script.
|
|
|
|
Args:
|
|
parser (argparse.ArgumentParser): Argument parser.
|
|
"""
|
|
parser.add_argument(
|
|
"--project-config",
|
|
help="Project root configuration file.",
|
|
required=True,
|
|
)
|
|
parser.add_argument(
|
|
"--output-file",
|
|
help="Output file to export global variables.",
|
|
required=True,
|
|
)
|
|
parser.set_defaults(func=export_global_vars)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(_main(sys.argv[1:]))
|