# Copyright 2017 Palantir Technologies, Inc.
import configparser
import logging
import os
import sys
log = logging.getLogger(__name__)
class ConfigSource(object):
"""Base class for implementing a config source."""
def __init__(self, root_path):
self.root_path = root_path
self.is_windows = sys.platform == 'win32'
self.xdg_home = os.environ.get(
'XDG_CONFIG_HOME', os.path.expanduser('~/.config')
)
def user_config(self):
"""Return user-level (i.e. home directory) configuration."""
raise NotImplementedError()
def project_config(self, document_path):
"""Return project-level (i.e. workspace directory) configuration."""
raise NotImplementedError()
@staticmethod
def read_config_from_files(files):
config = configparser.RawConfigParser()
for filename in files:
if os.path.exists(filename) and not os.path.isdir(filename):
config.read(filename)
return config
@staticmethod
def parse_config(config, key, options):
"""Parse the config with the given options."""
conf = {}
for source, destination, opt_type in options:
opt_value = _get_opt(config, key, source, opt_type)
if opt_value is not None:
_set_opt(conf, destination, opt_value)
return conf
def _get_opt(config, key, option, opt_type):
"""Get an option from a configparser with the given type."""
for opt_key in [option, option.replace('-', '_')]:
if not config.has_option(key, opt_key):
continue
if opt_type == bool:
return config.getboolean(key, opt_key)
if opt_type == int:
return config.getint(key, opt_key)
if opt_type == str:
return config.get(key, opt_key)
if opt_type == list:
return _parse_list_opt(config.get(key, opt_key))
raise ValueError("Unknown option type: %s" % opt_type)
def _parse_list_opt(string):
return [s.strip() for s in string.split(",") if s.strip()]
def _set_opt(config_dict, path, value):
"""Set the value in the dictionary at the given path if the value is not None."""
if value is None:
return
if '.' not in path:
config_dict[path] = value
return
key, rest = path.split(".", 1)
if key not in config_dict:
config_dict[key] = {}
_set_opt(config_dict[key], rest, value)