From d91b51f6d58003de84a9d6dd8189fceba0e81a5a Mon Sep 17 00:00:00 2001
From: "Daniel M. Pelt" <D.M.Pelt@cwi.nl>
Date: Mon, 20 Jul 2015 14:07:21 +0200
Subject: Allow registering plugins without explicit name, and fix exception
 handling when running in Matlab

---
 python/astra/plugin.py    | 71 +++++++++++++++++++----------------------------
 python/astra/plugin_c.pyx | 14 ++++++++--
 2 files changed, 40 insertions(+), 45 deletions(-)

(limited to 'python/astra')

diff --git a/python/astra/plugin.py b/python/astra/plugin.py
index f8fc3bd..4b32e6e 100644
--- a/python/astra/plugin.py
+++ b/python/astra/plugin.py
@@ -32,60 +32,47 @@ import traceback
 class base(object):
 
     def astra_init(self, cfg):
-        try:
-            args, varargs, varkw, defaults = inspect.getargspec(self.initialize)
-            if not defaults is None:
-                nopt = len(defaults)
-            else:
-                nopt = 0
-            if nopt>0:
-                req = args[2:-nopt]
-                opt = args[-nopt:]
-            else:
-                req = args[2:]
-                opt = []
+        args, varargs, varkw, defaults = inspect.getargspec(self.initialize)
+        if not defaults is None:
+            nopt = len(defaults)
+        else:
+            nopt = 0
+        if nopt>0:
+            req = args[2:-nopt]
+            opt = args[-nopt:]
+        else:
+            req = args[2:]
+            opt = []
 
-            try:
-                optDict = cfg['options']
-            except KeyError:
-                optDict = {}
+        try:
+            optDict = cfg['options']
+        except KeyError:
+            optDict = {}
 
-            cfgKeys = set(optDict.keys())
-            reqKeys = set(req)
-            optKeys = set(opt)
+        cfgKeys = set(optDict.keys())
+        reqKeys = set(req)
+        optKeys = set(opt)
 
-            if not reqKeys.issubset(cfgKeys):
-                for key in reqKeys.difference(cfgKeys):
-                    log.error("Required option '" + key + "' for plugin '" + self.__class__.__name__ + "' not specified")
-                raise ValueError("Missing required options")
+        if not reqKeys.issubset(cfgKeys):
+            for key in reqKeys.difference(cfgKeys):
+                log.error("Required option '" + key + "' for plugin '" + self.__class__.__name__ + "' not specified")
+            raise ValueError("Missing required options")
 
-            if not cfgKeys.issubset(reqKeys | optKeys):
-                log.warn(self.__class__.__name__ + ": unused configuration option: " + str(list(cfgKeys.difference(reqKeys | optKeys))))
+        if not cfgKeys.issubset(reqKeys | optKeys):
+            log.warn(self.__class__.__name__ + ": unused configuration option: " + str(list(cfgKeys.difference(reqKeys | optKeys))))
 
-            args = [optDict[k] for k in req]
-            kwargs = dict((k,optDict[k]) for k in opt if k in optDict)
-            self.initialize(cfg, *args, **kwargs)
-        except Exception:
-            log.error(traceback.format_exc().replace("%","%%"))
-            raise
+        args = [optDict[k] for k in req]
+        kwargs = dict((k,optDict[k]) for k in opt if k in optDict)
+        self.initialize(cfg, *args, **kwargs)
 
-    def astra_run(self, its):
-        try:
-            self.run(its)
-        except Exception:
-            log.error(traceback.format_exc().replace("%","%%"))
-            raise
-
-def register(name, className):
+def register(className):
     """Register plugin with ASTRA.
     
-    :param name: Plugin name to register
-    :type name: :class:`str`
     :param className: Class name or class object to register
     :type className: :class:`str` or :class:`class`
     
     """
-    p.register(name,className)
+    p.register(className)
 
 def get_registered():
     """Get dictionary of registered plugins.
diff --git a/python/astra/plugin_c.pyx b/python/astra/plugin_c.pyx
index 91b3cd5..8d6816b 100644
--- a/python/astra/plugin_c.pyx
+++ b/python/astra/plugin_c.pyx
@@ -38,7 +38,9 @@ from . import utils
 
 cdef extern from "astra/PluginAlgorithm.h" namespace "astra":
     cdef cppclass CPluginAlgorithmFactory:
+        bool registerPlugin(string className)
         bool registerPlugin(string name, string className)
+        bool registerPluginClass(object className)
         bool registerPluginClass(string name, object className)
         object getRegistered()
         string getHelp(string name)
@@ -46,11 +48,17 @@ cdef extern from "astra/PluginAlgorithm.h" namespace "astra":
 cdef extern from "astra/PluginAlgorithm.h" namespace "astra::CPluginAlgorithmFactory":
     cdef CPluginAlgorithmFactory* getSingletonPtr()
 
-def register(name, className):
+def register(className, name=None):
     if inspect.isclass(className):
-        fact.registerPluginClass(six.b(name), className)
+        if name==None:
+            fact.registerPluginClass(className)
+        else:
+            fact.registerPluginClass(six.b(name), className)
     else:
-        fact.registerPlugin(six.b(name), six.b(className))
+        if name==None:
+            fact.registerPlugin(six.b(className))
+        else:
+            fact.registerPlugin(six.b(name), six.b(className))
 
 def get_registered():
     return fact.getRegistered()
-- 
cgit v1.2.3