Source code for utopya.cfg
"""Module that coordinates utopya's persistent config directory"""
import logging
import os
from ._yaml import load_yml, write_yml
log = logging.getLogger(__name__)
# Some globally relevant variables --------------------------------------------
#
# NOTE For CLI support, some of these are duplicated in utopya_cli._shared
# When doing updates here, also update them there.
UTOPYA_CFG_DIR = os.path.expanduser("~/.config/utopya")
"""Path to the persistent utopya configuration directory"""
UTOPYA_CFG_FILE_NAMES = dict(
user="user_cfg.yml",
utopya="utopya_cfg.yml",
batch="batch_cfg.yml",
)
"""Names and paths of valid configuration entries"""
UTOPYA_CFG_FILE_PATHS = {
k: os.path.join(UTOPYA_CFG_DIR, fname)
for k, fname in UTOPYA_CFG_FILE_NAMES.items()
}
"""Absolute configuration file paths"""
UTOPYA_CFG_SUBDIR_NAMES = dict(
models="models",
projects="projects",
)
"""Names and paths of valid configuration subdirectories"""
UTOPYA_CFG_SUBDIRS = {
k: os.path.join(UTOPYA_CFG_DIR, dirname)
for k, dirname in UTOPYA_CFG_SUBDIR_NAMES.items()
}
"""Absolute configuration file paths"""
PROJECT_INFO_FILE_SEARCH_PATHS = (
".utopya_project.yml",
".utopya-project.yml",
)
"""Potential names of project info files, relative to base directory"""
# -----------------------------------------------------------------------------
[docs]def get_cfg_path(cfg_name: str) -> str:
"""Returns the absolute path to the specified configuration file"""
try:
return UTOPYA_CFG_FILE_PATHS[cfg_name]
except KeyError as err:
_avail = ", ".join(UTOPYA_CFG_FILE_NAMES.keys())
raise ValueError(
f"No configuration entry '{cfg_name}' available! "
f"Possible keys: {_avail}"
) from err
[docs]def load_from_cfg_dir(cfg_name: str) -> dict:
"""Load a configuration file; returns empty dict if no file exists.
Args:
cfg_name (str): The name of the configuration to read
Returns:
dict: The configuration as read from the config directory; if no file
is available, will return an empty dict.
"""
cfg_fpath = get_cfg_path(cfg_name)
try:
d = load_yml(cfg_fpath)
except FileNotFoundError:
log.debug(
"No '%s' configuration file exists at %s ! Returning empty.",
cfg_name,
cfg_fpath,
)
return dict()
# If the yaml object is None for whatever reason, return an empty dict
if d is None:
return dict()
return d
[docs]def write_to_cfg_dir(cfg_name: str, obj: dict):
"""Writes a YAML represetation of the given object to the configuration
directory. Always overwrites a possibly existing file.
Args:
cfg_name (str): The configuration name
obj (dict): The yaml-representable object that is to be written;
usually a dict.
"""
write_yml(obj, path=get_cfg_path(cfg_name))