Source code for sylib.calculator.plugins
# This file is part of Sympathy for Data.
# Copyright (c) 2017, Combine Control Systems AB
#
# Sympathy for Data is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, version 3 of the License.
#
# Sympathy for Data is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Sympathy for Data. If not, see <http://www.gnu.org/licenses/>.
from sympathy.utils.components import get_components
from sympathy.api import component
[docs]
class ICalcPlugin(component.NodePlugin):
"""Interface for calculator plugins."""
WEIGHT = 10000
@staticmethod
def plugin_base_name():
return 'Calculator'
[docs]
@staticmethod
def gui_dict():
"""
Return a dictionary with functions that will be shown in the
configuration gui for the calculator node.
Each dictionary in the globals_dict represents another level of
subcategories in the tree view. The keys of the dict is used as labels
for the subcategories. A list represents a list of functions.
Each function in the list should be a tuple of three elements: label,
code, tooltip/documentation.
For example:
{'My functions': [
('My function 1', 'myplugin.func1()',
"My function 1 is awesome..."),
('My function 2', 'myplugin.func2()',
"My function 1 is also awesome...")]}
This should result in a top level category called "My functions"
containing the two functions "My function 1" and "My function 2".
"""
return {}
[docs]
@staticmethod
def globals_dict():
"""
Return a dictionary that will be added to the globals dictionary
when executing calculations.
"""
return {}
[docs]
@staticmethod
def hidden_items():
"""
Reimplement this to hide some elements from other plugins.
The hidden functions will still be available, but won't show up in the
list of common functions in the calculator gui.
The returned value should be a list of tuples with the "paths" in the
gui_dict that should be hidden. E.g. ``[("Event detection",)]`` will
hide the entire event detection subtree, while ``[("Event detection",
"Changed")]`` will hide the function called "Changed" under "Event
detection".
"""
return []
class MatlabCalcPlugin:
"""Interface for calculator plugins."""
WEIGHT = 10000
@staticmethod
def gui_dict(generic):
"""
Return a dictionary with functions that will be shown in the
configuration gui for the calculator node.
"""
return {}
@staticmethod
def globals_dict():
"""
Return a dictionary that will be added to the globals dictionary
when executing calculations.
"""
return {}
def available_plugins(backend='python'):
"""Return all available plugins derived for a specific backend."""
plugin_classes = {'python': ICalcPlugin,
'matlab': MatlabCalcPlugin}
return get_components('plugin_*.py', plugin_classes[backend])
class PluginWrapper:
"""
Merge two or more module-like objects into one.
getattr calls on PluginWrapper objects are passed on to the module-like
objects and the first one which doesn't raise AttributeError gets to return
its result.
"""
def __init__(self, *namespaces):
self._namespaces = list(namespaces)
def __getattr__(self, attr):
for ns in self._namespaces:
try:
return getattr(ns, attr)
except AttributeError:
pass
raise AttributeError(attr)