Author: reinhard Date: 2009-10-18 12:59:43 -0500 (Sun, 18 Oct 2009) New Revision: 9986
Added: trunk/gnue-common/src/base/config.py trunk/gnue-common/src/datasources/backends.py Removed: trunk/gnue-common/src/base/utils.py Modified: trunk/gnue-common/src/apps/GBaseApp.py trunk/gnue-common/src/base/log.py trunk/gnue-common/src/datasources/ConnectionTriggerObj.py trunk/gnue-common/src/datasources/GConnections.py trunk/gnue-common/src/datasources/GDataSource.py Log: Use new configuration management module for backends.conf (formerly known as connections.conf). issue146 testing Modified: trunk/gnue-common/src/apps/GBaseApp.py =================================================================== --- trunk/gnue-common/src/apps/GBaseApp.py 2009-10-18 17:51:05 UTC (rev 9985) +++ trunk/gnue-common/src/apps/GBaseApp.py 2009-10-18 17:59:43 UTC (rev 9986) @@ -43,7 +43,7 @@ from gnue.common.base.i18n import utranslate as u_ from gnue.common.apps import GConfig, GDebug -from gnue.common.datasources import GConnections +from gnue.common.datasources import backends, GConnections from gnue.common.apps.CommandOption import CommandOption @@ -381,32 +381,19 @@ lhOptions['_password'] = self.OPTIONS['password'] if self.OPTIONS['connections']: - self.connections_file = self.OPTIONS['connections'] + connections_file = self.OPTIONS['connections'] elif os.environ.has_key('GNUE_CONNECTIONS'): - self.connections_file = os.environ['GNUE_CONNECTIONS'] + connections_file = os.environ['GNUE_CONNECTIONS'] else: - self.connections_file = os.path.join(paths.config, + connections_file = os.path.join(paths.config, "connections.conf") - assert log.debug('Connection Definition: "%s"' % - self.connections_file) + backends.initialize_backends(connections_file) - try: - self.connections = GConnections.GConnections( \ - self.connections_file, loginOptions = lhOptions) + self.connections = GConnections.GConnections( + connections_file, loginOptions = lhOptions) - except GConnections.InvalidFormatError, msg: - raise errors.AdminError, \ - u_("Unable to load the connections definition file.\n\n" - "The connections file is in an invalid format.\n%s") \ - % msg - except IOError: - raise StartupError, \ - u_("Unable to load the connections definition file: %s.") \ - % self.connections_file - - # ------------------------------------------------------------------------- # Run the program # ------------------------------------------------------------------------- Copied: trunk/gnue-common/src/base/config.py (from rev 9984, trunk/gnue-common/src/base/utils.py) =================================================================== --- trunk/gnue-common/src/base/config.py (rev 0) +++ trunk/gnue-common/src/base/config.py 2009-10-18 17:59:43 UTC (rev 9986) @@ -0,0 +1,171 @@ +# GNU Enterprise Common Library - Configuration file management +# +# Copyright 2001-2009 Free Software Foundation +# +# This file is part of GNU Enterprise +# +# GNU Enterprise is free software; you can redistribute it +# and/or modify it under the terms of the GNU General Public +# License as published by the Free Software Foundation; either +# version 3, or (at your option) any later version. +# +# GNU Enterprise is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with program; see the file COPYING. If not, +# write to the Free Software Foundation, Inc., 59 Temple Place +# - Suite 330, Boston, MA 02111-1307, USA. +# +# $Id$ + +""" +Configuration file management. +""" + +import ConfigParser +import os.path +import urllib + +from gnue import paths +from gnue.common.base import errors + +__all__ = ['Config', 'config_files', 'ConfigParserError'] + + +# ============================================================================= +# Configuration file +# ============================================================================= + +class Config(ConfigParser.ConfigParser): + """ + The configuration for a configuration realm. + + The configuration realm can be understood as the configuration file name + without the .conf ending. However, for each configuration realm, several + files are scanned sequentially according to the L{config_files} function. + + As an improvement to the standard Python ConfigParser module, this parser + can also handle network URLs instead of local files. + + All errors happening during configuration file parsing are considered to be + of group 'admin'. + """ + + def __init__(self, realm, additional_url=None): + """ + Scan the configuration for the given realm. + + @param realm: Configuration realm (the name of the configuration file + without the .conf ending). + @type realm: string + """ + # We may not import log at the beginning of this file since log imports + # this module. + from gnue.common.base import log + + url_list = config_files(realm) + + # TODO: location of old configuration file (gnue.conf, + # connections.conf), deprecate with 0.8, remove with 0.9 + if additional_url is not None: + url_list.insert(0, additional_url) + + ConfigParser.ConfigParser.__init__(self) + + for url in url_list: + log.info("Reading configuration for %(realm)s from %(url)s" % { + 'realm': realm, + 'url': url}) + try: + handle = urllib.urlopen(url) + self.readfp (handle) + except StandardError: + (group, name, message, detail) = errors.get_exception() + group = 'admin' # Redirect exceptions to 'admin' group. + raise ConfigParserError(group, name, message, detail) + + +# ============================================================================= +# Global functions +# ============================================================================= + +# ----------------------------------------------------------------------------- +# Return a list of config files to use +# ----------------------------------------------------------------------------- + +def config_files(realm): + """ + Return a list of filenames to parse for a specific configuration realm. + + The list contains all existing config files in the following order of + directories searched: + 1. system configuration file (usually /etc/gnue/*.conf) + 2. system configuration directory (usually /etc/gnue/*.d/) + 3. user configuration (~/.gnue/*.conf) + 4. local configuration (etc/*.conf) + 5. environment variable location ($GNUE_*_CONF) + 6. fixed system configuration (/etc/gnue/*.conf.fixed) + The practical use for 6. is to define configuration entries that cannot be + overwritten by normal users. + + For example, if realm is C{backends}, on a standard install on a POSIX + system, the file would be searched in: + 1. C{/etc/gnue/backends.conf} + 2. C{/etc/gnue/backends.d/*} + 3. C{~/.gnue/backends.conf} + 4. C{etc/backends.conf} (from the current directory) + 5. the content of the C{GNUE_BACKENDS_CONF} environment variable + 6. C{/etc/gnue/backends.conf.fixed} + + @param realm: name of the configuration file without the .conf ending + @type realm: string + @return: list of full path names of configuration files to parse + @rtype: string + """ + + files = [] + + # 1. system configuration file (usually /etc/gnue/*.conf) + files.append(os.path.join(paths.config, realm + '.conf')) + + # 2. system configuration directory (usually /etc/gnue/*.d/) + confdir = os.path.join(paths.config, realm + '.d') + if os.path.isdir(confdir): + indir = os.listdir(confdir) + indir.sort() + files.extend([os.path.join(confdir, f) for f in indir]) + + # 3. user configuration (~/.gnue/*.conf) + if os.environ.has_key('HOME'): + files.append(os.path.join(os.environ['HOME'], '.gnue', realm + '.conf')) + + # 4. local configuration (etc/*.conf) + files.append(os.path.join('etc', realm + '.conf')) + + # 5. environment variable location ($GNUE_*) + if os.environ.has_key('GNUE_' + realm.upper() + '_CONF'): + files.append(os.environ['GNUE_' + realm.upper() + '_CONF']) + + # 6. fixed system configuration (/etc/gnue/*.conf.fixed) + files.append(os.path.join(paths.config, realm + '.conf.fixed')) + + return [f for f in files if os.path.isfile(f)] + + +# ============================================================================= +# Exceptions +# ============================================================================= + +# ----------------------------------------------------------------------------- +# Error in configuration file +# ----------------------------------------------------------------------------- + +class ConfigParserError(errors.RemoteError): + """ + Error parsing configuration file. + """ + + pass Modified: trunk/gnue-common/src/base/log.py =================================================================== --- trunk/gnue-common/src/base/log.py 2009-10-18 17:51:05 UTC (rev 9985) +++ trunk/gnue-common/src/base/log.py 2009-10-18 17:59:43 UTC (rev 9986) @@ -102,7 +102,7 @@ import traceback from gnue.common.lib import modules -from gnue.common.base import errors, utils +from gnue.common.base import config, errors __all__ = ['logged_f', 'deprecated_f', 'logged_f_n', 'deprecated_f_n', @@ -759,7 +759,7 @@ # Configure logging through configuration files, or use standard configuration # if no configuration files available. - config_files = utils.config_files('log') + config_files = config.config_files('log') if config_files: logging.config.fileConfig(config_files) else: Deleted: trunk/gnue-common/src/base/utils.py =================================================================== --- trunk/gnue-common/src/base/utils.py 2009-10-18 17:51:05 UTC (rev 9985) +++ trunk/gnue-common/src/base/utils.py 2009-10-18 17:59:43 UTC (rev 9986) @@ -1,96 +0,0 @@ -# GNU Enterprise Common Library - Basic Utilities -# -# Copyright 2001-2009 Free Software Foundation -# -# This file is part of GNU Enterprise -# -# GNU Enterprise is free software; you can redistribute it -# and/or modify it under the terms of the GNU General Public -# License as published by the Free Software Foundation; either -# version 3, or (at your option) any later version. -# -# GNU Enterprise is distributed in the hope that it will be -# useful, but WITHOUT ANY WARRANTY; without even the implied -# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -# PURPOSE. See the GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public -# License along with program; see the file COPYING. If not, -# write to the Free Software Foundation, Inc., 59 Temple Place -# - Suite 330, Boston, MA 02111-1307, USA. -# -# $Id$ - -""" -The C{utils} module provides some very basic although GNU Enterprise specific -utility functions. -""" - -import os.path - -from gnue import paths - -__all__ = ['config_files'] - - -# ----------------------------------------------------------------------------- -# Return a list of config files to use -# ----------------------------------------------------------------------------- - -def config_files(name): - """ - Return a list of filenames to parse for a specific configuration file. - - The list contains all existing config files in the following order of - directories searched: - 1. system configuration file (usually /etc/gnue/*.conf) - 2. system configuration directory (usually /etc/gnue/*.d/) - 3. user configuration (~/.gnue/*.conf) - 4. local configuration (etc/*.conf) - 5. environment variable location ($GNUE_*_CONF) - 6. fixed system configuration (/etc/gnue/*.conf.fixed) - The practical use for 6. is to define configuration entries that cannot be - overwritten by normal users. - - For example, if name is C{backends}, on a standard install on a POSIX - system, the file would be searched in: - 1. C{/etc/gnue/backends.conf} - 2. C{/etc/gnue/backends.d/*} - 3. C{~/.gnue/backends.conf} - 4. C{etc/backends.conf} (from the current directory) - 5. the content of the C{GNUE_BACKENDS_CONF} environment variable - 6. C{/etc/gnue/backends.conf.fixed} - - @param name: name of the configuration file without the .conf ending - @type name: string - @return: list of full path names of configuration files to parse - @rtype: string - """ - - files = [] - - # 1. system configuration file (usually /etc/gnue/*.conf) - files.append(os.path.join(paths.config, name + '.conf')) - - # 2. system configuration directory (usually /etc/gnue/*.d/) - confdir = os.path.join(paths.config, name + '.d') - if os.path.isdir(confdir): - indir = os.listdir(confdir) - indir.sort() - files.extend([os.path.join(confdir, f) for f in indir]) - - # 3. user configuration (~/.gnue/*.conf) - if os.environ.has_key('HOME'): - files.append(os.path.join(os.environ['HOME'], '.gnue', name + '.conf')) - - # 4. local configuration (etc/*.conf) - files.append(os.path.join('etc', name + '.conf')) - - # 5. environment variable location ($GNUE_*) - if os.environ.has_key('GNUE_' + name.upper() + '_CONF'): - files.append(os.environ['GNUE_' + name.upper() + '_CONF']) - - # 6. fixed system configuration (/etc/gnue/*.conf.fixed) - files.append(os.path.join(paths.config, name + '.conf.fixed')) - - return [f for f in files if os.path.isfile(f)] Modified: trunk/gnue-common/src/datasources/ConnectionTriggerObj.py =================================================================== --- trunk/gnue-common/src/datasources/ConnectionTriggerObj.py 2009-10-18 17:51:05 UTC (rev 9985) +++ trunk/gnue-common/src/datasources/ConnectionTriggerObj.py 2009-10-18 17:59:43 UTC (rev 9986) @@ -32,7 +32,9 @@ from gnue.common.definitions import GObjects +from gnue.common.datasources import backends + # ============================================================================= # Connection wrapper object # ============================================================================= @@ -89,7 +91,7 @@ namespace, because they will be handled like XML elements defined within the root element. """ - for name in connections.getConnectionNames(): + for name in backends.BACKENDS.sections(): try: conn = connections.getConnection(name) except: @@ -105,7 +107,7 @@ Adds all the connection names to the global trigger namespace. DEPRECIATED. """ - for name in connections.getConnectionNames (): + for name in connections.backends.BACKENDS.sections(): try: conn = connections.getConnection (name) except: Modified: trunk/gnue-common/src/datasources/GConnections.py =================================================================== --- trunk/gnue-common/src/datasources/GConnections.py 2009-10-18 17:51:05 UTC (rev 9985) +++ trunk/gnue-common/src/datasources/GConnections.py 2009-10-18 17:59:43 UTC (rev 9986) @@ -24,19 +24,14 @@ Connection manager system. """ -from ConfigParser import * -from ConfigParser import RawConfigParser # is not in __all__ - import copy import locale import netrc from gnue.common.base import errors, log, plugin from gnue.common.utils.FileUtils import openResource, dyn_import -from gnue.common.datasources import Exceptions, GLoginHandler +from gnue.common.datasources import backends, Exceptions, GLoginHandler -import warnings - # ============================================================================= # Exceptions # ============================================================================= @@ -46,10 +41,8 @@ Connection name not found in connections.conf. """ def __init__ (self, name, file): - msg = u_("The connections file does not contain a definition " - "for \"%(connection)s\".\n\nFile: %(file)s") \ - % {'connection': name, - 'file' : file} + msg = u_("No backend definition for '%(connection)s'.") % { + 'connection': name} errors.AdminError.__init__ (self, msg) # ----------------------------------------------------------------------------- @@ -85,17 +78,13 @@ """ Class that loads connection definition files and maintains database connections. - - If you pass GConnections an "eventHandler" instance, it will generate a - Connections:Connect(name, base) when a new connection is created. """ # --------------------------------------------------------------------------- # Constructor # --------------------------------------------------------------------------- - def __init__ (self, location, loginHandler = None, loginOptions = {}, - eventhandler = None): + def __init__ (self, location, loginHandler = None, loginOptions = {}): """ Create a new GConnections instance. @@ -103,7 +92,6 @@ @param loginHandler: Instance of a L{GLoginHandler.LoginHandler} descendant to ask the user for login data. @param loginOptions: Default data for the login handler. - @param eventhandler: Event handler to notify about new connections. """ # These 4 may not be private as they are used by appserver to clone the @@ -111,67 +99,14 @@ self._location = location self._loginHandler = loginHandler self._loginOptions = loginOptions - self._eventHandler = eventhandler - # Primary connection names and their parameters - self.__primaries = {} - - # Alias connection names and their parameters - self.__aliases = {} - - # All connection names and their parameters - self.__definitions = {} - # Dictionary of authenticated users per connection name. self.__authenticatedUsers = {} # Dictionary of open connections (GConnection objects) per connection name. self.__openConnections = {} - # Parse the connections.conf file - parser = RawConfigParser () - if len (self._location): - fileHandle = openResource (self._location) - - try: - parser.readfp (fileHandle) - - except DuplicateSectionError: - tmsg = u_("The connections file has duplicate source definitions." - "\n\nFile: %s") % location - raise InvalidFormatError, tmsg - except MissingSectionHeaderError: - tmsg = u_("The connections file has no source definitions." - "\n\nFile: %s") % location - raise InvalidFormatError, tmsg - except Exception: - tmsg = u_("The connections file cannot be parsed." - "\n\nFile: %s") % location - raise InvalidFormatError, tmsg - - # Read all the sections into a dict - # and make a note of all alias names - for section in parser.sections (): - self.__primaries [section] = {} - for att in parser.options (section): - if att == 'aliases': - for alias in ((parser.get (section,att)).lower ()).split (): - self.__aliases [alias] = section - else: - self.__primaries [section] [att] = parser.get (section, att) - - # Fill in any aliases with their parameters - for alias in self.__aliases.keys(): - section = self.__aliases [alias] - self.__aliases [alias] = copy.copy (self.__primaries [section]) - self.__aliases [alias] ['_alias_of'] = section - - # Create the dictionary with both primaries and aliases - self.__definitions.update (self.__aliases) - self.__definitions.update (self.__primaries) - - # --------------------------------------------------------------------------- # Set the login handler for opening connections # --------------------------------------------------------------------------- @@ -185,110 +120,52 @@ # --------------------------------------------------------------------------- - # Check if a parameter is given for a connection + # Returns a list of connection names # --------------------------------------------------------------------------- - def hasConnectionParameters (self, connection_name): + def getConnectionNames (self): """ - Check if the given connection name exists in the connections.conf file. + DEPRECATED: use backends.BACKENDS.sections() instead. """ - return self.__definitions.has_key (connection_name) + return backends.BACKENDS.sections() + getConnectionNames = log.deprecated_f(getConnectionNames) - # --------------------------------------------------------------------------- - # Get a parameter for a connection - # --------------------------------------------------------------------------- - def getConnectionParameter (self, connection_name, attribute, default = None): - """ - Read a parameter from the connections.conf file. - """ - - try: - definition = self.__definitions [connection_name] - try: - return definition [attribute] - except: - return default - except KeyError: - raise NotFoundError, (connection_name, self._location) - - # --------------------------------------------------------------------------- - # Returns a list of connection names - # --------------------------------------------------------------------------- - - def getConnectionNames (self, includeAliases = True): - """ - Return a list of all connections from the connections.conf file. - - @param includeAliases: Whether or not to include connection aliases. - @return: List with all connection names. - """ - - if includeAliases: - return self.__definitions.keys () - else: - return self.__primaries.keys () - - - # --------------------------------------------------------------------------- # Returns an dictionary of dictionaries describing all connections # --------------------------------------------------------------------------- - def getAllConnectionParameters (self, includeAliases = 1): + def getAllConnectionParameters (self): """ - Return a dictionary of all connections from the connections.conf file. - - @param includeAliases: Whether or not to include connection aliases. - @return: Dictionary where the keys are connection names and the values are - dictionaries with all connection parameters. + DEPRECATED: use backends.BACKENDS instead. """ - if includeAliases: - return copy.deepcopy (self.__definitions) - else: - return copy.deepcopy (self.__primaries) + result = {} + for section in backends.BACKENDS.sections(): + result[section] = dict(backends.BACKENDS.items(section)) + getAllConnectionParameters = log.deprecated_f(getAllConnectionParameters) + # --------------------------------------------------------------------------- # Returns a dictionary describing a connection # --------------------------------------------------------------------------- def getConnectionParameters (self, connection_name): """ - Return the parameter dictionary for a given connection. - - @return: Dictionary with parameter name and parameter value. + DEPRECATED: use backends.BACKENDS.items(connection_name) instead. """ - try: - return copy.deepcopy (self.__definitions [connection_name]) - except KeyError: - raise NotFoundError, (connection_name, self._location) + if not backends.BACKENDS.has_section(connection_name): + raise NotFoundError(connection_name) + return dict(backends.BACKENDS.items(connection_name)) - # --------------------------------------------------------------------------- - # Add a connection entry (session specific; i.e., doesn't add - # to the connections.conf file, but to the current instance's - # list of available connections. - # --------------------------------------------------------------------------- + getConnectionParameters = log.deprecated_f(getConnectionParameters) - def addConnectionSpecification (self, name, parameters): - """ - Add a session specific connection entry. - With this function, a temporary connection definition can be inserted - without having to change the connections.conf file. - - @param name: Connection name. - @param parameters: Connection parameters as a dictionary. - """ - - self.__definitions [name.lower ()] = copy.copy (parameters) - - # --------------------------------------------------------------------------- # get a connection instance and optionally log into it # --------------------------------------------------------------------------- @@ -320,8 +197,11 @@ # This will throw a GConnections.NotFoundError if an unknown connection # name is specified. The calling method should catch this exception and # handle it properly (exit w/message) - parameters = self.getConnectionParameters (connection_base) + if not backends.BACKENDS.has_section(connection_base): + raise NotFoundError(connection_base) + parameters = dict(backends.BACKENDS.items(connection_base)) + driver = parameters ['provider'].lower ().replace ('/', '.') dbdriver = plugin.find (driver, 'gnue.common.datasources.drivers', 'Connection') @@ -457,10 +337,13 @@ checkFields = fields needFieldConversion = False - descr = self.getConnectionParameter (connection_base, 'comment', '') + if backends.BACKENDS.has_option(connection_base, 'comment'): + descr = backends.BACKENDS.get(connection_basename, 'comment') + else: + descr = connection_base text = u_('Login required for %(newline)s"%(description)s"') \ % {'newline': len (descr) and '\n' or '', - 'description': descr or connection_base} + 'description': descr} title = u_("GNU Enterprise: Login to %s") % connection_base header = [(text, None, 'label', None, None, []), @@ -511,10 +394,6 @@ # of open connections self.__openConnections [connection_name] = connection - if self._eventHandler: - self._eventHandler.dispatchEvent ('Connections:Connect', - name = connection_name, base = connection_base) - # Done connection.__connected = True Modified: trunk/gnue-common/src/datasources/GDataSource.py =================================================================== --- trunk/gnue-common/src/datasources/GDataSource.py 2009-10-18 17:51:05 UTC (rev 9985) +++ trunk/gnue-common/src/datasources/GDataSource.py 2009-10-18 17:59:43 UTC (rev 9986) @@ -31,7 +31,7 @@ from gnue.common.definitions import GObjects, GParser, GParserHelpers from gnue.common import events from gnue.common.formatting import GTypecast -from gnue.common.datasources import Exceptions, GConditions, GConnections +from gnue.common.datasources import backends, Exceptions, GConditions, GConnections # ============================================================================= @@ -1069,12 +1069,10 @@ # Add our database connection information to the connections # manager, then let it handle everything from there. - root = self.findParentOfType (None) - root._instance.connections.addConnectionSpecification (self.name, { - 'name': self.name, - 'provider': self.provider, - 'dbname': self.dbname, - 'host': self.host }) + backends.BACKENDS.add_section(self.name) + backends.BACKENDS.set(self.name, 'provider', self.provider) + backends.BACKENDS.set(self.name, 'dbname', self.dbname) + backends.BACKENDS.set(self.name, 'host', self.host) # ============================================================================= Added: trunk/gnue-common/src/datasources/backends.py =================================================================== --- trunk/gnue-common/src/datasources/backends.py (rev 0) +++ trunk/gnue-common/src/datasources/backends.py 2009-10-18 17:59:43 UTC (rev 9986) @@ -0,0 +1,76 @@ +# GNU Enterprise Common Library - Database Backends Management +# +# Copyright 2009-2009 Free Software Foundation +# +# This file is part of GNU Enterprise. +# +# GNU Enterprise is free software; you can redistribute it +# and/or modify it under the terms of the GNU General Public +# License as published by the Free Software Foundation; either +# version 3, or (at your option) any later version. +# +# GNU Enterprise is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with program; see the file COPYING. If not, +# write to the Free Software Foundation, Inc., 59 Temple Place +# - Suite 330, Boston, MA 02111-1307, USA. +# +# $Id$ + +""" +Management of available database backends. +""" + +from gnue.common.base import config, log + +__all__ = ['BACKENDS'] + + +# ============================================================================= +# Configuration object mirroring backends.conf +# ============================================================================= + +class __BackendsConfig(config.Config): + + def __init__(self, additional_url=None): + + config.Config.__init__(self, 'backends', additional_url) + + # For all aliases, clone the whole section. + for section in self.sections(): + if self.has_option(section, 'aliases'): + log.deprecated( + "Backend definition for %(section)s uses 'aliases'" % { + 'section': section}) + for alias in self.get(section, 'aliases').split(): + self.add_section(alias) + for (option, value) in self.items(section): + if option != 'aliases': + self.set(alias, option, value) + +# ----------------------------------------------------------------------------- + +BACKENDS = None + +# ============================================================================= +# Module initialization +# ============================================================================= + +def initialize_backends(additional_url=None): + """ + Initialize the module by loading the configuration files. + """ + + global BACKENDS + BACKENDS = __BackendsConfig(additional_url) + + +if __name__ == '__main__': + + #initialize_backends() # TODO: Can initialize here when additional_url + # has been removed + pass Property changes on: trunk/gnue-common/src/datasources/backends.py ___________________________________________________________________ Name: svn:keywords + Id _______________________________________________ commit-gnue mailing list commit-gnue@gnu.org http://lists.gnu.org/mailman/listinfo/commit-gnue