Source code for cosipy.utilities.config_utils

"""
Hook configuration files for COSIPY utilities.
"""

import argparse
import pathlib
import sys
from collections import namedtuple

if sys.version_info >= (3, 11):
    import tomllib
else:
    import tomli as tomllib  # backwards compatibility


[docs] class TomlLoader(object): """Load and parse configuration files."""
[docs] @staticmethod def get_raw_toml(file_path: str = "./utilities_config.toml") -> dict: """Open and load .toml configuration file. Args: file_path: Relative path to .toml configuration file. Returns: Loaded .toml data. """ with open(file_path, "rb") as f: raw_config = tomllib.load(f) return raw_config
[docs] class UtilitiesConfig(TomlLoader): """Configuration for utilities. Loads, parses, and sets configuration for COSIPY utilities from a valid .toml file. Attributes: aws2cosipy: Configuration parameters for `aws2cosipy.py`. create_static: Configuration parameters for `create_static.py`. wrf2cosipy: Configuration parameters for `wrf2cosipy.py`. """
[docs] def __init__(self): self.parser = self.set_arg_parser()
@classmethod def load(cls, path: str = "./utilities_config.toml"): raw_toml = cls.get_raw_toml(path) cls.set_config_values(raw_toml) def get_config_expansion(self, name: str): return getattr(self, name)
[docs] @classmethod def set_config_values(cls, config_table: dict): """Overwrite attributes with configuration data. Args: config_table: Loaded .toml data. """ for header, table in config_table.items(): data = namedtuple(header, table.keys()) params = data(**table) setattr(cls, header, params)
@classmethod def set_arg_parser(cls) -> argparse.ArgumentParser: tagline = "COSIPY Utilities." parser = argparse.ArgumentParser(description=tagline) parser.add_argument( "-u", "--utilities", default=pathlib.Path("./utilities_config.toml"), dest="utilities_path", type=pathlib.Path, metavar="<path>", required=False, help="relative path to utilities' configuration file", ) return parser
[docs] def main(): UtilitiesConfig()
if __name__ == "__main__": main() else: main()