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.