Changeset 3372:32950bc8327a in livinglogic.python.xist

Show
Ignore:
Timestamp:
06/16/08 17:21:26 (11 years ago)
Author:
Walter Doerwald <walter@…>
Branch:
default
Message:

Fix handling of empty list/tuple/dict in getoutputs(). Add CallFuncAction?, CallMethAction? and ULLCompileAction.

For an empty list getoutputs() now returns an empty list too, if since is bigbang.

Files:
2 modified

Legend:

Unmodified
Added
Removed
  • NEWS.rst

    r3371 r3372  
    1111    __ http://www.djangoproject.com/documentation/templates/ 
    1212 
    13 *   :mod:`ll.make` has gained two new actions: :class:`GZipAction` and 
    14     :class:`GUnzipAction`. 
     13*   :mod:`ll.make` has gained new actions: :class:`GZipAction`, 
     14    :class:`GUnzipAction`, :class:`CallFuncAction`,  :class:`CallMethAction` and 
     15    :class:`ULLCompileAction`. 
    1516 
    1617*   All actions in :mod:`ll.make` no longer check whether their inputs are 
  • src/ll/make.py

    r3371 r3372  
    249249                havedata = True 
    250250            resultdata.append(data) 
    251         if havedata: 
    252             if isinstance(input, tuple): 
    253                 resultdata = tuple(resultdata) 
    254             return (resultdata, resultchanged) 
    255         return (nodata, resultchanged) 
     251        if since is bigbang and not input: 
     252            resultdata = input.__class__() 
     253        elif not havedata: 
     254            resultdata = nodata 
     255        elif isinstance(input, tuple): 
     256            resultdata = tuple(resultdata) 
     257        return (resultdata, resultchanged) 
    256258    elif isinstance(input, dict): 
    257259        resultdata = {} 
     
    265267                resultdata = dict((key, getoutputs(project, since, input[key])) for key in resultdata) # refetch data from previous inputs 
    266268                havedata = True 
    267             resultdata[key] = output 
    268         if not havedata: 
     269            resultdata[key] = data 
     270        if since is bigbang and not input: 
     271            resultdata = {} 
     272        elif not havedata: 
    269273            resultdata = nodata 
    270         return (resultdate, resultchanged) 
     274        return (resultdata, resultchanged) 
    271275    else: 
    272276        return (input if since is bigbang else nodata, bigbang) 
     
    10621066 
    10631067 
     1068class CallFuncAction(Action): 
     1069    """ 
     1070    This action calls a function with a number of arguments. Both positional and 
     1071    keyword arguments are supported and the function and the arguments can be 
     1072    static objects or actions. 
     1073    """ 
     1074    def __init__(self, func, *args, **kwargs): 
     1075        Action.__init__(self) 
     1076        self.func = func 
     1077        self.args = args 
     1078        self.kwargs = kwargs 
     1079 
     1080    @report 
     1081    def get(self, project, since): 
     1082        (data, self.changed) = getoutputs(project, since, (self.func, self.args, self.kwargs)) 
     1083        if data is not nodata: 
     1084            project.writestep(self, "Calling function %r" % data[0]) 
     1085            data = data[0](*data[1], **data[2]) 
     1086        return data 
     1087 
     1088 
     1089class CallMethAction(Action): 
     1090    """ 
     1091    This action calls a method of an object with a number of arguments. Both 
     1092    positional and keyword arguments are supported and the object, the method name 
     1093    and the arguments can be static objects or actions. 
     1094    """ 
     1095    def __init__(self, obj, methname, *args, **kwargs): 
     1096        Action.__init__(self) 
     1097        self.obj = obj 
     1098        self.methname = methname 
     1099        self.args = args 
     1100        self.kwargs = kwargs 
     1101 
     1102    @report 
     1103    def get(self, project, since): 
     1104        (data, self.changed) = getoutputs(project, since, (self.obj, self.methname, self.args, self.kwargs)) 
     1105        if data is not nodata: 
     1106            meth = getattr(data[0], data[1]) 
     1107            project.writestep(self, "Calling %r" % meth) 
     1108            data = meth(*data[2], **data[3]) 
     1109        return data 
     1110 
     1111 
    10641112class TOXICAction(PipeAction): 
    10651113    """ 
     
    11411189            data = self.execute(project, data[1], data[0]) 
    11421190        return data 
     1191 
     1192 
     1193class ULLCompileAction(PipeAction): 
     1194    """ 
     1195    This action compiles a ULL template into a :class:`ll.ullc.Template` object. 
     1196    """ 
     1197 
     1198    def execute(self, project, data): 
     1199        project.writestep(self, "Compiling ULL template") 
     1200        from ll import ullc 
     1201        return ullc.compile(data) 
    11431202 
    11441203