Source code for tokio.config

#!/usr/bin/env python
"""
Load the pytokio configuration file, which is encoded as json and contains
various site-specific constants, paths, and defaults.
"""

import os
import json
from tokio.common import isstr

#: Global variable containing the configuration
CONFIG = {} 

#: Path to configuration file to load
PYTOKIO_CONFIG_FILE = "" 

#: Path of default site configuration file
DEFAULT_CONFIG_FILE = ""

[docs]def init_config(): """Loads the global configuration. Loads the site-wide configuration file, then inspects relevant environment variables for overrides. """ global CONFIG global PYTOKIO_CONFIG_FILE global DEFAULT_CONFIG_FILE # Escape hatch for cases where we want to load the module without initalizing if os.environ.get('PYTOKIO_SKIP_CONFIG') is not None: return # Set the default config path - set here rather than in the global namespace # so site-specific paths don't get baked into the autodoc documentation DEFAULT_CONFIG_FILE = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'site.json') # Load a pytokio config from a special location PYTOKIO_CONFIG_FILE = os.environ.get('PYTOKIO_CONFIG', DEFAULT_CONFIG_FILE) try: with open(PYTOKIO_CONFIG_FILE, 'r') as config_file: loaded_config = json.load(config_file) except (OSError, IOError): loaded_config = {} # Load pytokio config file and convert its keys into a set of constants for _key, _value in loaded_config.items(): # config keys beginning with an underscore get skipped if _key.startswith('_'): pass # if setting this key will overwrite something already in the tokio.config # namespace, only overwrite if the existing object is something we probably # loaded from a json _old_attribute = CONFIG.get(_key.lower()) if _old_attribute is None \ or isstr(_old_attribute) \ or isinstance(_old_attribute, (dict, list)): CONFIG[_key.lower()] = _value # Check for magic environment variables to override the contents of the config # file at runtime for _magic_variable in ['HDF5_FILES', 'ISDCT_FILES', 'LFSSTATUS_FULLNESS_FILES', 'LFSSTATUS_MAP_FILES', 'DARSHAN_LOG_DIRS', 'ESNET_SNMP_URI']: _magic_value = os.environ.get("PYTOKIO_" + _magic_variable) if _magic_value is not None: try: _magic_value_decoded = json.loads(_magic_value) except ValueError: CONFIG[_magic_variable.lower()] = _magic_value else: CONFIG[_magic_variable.lower()] = _magic_value_decoded
init_config()