From 41594c116e8f6a79e1ec1c4b60d8a6f673679bfd Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Mon, 15 Apr 2013 22:43:51 +0200 Subject: [PATCH 1/2] ext: Split load into load+validate --- mopidy/__main__.py | 3 ++- mopidy/ext.py | 60 ++++++++++++++++++++++++++++++++-------------- 2 files changed, 44 insertions(+), 19 deletions(-) diff --git a/mopidy/__main__.py b/mopidy/__main__.py index 163f67ae..ad2b8c56 100644 --- a/mopidy/__main__.py +++ b/mopidy/__main__.py @@ -53,7 +53,8 @@ def main(): logging_config = config_lib.load(config_files, config_overrides) log.setup_logging( logging_config, options.verbosity_level, options.save_debug_log) - extensions = ext.load_extensions() + installed_extensions = ext.load_extensions() + extensions = ext.validate_extensions(installed_extensions) raw_config = config_lib.load(config_files, config_overrides, extensions) extensions = ext.filter_enabled_extensions(raw_config, extensions) config = config_lib.validate( diff --git a/mopidy/ext.py b/mopidy/ext.py index 9cea1bd5..b97b45d3 100644 --- a/mopidy/ext.py +++ b/mopidy/ext.py @@ -91,42 +91,66 @@ class Extension(object): def load_extensions(): - extensions = [] + """Find all installed extensions. + + :returns: list of installed extensions + """ + + installed_extensions = [] + for entry_point in pkg_resources.iter_entry_points('mopidy.ext'): logger.debug('Loading entry point: %s', entry_point) - - try: - extension_class = entry_point.load() - except pkg_resources.DistributionNotFound as ex: - logger.info( - 'Disabled extension %s: Dependency %s not found', - entry_point.name, ex) - continue - + extension_class = entry_point.load(require=False) extension = extension_class() - + extension.entry_point = entry_point + installed_extensions.append(extension) logger.debug( 'Loaded extension: %s %s', extension.dist_name, extension.version) - if entry_point.name != extension.ext_name: + names = (e.ext_name for e in installed_extensions) + logging.debug('Discovered extensions: %s', ', '.join(names)) + return installed_extensions + + +def validate_extensions(installed_extensions): + """Verify extension's dependencies and environment. + + :param installed_extensions: list of installed extensions + :returns: list of valid extensions + """ + + valid_extensions = [] + + for extension in installed_extensions: + logger.debug('Validating extension: %s', extension.ext_name) + + if extension.ext_name != extension.entry_point.name: logger.warning( 'Disabled extension %(ep)s: entry point name (%(ep)s) ' 'does not match extension name (%(ext)s)', - {'ep': entry_point.name, 'ext': extension.ext_name}) + {'ep': extension.entry_point.name, 'ext': extension.ext_name}) + continue + + try: + extension.entry_point.require() + except pkg_resources.DistributionNotFound as ex: + logger.info( + 'Disabled extension %s: Dependency %s not found', + extension.ext_name, ex) continue try: extension.validate_environment() except exceptions.ExtensionError as ex: logger.info( - 'Disabled extension %s: %s', entry_point.name, ex.message) + 'Disabled extension %s: %s', extension.ext_name, ex.message) continue - extensions.append(extension) + valid_extensions.append(extension) - names = (e.ext_name for e in extensions) - logging.debug('Discovered extensions: %s', ', '.join(names)) - return extensions + names = (e.ext_name for e in valid_extensions) + logger.debug('Valid extensions: %s', ', '.join(names)) + return valid_extensions def filter_enabled_extensions(raw_config, extensions): From 2793a384c2360b3970c82c2815052b057ecd28ac Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Mon, 15 Apr 2013 22:44:11 +0200 Subject: [PATCH 2/2] ext: Register ext's GStreamer elements --- mopidy/__main__.py | 1 + mopidy/ext.py | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/mopidy/__main__.py b/mopidy/__main__.py index ad2b8c56..cd082b9f 100644 --- a/mopidy/__main__.py +++ b/mopidy/__main__.py @@ -61,6 +61,7 @@ def main(): raw_config, config_lib.core_schemas, extensions) log.setup_log_levels(config) check_old_locations() + ext.register_gstreamer_elements(extensions) # TODO: wrap config in RO proxy. diff --git a/mopidy/ext.py b/mopidy/ext.py index b97b45d3..45497a37 100644 --- a/mopidy/ext.py +++ b/mopidy/ext.py @@ -153,6 +153,18 @@ def validate_extensions(installed_extensions): return valid_extensions +def register_gstreamer_elements(enabled_extensions): + """Registers custom GStreamer elements from extensions. + + :params enabled_extensions: list of enabled extensions + """ + + for extension in enabled_extensions: + logger.debug( + 'Registering GStreamer elements for: %s', extension.ext_name) + extension.register_gstreamer_elements() + + def filter_enabled_extensions(raw_config, extensions): boolean = config_lib.Boolean() enabled_extensions = []