| """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.""" |
| |
| @abc.abstractmethod |
| def load_module(self, fullname:str) -> types.ModuleType: |
| """Abstract method which when implemented should load a module.""" |
| raise NotImplementedError |
| |
| |
| class Finder(metaclass=abc.ABCMeta): |
| |
| """Abstract base class for import finders.""" |
| |
| @abc.abstractmethod |
| def find_module(self, fullname:str, path:[str]=None) -> Loader: |
| """Abstract method which when implemented should find a module.""" |
| raise NotImplementedError |
| |
| Finder.register(machinery.BuiltinImporter) |
| Finder.register(machinery.FrozenImporter) |
| Finder.register(machinery.PathFinder) |
| |
| |
| class ResourceLoader(Loader): |
| |
| """Abstract base class for loaders which can return data from their |
| back-end storage. |
| |
| This ABC represents one of the optional protocols specified by PEP 302. |
| |
| """ |
| |
| @abc.abstractmethod |
| def get_data(self, path:str) -> bytes: |
| """Abstract method which when implemented should return the bytes for |
| the specified path.""" |
| raise NotImplementedError |
| |
| |
| class InspectLoader(Loader): |
| |
| """Abstract base class for loaders which support inspection about the |
| modules they can load. |
| |
| This ABC represents one of the optional protocols specified by PEP 302. |
| |
| """ |
| |
| @abc.abstractmethod |
| def is_package(self, fullname:str) -> bool: |
| """Abstract method which when implemented should return whether the |
| module is a package.""" |
| return NotImplementedError |
| |
| @abc.abstractmethod |
| def get_code(self, fullname:str) -> types.CodeType: |
| """Abstract method which when implemented should return the code object |
| for the module""" |
| return NotImplementedError |
| |
| @abc.abstractmethod |
| def get_source(self, fullname:str) -> str: |
| """Abstract method which should return the source code for the |
| module.""" |
| return NotImplementedError |
| |
| InspectLoader.register(machinery.BuiltinImporter) |
| InspectLoader.register(machinery.FrozenImporter) |
| |
| |
| class PyLoader(_bootstrap.PyLoader, ResourceLoader, InspectLoader): |
| |
| """Abstract base class to assist in loading source code by requiring only |
| back-end storage methods to be implemented. |
| |
| The methods get_code, get_source, and load_module are implemented for the |
| user. |
| |
| """ |
| |
| @abc.abstractmethod |
| def source_path(self, fullname:str) -> object: |
| """Abstract method which when implemented should return the path to the |
| sourced code for the module.""" |
| raise NotImplementedError |
| |
| |
| class PyPycLoader(_bootstrap.PyPycLoader, PyLoader): |
| |
| """Abstract base class to assist in loading source and bytecode by |
| requiring only back-end storage methods to be implemented. |
| |
| The methods get_code, get_source, and load_module are implemented for the |
| user. |
| |
| """ |
| |
| @abc.abstractmethod |
| def source_mtime(self, fullname:str) -> int: |
| """Abstract method which when implemented should return the |
| modification time for the source of the module.""" |
| raise NotImplementedError |
| |
| @abc.abstractmethod |
| def bytecode_path(self, fullname:str) -> object: |
| """Abstract method which when implemented should return the path to the |
| bytecode for the module.""" |
| raise NotImplementedError |
| |
| @abc.abstractmethod |
| def write_bytecode(self, fullname:str, bytecode:bytes): |
| """Abstract method which when implemented should attempt to write the |
| bytecode for the module.""" |
| raise NotImplementedError |