| 225 | """Base class to help with creating importer mocks.""" |
| 226 | |
| 227 | def __init__(self, *names, module_code={}): |
| 228 | self.modules = {} |
| 229 | self.module_code = {} |
| 230 | for name in names: |
| 231 | if not name.endswith('.__init__'): |
| 232 | import_name = name |
| 233 | else: |
| 234 | import_name = name[:-len('.__init__')] |
| 235 | if '.' not in name: |
| 236 | package = None |
| 237 | elif import_name == name: |
| 238 | package = name.rsplit('.', 1)[0] |
| 239 | else: |
| 240 | package = import_name |
| 241 | module = types.ModuleType(import_name) |
| 242 | module.__loader__ = self |
| 243 | module.__file__ = '<mock __file__>' |
| 244 | module.__package__ = package |
| 245 | module.attr = name |
| 246 | if import_name != name: |
| 247 | module.__path__ = ['<mock __path__>'] |
| 248 | self.modules[import_name] = module |
| 249 | if import_name in module_code: |
| 250 | self.module_code[import_name] = module_code[import_name] |
| 251 | |
| 252 | def __getitem__(self, name): |
| 253 | return self.modules[name] |