| 51 | |
| 52 | |
| 53 | class ShimModule(types.ModuleType): |
| 54 | |
| 55 | def __init__(self, *args, **kwargs): |
| 56 | self._mirror = kwargs.pop("mirror") |
| 57 | src = kwargs.pop("src", None) |
| 58 | if src: |
| 59 | kwargs['name'] = src.rsplit('.', 1)[-1] |
| 60 | super(ShimModule, self).__init__(*args, **kwargs) |
| 61 | # add import hook for descendent modules |
| 62 | if src: |
| 63 | sys.meta_path.append( |
| 64 | ShimImporter(src=src, mirror=self._mirror) |
| 65 | ) |
| 66 | |
| 67 | @property |
| 68 | def __path__(self): |
| 69 | return [] |
| 70 | |
| 71 | @property |
| 72 | def __spec__(self): |
| 73 | """Don't produce __spec__ until requested""" |
| 74 | return import_module(self._mirror).__spec__ |
| 75 | |
| 76 | def __dir__(self): |
| 77 | return dir(import_module(self._mirror)) |
| 78 | |
| 79 | @property |
| 80 | def __all__(self): |
| 81 | """Ensure __all__ is always defined""" |
| 82 | mod = import_module(self._mirror) |
| 83 | try: |
| 84 | return mod.__all__ |
| 85 | except AttributeError: |
| 86 | return [name for name in dir(mod) if not name.startswith('_')] |
| 87 | |
| 88 | def __getattr__(self, key): |
| 89 | # Use the equivalent of import_item(name), see below |
| 90 | name = "%s.%s" % (self._mirror, key) |
| 91 | try: |
| 92 | return import_item(name) |
| 93 | except ImportError: |
| 94 | raise AttributeError(key) |
no outgoing calls
no test coverage detected