view roundup/config.py @ 481:a261b0bbba43 config-0-4-0-branch

Fixed a number of minor syntax issues & error handling.
author Titus Brown <titus@users.sourceforge.net>
date Thu, 03 Jan 2002 04:28:21 +0000
parents a5cd27d33516
children fdee2ff82b40
line wrap: on
line source

import sys
import os
import ConfigParser
import string

class Error(Exception):
    pass

def debug_mode():
    """
    Returns the basic debug mode/level.
    """
    return os.environ.get('ROUNDUP_DEBUG', 0)

def load_base_config():
    """
    Loads the base configuration for Roundup.
    """
    
    c = ConfigParser.ConfigParser()

    ##
    ## CTB: this is where to search for all overrides, including
    ##      system-specific files, registry settings, etc.
    ##

    # For the moment, search for the config file in
    #
    #      %(sys.prefix)s/share/roundup/roundup.rc,
    #
    # with ROUNDUP_CONF overriding it.
    
    filenames_to_check = []             # list of files to check:
    if os.environ.has_key('ROUNDUP_CONF'):
        filenames_to_check.append(os.environ['ROUNDUP_CONF'])
        
    filenames_to_check.append('%s/share/roundup/roundup.rc'%(sys.prefix,))

    for filename in filenames_to_check:
        if os.path.exists(filename):
            c.read(filename)
            break
    else:
        raise Error("could not find configuration file")

    if debug_mode():
        print 'Loaded configuration from "%s".'%(filename,)

    # we also want to give a base path for other config file names;
    # for the moment, make it the base path of the filename we chose.
    base_path = os.path.dirname(filename)

    return BaseConfig(c, base_path)

class BaseConfig:
    """
    A container for the installation-wide roundup configuration.
    """
    def __init__(self, c, base_path):
        assert isinstance(c, ConfigParser.ConfigParser)
        self.conf = c
        self.base_path = base_path

    def get(self, group, attr):
        return self.conf.get(group, attr)

    def load_instances_config(self):
        filename = string.strip(self.conf.get('base', 'instances'))

        # if it looks like an absolute path, leave it alone; otherwise,
        # add on the base path.
        if filename[0] == '/' or filename[0] == '\\':
            pass
        else:
            filename = os.path.normpath(self.base_path + '/' + filename)

        defaults_dictionary = { 'roundup_conf_dir' : self.base_path }

        c = ConfigParser.ConfigParser(defaults_dictionary)
        c.read(filename)

        return InstancesConfig(c, filename)

class InstancesConfig:
    """
    A container for the installation-wide list of instances.
    """
    def __init__(self, c, filename=""):
        assert isinstance(c, ConfigParser.ConfigParser)
        self.conf = c
        self.filename = filename

        instance_names = {}
        instance_dirs = {}
        
        for name in c.sections():
            dir = c.get(name, 'homedir')

            if instance_names.has_key(dir) or instance_dirs.has_key(name):
                error_text = 'ERROR: dir/name correspondence is not unique (%s)'%(self.filename,)
                raise ValueError(error_text)
            
            instance_dirs[name] = dir
            instance_names[dir] = name

        self.instance_dirs = instance_dirs
        self.instance_names = instance_names

    def get_instance_names(self):
        return self.instance_dirs.keys()

    def get_instance_name(self, dir):
        return self.instance_names[dir]

    def get_instance_dir(self, name):
        return self.instance_dirs[name]

    def load_instance_config(self, name):
        instance_dir = self.get_instance_dir(name)
        
        defaults_file = self.conf.get(name, 'defaults')
        config_file = self.conf.get(name, 'config')

        defaults_dictionary = { 'homedir' : instance_dir,
                                'instance_name' : name,
                              }


        c = ConfigParser.ConfigParser(defaults_dictionary)
        c.read(defaults_file)
        c.read(config_file)

        return InstanceConfig(c, name, instance_dir)

class InstanceConfig:
    """
    A container for each per-instance configuration.
    """
    
    def __init__(self, c, instanceName, instanceDirectory):
        assert isinstance(c, ConfigParser.ConfigParser)
        self.conf = c
        self.name = instanceName
        self.directory = instanceDirectory

    def get_name(self):
        return self.name

    def get_directory(self):
        return self.directory

    def get(self, group, attr):
        return self.conf.get(group, attr)
            
if __name__ == '__main__':
    base_config = load_base_config()
    instances_config = base_config.load_instances_config()
    
    for k in instances_config.get_instance_names():
        print "%s:%s"%(k, instances_config.get_instance_dir(k),)

Roundup Issue Tracker: http://roundup-tracker.org/