Changeset 3443:7a1945e728dd in livinglogic.python.xist

Show
Ignore:
Timestamp:
07/04/08 14:12:54 (11 years ago)
Author:
Walter Doerwald <walter@…>
Branch:
default
Message:

There can now be multiple data objects that are passed via keyword arguments in Template.render() and the render tag.

Files:
2 modified

Legend:

Unmodified
Added
Removed
  • src/ll/ul4c.py

    r3441 r3443  
    713713 
    714714        if function is not None: 
    715             _code("def %s(data, templates={}):" % function) 
     715            _code("def %s(templates={}, **variables):" % function) 
    716716            indent += 1 
    717717        _code("import sys, marshal, datetime") 
    718718        _code("from ll.misc import xmlescape") 
    719719        _code("from ll import ul4c") 
    720         _code("variables = dict(data=data)") 
    721720        _code("source = %r" % self.source) 
     721        _code('variables = dict((key.decode("utf-8"), value) for (key, value) in variables.iteritems())') # FIXME: This can be dropped in Python 3.0 where strings are unicode 
    722722        locations = tuple((oc.location.type, oc.location.starttag, oc.location.endtag, oc.location.startcode, oc.location.endcode) for oc in self.opcodes) 
    723723        locations = marshal.dumps(locations) 
     
    925925                    _code("# end if") 
    926926                elif opcode.code == "render": 
    927                     _code("for chunk in templates[%r](reg%d, templates): yield chunk" % (opcode.arg, opcode.r1)) 
     927                    _code('for chunk in templates[%r](templates, **dict((key.encode("utf-8"), value) for (key, value) in reg%d.iteritems())): yield chunk' % (opcode.arg, opcode.r1)) 
    928928                else: 
    929929                    raise UnknownOpcodeError(opcode.code) 
     
    954954        return self._pythonfunction 
    955955 
    956     def __call__(self, data=None, templates={}): 
    957         return self.pythonfunction()(data, templates) 
    958  
    959     def render(self, data=None, templates={}): 
    960         return self.pythonfunction()(data, templates) 
    961  
    962     def renders(self, data=None, templates={}): 
    963         return "".join(self.render(data, templates)) 
     956    def __call__(self, templates={}, **variables): 
     957        return self.pythonfunction()(templates, **variables) 
     958 
     959    def render(self, templates={}, **variables): 
     960        return self.pythonfunction()(templates, **variables) 
     961 
     962    def renders(self, templates={}, **variables): 
     963        return "".join(self.render(templates, **variables)) 
    964964 
    965965    def format(self, indent="\t"): 
     
    15391539 
    15401540class Render(AST): 
    1541     def __init__(self, start, end, name, value): 
     1541    def __init__(self, start, end, name, *variables): 
    15421542        AST.__init__(self, start, end) 
    15431543        self.name = name 
    1544         self.value = value 
     1544        self.variables = list(variables) 
    15451545 
    15461546    def __repr__(self): 
    1547         return "%s(%r, %r, %r, %r)" % (self.__class__.__name__, self.start, self.end, self.name, self.value) 
     1547        return "%s(%r, %r, %r, %s)" % (self.__class__.__name__, self.start, self.end, self.name, repr(self.variables)[1:-1]) 
    15481548 
    15491549    def compile(self, template): 
    1550         r = self.value.compile(template) 
     1550        r = template._allocreg() 
     1551        template.opcode("builddict", r1=r) 
     1552        for (key, value) in self.variables: 
     1553            rv = value.compile(template) 
     1554            rk = template._allocreg() 
     1555            template.opcode("loadstr", r1=rk, arg=key.name) 
     1556            template.opcode("adddict", r1=r, r2=rk, r3=rv) 
     1557            template._freereg(rk) 
     1558            template._freereg(rv) 
    15511559        template.opcode("render", r1=r, arg=self.name.name) 
    15521560        template._freereg(r) 
     
    20502058    start = "render" 
    20512059 
    2052     @spark.production('render ::= name ( expr0 )') 
    2053     def render(self, name, _1, expr, _2): 
    2054         return Render(name.start, _2.end, name, expr) 
     2060    @spark.production('render ::= name ( )') 
     2061    def emptyrender(self, name, _0, _1): 
     2062        return Render(name.start, _1.end, name) 
     2063 
     2064    @spark.production('buildrender ::= name ( name = expr0') 
     2065    def startrender(self, name, _0, argname, _1, argvalue): 
     2066        return Render(name.start, argvalue.end, name, (argname, argvalue)) 
     2067 
     2068    @spark.production('buildrender ::= buildrender , name = expr0') 
     2069    def buildrender(self, render, _0, argname, _1, argvalue): 
     2070        render.variables.append((argname, argvalue)) 
     2071        render.end = argvalue.end 
     2072        return render 
     2073 
     2074    @spark.production('render ::= buildrender )') 
     2075    def finishrender(self, render, _0): 
     2076        render.end = _0.end 
     2077        return render 
     2078 
     2079    @spark.production('render ::= buildrender , )') 
     2080    def finishrender1(self, render, _0, _1): 
     2081        render.end = _1.end 
     2082        return render 
    20552083 
    20562084 
  • test/test_ul4.py

    r3442 r3443  
    1717 
    1818 
    19 def check(result, source, data={}, templates={}): 
     19def check(result, source, templates={}, **variables): 
    2020    # Check with template compiled from source 
    2121    t1 = ul4c.compile(source) 
    22     assert result == t1.renders(data, templates) 
     22    assert result == t1.renders(templates, **variables) 
    2323 
    2424    # Check with template loaded again via the string interface 
    2525    t2 = ul4c.loads(t1.dumps()) 
    26     assert result == t2.renders(data, templates) 
     26    assert result == t2.renders(templates, **variables) 
    2727 
    2828    # Check with template loaded again via the stream interface 
     
    3131    stream.seek(0) 
    3232    t3 = ul4c.load(stream) 
    33     assert result == t3.renders(data, templates) 
    34  
    35  
    36 def checkle(result, source, data={}, templates={}): 
     33    assert result == t3.renders(templates, **variables) 
     34 
     35 
     36def checkle(result, source, templates={}, **variables): 
    3737    # Check with template compiled from source 
    3838    t1 = ul4c.compile(source) 
    39     assert result <= t1.renders(data, templates) 
     39    assert result <= t1.renders(templates, **variables) 
    4040 
    4141    # Check with template loaded again via the string interface 
    4242    t2 = ul4c.loads(t1.dumps()) 
    43     assert result <= t2.renders(data, templates) 
     43    assert result <= t2.renders(templates, **variables) 
    4444 
    4545    # Check with template loaded again via the stream interface 
     
    4848    stream.seek(0) 
    4949    t3 = ul4c.load(stream) 
    50     assert result <= t3.renders(data, templates) 
     50    assert result <= t3.renders(templates, **variables) 
    5151 
    5252 
     
    6060 
    6161 
    62 def checkrunerror(msg, source, data={}, templates={}): 
     62def checkrunerror(msg, source, templates={}, **variables): 
    6363    # Check with template compiled from source 
    6464    t1 = ul4c.compile(source) 
    6565    try: 
    66         t1.renders(data, templates) 
     66        t1.renders(templates, **variables) 
    6767    except Exception, exc: 
    6868        assert re.search(msg, "%s.%s: %s" % (exc.__class__.__module__, exc.__class__.__name__, exc)) is not None 
     
    7373    t2 = ul4c.loads(t1.dumps()) 
    7474    try: 
    75         t2.renders(data, templates) 
     75        t2.renders(templates, **variables) 
    7676    except Exception, exc: 
    7777        assert re.search(msg, "%s.%s: %s" % (exc.__class__.__module__, exc.__class__.__name__, exc)) is not None 
     
    8585    t3 = ul4c.load(stream) 
    8686    try: 
    87         t3.renders(data, templates) 
     87        t3.renders(templates, **variables) 
    8888    except Exception, exc: 
    8989        assert re.search(msg, "%s.%s: %s" % (exc.__class__.__module__, exc.__class__.__name__, exc)) is not None 
     
    241241 
    242242def test_for_string(): 
    243     check('', '<?for c in data?>(<?print c?>)<?end for?>', "") 
    244     check('(g)(u)(r)(k)', '<?for c in data?>(<?print c?>)<?end for?>', "gurk") 
     243    check('', '<?for c in data?>(<?print c?>)<?end for?>', data="") 
     244    check('(g)(u)(r)(k)', '<?for c in data?>(<?print c?>)<?end for?>', data="gurk") 
    245245 
    246246 
    247247def test_for_list(): 
    248     check('', '<?for c in data?>(<?print c?>)<?end for?>', "") 
    249     check('(g)(u)(r)(k)', '<?for c in data?>(<?print c?>)<?end for?>', ["g", "u", "r", "k"]) 
     248    check('', '<?for c in data?>(<?print c?>)<?end for?>', data="") 
     249    check('(g)(u)(r)(k)', '<?for c in data?>(<?print c?>)<?end for?>', data=["g", "u", "r", "k"]) 
    250250 
    251251 
    252252def test_for_dict(): 
    253     check('', '<?for c in data?>(<?print c?>)<?end for?>', {}) 
    254     check('(a)(b)(c)', '<?for c in sorted(data)?>(<?print c?>)<?end for?>', dict(a=1, b=2, c=3)) 
     253    check('', '<?for c in data?>(<?print c?>)<?end for?>', data={}) 
     254    check('(a)(b)(c)', '<?for c in sorted(data)?>(<?print c?>)<?end for?>', data=dict(a=1, b=2, c=3)) 
    255255 
    256256 
    257257def test_for_nested(): 
    258     check('[(1)(2)][(3)(4)]', '<?for list in data?>[<?for n in list?>(<?print n?>)<?end for?>]<?end for?>', [[1, 2], [3, 4]]) 
     258    check('[(1)(2)][(3)(4)]', '<?for list in data?>[<?for n in list?>(<?print n?>)<?end for?>]<?end for?>', data=[[1, 2], [3, 4]]) 
    259259 
    260260 
    261261def test_if(): 
    262     check('42', '<?if data?><?print data?><?end if?>', 42) 
     262    check('42', '<?if data?><?print data?><?end if?>', data=42) 
    263263 
    264264 
    265265def test_else(): 
    266     check('42', '<?if data?><?print data?><?else?>no<?end if?>', 42) 
    267     check('no', '<?if data?><?print data?><?else?>no<?end if?>', 0) 
     266    check('42', '<?if data?><?print data?><?else?>no<?end if?>', data=42) 
     267    check('no', '<?if data?><?print data?><?else?>no<?end if?>', data=0) 
    268268 
    269269 
     
    294294    check('42', '<?code x=21?><?code y=21?><?print x+y?>') 
    295295    check('foobar', '<?code x="foo"?><?code y="bar"?><?print x+y?>') 
    296     check('(f)(o)(o)(b)(a)(r)', '<?for i in data.foo+data.bar?>(<?print i?>)<?end for?>', dict(foo="foo", bar="bar")) 
     296    check('(f)(o)(o)(b)(a)(r)', '<?for i in data.foo+data.bar?>(<?print i?>)<?end for?>', data=dict(foo="foo", bar="bar")) 
    297297 
    298298 
     
    306306    check(17*"foo", '<?code x=17?><?code y="foo"?><?print x*y?>') 
    307307    check("foo"*17, '<?code x="foo"?><?code y=17?><?print x*y?>') 
    308     check("(foo)(bar)(foo)(bar)(foo)(bar)", '<?for i in 3*data?>(<?print i?>)<?end for?>', ["foo", "bar"]) 
     308    check("(foo)(bar)(foo)(bar)(foo)(bar)", '<?for i in 3*data?>(<?print i?>)<?end for?>', data=["foo", "bar"]) 
    309309 
    310310 
     
    343343    check("14", '<?print --2+--3*--4?>') 
    344344    check("14", '<?print (-(-2))+(-((-3)*-(-4)))?>') 
    345     check("42", '<?print 2*data.value?>', dict(value=21)) 
    346     check("42", '<?print data.value[0]?>', dict(value=[42])) 
    347     check("42", '<?print data[0].value?>', [dict(value=42)]) 
    348     check("42", '<?print data[0][0][0]?>', [[[42]]]) 
    349     check("42", '<?print data.value.value[0]?>', dict(value=dict(value=[42]))) 
    350     check("42", '<?print data.value.value[0].value.value[0]?>', dict(value=dict(value=[dict(value=dict(value=[42]))]))) 
     345    check("42", '<?print 2*data.value?>', data=dict(value=21)) 
     346    check("42", '<?print data.value[0]?>', data=dict(value=[42])) 
     347    check("42", '<?print data[0].value?>', data=[dict(value=42)]) 
     348    check("42", '<?print data[0][0][0]?>', data=[[[42]]]) 
     349    check("42", '<?print data.value.value[0]?>', data=dict(value=dict(value=[42]))) 
     350    check("42", '<?print data.value.value[0].value.value[0]?>', data=dict(value=dict(value=[dict(value=dict(value=[42]))]))) 
    351351 
    352352 
     
    372372    checkrunerror("function u?'xmlescape' unknown", "<?print xmlescape()?>") 
    373373    checkrunerror("function u?'xmlescape' unknown", "<?print xmlescape(1, 2)?>") 
    374     check("&lt;&gt;&amp;&#39;&quot;gurk", "<?print xmlescape(data)?>", '<>&\'"gurk') 
     374    check("&lt;&gt;&amp;&#39;&quot;gurk", "<?print xmlescape(data)?>", data='<>&\'"gurk') 
    375375 
    376376 
     
    378378    checkrunerror("function u?'str' unknown", "<?print str()?>") 
    379379    checkrunerror("function u?'str' unknown", "<?print str(1, 2)?>") 
    380     check("", "<?print str(data)?>", None) 
    381     check("True", "<?print str(data)?>", True) 
    382     check("False", "<?print str(data)?>", False) 
    383     check("42", "<?print str(data)?>", 42) 
    384     check("4.2", "<?print str(data)?>", 4.2) 
    385     check("foo", "<?print str(data)?>", "foo") 
     380    check("", "<?print str(data)?>", data=None) 
     381    check("True", "<?print str(data)?>", data=True) 
     382    check("False", "<?print str(data)?>", data=False) 
     383    check("42", "<?print str(data)?>", data=42) 
     384    check("4.2", "<?print str(data)?>", data=4.2) 
     385    check("foo", "<?print str(data)?>", data="foo") 
    386386 
    387387 
     
    389389    checkrunerror("function u?'int' unknown", "<?print int()?>") 
    390390    checkrunerror("function u?'int' unknown", "<?print int(1, 2)?>") 
    391     checkrunerror("int\\(\\) argument must be a string or a number, not 'NoneType'", "<?print int(data)?>", None) 
    392     check("1", "<?print int(data)?>", True) 
    393     check("0", "<?print int(data)?>", False) 
    394     check("42", "<?print int(data)?>", 42) 
    395     check("4", "<?print int(data)?>", 4.2) 
    396     check("42", "<?print int(data)?>", "42") 
    397     checkrunerror("invalid literal for int\\(\\) with base 10: 'foo'", "<?print int(data)?>", "foo") 
     391    checkrunerror("int\\(\\) argument must be a string or a number, not 'NoneType'", "<?print int(data)?>", data=None) 
     392    check("1", "<?print int(data)?>", data=True) 
     393    check("0", "<?print int(data)?>", data=False) 
     394    check("42", "<?print int(data)?>", data=42) 
     395    check("4", "<?print int(data)?>", data=4.2) 
     396    check("42", "<?print int(data)?>", data="42") 
     397    checkrunerror("invalid literal for int\\(\\) with base 10: 'foo'", "<?print int(data)?>", data="foo") 
    398398 
    399399 
     
    401401    checkrunerror("function u?'len' unknown", "<?print len()?>") 
    402402    checkrunerror("function u?'len' unknown", "<?print len(1, 2)?>") 
    403     checkrunerror("object of type 'NoneType' has no len", "<?print len(data)?>", None) 
    404     checkrunerror("object of type 'bool' has no len", "<?print len(data)?>", True) 
    405     checkrunerror("object of type 'bool' has no len", "<?print len(data)?>", False) 
    406     checkrunerror("object of type 'int' has no len", "<?print len(data)?>", 42) 
    407     checkrunerror("object of type 'float' has no len", "<?print len(data)?>", 4.2) 
    408     check("42", "<?print len(data)?>", 42*"?") 
    409     check("42", "<?print len(data)?>", 42*[None]) 
    410     check("42", "<?print len(data)?>", dict.fromkeys(xrange(42))) 
     403    checkrunerror("object of type 'NoneType' has no len", "<?print len(data)?>", data=None) 
     404    checkrunerror("object of type 'bool' has no len", "<?print len(data)?>", data=True) 
     405    checkrunerror("object of type 'bool' has no len", "<?print len(data)?>", data=False) 
     406    checkrunerror("object of type 'int' has no len", "<?print len(data)?>", data=42) 
     407    checkrunerror("object of type 'float' has no len", "<?print len(data)?>", data=4.2) 
     408    check("42", "<?print len(data)?>", data=42*"?") 
     409    check("42", "<?print len(data)?>", data=42*[None]) 
     410    check("42", "<?print len(data)?>", data=dict.fromkeys(xrange(42))) 
    411411 
    412412 
     
    415415    checkrunerror("function u?'enumerate' unknown", "<?print enumerate(1, 2)?>") 
    416416    code = "<?for (i, value) in enumerate(data)?><?print i?>:<?print value?>\n<?end for?>" 
    417     checkrunerror("'NoneType' object is not iterable", code, None) 
    418     checkrunerror("'bool' object is not iterable", code, True) 
    419     checkrunerror("'bool' object is not iterable", code, False) 
    420     checkrunerror("'int' object is not iterable", code, 42) 
    421     checkrunerror("'float' object is not iterable", code, 4.2) 
    422     check("0:f\n1:o\n2:o\n", code, "foo") 
    423     check("0:foo\n1:bar\n", code, ["foo", "bar"]) 
    424     check("0:foo\n", code, dict(foo=True)) 
     417    checkrunerror("'NoneType' object is not iterable", code, data=None) 
     418    checkrunerror("'bool' object is not iterable", code, data=True) 
     419    checkrunerror("'bool' object is not iterable", code, data=False) 
     420    checkrunerror("'int' object is not iterable", code, data=42) 
     421    checkrunerror("'float' object is not iterable", code, data=4.2) 
     422    check("0:f\n1:o\n2:o\n", code, data="foo") 
     423    check("0:foo\n1:bar\n", code, data=["foo", "bar"]) 
     424    check("0:foo\n", code, data=dict(foo=True)) 
    425425 
    426426 
     
    429429    checkrunerror("function u?'isnone' unknown", "<?print isnone(1, 2)?>") 
    430430    code = "<?print isnone(data)?>" 
    431     check("True", code, None) 
    432     check("False", code, True) 
    433     check("False", code, False) 
    434     check("False", code, 42) 
    435     check("False", code, 4.2) 
    436     check("False", code, "foo") 
    437     check("False", code, datetime.datetime.now()) 
    438     check("False", code, ()) 
    439     check("False", code, []) 
    440     check("False", code, {}) 
     431    check("True", code, data=None) 
     432    check("False", code, data=True) 
     433    check("False", code, data=False) 
     434    check("False", code, data=42) 
     435    check("False", code, data=4.2) 
     436    check("False", code, data="foo") 
     437    check("False", code, data=datetime.datetime.now()) 
     438    check("False", code, data=()) 
     439    check("False", code, data=[]) 
     440    check("False", code, data={}) 
    441441 
    442442 
     
    445445    checkrunerror("function u?'isbool' unknown", "<?print isbool(1, 2)?>") 
    446446    code = "<?print isbool(data)?>" 
    447     check("False", code, None) 
    448     check("True", code, True) 
    449     check("True", code, False) 
    450     check("False", code, 42) 
    451     check("False", code, 4.2) 
    452     check("False", code, "foo") 
    453     check("False", code, datetime.datetime.now()) 
    454     check("False", code, ()) 
    455     check("False", code, []) 
    456     check("False", code, {}) 
     447    check("False", code, data=None) 
     448    check("True", code, data=True) 
     449    check("True", code, data=False) 
     450    check("False", code, data=42) 
     451    check("False", code, data=4.2) 
     452    check("False", code, data="foo") 
     453    check("False", code, data=datetime.datetime.now()) 
     454    check("False", code, data=()) 
     455    check("False", code, data=[]) 
     456    check("False", code, data={}) 
    457457 
    458458 
     
    461461    checkrunerror("function u?'isint' unknown", "<?print isint(1, 2)?>") 
    462462    code = "<?print isint(data)?>" 
    463     check("False", code, None) 
    464     check("False", code, True) 
    465     check("False", code, False) 
    466     check("True", code, 42) 
    467     check("False", code, 4.2) 
    468     check("False", code, "foo") 
    469     check("False", code, datetime.datetime.now()) 
    470     check("False", code, ()) 
    471     check("False", code, []) 
    472     check("False", code, {}) 
     463    check("False", code, data=None) 
     464    check("False", code, data=True) 
     465    check("False", code, data=False) 
     466    check("True", code, data=42) 
     467    check("False", code, data=4.2) 
     468    check("False", code, data="foo") 
     469    check("False", code, data=datetime.datetime.now()) 
     470    check("False", code, data=()) 
     471    check("False", code, data=[]) 
     472    check("False", code, data={}) 
    473473 
    474474 
     
    477477    checkrunerror("function u?'isfloat' unknown", "<?print isfloat(1, 2)?>") 
    478478    code = "<?print isfloat(data)?>" 
    479     check("False", code, None) 
    480     check("False", code, True) 
    481     check("False", code, False) 
    482     check("False", code, 42) 
    483     check("True", code, 4.2) 
    484     check("False", code, "foo") 
    485     check("False", code, datetime.datetime.now()) 
    486     check("False", code, ()) 
    487     check("False", code, []) 
    488     check("False", code, {}) 
     479    check("False", code, data=None) 
     480    check("False", code, data=True) 
     481    check("False", code, data=False) 
     482    check("False", code, data=42) 
     483    check("True", code, data=4.2) 
     484    check("False", code, data="foo") 
     485    check("False", code, data=datetime.datetime.now()) 
     486    check("False", code, data=()) 
     487    check("False", code, data=[]) 
     488    check("False", code, data={}) 
    489489 
    490490 
     
    493493    checkrunerror("function u?'isstr' unknown", "<?print isstr(1, 2)?>") 
    494494    code = "<?print isstr(data)?>" 
    495     check("False", code, None) 
    496     check("False", code, True) 
    497     check("False", code, False) 
    498     check("False", code, 42) 
    499     check("False", code, 4.2) 
    500     check("True", code, "foo") 
    501     check("False", code, datetime.datetime.now()) 
    502     check("False", code, ()) 
    503     check("False", code, []) 
    504     check("False", code, {}) 
     495    check("False", code, data=None) 
     496    check("False", code, data=True) 
     497    check("False", code, data=False) 
     498    check("False", code, data=42) 
     499    check("False", code, data=4.2) 
     500    check("True", code, data="foo") 
     501    check("False", code, data=datetime.datetime.now()) 
     502    check("False", code, data=()) 
     503    check("False", code, data=[]) 
     504    check("False", code, data={}) 
    505505 
    506506 
     
    509509    checkrunerror("function u?'isdate' unknown", "<?print isdate(1, 2)?>") 
    510510    code = "<?print isdate(data)?>" 
    511     check("False", code, None) 
    512     check("False", code, True) 
    513     check("False", code, False) 
    514     check("False", code, 42) 
    515     check("False", code, 4.2) 
    516     check("False", code, "foo") 
    517     check("True", code, datetime.datetime.now()) 
    518     check("False", code, ()) 
    519     check("False", code, []) 
    520     check("False", code, {}) 
     511    check("False", code, data=None) 
     512    check("False", code, data=True) 
     513    check("False", code, data=False) 
     514    check("False", code, data=42) 
     515    check("False", code, data=4.2) 
     516    check("False", code, data="foo") 
     517    check("True", code, data=datetime.datetime.now()) 
     518    check("False", code, data=()) 
     519    check("False", code, data=[]) 
     520    check("False", code, data={}) 
    521521 
    522522 
     
    525525    checkrunerror("function u?'islist' unknown", "<?print islist(1, 2)?>") 
    526526    code = "<?print islist(data)?>" 
    527     check("False", code, None) 
    528     check("False", code, True) 
    529     check("False", code, False) 
    530     check("False", code, 42) 
    531     check("False", code, 4.2) 
    532     check("False", code, "foo") 
    533     check("False", code, datetime.datetime.now()) 
    534     check("True", code, ()) 
    535     check("True", code, []) 
    536     check("False", code, {}) 
     527    check("False", code, data=None) 
     528    check("False", code, data=True) 
     529    check("False", code, data=False) 
     530    check("False", code, data=42) 
     531    check("False", code, data=4.2) 
     532    check("False", code, data="foo") 
     533    check("False", code, data=datetime.datetime.now()) 
     534    check("True", code, data=()) 
     535    check("True", code, data=[]) 
     536    check("False", code, data={}) 
    537537 
    538538 
     
    541541    checkrunerror("function u?'isdict' unknown", "<?print isdict(1, 2)?>") 
    542542    code = "<?print isdict(data)?>" 
    543     check("False", code, None) 
    544     check("False", code, True) 
    545     check("False", code, False) 
    546     check("False", code, 42) 
    547     check("False", code, 4.2) 
    548     check("False", code, "foo") 
    549     check("False", code, datetime.datetime.now()) 
    550     check("False", code, ()) 
    551     check("False", code, []) 
    552     check("True", code, {}) 
     543    check("False", code, data=None) 
     544    check("False", code, data=True) 
     545    check("False", code, data=False) 
     546    check("False", code, data=42) 
     547    check("False", code, data=4.2) 
     548    check("False", code, data="foo") 
     549    check("False", code, data=datetime.datetime.now()) 
     550    check("False", code, data=()) 
     551    check("False", code, data=[]) 
     552    check("True", code, data={}) 
    553553 
    554554 
     
    557557    checkrunerror("function u?'repr' unknown", "<?print repr(1, 2)?>") 
    558558    code = "<?print repr(data)?>" 
    559     check("None", code, None) 
    560     check("True", code, True) 
    561     check("False", code, False) 
    562     check("42", code, 42) 
     559    check("None", code, data=None) 
     560    check("True", code, data=True) 
     561    check("False", code, data=False) 
     562    check("42", code, data=42) 
    563563    # no test for float 
    564     check("'foo'", code, "foo") 
     564    check("'foo'", code, data="foo") 
    565565    # no test for tuples, lists and dicts 
    566566 
     
    570570    checkrunerror("function u?'chr' unknown", "<?print chr(1, 2)?>") 
    571571    code = "<?print chr(data)?>" 
    572     check("\x00", code, 0) 
    573     check("a", code, ord("a")) 
    574     check(u"\u20ac", code, 0x20ac) 
     572    check("\x00", code, data=0) 
     573    check("a", code, data=ord("a")) 
     574    check(u"\u20ac", code, data=0x20ac) 
    575575 
    576576 
     
    579579    checkrunerror("function u?'ord' unknown", "<?print ord(1, 2)?>") 
    580580    code = "<?print ord(data)?>" 
    581     check("0", code, "\x00") 
    582     check(str(ord("a")), code, "a") 
    583     check(str(0x20ac), code, u"\u20ac") 
     581    check("0", code, data="\x00") 
     582    check(str(ord("a")), code, data="a") 
     583    check(str(0x20ac), code, data=u"\u20ac") 
    584584 
    585585 
     
    588588    checkrunerror("function u?'hex' unknown", "<?print hex(1, 2)?>") 
    589589    code = "<?print hex(data)?>" 
    590     check("0x0", code, 0) 
    591     check("0xff", code, 0xff) 
    592     check("0xffff", code, 0xffff) 
    593     check("-0xffff", code, -0xffff) 
     590    check("0x0", code, data=0) 
     591    check("0xff", code, data=0xff) 
     592    check("0xffff", code, data=0xffff) 
     593    check("-0xffff", code, data=-0xffff) 
    594594 
    595595 
     
    598598    checkrunerror("function u?'oct' unknown", "<?print oct(1, 2)?>") 
    599599    code = "<?print oct(data)?>" 
    600     check("0o0", code, 0) 
    601     check("0o77", code, 077) 
    602     check("0o7777", code, 07777) 
    603     check("-0o7777", code, -07777) 
     600    check("0o0", code, data=0) 
     601    check("0o77", code, data=077) 
     602    check("0o7777", code, data=07777) 
     603    check("-0o7777", code, data=-07777) 
    604604 
    605605 
     
    608608    checkrunerror("function u?'bin' unknown", "<?print bin(1, 2)?>") 
    609609    code = "<?print bin(data)?>" 
    610     check("0b0", code, 0) 
    611     check("0b11", code, 3) 
    612     check("-0b1111", code, -15) 
     610    check("0b0", code, data=0) 
     611    check("0b11", code, data=3) 
     612    check("-0b1111", code, data=-15) 
    613613 
    614614 
     
    617617    checkrunerror("function u?'sorted' unknown", "<?print sorted(1, 2)?>") 
    618618    code = "<?for i in sorted(data)?><?print i?><?end for?>" 
    619     check("gkru", code, "gurk") 
    620     check("24679", code, "92746") 
    621     check("012", code, {0: "zero", 1: "one", 2: "two"}) 
     619    check("gkru", code, data="gurk") 
     620    check("24679", code, data="92746") 
     621    check("012", code, data={0: "zero", 1: "one", 2: "two"}) 
    622622 
    623623 
     
    625625    checkrunerror("function u?'sorted' unknown", "<?print sorted()?>") 
    626626    code = "<?for i in range(data)?><?print i?><?end for?>" 
    627     check("", code, -10) 
    628     check("", code, 0) 
    629     check("0", code, 1) 
    630     check("01234", code, 5) 
     627    check("", code, data=-10) 
     628    check("", code, data=0) 
     629    check("0", code, data=1) 
     630    check("01234", code, data=5) 
    631631    code = "<?for i in range(data[0], data[1])?><?print i?><?end for?>" 
    632     check("", code, [0, -10]) 
    633     check("", code, [0, 0]) 
    634     check("01234", code, [0, 5]) 
    635     check("-5-4-3-2-101234", code, [-5, 5]) 
     632    check("", code, data=[0, -10]) 
     633    check("", code, data=[0, 0]) 
     634    check("01234", code, data=[0, 5]) 
     635    check("-5-4-3-2-101234", code, data=[-5, 5]) 
    636636    code = "<?for i in range(data[0], data[1], data[2])?><?print i?><?end for?>" 
    637     check("", code, [0, -10, 1]) 
    638     check("", code, [0, 0, 1]) 
    639     check("02468", code, [0, 10, 2]) 
    640     check("", code, [0, 10, -2]) 
    641     check("108642", code, [10, 0, -2]) 
    642     check("", code, [10, 0, 2]) 
     637    check("", code, data=[0, -10, 1]) 
     638    check("", code, data=[0, 0, 1]) 
     639    check("02468", code, data=[0, 10, 2]) 
     640    check("", code, data=[0, 10, -2]) 
     641    check("108642", code, data=[10, 0, -2]) 
     642    check("", code, data=[10, 0, 2]) 
    643643 
    644644 
     
    693693    now = datetime.datetime.now() 
    694694    format = "%Y-%m-%d %H:%M:%S" 
    695     check(now.strftime(format), r"<?print data.format('%s')?>" % format, now) 
     695    check(now.strftime(format), r"<?print data.format('%s')?>" % format, data=now) 
    696696 
    697697 
    698698def test_method_isoformat(): 
    699699    now = datetime.datetime.now() 
    700     check(now.isoformat(), r"<?print data.isoformat()?>", now) 
     700    check(now.isoformat(), r"<?print data.isoformat()?>", data=now) 
    701701 
    702702 
    703703def test_render(): 
    704     t = ul4c.compile('(<?print data?>)') 
    705     check('(f)(o)(o)', '<?for i in data?><?render t(i)?><?end for?>', 'foo', dict(t=t)) 
     704    t = ul4c.compile('<?print prefix?><?print data?><?print suffix?>') 
     705    check('(f)(o)(o)', '<?for i in data?><?render t(data=i, prefix="(", suffix=")")?><?end for?>', dict(t=t), data='foo') 
    706706 
    707707 
    708708def test_parse(): 
    709     check('42', '<?print data.Noner?>', dict(Noner=42)) 
     709    check('42', '<?print data.Noner?>', data=dict(Noner=42))