diff --git a/weboob/backends/arte/backend.py b/weboob/backends/arte/backend.py index d6ebe15b26fd1a856270aa6c620b13f07cbc5782..efc316e2f3b757d2923416e02d4ef9faa3e9e61e 100644 --- a/weboob/backends/arte/backend.py +++ b/weboob/backends/arte/backend.py @@ -20,6 +20,7 @@ from weboob.capabilities.video import ICapVideo from weboob.tools.backend import BaseBackend +from weboob.tools.value import ValuesDict, Value from .browser import ArteBrowser from .video import ArteVideo @@ -35,9 +36,8 @@ class ArteBackend(BaseBackend, ICapVideo): VERSION = '0.3' DESCRIPTION = 'Arte french TV' LICENSE = 'GPLv3' - CONFIG = {'lang': BaseBackend.ConfigField(default='fr', description='Lang of videos', choices=['fr', 'de', 'en']), - 'quality': BaseBackend.ConfigField(default='hd', description='Quality of video', choices=['hd', 'sd']), - } + CONFIG = ValuesDict(Value('lang', label='Lang of videos', choices={'fr': 'French', 'de': 'Deutsch', 'en': 'English'}, default='fr'), + Value('quality', label='Quality of videos', choices=['hd', 'sd'], default='hd')) BROWSER = ArteBrowser def create_default_browser(self): diff --git a/weboob/backends/bnporc/backend.py b/weboob/backends/bnporc/backend.py index d5603fd62614859219b9485c58d0ba8acacb6048..035ce5178f6b418fd326ace49c9847fafc2c0bd1 100644 --- a/weboob/backends/bnporc/backend.py +++ b/weboob/backends/bnporc/backend.py @@ -18,6 +18,7 @@ from weboob.capabilities.bank import ICapBank, AccountNotFound from weboob.tools.backend import BaseBackend +from weboob.tools.value import ValuesDict, Value from .browser import BNPorc @@ -32,13 +33,12 @@ class BNPorcBackend(BaseBackend, ICapBank): VERSION = '0.3' LICENSE = 'GPLv3' DESCRIPTION = 'BNP Paribas french bank\' website' - CONFIG = {'login': BaseBackend.ConfigField(description='Account ID'), - 'password': BaseBackend.ConfigField(description='Password of account', is_masked=True), - 'rotating_password': BaseBackend.ConfigField( - description='Password to set when the allowed uses are exhausted (6 digits)', - default='', - regexp='^(\d{6}|)$'), - } + CONFIG = ValuesDict(Value('login', label='Account ID'), + Value('password', label='Password', masked=True), + Value('rotating_password', + label='Password to set when the allowed uses are exhausted (6 digits)', + default='', + regexp='^(\d{6}|)$')) BROWSER = BNPorc def create_default_browser(self): diff --git a/weboob/backends/bp/backend.py b/weboob/backends/bp/backend.py index 57116ce2bbf8ec3570b4a0030280f2aecb147dbf..ca7d673857781ef1cb28ba6f95accfe85190be6c 100644 --- a/weboob/backends/bp/backend.py +++ b/weboob/backends/bp/backend.py @@ -19,6 +19,7 @@ from weboob.capabilities.bank import ICapBank, AccountNotFound from weboob.tools.backend import BaseBackend +from weboob.tools.value import ValuesDict, Value from .browser import BPbrowser @@ -29,9 +30,8 @@ class BPBackend(BaseBackend, ICapBank): VERSION = '0.3' LICENSE = 'GPLv3' DESCRIPTION = u'La banque postale, French bank' - CONFIG = {'login': BaseBackend.ConfigField(description='Account ID'), - 'password': BaseBackend.ConfigField(description='Password of account', is_masked=True) - } + CONFIG = ValuesDict(Value('login', label='Account ID'), + Value('password', label='Password', masked=True)) BROWSER = BPbrowser def create_default_browser(self): diff --git a/weboob/backends/cragr/backend.py b/weboob/backends/cragr/backend.py index 1c4191c3c2ae3da43f6675b0d72ce7440e7a2a96..edc112954f7c4780b54ee010b4ce972d31367c38 100644 --- a/weboob/backends/cragr/backend.py +++ b/weboob/backends/cragr/backend.py @@ -18,10 +18,14 @@ from weboob.capabilities.bank import ICapBank, AccountNotFound from weboob.tools.backend import BaseBackend +from weboob.tools.value import ValuesDict, Value from .browser import Cragr +__all__ = ['CragrBackend'] + + class CragrBackend(BaseBackend, ICapBank): NAME = 'cragr' MAINTAINER = 'Laurent Bachelier' @@ -29,10 +33,9 @@ class CragrBackend(BaseBackend, ICapBank): VERSION = '0.3' DESCRIPTION = 'Credit Agricole french bank\'s website' LICENSE = 'GPLv3' - CONFIG = {'login': BaseBackend.ConfigField(description='Account ID'), - 'password': BaseBackend.ConfigField(description='Password of account', is_masked=True), - 'website': BaseBackend.ConfigField(description='What website to use', default='m.lefil.com'), - } + CONFIG = ValuesDict(Value('website', label='Website to use', default='m.lefil.com'), + Value('login', label='Account ID'), + Value('password', label='Password', masked=True)) BROWSER = Cragr def create_default_browser(self): diff --git a/weboob/backends/dlfp/backend.py b/weboob/backends/dlfp/backend.py index a24749e2885d0adba2d2a9307b063767c09027c7..e1e36025ed23b5c1df3798cc6a23a1f5b93b9e1b 100644 --- a/weboob/backends/dlfp/backend.py +++ b/weboob/backends/dlfp/backend.py @@ -19,6 +19,7 @@ from weboob.tools.backend import BaseBackend from weboob.tools.newsfeed import Newsfeed +from weboob.tools.value import Value, ValueBool, ValuesDict from weboob.capabilities.messages import ICapMessages, ICapMessagesPost, Message, Thread, CantSendMessage from .browser import DLFP @@ -35,11 +36,10 @@ class DLFPBackend(BaseBackend, ICapMessages, ICapMessagesPost): VERSION = '0.3' LICENSE = 'GPLv3' DESCRIPTION = "Da Linux French Page" - CONFIG = {'username': BaseBackend.ConfigField(description='Username on website', regexp='.+'), - 'password': BaseBackend.ConfigField(description='Password of account', regexp='.+', is_masked=True), - 'get_news': BaseBackend.ConfigField(default=True, description='Get newspapers'), - 'get_telegrams': BaseBackend.ConfigField(default=False, description='Get telegrams'), - } + CONFIG = ValuesDict(Value('username', label='Username', regexp='.+'), + Value('password', label='Password', regexp='.+', masked=True), + ValueBool('get_news', label='Get newspapers', default=True), + ValueBool('get_telegrams', label='Get telegrams', default=False)) STORAGE = {'seen': {}} BROWSER = DLFP RSS_TELEGRAMS= "https://linuxfr.org/backend/journaux/rss20.rss" diff --git a/weboob/backends/fourchan/backend.py b/weboob/backends/fourchan/backend.py index 3852e3c8dcd9bd2934e550b1831709786100d431..28e4b8adb2b03f37be25eafa8bd2696684ee49e4 100644 --- a/weboob/backends/fourchan/backend.py +++ b/weboob/backends/fourchan/backend.py @@ -22,6 +22,7 @@ from weboob.capabilities.messages import ICapMessages, Message, Thread from weboob.tools.backend import BaseBackend +from weboob.tools.value import Value, ValuesDict from .browser import FourChan @@ -36,8 +37,7 @@ class FourChanBackend(BaseBackend, ICapMessages): VERSION = '0.3' LICENSE = 'GPLv3' DESCRIPTION = "4chan website" - CONFIG = {'boards': BaseBackend.ConfigField(description='Boards'), - } + CONFIG = ValuesDict(Value('boards', label='Boards to fetch')) STORAGE = {'boards': {}} BROWSER = FourChan diff --git a/weboob/backends/gazelle/backend.py b/weboob/backends/gazelle/backend.py index 39c5683c3c730e44a5a44ca52343bd87c7dc343b..9d52c5f389394b637d41cc29229e3c73c6107120 100644 --- a/weboob/backends/gazelle/backend.py +++ b/weboob/backends/gazelle/backend.py @@ -17,6 +17,7 @@ from weboob.capabilities.torrent import ICapTorrent from weboob.tools.backend import BaseBackend +from weboob.tools.value import ValuesDict, Value from .browser import GazelleBrowser @@ -31,11 +32,10 @@ class GazelleBackend(BaseBackend, ICapTorrent): VERSION = '0.3' DESCRIPTION = 'gazelle bittorrent tracker' LICENSE = 'GPLv3' - CONFIG = {'username': BaseBackend.ConfigField(description='Username on website'), - 'password': BaseBackend.ConfigField(description='Password of account', is_masked=True), - 'protocol': BaseBackend.ConfigField(description='Protocol to use', choices=('http', 'https')), - 'domain': BaseBackend.ConfigField(description='Domain (example "ssl.what.cd")'), - } + CONFIG = ValuesDict(Value('domain', label='Domain (example "ssl.what.cd")'), + Value('protocol', label='Protocol to use', choices=('http', 'https')), + Value('username', label='Username'), + Value('password', label='Password', masked=True)) BROWSER = GazelleBrowser def create_default_browser(self): diff --git a/weboob/backends/geolocip/backend.py b/weboob/backends/geolocip/backend.py index 6b5d6949b46176b857cd63608fe8d8d91ca963f9..6c8cfc038fd82468caa426a1e12667b30aae5d52 100644 --- a/weboob/backends/geolocip/backend.py +++ b/weboob/backends/geolocip/backend.py @@ -21,6 +21,7 @@ from weboob.capabilities.base import NotAvailable from weboob.tools.backend import BaseBackend from weboob.tools.browser import BaseBrowser +from weboob.tools.value import ValuesDict, Value __all__ = ['GeolocIpBackend'] @@ -33,9 +34,8 @@ class GeolocIpBackend(BaseBackend, ICapGeolocIp): VERSION = '0.3' LICENSE = 'GPLv3' DESCRIPTION = u"IP Adresses geolocalisation" - CONFIG = {'email': BaseBackend.ConfigField(description='Username on website'), - 'password': BaseBackend.ConfigField(description='Password of account', is_masked=True), - } + CONFIG = ValuesDict(Value('email', label='Username'), + Value('password',label='Password', masked=True)) BROWSER = BaseBrowser def create_default_browser(self): diff --git a/weboob/backends/lcl/backend.py b/weboob/backends/lcl/backend.py index 287492979f475ae4417063d3c37114b4e23f1627..36069388a5a38261873e6357c66768245681704c 100644 --- a/weboob/backends/lcl/backend.py +++ b/weboob/backends/lcl/backend.py @@ -18,6 +18,7 @@ from weboob.capabilities.bank import ICapBank, AccountNotFound from weboob.tools.backend import BaseBackend +from weboob.tools.value import ValuesDict, Value from .browser import LCLBrowser @@ -32,10 +33,9 @@ class LCLBackend(BaseBackend, ICapBank): VERSION = '0.3' DESCRIPTION = 'Le Credit Lyonnais crappy french bank' LICENSE = 'GPLv3' - CONFIG = {'login': BaseBackend.ConfigField(description='Account ID'), - 'password': BaseBackend.ConfigField(description='Password of account', is_masked=True), - 'agency': BaseBackend.ConfigField(description='Agency code', regexp='^\d{1,3}$'), - } + CONFIG = ValuesDict(Value('login', label='Account ID'), + Value('password', label='Password of account', masked=True), + Value('agency', label='Agency code', regexp='^\d{1,3}$')) BROWSER = LCLBrowser def create_default_browser(self): diff --git a/weboob/backends/newsfeed/backend.py b/weboob/backends/newsfeed/backend.py index bef29ea6c628f60f19238a55bdb6d4a1366ccf53..711751a0928399412326bb5f8241e4399ddaca33 100644 --- a/weboob/backends/newsfeed/backend.py +++ b/weboob/backends/newsfeed/backend.py @@ -19,8 +19,10 @@ from weboob.tools.backend import BaseBackend from weboob.capabilities.messages import ICapMessages, Message, Thread from weboob.tools.newsfeed import Newsfeed +from weboob.tools.value import Value, ValuesDict +__all__ = ['NewsfeedBackend'] class NewsfeedBackend(BaseBackend, ICapMessages): @@ -30,7 +32,7 @@ class NewsfeedBackend(BaseBackend, ICapMessages): VERSION = "0.3" DESCRIPTION = "Loads RSS and Atom feeds from any websites" LICENSE = "GPLv3" - CONFIG = {'url': BaseBackend.ConfigField(description="Atom/RSS feed's url"),} + CONFIG = ValuesDict(Value('url', label="Atom/RSS feed's url")) STORAGE = {'seen': []} diff --git a/weboob/backends/redmine/backend.py b/weboob/backends/redmine/backend.py index be22d5676225a6d3d9b70d7d684f9fa1deac8b85..9e0986f88b40243425bae36fec660485e5b1159e 100644 --- a/weboob/backends/redmine/backend.py +++ b/weboob/backends/redmine/backend.py @@ -20,6 +20,7 @@ from weboob.capabilities.content import ICapContent, Content from weboob.tools.backend import BaseBackend +from weboob.tools.value import ValuesDict, Value from .browser import RedmineBrowser @@ -34,10 +35,9 @@ class RedmineBackend(BaseBackend, ICapContent): VERSION = '0.3' DESCRIPTION = 'The Redmine project management web application' LICENSE = 'GPLv3' - CONFIG = {'url': BaseBackend.ConfigField(description='URL of the Redmine'), - 'username': BaseBackend.ConfigField(description='Login'), - 'password': BaseBackend.ConfigField(description='Password', is_masked=True), - } + CONFIG = ValuesDict(Value('url', label='URL of the Redmine website'), + Value('username', label='Login'), + Value('password', label='Password', masked=True)) BROWSER = RedmineBrowser def create_default_browser(self): diff --git a/weboob/tools/backend.py b/weboob/tools/backend.py index 56e880facc0bf428a436e99c62181eb8badd9fe1..3591e3e94147a6b4f2c7267990c93f69e0a0a21b 100644 --- a/weboob/tools/backend.py +++ b/weboob/tools/backend.py @@ -16,7 +16,6 @@ # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -import re import os from threading import RLock from logging import debug @@ -72,7 +71,7 @@ class BaseBackend(object): # Icon file path ICON = None # Configuration required for this backend. - # Values must be ConfigField objects. + # Values must be weboob.tools.value.Value objects. CONFIG = {} # Storage STORAGE = {} @@ -85,14 +84,6 @@ class BaseBackend(object): # NOT yet filled. OBJECTS = {} - class ConfigField(object): - def __init__(self, default=None, is_masked=False, regexp=None, description=None, choices=None): - self.default = default - self.is_masked = is_masked - self.regexp = regexp - self.description = description - self.choices = choices - class ConfigError(Exception): pass def __enter__(self): @@ -115,29 +106,20 @@ def __init__(self, weboob, name, config, storage): # Configuration of backend self.config = {} for name, field in self.CONFIG.iteritems(): - value = config.get(name, field.default) + value = config.get(name, None) if value is None: - raise BaseBackend.ConfigError('Missing parameter "%s" (%s)' % (name, field.description)) - - if field.regexp and not re.match(field.regexp, str(value)): - raise BaseBackend.ConfigError('Value of "%s" does not match regexp "%s"' % (name, field.regexp)) - - if not field.default is None: - if isinstance(field.default, bool) and not isinstance(value, bool): - value = value.lower() in ('1', 'true', 'on', 'yes') - elif isinstance(field.default, int) and not isinstance(value, int): - value = int(value) - elif isinstance(field.default, float) and not isinstance(value, float): - value = float(value) - - if field.choices: - if (isinstance(field.choices, (tuple,list)) and not value in field.choices) or \ - (isinstance(field.choices, dict) and not value in field.choices.iterkeys()): - raise BaseBackend.ConfigError('Value of "%s" might be in this list: %s' % (name, - ', '.join([s for s in (field.choices.iterkeys() if isinstance(field.choices, dict) - else field.choices)]))) - self.config[name] = value + if field.required: + raise BaseBackend.ConfigError('Backend(%s): Configuration error: Missing parameter "%s" (%s)' % (self.name, name, field.description)) + value = field.default + + try: + field.set_value(value) + except ValueError, v: + raise BaseBackend.ConfigError('Backend(%s): Configuration error for field "%s": %s' % (self.name, name, v)) + + # field.value is a property which converts string to right type (bool/int/float) + self.config[name] = field.value self.storage = BackendStorage(self.name, storage) self.storage.load(self.STORAGE)