diff --git a/weboob/applications/weboobcfg/weboobcfg.py b/weboob/applications/weboobcfg/weboobcfg.py index 3759a5d6..7b412b33 100644 --- a/weboob/applications/weboobcfg/weboobcfg.py +++ b/weboob/applications/weboobcfg/weboobcfg.py @@ -173,11 +173,10 @@ class WeboobCfg(ReplApplication): print >>sys.stderr, 'You must specify a backend name. Hint: use the "backends" command.' return - backend = None try: backend = self.weboob.modules_loader.get_or_load_module(line) - except ModuleLoadError, e: - self.logger.debug(e) + except ModuleLoadError: + backend = None if not backend: print 'Backend "%s" does not exist.' % line diff --git a/weboob/core/modules.py b/weboob/core/modules.py index 6b79e110..4baa3146 100644 --- a/weboob/core/modules.py +++ b/weboob/core/modules.py @@ -23,23 +23,15 @@ import re from weboob.capabilities.base import IBaseCap from weboob.tools.backend import BaseBackend from weboob.tools.log import getLogger -from weboob.tools.misc import get_backtrace __all__ = ['Module', 'ModulesLoader', 'ModuleLoadError'] class ModuleLoadError(Exception): - def __init__(self, module_name, original_backtrace): - Exception.__init__(self, u'Unable to load module "%s"' % module_name) - self.original_backtrace = original_backtrace - - def __str__(self): - s = Exception.__str__(self) - if logging.root.level == logging.DEBUG: - s += '\n' + self.original_backtrace - return s - + def __init__(self, module_name, msg): + Exception.__init__(self, u'Unable to load module "%s": %s' % (module_name, msg)) + self.module = module_name class Module(object): def __init__(self, package): @@ -133,14 +125,19 @@ class ModulesLoader(object): def load_all(self): for existing_module_name in self.iter_existing_module_names(): - self.load_module(existing_module_name) + try: + self.load_module(existing_module_name) + except ModuleLoadError, e: + self.logger.warning(e) def load_module(self, module_name): try: package_name = 'weboob.backends.%s' % module_name module = Module(__import__(package_name, fromlist=[str(package_name)])) except ImportError, e: - raise ModuleLoadError(module_name, get_backtrace()) + if self.logger.level == logging.DEBUG: + self.logger.exception(e) + raise ModuleLoadError(module_name, e) if module.name in self.loaded: self.logger.debug('Module "%s" is already loaded from %s' % (module_name, module.package.__path__[0])) return diff --git a/weboob/core/ouiboube.py b/weboob/core/ouiboube.py index 20f46dbe..80a5e003 100644 --- a/weboob/core/ouiboube.py +++ b/weboob/core/ouiboube.py @@ -99,7 +99,7 @@ class Weboob(object): try: module = self.modules_loader.get_or_load_module(module_name) except ModuleLoadError, e: - self.logger.debug(e) + self.logger.error(e) if module is None: self.logger.warning(u'Backend "%s" is referenced in ~/.weboob/backends ' 'configuration file, but was not found. ' diff --git a/weboob/tools/application/qt/backendcfg.py b/weboob/tools/application/qt/backendcfg.py index b4008859..1b1edfd6 100644 --- a/weboob/tools/application/qt/backendcfg.py +++ b/weboob/tools/application/qt/backendcfg.py @@ -24,6 +24,7 @@ from PyQt4.QtCore import SIGNAL, Qt, QVariant, QUrl import re from logging import warning +from weboob.core.modules import ModuleLoadError from weboob.capabilities.account import ICapAccount, Account, AccountRegisterError from weboob.tools.application.qt.backendcfg_ui import Ui_BackendCfg from weboob.tools.ordereddict import OrderedDict @@ -79,7 +80,11 @@ class BackendCfg(QDialog): def loadConfiguredBackendsList(self): self.ui.configuredBackendsList.clear() for instance_name, name, params in self.weboob.backends_config.iter_backends(): - backend = self.weboob.modules_loader.get_or_load_module(name) + try: + backend = self.weboob.modules_loader.get_or_load_module(name) + except ModuleLoadError: + backend = None + if not backend or self.caps and not backend.has_caps(*self.caps): continue @@ -193,7 +198,10 @@ class BackendCfg(QDialog): self.tr('Please select a backend')) return - backend = self.weboob.modules_loader.get_or_load_module(unicode(selection[0].text()).lower()) + try: + backend = self.weboob.modules_loader.get_or_load_module(unicode(selection[0].text()).lower()) + except ModuleLoadError: + backend = None if not backend: QMessageBox.critical(self, self.tr('Unable to add a configured backend'), @@ -298,7 +306,10 @@ class BackendCfg(QDialog): if not selection: return - backend = self.weboob.modules_loader.get_or_load_module(unicode(selection[0].text()).lower()) + try: + backend = self.weboob.modules_loader.get_or_load_module(unicode(selection[0].text()).lower()) + except ModuleLoadError: + backend = None if not backend: return diff --git a/weboob/tools/application/repl.py b/weboob/tools/application/repl.py index d67c5d43..a716da36 100644 --- a/weboob/tools/application/repl.py +++ b/weboob/tools/application/repl.py @@ -142,11 +142,10 @@ class ReplApplication(Cmd, BaseApplication): return True def register_backend(self, name, ask_add=True): - backend = None try: backend = self.weboob.modules_loader.get_or_load_module(name) except ModuleLoadError, e: - self.logger.debug(e) + backend = None if not backend: print 'Backend "%s" does not exist.' % name @@ -201,18 +200,17 @@ class ReplApplication(Cmd, BaseApplication): if params is None: params = {} - backend = None if not edit: try: backend = self.weboob.modules_loader.get_or_load_module(name) except ModuleLoadError, e: - self.logger.debug(e) + backend = None else: bname, items = self.weboob.backends_config.get_backend(name) try: backend = self.weboob.modules_loader.get_or_load_module(bname) - except ModuleLoadError, e: - self.logger.debug(e) + except ModuleLoadError: + backend = None items.update(params) params = items if not backend: @@ -1053,9 +1051,9 @@ class ReplApplication(Cmd, BaseApplication): def do_inspect(self, line): """ inspect BACKEND_NAME - + Display the HTML string of the current page of the specified backend's browser. - + If webkit_mechanize_browser Python module is installed, HTML is displayed in a WebKit GUI. """ if len(self.enabled_backends) == 1: