[Python-checkins] r74107 - in python/branches/py3k: Lib/importlib/abc.py Lib/importlib/test/test_abc.py Misc/NEWS

brett.cannon python-checkins at python.org
Mon Jul 20 05:19:18 CEST 2009


Author: brett.cannon
Date: Mon Jul 20 05:19:18 2009
New Revision: 74107

Log:
Importlib's documentation said that importlib.abc.PyLoader inherited from
importlib.abc.ResourceLoader, when in fact it did not. Fixed the ABC to inherit
as documented.

This does in introduce an backwards-incompatiblity as the code in PyLoader
already required the single method ResourceLoader defined as an abstract
method.


Modified:
   python/branches/py3k/Lib/importlib/abc.py
   python/branches/py3k/Lib/importlib/test/test_abc.py
   python/branches/py3k/Misc/NEWS

Modified: python/branches/py3k/Lib/importlib/abc.py
==============================================================================
--- python/branches/py3k/Lib/importlib/abc.py	(original)
+++ python/branches/py3k/Lib/importlib/abc.py	Mon Jul 20 05:19:18 2009
@@ -76,7 +76,7 @@
 InspectLoader.register(machinery.FrozenImporter)
 
 
-class PyLoader(_bootstrap.PyLoader, InspectLoader):
+class PyLoader(_bootstrap.PyLoader, ResourceLoader, InspectLoader):
 
     """Abstract base class to assist in loading source code by requiring only
     back-end storage methods to be implemented.

Modified: python/branches/py3k/Lib/importlib/test/test_abc.py
==============================================================================
--- python/branches/py3k/Lib/importlib/test/test_abc.py	(original)
+++ python/branches/py3k/Lib/importlib/test/test_abc.py	Mon Jul 20 05:19:18 2009
@@ -1,30 +1,77 @@
 from importlib import abc
 from importlib import machinery
+import inspect
 import unittest
 
 
-class SubclassTests(unittest.TestCase):
+class InheritanceTests:
 
-    """Test that the various classes in importlib are subclasses of the
-    expected ABCS."""
+    """Test that the specified class is a subclass/superclass of the expected
+    classes."""
 
-    def verify(self, ABC, *classes):
-        """Verify the classes are subclasses of the ABC."""
-        for cls in classes:
-            self.assertTrue(issubclass(cls, ABC))
-
-    def test_Finder(self):
-        self.verify(abc.Finder, machinery.BuiltinImporter,
-                    machinery.FrozenImporter, machinery.PathFinder)
-
-    def test_Loader(self):
-        self.verify(abc.Loader, machinery.BuiltinImporter,
-                    machinery.FrozenImporter)
+    subclasses = []
+    superclasses = []
+
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+        assert self.subclasses or self.superclasses, self.__class__
+        self.__test = getattr(abc, self.__class__.__name__)
+
+    def test_subclasses(self):
+        # Test that the expected subclasses inherit.
+        for subclass in self.subclasses:
+            self.assertTrue(issubclass(subclass, self.__test),
+                "{0} is not a subclass of {1}".format(subclass, self.__test))
+
+    def test_superclasses(self):
+        # Test that the class inherits from the expected superclasses.
+        for superclass in self.superclasses:
+            self.assertTrue(issubclass(self.__test, superclass),
+               "{0} is not a superclass of {1}".format(superclass, self.__test))
+
+
+class Finder(InheritanceTests, unittest.TestCase):
+
+    subclasses = [machinery.BuiltinImporter, machinery.FrozenImporter,
+                    machinery.PathFinder]
+
+
+class Loader(InheritanceTests, unittest.TestCase):
+
+    subclasses = [abc.PyLoader]
+
+
+class ResourceLoader(InheritanceTests, unittest.TestCase):
+
+    superclasses = [abc.Loader]
+
+
+class InspectLoader(InheritanceTests, unittest.TestCase):
+
+    superclasses = [abc.Loader]
+    subclasses = [abc.PyLoader, machinery.BuiltinImporter,
+                    machinery.FrozenImporter]
+
+
+class PyLoader(InheritanceTests, unittest.TestCase):
+
+    superclasses = [abc.Loader, abc.ResourceLoader, abc.InspectLoader]
+
+
+class PyPycLoader(InheritanceTests, unittest.TestCase):
+
+    superclasses = [abc.PyLoader]
 
 
 def test_main():
     from test.support import run_unittest
-    run_unittest(SubclassTests)
+    classes = []
+    for class_ in globals().values():
+        if (inspect.isclass(class_) and
+                issubclass(class_, unittest.TestCase) and
+                issubclass(class_, InheritanceTests)):
+            classes.append(class_)
+    run_unittest(*classes)
 
 
 if __name__ == '__main__':

Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS	(original)
+++ python/branches/py3k/Misc/NEWS	Mon Jul 20 05:19:18 2009
@@ -43,6 +43,10 @@
 Library
 -------
 
+- importlib.abc.PyLoader did not inherit from importlib.abc.ResourceLoader like
+  the documentation said it did even though the code in PyLoader relied on the
+  abstract method required by ResourceLoader.
+
 - Issue #6431: Make Fraction type return NotImplemented when it doesn't
   know how to handle a comparison without loss of precision.  Also add
   correct handling of infinities and nans for comparisons with float.


More information about the Python-checkins mailing list