Author: jezdez
Date: 2011-04-22 05:03:18 -0700 (Fri, 22 Apr 2011)
New Revision: 16075

Modified:
   django/trunk/django/utils/module_loading.py
   django/trunk/tests/regressiontests/utils/module_loading.py
Log:
Fixed #15662 -- Made sure the module_has_submodule utility function follow 
correct PEP 302, passing the package as the second argument to the find_module 
method of the importer. Thanks, Bradley Ayers.

Modified: django/trunk/django/utils/module_loading.py
===================================================================
--- django/trunk/django/utils/module_loading.py 2011-04-22 12:03:10 UTC (rev 
16074)
+++ django/trunk/django/utils/module_loading.py 2011-04-22 12:03:18 UTC (rev 
16075)
@@ -12,7 +12,7 @@
     except KeyError:
         pass
     for finder in sys.meta_path:
-        if finder.find_module(name):
+        if finder.find_module(name, package):
             return True
     for entry in package.__path__:  # No __path__, then not a package.
         try:

Modified: django/trunk/tests/regressiontests/utils/module_loading.py
===================================================================
--- django/trunk/tests/regressiontests/utils/module_loading.py  2011-04-22 
12:03:10 UTC (rev 16074)
+++ django/trunk/tests/regressiontests/utils/module_loading.py  2011-04-22 
12:03:18 UTC (rev 16075)
@@ -1,5 +1,6 @@
 import os
 import sys
+import imp
 from zipimport import zipimporter
 
 from django.utils import unittest
@@ -8,6 +9,12 @@
 
 
 class DefaultLoader(unittest.TestCase):
+    def setUp(self):
+        sys.meta_path.insert(0, ProxyFinder())
+
+    def tearDown(self):
+        sys.meta_path.pop(0)
+
     def test_loader(self):
         "Normal module existence can be tested"
         test_module = import_module('regressiontests.utils.test_module')
@@ -25,6 +32,10 @@
         self.assertFalse(module_has_submodule(test_module, 'no_such_module'))
         self.assertRaises(ImportError, import_module, 
'regressiontests.utils.test_module.no_such_module')
 
+        # A child that doesn't exist, but is the name of a package on the path
+        self.assertFalse(module_has_submodule(test_module, 'django'))
+        self.assertRaises(ImportError, import_module, 
'regressiontests.utils.test_module.django')
+
         # Don't be confused by caching of import misses
         import types  # causes attempted import of regressiontests.utils.types
         
self.assertFalse(module_has_submodule(sys.modules['regressiontests.utils'], 
'types'))
@@ -84,6 +95,25 @@
         self.assertFalse(module_has_submodule(egg_module, 'no_such_module'))
         self.assertRaises(ImportError, import_module, 
'egg_module.sub1.sub2.no_such_module')
 
+class ProxyFinder(object):
+    def __init__(self):
+        self._cache = {}
+
+    def find_module(self, fullname, path=None):
+        tail = fullname.rsplit('.', 1)[-1]
+        try:
+            self._cache[fullname] = imp.find_module(tail, path)
+        except ImportError:
+            return None
+        else:
+            return self  # this is a loader as well
+
+    def load_module(self, fullname):
+        if fullname in sys.modules:
+            return sys.modules[fullname]
+        fd, fn, info = self._cache[fullname]
+        return imp.load_module(fullname, fd, fn, info)
+
 class TestFinder(object):
     def __init__(self, *args, **kwargs):
         self.importer = zipimporter(*args, **kwargs)

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to django-updates@googlegroups.com.
To unsubscribe from this group, send email to 
django-updates+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.

Reply via email to