Changeset 3436:438c855ebaa7 in livinglogic.python.xist

Show
Ignore:
Timestamp:
07/01/08 22:18:37 (11 years ago)
Author:
Walter Doerwald <walter@…>
Branch:
default
Message:

Add date objects, a now() function, and format() and isoformat() methods.

Files:
3 modified

Legend:

Unmodified
Added
Removed
  • docs/UL4.rst

    r3432 r3436  
    6464    *   integers 
    6565    *   floats 
     66    *   date objects 
    6667    *   The "null" value (``None``) 
    6768    *   boolean values (``True`` and ``False``) 
     
    310311 
    311312 
     313``now`` 
     314::::::: 
     315 
     316``now()`` returns the current date and time as a data object. 
     317 
     318 
    312319``isnone`` 
    313320:::::::::: 
     
    344351 
    345352``isstr(foo)`` returns ``True`` if ``foo`` is a string object, else ``False`` 
     353is returned. 
     354 
     355 
     356``isdate`` 
     357:::::::::: 
     358 
     359``isdate(foo)`` returns ``True`` if ``foo`` is a date object, else ``False`` 
    346360is returned. 
    347361 
  • src/ll/ul4c.py

    r3430 r3436  
    2424 
    2525 
    26 import marshal, re, StringIO 
     26import re, datetime, marshal, StringIO 
    2727 
    2828from ll import spark 
     
    684684            _code("def %s(data, templates={}):" % function) 
    685685            indent += 1 
    686         _code("import sys, marshal") 
     686        _code("import sys, marshal, datetime") 
    687687        _code("from ll.misc import xmlescape") 
    688688        _code("from ll import ul4c") 
     
    784784                    _code("reg%d = reg%d %% reg%d" % (opcode.r1, opcode.r2, opcode.r3)) 
    785785                elif opcode.code == "callfunc0": 
    786                     raise UnknownFunctionError(opcode.arg) 
     786                    if opcode.arg == "now": 
     787                        _code("reg%d = datetime.datetime.now()" % (opcode.r1)) 
     788                    else: 
     789                        raise UnknownFunctionError(opcode.arg) 
    787790                elif opcode.code == "callfunc1": 
    788791                    if opcode.arg == "xmlescape": 
     
    808811                    elif opcode.arg == "isbool": 
    809812                        _code("reg%d = isinstance(reg%d, bool)" % (opcode.r1, opcode.r2)) 
     813                    elif opcode.arg == "isdate": 
     814                        _code("reg%d = isinstance(reg%d, datetime.datetime)" % (opcode.r1, opcode.r2)) 
    810815                    elif opcode.arg == "islist": 
    811816                        _code("reg%d = isinstance(reg%d, (list, tuple))" % (opcode.r1, opcode.r2)) 
     
    841846                        raise UnknownFunctionError(opcode.arg) 
    842847                elif opcode.code == "callmeth0": 
    843                     if opcode.arg in ("split", "rsplit", "strip", "lstrip", "rstrip", "upper", "lower"): 
     848                    if opcode.arg in ("split", "rsplit", "strip", "lstrip", "rstrip", "upper", "lower", "isoformat"): 
    844849                        _code("reg%d = reg%d.%s()" % (opcode.r1, opcode.r2, opcode.arg)) 
    845850                    elif opcode.arg == "items": 
     
    850855                    if opcode.arg in ("split", "rsplit", "strip", "lstrip", "rstrip", "startswith", "endswith", "find"): 
    851856                        _code("reg%d = reg%d.%s(reg%d)" % (opcode.r1, opcode.r2, opcode.arg, opcode.r3)) 
     857                    elif opcode.arg == "format": 
     858                        _code("reg%d = ul4c._format(reg%d, reg%d)" % (opcode.r1, opcode.r2, opcode.r3)) 
    852859                    else: 
    853860                        raise UnknownMethodError(opcode.arg) 
     
    19341941        value >>= 1 
    19351942    return prefix+"".join(v)[::-1] 
     1943 
     1944 
     1945def _format(obj, format): 
     1946    """ 
     1947    Helper for the ``format`` method. 
     1948    """ 
     1949    if isinstance(obj, datetime.datetime): 
     1950        return obj.strftime(format.encode("utf-8")) 
     1951    else: 
     1952        return obj.format(format) # This will raise a ``AttributeError`` 
  • test/test_ul4.py

    r3435 r3436  
    1010 
    1111 
    12 import re, StringIO 
     12import re, datetime, StringIO 
    1313 
    1414import py.test 
     
    2020    # Check with template compiled from source 
    2121    t1 = ul4c.compile(source) 
    22     assert t1.renders(data, templates) == result 
     22    assert result == t1.renders(data, templates) 
    2323 
    2424    # Check with template loaded again via the string interface 
    2525    t2 = ul4c.loads(t1.dumps()) 
    26     assert t2.renders(data, templates) == result 
     26    assert result == t2.renders(data, templates) 
    2727 
    2828    # Check with template loaded again via the stream interface 
     
    3131    stream.seek(0) 
    3232    t3 = ul4c.load(stream) 
    33     assert t3.renders(data, templates) == result 
     33    assert result == t3.renders(data, templates) 
     34 
     35 
     36def checkle(result, source, data={}, templates={}): 
     37    # Check with template compiled from source 
     38    t1 = ul4c.compile(source) 
     39    assert result <= t1.renders(data, templates) 
     40 
     41    # Check with template loaded again via the string interface 
     42    t2 = ul4c.loads(t1.dumps()) 
     43    assert result <= t2.renders(data, templates) 
     44 
     45    # Check with template loaded again via the stream interface 
     46    stream = StringIO.StringIO() 
     47    t1.dump(stream) 
     48    stream.seek(0) 
     49    t3 = ul4c.load(stream) 
     50    assert result <= t3.renders(data, templates) 
    3451 
    3552 
     
    317334 
    318335 
     336def test_function_now(): 
     337    checkrunerror("function u?'now' unknown", "<?print now(1)?>") 
     338    checkrunerror("function u?'now' unknown", "<?print now(1, 2)?>") 
     339    now = unicode(datetime.datetime.now()) 
     340    checkle(now, "<?print now()?>") 
     341 
     342 
    319343def test_function_xmlescape(): 
    320344    checkrunerror("function u?'xmlescape' unknown", "<?print xmlescape()?>") 
     
    383407    check("False", code, 4.2) 
    384408    check("False", code, "foo") 
     409    check("False", code, datetime.datetime.now()) 
    385410    check("False", code, ()) 
    386411    check("False", code, []) 
     
    398423    check("False", code, 4.2) 
    399424    check("False", code, "foo") 
     425    check("False", code, datetime.datetime.now()) 
    400426    check("False", code, ()) 
    401427    check("False", code, []) 
     
    413439    check("False", code, 4.2) 
    414440    check("False", code, "foo") 
     441    check("False", code, datetime.datetime.now()) 
    415442    check("False", code, ()) 
    416443    check("False", code, []) 
     
    428455    check("True", code, 4.2) 
    429456    check("False", code, "foo") 
     457    check("False", code, datetime.datetime.now()) 
    430458    check("False", code, ()) 
    431459    check("False", code, []) 
     
    443471    check("False", code, 4.2) 
    444472    check("True", code, "foo") 
     473    check("False", code, datetime.datetime.now()) 
     474    check("False", code, ()) 
     475    check("False", code, []) 
     476    check("False", code, {}) 
     477 
     478 
     479def test_function_isdate(): 
     480    checkrunerror("function u?'isdate' unknown", "<?print isdate()?>") 
     481    checkrunerror("function u?'isdate' unknown", "<?print isdate(1, 2)?>") 
     482    code = "<?print isdate(data)?>" 
     483    check("False", code, None) 
     484    check("False", code, True) 
     485    check("False", code, False) 
     486    check("False", code, 42) 
     487    check("False", code, 4.2) 
     488    check("False", code, "foo") 
     489    check("True", code, datetime.datetime.now()) 
    445490    check("False", code, ()) 
    446491    check("False", code, []) 
     
    458503    check("False", code, 4.2) 
    459504    check("False", code, "foo") 
     505    check("False", code, datetime.datetime.now()) 
    460506    check("True", code, ()) 
    461507    check("True", code, []) 
     
    473519    check("False", code, 4.2) 
    474520    check("False", code, "foo") 
     521    check("False", code, datetime.datetime.now()) 
    475522    check("False", code, ()) 
    476523    check("False", code, []) 
     
    615662 
    616663 
     664def test_method_format(): 
     665    now = datetime.datetime.now() 
     666    format = "%Y-%m-%d %H:%M:%S" 
     667    check(now.strftime(format), r"<?print data.format('%s')?>" % format, now) 
     668 
     669 
     670def test_method_isoformat(): 
     671    now = datetime.datetime.now() 
     672    check(now.isoformat(), r"<?print data.isoformat()?>", now) 
     673 
     674 
    617675def test_render(): 
    618676    t = ul4c.compile('(<?print data?>)')