changeset 2856:adec352e2ce0

don't try to import all backends in backends.__init__ unless we *want* to
author Richard Jones <richard@users.sourceforge.net>
date Wed, 03 Nov 2004 01:34:21 +0000
parents 874bf6abad42
children 0357a9c93933
files CHANGES.txt demo.py roundup/admin.py roundup/backends/__init__.py roundup/instance.py test/test_anydbm.py test/test_metakit.py test/test_mysql.py test/test_postgresql.py test/test_sqlite.py
diffstat 10 files changed, 59 insertions(+), 53 deletions(-) [+]
line wrap: on
line diff
--- a/CHANGES.txt	Wed Nov 03 01:10:53 2004 +0000
+++ b/CHANGES.txt	Wed Nov 03 01:34:21 2004 +0000
@@ -33,6 +33,7 @@
   recognized by roundup-server (but not tracker specification arguments).
   Use this to specify server configuration file for the service.
 - added experimental multi-thread server
+- don't try to import all backends in backends.__init__ unless we *want* to
 
 Fixed:
 - postgres backend open doesn't hide corruption in schema (sf bug 956375)
--- a/demo.py	Wed Nov 03 01:10:53 2004 +0000
+++ b/demo.py	Wed Nov 03 01:34:21 2004 +0000
@@ -2,7 +2,7 @@
 #
 # Copyright (c) 2003 Richard Jones (richard@mechanicalcat.net)
 #
-# $Id: demo.py,v 1.21 2004-10-29 15:55:16 a1s Exp $
+# $Id: demo.py,v 1.22 2004-11-03 01:34:20 richard Exp $
 
 import errno
 import os
@@ -40,7 +40,7 @@
         config['RDBMS_NAME'] = 'rounduptest'
 
     # see if we have further db nuking to perform
-    module = getattr(backends, backend)
+    module = backends.get_backend(backend)
     if module.db_exists(config):
         module.db_nuke(config)
 
--- a/roundup/admin.py	Wed Nov 03 01:10:53 2004 +0000
+++ b/roundup/admin.py	Wed Nov 03 01:34:21 2004 +0000
@@ -16,7 +16,7 @@
 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 #
-# $Id: admin.py,v 1.83 2004-10-20 04:45:01 richard Exp $
+# $Id: admin.py,v 1.84 2004-11-03 01:34:21 richard Exp $
 
 '''Administration commands for maintaining Roundup trackers.
 '''
@@ -336,7 +336,7 @@
         templates = self.listTemplates()
         print _('Templates:'), ', '.join(templates.keys())
         import roundup.backends
-        backends = roundup.backends.__all__
+        backends = roundup.backends.list_backends()
         print _('Back ends:'), ', '.join(backends)
 
     def do_install(self, tracker_home, args):
@@ -392,7 +392,7 @@
 
         # select hyperdb backend
         import roundup.backends
-        backends = roundup.backends.__all__
+        backends = roundup.backends.list_backends()
         backend = len(args) > 2 and args[2] or ''
         if backend not in backends:
             print _('Back ends:'), ', '.join(backends)
--- a/roundup/backends/__init__.py	Wed Nov 03 01:10:53 2004 +0000
+++ b/roundup/backends/__init__.py	Wed Nov 03 01:34:21 2004 +0000
@@ -15,28 +15,38 @@
 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 #
-# $Id: __init__.py,v 1.28 2004-10-24 08:23:16 a1s Exp $
+# $Id: __init__.py,v 1.29 2004-11-03 01:34:21 richard Exp $
 
 '''Container for the hyperdb storage backend implementations.
-
-The __all__ variable is constructed containing only the backends which are
-available.
 '''
 __docformat__ = 'restructuredtext'
 
-__all__ = []
+_modules = {
+    'mysql': 'MySQLdb',
+    'postgresql': 'psycopg',
+}
+
+def get_backend(name):
+    '''Get a specific backend by name.'''
+    return __import__('back_%s'%name, globals())
 
-for backend in ['anydbm', ('mysql', 'MySQLdb'),
-        'sqlite', 'metakit', ('postgresql', 'psycopg')]:
-    if len(backend) == 2:
-        backend, backend_module = backend
-    else:
-        backend_module = backend
+def have_backend(name):
+    '''Is backend "name" available?'''
+    module = _modules.get(name, name)
     try:
-        globals()[backend] = __import__('back_%s'%backend, globals())
-        __all__.append(backend)
+        get_backend(name)
+        return 1
     except ImportError, e:
-        if not str(e).startswith('No module named %s'%backend_module):
+        if not str(e).startswith('No module named %s'%module):
             raise
+    return 0
+
+def list_backends():
+    '''List all available backend names.'''
+    l = []
+    for name in 'anydbm', 'mysql', 'sqlite', 'metakit', 'postgresql':
+        if have_backend(name):
+            l.append(name)
+    return l
 
 # vim: set filetype=python ts=4 sw=4 et si
--- a/roundup/instance.py	Wed Nov 03 01:10:53 2004 +0000
+++ b/roundup/instance.py	Wed Nov 03 01:34:21 2004 +0000
@@ -15,7 +15,7 @@
 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 #
-# $Id: instance.py,v 1.27 2004-11-02 10:00:36 a1s Exp $
+# $Id: instance.py,v 1.28 2004-11-03 01:34:21 richard Exp $
 
 '''Tracker handling (open tracker).
 
@@ -61,8 +61,7 @@
         return name
 
     def get_backend(self):
-        name = self.get_backend_name()
-        return getattr(backends, name)
+        return backends.get_backend(self.get_backend_name())
 
     def open(self, name=None):
         backend = self.get_backend()
--- a/test/test_anydbm.py	Wed Nov 03 01:10:53 2004 +0000
+++ b/test/test_anydbm.py	Wed Nov 03 01:34:21 2004 +0000
@@ -15,14 +15,15 @@
 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 # 
-# $Id: test_anydbm.py,v 1.3 2004-03-18 01:58:46 richard Exp $ 
+# $Id: test_anydbm.py,v 1.4 2004-11-03 01:34:21 richard Exp $ 
 
 import unittest, os, shutil, time
+from roundup.backends import get_backend
 
 from db_test_base import DBTest, ROTest, SchemaTest, ClassicInitTest, config
 
 class anydbmOpener:
-    from roundup.backends import anydbm as module
+    module = get_backend('anydbm')
 
     def nuke_database(self):
         shutil.rmtree(config.DATABASE)
--- a/test/test_metakit.py	Wed Nov 03 01:10:53 2004 +0000
+++ b/test/test_metakit.py	Wed Nov 03 01:34:21 2004 +0000
@@ -15,16 +15,16 @@
 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 # 
-# $Id: test_metakit.py,v 1.5 2004-03-24 05:33:13 richard Exp $ 
+# $Id: test_metakit.py,v 1.6 2004-11-03 01:34:21 richard Exp $ 
 import unittest, os, shutil, time, weakref
 
 from db_test_base import DBTest, ROTest, SchemaTest, ClassicInitTest, config, password
 
-from roundup import backends
+from roundup.backends import get_backend, have_backend
 
 class metakitOpener:
-    if hasattr(backends, 'metakit'):
-        from roundup.backends import metakit as module
+    if have_backend('metakit'):
+        module = get_backend('metakit')
         module._instances = weakref.WeakValueDictionary()
 
     def nuke_database(self):
@@ -65,7 +65,7 @@
 
 def test_suite():
     suite = unittest.TestSuite()
-    if not hasattr(backends, 'metakit'):
+    if not have_backend('metakit'):
         print 'Skipping metakit tests'
         return suite
     print 'Including metakit tests'
--- a/test/test_mysql.py	Wed Nov 03 01:10:53 2004 +0000
+++ b/test/test_mysql.py	Wed Nov 03 01:34:21 2004 +0000
@@ -15,19 +15,19 @@
 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 #
-# $Id: test_mysql.py,v 1.13 2004-09-26 15:18:28 a1s Exp $
+# $Id: test_mysql.py,v 1.14 2004-11-03 01:34:21 richard Exp $
 
 import unittest, os, shutil, time, imp
 
 from roundup.hyperdb import DatabaseError
-from roundup import init, backends
+from roundup.backends import get_backend, have_backend
 
 from db_test_base import DBTest, ROTest, config, SchemaTest, ClassicInitTest
 
 
 class mysqlOpener:
-    if hasattr(backends, 'mysql'):
-        from roundup.backends import mysql as module
+    if have_backend('mysql'):
+        module = get_backends('mysql')
 
     def setUp(self):
         self.module.db_nuke(config)
@@ -74,16 +74,15 @@
 
 def test_suite():
     suite = unittest.TestSuite()
-    if not hasattr(backends, 'mysql'):
+    if not have_backend('mysql'):
         print "Skipping mysql tests"
         return suite
 
-    from roundup.backends import mysql
     import MySQLdb
     try:
         # Check if we can connect to the server.
         # use db_exists() to make a connection, ignore it's return value
-        mysql.db_exists(config)
+        mysqlOpener.module.db_exists(config)
     except (MySQLdb.MySQLError, DatabaseError), msg:
         print "Skipping mysql tests (%s)"%msg
     else:
--- a/test/test_postgresql.py	Wed Nov 03 01:10:53 2004 +0000
+++ b/test/test_postgresql.py	Wed Nov 03 01:34:21 2004 +0000
@@ -15,7 +15,7 @@
 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 #
-# $Id: test_postgresql.py,v 1.11 2004-09-25 15:50:36 a1s Exp $
+# $Id: test_postgresql.py,v 1.12 2004-11-03 01:34:21 richard Exp $
 
 import unittest
 
@@ -23,15 +23,13 @@
 
 from db_test_base import DBTest, ROTest, config, SchemaTest, ClassicInitTest
 
-from roundup import backends
+from roundup.backends import get_backend, have_backend
 
 class postgresqlOpener:
-    if hasattr(backends, 'postgresql'):
-        from roundup.backends import postgresql as module
+    if have_backend('postgresql'):
+        module = get_backend('postgresql')
 
     def setUp(self):
-        #from roundup.backends.back_postgresql import db_nuke
-        #db_nuke(config, 1)
         pass
 
     def tearDown(self):
@@ -39,8 +37,7 @@
 
     def nuke_database(self):
         # clear out the database - easiest way is to nuke and re-create it
-        from roundup.backends.back_postgresql import db_nuke
-        db_nuke(config)
+        self.module.db_nuke(config)
 
 class postgresqlDBTest(postgresqlOpener, DBTest):
     def setUp(self):
@@ -99,14 +96,13 @@
 
 def test_suite():
     suite = unittest.TestSuite()
-    if not hasattr(backends, 'postgresql'):
+    if not have_backend('postgresql'):
         print "Skipping postgresql tests"
         return suite
 
     # make sure we start with a clean slate
-    from roundup.backends.back_postgresql import db_nuke, db_exists
-    if db_exists(config):
-        db_nuke(config, 1)
+    if postgresqlOpener.module.db_exists(config):
+        postgresqlOpener.module.db_nuke(config, 1)
 
     # TODO: Check if we can run postgresql tests
     print 'Including postgresql tests'
--- a/test/test_sqlite.py	Wed Nov 03 01:10:53 2004 +0000
+++ b/test/test_sqlite.py	Wed Nov 03 01:34:21 2004 +0000
@@ -15,16 +15,16 @@
 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 # 
-# $Id: test_sqlite.py,v 1.4 2004-03-18 01:58:46 richard Exp $ 
+# $Id: test_sqlite.py,v 1.5 2004-11-03 01:34:21 richard Exp $ 
 
 import unittest, os, shutil, time
+from roundup.backends import get_backend, have_backend
 
 from db_test_base import DBTest, ROTest, SchemaTest, ClassicInitTest, config
 
 class sqliteOpener:
-    from roundup import backends
-    if hasattr(backends, 'sqlite'):
-        from roundup.backends import sqlite as module
+    if have_backend('sqlite'):
+        module = get_backend('sqlite')
 
     def nuke_database(self):
         shutil.rmtree(config.DATABASE)
@@ -48,7 +48,7 @@
 def test_suite():
     suite = unittest.TestSuite()
     from roundup import backends
-    if not hasattr(backends, 'sqlite'):
+    if not have_backend('sqlite'):
         print 'Skipping sqlite tests'
         return suite
     print 'Including sqlite tests'

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