1# Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5import ConfigParser 6 7 8def forgive_config_error(func): 9 """A decorator to make ConfigParser get*() functions return None on fail.""" 10 def wrapper(*args, **kwargs): 11 try: 12 return func(*args, **kwargs) 13 except ConfigParser.Error: 14 return None 15 return wrapper 16 17 18class ForgivingConfigParser(ConfigParser.SafeConfigParser): 19 """A SafeConfigParser that returns None on any error in get*(). 20 21 Also implements reread(), which allows any already-read-in configs to be 22 reloaded from disk on-demand. 23 24 Note that I can't use super() here, as ConfigParser.SafeConfigParser 25 isn't a new-style class. 26 27 @var _cached_config_file_names: the names of the config files last read(). 28 """ 29 30 31 def __init__(self): 32 ConfigParser.SafeConfigParser.__init__(self) 33 self._cached_config_file_names = '' 34 35 36 def read(self, filenames): 37 """Caches filenames, then performs normal read() functionality. 38 39 @param filenames: string or iterable. The files to read. 40 @return list of files that could not be read, as per super class. 41 """ 42 to_return = ConfigParser.SafeConfigParser.read(self, filenames) 43 self._cached_config_file_names = filenames 44 return to_return 45 46 47 def reread(self): 48 """Clear all sections, re-read configs from disk.""" 49 for section in self.sections(): 50 self.remove_section(section) 51 return ConfigParser.SafeConfigParser.read( 52 self, self._cached_config_file_names) 53 54 55 @forgive_config_error 56 def getstring(self, section, option): 57 """Can't override get(), as it breaks the other getters to have get() 58 return None sometimes.""" 59 return ConfigParser.SafeConfigParser.get(self, section, option) 60 61 62 @forgive_config_error 63 def getint(self, section, option): 64 return ConfigParser.SafeConfigParser.getint(self, section, option) 65 66 67 @forgive_config_error 68 def getfloat(self, section, option): 69 return ConfigParser.SafeConfigParser.getfloat(self, section, option) 70 71 72 @forgive_config_error 73 def getboolean(self, section, option): 74 return ConfigParser.SafeConfigParser.getboolean(self, section, option) 75