Source code for nengo_bones.config
"""Handles the processing of nengo-bones configuration settings."""
import os
import yaml
[docs]def find_config():
"""
Finds the default nengo-bones config file.
Returns
-------
conf_file : str
Path to the default config file.
"""
# for now, assume that config file is in cwd
conf_file = os.path.join(os.getcwd(), ".nengobones.yml")
return conf_file
[docs]def fill_defaults(config):
"""
Fills in default values in a loaded config (in-place).
Parameters
----------
config : dict
Dictionary containing configuration values.
"""
if "travis_yml" in config:
config["travis_yml"].setdefault("python_version", "3.6")
config["travis_yml"].setdefault("global_vars", {})
config["travis_yml"].setdefault("pypi_user", None)
config["travis_yml"].setdefault("deploy_dists", ["sdist"])
config["travis_yml"].setdefault("bones_install", "nengo-bones")
if "codecov_yml" in config:
config["codecov_yml"].setdefault("skip_appveyor", True)
config["codecov_yml"].setdefault("abs_target", "auto")
config["codecov_yml"].setdefault("diff_target", "100%")
[docs]def validate_config(config):
"""
Validates a populated config dict.
Parameters
----------
config : dict
Dictionary containing configuration values.
"""
mandatory = ["pkg_name", "repo_name"]
if "travis_yml" in config:
mandatory.append("travis_yml.jobs")
for entry in mandatory:
tmp = config
for key in entry.split("."):
try:
tmp = tmp[key]
except KeyError:
raise KeyError("Config file must define %s" % entry)
if "ci_scripts" in config:
for ci_config in config["ci_scripts"]:
validate_ci_config(ci_config)
# TODO: check that there aren't unused config options in yml
[docs]def validate_ci_config(ci_config):
"""
Validates an entry in the ci_scripts list of a config dict.
Parameters
----------
ci_config : dict
Dictionary containing ci_scripts configuration values.
"""
if "template" not in ci_config:
raise KeyError("Script config must define 'template' "
"(for entry %s)" % ci_config)
try:
# make sure that people don't accidentally do
# pip_install: dependency (which gives a string), rather than
# pip_install:
# - dependency
for key in ("pip_install", "conda_install"):
if not isinstance(ci_config[key], list):
raise TypeError(
"%s should be a list, found '%s'; did you forget "
"to add '-' before each dependency?" % (
key, ci_config[key]))
except KeyError:
pass
[docs]def load_config(conf_file=None):
"""
Loads config values from a file and applies defaults/validation.
Parameters
----------
conf_file : str
Filepath for config file (if None, will load the default returned by
`.find_config`).
Returns
-------
config : dict
Dictionary containing configuration values.
"""
if conf_file is None:
conf_file = find_config()
if not os.path.exists(str(conf_file)):
raise RuntimeError("Could not find conf_file: %s\n\nPerhaps you are "
"not in the project's root directory?" % conf_file)
with open(str(conf_file)) as f:
config = yaml.safe_load(f)
validate_config(config)
fill_defaults(config)
return config