Commit 63954e3d authored by Brett Cannon's avatar Brett Cannon

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.
parent 76ed5bd1
......@@ -1238,12 +1238,25 @@ class NamespaceLoader:
def module_repr(cls, module):
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):
"""Load a namespace module."""
_verbose_message('namespace module loaded with path {!r}', self._path)
with module_to_load(fullname) as module:
self.init_module_attrs(module)
module.__path__ = self._path
module.__package__ = fullname
return module
......
......@@ -188,7 +188,7 @@ class InspectLoader(Loader):
load_module = _bootstrap._LoaderBasics.load_module
_register(InspectLoader, machinery.BuiltinImporter, machinery.FrozenImporter,
machinery.ExtensionFileLoader)
machinery.ExtensionFileLoader, _bootstrap.NamespaceLoader)
class ExecutionLoader(InspectLoader):
......
import sys
import contextlib
import unittest
from importlib._bootstrap import NamespaceLoader
import importlib.abc
import importlib.machinery
import os
import sys
import types
import unittest
from test.test_importlib import util
from test.support import run_unittest
......@@ -286,9 +290,24 @@ class ModuleAndNamespacePackageInSameDir(NamespacePackageTest):
self.assertEqual(a_test.attr, 'in module')
def test_main():
run_unittest(*NamespacePackageTest.__subclasses__())
class ABCTests(unittest.TestCase):
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__":
test_main()
unittest.main()
......@@ -123,6 +123,10 @@ Core and Builtins
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.
- subprocess: Prevent a possible double close of parent pipe fds when the
......
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment