Source code for brainglobe_atlasapi.config
"""Utilities for reading and modifying brainglob configuration.
Configuration is stored in a file. By default, the file is in
stored in the directory "$HOME/.config/brainglobe".
This can be overridden with the environmental variable
BRAINGLOBE_CONFIG_DIR.
"""
import configparser
import os
from pathlib import Path
import click
CONFIG_FILENAME = "bg_config.conf"
CONFIG_DEFAULT_DIR = Path.home() / ".config" / "brainglobe"
CONFIG_DIR = Path(os.environ.get("BRAINGLOBE_CONFIG_DIR", CONFIG_DEFAULT_DIR))
CONFIG_PATH = CONFIG_DIR / CONFIG_FILENAME
# 2 level dictionary for sections and values:
DEFAULT_PATH = Path.home() / ".brainglobe"
TEMPLATE_CONF_DICT = {
"default_dirs": {
"brainglobe_dir": DEFAULT_PATH,
"interm_download_dir": DEFAULT_PATH,
}
}
DEFAULT_WORKDIR = Path.home() / "brainglobe_workingdir"
[docs]
def write_default_config(path=None, template=None):
"""Write configuration file at first repo usage. In this way,
we don't need to keep a confusing template config file in the repo.
Parameters
----------
path : Path object
Path of the config file (optional).
template : dict
Template of the config file to be written (optional).
"""
if path is None:
path = CONFIG_PATH
if template is None:
template = TEMPLATE_CONF_DICT
conf = configparser.ConfigParser()
for k, val in template.items():
conf[k] = val
path.parent.mkdir(parents=True, exist_ok=True)
with open(path, "w") as f:
conf.write(f)
[docs]
def read_config(path=None):
"""Read BrainGlobe config.
Parameters
----------
path : Path object
Path of the config file (optional).
Returns
-------
ConfigParser object
brainglobe configuration
"""
if path is None:
path = CONFIG_PATH
# If no config file exists yet, write the default one:
if not path.exists():
write_default_config()
conf = configparser.ConfigParser()
conf.read(path)
return conf
[docs]
def write_config_value(key, val, path=None):
"""Write a new value in the config file. To make things simple, ignore
sections and look directly for matching parameters names.
Parameters
----------
key : str
Name of the parameter to configure.
val :
New value.
path : Path object
Path of the config file (optional).
"""
if path is None:
path = CONFIG_PATH
conf = configparser.ConfigParser()
conf.read(path)
for sect_name, sect_dict in conf.items():
if key in sect_dict.keys():
conf[sect_name][key] = str(val)
with open(path, "w") as f:
conf.write(f)
[docs]
def get_brainglobe_dir():
"""Return brainglobe default directory.
Returns
-------
Path object
default BrainGlobe directory with atlases
"""
conf = read_config()
return Path(conf["default_dirs"]["brainglobe_dir"])
[docs]
def cli_modify_config(key=0, value=0, show=False):
"""Ensure that we choose valid paths for default directory.
The path does not have to exist yet, but the parent must be valid.
"""
if not show:
if key[-3:] == "dir":
path = Path(value)
click.echo(path.parent.exists())
if not path.parent.exists():
click.echo(
f"{value} is not a valid path. Path must be "
"a valid path string, and its parent must exist!"
)
return
write_config_value(key, value)
click.echo(_print_config())
def _print_config():
"""Print configuration."""
config = read_config()
string = ""
for sect_name, sect_content in config.items():
string += f"[{sect_name}]\n"
for k, val in sect_content.items():
string += f"\t{k}: {val}\n"
return string