| 2436 | |
| 2437 | #: Not a plugin, but part of the plugin API. TODO: Find a better place. |
| 2438 | class _ImportRedirect(object): |
| 2439 | def __init__(self, name, impmask): |
| 2440 | """ Create a virtual package that redirects imports (see PEP 302). """ |
| 2441 | self.name = name |
| 2442 | self.impmask = impmask |
| 2443 | self.module = sys.modules.setdefault(name, new_module(name)) |
| 2444 | self.module.__dict__.update({ |
| 2445 | '__file__': __file__, |
| 2446 | '__path__': [], |
| 2447 | '__all__': [], |
| 2448 | '__loader__': self |
| 2449 | }) |
| 2450 | sys.meta_path.append(self) |
| 2451 | |
| 2452 | def find_spec(self, fullname, path, target=None): |
| 2453 | if '.' not in fullname: return |
| 2454 | if fullname.rsplit('.', 1)[0] != self.name: return |
| 2455 | from importlib.util import spec_from_loader |
| 2456 | return spec_from_loader(fullname, self) |
| 2457 | |
| 2458 | def find_module(self, fullname, path=None): |
| 2459 | if '.' not in fullname: return |
| 2460 | if fullname.rsplit('.', 1)[0] != self.name: return |
| 2461 | return self |
| 2462 | |
| 2463 | def load_module(self, fullname): |
| 2464 | if fullname in sys.modules: return sys.modules[fullname] |
| 2465 | modname = fullname.rsplit('.', 1)[1] |
| 2466 | realname = self.impmask % modname |
| 2467 | __import__(realname) |
| 2468 | module = sys.modules[fullname] = sys.modules[realname] |
| 2469 | setattr(self.module, modname, module) |
| 2470 | module.__loader__ = self |
| 2471 | return module |
| 2472 | |
| 2473 | ############################################################################### |
| 2474 | # Common Utilities ############################################################# |
no outgoing calls
no test coverage detected
searching dependent graphs…