Author: johannes Date: 2007-11-16 03:43:52 -0600 (Fri, 16 Nov 2007) New Revision: 9815
Modified: trunk/gnue-common/src/apps/GBaseApp.py trunk/gnue-common/src/apps/GConfig.py Log: More work on PEP8 and code cleanup Modified: trunk/gnue-common/src/apps/GBaseApp.py =================================================================== --- trunk/gnue-common/src/apps/GBaseApp.py 2007-11-16 07:55:33 UTC (rev 9814) +++ trunk/gnue-common/src/apps/GBaseApp.py 2007-11-16 09:43:52 UTC (rev 9815) @@ -346,8 +346,7 @@ if application: try: self.configurationManager = GConfig.GConfig(application, - self.configDefaults, - configFilename=self.CONFIGFILE) + self.configDefaults, self.CONFIGFILE) except ConfigParser.NoSectionError, msg: raise errors.AdminError, \ @@ -759,7 +758,7 @@ """ self.printHelpHeader() - print o(GConfig.printableConfigOptions(self.configDefaults)) + print o(GConfig.printable_config_options(self.configDefaults)) sys.exit() Modified: trunk/gnue-common/src/apps/GConfig.py =================================================================== --- trunk/gnue-common/src/apps/GConfig.py 2007-11-16 07:55:33 UTC (rev 9814) +++ trunk/gnue-common/src/apps/GConfig.py 2007-11-16 09:43:52 UTC (rev 9815) @@ -24,19 +24,19 @@ Class that loads the configuration files so gnue apps can get default settings. """ -from ConfigParser import * import os -import string import sys import textwrap +import ConfigParser from gnue import paths -from gnue.common.apps import i18n, errors, GDebug -from gnue.common.utils.FileUtils import openResource +from gnue.common.base import i18n, errors from gnue.common import GCConfig -import copy +__all__ = ['InvalidFormatError', 'GConfig', 'GConfigAlias', + 'getInstalledBase', 'printable_config_options'] + # ============================================================================= # Configuration file cannot be parsed # ============================================================================= @@ -47,17 +47,21 @@ # ============================================================================= -# Class handling GNUe Configuration +# Configuration manager # ============================================================================= class GConfig: + """ + Configuration manager for GNU Enterprise Applications + """ def __init__(self, section, defaults=None, configFilename="gnue.conf", homeConfigDir=".gnue"): - self._defaultConfigFilename = configFilename - self._defaultSection = section + self._default_config_filename = configFilename + self._default_section = section self._loadedConfigs = {} + self.loadApplicationConfig(configFilename, homeConfigDir, section, defaults) @@ -66,8 +70,24 @@ __builtin__.__dict__['gConfig'] = self.gConfig __builtin__.__dict__['gConfigDict'] = self.gConfigDict + + # ------------------------------------------------------------------------- + # Register an alias + # ------------------------------------------------------------------------- + def registerAlias(self, name, section): + """ + Register an alias for retrieving options of a given section in the + configration file. + @param name: function name to use as a 'builtin' for retrieving options + of the given section + @type name: string + @param section: the section of which option values should be read + @type section: string + """ + alias = GConfigAlias(self.gConfig, section) + import __builtin__ __builtin__.__dict__[name] = alias.gConfig @@ -123,10 +143,10 @@ assert gDebug(2, \ 'Configuration files were read in this order: %s' % \ fileLocations) - except DuplicateSectionError: + except ConfigParser.DuplicateSectionError: raise InvalidFormatError, \ u_('Configuration file has duplicate sections.') - except MissingSectionHeaderError: + except ConfigParser.MissingSectionHeaderError: raise InvalidFormatError, \ u_('Configuration file has no sections.') except: @@ -159,42 +179,42 @@ def _integrateDefaultDict(self,filename, section,defaults): try: self._loadedConfigs[filename].add_section(section) - except DuplicateSectionError: + except ConfigParser.DuplicateSectionError: pass for key in defaults.keys(): # Only set the value to the default if config file didn't contain # custom setting. try: self._loadedConfigs[filename].get(section,key) - except NoOptionError: + except ConfigParser.NoOptionError: self._loadedConfigs[filename].set(section,key,defaults[key]) - def gConfig(self, varName, configFilename=None, section=None): - if not configFilename: configFilename = self._defaultConfigFilename - if not section: section = self._defaultSection + def gConfig(self, var_name, configFilename=None, section=None): + if not configFilename: configFilename = self._default_config_filename + if not section: section = self._default_section try: - return self._loadedConfigs[configFilename].get(section,varName) - except NoSectionError: + return self._loadedConfigs[configFilename].get(section,var_name) + except ConfigParser.NoSectionError: self._loadedConfigs[configFilename].add_section(section) - return self._loadedConfigs[configFilename].get(section,varName) - except NoOptionError: + return self._loadedConfigs[configFilename].get(section,var_name) + except ConfigParser.NoOptionError: section = 'common' try: - return self._loadedConfigs[configFilename].get(section,varName) - except NoSectionError: + return self._loadedConfigs[configFilename].get(section,var_name) + except ConfigParser.NoSectionError: self._loadedConfigs[configFilename].add_section(section) - return self._loadedConfigs[configFilename].get(section,varName) + return self._loadedConfigs[configFilename].get(section,var_name) def gConfigDict(self, configFilename=None, section=None): - if not configFilename: configFilename = self._defaultConfigFilename - if not section: section = self._defaultSection + if not configFilename: configFilename = self._default_config_filename + if not section: section = self._default_section c = self._loadedConfigs[configFilename] if c.has_section(section): options = {} for option in c.options(section): - options[option] = c.get(section,string.lower(option)) + options[option] = c.get(section, option.lower()) return options else: return {} @@ -203,96 +223,196 @@ defaults = {} if defaultDefinitions: for definition in defaultDefinitions: - defaults[string.lower(definition['Name'])] = \ + defaults[definition['Name'].lower()] = \ str(definition['Default']) return defaults -class GConfigParser(ConfigParser): +# ============================================================================= +# GNUe Config Parser class supporting the GTypecast system +# ============================================================================= + +class GConfigParser(ConfigParser.ConfigParser): """ Add support for our GTypecast systems to the generic ConfigParser """ + + # ------------------------------------------------------------------------- + # Constructor + # ------------------------------------------------------------------------- + def __init__(self, defaults): + """ + @param defaults: list or tuple of dictionaries describing all available + configuration options. + """ + self.__defaults = defaults - ConfigParser.__init__(self) + ConfigParser.ConfigParser.__init__(self) typecasts = self.__typecasts = {} - # FIXME: I don't know what kind of elements are stored in 'defaults'. - # add a correct iteration over the "defaults-dictionary"! - if defaults and (len(defaults) > 0): - for f in defaults: - try: - typecasts[f['Name'].lower()] = f['Typecast'] - except KeyError: - typecasts[f['Name'].lower()] = str - def get(self, section, field): + for item in defaults: + iname = item['Name'].lower() + typecasts[iname] = item.get('Typecast', str) + + + # ------------------------------------------------------------------------- + # Get an options value + # ------------------------------------------------------------------------- + + def get(self, section, field, raw=False, defs=None): + """ + Get an option value for the named section, and apply any given + typecasts. + + @param section: the section in which to look for the option + @param field: name of the option + @param raw: if True, do not expand % interpolations + @param defs: dictionary whose contents override any pre-existing + defaults + + @returns: value of the option + + @raises ValueError: the option value is of wrong type + """ try: - val = ConfigParser.get(self, section, field) + val = ConfigParser.ConfigParser.get(self, section, field, raw, defs) return self.__typecasts[field.lower()](val) + except KeyError: return val + except ValueError: - raise ValueError, u_("Config option %(field)s is of wrong type in " - "[%(section)s]") \ - % {'field': field, 'section': section} + raise ValueError, \ + u_("Config option %(field)s is of wrong type in [%(section)s]")\ + % {'field': field, 'section': section} +# ============================================================================= +# Class for retrieving option values from a configuration file's section +# ============================================================================= + class GConfigAlias: + """ + This class provides access to the configuration options of a given section + in a configuration file + """ + + # ------------------------------------------------------------------------- + # Constructor + # ------------------------------------------------------------------------- + def __init__(self, gconfig, name): + """ + @param gconfig: gConfig() method of the configuration manager instance + to be used for retrieval + @type gconfig: function + @param name: the default section to retrieve values from + @type name: string + """ + self._gConfig = gconfig self._section = name - def gConfig(self, varName, configFilename=None, section=None): + + # ------------------------------------------------------------------------- + # Retrieve an option value + # ------------------------------------------------------------------------- + + def gConfig(self, var_name, configFilename=None, section=None): + """ + Retrieve an option from a section in a configuration file + + @param var_name: name of the option to retrieve + @type var_name: string + + @param configFilename: name of the configuration file to retrieve the + option from. If None, the default configuration file will be used. + @type configFilename: string + + @param section: name of the section to retrieve the option from. If + None, the default section will be used. + + @returns: the retrieve option value + """ + if not section: section = self._section - return self._gConfig(varName, configFilename=configFilename, + + return self._gConfig(var_name, configFilename=configFilename, section=section) +# ----------------------------------------------------------------------------- +# get the install location of a given group +# ----------------------------------------------------------------------------- + def getInstalledBase(*parameters): + """ + Returns the first matching item of the arguments in the _site_config + dictionary. + """ for param in parameters: - try: + if param in _site_config: return _site_config[param] - except KeyError: - pass return None -def printableConfigOptions(options, outputWidth=60): + +# ----------------------------------------------------------------------------- +# Create a printable description of configuration options +# ----------------------------------------------------------------------------- + +def printable_config_options(options, output_width=60): + """ + Create a human readable description of the given set of configuration + options. + + @param options: list of dictionaries with at least 'Name', 'Default' and + 'Description' keys + @param output_width: maximum length of a single text line + + @returns: the human readable description of all options + @rtype: unicode + """ output = "Valid config file options.....\n" + if options: for option in options: - output += '='*outputWidth+"\n" + output += '=' * output_width + "\n" nameString = "Name:%s" % option['Name'] defaultString = "Default Value:%s" % option['Default'] output += "%s%s%s\n" % \ (nameString, ' ' * \ - (outputWidth - len(nameString + defaultString)), + (output_width - len(nameString + defaultString)), defaultString) + # FIXME: This allows for non-unicode descriptions. Remove at some # point. description = option['Description'] if isinstance(description, str): - description = unicode(description, i18n.getencoding()) - output += "%s\n" % textwrap.fill(description, outputWidth) + description = unicode(description, i18n.get_encoding()) + + output += "%s\n" % textwrap.fill(description, output_width) else: output += "No options defined" + return output -############################ -# -# Site configuration stuff -# -############################ +# ============================================================================= +# Site configuration +# ============================================================================= + + _site_config = {} # highest priority: site_config.cfg (depreciated -- will be removed) if os.environ.has_key('GNUE_INSTALLED_SITE_CFG'): - input = open(os.environ['GNUE_INSTALLED_SITE_CFG'],'r') - text = input.read() - input.close() + fhd = open(os.environ['GNUE_INSTALLED_SITE_CFG'], 'r') + text = fhd.read() + fhd.close() # This evaluates the text file as a python script (hope you secured it) # The resulting namespace is stored as a dict in _site_config. @@ -306,16 +426,17 @@ install_prefix = os.environ['INSTALL_PREFIX'] _site_config = { 'install_prefix': install_prefix, - 'common_etc': os.path.join(install_prefix,'etc'), - 'common_images': os.path.join(install_prefix,'shared','images'), + 'common_etc': os.path.join(install_prefix, 'etc'), + 'common_images': os.path.join(install_prefix, 'shared', 'images'), 'common_appbase': install_prefix, - 'common_shared': os.path.join(install_prefix,'shared') + 'common_shared': os.path.join(install_prefix, 'shared') } else: _site_config = { - "install_prefix": paths.data, - "common_etc": paths.config, - "common_images": os.path.join(paths.data, "share", "gnue", "images"), - "common_appbase": paths.data, - "common_shared": os.path.join(paths.data, "share", "gnue")} + "install_prefix": paths.data, + "common_etc": paths.config, + "common_images": os.path.join(paths.data, "share", "gnue", "images"), + "common_appbase": paths.data, + "common_shared": os.path.join(paths.data, "share", "gnue") + } _______________________________________________ commit-gnue mailing list commit-gnue@gnu.org http://lists.gnu.org/mailman/listinfo/commit-gnue