Changeset 5493


Ignore:
Timestamp:
Jan 15, 2012 2:22:35 PM (8 years ago)
Author:
wehart
Message:

Rethinking the API for coopr_task functions.

Location:
coopr.core/trunk/coopr/core
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • coopr.core/trunk/coopr/core/_task.py

    r5492 r5493  
    77import pyutilib.workflow
    88import copy
     9import inspect
     10import pyutilib.misc
    911
    1012class CooprTask(pyutilib.workflow.Task):
     
    2729            for val in _outputs:
    2830                self.outputs.declare(val)
    29         #
    30         self._args = []
    3131
    3232    def execute(self, debug=False):
    3333        if self._fn is None:
    3434            raise RuntimeError, "This is a bad definition of a CooprTask.  The '_fn' method is not defined"
    35         if len(self._args) < 2:
    36             raise RuntimeError, "A CooprTask instance must be executed with at least one argument"
    37         if self._merge:
    38             kwargs = self._args.pop()
    39             self._args[0].update(kwargs)   
     35        #if len(self._args) < 2:
     36            #raise RuntimeError, "A CooprTask instance must be executed with at least one argument"
     37        #kwargs = self._args.pop()
     38        #for key in kwargs:
     39            #if not key in self._kwargs:
     40                #self._args[0][key] = kwargs.pop(key)
    4041        # TODO: verify required options here
    41         self._retval = self._fn(*self._args)
     42        data = self._kwargs.pop('data')
     43        retval = self._fn(data, **self._kwargs)
     44        if retval is None:
     45            self._retval = pyutilib.misc.Options(data=data)
     46        else:
     47            if not isinstance(retval, pyutilib.misc.Options):
     48                raise RuntimeError, "A Coopr task function must return either None or an Options object"
     49            if not id(data) == id(retval):
     50                retval.data = data
     51            self._retval = retval
    4252
    43     def _set_inputs(self, options):
     53    def X_set_inputs(self, options):
    4454        self._args.append(copy.copy(options))
    4555
    4656    def _call_start(self):
    47         self._args = []
    4857        self.reset()
     58
     59    def _call_init(self, *options, **kwds):
     60        self._kwargs = kwds
     61        if not 'data' in kwds:
     62            if len(options) > 0:
     63                kwds['data'] = options[0]
     64                options = options[1:]
     65            else:
     66                raise RuntimeError, "A CooprTask instance must be executed with at least one argument"
     67        #print "HERE", kwds
     68        return pyutilib.workflow.Task._call_init(self, *options, **kwds)
    4969
    5070    def _call_fini(self, *options, **kwds):
     
    5676# Decorate functions that are Coopr tasks
    5777#
    58 def coopr_task(fn=None, implements=None, merge=True):
     78def coopr_task(fn=None, implements=None, outputs=None):
    5979
    6080    def my_decorator(fn):
     
    6484                kwargs['fn'] = fn
    6585                CooprTask.__init__(self, *args, **kwargs)
    66                 self._merge = merge
    6786                if not fn is None:
     87                    argspec = inspect.getargspec(fn)
     88                    #print "HERE", argspec
     89                    if not argspec.varargs is None:
     90                        raise RuntimeError, "Attempting to declare Coopr task with function '%s' that contains variable arguments" % fn.__name__
     91                    if not argspec.keywords is None:
     92                        raise RuntimeError, "Attempting to declare Coopr task with function '%s' that contains variable keyword arguments" % fn.__name__
     93                    if argspec.args is None:
     94                        nargs = 0
     95                    elif argspec.defaults is None:
     96                        nargs = len(argspec.args)
     97                    else:
     98                        nargs = len(argspec.args) - len(argspec.defaults)
     99                    if nargs != 1:
     100                        raise RuntimeError, "A Coopr task '%s' must have a single argument" % fn.__name__
     101                    self._kwargs = argspec[nargs:]
     102                    #
     103                    self.inputs.declare('data')
     104                    for name in argspec.args[nargs:]:
     105                        self.inputs.declare(name, optional=True)
     106                    #
     107                    self.outputs.declare('data')
     108                    if not outputs is None:
     109                        for name in outputs:
     110                            self.outputs.declare(name)
     111                    #
    68112                    self.__help__ = fn.__doc__
    69113                    self.__doc__ = fn.__doc__
  • coopr.core/trunk/coopr/core/tests/tmp.py

    r5492 r5493  
    11import pyutilib.misc
    22from coopr.core import *
     3import sys
    34
    45@coopr_task
    5 def h(args):
    6     print args
    7     args.a = 2
    8     args.b[0] = 2
     6def h(data):
     7    print data
     8    data.a = 2
     9    data.b[0] = 2
    910
    1011print type(h)
     
    1516#print "Calling h"
    1617print h(options)
    17 #print "Calling h"
    18 print h(options, x=3, y=4)
    1918
    2019#
    2120@coopr_task
    22 def hh(args):
    23     print args
    24     args.a = 2
    25     args.b[0] = 2
    26     return args
     21def hh(data):
     22    print data
     23    data.a = 2
     24    data.b[0] = 2
     25    return data
    2726
    2827print type(hh)
     
    3534hh(options)
    3635print "HH", hh(options)
    37 #print "Calling hh"
    38 print "HH", hh(options, x=3, y=4)
    3936
    4037print ""
     
    4239print ""
    4340#
    44 @coopr_task
    45 def f(*args):
    46     print args
    47     args[0].a = 2
    48     args[0].b[0] = 2
     41try:
     42    @coopr_task
     43    def f(*args):
     44        print args
     45        args[0].a = 2
     46        args[0].b[0] = 2
     47   
     48    print type(f)
     49    options = pyutilib.misc.Options()
     50    options.a = 1
     51    options.b = [1,2]
     52   
     53    #print "Calling f"
     54    print f(options)
     55except Exception, err:
     56    print str(err)
    4957
    50 print type(f)
    51 options = pyutilib.misc.Options()
    52 options.a = 1
    53 options.b = [1,2]
     58try:
     59    #
     60    @coopr_task()
     61    def g(*args):
     62        print args
     63        args[0].a = 2
     64        args[0].b[0] = 2
    5465
    55 #print "Calling f"
    56 print f(options)
    57 #print "Calling f"
    58 print f(options, x=3, y=4)
     66    print type(g)
     67    options = pyutilib.misc.Options()
     68    options.a = 1
     69    options.b = [1,2]
     70
     71    #print "Calling g"
     72    print g(options)
     73except Exception, err:
     74    print str(err)
    5975
    6076#
    61 @coopr_task(merge=False)
    62 def g(*args):
     77@coopr_task()
     78def j(args, x=1, y=2):
    6379    print args
    64     args[0].a = 2
    65     args[0].b[0] = 2
    66 
    67 print type(g)
    68 options = pyutilib.misc.Options()
    69 options.a = 1
    70 options.b = [1,2]
    71 
    72 #print "Calling g"
    73 print g(options)
    74 #print "Calling g"
    75 print g(options, x=3, y=4)
    76 
    77 #
    78 @coopr_task(merge=False)
    79 def j(args, kwds):
    80     print args
     80    print "x %s y %s" % (str(x), str(y))
    8181    args.a = 2
    8282    args.b[0] = 2
     
    8888
    8989#print "Calling j"
    90 print j(options)
    91 #print "Calling j"
    92 print j(options, x=3, y=4)
     90print j(options, x=2)
     91
     92
  • coopr.core/trunk/coopr/core/tests/ttmp.py

    r5492 r5493  
    33
    44@coopr_task
    5 def h(args):
     5def h(args, x=2):
    66    """This function does something
    77
     
    3131print h(options)
    3232#print "Calling h"
    33 print h(options, x=3, y=4)
     33print h(options, x=3)
    3434
    35 #
    36 @coopr_task(merge=False)
    37 def j(args, kwds):
    38     print args
    39     args.a = 2
    40     args.b[0] = 2
    41 
    42 print type(j)
    43 options = pyutilib.misc.Options()
    44 options.a = 1
    45 options.b = [1,2]
    46 
    47 #print "Calling j"
    48 print j(options)
    49 #print "Calling j"
    50 print j(options, x=3, y=4)
Note: See TracChangeset for help on using the changeset viewer.