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

guido at codespeak.net guido at codespeak.net
Fri Feb 16 22:37:29 CET 2007


Author: guido
Date: Fri Feb 16 22:37:26 2007
New Revision: 39053

Added:
   pypy/branch/guido-buildtool-web/pypy/tool/build/web/theme/
   pypy/branch/guido-buildtool-web/pypy/tool/build/web/theme/style.css
Removed:
   pypy/branch/guido-buildtool-web/pypy/tool/build/web/templates/builderinfo.html
Modified:
   pypy/branch/guido-buildtool-web/pypy/tool/build/build.py
   pypy/branch/guido-buildtool-web/pypy/tool/build/config.py
   pypy/branch/guido-buildtool-web/pypy/tool/build/metaserver.py
   pypy/branch/guido-buildtool-web/pypy/tool/build/test/test_metaserver.py
   pypy/branch/guido-buildtool-web/pypy/tool/build/web/   (props changed)
   pypy/branch/guido-buildtool-web/pypy/tool/build/web/app.py
   pypy/branch/guido-buildtool-web/pypy/tool/build/web/server.py
   pypy/branch/guido-buildtool-web/pypy/tool/build/web/templates/buildersinfo.html
   pypy/branch/guido-buildtool-web/pypy/tool/build/web/test/test_app.py
   pypy/branch/guido-buildtool-web/pypy/tool/build/web/test/test_server.py
Log:
Showing more interesting information on the builders info page now, added
stylesheet (and FsFile Resource subclass to support it), rolling back change
in config.py I shouldn't have checked in, removed unused template.


Modified: pypy/branch/guido-buildtool-web/pypy/tool/build/build.py
==============================================================================
--- pypy/branch/guido-buildtool-web/pypy/tool/build/build.py	(original)
+++ pypy/branch/guido-buildtool-web/pypy/tool/build/build.py	Fri Feb 16 22:37:26 2007
@@ -127,9 +127,13 @@
                 self.svnrev, self.revrange, self.request_time,
                 self.build_start_time, self.build_end_time)
 
-    def serialize(self):
+    def todict(self):
         data = {'normalized_rev': self.normalized_rev} # it's a property
         data.update(self.__dict__)
+        data.pop('_nr', 0)
+        return data
+
+    def serialize(self):
         return """\
 email: %(email)s
 sysinfo: %(sysinfo)r
@@ -141,7 +145,7 @@
 request_time: %(request_time)s
 build_start_time: %(build_start_time)s
 build_end_time: %(build_end_time)s
-""" % data
+""" % self.todict()
 
     def _fromstring(cls, s):
         data = {}

Modified: pypy/branch/guido-buildtool-web/pypy/tool/build/config.py
==============================================================================
--- pypy/branch/guido-buildtool-web/pypy/tool/build/config.py	(original)
+++ pypy/branch/guido-buildtool-web/pypy/tool/build/config.py	Fri Feb 16 22:37:26 2007
@@ -3,7 +3,7 @@
 packageparent = py.magic.autopath().dirpath().dirpath().dirpath().dirpath()
 
 # general settings, used by both server and client
-server = 'localhost'
+server = 'codespeak.net'
 port = 12321
 testport = 32123
 path = [str(packageparent)]

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	Fri Feb 16 22:37:26 2007
@@ -184,12 +184,10 @@
     def buildersinfo(self):
         ret = []
         for b in self._builders:
-            print 'busy_on:', b.busy_on
-            print 'resolved:', b.busy_on and b.busy_on.compileinfo or None
             ret.append({
                 'hostname': b.hostname,
                 'sysinfo': b.sysinfo,
-                'busy_on': b.busy_on and b.busy_on.compileinfo or None,
+                'busy_on': b.busy_on and b.busy_on.serialize() or None,
             })
         return ret
 

Modified: pypy/branch/guido-buildtool-web/pypy/tool/build/test/test_metaserver.py
==============================================================================
--- pypy/branch/guido-buildtool-web/pypy/tool/build/test/test_metaserver.py	(original)
+++ pypy/branch/guido-buildtool-web/pypy/tool/build/test/test_metaserver.py	Fri Feb 16 22:37:26 2007
@@ -186,9 +186,12 @@
     assert bi[0]['sysinfo'] == {'foo': 1, 'bar': [1,2]}
     assert bi[0]['busy_on'] == None
     assert bi[1]['sysinfo'] == {'foo': 2, 'bar': [2,3]}
-    svr._builders[0].busy_on = c1
+    req = build.BuildRequest('foo at bar.com', {}, {}, 'file:///tmp/repo', '10',
+                             '10')
+    req._nr = '10' # normalized revision
+    svr._builders[0].busy_on = req
     bi = svr.buildersinfo()
     assert bi[0]['busy_on']
     # for now, later more info should be made available
-    assert bi[0]['busy_on'] == c1.compileinfo
+    assert bi[0]['busy_on'] == req.serialize()
 

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	Fri Feb 16 22:37:26 2007
@@ -3,9 +3,12 @@
 """ a web server that displays status info of the meta server and builds """
 
 import py
+import time
 from pypy.tool.build import config
 from pypy.tool.build import execnetconference
-from pypy.tool.build.web.server import HTTPError, Resource, Collection, Handler
+from pypy.tool.build.build import BuildRequest
+from pypy.tool.build.web.server import HTTPError, Resource, Collection, \
+                                       Handler, FsFile
 
 from templess import templess
 
@@ -86,7 +89,24 @@
                                            self.get_buildersinfo()})))
 
     def get_buildersinfo(self):
-        return self.call_method('buildersinfo')
+        infos = self.call_method('buildersinfo')
+        # some massaging of the data for Templess
+        for binfo in infos:
+            binfo['sysinfo'] = [binfo['sysinfo']]
+            if binfo['busy_on']:
+                b = binfo['busy_on']
+                d = BuildRequest.fromstring(binfo['busy_on']).todict()
+                d.pop('sysinfo', None) # same as builder
+                d.pop('build_end_time', None) # it's still busy ;)
+                # templess doesn't understand dicts this way...
+                d['compileinfo'] = [{'key': k, 'value': v} for (k, v) in
+                                    d['compileinfo'].items()]
+                for key in ['request_time', 'build_start_time']:
+                    if d[key]:
+                        d[key] = time.strftime('%Y/%m/%d %H:%M:%S',
+                                               time.gmtime(d[key]))
+                binfo['busy_on'] = [d]
+        return infos
 
 class BuildPage(ServerPage):
     """ display information for one build """
@@ -134,6 +154,7 @@
 class Application(Collection):
     """ the application root """
     index = IndexPage()
+    style = FsFile(mypath.join('theme/style.css'), 'text/css')
     serverstatus = ServerStatusPage(config)
     buildersinfo = BuildersInfoPage(config)
     builds = Builds(config)

Modified: pypy/branch/guido-buildtool-web/pypy/tool/build/web/server.py
==============================================================================
--- pypy/branch/guido-buildtool-web/pypy/tool/build/web/server.py	(original)
+++ pypy/branch/guido-buildtool-web/pypy/tool/build/web/server.py	Fri Feb 16 22:37:26 2007
@@ -183,4 +183,16 @@
     server = HTTPServer(address, handler)
     server.serve_forever()
 
+# ready-to-use Collection and Resource implementations
+class FsFile(Resource):
+    debug = False
+    def __init__(self, path, content_type):
+        self._path = path
+        self._content_type = content_type
+
+    _data = None
+    def handle(self, handler, path, query):
+        if self._data is None or self.debug:
+            self._data = self._path.read()
+        return ({'Content-Type': self._content_type}, self._data)
 

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	Fri Feb 16 22:37:26 2007
@@ -1,6 +1,7 @@
 <html xmlns:t="http://johnnydebris.net/xmlns/templess">
   <head>
     <title>Build meta server builders page</title>
+    <link rel="stylesheet" type="text/css" href="/style" />
   </head>
   <body>
     <h2>Connected build servers</h2>
@@ -8,8 +9,56 @@
       <div class="builder" t:content="builders">
         <h3 t:content="hostname" />
         <div class="builderinfo">
-          <div>sysinfo: <t:block t:replace="sysinfo" /></div>
-          <div>busy on: <t:block t:replace="busy_on" /></div>
+          <div class="infoblock">
+            <div class="title">sysinfo:</div>
+            <div class="dict" t:content="sysinfo">
+              <div class="pair">
+                <span class="key">os:</span>
+                <span class="value" t:content="os" />
+              </div>
+              <div class="pair">
+                <span class="key">maxint:</span>
+                <span class="value" t:content="maxint" />
+              </div>
+              <div class="pair">
+                <span class="key">byteorder:</span>
+                <span class="value" t:content="byteorder" />
+              </div>
+            </div>
+          </div>
+          <div class="infoblock">
+            <div class="title">busy on build:</div>
+            <div class="value" t:not="busy_on">nothing</div>
+            <div class="dict" t:cond="busy_on" t:content="busy_on">
+              <div class="pair">
+                <span class="key">request time:</span>
+                <span class="value" t:content="request_time" />
+              </div>
+              <div class="pair">
+                <span class="key">build start time:</span>
+                <span class="value" t:content="request_time" />
+              </div>
+              <div class="pair">
+                <span class="key">svn url:</span>
+                <span class="value" t:content="svnurl" />
+              </div>
+              <div class="pair">
+                <span class="key">svn revision:</span>
+                <span class="value" t:content="normalized_rev" />
+              </div>
+              <!--
+              <div class="pair">
+                <div class="key">compile info:</div>
+                <div class="sub">
+                  <div class="pair" t:content="compileinfo">
+                    <span class="key" t:content="key" />:
+                    <span class="value" t:content="value" />
+                  </div>
+                </div>
+              </div>
+              -->
+            </div>
+          </div>
         </div>
       </div>
     </div>

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	Fri Feb 16 22:37:26 2007
@@ -4,6 +4,7 @@
 from pypy.tool.build.web.conftest import option
 from pypy.tool.build.test import fake
 from pypy.tool.build import config as build_config
+from pypy.tool.build import build
 
 TESTPORT = build_config.testport
 
@@ -94,16 +95,28 @@
     def test_get_builderinfo(self):
         p = BuildersInfoPage(config, gateway)
         assert p.get_buildersinfo() == []
-        server_channel.send(('set_buildersinfo', [{'foo': 'bar'}]))
-        assert p.get_buildersinfo() == [{'foo': 'bar'}]
+        server_channel.send(('set_buildersinfo', [{'sysinfo': 'foo',
+                                                   'busy_on': None}]))
+        assert p.get_buildersinfo() == [{'sysinfo': ['foo'], 'busy_on': None}]
 
     def test_handle(self):
+        b = build.BuildRequest('foo at bar.com', {}, {'foo': 'bar'},
+                               'http://codespeak.net/svn/pypy/dist', 10, 2,
+                               123456789)
+        busy_on = b.serialize()
         server_channel.send(('set_buildersinfo', [{'hostname': 'host1',
-                                                   'sysinfo': str({'foo': 'bar'}),
+                                                   'sysinfo': {
+                                                    'os': 'linux2',
+                                                    'maxint':
+                                                     9223372036854775807,
+                                                    'byteorder': 'little'},
                                                    'busy_on': None},
                                                   {'hostname': 'host2',
-                                                   'sysinfo': {'foo': 'baz'},
-                                                   'busy_on': {'spam': 'eggs'},
+                                                   'sysinfo': {
+                                                    'os': 'zx81',
+                                                    'maxint': 255,
+                                                    'byteorder': 'little'},
+                                                   'busy_on': busy_on,
                                                    }]))
         p = BuildersInfoPage(config, gateway)
         headers, html = p.handle(None, '/buildersinfo', '')

Modified: pypy/branch/guido-buildtool-web/pypy/tool/build/web/test/test_server.py
==============================================================================
--- pypy/branch/guido-buildtool-web/pypy/tool/build/web/test/test_server.py	(original)
+++ pypy/branch/guido-buildtool-web/pypy/tool/build/web/test/test_server.py	Fri Feb 16 22:37:26 2007
@@ -1,5 +1,5 @@
 import py
-from pypy.tool.build.web.server import Handler, Resource, Collection, HTTPError
+from pypy.tool.build.web.server import *
 
 class NonInitHandler(Handler):
     request_version = '1.0'
@@ -100,3 +100,14 @@
     def test_get_response_wrong_body(self):
         py.test.raises(ValueError, "self.handler.response(200, {}, u'xxx')")
 
+class TestFsFile(object):
+    def test_handle(self):
+        temp = py.test.ensuretemp('TestStaticResource.test_handle')
+        foo = temp.ensure('foo.txt')
+        foo.write('foo')
+        r = FsFile(foo, 'text/plain')
+        ret = r.handle(None, '/bar/foo.txt', '')
+        assert ret[0] == {'Content-Type': 'text/plain'}
+        assert ret[1] == 'foo'
+        
+

Added: pypy/branch/guido-buildtool-web/pypy/tool/build/web/theme/style.css
==============================================================================
--- (empty file)
+++ pypy/branch/guido-buildtool-web/pypy/tool/build/web/theme/style.css	Fri Feb 16 22:37:26 2007
@@ -0,0 +1,19 @@
+body {
+  background-color: white;
+  color: black;
+  font: Times New Roman;
+}
+
+.infoblock {
+  margin-bottom: 1em;
+}
+
+.title {
+  font-weight: bold;
+}
+
+.sub div {
+  margin-left: 1em;
+  font-size: 0.8em;
+}
+



More information about the Pypy-commit mailing list