From e8cc67a546df3e9fd0e0e1d970a23cd25fcdca4f Mon Sep 17 00:00:00 2001 From: Parashara Shamaprasad Date: Thu, 31 Oct 2019 17:38:59 -0500 Subject: [PATCH 1/2] Add initial attempt at a plugin detector. --- foyer/__init__.py | 1 + foyer/plugins.py | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 foyer/plugins.py diff --git a/foyer/__init__.py b/foyer/__init__.py index c310b99c..a4c8ac90 100644 --- a/foyer/__init__.py +++ b/foyer/__init__.py @@ -1,3 +1,4 @@ from foyer.forcefield import Forcefield from foyer.forcefields import forcefields from foyer.version import version +from foyer.plugins import collect_plugins diff --git a/foyer/plugins.py b/foyer/plugins.py new file mode 100644 index 00000000..8dfb0118 --- /dev/null +++ b/foyer/plugins.py @@ -0,0 +1,39 @@ +import foyer +import glob + +def collect_plugins(plugin_names=None): + """ + Detects which plugins are installed + + Arguments + --------- + plugin_names: list, default=None + A list of non-standard plugin names (strings) to additionally + check for. + """ + + plugin_funcs = [func for func in dir(foyer.forcefields) + if "load" in func and "__" not in func] + + if plugin_names: + plugin_funcs += plugin_names + + plugins = dict() + for plugin_func in plugin_funcs: + plugin_loader_func = eval("foyer.forcefields.{}".format(plugin_func)) + # Assumes all plugins are named "load_{plugin_name}" + plugin_name = "_".join(plugin_func.split("_")[1:]) + # TODO: plugin_version = get_version_info + plugin_dir = eval("foyer.forcefields.{}.__globals__['__file__']".format(plugin_func)) + # TODO: plugin_xml_path = get_xml_path + # This assumes that plugin directory tree is consistent. + # Does not consider versioned FFs. + plugin_xml_path = glob.glob("{}/xml/*xml".format(plugin_dir)) + + plugin = {plugin_name : {"version" : None, + "load_function" : plugin_loader_func, + "xml_path" : plugin_xml_path + }} + plugins.update(plugin) + + return plugins From 2678a39614c338cc2cbeab2619a905e90c7195e1 Mon Sep 17 00:00:00 2001 From: Parashara Shamaprasad Date: Fri, 22 Nov 2019 12:04:22 -0600 Subject: [PATCH 2/2] Make plugin_dir reference the directory instead of a file. --- foyer/plugins.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/foyer/plugins.py b/foyer/plugins.py index 8dfb0118..2ca779ad 100644 --- a/foyer/plugins.py +++ b/foyer/plugins.py @@ -1,5 +1,6 @@ import foyer import glob +import os def collect_plugins(plugin_names=None): """ @@ -25,6 +26,7 @@ def collect_plugins(plugin_names=None): plugin_name = "_".join(plugin_func.split("_")[1:]) # TODO: plugin_version = get_version_info plugin_dir = eval("foyer.forcefields.{}.__globals__['__file__']".format(plugin_func)) + plugin_dir = os.path.dirname(plugin_dir) # TODO: plugin_xml_path = get_xml_path # This assumes that plugin directory tree is consistent. # Does not consider versioned FFs.