fixes related to ModuleLoadError

This commit is contained in:
Romain Bignon 2010-11-17 19:43:25 +01:00
commit b6821b0567
5 changed files with 33 additions and 28 deletions

View file

@ -173,11 +173,10 @@ class WeboobCfg(ReplApplication):
print >>sys.stderr, 'You must specify a backend name. Hint: use the "backends" command.' print >>sys.stderr, 'You must specify a backend name. Hint: use the "backends" command.'
return return
backend = None
try: try:
backend = self.weboob.modules_loader.get_or_load_module(line) backend = self.weboob.modules_loader.get_or_load_module(line)
except ModuleLoadError, e: except ModuleLoadError:
self.logger.debug(e) backend = None
if not backend: if not backend:
print 'Backend "%s" does not exist.' % line print 'Backend "%s" does not exist.' % line

View file

@ -23,23 +23,15 @@ import re
from weboob.capabilities.base import IBaseCap from weboob.capabilities.base import IBaseCap
from weboob.tools.backend import BaseBackend from weboob.tools.backend import BaseBackend
from weboob.tools.log import getLogger from weboob.tools.log import getLogger
from weboob.tools.misc import get_backtrace
__all__ = ['Module', 'ModulesLoader', 'ModuleLoadError'] __all__ = ['Module', 'ModulesLoader', 'ModuleLoadError']
class ModuleLoadError(Exception): class ModuleLoadError(Exception):
def __init__(self, module_name, original_backtrace): def __init__(self, module_name, msg):
Exception.__init__(self, u'Unable to load module "%s"' % module_name) Exception.__init__(self, u'Unable to load module "%s": %s' % (module_name, msg))
self.original_backtrace = original_backtrace self.module = module_name
def __str__(self):
s = Exception.__str__(self)
if logging.root.level == logging.DEBUG:
s += '\n' + self.original_backtrace
return s
class Module(object): class Module(object):
def __init__(self, package): def __init__(self, package):
@ -133,14 +125,19 @@ class ModulesLoader(object):
def load_all(self): def load_all(self):
for existing_module_name in self.iter_existing_module_names(): 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): def load_module(self, module_name):
try: try:
package_name = 'weboob.backends.%s' % module_name package_name = 'weboob.backends.%s' % module_name
module = Module(__import__(package_name, fromlist=[str(package_name)])) module = Module(__import__(package_name, fromlist=[str(package_name)]))
except ImportError, e: 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: if module.name in self.loaded:
self.logger.debug('Module "%s" is already loaded from %s' % (module_name, module.package.__path__[0])) self.logger.debug('Module "%s" is already loaded from %s' % (module_name, module.package.__path__[0]))
return return

View file

@ -99,7 +99,7 @@ class Weboob(object):
try: try:
module = self.modules_loader.get_or_load_module(module_name) module = self.modules_loader.get_or_load_module(module_name)
except ModuleLoadError, e: except ModuleLoadError, e:
self.logger.debug(e) self.logger.error(e)
if module is None: if module is None:
self.logger.warning(u'Backend "%s" is referenced in ~/.weboob/backends ' self.logger.warning(u'Backend "%s" is referenced in ~/.weboob/backends '
'configuration file, but was not found. ' 'configuration file, but was not found. '

View file

@ -24,6 +24,7 @@ from PyQt4.QtCore import SIGNAL, Qt, QVariant, QUrl
import re import re
from logging import warning from logging import warning
from weboob.core.modules import ModuleLoadError
from weboob.capabilities.account import ICapAccount, Account, AccountRegisterError from weboob.capabilities.account import ICapAccount, Account, AccountRegisterError
from weboob.tools.application.qt.backendcfg_ui import Ui_BackendCfg from weboob.tools.application.qt.backendcfg_ui import Ui_BackendCfg
from weboob.tools.ordereddict import OrderedDict from weboob.tools.ordereddict import OrderedDict
@ -79,7 +80,11 @@ class BackendCfg(QDialog):
def loadConfiguredBackendsList(self): def loadConfiguredBackendsList(self):
self.ui.configuredBackendsList.clear() self.ui.configuredBackendsList.clear()
for instance_name, name, params in self.weboob.backends_config.iter_backends(): 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): if not backend or self.caps and not backend.has_caps(*self.caps):
continue continue
@ -193,7 +198,10 @@ class BackendCfg(QDialog):
self.tr('Please select a backend')) self.tr('Please select a backend'))
return 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: if not backend:
QMessageBox.critical(self, self.tr('Unable to add a configured backend'), QMessageBox.critical(self, self.tr('Unable to add a configured backend'),
@ -298,7 +306,10 @@ class BackendCfg(QDialog):
if not selection: if not selection:
return 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: if not backend:
return return

View file

@ -142,11 +142,10 @@ class ReplApplication(Cmd, BaseApplication):
return True return True
def register_backend(self, name, ask_add=True): def register_backend(self, name, ask_add=True):
backend = None
try: try:
backend = self.weboob.modules_loader.get_or_load_module(name) backend = self.weboob.modules_loader.get_or_load_module(name)
except ModuleLoadError, e: except ModuleLoadError, e:
self.logger.debug(e) backend = None
if not backend: if not backend:
print 'Backend "%s" does not exist.' % name print 'Backend "%s" does not exist.' % name
@ -201,18 +200,17 @@ class ReplApplication(Cmd, BaseApplication):
if params is None: if params is None:
params = {} params = {}
backend = None
if not edit: if not edit:
try: try:
backend = self.weboob.modules_loader.get_or_load_module(name) backend = self.weboob.modules_loader.get_or_load_module(name)
except ModuleLoadError, e: except ModuleLoadError, e:
self.logger.debug(e) backend = None
else: else:
bname, items = self.weboob.backends_config.get_backend(name) bname, items = self.weboob.backends_config.get_backend(name)
try: try:
backend = self.weboob.modules_loader.get_or_load_module(bname) backend = self.weboob.modules_loader.get_or_load_module(bname)
except ModuleLoadError, e: except ModuleLoadError:
self.logger.debug(e) backend = None
items.update(params) items.update(params)
params = items params = items
if not backend: if not backend:
@ -1053,9 +1051,9 @@ class ReplApplication(Cmd, BaseApplication):
def do_inspect(self, line): def do_inspect(self, line):
""" """
inspect BACKEND_NAME inspect BACKEND_NAME
Display the HTML string of the current page of the specified backend's browser. 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 webkit_mechanize_browser Python module is installed, HTML is displayed in a WebKit GUI.
""" """
if len(self.enabled_backends) == 1: if len(self.enabled_backends) == 1: