[pypy-svn] r58176 - in pypy/build/bot2/pypybuildbot: . test

pedronis at codespeak.net pedronis at codespeak.net
Tue Sep 16 11:08:28 CEST 2008


Author: pedronis
Date: Tue Sep 16 11:08:25 2008
New Revision: 58176

Modified:
   pypy/build/bot2/pypybuildbot/summary.py
   pypy/build/bot2/pypybuildbot/test/test_summary.py
Log:
(iko, pedronis)

start displaying failures formatted like our old summaries



Modified: pypy/build/bot2/pypybuildbot/summary.py
==============================================================================
--- pypy/build/bot2/pypybuildbot/summary.py	(original)
+++ pypy/build/bot2/pypybuildbot/summary.py	Tue Sep 16 11:08:25 2008
@@ -1,3 +1,5 @@
+import py
+html = py.xml.html
 
 from buildbot.status.web.base import HtmlResource
 
@@ -5,7 +7,7 @@
 class RevisionOutcomeSet(object):
 
     def __init__(self, rev):
-        self.rev = rev
+        self.revision = rev
         self._outcomes = {}
         self.failed = set()
         self.skipped = set()
@@ -43,6 +45,8 @@
         self.map = map
         self._failed = None
         self._skipped = None
+        self.revision = map.values()[0].revision
+        
 
     @property
     def failed(self):
@@ -65,10 +69,60 @@
     def get_outcome(self, namekey):
         return self.map[namekey[0]].get_outcome(namekey[1:])
          
-
+# ________________________________________________________________
 
 N = 10
 
+def colsizes(namekeys):
+    colsizes = None
+    for keys in namekeys:
+        if colsizes is None:
+            colsizes = [0] * len(keys)
+        colsizes = map(max, zip(map(len, keys), colsizes))
+
+    return colsizes
+    
+
+class SummaryPage(object):
+
+    def __init__(self):
+        self.sections = []
+
+    def add_section(self, outcome_sets):
+        by_rev = sorted((outcome_set.revision, outcome_set) for outcome_set
+                         in outcome_sets)
+        lines = []
+        def bars():
+            return ' |'*len(lines)
+        for rev, outcome_set in by_rev:
+            count_failures = len(outcome_set.failed)
+            count_skipped = len(outcome_set.skipped)
+            lines.append("%s %d" % (bars(),rev))
+        lines.append(bars())
+
+        failed = set()
+        for rev, outcome_set in by_rev:            
+            failed.update(outcome_set.failed)
+
+        colwidths = colsizes(failed)
+
+        for failure in sorted(failed):
+            line = []
+            for rev, outcome_set in by_rev:
+                letter = outcome_set.get_outcome(failure)
+                line.append(" %s" % letter)
+            for width, key in zip(colwidths, failure):
+                line.append("  %-*s" % (width, key))
+            lines.append(''.join(line))
+        
+        section = html.pre('\n'.join(lines))
+        self.sections.append(section)
+
+    def render(self):
+        body_html = html.div(self.sections)
+        return body_html.unicode()
+
+
 class Summary(HtmlResource):
 
     def recentRevisions(self, request):
@@ -78,18 +132,23 @@
         for builderName in status.getBuilderNames():
             builderStatus = status.getBuilder(builderName)
             for build in builderStatus.generateFinishedBuilds(num_builds=N):
-                rev = build.getProperty("got_revision")
+                rev = int(build.getProperty("got_revision"))
                 revBuilds = revs.setdefault(rev, {})
                 if builderName not in revBuilds: # pick the most recent or ?
                     # xxx hack, go through the steps and make sure
                     # the log is there
                     log = [log for log in build.getLogs()
                            if log.getName() == "pytestLog"][0]
-                    revBuilds[builderName] = RevisionOutcomeSet(log)
-        revs = revs.items()
-        revs.sort()
+                    outcome_set = RevisionOutcomeSet(rev)
+                    outcome_set.populate(log)
+                    revBuilds[builderName] = outcome_set
         return revs
                             
     def body(self, request):
         revs = self.recentRevisions(request)
-        return repr(len(revs))
+        outcome_sets = []
+        for rev, by_build in revs.items():
+            outcome_sets.append(GatherOutcomeSet(by_build))
+        page = SummaryPage()
+        page.add_section(outcome_sets)        
+        return page.render()

Modified: pypy/build/bot2/pypybuildbot/test/test_summary.py
==============================================================================
--- pypy/build/bot2/pypybuildbot/test/test_summary.py	(original)
+++ pypy/build/bot2/pypybuildbot/test/test_summary.py	Tue Sep 16 11:08:25 2008
@@ -5,6 +5,9 @@
 
     def test_populate(self):
         rev_outcome_set = summary.RevisionOutcomeSet(50000)
+
+        assert rev_outcome_set.revision == 50000
+
         log = StringIO("""F a/b.py:test_one
 . a/b.py:test_two
 s a/b.py:test_three
@@ -24,7 +27,6 @@
         res = rev_outcome_set.get_outcome(("a.b", "test_two"))
         assert res == '.'
 
-
     def test_GatherOutcomeSet(self):
         rev_outcome_set_foo = summary.RevisionOutcomeSet(50000)
         log = StringIO("""F a/b.py:test_one
@@ -48,6 +50,7 @@
 
         goutcome = summary.GatherOutcomeSet(d)
 
+        assert goutcome.revision == 50000
         
         assert goutcome.failed == set([('foo', 'a.b', 'test_one')])
         assert goutcome.failed == set([('foo', 'a.b', 'test_one')])
@@ -73,3 +76,12 @@
 
         res = goutcome_top.get_outcome(('sub', 'foo', 'a.b', 'test_one'))
         assert res == 'F'
+
+    def test_colsizes(self):
+        failed = [('a', 'abc', 'd'), ('ab', 'c', 'xy'),
+                  ('ab', '', 'cd')]
+
+        res = summary.colsizes(failed)
+
+        assert res == [2,3,2]
+



More information about the Pypy-commit mailing list