From 7630dac4e697a6d265407ebf498d7dab90f20982 Mon Sep 17 00:00:00 2001 From: Romain Bignon Date: Thu, 8 Apr 2010 22:00:37 +0200 Subject: [PATCH] new backends storage system --- weboob/backend.py | 7 ++++- weboob/modules.py | 4 +-- weboob/ouiboube.py | 8 +++--- weboob/tools/storage.py | 58 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 70 insertions(+), 7 deletions(-) create mode 100644 weboob/tools/storage.py diff --git a/weboob/backend.py b/weboob/backend.py index de86f76b..9af7e8b6 100644 --- a/weboob/backend.py +++ b/weboob/backend.py @@ -36,6 +36,8 @@ class Backend(object): # Configuration required for this module. # Values must be ConfigField # objects. CONFIG = {} + # Storage + STORAGE = {} class ConfigField(object): def __init__(self, default=None, is_masked=False, regexp=None, description=None): @@ -46,7 +48,7 @@ class Backend(object): class ConfigError(Exception): pass - def __init__(self, weboob, name, config): + def __init__(self, weboob, name, config, storage): self.weboob = weboob self.name = name self.config = {} @@ -67,6 +69,9 @@ class Backend(object): elif isinstance(field.default, float): value = float(value) self.config[name] = value + self.storage = storage + if self.storage: + self.storage.load(self.name, self.CONFIG) def has_caps(self, *caps): for c in caps: diff --git a/weboob/modules.py b/weboob/modules.py index 2f39df50..16784126 100644 --- a/weboob/modules.py +++ b/weboob/modules.py @@ -72,8 +72,8 @@ class Module: return True return False - def create_backend(self, weboob, name, config): - return self.klass(weboob, name, config) + def create_backend(self, weboob, name, config, storage): + return self.klass(weboob, name, config, storage) class BackendsConfig: class WrongPermissions(Exception): diff --git a/weboob/ouiboube.py b/weboob/ouiboube.py index 53bc7af4..e984ed4c 100644 --- a/weboob/ouiboube.py +++ b/weboob/ouiboube.py @@ -54,7 +54,7 @@ class Weboob: backends_filename = os.path.join(self.workdir, backends_filename) self.backends_config = BackendsConfig(backends_filename) - def load_backends(self, caps=None, names=None): + def load_backends(self, caps=None, names=None, storage=None): for name, _type, params in self.backends_config.iter_backends(): try: module = self.modules_loader.get_or_load_module(_type) @@ -68,19 +68,19 @@ class Weboob: continue try: - self.backends[name] = module.create_backend(self, name, params) + self.backends[name] = module.create_backend(self, name, params, storage) except Exception, e: warning('Unable to load "%s" backend: %s. filename=%s' % (name, e, self.backends_config.confpath)) return self.backends - def load_modules(self, caps=None, names=None): + def load_modules(self, caps=None, names=None, storage=None): self.modules_loader.load() for name, module in self.modules_loader.modules.iteritems(): if (caps is None or module.has_caps(caps)) and \ (names is None or module.name in names): try: - self.backends[module.name] = module.create_backend(self, module.name, {}) + self.backends[module.name] = module.create_backend(self, module.name, {}, storage) except Exception, e: warning('Unable to load "%s" module as backend with no config: %s' % (name, e)) return self.backends diff --git a/weboob/tools/storage.py b/weboob/tools/storage.py new file mode 100644 index 00000000..35f50faf --- /dev/null +++ b/weboob/tools/storage.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- + +""" +Copyright(C) 2010 Romain Bignon + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, version 3 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +""" + +from logging import debug + +class IStorage: + def load(self, backend, default={}): + raise NotImplementedError() + + def save(self, backend): + raise NotImplementedError() + + def set(self, backend, *args): + raise NotImplementedError() + + def get(self, backend, *args, **kwargs): + raise NotImplementedError() + +try: + from .config.yamlconfig import YamlConfig, ConfigError +except ImportError, e: + debug('Import error for weboob.tools.config.yamlconfig: %s' % e) +else: + class StandardStorage(IStorage): + def __init__(self, path): + self.config = YamlConfig(path) + self.config.load() + + def load(self, backend, default={}): + d = self.config.values.get(backend, {}) + self.config.values[backend] = default.copy() + self.config.values[backend].update(d) + + def save(self): + self.config.save() + + def set(self, backend, *args): + self.config.set(backend, self.backends[backend]) + + def get(self, backend, *args, **kwargs): + return self.config.get(backend, *args, **kwargs)