diff --git a/roundup/instance.py b/roundup/instance.py
index 432bab6b8d27859dd0aa6b1dc4b92743b92027f8..ec87f3899616e8997da61df4c5212d6d68fd093b 100644 (file)
--- a/roundup/instance.py
+++ b/roundup/instance.py
# under the same terms as Python, so long as this copyright message and
# disclaimer are retained in their original form.
#
-# IN NO EVENT SHALL THE BIZAR SOFTWARE PTY LTD BE LIABLE TO ANY PARTY FOR
+# IN NO EVENT SHALL BIZAR SOFTWARE PTY LTD BE LIABLE TO ANY PARTY FOR
# DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING
# OUT OF THE USE OF THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
# BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
#
-# $Id: instance.py,v 1.2 2001-08-07 00:15:51 richard Exp $
+# $Id: instance.py,v 1.10 2003-09-04 00:47:01 richard Exp $
-''' Currently this module provides one function: open. This function opens
-an instance.
+__doc__ = '''
+Tracker handling (open tracker).
+
+Backwards compatibility for the old-style "imported" trackers.
'''
-import imp
+import os
+
+class Vars:
+ ''' I'm just a container '''
+
+class Tracker:
+ def __init__(self, tracker_home):
+ self.tracker_home = tracker_home
+ self.select_db = self._load_python('select_db.py')
+ self.config = self._load_config('config.py')
+ raise NotImplemented, 'this is *so* not finished'
+ self.init = XXX
+ self.Client = XXX
+ self.MailGW = XXX
+
+ def open(self):
+ return self._load_config('schema.py').db
+ self._load_config('security.py', db=db)
+
+
+ def __load_python(self, file):
+ file = os.path.join(tracker_home, file)
+ vars = Vars()
+ execfile(file, vars.__dict__)
+ return vars
+
+
+class TrackerError(Exception):
+ pass
+
-class Opener:
+class OldStyleTrackers:
def __init__(self):
self.number = 0
- self.instances = {}
+ self.trackers = {}
- def open(self, instance_home):
- if self.instances.has_key(instance_home):
- return imp.load_package(self.instances[instance_home],
- instance_home)
+ def open(self, tracker_home):
+ ''' Open the tracker.
+
+ Raise ValueError if the tracker home doesn't exist.
+ '''
+ import imp
+ # sanity check existence of tracker home
+ if not os.path.exists(tracker_home):
+ raise ValueError, 'no such directory: "%s"'%tracker_home
+
+ # sanity check tracker home contents
+ for reqd in 'config dbinit select_db interfaces'.split():
+ if not os.path.exists(os.path.join(tracker_home, '%s.py'%reqd)):
+ raise TrackerError, 'File "%s.py" missing from tracker '\
+ 'home "%s"'%(reqd, tracker_home)
+
+ if self.trackers.has_key(tracker_home):
+ return imp.load_package(self.trackers[tracker_home],
+ tracker_home)
self.number = self.number + 1
- modname = '_roundup_instance_%s'%self.number
- self.instances[instance_home] = modname
- return imp.load_package(modname, instance_home)
+ modname = '_roundup_tracker_%s'%self.number
+ self.trackers[tracker_home] = modname
-opener = Opener()
-open = opener.open
+ # load the tracker
+ tracker = imp.load_package(modname, tracker_home)
-del Opener
-del opener
+ # ensure the tracker has all the required bits
+ for required in 'config open init Client MailGW'.split():
+ if not hasattr(tracker, required):
+ raise TrackerError, \
+ 'Required tracker attribute "%s" missing'%required
+ return tracker
+
+OldStyleTrackers = OldStyleTrackers()
+def open(tracker_home):
+ if os.path.exists(os.path.join(tracker_home, 'dbinit.py')):
+ # user should upgrade...
+ return OldStyleTrackers.open(tracker_home)
+
+ return Tracker(tracker_home)
-#
-# $Log: not supported by cvs2svn $
-# Revision 1.1 2001/08/05 07:43:52 richard
-# Instances are now opened by a special function that generates a unique
-# module name for the instances on import time.
-#
-#
-#
# vim: set filetype=python ts=4 sw=4 et si