Skip to content

Commit

Permalink
refs #8588. move algorithm_decorator into own module.
Browse files Browse the repository at this point in the history
  • Loading branch information
OwenArnold committed Dec 10, 2013
1 parent 82332bf commit c1e1a2f
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 51 deletions.
Original file line number Diff line number Diff line change
@@ -1,59 +1,9 @@
import unittest
from mantid.simpleapi import *
from testhelpers.algorithm_decorator import make_decorator
import mantid.api

import inspect
import re
import math

def make_decorator(algorithm_to_decorate):
"""
Dynamically create a builder pattern style decorator around a Mantid algorithm.
This allows you to separate out setting algorithm parameters from the actual method execution. Parameters may be reset multiple times.
"""

class Decorator(object):

def __init__(self, alg_subject):
self.__alg_subject = alg_subject
self.__parameters__ = dict()

def execute(self, additional=None, verbose=False):
if verbose:
print "Algorithm Parameters:"
print self.__parameters__
print
out = self.__alg_subject(**self.__parameters__)
return out

def set_additional(self, additional):
self.__parameters__.update(**additional)

def add_getter_setter(type, name):

def setter(self, x):
self.__parameters__[name] = x

def getter(self):
return self.__parameters__[name]

setattr(type, "set_" + name, setter)
setattr(type, "get_" + name, getter)


argspec = inspect.getargspec(algorithm_to_decorate)
for parameter in argspec.varargs.split(','):
m = re.search('(^\w+)', parameter) # Take the parameter key part from the defaults given as 'key=value'
if m:
parameter = m.group(0).strip()
m = re.search('\w+$', parameter) # strip off any leading numerical values produced by argspec
if m:
parameter = m.group(0).strip()
add_getter_setter(Decorator, m.group(0).strip())

return Decorator(algorithm_to_decorate)


class ReflectometryReductionOneTest(unittest.TestCase):

def construct_standard_algorithm(self):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

set ( PY_FILES
__init__.py
algorithm_decorator.py
)

# Copy python files to output directory
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import inspect
import re

def make_decorator(algorithm_to_decorate):
"""
Dynamically create a builder pattern style decorator around a Mantid algorithm.
This allows you to separate out setting algorithm parameters from the actual method execution. Parameters may be reset multiple times.
Usage:
rebin = make_decorator(Rebin)
rebin.set_Params([0, 0.1, 1])
....
rebin.execute()
Arguments:
algorithm_to_decorate: The mantid.simpleapi algorithm to decorate.
"""

class Decorator(object):

def __init__(self, alg_subject):
self.__alg_subject = alg_subject
self.__parameters__ = dict()

def execute(self, additional=None, verbose=False):
if verbose:
print "Algorithm Parameters:"
print self.__parameters__
print
out = self.__alg_subject(**self.__parameters__)
return out

def set_additional(self, additional):
self.__parameters__.update(**additional)

def add_getter_setter(type, name):

def setter(self, x):
self.__parameters__[name] = x

def getter(self):
return self.__parameters__[name]

setattr(type, "set_" + name, setter)
setattr(type, "get_" + name, getter)


argspec = inspect.getargspec(algorithm_to_decorate)
for parameter in argspec.varargs.split(','):
m = re.search('(^\w+)', parameter) # Take the parameter key part from the defaults given as 'key=value'
if m:
parameter = m.group(0).strip()
m = re.search('\w+$', parameter) # strip off any leading numerical values produced by argspec
if m:
parameter = m.group(0).strip()
add_getter_setter(Decorator, m.group(0).strip())

return Decorator(algorithm_to_decorate)

0 comments on commit c1e1a2f

Please sign in to comment.