Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/jedi/plugins/__init__.py: 97%
31 statements
« prev ^ index » next coverage.py v7.4.4, created at 2024-04-20 06:09 +0000
« prev ^ index » next coverage.py v7.4.4, created at 2024-04-20 06:09 +0000
1from functools import wraps
4class _PluginManager:
5 def __init__(self):
6 self._registered_plugins = []
7 self._cached_base_callbacks = {}
8 self._built_functions = {}
10 def register(self, *plugins):
11 """
12 Makes it possible to register your plugin.
13 """
14 self._registered_plugins.extend(plugins)
15 self._build_functions()
17 def decorate(self, name=None):
18 def decorator(callback):
19 @wraps(callback)
20 def wrapper(*args, **kwargs):
21 return built_functions[public_name](*args, **kwargs)
23 public_name = name or callback.__name__
25 assert public_name not in self._built_functions
26 built_functions = self._built_functions
27 built_functions[public_name] = callback
28 self._cached_base_callbacks[public_name] = callback
30 return wrapper
32 return decorator
34 def _build_functions(self):
35 for name, callback in self._cached_base_callbacks.items():
36 for plugin in reversed(self._registered_plugins):
37 # Need to reverse so the first plugin is run first.
38 try:
39 func = getattr(plugin, name)
40 except AttributeError:
41 pass
42 else:
43 callback = func(callback)
44 self._built_functions[name] = callback
47plugin_manager = _PluginManager()