Source code for acorn.config
"""Config parser to get the configuration for each of the packages being wrapped
by acorn.
"""
packages = {}
"""dict: keys are package names, values are ConfigParser() instances with
configuration information for each package.
"""
from six.moves.configparser import ConfigParser
[docs]class CaseConfigParser(ConfigParser):
"""Case-sensitive configuration parser; we need to preseve the
case-sensitive names of FQDNs in the option strings.
"""
def optionxform(self, optionstr):
return optionstr
[docs]def config_dir(mkcustom=False):
"""Returns the configuration directory for custom package settings.
"""
from acorn.utility import reporoot
from acorn.base import testmode
from os import path
alternate = path.join(path.abspath(path.expanduser("~")), ".acorn")
if testmode or (not path.isdir(alternate) and not mkcustom):
return path.join(reporoot, "acorn", "config")
else:
if mkcustom:# pragma: no cover
#This never gets reached when we are in testmode because we don't
#want to clobber the user's local config cache.
from os import mkdir
mkdir(alternate)
return alternate
def _package_path(package):
"""Returns the full path to the default package configuration file.
Args:
package (str): name of the python package to return a path for.
"""
from os import path
confdir = config_dir()
return path.join(confdir, "{}.cfg".format(package))
def _read_single(parser, filepath):
"""Reads a single config file into the parser, silently failing if the file
does not exist.
Args:
parser (ConfigParser): parser to read the file into.
filepath (str): full path to the config file.
"""
from os import path
global packages
if path.isfile(filepath):
parser.readfp(open(filepath))
[docs]def settings(package, reload_=False):
"""Returns the config settings for the specified package.
Args:
package (str): name of the python package to get settings for.
"""
global packages
if package not in packages or reload_:
from os import path
result = CaseConfigParser()
if package != "acorn":
confpath = _package_path(package)
_read_single(result, confpath)
_read_single(result, _package_path("acorn"))
packages[package] = result
return packages[package]
def _descriptor_path(package):
"""Returns the full path to the default package configuration file.
Args:
package (str): name of the python package to return a path for.
"""
from os import path
return path.join(config_dir(), "{}.json".format(package))
[docs]def descriptors(package):
"""Returns a dictionary of descriptors deserialized from JSON for the
specified package.
Args:
package (str): name of the python package to get settings for.
"""
from os import path
dpath = _descriptor_path(package)
if path.isfile(dpath):
import json
with open(dpath) as f:
jdb = json.load(f)
return jdb
else:
return None