Issues #18058, 18057: Make importlib._bootstrap.NamespaceLoader

conform the the InspectLoader ABC. Perk of this is that runpy/-m can
now work with namespace packages.
This commit is contained in:
Brett Cannon 2013-06-16 14:56:58 -04:00
parent 645ab68f25
commit 13d8ff9c5b
5 changed files with 1156 additions and 1079 deletions

View File

@ -1238,12 +1238,25 @@ class NamespaceLoader:
def module_repr(cls, module): def module_repr(cls, module):
return "<module '{}' (namespace)>".format(module.__name__) return "<module '{}' (namespace)>".format(module.__name__)
def is_package(self, fullname):
return True
def get_source(self, fullname):
return ''
def get_code(self, fullname):
return compile('', '<string>', 'exec', dont_inherit=True)
def init_module_attrs(self, module):
module.__loader__ = self
module.__package__ = module.__name__
def load_module(self, fullname): def load_module(self, fullname):
"""Load a namespace module.""" """Load a namespace module."""
_verbose_message('namespace module loaded with path {!r}', self._path) _verbose_message('namespace module loaded with path {!r}', self._path)
with module_to_load(fullname) as module: with module_to_load(fullname) as module:
self.init_module_attrs(module)
module.__path__ = self._path module.__path__ = self._path
module.__package__ = fullname
return module return module

View File

@ -188,7 +188,7 @@ class InspectLoader(Loader):
load_module = _bootstrap._LoaderBasics.load_module load_module = _bootstrap._LoaderBasics.load_module
_register(InspectLoader, machinery.BuiltinImporter, machinery.FrozenImporter, _register(InspectLoader, machinery.BuiltinImporter, machinery.FrozenImporter,
machinery.ExtensionFileLoader) machinery.ExtensionFileLoader, _bootstrap.NamespaceLoader)
class ExecutionLoader(InspectLoader): class ExecutionLoader(InspectLoader):

View File

@ -1,7 +1,11 @@
import sys
import contextlib import contextlib
import unittest from importlib._bootstrap import NamespaceLoader
import importlib.abc
import importlib.machinery
import os import os
import sys
import types
import unittest
from test.test_importlib import util from test.test_importlib import util
from test.support import run_unittest from test.support import run_unittest
@ -286,9 +290,24 @@ class ModuleAndNamespacePackageInSameDir(NamespacePackageTest):
self.assertEqual(a_test.attr, 'in module') self.assertEqual(a_test.attr, 'in module')
def test_main(): class ABCTests(unittest.TestCase):
run_unittest(*NamespacePackageTest.__subclasses__())
def setUp(self):
self.loader = NamespaceLoader('foo', ['pkg'],
importlib.machinery.PathFinder)
def test_is_package(self):
self.assertTrue(self.loader.is_package('foo'))
def test_get_code(self):
self.assertTrue(isinstance(self.loader.get_code('foo'), types.CodeType))
def test_get_source(self):
self.assertEqual(self.loader.get_source('foo'), '')
def test_abc_isinstance(self):
self.assertTrue(isinstance(self.loader, importlib.abc.InspectLoader))
if __name__ == "__main__": if __name__ == "__main__":
test_main() unittest.main()

View File

@ -123,6 +123,10 @@ Core and Builtins
Library Library
------- -------
- Issue #18058, 18057: Make the namespace package loader meet the
importlib.abc.InspectLoader ABC, allowing for namespace packages to work with
runpy.
- Issue #17177: The imp module is pending deprecation. - Issue #17177: The imp module is pending deprecation.
- subprocess: Prevent a possible double close of parent pipe fds when the - subprocess: Prevent a possible double close of parent pipe fds when the

File diff suppressed because it is too large Load Diff