introduce ModuleLoadError
This commit is contained in:
parent
c900413e64
commit
f0c3e6029a
4 changed files with 46 additions and 21 deletions
|
|
@ -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 '.------------------------------------------------------------------------------.'
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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. '
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue