From 5493070d407df58a884acb8dd2d7a6ee775fb473 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=2E=20Fernando=20S=C3=A1nchez?= Date: Mon, 6 Mar 2017 11:27:49 +0100 Subject: [PATCH] Filter conversion plugins Closes #12 * Shows only analysis plugins by default on /api/plugins * Adds a plugin_type parameter to get other types of plugins * default_plugin chosen from analysis plugins --- senpy/api.py | 7 +++++++ senpy/blueprints.py | 4 +++- senpy/extensions.py | 39 ++++++++++++++++++++++++++------------- senpy/plugins/__init__.py | 24 +++++++++++++++--------- 4 files changed, 51 insertions(+), 23 deletions(-) diff --git a/senpy/api.py b/senpy/api.py index c90dec5..7158727 100644 --- a/senpy/api.py +++ b/senpy/api.py @@ -26,6 +26,13 @@ API_PARAMS = { "aliases": ["emotionModel", "emoModel"], "required": False }, + "plugin_type": { + "@id": "pluginType", + "description": 'What kind of plugins to list', + "aliases": ["pluginType", "plugin_type"], + "required": True, + "default": "analysisPlugin" + }, "conversion": { "@id": "conversion", "description": "How to show the elements that have (not) been converted", diff --git a/senpy/blueprints.py b/senpy/blueprints.py index fd00955..405d1d6 100644 --- a/senpy/blueprints.py +++ b/senpy/blueprints.py @@ -121,7 +121,9 @@ def api(): @basic_api def plugins(): sp = current_app.senpy - dic = Plugins(plugins=list(sp.plugins.values())) + ptype = request.params.get('plugin_type') + plugins = sp.filter_plugins(plugin_type=ptype) + dic = Plugins(plugins=list(plugins.values())) return dic diff --git a/senpy/extensions.py b/senpy/extensions.py index c691ec8..2bd4d99 100644 --- a/senpy/extensions.py +++ b/senpy/extensions.py @@ -5,7 +5,8 @@ It orchestrates plugin (de)activation and analysis. from future import standard_library standard_library.install_aliases() -from .plugins import SentimentPlugin, SenpyPlugin +from . import plugins +from .plugins import SenpyPlugin from .models import Error, Entry, Results from .blueprints import api_blueprint, demo_blueprint, ns_blueprint from .api import API_PARAMS, NIF_PARAMS, parse_params @@ -367,6 +368,22 @@ class Senpy(object): def filter_plugins(self, **kwargs): """ Filter plugins by different criteria """ + ptype = kwargs.pop('plugin_type', None) + logger.debug('#' * 100) + logger.debug('ptype {}'.format(ptype)) + if ptype: + try: + ptype = ptype[0].upper() + ptype[1:] + pclass = getattr(plugins, ptype) + logger.debug('Class: {}'.format(pclass)) + candidates = filter(lambda x: isinstance(x, pclass), + self.plugins.values()) + except AttributeError: + raise Error('{} is not a valid type'.format(ptype)) + else: + candidates = self.plugins.values() + + logger.debug(candidates) def matches(plug): res = all(getattr(plug, k, None) == v for (k, v) in kwargs.items()) @@ -374,15 +391,11 @@ class Senpy(object): "matching {} with {}: {}".format(plug.name, kwargs, res)) return res - if not kwargs: - return self.plugins - else: - return {n: p for n, p in self.plugins.items() if matches(p)} - - def sentiment_plugins(self): - """ Return only the sentiment plugins """ - return { - p: plugin - for p, plugin in self.plugins.items() - if isinstance(plugin, SentimentPlugin) - } + if kwargs: + candidates = filter(matches, candidates) + return {p.name: p for p in candidates} + + @property + def analysis_plugins(self): + """ Return only the analysis plugins """ + return self.filter_plugins(plugin_type='analysisPlugin') diff --git a/senpy/plugins/__init__.py b/senpy/plugins/__init__.py index 9f5e889..9477448 100644 --- a/senpy/plugins/__init__.py +++ b/senpy/plugins/__init__.py @@ -30,6 +30,15 @@ class SenpyPlugin(models.Plugin): def get_folder(self): return os.path.dirname(inspect.getfile(self.__class__)) + def activate(self): + pass + + def deactivate(self): + pass + + +class AnalysisPlugin(SenpyPlugin): + def analyse(self, *args, **kwargs): raise NotImplemented( 'Your method should implement either analyse or analyse_entry') @@ -48,30 +57,27 @@ class SenpyPlugin(models.Plugin): for i in results.entries: yield i - def activate(self): - pass - def deactivate(self): - pass +class ConversionPlugin(SenpyPlugin): + pass -class SentimentPlugin(models.SentimentPlugin, SenpyPlugin): +class SentimentPlugin(models.SentimentPlugin, AnalysisPlugin): def __init__(self, info, *args, **kwargs): super(SentimentPlugin, self).__init__(info, *args, **kwargs) self.minPolarityValue = float(info.get("minPolarityValue", 0)) self.maxPolarityValue = float(info.get("maxPolarityValue", 1)) -class EmotionPlugin(models.EmotionPlugin, SenpyPlugin): +class EmotionPlugin(models.EmotionPlugin, AnalysisPlugin): def __init__(self, info, *args, **kwargs): super(EmotionPlugin, self).__init__(info, *args, **kwargs) self.minEmotionValue = float(info.get("minEmotionValue", -1)) self.maxEmotionValue = float(info.get("maxEmotionValue", 1)) -class EmotionConversionPlugin(models.EmotionConversionPlugin, SenpyPlugin): - def __init__(self, info, *args, **kwargs): - super(EmotionConversionPlugin, self).__init__(info, *args, **kwargs) +class EmotionConversionPlugin(models.EmotionConversionPlugin, ConversionPlugin): + pass class ShelfMixin(object):