Delay search for plugins

pull/1358/head
Nikhil Parasaram 5 years ago
parent e4bbf70f83
commit 94138828cd
  1. 17
      mythril/plugin/discovery.py

@ -2,7 +2,7 @@ import pkg_resources
from mythril.support.support_utils import Singleton from mythril.support.support_utils import Singleton
from mythril.plugin.interface import MythrilPlugin from mythril.plugin.interface import MythrilPlugin
from typing import List from typing import List, Dict, Any
class PluginDiscovery(object, metaclass=Singleton): class PluginDiscovery(object, metaclass=Singleton):
@ -12,21 +12,30 @@ class PluginDiscovery(object, metaclass=Singleton):
""" """
# Installed plugins structure. Retrieves all modules that have an entry point for mythril.plugins # Installed plugins structure. Retrieves all modules that have an entry point for mythril.plugins
_installed_plugins = { _installed_plugins = {} # type: Dict[str, Any]
def init_installed_plugins(self):
self._installed_plugins = {
entry_point.name: entry_point.load() entry_point.name: entry_point.load()
for entry_point in pkg_resources.iter_entry_points("mythril.plugins") for entry_point in pkg_resources.iter_entry_points("mythril.plugins")
} }
@property
def installed_plugins(self):
if self._installed_plugins is {}:
self.init_installed_plugins()
return self._installed_plugins
def is_installed(self, plugin_name: str) -> bool: def is_installed(self, plugin_name: str) -> bool:
"""Returns whether there is python package with a plugin with plugin_name""" """Returns whether there is python package with a plugin with plugin_name"""
return plugin_name in self._installed_plugins.keys() return plugin_name in self.installed_plugins.keys()
def build_plugin(self, plugin_name: str) -> MythrilPlugin: def build_plugin(self, plugin_name: str) -> MythrilPlugin:
"""Returns the plugin for the given plugin_name if it is installed""" """Returns the plugin for the given plugin_name if it is installed"""
if not self.is_installed(plugin_name): if not self.is_installed(plugin_name):
raise ValueError(f"Plugin with name: `{plugin_name}` is not installed") raise ValueError(f"Plugin with name: `{plugin_name}` is not installed")
plugin = self._installed_plugins.get(plugin_name) plugin = self.installed_plugins.get(plugin_name)
if plugin is None or not issubclass(plugin, MythrilPlugin): if plugin is None or not issubclass(plugin, MythrilPlugin):
raise ValueError(f"No valid plugin was found for {plugin_name}") raise ValueError(f"No valid plugin was found for {plugin_name}")

Loading…
Cancel
Save