[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