Source code for quest.util.config

import os
import yaml
import logging

from ..database import get_db


log = logging.getLogger(__name__)

settings = {}


[docs]def get_settings(): """Get the settings currently being used by QUEST. Returns: A dictionary of the current settings. Example: {'BASE_DIR': '/Users/dharhas/', 'CACHE_DIR': 'cache', 'PROJECTS_DIR': 'projects', 'USER_SERVICES': [], } """ global settings if not settings: update_settings() filename = _default_config_file() if os.path.isfile(filename): update_settings_from_file(filename) return settings
[docs]def update_settings(config={}): """Update the settings file that is being stored in the Quest settings directory. Notes: Only key/value pairs that are provided are updated, any other existing pairs are left unchanged or defaults are used. Args: config (dict): Key/value pairs of settings that are to be updated. Returns: Updated Settings Example: {'BASE_DIR': '/Users/dharhas/', 'CACHE_DIR': 'cache', 'PROJECTS_DIR': 'projects', 'USER_SERVICES': [], } """ global settings if 'BASE_DIR' in config.keys() and not os.path.isabs(config['BASE_DIR']): config['BASE_DIR'] = os.path.join(os.getcwd(), config['BASE_DIR']) settings.update(config) settings.setdefault('BASE_DIR', _default_quest_dir()) settings.setdefault('CACHE_DIR', os.path.join('.cache', 'user_cache')) settings.setdefault('PROJECTS_DIR', 'projects') settings.setdefault('USER_SERVICES', []) # reset connection to database in new PROJECT_DIR if 'BASE_DIR' in config.keys() or 'PROJECTS_DIR' in config.keys(): get_db(reconnect=True) # reload providers if 'USER_SERVICES' in config.keys(): from ..plugins.plugins import load_providers load_providers(update_cache=True) return settings
[docs]def update_settings_from_file(filename): """Update the settings from a new yaml file. Notes: Only key/value pairs that are provided are updated, any other existing pairs are left unchanged or defaults are used. Args: filename (string): Path to the yaml file containing the new settings. Returns: Updated settings Example: {'BASE_DIR': '/Users/dharhas/', 'CACHE_DIR': 'cache', 'PROJECTS_DIR': 'projects', 'USER_SERVICES': [], } """ with open(filename, 'r') as f: config = yaml.safe_load(f) # convert keys to uppercase config = dict((k.upper(), v) for k, v in config.items()) # recursively parse for local providers config['USER_SERVICES'] = _expand_dirs(config['USER_SERVICES']) log.info('Settings read from %s' % filename) update_settings(config=config) log.info('Settings updated from file %s' % filename) return settings
[docs]def save_settings(filename=None): """Save settings currently being used by QUEST to a yaml file. Args: filename (string): Path to the yaml file to save the settings. Returns: A true boolean if settings were saved successfully. """ if filename is None: filename = _default_config_file() path = os.path.dirname(filename) if path: os.makedirs(path, exist_ok=True) with open(filename, 'w') as f: f.write(yaml.safe_dump(settings, default_flow_style=False)) log.info('Settings written to %s' % filename) log.info('Settings written to %s' % filename) return True
def _default_config_file(): """Gives the absolute path of where the settings directiory is. Returns: A string that is an absolute path to the settings directory. """ base = get_settings()['BASE_DIR'] return os.path.join(base, '.settings', 'quest_config.yml') def _default_quest_dir(): """Gives the locations of the Quest directory. Returns: A string that is an absolute path to the Quest directory. """ quest_dir = os.environ.get('QUEST_DIR') if quest_dir is None: quest_dir = os.path.join(os.path.expanduser("~"), 'Quest') return quest_dir def _expand_dirs(local_services): """Gives a list of paths that have a quest yaml file in them. Notes: If any dir ends in * then walk the subdirectories looking for quest.yml Args: local_services (list): A list of avaliable paths. Returns: A list of avaliable paths to the quest yaml file. """ if local_services == []: return [] expanded = [] for path in local_services: head, tail = os.path.split(path) if tail == '*': for root, dirs, files in os.walk(head): if os.path.exists(os.path.join(root, 'quest.yml')): expanded.append(root) else: expanded.append(path) return expanded