| 1524 | |
| 1525 | #: Not a plugin, but part of the plugin API. TODO: Find a better place. |
| 1526 | class _ImportRedirect(object): |
| 1527 | def __init__(self, name, impmask): |
| 1528 | ''' Create a virtual package that redirects imports (see PEP 302). ''' |
| 1529 | self.name = name |
| 1530 | self.impmask = impmask |
| 1531 | self.module = sys.modules.setdefault(name, imp.new_module(name)) |
| 1532 | self.module.__dict__.update({'__file__': __file__, '__path__': [], |
| 1533 | '__all__': [], '__loader__': self}) |
| 1534 | sys.meta_path.append(self) |
| 1535 | |
| 1536 | def find_module(self, fullname, path=None): |
| 1537 | if '.' not in fullname: return |
| 1538 | packname, modname = fullname.rsplit('.', 1) |
| 1539 | if packname != self.name: return |
| 1540 | return self |
| 1541 | |
| 1542 | def load_module(self, fullname): |
| 1543 | if fullname in sys.modules: return sys.modules[fullname] |
| 1544 | packname, modname = fullname.rsplit('.', 1) |
| 1545 | realname = self.impmask % modname |
| 1546 | __import__(realname) |
| 1547 | module = sys.modules[fullname] = sys.modules[realname] |
| 1548 | setattr(self.module, modname, module) |
| 1549 | module.__loader__ = self |
| 1550 | return module |
| 1551 | |
| 1552 | |
| 1553 | |