introduce ModuleLoadError

This commit is contained in:
Christophe Benz 2010-11-17 15:05:53 +01:00
commit f0c3e6029a
4 changed files with 46 additions and 21 deletions

View file

@ -22,6 +22,7 @@ import subprocess
import re import re
from weboob.capabilities.account import ICapAccount from weboob.capabilities.account import ICapAccount
from weboob.core.modules import ModuleLoadError
from weboob.tools.application.repl import ReplApplication from weboob.tools.application.repl import ReplApplication
from weboob.tools.ordereddict import OrderedDict from weboob.tools.ordereddict import OrderedDict
@ -169,13 +170,17 @@ class WeboobCfg(ReplApplication):
Display information about a backend. Display information about a backend.
""" """
if not line: if not line:
print 'No backend name was specified.' print >>sys.stderr, 'You must specify a backend name. Hint: use the "backends" command.'
return 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: if not backend:
print 'No such backend: "%s"' % line print 'Backend "%s" does not exist.' % line
return 1 return 1
print '.------------------------------------------------------------------------------.' print '.------------------------------------------------------------------------------.'

View file

@ -23,9 +23,19 @@ 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'] __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): class Module(object):
@ -98,9 +108,9 @@ class ModulesLoader(object):
self.loaded = {} self.loaded = {}
self.logger = getLogger('modules') 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: if module_name not in self.loaded:
self.load_module(module_name, quiet) self.load_module(module_name)
if module_name in self.loaded: if module_name in self.loaded:
return self.loaded[module_name] return self.loaded[module_name]
else: else:
@ -122,19 +132,12 @@ class ModulesLoader(object):
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) self.load_module(existing_module_name)
def load_module(self, module_name, quiet=False): 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:
msg = u'Unable to load module "%s": %s' % (module_name, e) raise ModuleLoadError(module_name, get_backtrace())
if logging.root.level == logging.DEBUG:
self.logger.exception(msg)
return
else:
if not quiet:
self.logger.error(msg)
return
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

@ -21,7 +21,7 @@ from __future__ import with_statement
import os import os
from weboob.core.bcall import BackendsCall 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.backendscfg import BackendsConfig
from weboob.core.scheduler import Scheduler from weboob.core.scheduler import Scheduler
from weboob.tools.backend import BaseBackend from weboob.tools.backend import BaseBackend
@ -95,7 +95,11 @@ class Weboob(object):
names is not None and instance_name not in names or \ names is not None and instance_name not in names or \
modules is not None and module_name not in modules: modules is not None and module_name not in modules:
continue 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: 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

@ -28,6 +28,7 @@ from copy import deepcopy
from weboob.capabilities.account import ICapAccount, Account, AccountRegisterError from weboob.capabilities.account import ICapAccount, Account, AccountRegisterError
from weboob.capabilities.base import FieldNotFound from weboob.capabilities.base import FieldNotFound
from weboob.core import CallErrors from weboob.core import CallErrors
from weboob.core.modules import ModuleLoadError
from weboob.core.backendscfg import BackendsConfig, BackendAlreadyExists from weboob.core.backendscfg import BackendsConfig, BackendAlreadyExists
from weboob.tools.browser import BrowserUnavailable, BrowserIncorrectPassword from weboob.tools.browser import BrowserUnavailable, BrowserIncorrectPassword
from weboob.tools.value import Value, ValueBool, ValueFloat, ValueInt from weboob.tools.value import Value, ValueBool, ValueFloat, ValueInt
@ -141,7 +142,12 @@ 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 = 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: if not backend:
print 'Backend "%s" does not exist.' % name print 'Backend "%s" does not exist.' % name
return None return None
@ -195,15 +201,22 @@ class ReplApplication(Cmd, BaseApplication):
if params is None: if params is None:
params = {} params = {}
backend = None
if not edit: 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: else:
bname, items = self.weboob.backends_config.get_backend(name) 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) items.update(params)
params = items params = items
if not backend: if not backend:
print 'Backend "%s" does not exist.' % name print 'Backend "%s" does not exist. Hint: use the "backends" command.' % name
return None return None
# ask for params non-specified on command-line arguments # ask for params non-specified on command-line arguments