From 08db8829af57a304c63c29e97602e8dc789606fd Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Mon, 15 Apr 2013 23:37:40 +0200 Subject: [PATCH] config: Move all code to new load function --- mopidy/__main__.py | 34 +++++++++++++--------------------- mopidy/config/__init__.py | 37 ++++++++++--------------------------- mopidy/scanner.py | 10 +++++----- 3 files changed, 28 insertions(+), 53 deletions(-) diff --git a/mopidy/__main__.py b/mopidy/__main__.py index ca99238a..2534657f 100644 --- a/mopidy/__main__.py +++ b/mopidy/__main__.py @@ -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)) diff --git a/mopidy/config/__init__.py b/mopidy/config/__init__.py index 2e135ceb..823323f3 100644 --- a/mopidy/config/__init__.py +++ b/mopidy/config/__init__.py @@ -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 = {} diff --git a/mopidy/scanner.py b/mopidy/scanner.py index 226fd410..b30c8ac5 100644 --- a/mopidy/scanner.py +++ b/mopidy/scanner.py @@ -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):