X-Git-Url: http://git.tremily.us/?a=blobdiff_plain;f=hooke%2Fconfig.py;h=d49841d6e20bc5733d7dbd37c21352a442381a30;hb=150994731a725cb117b19cf136c621008daa91ca;hp=1c5c4874d53d4191078b599f8fb5aa6e91e8e380;hpb=c67d4f273cfe5896a6f9c131b9e813543d50aa46;p=hooke.git diff --git a/hooke/config.py b/hooke/config.py index 1c5c487..d49841d 100644 --- a/hooke/config.py +++ b/hooke/config.py @@ -21,6 +21,7 @@ Hooke. """ import ConfigParser as configparser +import logging import os.path import textwrap import unittest @@ -44,11 +45,12 @@ class Setting (object): """An entry (section or option) in HookeConfigParser. """ def __init__(self, section, option=None, value=None, type='string', - help=None, wrap=True): + count=1, help=None, wrap=True): self.section = section self.option = option - self.value = to_string(value=value, type=type) + self.value = value self.type = type + self.count = count self.help = help self.wrap = wrap @@ -85,7 +87,7 @@ class Setting (object): str(value).replace('\n', '\n\t'))) DEFAULT_SETTINGS = [ - Setting('conditions', help='Default environmental conditions in case they are not specified in the force curve data.'), + Setting('conditions', help='Default environmental conditions in case they are not specified in the force curve data. Configuration options in this section are available to every plugin.'), Setting('conditions', 'temperature', value='301', type='float', help='Temperature in Kelvin'), # Logging settings Setting('loggers', help='Configure loggers, see\nhttp://docs.python.org/library/logging.html#configuration-file-format', wrap=False), @@ -104,7 +106,7 @@ DEFAULT_SETTINGS = [ Setting('logger_hooke', 'qualname', 'hooke'), Setting('handler_hand1', help='Configure the default log handler, see\nhttp://docs.python.org/library/logging.html#configuration-file-format', wrap=False), Setting('handler_hand1', 'class', 'StreamHandler'), - Setting('handler_hand1', 'level', 'NOTSET'), + Setting('handler_hand1', 'level', 'WARN'), Setting('handler_hand1', 'formatter', 'form1'), Setting('handler_hand1', 'args', '(sys.stderr,)'), Setting('formatter_form1', help='Configure the default log formatter, see\nhttp://docs.python.org/library/logging.html#configuration-file-format', wrap=False), @@ -135,7 +137,8 @@ class HookeConfigParser (configparser.RawConfigParser): >>> c = HookeConfigParser(default_settings=DEFAULT_SETTINGS) >>> c.write(sys.stdout) # doctest: +ELLIPSIS # Default environmental conditions in case they are not specified in - # the force curve data. + # the force curve data. Configuration options in this section are + # available to every plugin. [conditions] # Temperature in Kelvin temperature = 301 @@ -159,7 +162,7 @@ class HookeConfigParser (configparser.RawConfigParser): ... Setting(section, option='my float', value=3.14159, type='float'), ... ]) >>> pprint.pprint(c.items(section)) # doctest: +ELLIPSIS - [('my string', 'Lorem ipsum'), + [('my string', u'Lorem ipsum'), ('my bool', True), ('my int', 13), ('my float', 3.1415...)] @@ -168,7 +171,7 @@ class HookeConfigParser (configparser.RawConfigParser): to use the standard `.get*()` methods. >>> c.get('test conversion', 'my bool') - 'True' + u'True' >>> c.getboolean('test conversion', 'my bool') True """ @@ -231,7 +234,7 @@ class HookeConfigParser (configparser.RawConfigParser): self._config_paths.append(filename) # Can't use super() because RawConfigParser is a classic class #return super(HookeConfigParser, self).read(filenames) - return configparser.RawConfigParser.read(self, filenames) + return configparser.RawConfigParser.read(self, self._config_paths) def _write_setting(self, fp, section=None, option=None, value=None, **kwargs): @@ -298,14 +301,25 @@ class HookeConfigParser (configparser.RawConfigParser): self, section, *args, **kwargs) for i,kv in enumerate(items): key,value = kv - setting = self._default_settings_dict[(section, key)] - items[i] = (key, from_string(value=value, type=setting.type)) + log = logging.getLogger('hooke') + try: + setting = self._default_settings_dict[(section, key)] + except KeyError, e: + log.error('unknown setting %s/%s: %s' % (section, key, e)) + raise + try: + items[i] = (key, from_string(value=value, type=setting.type, + count=setting.count)) + except ValueError, e: + log.error("could not convert '%s' (%s) for %s/%s: %s" + % (value, type(value), section, key, e)) + raise return items def set(self, section, option, value): """Set an option.""" setting = self._default_settings_dict[(section, option)] - value = to_string(value=value, type=setting.type) + value = to_string(value=value, type=setting.type, count=setting.count) # Can't use super() because RawConfigParser is a classic class #return super(HookeConfigParser, self).set(section, option, value) configparser.RawConfigParser.set(self, section, option, value)