Warning

This document is for an old release of Galaxy. You can alternatively view this page in the latest release if it exists or view the top of the latest release's documentation.

Source code for galaxy.util.properties

""" Module used to blend ini, environment, and explicit dictionary properties
to determine application configuration. Some hard coded defaults for Galaxy but
this should be reusable by tool shed and pulsar as well.
"""
import os
import os.path
import sys

from six import iteritems
from six.moves.configparser import ConfigParser


[docs]def find_config_file(default, old_default, explicit, cwd=None): if cwd is not None: default = os.path.join(cwd, default) old_default = os.path.join(cwd, old_default) if explicit is not None: explicit = os.path.join(cwd, explicit) if explicit: if os.path.exists(explicit): config_file = explicit else: raise Exception("Problem determining Galaxy's configuration - the specified configuration file cannot be found.") else: if not os.path.exists( default ) and os.path.exists( old_default ): config_file = old_default elif os.path.exists( default ): config_file = default else: config_file = default + ".sample" return config_file
[docs]def load_app_properties( kwds={}, ini_file=None, ini_section="app:main", config_prefix="GALAXY_CONFIG_" ): properties = kwds.copy() if kwds else {} if ini_file: defaults = { 'here': os.path.dirname(os.path.abspath(ini_file)), '__file__': os.path.abspath(ini_file) } parser = NicerConfigParser(ini_file, defaults=defaults) parser.optionxform = str # Don't lower-case keys with open(ini_file) as f: parser.read_file(f) properties.update( dict( parser.items( ini_section ) ) ) override_prefix = "%sOVERRIDE_" % config_prefix for key in os.environ: if key.startswith( override_prefix ): config_key = key[ len( override_prefix ): ].lower() properties[ config_key ] = os.environ[ key ] elif key.startswith( config_prefix ): config_key = key[ len( config_prefix ): ].lower() if config_key not in properties: properties[ config_key ] = os.environ[ key ] return properties
[docs]class NicerConfigParser(ConfigParser):
[docs] def __init__(self, filename, *args, **kw): ConfigParser.__init__(self, *args, **kw) self.filename = filename if hasattr(self, '_interpolation'): self._interpolation = self.InterpolateWrapper(self._interpolation)
read_file = getattr(ConfigParser, 'read_file', ConfigParser.readfp)
[docs] def defaults(self): """Return the defaults, with their values interpolated (with the defaults dict itself) Mainly to support defaults using values such as %(here)s """ defaults = ConfigParser.defaults(self).copy() for key, val in iteritems(defaults): defaults[key] = self.get('DEFAULT', key) or val return defaults
def _interpolate(self, section, option, rawval, vars): # Python < 3.2 try: return ConfigParser._interpolate( self, section, option, rawval, vars) except Exception: e = sys.exc_info()[1] args = list(e.args) args[0] = 'Error in file %s: %s' % (self.filename, e) e.args = tuple(args) e.message = args[0] raise
[docs] class InterpolateWrapper(object): # Python >= 3.2
[docs] def __init__(self, original): self._original = original
def __getattr__(self, name): return getattr(self._original, name)
[docs] def before_get(self, parser, section, option, value, defaults): try: return self._original.before_get(parser, section, option, value, defaults) except Exception: e = sys.exc_info()[1] args = list(e.args) args[0] = 'Error in file %s: %s' % (parser.filename, e) e.args = tuple(args) e.message = args[0] raise
__all__ = ('find_config_file', 'load_app_properties', 'NicerConfigParser')