Changeset 91:ce01f615d3d2 in livinglogic.python.pycoco

Show
Ignore:
Timestamp:
05/31/13 17:31:29 (5 years ago)
Author:
Walter Doerwald <walter@…>
Branch:
default
Tags:
tip
Message:

Update to use Python 3.3 and XIST 4.10.

Files:
4 modified

Legend:

Unmodified
Added
Removed
  • NEWS.rst

    r90 r91  
    1 Changes in 0.8 (released ??/??/2011) 
     1Changes in 0.8 (released ??/??/2013) 
    22------------------------------------ 
    33 
    44*   The Python source code is checked out via ``hg`` now. 
    55 
    6 *   Updated to use XIST 3.23. 
     6*   Updated to use Python 3.3 and XIST 4.10. 
    77 
    88 
  • setup.py

    r90 r91  
    6666    description="Python code coverage", 
    6767    long_description=descr, 
    68     author=u"Walter Doerwald", 
     68    author="Walter Doerwald", 
    6969    author_email="walter@livinglogic.de", 
    7070    url="http://www.livinglogic.de/Python/pycoco/", 
     
    8787    ], 
    8888    install_requires=[ 
    89         "ll-xist >= 3.23", 
     89        "ll-xist == 4.10", 
    9090    ], 
    9191    zip_safe=False, 
  • src/pycoco/__main__.py

    r90 r91  
    22 
    33 
    4 from __future__ import with_statement 
    5  
    6 import sys, os, re, datetime, urllib, optparse, contextlib, subprocess, codecs 
     4import sys, os, re, datetime, urllib.request, urllib.parse, urllib.error, optparse, contextlib, subprocess, codecs 
    75 
    86from ll import sisyphus, url, ul4c 
     
    4644        lines = [] 
    4745        for line in pipe: 
     46            line = line.decode("utf-8", "backslashescape") 
    4847            self.log("... " + line) 
    4948            lines.append(line) 
     
    101100        with self.prefix("cover: "): 
    102101            self.log("### faking coverage info for uncovered file %r" % file.name) 
    103             with open(file.name, "r") as f: 
     102            with open(file.name, "r", encoding="iso-8859-1") as f: 
    104103                file.lines = [(None, line.rstrip("\n")) for line in f] 
    105104 
     
    109108            self.log("### fetching coverage info for Python file %r from %r" % (file.name, coverfilename)) 
    110109            try: 
    111                 with open(coverfilename, "r") as f: 
     110                with open(coverfilename, "r", encoding="iso-8859-1") as f: 
    112111                    for line in f: 
    113112                        line = line.rstrip("\n") 
     
    120119                        else: 
    121120                            file.lines.append((int(prefix.rstrip(":")), line)) 
    122             except IOError, exc: 
     121            except IOError as exc: 
    123122                self.log.exc(exc) 
    124123                self.coveruncovered(file) 
     
    131130            self.cmd("cd python && %s %s -o %s" % (self.gcovcmd, basename, dirname)) 
    132131            try: 
    133                 with open("python/%s.gcov" % basename, "r") as f: 
     132                with open("python/%s.gcov" % basename, "r", encoding="iso-8859-1") as f: 
    134133                    for line in f: 
    135134                        line = line.rstrip("\n") 
     
    147146                        else: 
    148147                            file.lines.append((int(count), line)) 
    149             except IOError, exc: 
     148            except IOError as exc: 
    150149                self.log.exc(exc) 
    151150                self.coveruncovered(file) 
     
    155154            # Generate main page 
    156155            self.log("### generating index page") 
    157             template = ul4c.Template(xmlns.page(xmlns.filelist(), onload="files_prepare()").conv().string()) 
     156            template = ul4c.Template(xmlns.page(xmlns.filelist()).conv().string(), "filelist") 
    158157            s = template.renders( 
    159158                filename=None, 
     159                onload="files_prepare()", 
    160160                now=datetime.datetime.now(), 
    161161                timestamp=self.timestamp, 
     
    171171                        name=file.name.split("/", 1)[-1], 
    172172                        lines=len(file.lines), 
    173                         coverablelines=sum(line[0]>=0 for line in file.lines), 
    174                         coveredlines=sum(line[0]>0 for line in file.lines), 
     173                        coverablelines=sum(line[0] is not None and line[0]>=0 for line in file.lines), 
     174                        coveredlines=sum(line[0] is not None and line[0]>0 for line in file.lines), 
    175175                    ) for file in files 
    176176                ], 
    177177            ) 
    178178            u = self.outputdir/"index.html" 
    179             with contextlib.closing(u.openwrite()) as f: 
    180                 f.write(s.encode("utf-8")) 
     179            with contextlib.closing(u.open("w", encoding="utf-8")) as f: 
     180                f.write(s) 
    181181 
    182182            # Generate page for each source file 
    183             template = ul4c.Template(xmlns.page(xmlns.filecontent()).conv().string()) 
     183            template = ul4c.Template(xmlns.page(xmlns.filecontent()).conv().string(), "file") 
    184184            for (i, file) in enumerate(files): 
    185185                filename = file.name.split("/", 1)[-1] 
     
    193193                    ], 
    194194                    lines=( 
    195                         dict(count=count, content=content.decode("latin-1").expandtabs(8)) for (count, content) in file.lines 
     195                        dict(count=count, content=content.expandtabs(8)) for (count, content) in file.lines 
    196196                    ), 
    197197                ) 
    198198                u = self.outputdir/(filename + ".html") 
    199                 with contextlib.closing(u.openwrite()) as f: 
    200                     f.write(s.encode("utf-8")) 
     199                with contextlib.closing(u.open("w", encoding="utf-8")) as f: 
     200                    f.write(s) 
    201201 
    202202            # Copy CSS/JS/GIF files 
     
    209209                else: 
    210210                    data = pkg_resources.resource_string(__name__, filename) 
    211                 with contextlib.closing((self.outputdir/filename).openwrite()) as f: 
     211                with contextlib.closing((self.outputdir/filename).open("wb")) as f: 
    212212                    f.write(data) 
    213213 
    214214            self.log("### creating buildlog.txt") 
    215             with contextlib.closing((self.outputdir/"buildlog.txt").openwrite()) as f: 
     215            with contextlib.closing((self.outputdir/"buildlog.txt").open("w", encoding="utf-8")) as f: 
    216216                f.write("".join(self.buildlog)) 
    217217 
    218218            self.log("### creating testlog.txt") 
    219             with contextlib.closing((self.outputdir/"testlog.txt").openwrite()) as f: 
     219            with contextlib.closing((self.outputdir/"testlog.txt").open("w", encoding="utf-8")) as f: 
    220220                f.write("".join(self.testlog)) 
    221221 
     
    239239        p = sisyphus.Job.argparser(self) 
    240240        p.add_argument("-u", "--url", dest="url", help="URL of the Python mercurial repository", default=str(self.url), type=url.URL) 
    241         p.add_argument("-d", "--outputdir", dest="outputdir", help="Directory where to put the HTML files", default=str(self.outputdir), type=url.Dir) 
     241        p.add_argument("-d", "--outputdir", dest="outputdir", help="Directory where to put the HTML files (must end in '/')", default=str(self.outputdir), type=url.URL) 
    242242        return p 
    243243 
  • src/pycoco/xmlns.py

    r90 r91  
    1616class page(xsc.Element): 
    1717    xmlns = xmlns 
    18  
    19     class Attrs(xsc.Element.Attrs): 
    20         class title(xsc.TextAttr): required = True 
    21         class crumbs(xsc.TextAttr): required = True 
    22         class onload(xsc.TextAttr): pass 
    2318 
    2419    def convert(self, converter): 
     
    5752                                            ">", 
    5853                                        ul4.else_(), 
    59                                             u"\xbb", 
     54                                            "\xbb", 
    6055                                        ul4.end("if"), 
    6156                                        class_="bullet", 
     
    7772                        class_="content", 
    7873                    ), 
    79                     onload=ul4.attr_if("get('onload')", ul4.printx("onload")), 
     74                    onload=ul4.attr_if(ul4.printx("onload"), cond="onload"), 
    8075                ), 
    8176            ), 
     
    8782    xmlns = xmlns 
    8883 
    89     class Attrs(xsc.Element.Attrs): 
    90         class timestamp(xsc.TextAttr): pass 
    91         class revision(xsc.TextAttr): pass 
    92  
    9384    def convert(self, converter): 
    9485        e = xsc.Frag( 
    9586            html.h1("Python code coverage"), 
    96             html.p("Generated at ", ul4.printx("now.format('%Y-%m-%d %H:%M:%S')"), class_="note"), 
    97             html.p("Last commit at ", ul4.printx("timestamp.format('%Y-%m-%d %H:%M:%S')"), " by ", ul4.printx("author"), class_="note"), 
     87            html.p("Generated at ", ul4.printx("format(now, '%Y-%m-%d %H:%M:%S')"), class_="note"), 
     88            html.p("Last commit at ", ul4.printx("format(timestamp, '%Y-%m-%d %H:%M:%S')"), " by ", ul4.printx("author"), class_="note"), 
    9889            html.p("Changeset identification hash ", ul4.printx("changesetid"), class_="note"), 
    9990            html.p("Local revision number ", ul4.printx("revision"), class_="note"), 
     
    134125                            html.td( 
    135126                                ul4.if_("file.coverablelines"), 
    136                                     ul4.printx("((100.*file.coveredlines)/file.coverablelines).format('.2f')"), 
     127                                    ul4.printx("format((100.*file.coveredlines)/file.coverablelines, '.2f')"), 
    137128                                    "%", 
    138129                                ul4.else_(), 
     
    180171class filecontent(xsc.Element): 
    181172    xmlns = xmlns 
    182  
    183     class Attrs(xsc.Element.Attrs): 
    184         class name(xsc.TextAttr): required = True 
    185173 
    186174    def convert(self, converter): 
     
    208196                            ), 
    209197                            html.td(ul4.printx("line.content"), class_="line"), 
    210                             class_=( 
    211                                 ul4.attr_if("isnone(line.count) or line.count <= 0"), 
     198                            class_=ul4.attr_if( 
    212199                                ul4.if_("isnone(line.count) or line.count < 0"), 
    213200                                    "uncoverable", 
     
    215202                                    "uncovered", 
    216203                                ul4.end("if"), 
     204                                cond="isnone(line.count) or line.count <= 0", 
    217205                            ), 
    218206                        ),