| 
									
										
										
										
											2009-03-09 03:35:50 +00:00
										 |  |  | """Abstract base classes related to import.""" | 
					
						
							| 
									
										
										
										
											2015-05-02 19:15:18 -06:00
										 |  |  | from . import _bootstrap_external | 
					
						
							| 
									
										
										
										
											2009-03-09 03:35:50 +00:00
										 |  |  | from . import machinery | 
					
						
							| 
									
										
										
										
											2012-04-22 19:58:33 -04:00
										 |  |  | try: | 
					
						
							|  |  |  |     import _frozen_importlib | 
					
						
							| 
									
										
										
										
											2013-07-04 17:43:24 -04:00
										 |  |  | except ImportError as exc: | 
					
						
							| 
									
										
										
										
											2012-04-22 19:58:33 -04:00
										 |  |  |     if exc.name != '_frozen_importlib': | 
					
						
							|  |  |  |         raise | 
					
						
							|  |  |  |     _frozen_importlib = None | 
					
						
							| 
									
										
										
										
											2015-05-02 19:15:18 -06:00
										 |  |  | try: | 
					
						
							|  |  |  |     import _frozen_importlib_external | 
					
						
							| 
									
										
										
										
											2019-11-19 21:34:03 +00:00
										 |  |  | except ImportError: | 
					
						
							| 
									
										
										
										
											2015-05-02 19:15:18 -06:00
										 |  |  |     _frozen_importlib_external = _bootstrap_external | 
					
						
							| 
									
										
										
										
											2020-06-17 23:15:59 +02:00
										 |  |  | from ._abc import Loader | 
					
						
							| 
									
										
										
										
											2009-03-09 03:35:50 +00:00
										 |  |  | import abc | 
					
						
							| 
									
										
										
										
											2017-02-15 18:00:32 -08:00
										 |  |  | import warnings | 
					
						
							| 
									
										
										
										
											2021-12-30 21:00:48 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-03 15:17:27 -04:00
										 |  |  | from .resources import abc as _resources_abc | 
					
						
							| 
									
										
										
										
											2021-12-30 21:00:48 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | __all__ = [ | 
					
						
							|  |  |  |     'Loader', 'Finder', 'MetaPathFinder', 'PathEntryFinder', | 
					
						
							|  |  |  |     'ResourceLoader', 'InspectLoader', 'ExecutionLoader', | 
					
						
							|  |  |  |     'FileLoader', 'SourceLoader', | 
					
						
							|  |  |  | ] | 
					
						
							| 
									
										
										
										
											2009-03-09 03:35:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-03 15:17:27 -04:00
										 |  |  | def __getattr__(name): | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     For backwards compatibility, continue to make names | 
					
						
							|  |  |  |     from _resources_abc available through this module. #93963 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     if name in _resources_abc.__all__: | 
					
						
							|  |  |  |         obj = getattr(_resources_abc, name) | 
					
						
							|  |  |  |         warnings._deprecated(f"{__name__}.{name}", remove=(3, 14)) | 
					
						
							|  |  |  |         globals()[name] = obj | 
					
						
							|  |  |  |         return obj | 
					
						
							|  |  |  |     raise AttributeError(f'module {__name__!r} has no attribute {name!r}') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-22 19:58:33 -04:00
										 |  |  | def _register(abstract_cls, *classes): | 
					
						
							|  |  |  |     for cls in classes: | 
					
						
							|  |  |  |         abstract_cls.register(cls) | 
					
						
							|  |  |  |         if _frozen_importlib is not None: | 
					
						
							| 
									
										
										
										
											2015-05-02 19:15:18 -06:00
										 |  |  |             try: | 
					
						
							|  |  |  |                 frozen_cls = getattr(_frozen_importlib, cls.__name__) | 
					
						
							|  |  |  |             except AttributeError: | 
					
						
							|  |  |  |                 frozen_cls = getattr(_frozen_importlib_external, cls.__name__) | 
					
						
							| 
									
										
										
										
											2012-04-22 19:58:33 -04:00
										 |  |  |             abstract_cls.register(frozen_cls) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-02 21:26:03 +10:00
										 |  |  | class Finder(metaclass=abc.ABCMeta): | 
					
						
							| 
									
										
										
										
											2009-03-09 03:35:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-10 12:21:12 -04:00
										 |  |  |     """Legacy abstract base class for import finders.
 | 
					
						
							| 
									
										
										
										
											2009-03-09 03:35:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-10 12:21:12 -04:00
										 |  |  |     It may be subclassed for compatibility with legacy third party | 
					
						
							|  |  |  |     reimplementations of the import system.  Otherwise, finder | 
					
						
							|  |  |  |     implementations should derive from the more specific MetaPathFinder | 
					
						
							|  |  |  |     or PathEntryFinder ABCs. | 
					
						
							| 
									
										
										
										
											2017-02-15 18:00:32 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Deprecated since Python 3.3 | 
					
						
							| 
									
										
										
										
											2012-08-02 21:26:03 +10:00
										 |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-06 08:56:57 -07:00
										 |  |  |     def __init__(self): | 
					
						
							|  |  |  |         warnings.warn("the Finder ABC is deprecated and " | 
					
						
							|  |  |  |                        "slated for removal in Python 3.12; use MetaPathFinder " | 
					
						
							|  |  |  |                        "or PathEntryFinder instead", | 
					
						
							|  |  |  |                        DeprecationWarning) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-10 12:21:12 -04:00
										 |  |  |     @abc.abstractmethod | 
					
						
							| 
									
										
										
										
											2012-08-02 21:26:03 +10:00
										 |  |  |     def find_module(self, fullname, path=None): | 
					
						
							| 
									
										
										
										
											2012-08-10 12:21:12 -04:00
										 |  |  |         """An abstract method that should find a module.
 | 
					
						
							| 
									
										
										
										
											2012-08-02 21:26:03 +10:00
										 |  |  |         The fullname is a str and the optional path is a str or None. | 
					
						
							| 
									
										
										
										
											2013-04-09 16:59:39 -04:00
										 |  |  |         Returns a Loader object or None. | 
					
						
							| 
									
										
										
										
											2012-08-02 21:26:03 +10:00
										 |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2021-04-06 08:56:57 -07:00
										 |  |  |         warnings.warn("importlib.abc.Finder along with its find_module() " | 
					
						
							|  |  |  |                       "method are deprecated and " | 
					
						
							|  |  |  |                        "slated for removal in Python 3.12; use " | 
					
						
							|  |  |  |                        "MetaPathFinder.find_spec() or " | 
					
						
							|  |  |  |                        "PathEntryFinder.find_spec() instead", | 
					
						
							|  |  |  |                        DeprecationWarning) | 
					
						
							| 
									
										
										
										
											2009-03-09 03:35:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-02 21:26:03 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-06 08:56:57 -07:00
										 |  |  | class MetaPathFinder(metaclass=abc.ABCMeta): | 
					
						
							| 
									
										
										
										
											2012-08-02 21:26:03 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  |     """Abstract base class for import finders on sys.meta_path.""" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-22 09:05:39 -07:00
										 |  |  |     # We don't define find_spec() here since that would break | 
					
						
							|  |  |  |     # hasattr checks we do to support backward compatibility. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-02 21:26:03 +10:00
										 |  |  |     def find_module(self, fullname, path): | 
					
						
							| 
									
										
										
										
											2013-11-22 09:05:39 -07:00
										 |  |  |         """Return a loader for the module.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         If no module is found, return None.  The fullname is a str and | 
					
						
							|  |  |  |         the path is a list of strings or None. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 18:00:32 -08:00
										 |  |  |         This method is deprecated since Python 3.4 in favor of | 
					
						
							|  |  |  |         finder.find_spec(). If find_spec() exists then backwards-compatible | 
					
						
							|  |  |  |         functionality is provided for this method. | 
					
						
							| 
									
										
										
										
											2014-01-06 20:49:04 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-02 21:26:03 +10:00
										 |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2017-02-15 18:00:32 -08:00
										 |  |  |         warnings.warn("MetaPathFinder.find_module() is deprecated since Python " | 
					
						
							| 
									
										
										
										
											2021-04-06 08:56:57 -07:00
										 |  |  |                       "3.4 in favor of MetaPathFinder.find_spec() and is " | 
					
						
							|  |  |  |                       "slated for removal in Python 3.12", | 
					
						
							| 
									
										
										
										
											2017-02-15 18:00:32 -08:00
										 |  |  |                       DeprecationWarning, | 
					
						
							|  |  |  |                       stacklevel=2) | 
					
						
							| 
									
										
										
										
											2014-01-07 15:52:42 -05:00
										 |  |  |         if not hasattr(self, 'find_spec'): | 
					
						
							|  |  |  |             return None | 
					
						
							|  |  |  |         found = self.find_spec(fullname, path) | 
					
						
							|  |  |  |         return found.loader if found is not None else None | 
					
						
							| 
									
										
										
										
											2012-07-29 16:36:17 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-10 12:21:12 -04:00
										 |  |  |     def invalidate_caches(self): | 
					
						
							|  |  |  |         """An optional method for clearing the finder's cache, if any.
 | 
					
						
							|  |  |  |         This method is used by importlib.invalidate_caches(). | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-02 21:26:03 +10:00
										 |  |  | _register(MetaPathFinder, machinery.BuiltinImporter, machinery.FrozenImporter, | 
					
						
							| 
									
										
										
										
											2012-08-02 21:45:24 +10:00
										 |  |  |           machinery.PathFinder, machinery.WindowsRegistryFinder) | 
					
						
							| 
									
										
										
										
											2009-03-09 03:35:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-06 08:56:57 -07:00
										 |  |  | class PathEntryFinder(metaclass=abc.ABCMeta): | 
					
						
							| 
									
										
										
										
											2012-08-02 21:26:03 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  |     """Abstract base class for path entry finders used by PathFinder.""" | 
					
						
							| 
									
										
										
										
											2009-03-09 03:35:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-22 09:05:39 -07:00
										 |  |  |     # We don't define find_spec() here since that would break | 
					
						
							|  |  |  |     # hasattr checks we do to support backward compatibility. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-29 16:36:17 -04:00
										 |  |  |     def find_loader(self, fullname): | 
					
						
							| 
									
										
										
										
											2013-11-22 09:05:39 -07:00
										 |  |  |         """Return (loader, namespace portion) for the path entry.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         The fullname is a str.  The namespace portion is a sequence of | 
					
						
							|  |  |  |         path entries contributing to part of a namespace package. The | 
					
						
							|  |  |  |         sequence may be empty.  If loader is not None, the portion will | 
					
						
							|  |  |  |         be ignored. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         The portion will be discarded if another path entry finder | 
					
						
							|  |  |  |         locates the module as a normal module or package. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-15 18:00:32 -08:00
										 |  |  |         This method is deprecated since Python 3.4 in favor of | 
					
						
							|  |  |  |         finder.find_spec(). If find_spec() is provided than backwards-compatible | 
					
						
							|  |  |  |         functionality is provided. | 
					
						
							| 
									
										
										
										
											2012-07-29 16:36:17 -04:00
										 |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2017-02-15 18:00:32 -08:00
										 |  |  |         warnings.warn("PathEntryFinder.find_loader() is deprecated since Python " | 
					
						
							|  |  |  |                       "3.4 in favor of PathEntryFinder.find_spec() " | 
					
						
							|  |  |  |                       "(available since 3.4)", | 
					
						
							|  |  |  |                       DeprecationWarning, | 
					
						
							|  |  |  |                       stacklevel=2) | 
					
						
							| 
									
										
										
										
											2014-01-07 15:52:42 -05:00
										 |  |  |         if not hasattr(self, 'find_spec'): | 
					
						
							|  |  |  |             return None, [] | 
					
						
							|  |  |  |         found = self.find_spec(fullname) | 
					
						
							|  |  |  |         if found is not None: | 
					
						
							|  |  |  |             if not found.submodule_search_locations: | 
					
						
							|  |  |  |                 portions = [] | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 portions = found.submodule_search_locations | 
					
						
							|  |  |  |             return found.loader, portions | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             return None, [] | 
					
						
							| 
									
										
										
										
											2012-07-29 16:36:17 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-02 19:15:18 -06:00
										 |  |  |     find_module = _bootstrap_external._find_module_shim | 
					
						
							| 
									
										
										
										
											2012-08-10 12:21:12 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def invalidate_caches(self): | 
					
						
							|  |  |  |         """An optional method for clearing the finder's cache, if any.
 | 
					
						
							|  |  |  |         This method is used by PathFinder.invalidate_caches(). | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-02 21:26:03 +10:00
										 |  |  | _register(PathEntryFinder, machinery.FileFinder) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-09 03:35:50 +00:00
										 |  |  | class ResourceLoader(Loader): | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-15 00:53:05 +00:00
										 |  |  |     """Abstract base class for loaders which can return data from their
 | 
					
						
							|  |  |  |     back-end storage. | 
					
						
							| 
									
										
										
										
											2009-03-09 03:35:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     This ABC represents one of the optional protocols specified by PEP 302. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abc.abstractmethod | 
					
						
							| 
									
										
										
										
											2011-01-13 02:31:25 +00:00
										 |  |  |     def get_data(self, path): | 
					
						
							| 
									
										
										
										
											2009-03-15 00:53:05 +00:00
										 |  |  |         """Abstract method which when implemented should return the bytes for
 | 
					
						
							| 
									
										
										
										
											2011-01-13 19:08:04 +00:00
										 |  |  |         the specified path.  The path must be a str."""
 | 
					
						
							| 
									
										
										
										
											2017-04-16 10:46:38 +03:00
										 |  |  |         raise OSError | 
					
						
							| 
									
										
										
										
											2009-03-09 03:35:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class InspectLoader(Loader): | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-15 00:53:05 +00:00
										 |  |  |     """Abstract base class for loaders which support inspection about the
 | 
					
						
							|  |  |  |     modules they can load. | 
					
						
							| 
									
										
										
										
											2009-03-09 03:35:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     This ABC represents one of the optional protocols specified by PEP 302. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-13 02:31:25 +00:00
										 |  |  |     def is_package(self, fullname): | 
					
						
							| 
									
										
										
										
											2013-11-22 09:05:39 -07:00
										 |  |  |         """Optional method which when implemented should return whether the
 | 
					
						
							| 
									
										
										
										
											2013-04-09 16:59:39 -04:00
										 |  |  |         module is a package.  The fullname is a str.  Returns a bool. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-22 09:05:39 -07:00
										 |  |  |         Raises ImportError if the module cannot be found. | 
					
						
							| 
									
										
										
										
											2013-04-09 16:59:39 -04:00
										 |  |  |         """
 | 
					
						
							|  |  |  |         raise ImportError | 
					
						
							| 
									
										
										
										
											2009-03-09 03:35:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-13 02:31:25 +00:00
										 |  |  |     def get_code(self, fullname): | 
					
						
							| 
									
										
										
										
											2013-05-27 21:11:04 -04:00
										 |  |  |         """Method which returns the code object for the module.
 | 
					
						
							| 
									
										
										
										
											2013-04-09 16:59:39 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-27 21:11:04 -04:00
										 |  |  |         The fullname is a str.  Returns a types.CodeType if possible, else | 
					
						
							|  |  |  |         returns None if a code object does not make sense | 
					
						
							|  |  |  |         (e.g. built-in module). Raises ImportError if the module cannot be | 
					
						
							|  |  |  |         found. | 
					
						
							| 
									
										
										
										
											2013-04-09 16:59:39 -04:00
										 |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2013-05-27 21:11:04 -04:00
										 |  |  |         source = self.get_source(fullname) | 
					
						
							|  |  |  |         if source is None: | 
					
						
							|  |  |  |             return None | 
					
						
							|  |  |  |         return self.source_to_code(source) | 
					
						
							| 
									
										
										
										
											2009-03-09 03:35:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     @abc.abstractmethod | 
					
						
							| 
									
										
										
										
											2011-01-13 02:31:25 +00:00
										 |  |  |     def get_source(self, fullname): | 
					
						
							| 
									
										
										
										
											2009-03-15 00:53:05 +00:00
										 |  |  |         """Abstract method which should return the source code for the
 | 
					
						
							| 
									
										
										
										
											2013-04-09 16:59:39 -04:00
										 |  |  |         module.  The fullname is a str.  Returns a str. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Raises ImportError if the module cannot be found. | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         raise ImportError | 
					
						
							| 
									
										
										
										
											2009-03-09 03:35:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-09 12:28:22 -04:00
										 |  |  |     @staticmethod | 
					
						
							|  |  |  |     def source_to_code(data, path='<string>'): | 
					
						
							| 
									
										
										
										
											2013-05-26 16:45:10 -04:00
										 |  |  |         """Compile 'data' into a code object.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         The 'data' argument can be anything that compile() can handle. The'path' | 
					
						
							|  |  |  |         argument should be where the data was retrieved (when applicable)."""
 | 
					
						
							|  |  |  |         return compile(data, path, 'exec', dont_inherit=True) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-02 19:15:18 -06:00
										 |  |  |     exec_module = _bootstrap_external._LoaderBasics.exec_module | 
					
						
							|  |  |  |     load_module = _bootstrap_external._LoaderBasics.load_module | 
					
						
							| 
									
										
										
										
											2013-05-31 18:56:47 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-20 14:05:29 -07:00
										 |  |  | _register(InspectLoader, machinery.BuiltinImporter, machinery.FrozenImporter, machinery.NamespaceLoader) | 
					
						
							| 
									
										
										
										
											2009-03-15 01:41:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-09 03:35:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-20 04:23:48 +00:00
										 |  |  | class ExecutionLoader(InspectLoader): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     """Abstract base class for loaders that wish to support the execution of
 | 
					
						
							|  |  |  |     modules as scripts. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     This ABC represents one of the optional protocols specified in PEP 302. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abc.abstractmethod | 
					
						
							| 
									
										
										
										
											2011-01-13 02:31:25 +00:00
										 |  |  |     def get_filename(self, fullname): | 
					
						
							| 
									
										
										
										
											2009-07-20 04:23:48 +00:00
										 |  |  |         """Abstract method which should return the value that __file__ is to be
 | 
					
						
							| 
									
										
										
										
											2013-04-09 16:59:39 -04:00
										 |  |  |         set to. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Raises ImportError if the module cannot be found. | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         raise ImportError | 
					
						
							| 
									
										
										
										
											2009-07-20 04:23:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-27 21:11:04 -04:00
										 |  |  |     def get_code(self, fullname): | 
					
						
							|  |  |  |         """Method to return the code object for fullname.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Should return None if not applicable (e.g. built-in module). | 
					
						
							|  |  |  |         Raise ImportError if the module cannot be found. | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         source = self.get_source(fullname) | 
					
						
							|  |  |  |         if source is None: | 
					
						
							|  |  |  |             return None | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             path = self.get_filename(fullname) | 
					
						
							|  |  |  |         except ImportError: | 
					
						
							|  |  |  |             return self.source_to_code(source) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             return self.source_to_code(source, path) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-04 20:28:52 -06:00
										 |  |  | _register(ExecutionLoader, machinery.ExtensionFileLoader) | 
					
						
							| 
									
										
										
										
											2013-10-03 12:08:55 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-20 04:23:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-02 19:15:18 -06:00
										 |  |  | class FileLoader(_bootstrap_external.FileLoader, ResourceLoader, ExecutionLoader): | 
					
						
							| 
									
										
										
										
											2012-04-22 19:58:33 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     """Abstract base class partially implementing the ResourceLoader and
 | 
					
						
							|  |  |  |     ExecutionLoader ABCs."""
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | _register(FileLoader, machinery.SourceFileLoader, | 
					
						
							| 
									
										
										
										
											2012-04-25 02:31:37 +02:00
										 |  |  |             machinery.SourcelessFileLoader) | 
					
						
							| 
									
										
										
										
											2012-04-22 19:58:33 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-02 19:15:18 -06:00
										 |  |  | class SourceLoader(_bootstrap_external.SourceLoader, ResourceLoader, ExecutionLoader): | 
					
						
							| 
									
										
										
										
											2009-03-09 03:35:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-27 23:57:46 +00:00
										 |  |  |     """Abstract base class for loading source code (and optionally any
 | 
					
						
							|  |  |  |     corresponding bytecode). | 
					
						
							| 
									
										
										
										
											2009-03-09 03:35:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-27 23:57:46 +00:00
										 |  |  |     To support loading from source code, the abstractmethods inherited from | 
					
						
							|  |  |  |     ResourceLoader and ExecutionLoader need to be implemented. To also support | 
					
						
							|  |  |  |     loading from bytecode, the optional methods specified directly by this ABC | 
					
						
							|  |  |  |     is required. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Inherited abstractmethods not implemented in this ABC: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         * ResourceLoader.get_data | 
					
						
							|  |  |  |         * ExecutionLoader.get_filename | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-13 02:31:25 +00:00
										 |  |  |     def path_mtime(self, path): | 
					
						
							| 
									
										
										
										
											2011-01-13 19:08:04 +00:00
										 |  |  |         """Return the (int) modification time for the path (str).""" | 
					
						
							| 
									
										
										
										
											2012-01-13 18:52:16 +01:00
										 |  |  |         if self.path_stats.__func__ is SourceLoader.path_stats: | 
					
						
							| 
									
										
										
										
											2017-04-16 10:46:38 +03:00
										 |  |  |             raise OSError | 
					
						
							| 
									
										
										
										
											2012-01-13 18:52:16 +01:00
										 |  |  |         return int(self.path_stats(path)['mtime']) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def path_stats(self, path): | 
					
						
							|  |  |  |         """Return a metadata dict for the source pointed to by the path (str).
 | 
					
						
							|  |  |  |         Possible keys: | 
					
						
							|  |  |  |         - 'mtime' (mandatory) is the numeric timestamp of last source | 
					
						
							|  |  |  |           code modification; | 
					
						
							|  |  |  |         - 'size' (optional) is the size in bytes of the source code. | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         if self.path_mtime.__func__ is SourceLoader.path_mtime: | 
					
						
							| 
									
										
										
										
											2017-04-16 10:46:38 +03:00
										 |  |  |             raise OSError | 
					
						
							| 
									
										
										
										
											2012-01-13 18:52:16 +01:00
										 |  |  |         return {'mtime': self.path_mtime(path)} | 
					
						
							| 
									
										
										
										
											2010-08-22 20:38:47 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-13 02:31:25 +00:00
										 |  |  |     def set_data(self, path, data): | 
					
						
							| 
									
										
										
										
											2010-08-22 20:38:47 +00:00
										 |  |  |         """Write the bytes to the path (if possible).
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-13 19:08:04 +00:00
										 |  |  |         Accepts a str path and data as bytes. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-22 20:38:47 +00:00
										 |  |  |         Any needed intermediary directories are to be created. If for some | 
					
						
							|  |  |  |         reason the file cannot be written because of permissions, fail | 
					
						
							|  |  |  |         silently. | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-22 19:58:33 -04:00
										 |  |  | _register(SourceLoader, machinery.SourceFileLoader) |