From 40896fc70b0946d2bddbb7339d5f95eb2e1b5a0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Tue, 20 Sep 2016 15:12:06 +0200 Subject: [PATCH] Better logging when bad extension class is given. This was necessary to debug an issue with different unit tests influencing each other in Attract. --- pillar/__init__.py | 9 +++++++-- pillar/tests/__init__.py | 14 +++++++++++--- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/pillar/__init__.py b/pillar/__init__.py index cdc6212d..2608450d 100644 --- a/pillar/__init__.py +++ b/pillar/__init__.py @@ -182,8 +182,13 @@ class PillarServer(Eve): def load_extension(self, pillar_extension, url_prefix): from .extension import PillarExtension - assert isinstance(pillar_extension, PillarExtension), \ - 'Extension has wrong type %r' % type(pillar_extension) + if not isinstance(pillar_extension, PillarExtension): + if self.config.get('DEBUG'): + for cls in type(pillar_extension).mro(): + self.log.error('class %42r (%i) is %42r (%i): %s', + cls, id(cls), PillarExtension, id(PillarExtension), + cls is PillarExtension) + raise AssertionError('Extension has wrong type %r' % type(pillar_extension)) self.log.info('Loading extension %s', pillar_extension.name) # Remember this extension, and disallow duplicates. diff --git a/pillar/tests/__init__.py b/pillar/tests/__init__.py index 6df373a5..2c451fce 100644 --- a/pillar/tests/__init__.py +++ b/pillar/tests/__init__.py @@ -1,5 +1,7 @@ # -*- encoding: utf-8 -*- +from __future__ import print_function + from __future__ import absolute_import import base64 @@ -94,9 +96,15 @@ class AbstractPillarTest(TestMinimal): # Not only delete self.app (like the superclass does), # but also un-import the application. - del sys.modules['pillar'] - remove = [modname for modname in sys.modules - if modname.startswith('pillar.')] + self.unload_modules('pillar') + + def unload_modules(self, module_name): + """Uploads the named module, and all submodules.""" + + del sys.modules[module_name] + + remove = {modname for modname in sys.modules + if modname.startswith('%s.' % module_name)} for modname in remove: del sys.modules[modname]