config: Move all code to new load function

This commit is contained in:
Thomas Adamcik 2013-04-15 23:37:40 +02:00
parent 78d3888dd1
commit 08db8829af
3 changed files with 28 additions and 53 deletions

View File

@ -49,7 +49,7 @@ def main():
try:
# Initial config without extensions to bootstrap logging.
logging_config, _ = get_config(config_files, [], config_overrides)
logging_config, _ = config_lib.load(config_files, [], config_overrides)
# TODO: setup_logging needs defaults in-case config values are None
log.setup_logging(
@ -58,7 +58,7 @@ def main():
installed_extensions = ext.load_extensions()
# TODO: wrap config in RO proxy.
config, config_errors = get_config(
config, config_errors = config_lib.load(
config_files, installed_extensions, config_overrides)
# Filter out disabled extensions and remove any config errors for them.
@ -96,19 +96,6 @@ def main():
process.stop_remaining_actors()
# TODO: move to config
def get_config(files, extensions, overrides):
# Helper to get configs, as our config system should not need to know about
# extensions.
defaults = [config_lib.core_defaults]
defaults.extend(e.get_default_config() for e in extensions)
raw_config = config_lib._load(files, defaults, overrides)
schemas = config_lib.core_schemas[:]
schemas.extend(e.get_config_schema() for e in extensions)
return config_lib._validate(raw_config, schemas)
def log_extension_info(all_extensions, enabled_extensions):
# TODO: distinguish disabled vs blocked by env?
enabled_names = set(e.ext_name for e in enabled_extensions)
@ -185,14 +172,19 @@ def show_config_callback(option, opt, value, parser):
overrides = getattr(parser.values, 'overrides', [])
extensions = ext.load_extensions()
raw_config = config_lib.load(files, overrides, extensions)
enabled_extensions = ext.filter_enabled_extensions(raw_config, extensions)
config = config_lib.validate(
raw_config, config_lib.core_schemas, enabled_extensions)
enabled_extensions = []
config, errors = config_lib.load(files, extensions, overrides)
for extension in extensions:
if ext.validate_extension(extension, config):
enabled_extensions.append(extension)
elif extension.ext_name in errors:
del errors[extension.ext_name]
# TODO: create mopidy.config.format?
output = []
for schema in config_lib.core_schemas:
for schema in config_lib._schemas:
options = config.get(schema.name, {})
if not options:
continue
@ -205,7 +197,7 @@ def show_config_callback(option, opt, value, parser):
options = config.get(schema.name, {})
output.append(schema.format(options))
else:
lines = ['[%s]' % schema.name, 'enabled = false',
lines = ['[%s]' % schema.name,
'# Config hidden as extension is disabled']
output.append('\n'.join(lines))

View File

@ -12,8 +12,6 @@ from mopidy.utils import path
logger = logging.getLogger('mopidy.config')
_config_dir = os.path.dirname(__file__)
_logging_schema = ConfigSchema('logging')
_logging_schema['console_format'] = String()
_logging_schema['debug_format'] = String()
@ -34,11 +32,7 @@ _proxy_schema['password'] = Secret(optional=True)
# NOTE: if multiple outputs ever comes something like LogLevelConfigSchema
#_outputs_schema = config.AudioOutputConfigSchema()
#: Config schemas used by mopidy itself.
core_schemas = [_logging_schema, _loglevels_schema, _audio_schema, _proxy_schema]
#: Config default used by mopidy itself.
core_defaults = io.open(os.path.join(_config_dir, 'default.conf'), 'rb').read()
_schemas = [_logging_schema, _loglevels_schema, _audio_schema, _proxy_schema]
def read(config_file):
@ -47,15 +41,19 @@ def read(config_file):
return filehandle.read()
def load(files, overrides, extensions=None):
def load(files, extensions, overrides):
# Helper to get configs, as the rest of our config system should not need
# to know about extensions.
config_dir = os.path.dirname(__file__)
defaults = [read(os.path.join(config_dir, 'default.conf'))]
if extensions:
defaults.extend(e.get_default_config() for e in extensions)
return _load(files, defaults, overrides)
defaults.extend(e.get_default_config() for e in extensions)
raw_config = _load(files, defaults, overrides)
schemas = _schemas[:]
schemas.extend(e.get_config_schema() for e in extensions)
return _validate(raw_config, schemas)
# TODO: replace load() with this version of API.
def _load(files, defaults, overrides):
parser = configparser.RawConfigParser()
@ -88,21 +86,6 @@ def _load(files, defaults, overrides):
return raw_config
def validate(raw_config, schemas, extensions=None):
# Collect config schemas to validate against
extension_schemas = [e.get_config_schema() for e in extensions or []]
config, errors = _validate(raw_config, schemas + extension_schemas)
if errors:
for section in errors:
for key, error in errors[section].items():
logger.error('Config value %s/%s %s', section, key, error)
sys.exit(1)
return config
# TODO: replace validate() with this version of API.
def _validate(raw_config, schemas):
# Get validated config
config = {}

View File

@ -48,17 +48,17 @@ def main():
config_overrides = []
# TODO: decide if we want to avoid this boilerplate some how.
logging_config = config_lib.load(config_files, config_overrides)
# Initial config without extensions to bootstrap logging.
logging_config, _ = config_lib.load(config_files, [], config_overrides)
log.setup_root_logger()
log.setup_console_logging(logging_config, options.verbosity_level)
extensions = ext.load_extensions()
raw_config = config_lib.load(config_files, config_overrides, extensions)
extensions = ext.filter_enabled_extensions(raw_config, extensions)
config = config_lib.validate(
raw_config, config_lib.core_schemas, extensions)
config, errors = config_lib.load(config_files, extensions, config_overrides)
log.setup_log_levels(config)
# TODO: missing error checking and other default setup code.
tracks = []
def store(data):