Files
openide/python/helpers/pydev/_pydevd_bundle/pydevd_extension_utils.py
Elizaveta Shashkova 3601a8a83c Use pkgutil in case of any error with pkg_resources (PY-29671)
Problems with `pkg_resources` module shouldn't break working with extensions in debugger.
2018-04-25 14:10:44 +03:00

68 lines
2.3 KiB
Python

import pkgutil
import sys
from _pydev_bundle import pydev_log
try:
import pydevd_plugins.extensions as extensions
except:
extensions = None
class ExtensionManager(object):
def __init__(self):
self.loaded_extensions = None
self.type_to_instance = {}
def _load_modules(self):
self.loaded_extensions = []
if extensions:
for module_loader, name, ispkg in pkgutil.walk_packages(extensions.__path__,
extensions.__name__ + '.'):
mod_name = name.split('.')[-1]
if not ispkg and mod_name.startswith('pydevd_plugin'):
try:
__import__(name)
module = sys.modules[name]
self.loaded_extensions.append(module)
except ImportError:
pydev_log.error('Unable to load extension ' + name)
def _ensure_loaded(self):
if self.loaded_extensions is None:
self._load_modules()
def _iter_attr(self):
for extension in self.loaded_extensions:
dunder_all = getattr(extension, '__all__', None)
for attr_name in dir(extension):
if not attr_name.startswith('_'):
if dunder_all is None or attr_name in dunder_all:
yield attr_name, getattr(extension, attr_name)
def get_extension_classes(self, extension_type):
self._ensure_loaded()
if extension_type in self.type_to_instance:
return self.type_to_instance[extension_type]
handlers = self.type_to_instance.setdefault(extension_type, [])
for attr_name, attr in self._iter_attr():
if isinstance(attr, type) and issubclass(attr, extension_type) and attr is not extension_type:
try:
handlers.append(attr())
except:
pydev_log.error('Unable to load extension class' + attr_name, tb=True)
return handlers
EXTENSION_MANAGER_INSTANCE = ExtensionManager()
def extensions_of_type(extension_type):
"""
:param T extension_type: The type of the extension hook
:rtype: list[T]
"""
return EXTENSION_MANAGER_INSTANCE.get_extension_classes(extension_type)