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.