1*cda5da8dSAndroid Build Coastguard Worker"""Abstract base classes related to import.""" 2*cda5da8dSAndroid Build Coastguard Workerfrom . import _bootstrap_external 3*cda5da8dSAndroid Build Coastguard Workerfrom . import machinery 4*cda5da8dSAndroid Build Coastguard Workertry: 5*cda5da8dSAndroid Build Coastguard Worker import _frozen_importlib 6*cda5da8dSAndroid Build Coastguard Workerexcept ImportError as exc: 7*cda5da8dSAndroid Build Coastguard Worker if exc.name != '_frozen_importlib': 8*cda5da8dSAndroid Build Coastguard Worker raise 9*cda5da8dSAndroid Build Coastguard Worker _frozen_importlib = None 10*cda5da8dSAndroid Build Coastguard Workertry: 11*cda5da8dSAndroid Build Coastguard Worker import _frozen_importlib_external 12*cda5da8dSAndroid Build Coastguard Workerexcept ImportError: 13*cda5da8dSAndroid Build Coastguard Worker _frozen_importlib_external = _bootstrap_external 14*cda5da8dSAndroid Build Coastguard Workerfrom ._abc import Loader 15*cda5da8dSAndroid Build Coastguard Workerimport abc 16*cda5da8dSAndroid Build Coastguard Workerimport warnings 17*cda5da8dSAndroid Build Coastguard Worker 18*cda5da8dSAndroid Build Coastguard Worker# for compatibility with Python 3.10 19*cda5da8dSAndroid Build Coastguard Workerfrom .resources.abc import ResourceReader, Traversable, TraversableResources 20*cda5da8dSAndroid Build Coastguard Worker 21*cda5da8dSAndroid Build Coastguard Worker 22*cda5da8dSAndroid Build Coastguard Worker__all__ = [ 23*cda5da8dSAndroid Build Coastguard Worker 'Loader', 'Finder', 'MetaPathFinder', 'PathEntryFinder', 24*cda5da8dSAndroid Build Coastguard Worker 'ResourceLoader', 'InspectLoader', 'ExecutionLoader', 25*cda5da8dSAndroid Build Coastguard Worker 'FileLoader', 'SourceLoader', 26*cda5da8dSAndroid Build Coastguard Worker 27*cda5da8dSAndroid Build Coastguard Worker # for compatibility with Python 3.10 28*cda5da8dSAndroid Build Coastguard Worker 'ResourceReader', 'Traversable', 'TraversableResources', 29*cda5da8dSAndroid Build Coastguard Worker] 30*cda5da8dSAndroid Build Coastguard Worker 31*cda5da8dSAndroid Build Coastguard Worker 32*cda5da8dSAndroid Build Coastguard Workerdef _register(abstract_cls, *classes): 33*cda5da8dSAndroid Build Coastguard Worker for cls in classes: 34*cda5da8dSAndroid Build Coastguard Worker abstract_cls.register(cls) 35*cda5da8dSAndroid Build Coastguard Worker if _frozen_importlib is not None: 36*cda5da8dSAndroid Build Coastguard Worker try: 37*cda5da8dSAndroid Build Coastguard Worker frozen_cls = getattr(_frozen_importlib, cls.__name__) 38*cda5da8dSAndroid Build Coastguard Worker except AttributeError: 39*cda5da8dSAndroid Build Coastguard Worker frozen_cls = getattr(_frozen_importlib_external, cls.__name__) 40*cda5da8dSAndroid Build Coastguard Worker abstract_cls.register(frozen_cls) 41*cda5da8dSAndroid Build Coastguard Worker 42*cda5da8dSAndroid Build Coastguard Worker 43*cda5da8dSAndroid Build Coastguard Workerclass Finder(metaclass=abc.ABCMeta): 44*cda5da8dSAndroid Build Coastguard Worker 45*cda5da8dSAndroid Build Coastguard Worker """Legacy abstract base class for import finders. 46*cda5da8dSAndroid Build Coastguard Worker 47*cda5da8dSAndroid Build Coastguard Worker It may be subclassed for compatibility with legacy third party 48*cda5da8dSAndroid Build Coastguard Worker reimplementations of the import system. Otherwise, finder 49*cda5da8dSAndroid Build Coastguard Worker implementations should derive from the more specific MetaPathFinder 50*cda5da8dSAndroid Build Coastguard Worker or PathEntryFinder ABCs. 51*cda5da8dSAndroid Build Coastguard Worker 52*cda5da8dSAndroid Build Coastguard Worker Deprecated since Python 3.3 53*cda5da8dSAndroid Build Coastguard Worker """ 54*cda5da8dSAndroid Build Coastguard Worker 55*cda5da8dSAndroid Build Coastguard Worker def __init__(self): 56*cda5da8dSAndroid Build Coastguard Worker warnings.warn("the Finder ABC is deprecated and " 57*cda5da8dSAndroid Build Coastguard Worker "slated for removal in Python 3.12; use MetaPathFinder " 58*cda5da8dSAndroid Build Coastguard Worker "or PathEntryFinder instead", 59*cda5da8dSAndroid Build Coastguard Worker DeprecationWarning) 60*cda5da8dSAndroid Build Coastguard Worker 61*cda5da8dSAndroid Build Coastguard Worker @abc.abstractmethod 62*cda5da8dSAndroid Build Coastguard Worker def find_module(self, fullname, path=None): 63*cda5da8dSAndroid Build Coastguard Worker """An abstract method that should find a module. 64*cda5da8dSAndroid Build Coastguard Worker The fullname is a str and the optional path is a str or None. 65*cda5da8dSAndroid Build Coastguard Worker Returns a Loader object or None. 66*cda5da8dSAndroid Build Coastguard Worker """ 67*cda5da8dSAndroid Build Coastguard Worker warnings.warn("importlib.abc.Finder along with its find_module() " 68*cda5da8dSAndroid Build Coastguard Worker "method are deprecated and " 69*cda5da8dSAndroid Build Coastguard Worker "slated for removal in Python 3.12; use " 70*cda5da8dSAndroid Build Coastguard Worker "MetaPathFinder.find_spec() or " 71*cda5da8dSAndroid Build Coastguard Worker "PathEntryFinder.find_spec() instead", 72*cda5da8dSAndroid Build Coastguard Worker DeprecationWarning) 73*cda5da8dSAndroid Build Coastguard Worker 74*cda5da8dSAndroid Build Coastguard Worker 75*cda5da8dSAndroid Build Coastguard Workerclass MetaPathFinder(metaclass=abc.ABCMeta): 76*cda5da8dSAndroid Build Coastguard Worker 77*cda5da8dSAndroid Build Coastguard Worker """Abstract base class for import finders on sys.meta_path.""" 78*cda5da8dSAndroid Build Coastguard Worker 79*cda5da8dSAndroid Build Coastguard Worker # We don't define find_spec() here since that would break 80*cda5da8dSAndroid Build Coastguard Worker # hasattr checks we do to support backward compatibility. 81*cda5da8dSAndroid Build Coastguard Worker 82*cda5da8dSAndroid Build Coastguard Worker def find_module(self, fullname, path): 83*cda5da8dSAndroid Build Coastguard Worker """Return a loader for the module. 84*cda5da8dSAndroid Build Coastguard Worker 85*cda5da8dSAndroid Build Coastguard Worker If no module is found, return None. The fullname is a str and 86*cda5da8dSAndroid Build Coastguard Worker the path is a list of strings or None. 87*cda5da8dSAndroid Build Coastguard Worker 88*cda5da8dSAndroid Build Coastguard Worker This method is deprecated since Python 3.4 in favor of 89*cda5da8dSAndroid Build Coastguard Worker finder.find_spec(). If find_spec() exists then backwards-compatible 90*cda5da8dSAndroid Build Coastguard Worker functionality is provided for this method. 91*cda5da8dSAndroid Build Coastguard Worker 92*cda5da8dSAndroid Build Coastguard Worker """ 93*cda5da8dSAndroid Build Coastguard Worker warnings.warn("MetaPathFinder.find_module() is deprecated since Python " 94*cda5da8dSAndroid Build Coastguard Worker "3.4 in favor of MetaPathFinder.find_spec() and is " 95*cda5da8dSAndroid Build Coastguard Worker "slated for removal in Python 3.12", 96*cda5da8dSAndroid Build Coastguard Worker DeprecationWarning, 97*cda5da8dSAndroid Build Coastguard Worker stacklevel=2) 98*cda5da8dSAndroid Build Coastguard Worker if not hasattr(self, 'find_spec'): 99*cda5da8dSAndroid Build Coastguard Worker return None 100*cda5da8dSAndroid Build Coastguard Worker found = self.find_spec(fullname, path) 101*cda5da8dSAndroid Build Coastguard Worker return found.loader if found is not None else None 102*cda5da8dSAndroid Build Coastguard Worker 103*cda5da8dSAndroid Build Coastguard Worker def invalidate_caches(self): 104*cda5da8dSAndroid Build Coastguard Worker """An optional method for clearing the finder's cache, if any. 105*cda5da8dSAndroid Build Coastguard Worker This method is used by importlib.invalidate_caches(). 106*cda5da8dSAndroid Build Coastguard Worker """ 107*cda5da8dSAndroid Build Coastguard Worker 108*cda5da8dSAndroid Build Coastguard Worker_register(MetaPathFinder, machinery.BuiltinImporter, machinery.FrozenImporter, 109*cda5da8dSAndroid Build Coastguard Worker machinery.PathFinder, machinery.WindowsRegistryFinder) 110*cda5da8dSAndroid Build Coastguard Worker 111*cda5da8dSAndroid Build Coastguard Worker 112*cda5da8dSAndroid Build Coastguard Workerclass PathEntryFinder(metaclass=abc.ABCMeta): 113*cda5da8dSAndroid Build Coastguard Worker 114*cda5da8dSAndroid Build Coastguard Worker """Abstract base class for path entry finders used by PathFinder.""" 115*cda5da8dSAndroid Build Coastguard Worker 116*cda5da8dSAndroid Build Coastguard Worker # We don't define find_spec() here since that would break 117*cda5da8dSAndroid Build Coastguard Worker # hasattr checks we do to support backward compatibility. 118*cda5da8dSAndroid Build Coastguard Worker 119*cda5da8dSAndroid Build Coastguard Worker def find_loader(self, fullname): 120*cda5da8dSAndroid Build Coastguard Worker """Return (loader, namespace portion) for the path entry. 121*cda5da8dSAndroid Build Coastguard Worker 122*cda5da8dSAndroid Build Coastguard Worker The fullname is a str. The namespace portion is a sequence of 123*cda5da8dSAndroid Build Coastguard Worker path entries contributing to part of a namespace package. The 124*cda5da8dSAndroid Build Coastguard Worker sequence may be empty. If loader is not None, the portion will 125*cda5da8dSAndroid Build Coastguard Worker be ignored. 126*cda5da8dSAndroid Build Coastguard Worker 127*cda5da8dSAndroid Build Coastguard Worker The portion will be discarded if another path entry finder 128*cda5da8dSAndroid Build Coastguard Worker locates the module as a normal module or package. 129*cda5da8dSAndroid Build Coastguard Worker 130*cda5da8dSAndroid Build Coastguard Worker This method is deprecated since Python 3.4 in favor of 131*cda5da8dSAndroid Build Coastguard Worker finder.find_spec(). If find_spec() is provided than backwards-compatible 132*cda5da8dSAndroid Build Coastguard Worker functionality is provided. 133*cda5da8dSAndroid Build Coastguard Worker """ 134*cda5da8dSAndroid Build Coastguard Worker warnings.warn("PathEntryFinder.find_loader() is deprecated since Python " 135*cda5da8dSAndroid Build Coastguard Worker "3.4 in favor of PathEntryFinder.find_spec() " 136*cda5da8dSAndroid Build Coastguard Worker "(available since 3.4)", 137*cda5da8dSAndroid Build Coastguard Worker DeprecationWarning, 138*cda5da8dSAndroid Build Coastguard Worker stacklevel=2) 139*cda5da8dSAndroid Build Coastguard Worker if not hasattr(self, 'find_spec'): 140*cda5da8dSAndroid Build Coastguard Worker return None, [] 141*cda5da8dSAndroid Build Coastguard Worker found = self.find_spec(fullname) 142*cda5da8dSAndroid Build Coastguard Worker if found is not None: 143*cda5da8dSAndroid Build Coastguard Worker if not found.submodule_search_locations: 144*cda5da8dSAndroid Build Coastguard Worker portions = [] 145*cda5da8dSAndroid Build Coastguard Worker else: 146*cda5da8dSAndroid Build Coastguard Worker portions = found.submodule_search_locations 147*cda5da8dSAndroid Build Coastguard Worker return found.loader, portions 148*cda5da8dSAndroid Build Coastguard Worker else: 149*cda5da8dSAndroid Build Coastguard Worker return None, [] 150*cda5da8dSAndroid Build Coastguard Worker 151*cda5da8dSAndroid Build Coastguard Worker find_module = _bootstrap_external._find_module_shim 152*cda5da8dSAndroid Build Coastguard Worker 153*cda5da8dSAndroid Build Coastguard Worker def invalidate_caches(self): 154*cda5da8dSAndroid Build Coastguard Worker """An optional method for clearing the finder's cache, if any. 155*cda5da8dSAndroid Build Coastguard Worker This method is used by PathFinder.invalidate_caches(). 156*cda5da8dSAndroid Build Coastguard Worker """ 157*cda5da8dSAndroid Build Coastguard Worker 158*cda5da8dSAndroid Build Coastguard Worker_register(PathEntryFinder, machinery.FileFinder) 159*cda5da8dSAndroid Build Coastguard Worker 160*cda5da8dSAndroid Build Coastguard Worker 161*cda5da8dSAndroid Build Coastguard Workerclass ResourceLoader(Loader): 162*cda5da8dSAndroid Build Coastguard Worker 163*cda5da8dSAndroid Build Coastguard Worker """Abstract base class for loaders which can return data from their 164*cda5da8dSAndroid Build Coastguard Worker back-end storage. 165*cda5da8dSAndroid Build Coastguard Worker 166*cda5da8dSAndroid Build Coastguard Worker This ABC represents one of the optional protocols specified by PEP 302. 167*cda5da8dSAndroid Build Coastguard Worker 168*cda5da8dSAndroid Build Coastguard Worker """ 169*cda5da8dSAndroid Build Coastguard Worker 170*cda5da8dSAndroid Build Coastguard Worker @abc.abstractmethod 171*cda5da8dSAndroid Build Coastguard Worker def get_data(self, path): 172*cda5da8dSAndroid Build Coastguard Worker """Abstract method which when implemented should return the bytes for 173*cda5da8dSAndroid Build Coastguard Worker the specified path. The path must be a str.""" 174*cda5da8dSAndroid Build Coastguard Worker raise OSError 175*cda5da8dSAndroid Build Coastguard Worker 176*cda5da8dSAndroid Build Coastguard Worker 177*cda5da8dSAndroid Build Coastguard Workerclass InspectLoader(Loader): 178*cda5da8dSAndroid Build Coastguard Worker 179*cda5da8dSAndroid Build Coastguard Worker """Abstract base class for loaders which support inspection about the 180*cda5da8dSAndroid Build Coastguard Worker modules they can load. 181*cda5da8dSAndroid Build Coastguard Worker 182*cda5da8dSAndroid Build Coastguard Worker This ABC represents one of the optional protocols specified by PEP 302. 183*cda5da8dSAndroid Build Coastguard Worker 184*cda5da8dSAndroid Build Coastguard Worker """ 185*cda5da8dSAndroid Build Coastguard Worker 186*cda5da8dSAndroid Build Coastguard Worker def is_package(self, fullname): 187*cda5da8dSAndroid Build Coastguard Worker """Optional method which when implemented should return whether the 188*cda5da8dSAndroid Build Coastguard Worker module is a package. The fullname is a str. Returns a bool. 189*cda5da8dSAndroid Build Coastguard Worker 190*cda5da8dSAndroid Build Coastguard Worker Raises ImportError if the module cannot be found. 191*cda5da8dSAndroid Build Coastguard Worker """ 192*cda5da8dSAndroid Build Coastguard Worker raise ImportError 193*cda5da8dSAndroid Build Coastguard Worker 194*cda5da8dSAndroid Build Coastguard Worker def get_code(self, fullname): 195*cda5da8dSAndroid Build Coastguard Worker """Method which returns the code object for the module. 196*cda5da8dSAndroid Build Coastguard Worker 197*cda5da8dSAndroid Build Coastguard Worker The fullname is a str. Returns a types.CodeType if possible, else 198*cda5da8dSAndroid Build Coastguard Worker returns None if a code object does not make sense 199*cda5da8dSAndroid Build Coastguard Worker (e.g. built-in module). Raises ImportError if the module cannot be 200*cda5da8dSAndroid Build Coastguard Worker found. 201*cda5da8dSAndroid Build Coastguard Worker """ 202*cda5da8dSAndroid Build Coastguard Worker source = self.get_source(fullname) 203*cda5da8dSAndroid Build Coastguard Worker if source is None: 204*cda5da8dSAndroid Build Coastguard Worker return None 205*cda5da8dSAndroid Build Coastguard Worker return self.source_to_code(source) 206*cda5da8dSAndroid Build Coastguard Worker 207*cda5da8dSAndroid Build Coastguard Worker @abc.abstractmethod 208*cda5da8dSAndroid Build Coastguard Worker def get_source(self, fullname): 209*cda5da8dSAndroid Build Coastguard Worker """Abstract method which should return the source code for the 210*cda5da8dSAndroid Build Coastguard Worker module. The fullname is a str. Returns a str. 211*cda5da8dSAndroid Build Coastguard Worker 212*cda5da8dSAndroid Build Coastguard Worker Raises ImportError if the module cannot be found. 213*cda5da8dSAndroid Build Coastguard Worker """ 214*cda5da8dSAndroid Build Coastguard Worker raise ImportError 215*cda5da8dSAndroid Build Coastguard Worker 216*cda5da8dSAndroid Build Coastguard Worker @staticmethod 217*cda5da8dSAndroid Build Coastguard Worker def source_to_code(data, path='<string>'): 218*cda5da8dSAndroid Build Coastguard Worker """Compile 'data' into a code object. 219*cda5da8dSAndroid Build Coastguard Worker 220*cda5da8dSAndroid Build Coastguard Worker The 'data' argument can be anything that compile() can handle. The'path' 221*cda5da8dSAndroid Build Coastguard Worker argument should be where the data was retrieved (when applicable).""" 222*cda5da8dSAndroid Build Coastguard Worker return compile(data, path, 'exec', dont_inherit=True) 223*cda5da8dSAndroid Build Coastguard Worker 224*cda5da8dSAndroid Build Coastguard Worker exec_module = _bootstrap_external._LoaderBasics.exec_module 225*cda5da8dSAndroid Build Coastguard Worker load_module = _bootstrap_external._LoaderBasics.load_module 226*cda5da8dSAndroid Build Coastguard Worker 227*cda5da8dSAndroid Build Coastguard Worker_register(InspectLoader, machinery.BuiltinImporter, machinery.FrozenImporter, machinery.NamespaceLoader) 228*cda5da8dSAndroid Build Coastguard Worker 229*cda5da8dSAndroid Build Coastguard Worker 230*cda5da8dSAndroid Build Coastguard Workerclass ExecutionLoader(InspectLoader): 231*cda5da8dSAndroid Build Coastguard Worker 232*cda5da8dSAndroid Build Coastguard Worker """Abstract base class for loaders that wish to support the execution of 233*cda5da8dSAndroid Build Coastguard Worker modules as scripts. 234*cda5da8dSAndroid Build Coastguard Worker 235*cda5da8dSAndroid Build Coastguard Worker This ABC represents one of the optional protocols specified in PEP 302. 236*cda5da8dSAndroid Build Coastguard Worker 237*cda5da8dSAndroid Build Coastguard Worker """ 238*cda5da8dSAndroid Build Coastguard Worker 239*cda5da8dSAndroid Build Coastguard Worker @abc.abstractmethod 240*cda5da8dSAndroid Build Coastguard Worker def get_filename(self, fullname): 241*cda5da8dSAndroid Build Coastguard Worker """Abstract method which should return the value that __file__ is to be 242*cda5da8dSAndroid Build Coastguard Worker set to. 243*cda5da8dSAndroid Build Coastguard Worker 244*cda5da8dSAndroid Build Coastguard Worker Raises ImportError if the module cannot be found. 245*cda5da8dSAndroid Build Coastguard Worker """ 246*cda5da8dSAndroid Build Coastguard Worker raise ImportError 247*cda5da8dSAndroid Build Coastguard Worker 248*cda5da8dSAndroid Build Coastguard Worker def get_code(self, fullname): 249*cda5da8dSAndroid Build Coastguard Worker """Method to return the code object for fullname. 250*cda5da8dSAndroid Build Coastguard Worker 251*cda5da8dSAndroid Build Coastguard Worker Should return None if not applicable (e.g. built-in module). 252*cda5da8dSAndroid Build Coastguard Worker Raise ImportError if the module cannot be found. 253*cda5da8dSAndroid Build Coastguard Worker """ 254*cda5da8dSAndroid Build Coastguard Worker source = self.get_source(fullname) 255*cda5da8dSAndroid Build Coastguard Worker if source is None: 256*cda5da8dSAndroid Build Coastguard Worker return None 257*cda5da8dSAndroid Build Coastguard Worker try: 258*cda5da8dSAndroid Build Coastguard Worker path = self.get_filename(fullname) 259*cda5da8dSAndroid Build Coastguard Worker except ImportError: 260*cda5da8dSAndroid Build Coastguard Worker return self.source_to_code(source) 261*cda5da8dSAndroid Build Coastguard Worker else: 262*cda5da8dSAndroid Build Coastguard Worker return self.source_to_code(source, path) 263*cda5da8dSAndroid Build Coastguard Worker 264*cda5da8dSAndroid Build Coastguard Worker_register(ExecutionLoader, machinery.ExtensionFileLoader) 265*cda5da8dSAndroid Build Coastguard Worker 266*cda5da8dSAndroid Build Coastguard Worker 267*cda5da8dSAndroid Build Coastguard Workerclass FileLoader(_bootstrap_external.FileLoader, ResourceLoader, ExecutionLoader): 268*cda5da8dSAndroid Build Coastguard Worker 269*cda5da8dSAndroid Build Coastguard Worker """Abstract base class partially implementing the ResourceLoader and 270*cda5da8dSAndroid Build Coastguard Worker ExecutionLoader ABCs.""" 271*cda5da8dSAndroid Build Coastguard Worker 272*cda5da8dSAndroid Build Coastguard Worker_register(FileLoader, machinery.SourceFileLoader, 273*cda5da8dSAndroid Build Coastguard Worker machinery.SourcelessFileLoader) 274*cda5da8dSAndroid Build Coastguard Worker 275*cda5da8dSAndroid Build Coastguard Worker 276*cda5da8dSAndroid Build Coastguard Workerclass SourceLoader(_bootstrap_external.SourceLoader, ResourceLoader, ExecutionLoader): 277*cda5da8dSAndroid Build Coastguard Worker 278*cda5da8dSAndroid Build Coastguard Worker """Abstract base class for loading source code (and optionally any 279*cda5da8dSAndroid Build Coastguard Worker corresponding bytecode). 280*cda5da8dSAndroid Build Coastguard Worker 281*cda5da8dSAndroid Build Coastguard Worker To support loading from source code, the abstractmethods inherited from 282*cda5da8dSAndroid Build Coastguard Worker ResourceLoader and ExecutionLoader need to be implemented. To also support 283*cda5da8dSAndroid Build Coastguard Worker loading from bytecode, the optional methods specified directly by this ABC 284*cda5da8dSAndroid Build Coastguard Worker is required. 285*cda5da8dSAndroid Build Coastguard Worker 286*cda5da8dSAndroid Build Coastguard Worker Inherited abstractmethods not implemented in this ABC: 287*cda5da8dSAndroid Build Coastguard Worker 288*cda5da8dSAndroid Build Coastguard Worker * ResourceLoader.get_data 289*cda5da8dSAndroid Build Coastguard Worker * ExecutionLoader.get_filename 290*cda5da8dSAndroid Build Coastguard Worker 291*cda5da8dSAndroid Build Coastguard Worker """ 292*cda5da8dSAndroid Build Coastguard Worker 293*cda5da8dSAndroid Build Coastguard Worker def path_mtime(self, path): 294*cda5da8dSAndroid Build Coastguard Worker """Return the (int) modification time for the path (str).""" 295*cda5da8dSAndroid Build Coastguard Worker if self.path_stats.__func__ is SourceLoader.path_stats: 296*cda5da8dSAndroid Build Coastguard Worker raise OSError 297*cda5da8dSAndroid Build Coastguard Worker return int(self.path_stats(path)['mtime']) 298*cda5da8dSAndroid Build Coastguard Worker 299*cda5da8dSAndroid Build Coastguard Worker def path_stats(self, path): 300*cda5da8dSAndroid Build Coastguard Worker """Return a metadata dict for the source pointed to by the path (str). 301*cda5da8dSAndroid Build Coastguard Worker Possible keys: 302*cda5da8dSAndroid Build Coastguard Worker - 'mtime' (mandatory) is the numeric timestamp of last source 303*cda5da8dSAndroid Build Coastguard Worker code modification; 304*cda5da8dSAndroid Build Coastguard Worker - 'size' (optional) is the size in bytes of the source code. 305*cda5da8dSAndroid Build Coastguard Worker """ 306*cda5da8dSAndroid Build Coastguard Worker if self.path_mtime.__func__ is SourceLoader.path_mtime: 307*cda5da8dSAndroid Build Coastguard Worker raise OSError 308*cda5da8dSAndroid Build Coastguard Worker return {'mtime': self.path_mtime(path)} 309*cda5da8dSAndroid Build Coastguard Worker 310*cda5da8dSAndroid Build Coastguard Worker def set_data(self, path, data): 311*cda5da8dSAndroid Build Coastguard Worker """Write the bytes to the path (if possible). 312*cda5da8dSAndroid Build Coastguard Worker 313*cda5da8dSAndroid Build Coastguard Worker Accepts a str path and data as bytes. 314*cda5da8dSAndroid Build Coastguard Worker 315*cda5da8dSAndroid Build Coastguard Worker Any needed intermediary directories are to be created. If for some 316*cda5da8dSAndroid Build Coastguard Worker reason the file cannot be written because of permissions, fail 317*cda5da8dSAndroid Build Coastguard Worker silently. 318*cda5da8dSAndroid Build Coastguard Worker """ 319*cda5da8dSAndroid Build Coastguard Worker 320*cda5da8dSAndroid Build Coastguard Worker_register(SourceLoader, machinery.SourceFileLoader) 321