Changeset 4319:294888693714 in livinglogic.python.xist

Show
Ignore:
Timestamp:
02/07/11 14:26:35 (8 years ago)
Author:
Walter Doerwald <walter@…>
Branch:
default
Message:

Fix path for spc.gif and ul4.js again.

Files:
7 modified

Legend:

Unmodified
Added
Removed
  • MANIFEST.in

    r4318 r4319  
    1111recursive-include demos * 
    1212recursive-include scripts *.py 
    13 include src/data/px/spc.gif 
    14 include src/data/js/ul4.js 
     13include src/ll/data/px/spc.gif 
     14include src/ll/data/js/ul4.js 
  • NEWS.rst

    r4315 r4319  
    1414*   :func:`misc.javastring` has been renamed to :func:`misc.javaexpr` can can 
    1515    now produce the Java sourcecode for more types. 
     16 
     17*   The UL4 method ``isoformat`` now omits the time part if it is ``00:00:00``. 
     18 
     19*   The UL4 function ``repr`` now prodcues a valid UL4 date literal for date 
     20    objects. 
     21 
    1622 
    1723 
  • src/ll/data/js/ul4.js

    r4307 r4319  
    11471147        if (!this._fu_isdate(obj)) 
    11481148            throw "isoformat() requires a date"; 
    1149         var result = obj.getFullYear() + "-" + this._lpad((obj.getMonth()+1).toString(), "0", 2) + "-" + this._lpad(obj.getDate().toString(), "0", 2) + "T" + this._lpad(obj.getHours().toString(), "0", 2) + ":" + this._lpad(obj.getMinutes().toString(), "0", 2) + ":" + this._lpad(obj.getSeconds().toString(), "0", 2) 
     1149        var result = obj.getFullYear() + "-" + this._lpad((obj.getMonth()+1).toString(), "0", 2) + "-" + this._lpad(obj.getDate().toString(), "0", 2); 
     1150        var hour = obj.getHours(); 
     1151        var minute = obj.getMinutes(); 
     1152        var second = obj.getSeconds(); 
    11501153        var ms = obj.getMilliseconds(); 
    1151         if (ms) 
    1152             result += "." + this._lpad(ms.toString(), "0", 3) + "000"; 
     1154        if (hour || minute || second || ms) 
     1155        { 
     1156            result += "T" + this._lpad(hour.toString(), "0", 2) + ":" + this._lpad(minute.toString(), "0", 2) + ":" + this._lpad(second.toString(), "0", 2); 
     1157            if (ms) 
     1158                result += "." + this._lpad(ms.toString(), "0", 3) + "000"; 
     1159        } 
    11531160        return result; 
    11541161    }, 
     
    15301537        var month = obj.getMonth()+1; 
    15311538        var day = obj.getDate(); 
    1532         var hours = obj.getHours(); 
    1533         var minutes = obj.getMinutes(); 
    1534         var seconds = obj.getSeconds(); 
    1535         var milliseconds = obj.getMilliseconds(); 
    1536         var result = "@" + year + "-" + this._lpad(month, "0", 2) + "-" + this._lpad(day, "0", 2) + "T" + this._lpad(hours, "0", 2) + ":" + this._lpad(minutes, "0", 2) + ":" + this._lpad(seconds, "0", 2); 
    1537         if (milliseconds) 
    1538             result += "." + this._lpad(milliseconds, "0", 3) + "000"; 
     1539        var hour = obj.getHours(); 
     1540        var minute = obj.getMinutes(); 
     1541        var second = obj.getSeconds(); 
     1542        var ms = obj.getMilliseconds(); 
     1543        var result = "@" + year + "-" + this._lpad(month.toString(), "0", 2) + "-" + this._lpad(day.toString(), "0", 2) + "T"; 
     1544 
     1545        if (hour || minute || second || ms) 
     1546        { 
     1547            result += this._lpad(hour.toString(), "0", 2) + ":" + this._lpad(minute.toString(), "0", 2) + ":" + this._lpad(second.toString(), "0", 2); 
     1548            if (ms) 
     1549                result += "." + this._lpad(ms.toString(), "0", 3) + "000"; 
     1550        } 
    15391551        return result; 
    15401552    }, 
  • src/ll/misc.py

    r4317 r4319  
    524524                v.append(u"\\u{:04x}".format(oc) if oc >= 128 else c) 
    525525        return u'"{}"'.format(u"".join(v)) 
    526     elif isinstance(obj, (datetime.date, datetime.datetime)): 
    527         return "com.livinglogic.ul4.Utils.isoparse({})".format(javaexpr(obj.isoformat())) 
     526    elif isinstance(obj, datetime.datetime): # check ``datetime`` before ``date``, as ``datetime`` is a subclass of ``date`` 
     527        return "com.livinglogic.ul4.Utils.makeDate({0.year}, {0.month}, {0.day}, {0.hour}, {0.minute}, {0.second}, {0.microsecond})".format(obj) 
     528    elif isinstance(obj, datetime.date): 
     529        return "com.livinglogic.ul4.Utils.makeDate({0.year}, {0.month}, {0.day})".format(obj) 
    528530    elif isinstance(obj, color.Color): 
    529531        return "new com.livinglogic.ul4.Color({}, {}, {}, {})".format(*obj) 
  • src/ll/ul4c.py

    r4315 r4319  
    2929 
    3030 
    31 # Regular expression used for splitting dates 
     31# Regular expression used for splitting dates in isoformat 
    3232datesplitter = re.compile("[-T:.]") 
    3333 
     
    12271227            raise UnknownFunctionError(opcode.arg) 
    12281228    def _dispatch_callmeth0(self, opcode): 
    1229         if opcode.arg in ("split", "rsplit", "strip", "lstrip", "rstrip", "upper", "lower", "capitalize", "isoformat", "r", "g", "b", "a", "hls", "hlsa", "hsv", "hsva", "lum", "weekday"): 
     1229        if opcode.arg in ("split", "rsplit", "strip", "lstrip", "rstrip", "upper", "lower", "capitalize", "r", "g", "b", "a", "hls", "hlsa", "hsv", "hsva", "lum", "weekday"): 
    12301230            self._line(opcode.location, "r{op.r1:d} = r{op.r2:d}.{op.arg}()".format(op=opcode)) 
    12311231        elif opcode.arg == "items": 
     
    12331233        elif opcode.arg == "render": 
    12341234            self._line(opcode.location, 'r{op.r1:d} = "".join(r{op.r2:d}())'.format(op=opcode)) 
    1235         elif opcode.arg in ("mimeformat", "yearday"): 
     1235        elif opcode.arg in ("mimeformat", "yearday", "isoformat"): 
    12361236            self._line(opcode.location, 'r{op.r1:d} = ul4c._{op.arg}(r{op.r2:d})'.format(op=opcode)) 
    12371237        elif opcode.arg in ("day", "month", "year", "hour", "minute", "second", "microsecond"): 
     
    17381738                (line, col) = lastloc.pos() 
    17391739                tag = lastloc.tag 
    1740                 self._do(u"// <?{}?> tag at {} (line {}, col {}): {}".format(lastloc.type, lastloc.starttag+1, line, col, repr(tag)[1+isinstance(tag, unicode):-1])) 
     1740                self._do(u"/* <?{}?> tag at {} (line {}, col {}): {} */".format(lastloc.type, lastloc.starttag+1, line, col, repr(tag)[1+isinstance(tag, unicode):-1])) 
    17411741            try: 
    17421742                getattr(self, "_dispatch_{}".format(opcode.code))(opcode) 
     
    17451745 
    17461746        # Add source and register declaration at the beginning 
    1747         lines.append(u"//@@@ BEGIN template source") 
     1747        lines.append(u"/*@@@ BEGIN template source */") 
    17481748        sourcelines = self.template.source.splitlines(False) 
    17491749        width = len(str(len(sourcelines))) 
    17501750        for (i, line) in enumerate(sourcelines): 
    1751             lines.append(u"// {1:{0}} {2}".format(width, i+1, line)) 
    1752         lines.append(u"//@@@ BEGIN template code") 
     1751            lines.append(u"/* {1:{0}} {2} */".format(width, i+1, line)) 
     1752        lines.append(u"/*@@@ BEGIN template code */") 
    17531753         
    17541754        for i in sorted(self._stack[-1].regsused): 
     
    17581758        lines.extend(self._stack[-1].lines) 
    17591759 
    1760         lines.append(u"//@@@ END template code") 
     1760        lines.append(u"/*@@@ END template code */") 
    17611761 
    17621762        v = [] 
     
    17861786    def _dispatch_None(self, opcode): 
    17871787        (line, col) = opcode.location.pos() 
    1788         self._do(u"// Literal at {} (line {}, col {})".format(opcode.location.starttag+1, line, col)) 
     1788        self._do(u"/* Literal at {} (line {}, col {}) */".format(opcode.location.starttag+1, line, col)) 
    17891789        self._do(self.output(misc.javaexpr(opcode.location.code))) 
    17901790    def _dispatch_loadstr(self, opcode): 
     
    18071807        self._usereg(opcode.r1) 
    18081808    def _dispatch_loaddate(self, opcode): 
    1809         self._do(u"r{op.r1} = com.livinglogic.ul4.Utils.isoDateFormatter.parse({arg});".format(op=opcode, arg=misc.javaexpr(opcode.arg))) 
     1809        self._do(u"r{op.r1} = com.livinglogic.ul4.Utils.makeDate({date});".format(op=opcode, date=", ".join(str(int(p)) for p in datesplitter.split(opcode.arg)))) 
    18101810        self._usereg(opcode.r1) 
    18111811    def _dispatch_loadcolor(self, opcode): 
     
    18621862        self._usereg(opcode.r1) 
    18631863    def _dispatch_print(self, opcode): 
    1864         self._do(self.output(u"org.apache.commons.lang.ObjectUtils.toString(r{op.r1})".format(op=opcode))) 
     1864        self._do(self.output(u"com.livinglogic.ul4.Utils.str(r{op.r1})".format(op=opcode))) 
    18651865    def _dispatch_printx(self, opcode): 
    18661866        self._do(self.output(u"com.livinglogic.ul4.Utils.xmlescape(r{op.r1})".format(op=opcode))) 
     
    18851885        self._do(u"{") 
    18861886        self._do(1) 
    1887         self._do(u"public void render(java.io.Writer out, Map<String, Object> variables) throws java.io.IOException") 
     1887        self._do(u"public void render(java.io.Writer out, java.util.Map<String, Object> variables) throws java.io.IOException") 
    18881888        self._do(u"{") 
    18891889        self._do(1) 
     
    19171917        self._usereg(opcode.r1) 
    19181918    def _dispatch_eq(self, opcode): 
    1919         self._do(u"r{op.r1} = org.apache.commons.lang.ObjectUtils.equals(r{op.r2}, r{op.r3});".format(op=opcode)) 
     1919        self._do(u"r{op.r1} = com.livinglogic.ul4.Utils.eq(r{op.r2}, r{op.r3});".format(op=opcode)) 
    19201920        self._usereg(opcode.r1) 
    19211921    def _dispatch_ne(self, opcode): 
    1922         self._do(u"r{op.r1} = !org.apache.commons.lang.ObjectUtils.equals(r{op.r2}, r{op.r3});".format(op=opcode)) 
     1922        self._do(u"r{op.r1} = com.livinglogic.ul4.Utils.ne(r{op.r2}, r{op.r3});".format(op=opcode)) 
    19231923        self._usereg(opcode.r1) 
    19241924    def _dispatch_lt(self, opcode): 
     
    19291929        self._usereg(opcode.r1) 
    19301930    def _dispatch_gt(self, opcode): 
    1931         self._do(u"r{op.r1} = !com.livinglogic.ul4.Utils.le(r{op.r2}, r{op.r3});".format(op=opcode)) 
     1931        self._do(u"r{op.r1} = !com.livinglogic.ul4.Utils.gt(r{op.r2}, r{op.r3});".format(op=opcode)) 
    19321932        self._usereg(opcode.r1) 
    19331933    def _dispatch_ge(self, opcode): 
    1934         self._do(u"r{op.r1} = !com.livinglogic.ul4.Utils.lt(r{op.r2}, r{op.r3});".format(op=opcode)) 
     1934        self._do(u"r{op.r1} = !com.livinglogic.ul4.Utils.ge(r{op.r2}, r{op.r3});".format(op=opcode)) 
    19351935        self._usereg(opcode.r1) 
    19361936    def _dispatch_add(self, opcode): 
     
    20022002            self._do(u"r{op.r1} = ((r{op.r2} != null) && (r{op.r2} instanceof com.livinglogic.ul4.Color));".format(op=opcode)) 
    20032003        elif opcode.arg == "get": 
    2004             self._do(u"r{op.r1} = {var}.get(r{op.r2});".format(op=opcode, var=variables)) 
     2004            self._do(u"r{op.r1} = {var}.get(r{op.r2});".format(op=opcode, var=self._stack[-1].variables)) 
    20052005        else: 
    20062006            raise UnknownFunctionError(opcode.arg) 
     
    20362036            self._do(u"r{op.r1} = ((com.livinglogic.ul4.Color)r{op.r2}).{op.arg}();".format(op=opcode)) 
    20372037        elif opcode.arg == "lum": 
    2038             self._do(u"r{op.r1} = new Double(((com.livinglogic.ul4.Color)r{op.r2}).lum());".format(op=opcode)) 
     2038            self._do(u"r{op.r1} = ((com.livinglogic.ul4.Color)r{op.r2}).lum();".format(op=opcode)) 
    20392039        else: 
    20402040            raise UnknownMethodError(opcode.arg) 
     
    20822082        self._do(u"}") 
    20832083    def _dispatch_render(self, opcode): 
    2084         self._do(u"((com.livinglogic.ul4.Template)r{op.r1}).render(out, (Map)r{op.r2});".format(op=opcode)) 
     2084        self._do(u"((com.livinglogic.ul4.Template)r{op.r1}).render(out, (java.util.Map)r{op.r2});".format(op=opcode)) 
    20852085 
    20862086 
     
    32283228        return unicode(repr(obj)) 
    32293229    elif isinstance(obj, datetime.datetime): 
    3230         return unicode(obj.isoformat()) 
     3230        s = unicode(obj.isoformat()) 
     3231        if s.endswith(u"T00:00:00"): 
     3232            return u"@{}T".format(s[:-9]) 
     3233        else: 
     3234            return u"@" + s 
     3235    elif isinstance(obj, datetime.date): 
     3236        return u"@{}T".format(obj.isoformat()) 
    32313237    elif isinstance(obj, color.Color): 
    32323238        if obj[3] == 0xff: 
     
    33403346    """ 
    33413347    return (obj - obj.__class__(obj.year, 1, 1)).days+1 
     3348 
     3349 
     3350def _isoformat(obj): 
     3351    """ 
     3352    Helper for the ``isoformat`` method. 
     3353    """ 
     3354    result = obj.isoformat() 
     3355    suffix = "T00:00:00" 
     3356    if result.endswith(suffix): 
     3357        return result[:-len(suffix)] 
     3358    return result 
  • test/test_misc.py

    r4312 r4319  
    280280    assert '"\\u20ac"' == misc.javaexpr(u"\u20ac") 
    281281    # list 
    282     assert "com.livinglogic.ul4.Utils.makeList()" == misc.javaexpr(()) 
    283     assert "com.livinglogic.ul4.Utils.makeList(1, 2, 3)" == misc.javaexpr([1, 2, 3]) 
     282    assert "java.util.Arrays.asList()" == misc.javaexpr(()) 
     283    assert "java.util.Arrays.asList(1, 2, 3)" == misc.javaexpr([1, 2, 3]) 
    284284    # dict 
    285285    assert "com.livinglogic.ul4.Utils.makeMap()" == misc.javaexpr({}) 
  • test/test_ul4.py

    r4309 r4319  
    1010 
    1111 
    12 import os, re, datetime, StringIO, json, contextlib, tempfile, collections 
     12import sys, os, re, datetime, StringIO, json, contextlib, tempfile, collections, shutil 
    1313 
    1414import py.test 
    1515 
    16 from ll import ul4c, color 
     16from ll import ul4c, color, misc 
    1717 
    1818 
     
    7979 
    8080 
     81@py.test.mark.js 
    8182def renderjs(__, **variables): 
    8283    # Check the Javascript version (this requires an installed ``d8`` shell from V8 (http://code.google.com/p/v8/)) 
     
    9798 
    9899 
     100javacodetemplate = u""" 
     101public class UL4Test 
     102{{ 
     103    public static void main(String[] args) throws java.io.UnsupportedEncodingException 
     104    {{ 
     105        com.livinglogic.ul4.Template template = new com.livinglogic.ul4.JSPTemplate() 
     106        {{ 
     107            public void render(java.io.Writer out, java.util.Map<String, Object> variables) throws java.io.IOException 
     108            {{ 
     109{template} 
     110            }} 
     111        }}; 
     112        java.util.Map<String, Object> variables = (java.util.Map<String, Object>){variables}; 
     113        String output = template.renders(variables); 
     114        // We can't use ``System.out.print`` here, because this gives us no control over the encoding 
     115        // Use ``System.out.write`` to make sure the output is in UTF-8 
     116        byte[] outputBytes = output.getBytes("utf-8"); 
     117        System.out.write(outputBytes, 0, outputBytes.length); 
     118    }} 
     119}} 
     120""".strip() 
     121 
     122 
     123@py.test.mark.java 
     124def renderjava(__, **variables): 
     125    # Check the Java version 
     126    __ = ul4c.compile(__) 
     127    java = __.javasource(indent=4) 
     128    tempdir = tempfile.mkdtemp() 
     129    try: 
     130        print "Testing Java template:" 
     131        java = javacodetemplate.format(variables=misc.javaexpr(variables), template=java) 
     132        print java.encode("utf-8") 
     133        with open(os.path.join(tempdir, "UL4Test.java"), "wb") as f: 
     134            f.write(java.encode("utf-8")) 
     135        os.system("cd {}; javac -encoding utf-8 UL4Test.java".format(tempdir)) 
     136        result = os.popen("cd {}; java UL4Test 2>&1".format(tempdir), "rb").read() 
     137    finally: 
     138        shutil.rmtree(tempdir) 
     139    result = result.decode("utf-8") 
     140    # Check if we have an exception 
     141    resultlines = result.splitlines() 
     142    for line in resultlines: 
     143        prefix = 'Exception in thread "main"' 
     144        if line.startswith(prefix): 
     145            raise RuntimeError(line[len(prefix):].strip()) 
     146    return result 
     147 
     148 
    99149def with_all_renderers(func): 
    100150    # Decorator that turns a test into a generative test testing the function ``func`` with all ``render*`` functions. 
     
    104154        yield func, renderdump 
    105155        yield func, renderjs 
     156        yield func, renderjava 
    106157    return decorated 
    107158 
     
    197248@with_all_renderers 
    198249def test_date(r): 
    199     assert '2000-02-29T00:00:00' == r(u'<?print @2000-02-29T.isoformat()?>') 
     250    assert '2000-02-29' == r(u'<?print @2000-02-29T.isoformat()?>') 
    200251    assert '2000-02-29T12:34:00' == r(u'<?print @2000-02-29T12:34.isoformat()?>') 
    201252    assert '2000-02-29T12:34:56' == r(u'<?print @2000-02-29T12:34:56.isoformat()?>') 
    202     assert '2000-02-29T12:34:56.987000' == r(u'<?print @2000-02-29T12:34:56.987000.isoformat()?>') # JS only supports milliseconds 
     253    assert '2000-02-29T12:34:56.987000' == r(u'<?print @2000-02-29T12:34:56.987000.isoformat()?>') # JS and Java only supports milliseconds 
    203254    assert 'yes' == r(u'<?if @2000-02-29T12:34:56.987654?>yes<?else?>no<?end if?>') 
    204255 
     
    778829    with raises("float.*unknown"): 
    779830        r(u"<?print float(1, 2, 3)?>") 
    780     with raises("float\\(\\) argument must be a string or a number"): 
     831    with raises("float\\(\\) argument must be a string or a number|Can't convert null to a float"): 
    781832        r(code, data=None) 
    782833    assert "4.2" == r(code, data=4.2) 
     
    10841135    assert [1, 2, 3] == eval(r(code, data=[1, 2, 3])) 
    10851136    if r is not renderjs: 
    1086         assert (1, 2, 3) == eval(r(code, data=(1, 2, 3))) 
     1137        assert [1, 2, 3] == eval(r(code, data=(1, 2, 3))) 
    10871138    assert {"a": 1, "b": 2} == eval(r(code, data={"a": 1, "b": 2})) 
     1139    assert "@2011-02-07T12:34:56.123000" == r(code, data=datetime.datetime(2011, 2, 7, 12, 34, 56, 123000)) 
     1140    assert "@2011-02-07T12:34:56" == r(code, data=datetime.datetime(2011, 2, 7, 12, 34, 56)) 
     1141    assert "@2011-02-07T" == r(code, data=datetime.datetime(2011, 2, 7)) 
     1142    assert "@2011-02-07T" == r(code, data=datetime.date(2011, 2, 7)) 
    10881143 
    10891144 
     
    15571612@with_all_renderers 
    15581613def test_templateattributes(r): 
    1559     if r is not renderjs: 
     1614    if r not in (renderjs, renderjava): 
    15601615        s = "<?print x?>" 
    15611616        t = ul4c.compile(s)