| # 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 |
| |
| |
| 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 |
| 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) |