diff --git a/force_bdss/base_extension_plugin.py b/force_bdss/base_extension_plugin.py index 12017a4dab7ca2531c2c4e8ef01b3bff4e3ef8d6..cb4a9d6986e25aecd71875173967e71e675b62aa 100644 --- a/force_bdss/base_extension_plugin.py +++ b/force_bdss/base_extension_plugin.py @@ -2,7 +2,7 @@ import logging import traceback from envisage.plugin import Plugin -from traits.api import List, Unicode, Bool, Type, Either +from traits.api import List, Unicode, Bool, Type, Either, Instance from force_bdss.data_sources.base_data_source_factory import \ BaseDataSourceFactory @@ -19,8 +19,6 @@ from .mco.i_mco_factory import IMCOFactory from .ui_hooks.i_ui_hooks_factory import IUIHooksFactory -logger = logging.getLogger(__name__) - class BaseExtensionPlugin(Plugin): """Base class for extension plugins, that is, plugins that are @@ -48,7 +46,10 @@ class BaseExtensionPlugin(Plugin): broken = Bool(False) #: The error that have been generated by the instantiations. - error = Unicode() + error_msg = Unicode() + + #: The error that have been generated by the instantiations. + error_tb = Unicode() #: A list of all the factory classes to export. factory_classes = List( @@ -82,11 +83,31 @@ class BaseExtensionPlugin(Plugin): contributes_to=ExtensionPointID.UI_HOOKS_FACTORIES ) + #: The logger. + _logger = Instance(logging.Logger) + def __init__(self, *args, **kwargs): + broken = False + error = "" + + if "id" not in kwargs: + try: + id_ = plugin_id(self.get_producer(), self.get_identifier()) + except Exception as e: + self._logger.exception(e) + error = traceback.format_exc() + broken = True + else: + kwargs["id"] = id_ + super(BaseExtensionPlugin, self).__init__(*args, **kwargs) + if broken: + self.broken = True + self.error = error + return + try: - self.id = plugin_id(self.get_producer(), self.get_identifier()) self.factory_classes = self.get_factory_classes() self.mco_factories[:] = [ cls(self) @@ -101,12 +122,12 @@ class BaseExtensionPlugin(Plugin): ] self.ui_hooks_factories[:] = [ cls(self) - for cls in self._factory_by_type( - BaseUIHooksFactory) + for cls in self._factory_by_type(BaseUIHooksFactory) ] except Exception as e: - self.error = traceback.format_exc() - logger.exception(e) + self._logger.exception(e) + self.error_msg = str(e) + self.error_tb = traceback.format_exc() self.broken = True self.mco_factories[:] = [] self.data_source_factories[:] = [] @@ -140,4 +161,13 @@ class BaseExtensionPlugin(Plugin): self.__class__)) def _factory_by_type(self, type_): + """Returns all the factories of the given type""" return [cls for cls in self.factory_classes if issubclass(cls, type_)] + + def _id_default(self): + """Override for base method that raises a warning we don't want to + show""" + return '%s.%s' % (type(self).__module__, type(self).__name__) + + def __logger_default(self): + return logging.getLogger(self.__class__.__name__) diff --git a/force_bdss/tests/test_base_extension_plugin.py b/force_bdss/tests/test_base_extension_plugin.py index 7e078f64bfb5e8713446456aba49fe1ecd2b8f16..391d8faa5b37e1a379cdf7c8f27fc22866e2f779 100644 --- a/force_bdss/tests/test_base_extension_plugin.py +++ b/force_bdss/tests/test_base_extension_plugin.py @@ -12,4 +12,5 @@ class TestBaseExtensionPlugin(unittest.TestCase): self.assertEqual(len(plugin.mco_factories), 1) self.assertEqual(len(plugin.ui_hooks_factories), 1) self.assertFalse(plugin.broken) - self.assertEqual(plugin.error, "") + self.assertEqual(plugin.error_msg, "") + self.assertEqual(plugin.error_tb, "")