"""Abstract base classes related to import.""" from . import _bootstrap from . import machinery import abc import types class Loader(metaclass=abc.ABCMeta): """Abstract base class for import loaders. See PEP 302 for details. """ def load_module(self, fullname:str) -> types.ModuleType: raise NotImplementedError Loader.register(machinery.BuiltinImporter) Loader.register(machinery.FrozenImporter) class Finder(metaclass=abc.ABCMeta): """Abstract base class for import finders. See PEP 302 for details. """ @abc.abstractmethod def find_module(self, fullname:str, path:[str]=None) -> Loader: raise NotImplementedError Finder.register(machinery.BuiltinImporter) Finder.register(machinery.FrozenImporter) Finder.register(machinery.PathFinder) class Importer(Finder, Loader): """Abstract base class for importers.""" class ResourceLoader(Loader): """Abstract base class for loaders which can return data from the back-end storage. This ABC represents one of the optional protocols specified by PEP 302. """ @abc.abstractmethod def get_data(self, path:str) -> bytes: raise NotImplementedError class InspectLoader(Loader): """Abstract base class for loaders which supports introspection. This ABC represents one of the optional protocols specified by PEP 302. """ @abc.abstractmethod def is_package(self, fullname:str) -> bool: return NotImplementedError @abc.abstractmethod def get_code(self, fullname:str) -> types.CodeType: return NotImplementedError @abc.abstractmethod def get_source(self, fullname:str) -> str: return NotImplementedError class PyLoader(_bootstrap.PyLoader, InspectLoader): """Abstract base class that implements the core parts needed to load Python source code.""" # load_module and get_code are implemented. @abc.abstractmethod def source_path(self, fullname:str) -> object: raise NotImplementedError class PyPycLoader(_bootstrap.PyPycLoader, PyLoader): """Abstract base class that implements the core parts needed to load Python source and bytecode.""" # Implements load_module and get_code. @abc.abstractmethod def source_mtime(self, fullname:str) -> int: raise NotImplementedError @abc.abstractmethod def bytecode_path(self, fullname:str) -> object: raise NotImplementedError @abc.abstractmethod def write_bytecode(self, fullname:str, bytecode:bytes): raise NotImplementedError