Source code for model_repository.files

"""Read and combine production-table files from a model repository."""

import logging
from pathlib import Path

from packaging.version import InvalidVersion, Version

from simtools.utils import names

logger = logging.getLogger(__name__)


[docs] def collect_production_descriptions(info_files, read_info): """Collect sorted production descriptions using the supplied document reader.""" def sort_key(path): try: return (0, Version(path.parent.name)) except InvalidVersion: return (1, path.parent.name) descriptions = [] for path in sorted(info_files, key=sort_key): info = read_info(path) description = str(info.get("description", "")).replace("\n", " ").strip() descriptions.append((str(info.get("model_version", path.parent.name)), description)) return descriptions
[docs] def read_production_tables_from_documents(model_version, documents, collection_name=None): """Read and merge production tables from parsed repository documents. ``documents`` contains ``(model_name, file_name, document)`` tuples. The representation is shared by filesystem and Git readers so that both sources apply patch history and production-table merging identically. """ model_dict = {} for model_name, file_name, document in documents: if collection_name and ( names.get_collection_name_from_array_element_name(Path(file_name).stem, False) != collection_name ): continue _merge_production_table(model_dict, Path(file_name).stem, model_name, document) for table in model_dict.values(): table["model_version"] = model_version _remove_deprecated_model_parameters(model_dict) return model_dict
def _merge_production_table(model_dict, array_element, model_name, parameter_dict): """Merge one parsed production-table document into an aggregate.""" collection = names.get_collection_name_from_array_element_name(array_element, False) model_dict.setdefault( collection, { "collection": collection, "model_version": model_name, "parameters": {}, "design_model": {}, "deprecated_parameters": [], }, ) if array_element in ("configuration_corsika", "configuration_sim_telarray"): model_dict[collection]["parameters"] = parameter_dict["parameters"] else: model_dict[collection]["parameters"].setdefault(array_element, {}).update( parameter_dict["parameters"][array_element] ) try: model_dict[collection]["design_model"][array_element] = parameter_dict["design_model"][ array_element ] except KeyError: pass if "deprecated_parameters" in parameter_dict: model_dict[collection]["deprecated_parameters"] = parameter_dict["deprecated_parameters"] def _remove_deprecated_model_parameters(model_dict): """Remove deprecated parameters from aggregated production tables.""" for table in model_dict.values(): for params in table.get("parameters", {}).values(): for parameter in table.get("deprecated_parameters", []): if parameter in params: logger.info("Removing deprecated parameter %s", parameter) params.pop(parameter)