Make RCS testcase subclasses dynamically.
authorJohn Doe <jdoe@example.com>
Sun, 14 Jun 2009 04:34:11 +0000 (14:34 +1000)
committerJohn Doe <jdoe@example.com>
Sun, 14 Jun 2009 04:34:11 +0000 (14:34 +1000)
libbe/arch.py
libbe/bzr.py
libbe/git.py
libbe/hg.py
libbe/rcs.py

index fd953a45238d403a50b7ce5771ebf1413ceab0a5..73bef35096fcd22ef35389c271092cb3e79ee64e 100644 (file)
@@ -14,6 +14,8 @@
 #    You should have received a copy of the GNU General Public License
 #    along with this program; if not, write to the Free Software
 #    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+import sys
 import os
 import shutil
 import time
@@ -23,7 +25,8 @@ import doctest
 
 import config
 from beuuid import uuid_gen
-from rcs import RCS, RCStestCase, CommandError
+import rcs
+from rcs import RCS
 
 client = config.get_val("arch_client")
 if client is None:
@@ -270,9 +273,10 @@ class CantAddFile(Exception):
     def __init__(self, file):
         self.file = file
         Exception.__init__(self, "Can't automatically add file %s" % file)
-    
-class ArchTestCase(RCStestCase):
-    Class = Arch
 
-unitsuite = unittest.TestLoader().loadTestsFromTestCase(ArchTestCase)
+
+\f
+rcs.make_rcs_testcase_subclasses(Arch, sys.modules[__name__])
+
+unitsuite = unittest.TestLoader().loadTestsFromModule(sys.modules[__name__])
 suite = unittest.TestSuite([unitsuite, doctest.DocTestSuite()])
index a0ae71539a587b419437cb5e5d71e6148384855c..4a01d8ab822eb9872599374145d315759db37f59 100644 (file)
 #    You should have received a copy of the GNU General Public License
 #    along with this program; if not, write to the Free Software
 #    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+import sys
 import os
 import re
 import unittest
 import doctest
 
-from rcs import RCS, RCStestCase, CommandError
+import rcs
+from rcs import RCS
 
 def new():
     return Bzr()
@@ -79,7 +82,7 @@ class Bzr(RCS):
     def postcommit(self):
         try:
             self._u_invoke_client('merge')
-        except CommandError, e:
+        except rcs.CommandError, e:
             if ('No merge branch known or specified' in e.err_str or
                 'No merge location known or specified' in e.err_str):
                 pass
@@ -91,8 +94,8 @@ class Bzr(RCS):
         if len(self._u_invoke_client('status', directory=directory)[1]) > 0:
             self.commit('Merge from upstream')
 
-class BzrTestCase(RCStestCase):
-    Class = Bzr
+\f    
+rcs.make_rcs_testcase_subclasses(Bzr, sys.modules[__name__])
 
-unitsuite = unittest.TestLoader().loadTestsFromTestCase(BzrTestCase)
+unitsuite = unittest.TestLoader().loadTestsFromModule(sys.modules[__name__])
 suite = unittest.TestSuite([unitsuite, doctest.DocTestSuite()])
index 046e72e2bb4a4e77f18e0c21879e98d08df29cf1..4a1ddee5b3f419123dc5872370b7ae602f98bc8b 100644 (file)
 #    You should have received a copy of the GNU General Public License
 #    along with this program; if not, write to the Free Software
 #    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+import sys
 import os
 import re
 import unittest
 import doctest
 
-from rcs import RCS, RCStestCase, CommandError
+import rcs
+from rcs import RCS
 
 def new():
     return Git()
@@ -91,9 +94,9 @@ class Git(RCS):
         assert len(match.groups()) == 3
         revision = match.groups()[1]
         return revision
-class GitTestCase(RCStestCase):
-    Class = Git
 
-unitsuite = unittest.TestLoader().loadTestsFromTestCase(GitTestCase)
+\f    
+rcs.make_rcs_testcase_subclasses(Git, sys.modules[__name__])
+
+unitsuite = unittest.TestLoader().loadTestsFromModule(sys.modules[__name__])
 suite = unittest.TestSuite([unitsuite, doctest.DocTestSuite()])
index 27cbb79582d0d781de36f21a649d7e75861356b7..52f8a96802c52bafe99bdf984798cbb8ab935745 100644 (file)
 #    You should have received a copy of the GNU General Public License
 #    along with this program; if not, write to the Free Software
 #    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+import sys
 import os
 import re
 import unittest
 import doctest
 
-from rcs import RCS, RCStestCase, CommandError, SettingIDnotSupported
+import rcs
+from rcs import RCS
 
 def new():
     return Hg()
@@ -49,7 +52,7 @@ class Hg(RCS):
         standard Mercurial.
         http://www.selenic.com/mercurial/wiki/index.cgi/ConfigExtension
         """
-        raise SettingIDnotSupported
+        raise rcs.SettingIDnotSupported
     def _rcs_add(self, path):
         self._u_invoke_client("add", path)
     def _rcs_remove(self, path):
@@ -79,8 +82,8 @@ class Hg(RCS):
         revision = match.groups()[0]
         return revision
 
-class HgTestCase(RCStestCase):
-    Class = Hg
+\f    
+rcs.make_rcs_testcase_subclasses(Hg, sys.modules[__name__])
 
-unitsuite = unittest.TestLoader().loadTestsFromTestCase(HgTestCase)
+unitsuite = unittest.TestLoader().loadTestsFromModule(sys.modules[__name__])
 suite = unittest.TestSuite([unitsuite, doctest.DocTestSuite()])
index 3519c3daddb46bd736b7ad7913796034aea309cd..ed5c7ee1e002587ddd4aed81f55542e4b15f1954 100644 (file)
@@ -546,8 +546,8 @@ class RCS(object):
         f.close
         return (summary, body)
         
-
-class RCStestCase(unittest.TestCase):
+\f
+class RCSTestCase(unittest.TestCase):
     Class = RCS
     def __init__(self, *args, **kwargs):
         unittest.TestCase.__init__(self, *args, **kwargs)
@@ -635,5 +635,23 @@ class RCStestCase(unittest.TestCase):
         self.versionTest('a/b/text')
         self.rcs.recursive_remove(self.fullPath('a'))
 
-unitsuite = unittest.TestLoader().loadTestsFromTestCase(RCStestCase)
+
+def make_rcs_testcase_subclasses(rcs_class, namespace):
+    """ Make RCSTestCase subclasses for rcs_class in the namespace. """
+    rcs_testcase_classes = [
+        c for c in (
+            ob for ob in globals().values() if isinstance(ob, type))
+        if issubclass(c, RCSTestCase)]
+
+    for base_class in rcs_testcase_classes:
+        testcase_class_name = rcs_class.__name__ + base_class.__name__
+        testcase_class_bases = (base_class,)
+        testcase_class_dict = dict(base_class.__dict__)
+        testcase_class_dict['Class'] = rcs_class
+        testcase_class = type(
+            testcase_class_name, testcase_class_bases, testcase_class_dict)
+        setattr(namespace, testcase_class_name, testcase_class)
+
+
+unitsuite = unittest.TestLoader().loadTestsFromModule(sys.modules[__name__])
 suite = unittest.TestSuite([unitsuite, doctest.DocTestSuite()])