Code

Added the "actor" property. Metakit backend not done (still not confident
[roundup.git] / roundup / instance.py
index 77dbb26dcf6013cb5826b8911f3e6c2e6ab51b6a..81c946167c6e7a8c0c6815ff2f10a35d288aaf0c 100644 (file)
 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 # 
-# $Id: instance.py,v 1.3 2001-08-07 00:24:42 richard Exp $
+# $Id: instance.py,v 1.12 2004-02-11 23:55:08 richard Exp $
 
-''' Currently this module provides one function: open. This function opens
-an instance.
+'''Tracker handling (open tracker).
+
+Backwards compatibility for the old-style "imported" trackers.
 '''
+__docformat__ = 'restructuredtext'
+
+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)
 
-import imp
 
-class Opener:
+    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 OldStyleTrackers:
     def __init__(self):
         self.number = 0
-        self.instances = {}
+        self.trackers = {}
+
+    def open(self, tracker_home):
+        ''' Open the tracker.
 
-    def open(self, instance_home):
-        if self.instances.has_key(instance_home):
-            return imp.load_package(self.instances[instance_home],
-                instance_home)
+            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.2  2001/08/07 00:15:51  richard
-# Added the copyright/license notice to (nearly) all files at request of
-# Bizar Software.
-#
-# 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