diff --git a/setup.py b/setup.py index 70e216ab..70957bbc 100755 --- a/setup.py +++ b/setup.py @@ -39,6 +39,6 @@ setup( packages=find_packages(exclude=['ez_setup']), scripts=[os.path.join('scripts', script) for script in os.listdir('scripts')], install_requires=[ - 'pyyaml', + # 'pyyaml', ] ) diff --git a/weboob/tools/application/__init__.py b/weboob/tools/application/__init__.py index 16b52cd1..5e4b769b 100644 --- a/weboob/tools/application/__init__.py +++ b/weboob/tools/application/__init__.py @@ -18,7 +18,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. """ -from .base import BaseApplication +from .base import BaseApplication, ConfigError from .console import ConsoleApplication from .prompt import PromptApplication diff --git a/weboob/tools/application/base.py b/weboob/tools/application/base.py index 1e8859b4..4bdcbc1e 100644 --- a/weboob/tools/application/base.py +++ b/weboob/tools/application/base.py @@ -23,9 +23,10 @@ import logging from optparse import OptionParser from weboob import Weboob +from weboob.tools.config.iconfig import ConfigError -__all__ = ['BaseApplication'] +__all__ = ['BaseApplication', 'ConfigError'] class BaseApplication(object): @@ -75,8 +76,10 @@ class BaseApplication(object): if klass is None: # load Config only here because some applications don't want # to depend on yaml and do not use this function - from weboob.tools.config.yamlconfig import YamlConfig - klass = YamlConfig + # from weboob.tools.config.yamlconfig import YamlConfig + # klass = YamlConfig + from weboob.tools.config.iniconfig import INIConfig + klass = INIConfig if path is None: path = os.path.join(self.CONFDIR, self.APPNAME) @@ -112,3 +115,5 @@ class BaseApplication(object): sys.exit(app.main(args)) except KeyboardInterrupt: print 'Program killed by SIGINT' + except ConfigError, e: + print 'Configuration error: %s' % e.message diff --git a/weboob/tools/config/iniconfig.py b/weboob/tools/config/iniconfig.py new file mode 100644 index 00000000..83ea5a1e --- /dev/null +++ b/weboob/tools/config/iniconfig.py @@ -0,0 +1,100 @@ +# -*- coding: utf-8 -*- + +""" +Copyright(C) 2010 Christophe Benz + +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 __future__ import with_statement + +from ConfigParser import SafeConfigParser +import logging +import os + +from .iconfig import IConfig, ConfigError + + +__all__ = ['INIConfig'] + + +class INIConfig(IConfig): + def __init__(self, path): + self.path = path + self.values = {} + self.config = SafeConfigParser() + + def load(self, default={}): + def load_section(section): + sections = section.split(':') + if len(sections) > 1: + for s in sections: + values = load_section(s) + else: + return {section: dict(self.config.items(section))} + + self.values = default.copy() + + if os.path.exists(self.path): + self.config.read(self.path) + for section in self.config.sections(): + self.values = load_section(section) + self.values.update(self.config.items('DEFAULT')) + logging.debug(u'Frontend configuration file loaded: %s.' % self.path) + else: + self.save() + logging.debug(u'Frontend configuration file created with default values: %s. ' + 'Please customize it.' % self.path) + return self.values + + def save(self): + def save_section(values, root_section=None): + for k, v in values.iteritems(): + if isinstance(v, (int, float, str, unicode)): + if root_section is not None and not self.config.has_section(root_section): + self.config.add_section(root_section) + self.config.set(root_section, k, unicode(v)) + elif isinstance(v, dict): + new_section = ':'.join((root_section, k)) if root_section else k + if not self.config.has_section(new_section): + self.config.add_section(new_section) + save_section(v, new_section) + save_section(self.values) + with open(self.path, 'w') as f: + self.config.write(f) + + def get(self, *args, **kwargs): + default = None + if 'default' in kwargs: + default = kwargs['default'] + + v = self.values + for k in args[:-1]: + if k in v: + v = v[k] + else: + return default + try: + return v[args[-1]] + except KeyError: + return default + + def set(self, *args): + v = self.values + for k in args[:-2]: + if k not in v: + v[k] = {} + v = v[k] + v[args[-2]] = args[-1]