From f0c3e6029a7afc50440c3c481b2a22a1d85c6752 Mon Sep 17 00:00:00 2001 From: Christophe Benz Date: Wed, 17 Nov 2010 15:05:53 +0100 Subject: [PATCH] introduce ModuleLoadError --- weboob/applications/weboobcfg/weboobcfg.py | 11 ++++++--- weboob/core/modules.py | 27 ++++++++++++---------- weboob/core/ouiboube.py | 8 +++++-- weboob/tools/application/repl.py | 21 +++++++++++++---- 4 files changed, 46 insertions(+), 21 deletions(-) diff --git a/weboob/applications/weboobcfg/weboobcfg.py b/weboob/applications/weboobcfg/weboobcfg.py index fc74b6b3..3759a5d6 100644 --- a/weboob/applications/weboobcfg/weboobcfg.py +++ b/weboob/applications/weboobcfg/weboobcfg.py @@ -22,6 +22,7 @@ import subprocess import re from weboob.capabilities.account import ICapAccount +from weboob.core.modules import ModuleLoadError from weboob.tools.application.repl import ReplApplication from weboob.tools.ordereddict import OrderedDict @@ -169,13 +170,17 @@ class WeboobCfg(ReplApplication): Display information about a backend. """ if not line: - print 'No backend name was specified.' + print >>sys.stderr, 'You must specify a backend name. Hint: use the "backends" command.' return - backend = self.weboob.modules_loader.get_or_load_module(line) + backend = None + try: + backend = self.weboob.modules_loader.get_or_load_module(line) + except ModuleLoadError, e: + self.logger.debug(e) if not backend: - print 'No such backend: "%s"' % line + print 'Backend "%s" does not exist.' % line return 1 print '.------------------------------------------------------------------------------.' diff --git a/weboob/core/modules.py b/weboob/core/modules.py index 362755fb..176dae10 100644 --- a/weboob/core/modules.py +++ b/weboob/core/modules.py @@ -23,9 +23,19 @@ 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'] +__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): + return '%s\n%s' % (Exception.__str__(self), self.original_backtrace) class Module(object): @@ -98,9 +108,9 @@ class ModulesLoader(object): self.loaded = {} self.logger = getLogger('modules') - def get_or_load_module(self, module_name, quiet=False): + def get_or_load_module(self, module_name): if module_name not in self.loaded: - self.load_module(module_name, quiet) + self.load_module(module_name) if module_name in self.loaded: return self.loaded[module_name] else: @@ -122,19 +132,12 @@ class ModulesLoader(object): for existing_module_name in self.iter_existing_module_names(): self.load_module(existing_module_name) - def load_module(self, module_name, quiet=False): + 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: - msg = u'Unable to load module "%s": %s' % (module_name, e) - if logging.root.level == logging.DEBUG: - self.logger.exception(msg) - return - else: - if not quiet: - self.logger.error(msg) - return + raise ModuleLoadError(module_name, get_backtrace()) 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 e74f9563..20f46dbe 100644 --- a/weboob/core/ouiboube.py +++ b/weboob/core/ouiboube.py @@ -21,7 +21,7 @@ from __future__ import with_statement import os from weboob.core.bcall import BackendsCall -from weboob.core.modules import ModulesLoader +from weboob.core.modules import ModulesLoader, ModuleLoadError from weboob.core.backendscfg import BackendsConfig from weboob.core.scheduler import Scheduler from weboob.tools.backend import BaseBackend @@ -95,7 +95,11 @@ class Weboob(object): names is not None and instance_name not in names or \ modules is not None and module_name not in modules: continue - module = self.modules_loader.get_or_load_module(module_name) + module = None + try: + module = self.modules_loader.get_or_load_module(module_name) + except ModuleLoadError, e: + self.logger.debug(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/repl.py b/weboob/tools/application/repl.py index 744e443e..52f3a5ff 100644 --- a/weboob/tools/application/repl.py +++ b/weboob/tools/application/repl.py @@ -28,6 +28,7 @@ from copy import deepcopy from weboob.capabilities.account import ICapAccount, Account, AccountRegisterError from weboob.capabilities.base import FieldNotFound from weboob.core import CallErrors +from weboob.core.modules import ModuleLoadError from weboob.core.backendscfg import BackendsConfig, BackendAlreadyExists from weboob.tools.browser import BrowserUnavailable, BrowserIncorrectPassword from weboob.tools.value import Value, ValueBool, ValueFloat, ValueInt @@ -141,7 +142,12 @@ class ReplApplication(Cmd, BaseApplication): return True def register_backend(self, name, ask_add=True): - backend = self.weboob.modules_loader.get_or_load_module(name) + backend = None + try: + backend = self.weboob.modules_loader.get_or_load_module(name) + except ModuleLoadError, e: + self.logger.debug(e) + if not backend: print 'Backend "%s" does not exist.' % name return None @@ -195,15 +201,22 @@ class ReplApplication(Cmd, BaseApplication): if params is None: params = {} + backend = None if not edit: - backend = self.weboob.modules_loader.get_or_load_module(name, quiet=True) + try: + backend = self.weboob.modules_loader.get_or_load_module(name) + except ModuleLoadError, e: + self.logger.debug(e) else: bname, items = self.weboob.backends_config.get_backend(name) - backend = self.weboob.modules_loader.get_or_load_module(bname, quiet=True) + try: + backend = self.weboob.modules_loader.get_or_load_module(bname) + except ModuleLoadError, e: + self.logger.debug(e) items.update(params) params = items if not backend: - print 'Backend "%s" does not exist.' % name + print 'Backend "%s" does not exist. Hint: use the "backends" command.' % name return None # ask for params non-specified on command-line arguments