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
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 '.------------------------------------------------------------------------------.'

View file

@ -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

View file

@ -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. '

View file

@ -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