root/livinglogic.python.pycoco/src/pycoco/xmlns.py @ 70:4a8e805d0775

Revision 70:4a8e805d0775, 8.0 KB (checked in by Walter Doerwald <walter@…>, 10 years ago)

Fix logic for marking up lines.

Line 
1# -*- coding: utf-8 -*-
2
3"""
4This module is an XIST namespace used for formatting the HTML coverage report.
5"""
6
7import datetime
8
9from ll.xist import xsc
10from ll.xist.ns import xml, html, meta, htmlspecials, ul4
11
12
13xmlns = "http://xmlns.python.org/coverage"
14
15
16class page(xsc.Element):
17    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
23
24    def convert(self, converter):
25        e = xsc.Frag(
26            xml.XML(), "\n",
27            html.DocTypeXHTML10transitional(), "\n",
28            html.html(
29                html.head(
30                    meta.contenttype(),
31                    html.title(
32                        "Python code coverage",
33                        ul4.if_("filename"),
34                            ": ", ul4.printx("filename"),
35                        ul4.else_(),
36                            " (", ul4.print_("timestamp.format('%Y-%m-%d')"), ")",
37                        ul4.end("if"),
38                    ),
39                    meta.stylesheet(href="/coverage.css"),
40                    meta.stylesheet(href="/coverage_sortfilelist.css"),
41                    htmlspecials.javascript(src="/coverage.js"),
42                ),
43                html.body(
44                    html.div(
45                        html.div(
46                            html.a(
47                                htmlspecials.autoimg(src="http://www.python.org/images/python-logo.gif", alt="Python", border=0),
48                                href="http://www.python.org/",
49                            ),
50                            class_="logo",
51                        ),
52                        html.div(
53                            ul4.for_("(i, item) in enumerate(crumbs)"),
54                                html.span(
55                                    html.span(
56                                        ul4.if_("i"),
57                                            ">",
58                                        ul4.else_(),
59                                            u"\xbb",
60                                        ul4.end("if"),
61                                        class_="bullet",
62                                    ),
63                                    ul4.if_("item.href"),
64                                        html.a(ul4.printx("item.title"), href=ul4.printx("item.href")),
65                                    ul4.else_(),
66                                        html.span(ul4.printx("item.title"), class_="here"),
67                                    ul4.end("if"),
68                                ul4.end("for"),
69                                class_="crumb",
70                            ),
71                            class_="crumbs",
72                        ),
73                        class_="header",
74                    ),
75                    html.div(
76                        self.content,
77                        class_="content",
78                    ),
79                    onload=ul4.attr_if("get('onload')", ul4.printx("onload")),
80                ),
81            ),
82        )
83        return e.convert(converter)
84
85
86class filelist(xsc.Element):
87    xmlns = xmlns
88
89    class Attrs(xsc.Element.Attrs):
90        class timestamp(xsc.TextAttr): pass
91        class revision(xsc.TextAttr): pass
92
93    def convert(self, converter):
94        now = datetime.datetime.now()
95        e = xsc.Frag(
96            html.h1("Python code coverage"),
97            html.p("Generated at ", ul4.printx("now.format('%Y-%m-%d %H:%M:%S')"), class_="note"),
98            html.p("Repository timestamp ", ul4.printx("timestamp.format('%Y-%m-%d %H:%M:%S')"), class_="note"),
99            html.p(ul4.printx("revision"), class_="note"),
100            html.p(html.a("Build log", href="buildlog.txt"), " ",html.a("Test log", href="testlog.txt"), class_="note"),
101            htmlspecials.plaintable(
102                html.thead(
103                    html.tr(
104                        html.th("Filename", id="filename"),
105                        html.th("# lines", id="nroflines"),
106                        html.th("# coverable lines", id="coverablelines"),
107                        html.th("# covered lines", id="coveredlines"),
108                        html.th("coverage", id="coverage"),
109                        html.th("distribution", id="distibution"),
110                    ),
111                ),
112                html.tbody(
113                    ul4.for_("file in files"),
114                        html.tr(
115                            html.th(
116                                html.a(
117                                    ul4.printx("file.name"),
118                                    href=(ul4.printx("file.name"), ".html"),
119                                ),
120                                class_="filename",
121                            ),
122                            html.td(
123                                ul4.printx("file.lines"),
124                                class_="nroflines",
125                            ),
126                            html.td(
127                                ul4.printx("file.coverablelines"),
128                                class_="coverablelines",
129                            ),
130                            html.td(
131                                ul4.printx("file.coveredlines"),
132                                class_="coveredlines",
133                            ),
134                            html.td(
135                                ul4.if_("file.coverablelines"),
136                                    ul4.printx("((100.*file.coveredlines)/file.coverablelines).format('.2f')"),
137                                    "%",
138                                ul4.else_(),
139                                    "n/a",
140                                ul4.end("if"),
141                                class_=(
142                                    "coverage",
143                                    ul4.if_("not file.coverablelines"),
144                                        " disabled",
145                                    ul4.end("if"),
146                                ),
147                            ),
148                            html.td(
149                                ul4.code("totalwidth = 100"),
150                                ul4.if_("file.coverablelines"),
151                                    ul4.if_("file.coverablelines < file.lines"),
152                                        ul4.code("width = int(1.*(file.lines-file.coverablelines)/file.lines*100)"),
153                                        htmlspecials.pixel(src="/spc.gif", width=ul4.printx("width"), height=8, style="background-color: #ccc;"),
154                                        ul4.code("totalwidth -= width"),
155                                    ul4.end("if"),
156                                    ul4.if_("file.coveredlines < file.coverablelines"),
157                                        ul4.code("width = int(1.*(file.coverablelines-file.coveredlines)/file.lines*100)"),
158                                        htmlspecials.pixel(src="/spc.gif", width=ul4.printx("width"), height=8, style="background-color: #f00;"),
159                                        ul4.code("totalwidth -= width"),
160                                    ul4.end("if"),
161                                    ul4.if_("totalwidth"),
162                                        htmlspecials.pixel(src="/spc.gif", width=ul4.printx("totalwidth"), height=8, style="background-color: #0c0;"),
163                                    ul4.end("if"),
164                                ul4.else_(),
165                                    htmlspecials.pixel(src="/spc.gif", width=ul4.printx("totalwidth"), height=8, style="background-color: #000;"),
166                                ul4.end("if"),
167                                class_="dist",
168                            ),
169                            class_="files",
170                        ),
171                    ul4.end("for"),
172                    id="files",
173                ),
174                class_="files",
175            )
176        )
177        return e.convert(converter)
178
179
180class fileitem(xsc.Element):
181    xmlns = xmlns
182
183    class Attrs(xsc.Element.Attrs):
184        class name(xsc.TextAttr): required = True
185        class lines(xsc.IntAttr): required = True
186        class coverablelines(xsc.IntAttr): required = True
187        class coveredlines(xsc.IntAttr): required = True
188
189    def convert(self, converter):
190        lines = int(self.attrs.lines)
191        coverablelines = int(self.attrs.coverablelines)
192        coveredlines = int(self.attrs.coveredlines)
193
194        distsize = (100, 8)
195        if coverablelines:
196            coverage = "%.02f%%" % (100.*coveredlines/coverablelines)
197            coverageclass = "coverage"
198            distribution = xsc.Frag()
199            totalwidth = 0
200            if coverablelines < lines:
201                width = int(float(lines-coverablelines)/lines*distsize[0])
202                distribution.append(htmlspecials.pixel(width=width, height=distsize[1], style="background-color: #ccc;"))
203                totalwidth += width
204            if coveredlines < coverablelines:
205                width = int(float(coverablelines-coveredlines)/lines*distsize[0])
206                distribution.append(htmlspecials.pixel(width=width, height=distsize[1], style="background-color: #f00;"))
207                totalwidth += width
208            if totalwidth < distsize[0]:
209                width = distsize[0]-totalwidth
210                distribution.append(htmlspecials.pixel(width=width, height=distsize[1], style="background-color: #0c0;"))
211                totalwidth += width
212        else:
213            coverage = "n/a"
214            coverageclass = "coverage disable"
215            distribution = htmlspecials.pixel(width=distsize[0], height=distsize[1], style="background-color: #000;")
216
217        e = html.tr(
218            html.th(
219                html.a(
220                    self.attrs.name,
221                    href=("root:", self.attrs.name, ".html"),
222                ),
223                class_="filename",
224            ),
225            html.td(
226                lines,
227                class_="nroflines",
228            ),
229            html.td(
230                coverablelines,
231                class_="coverablelines",
232            ),
233            html.td(
234                coveredlines,
235                class_="coveredlines",
236            ),
237            html.td(
238                coverage,
239                class_=coverageclass,
240            ),
241            html.td(
242                distribution,
243                class_="dist",
244            ),
245            class_="files",
246        )
247        return e.convert(converter)
248
249
250class filecontent(xsc.Element):
251    xmlns = xmlns
252
253    class Attrs(xsc.Element.Attrs):
254        class name(xsc.TextAttr): required = True
255
256    def convert(self, converter):
257        e = xsc.Frag(
258            html.h1("Python code coverage for ", ul4.printx("filename")),
259            htmlspecials.plaintable(
260                html.thead(
261                    html.tr(
262                        html.th("#"),
263                        html.th("count"),
264                        html.th("content"),
265                    ),
266                ),
267                html.tbody(
268                    ul4.for_("(i, line) in enumerate(lines)"),
269                        html.tr(
270                            html.th(ul4.print_("i+1")),
271                            html.td(
272                                ul4.if_("not isnone(line.count) and line.count >= 0"),
273                                    ul4.printx("line.count"),
274                                ul4.else_(),
275                                    "n/a",
276                                ul4.end("if"),
277                                class_="count",
278                            ),
279                            html.td(ul4.printx("line.content"), class_="line"),
280                            class_=(
281                                ul4.attr_if("isnone(line.count) or line.count <= 0"),
282                                ul4.if_("isnone(line.count) or line.count < 0"),
283                                    "uncoverable",
284                                ul4.elif_("not line.count"),
285                                    "uncovered",
286                                ul4.end("if"),
287                            ),
288                        ),
289                    ul4.end("for"),
290                ),
291                class_="file",
292            )
293        )
294        return e.convert(converter)
Note: See TracBrowser for help on using the browser.