Source code for dival.config

# -*- coding: utf-8 -*-
"""
Configuration of the library.

The module variable :obj:`CONFIG` holds the current configuration.

The library configuration is stored in the file ``~/.dival/config.json``.
If the config file does not exist when the library is imported, it is created
using default values.
Changes made in ``config.json`` are loaded when the library is (re-)imported.
"""
import os
import json

CONFIG = {
 'lodopab_dataset': {
  'data_path': os.path.normpath(
      os.path.expanduser('~/.dival/datasets/lodopab'))
 },
 'reference_params': {
  'data_path': os.path.normpath(
      os.path.expanduser('~/.dival/reference_params'))
 }
}
"""
Global configuration dict.

Holds the current configuration of the library. On ``import dival``, the
configuration is loaded from ``~/.dival/config.json``.
"""

# configuration loaded from config file, overrides hardcoded configuration
CONFIG_FILENAME = os.path.normpath(os.path.expanduser('~/.dival/config.json'))
"""
Path of the configuration file.
The value is given by ``'~/.dival/config.json'``, expanded and normalized.
"""

# automatically write config file if not existing (e.g., on first import)
if not os.path.isfile(CONFIG_FILENAME):
    os.makedirs(os.path.dirname(CONFIG_FILENAME), exist_ok=True)
    with open(CONFIG_FILENAME, 'w') as config_fp:
        json.dump(CONFIG, config_fp, indent=1)
with open(CONFIG_FILENAME, 'r') as config_fp:
    CONFIG.update(json.load(config_fp))


[docs]def get_config(key_path='/'): """ Return (sub-)configuration stored in config file. Note that values may differ from the current ``CONFIG`` variable if it was manipulated directly. Parameters ---------- key_path : str, optional ``'/'``-separated path to sub-configuration. Default is ``'/'``, which returns the full configuration dict. Returns ------- sub_config (sub-)configuration, either a dict or a value """ keys = [k for k in key_path.split('/') if k != ''] with open(CONFIG_FILENAME, 'r') as config_fp: config = json.load(config_fp) sub_config = config for k in keys: sub_config = sub_config[k] return sub_config
[docs]def set_config(key_path, value, verbose=True): """ Updates (sub-)configuration both in ``CONFIG`` variable and in config file. Parameters ---------- key_path : str, optional ``'/'``-separated path to sub-configuration. Pass ``'/'`` to replace the full configuration dict. value : object (sub-)configuration value. Either a dict, which is copied, or a value. """ global CONFIG c = get_config() keys = [k for k in key_path.split('/') if k != ''] if isinstance(value, dict): value = value.copy() if len(keys) == 0: CONFIG = value c = value else: sub_config = CONFIG sub_c = c for k in keys[:-1]: sub_config = sub_config[k] sub_c = sub_c[k] sub_config[keys[-1]] = value sub_c[keys[-1]] = value with open(CONFIG_FILENAME, 'w') as config_fp: json.dump(c, config_fp, indent=1) if verbose: print("updated configuration in '{}':".format(CONFIG_FILENAME)) print("'{}' = {}".format(key_path, value))