Source code for stakkr.plugins

"""Module used by setup.py to find plugins to load with click"""

import re
import subprocess
from os import listdir, path


[docs]def add_plugins(): """Read the plugins directory, get the subfolders from it and look for .py files""" if path.isdir('plugins') is False: return [] _remove_plugins() folders = _get_subfolders('plugins') plugins = [] for folder in folders: plugins = _add_plugin_from_dir(plugins, 'plugins/{}/'.format(folder)) return sorted(plugins)
def _add_plugin_from_dir(plugins: list, full_path: str): files = _get_files_from_folder(full_path) if len(files) is 0: print(' -> No plugin found in "{}"'.format(full_path)) return plugins plugin_name = full_path.strip('/').split('/')[1] try: cmd_install = ['pip', 'install', '-e', full_path] subprocess.check_call(cmd_install, stdout=subprocess.DEVNULL) except Exception as error: msg = 'Problem installing {} (Reason: {})'.format(plugin_name[:-3], error) raise TypeError(msg) print(' -> Plugin "{}" added'.format(plugin_name)) plugins.append(plugin_name) return plugins def _get_files_from_folder(full_path: str): files = listdir(full_path) return [filename for filename in files if filename == 'setup.py'] def _get_subfolders(directory: str): subfolders = listdir(directory) return [folder for folder in subfolders if path.isdir('{}/{}'.format(directory, folder))] def _remove_plugins(): cmd = ['pip', 'freeze'] res = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) regex = re.compile('.*stakkr([0-9a-z]+).*$', re.IGNORECASE) for line in res.stdout: plugin = re.search(regex, line.decode()) if plugin is None: continue plugin_name = 'Stakkr{}'.format(plugin.group(1)) print(' -> Cleaning "{}"'.format(plugin_name)) subprocess.check_call(['pip', 'uninstall', '-y', plugin_name], stdout=subprocess.DEVNULL)