[pypy-svn] r40434 - in pypy/branch/guido-buildtool-web/pypy/tool/build: . test web web/templates web/test

guido at codespeak.net guido at codespeak.net
Tue Mar 13 13:03:03 CET 2007


Author: guido
Date: Tue Mar 13 13:02:59 2007
New Revision: 40434

Modified:
   pypy/branch/guido-buildtool-web/pypy/tool/build/buildserver.py
   pypy/branch/guido-buildtool-web/pypy/tool/build/metaserver.py
   pypy/branch/guido-buildtool-web/pypy/tool/build/test/test_buildserver.py
   pypy/branch/guido-buildtool-web/pypy/tool/build/web/app.py
   pypy/branch/guido-buildtool-web/pypy/tool/build/web/conftest.py
   pypy/branch/guido-buildtool-web/pypy/tool/build/web/templates/build.html
   pypy/branch/guido-buildtool-web/pypy/tool/build/web/templates/buildersinfo.html
   pypy/branch/guido-buildtool-web/pypy/tool/build/web/templates/builds.html
   pypy/branch/guido-buildtool-web/pypy/tool/build/web/templates/index.html
   pypy/branch/guido-buildtool-web/pypy/tool/build/web/templates/serverstatus.html
   pypy/branch/guido-buildtool-web/pypy/tool/build/web/test/test_app.py
Log:
Fixed config problem in tests, added some more info (like log and error) to
the build page, fixed build_start_time and build_end_time, added nav to
all pages (hard-coded for now).


Modified: pypy/branch/guido-buildtool-web/pypy/tool/build/buildserver.py
==============================================================================
--- pypy/branch/guido-buildtool-web/pypy/tool/build/buildserver.py	(original)
+++ pypy/branch/guido-buildtool-web/pypy/tool/build/buildserver.py	Tue Mar 13 13:02:59 2007
@@ -28,6 +28,7 @@
         accepted = self.channel.receive()
         if accepted:
             self.busy_on = request
+            request.build_start_time = py.std.time.time()
             thread.start_new_thread(self.wait_until_done, (request,))
         else:
             self.refused.append(request)
@@ -62,6 +63,8 @@
             # pretend we're compiling by sleeping a bit...
             py.std.time.sleep(self.testing_sleeptime)
 
+        request.build_end_time = py.std.time.time()
+        buildpath.request = request # re-write to disk
         self.metaserver.compilation_done(buildpath)
         self.busy_on = None
 

Modified: pypy/branch/guido-buildtool-web/pypy/tool/build/metaserver.py
==============================================================================
--- pypy/branch/guido-buildtool-web/pypy/tool/build/metaserver.py	(original)
+++ pypy/branch/guido-buildtool-web/pypy/tool/build/metaserver.py	Tue Mar 13 13:02:59 2007
@@ -100,7 +100,7 @@
         # we don't have a build for this yet, find a builder to compile it
         hostname = self.run(request)
         if hostname is not None:
-            return (False, "found a suitable server, going to build on '%s'" % 
+            return (False, "found a suitable server, going to build on '%s'" %
                     (hostname, ))
         self._queuelock.acquire()
         try:

Modified: pypy/branch/guido-buildtool-web/pypy/tool/build/test/test_buildserver.py
==============================================================================
--- pypy/branch/guido-buildtool-web/pypy/tool/build/test/test_buildserver.py	(original)
+++ pypy/branch/guido-buildtool-web/pypy/tool/build/test/test_buildserver.py	Tue Mar 13 13:02:59 2007
@@ -40,8 +40,8 @@
     accepted = c1.compile(br)
     assert accepted
     ret = c1.channel.receive()
-    assert ret == br.serialize() # this was still in the buffer
-    assert c1.busy_on.serialize() == br.serialize()
+    assert build.BuildRequest.fromstring(ret).id() == br.id() # this was still in the buffer
+    assert c1.busy_on.id() == br.id()
     c1.channel.send('foo bar')
     c1.channel.send(None)
     c1.channel.send('log')

Modified: pypy/branch/guido-buildtool-web/pypy/tool/build/web/app.py
==============================================================================
--- pypy/branch/guido-buildtool-web/pypy/tool/build/web/app.py	(original)
+++ pypy/branch/guido-buildtool-web/pypy/tool/build/web/app.py	Tue Mar 13 13:02:59 2007
@@ -18,6 +18,12 @@
             '"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n%s' % (
             html.strip().encode('UTF-8'),))
 
+def format_time(t):
+    if t is None:
+        return None
+    time = py.std.time
+    return time.strftime('%Y/%m/%d %H:%M', time.gmtime(t))
+
 class ServerPage(object):
     """ base class for pages that communicate with the server
     """
@@ -122,16 +128,37 @@
         br = BuildRequest.fromstring(self.call_method('buildrequest',
                                                       '"%s"' % (
                                                        self._buildid,)))
-        buildurl = self.call_method('buildurl', '"%s"' % (self._buildid,))
+        buildurl = None
+        log = None
+        error = None
+        if br.build_start_time:
+            if br.build_end_time:
+                buildurl = self.call_method('buildurl',
+                                            '"%s"' % (self._buildid,))
+                info = self.call_method('buildpathinfo',
+                                        '"%s"' % (self._buildid,))
+                log = info['log']
+                error = info['error']
+                if error:
+                    status = 'failed'
+                else:
+                    status = 'done'
+            else:
+                status = 'in progress'
+        else:
+            status = 'waiting'
         return {
             'url': buildurl,
             'id': br.id(),
             'email': br.email,
             'svnurl': br.svnurl,
             'svnrev': br.normalized_rev,
-            'request_time': br.request_time,
-            'build_start_time': br.build_start_time,
-            'build_end_time': br.build_end_time,
+            'request_time': format_time(br.request_time),
+            'build_start_time': format_time(br.build_start_time),
+            'build_end_time': format_time(br.build_end_time),
+            'status': status,
+            'log': log,
+            'error': error,
         }
 
 class BuildsIndexPage(ServerPage):
@@ -144,6 +171,9 @@
                 fix_html(template.unicode({'builds': self.get_builds()})))
 
     def get_builds(self):
+        buildrequests = [BuildRequest.fromstring(b) for b in
+                         self.call_method('buildrequests')]
+        buildrequests.sort(lambda a, b: cmp(a.request_time, b.request_time))
         return [{'id': b.id(),
                  'href': '/builds/%s' % (b.id(),),
                  'email': b.email,
@@ -151,9 +181,7 @@
                  'svnrev': b.normalized_rev,
                  'request_time': b.request_time,
                  'build_start_time': b.build_start_time,
-                 'build_end_time': b.build_end_time} for b in
-                [BuildRequest.fromstring(b) for b in
-                 self.call_method('buildrequests')]]
+                 'build_end_time': b.build_end_time} for b in buildrequests]
 
 class Builds(Collection):
     """ container for BuildsIndexPage and BuildPage """
@@ -178,10 +206,11 @@
 
 class Application(Collection):
     """ the application root """
-    style = FsFile(mypath.join('theme/style.css'), 'text/css')
-    serverstatus = ServerStatusPage(config)
-    buildersinfo = BuildersInfoPage(config)
-    builds = Builds(config)
+    def __init__(self, config):
+        self.style = FsFile(mypath.join('theme/style.css'), 'text/css')
+        self.serverstatus = ServerStatusPage(config)
+        self.buildersinfo = BuildersInfoPage(config)
+        self.builds = Builds(config)
     
     def index(self, handler, path, query):
         template = templess.template(
@@ -191,7 +220,9 @@
     index.exposed = True
 
 class AppHandler(Handler):
-    application = Application()
+    def __init__(self, *args, **kwargs):
+        self.application = Application(config)
+        super(AppHandler, self).__init__(*args, **kwargs)
 
 class MetaServerAccessor(object):
     def __init__(self, ms):
@@ -224,6 +255,14 @@
             if r.id() == id:
                 return r.serialize()
 
+    def buildpathinfo(self, requestid):
+        for bp in self.server._done:
+            if bp.request.id() == requestid:
+                return {
+                    'log': str(bp.log),
+                    'error': str(bp.error),
+                }
+
     def buildurl(self, id):
         for r in self.server._done:
             if r.request.id() == id:

Modified: pypy/branch/guido-buildtool-web/pypy/tool/build/web/conftest.py
==============================================================================
--- pypy/branch/guido-buildtool-web/pypy/tool/build/web/conftest.py	(original)
+++ pypy/branch/guido-buildtool-web/pypy/tool/build/web/conftest.py	Tue Mar 13 13:02:59 2007
@@ -1,6 +1,9 @@
 import py
 from py.__.doc.conftest import Directory as Dir, DoctestText, \
                                             ReSTChecker
+
+mypath = py.magic.autopath().dirpath()
+
 Option = py.test.config.Option
 option = py.test.config.addoptions("pypybuilder test options",
         Option('', '--webcheck',
@@ -10,3 +13,8 @@
         ),
 )
 
+class Directory(Dir):
+    def run(self):
+        if self.fspath == mypath:
+            return ['test', 'README.txt', 'README_TEMPLESSER.txt']
+        return super(Directory, self).run()

Modified: pypy/branch/guido-buildtool-web/pypy/tool/build/web/templates/build.html
==============================================================================
--- pypy/branch/guido-buildtool-web/pypy/tool/build/web/templates/build.html	(original)
+++ pypy/branch/guido-buildtool-web/pypy/tool/build/web/templates/build.html	Tue Mar 13 13:02:59 2007
@@ -3,20 +3,48 @@
     <title>Build meta server build <t:tag t:replace="id" /></title>
   </head>
   <body>
+    <ul class="sidebar">
+      <li><a href="/serverstatus">server status</a></li>
+      <li><a href="/buildersinfo">connected build servers</a></li>
+      <li><a href="/builds">builds (both in-progress and done)</a></li>
+    </ul>
     <h2>Build <t:tag t:replace="id" /></h2>
     <div class="infoblock">
-      <div class="title">url</div>
-      <div t:content="url" />
-      <div class="title">svn url</div>
-      <div t:content="svnurl" />
-      <div class="title">svn revision</div>
-      <div t:content="svnrev" />
-      <div class="title">request time</div>
-      <div t:content="request_time" />
-      <div class="title">started</div>
-      <div t:content="build_start_time" />
-      <div class="title">ended</div>
-      <div t:content="build_end_time" />
+      <div t:cond="url">
+        <span class="title">url:</span>
+        <a t:attr="href url" t:content="url"></a>
+      </div>
+      <div>
+        <span class="title">status:</span>
+        <span t:content="status" />
+      </div>
+      <div t:cond="error" class="error">
+        <span class="title">error:</span>
+        <span t:content="error" />
+      </div>
+      <div>
+        <span class="title">svn url:</span>
+        <span t:content="svnurl" />
+      </div>
+      <div>
+        <span class="title">svn revision:</span>
+        <span t:content="svnrev" />
+      </div>
+      <div>
+        <span class="title">request time:</span>
+        <span t:content="request_time" />
+      </div>
+      <div t:cond="build_start_time">
+        <span class="title">started:</span>
+        <span t:content="build_start_time" />
+      </div>
+      <div t:cond="build_end_time">
+        <span class="title">ended:</span>
+        <span t:content="build_end_time" />
+      </div>
+      <div t:cond="log">
+        <pre t:content="log" />
+      </div>
     </div>
   </body>
 </html>

Modified: pypy/branch/guido-buildtool-web/pypy/tool/build/web/templates/buildersinfo.html
==============================================================================
--- pypy/branch/guido-buildtool-web/pypy/tool/build/web/templates/buildersinfo.html	(original)
+++ pypy/branch/guido-buildtool-web/pypy/tool/build/web/templates/buildersinfo.html	Tue Mar 13 13:02:59 2007
@@ -4,6 +4,11 @@
     <link rel="stylesheet" type="text/css" href="/style" />
   </head>
   <body>
+    <ul class="sidebar">
+      <li><a href="/serverstatus">server status</a></li>
+      <li><a href="/buildersinfo">connected build servers</a></li>
+      <li><a href="/builds">builds (both in-progress and done)</a></li>
+    </ul>
     <h2>Connected build servers</h2>
     <div class="builders">
       <div class="builder" t:content="builders">

Modified: pypy/branch/guido-buildtool-web/pypy/tool/build/web/templates/builds.html
==============================================================================
--- pypy/branch/guido-buildtool-web/pypy/tool/build/web/templates/builds.html	(original)
+++ pypy/branch/guido-buildtool-web/pypy/tool/build/web/templates/builds.html	Tue Mar 13 13:02:59 2007
@@ -3,6 +3,11 @@
     <title>Build meta server builds page</title>
   </head>
   <body>
+    <ul class="sidebar">
+      <li><a href="/serverstatus">server status</a></li>
+      <li><a href="/buildersinfo">connected build servers</a></li>
+      <li><a href="/builds">builds (both in-progress and done)</a></li>
+    </ul>
     <h2>Overview of builds</h2>
     <p>
       Here you see an overview of all builds, both completed (and available

Modified: pypy/branch/guido-buildtool-web/pypy/tool/build/web/templates/index.html
==============================================================================
--- pypy/branch/guido-buildtool-web/pypy/tool/build/web/templates/index.html	(original)
+++ pypy/branch/guido-buildtool-web/pypy/tool/build/web/templates/index.html	Tue Mar 13 13:02:59 2007
@@ -3,9 +3,10 @@
     <title>Build meta server web interface (temp index page)</title>
   </head>
   <body>
-    <ul>
+    <ul class="sidebar">
       <li><a href="/serverstatus">server status</a></li>
       <li><a href="/buildersinfo">connected build servers</a></li>
+      <li><a href="/builds">builds (both in-progress and done)</a></li>
     </ul>
   </body>
 </html>

Modified: pypy/branch/guido-buildtool-web/pypy/tool/build/web/templates/serverstatus.html
==============================================================================
--- pypy/branch/guido-buildtool-web/pypy/tool/build/web/templates/serverstatus.html	(original)
+++ pypy/branch/guido-buildtool-web/pypy/tool/build/web/templates/serverstatus.html	Tue Mar 13 13:02:59 2007
@@ -3,6 +3,11 @@
     <title>Build meta server status page</title>
   </head>
   <body>
+    <ul class="sidebar">
+      <li><a href="/serverstatus">server status</a></li>
+      <li><a href="/buildersinfo">connected build servers</a></li>
+      <li><a href="/builds">builds (both in-progress and done)</a></li>
+    </ul>
     <h2>Server status</h2>
     <ul>
       <li>Connected build servers: <t:block t:replace="builders" /></li>

Modified: pypy/branch/guido-buildtool-web/pypy/tool/build/web/test/test_app.py
==============================================================================
--- pypy/branch/guido-buildtool-web/pypy/tool/build/web/test/test_app.py	(original)
+++ pypy/branch/guido-buildtool-web/pypy/tool/build/web/test/test_app.py	Tue Mar 13 13:02:59 2007
@@ -61,7 +61,7 @@
 def setup_module(mod):
     mod.path = path = pypyparent.strpath
     mod.server_channel = init_fake_metaserver(TESTPORT, path)
-    mod.config = fake.Container(port=TESTPORT, path=path)
+    mod.config = fake.Container(port=TESTPORT, path=path, server='localhost')
     mod.gateway = py.execnet.PopenGateway()
 
 def teardown_module(mod):
@@ -70,7 +70,7 @@
 
 class TestIndexPage(object):
     def test_call(self):
-        a = Application()
+        a = Application(config)
         headers, html = a.index(None, '/', '')
         assert headers == {'Content-Type': 'text/html; charset=UTF-8'}
         assert html.strip().startswith('<!DOCTYPE html')



More information about the Pypy-commit mailing list