# Copyright (c) 2012 The Chromium OS Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import ConfigParser import error def forgive_config_error(func): """A decorator to make ConfigParser get*() functions return None on fail.""" def wrapper(*args, **kwargs): try: return func(*args, **kwargs) except ConfigParser.Error: return None except ValueError as e: raise error.MalformedConfigEntry(str(e)) return wrapper class ForgivingConfigParser(ConfigParser.SafeConfigParser): """A SafeConfigParser that returns None on any error in get*(). Also implements reread(), which allows any already-read-in configs to be reloaded from disk on-demand. Note that I can't use super() here, as ConfigParser.SafeConfigParser isn't a new-style class. @var _cached_config_file_names: the names of the config files last read(). """ def __init__(self): ConfigParser.SafeConfigParser.__init__(self) self._cached_config_file_names = '' def read(self, filenames): """Caches filenames, then performs normal read() functionality. @param filenames: string or iterable. The files to read. @return list of files that could not be read, as per super class. """ to_return = ConfigParser.SafeConfigParser.read(self, filenames) self._cached_config_file_names = filenames return to_return def reread(self): """Clear all sections, re-read configs from disk.""" for section in self.sections(): self.remove_section(section) return ConfigParser.SafeConfigParser.read( self, self._cached_config_file_names) @forgive_config_error def getstring(self, section, option): """Can't override get(), as it breaks the other getters to have get() return None sometimes.""" return ConfigParser.SafeConfigParser.get(self, section, option) @forgive_config_error def getint(self, section, option): return ConfigParser.SafeConfigParser.getint(self, section, option) @forgive_config_error def getfloat(self, section, option): return ConfigParser.SafeConfigParser.getfloat(self, section, option) @forgive_config_error def getboolean(self, section, option): return ConfigParser.SafeConfigParser.getboolean(self, section, option)