[py-svn] r34617 - in py/dist/py: . apigen apigen/rest apigen/rest/testing rst
guido at codespeak.net
guido at codespeak.net
Wed Nov 15 10:49:53 CET 2006
Author: guido
Date: Wed Nov 15 10:49:47 2006
New Revision: 34617
Added:
py/dist/py/apigen/rest/htmlhandlers.py
py/dist/py/apigen/style.css
Modified:
py/dist/py/apigen/rest/genrest.py
py/dist/py/apigen/rest/testing/test_rest.py
py/dist/py/conftest.py
py/dist/py/rst/transform.py
Log:
Integrated the HTML transformer from py.rst into apigen. Added simple
stylesheet.
Modified: py/dist/py/apigen/rest/genrest.py
==============================================================================
--- py/dist/py/apigen/rest/genrest.py (original)
+++ py/dist/py/apigen/rest/genrest.py Wed Nov 15 10:49:47 2006
@@ -62,12 +62,12 @@
def __init__(self, output=sys.stdout):
self.output = output
- def write_section(self, name, data):
+ def write_section(self, name, rest):
text = "Contents of file %s.txt:" % (name,)
self.output.write(text + "\n")
self.output.write("=" * len(text) + "\n")
self.output.write("\n")
- self.output.write(data + "\n")
+ self.output.write(rest.text() + "\n")
def getlink(self, type, targetname, targetfilename):
return '%s.txt' % (targetfilename,)
@@ -79,9 +79,9 @@
else:
self.directory = py.path.local(directory)
- def write_section(self, name, data):
+ def write_section(self, name, rest):
filename = '%s.txt' % (name,)
- self.directory.ensure(filename).write(data)
+ self.directory.ensure(filename).write(rest.text())
def getlink(self, type, targetname, targetfilename):
# we assume the result will get converted to HTML...
@@ -93,8 +93,8 @@
self.fp = fpath.open('w+')
self._defined_targets = []
- def write_section(self, name, data):
- self.fp.write(data)
+ def write_section(self, name, rest):
+ self.fp.write(rest.text())
self.fp.flush()
def getlink(self, type, targetname, targetbasename):
@@ -113,6 +113,29 @@
targetname = targetname[:-1]
return '#%s-%s' % (type, targetname)
+class HTMLDirWriter(object):
+ def __init__(self, indexhandler, filehandler, directory=None):
+ self.indexhandler = indexhandler
+ self.filehandler = filehandler
+ if directory is None:
+ self.directory = py.test.ensuretemp('dirwriter')
+ else:
+ self.directory = py.path.local(directory)
+
+ def write_section(self, name, rest):
+ from py.__.rst.transform import RestTransformer
+ if name == 'index':
+ handler = self.indexhandler
+ else:
+ handler = self.filehandler
+ h = handler(name)
+ t = RestTransformer(rest)
+ t.parse(h)
+ self.directory.ensure('%s.html' % (name,)).write(h.html)
+
+ def getlink(self, type, targetname, targetfilename):
+ return '%s.html' % (targetfilename,)
+
class RestGen(object):
def __init__(self, ds, linkgen, writer=PipeWriter()):
#assert isinstance(linkgen, DirectPaste), (
@@ -130,7 +153,7 @@
modlist.insert(0, ['', classlist, funclist])
indexrest = self.build_index([t[0] for t in modlist])
- self.writer.write_section('index', Rest(*indexrest).text())
+ self.writer.write_section('index', Rest(*indexrest))
self.build_modrest(modlist)
@@ -141,40 +164,40 @@
if mname == '':
mname = self.dsa.get_module_name()
self.writer.write_section('module_%s' % (mname,),
- Rest(*rest).text())
+ Rest(*rest))
for cname, crest, cfunclist in classlist:
self.writer.write_section('class_%s' % (cname,),
- Rest(*crest).text())
+ Rest(*crest))
for fname, frest, tbdata in cfunclist:
self.writer.write_section('method_%s' % (fname,),
- Rest(*frest).text())
+ Rest(*frest))
for tbname, tbrest in tbdata:
self.writer.write_section('traceback_%s' % (tbname,),
- Rest(*tbrest).text())
+ Rest(*tbrest))
for fname, frest, tbdata in funclist:
self.writer.write_section('function_%s' % (fname,),
- Rest(*frest).text())
+ Rest(*frest))
for tbname, tbrest in tbdata:
self.writer.write_section('traceback_%s' % (tbname,),
- Rest(*tbrest).text())
+ Rest(*tbrest))
def build_classrest(self, classlist):
classrest = self.build_classes(classlist)
for cname, rest, cfunclist in classrest:
self.writer.write_section('class_%s' % (cname,),
- Rest(*rest).text())
+ Rest(*rest))
for fname, rest in cfunclist:
self.writer.write_section('method_%s' % (fname,),
- Rest(*rest).text())
+ Rest(*rest))
def build_funcrest(self, funclist):
funcrest = self.build_functions(funclist)
for fname, rest, tbdata in funcrest:
self.writer.write_section('function_%s' % (fname,),
- Rest(*rest).text())
+ Rest(*rest))
for tbname, tbrest in tbdata:
self.writer.write_section('traceback_%s' % (tbname,),
- Rest(*tbrest).text())
+ Rest(*tbrest))
def build_index(self, modules):
rest = [Title('Index', abovechar='=', belowchar='=')]
Added: py/dist/py/apigen/rest/htmlhandlers.py
==============================================================================
--- (empty file)
+++ py/dist/py/apigen/rest/htmlhandlers.py Wed Nov 15 10:49:47 2006
@@ -0,0 +1,39 @@
+from py.__.rst.transform import HTMLHandler, entitize
+
+class PageHandler(HTMLHandler):
+ def startDocument(self):
+ self._data += ['<html>\n', '<head>\n',
+ '<title>%s</title>\n' % (self.title,),
+ '<script type="text/javascript" src="apigen.js">',
+ '</script>',
+ ('<link type="text/css" rel="stylesheet" '
+ 'href="style.css" />'),
+ '</head>\n', '<body>\n']
+
+class IndexHandler(PageHandler):
+ ignore_text = False
+
+ def startDocument(self):
+ super(IndexHandler, self).startDocument()
+ self._data += ['<div id="sidebar">']
+
+ def endDocument(self):
+ self._data += ['</div>', '<div id="main">',
+ ('<iframe name="content" id="content" width="100%" '
+ 'height="100%" src="about:blank">'), '</iframe>',
+ '</div>']
+
+ def startTitle(self, depth):
+ self.ignore_text = True
+
+ def endTitle(self, depth):
+ self.ignore_text = False
+
+ def handleText(self, text):
+ if self.ignore_text:
+ return
+ super(IndexHandler, self).handleText(text)
+
+ def handleLink(self, text, target):
+ self._data.append('<a href="%s" target="content">%s</a>' % (
+ entitize(target), entitize(text)))
Modified: py/dist/py/apigen/rest/testing/test_rest.py
==============================================================================
--- py/dist/py/apigen/rest/testing/test_rest.py (original)
+++ py/dist/py/apigen/rest/testing/test_rest.py Wed Nov 15 10:49:47 2006
@@ -7,12 +7,14 @@
from py.__.apigen.rest.genrest import ViewVC, RestGen, PipeWriter, \
DirWriter, FileWriter, \
- DirectPaste, DirectFS
+ DirectPaste, DirectFS, \
+ HTMLDirWriter
from py.__.apigen.tracer.tracer import Tracer
from py.__.apigen.tracer.docstorage import DocStorage
from py.__.apigen.tracer.testing.runtest import cut_pyc
from py.__.documentation.conftest import genlinkchecks
+from py.__.rst.rst import Rest, Paragraph
# XXX: UUuuuuuuuuuuuuuuuuuuuuuuu, dangerous import
def setup_module(mod):
@@ -72,8 +74,8 @@
class WriterTest(object):
def get_filled_writer(self, writerclass, *args, **kwargs):
dw = writerclass(*args, **kwargs)
- dw.write_section('foo', 'foo data')
- dw.write_section('bar', 'bar data')
+ dw.write_section('foo', Rest(Paragraph('foo data')))
+ dw.write_section('bar', Rest(Paragraph('bar data')))
return dw
class TestDirWriter(WriterTest):
@@ -83,8 +85,8 @@
fpaths = tempdir.listdir('*.txt')
assert len(fpaths) == 2
assert sorted([f.basename for f in fpaths]) == ['bar.txt', 'foo.txt']
- assert tempdir.join('foo.txt').read() == 'foo data'
- assert tempdir.join('bar.txt').read() == 'bar data'
+ assert tempdir.join('foo.txt').read() == 'foo data\n'
+ assert tempdir.join('bar.txt').read() == 'bar data\n'
def test_getlink(self):
dw = DirWriter(temppath.join('dirwriter_getlink'))
@@ -120,6 +122,16 @@
link = pw.getlink('function', 'Foo.bar', 'method_foo_bar')
assert link == 'method_foo_bar.txt'
+class TestHTMLDirWriter(WriterTest):
+ def test_write_section(self):
+ from py.__.rst.transform import HTMLHandler
+ tempdir = temppath.ensure('htmldirwriter', dir=1)
+ hdw = self.get_filled_writer(HTMLDirWriter, HTMLHandler, HTMLHandler,
+ tempdir)
+ assert tempdir.join('foo.html').check(file=1)
+ assert tempdir.join('bar.html').check(file=1)
+ assert tempdir.join('foo.html').read().startswith('<html>')
+
class TestRest(object):
def get_filled_docstorage(self):
descs = {'SomeClass': SomeClass,
Added: py/dist/py/apigen/style.css
==============================================================================
--- (empty file)
+++ py/dist/py/apigen/style.css Wed Nov 15 10:49:47 2006
@@ -0,0 +1,31 @@
+#sidebar {
+ width: 9em;
+ float: left;
+}
+
+#main {
+ margin-left: 9em;
+}
+
+#content {
+ border: 0px;
+}
+
+body, div, p, h1, h2, h3, h4 {
+ font-family: Trebuchet MS, Verdana, Arial;
+ background-color: #FFE;
+ color: black;
+}
+
+a {
+ color: #006;
+ text-decoration: none;
+}
+
+ul {
+ padding-left: 2em;
+}
+
+ul li {
+ list-style-type: katakana;
+}
Modified: py/dist/py/conftest.py
==============================================================================
--- py/dist/py/conftest.py (original)
+++ py/dist/py/conftest.py Wed Nov 15 10:49:47 2006
@@ -16,13 +16,14 @@
showlocals = False
nomagic = False
-import py
-Option = py.test.Config.Option
+import py
+Option = py.test.Config.Option
-option = py.test.Config.addoptions("execnet options",
+option = py.test.Config.addoptions("execnet options",
Option('-S', '',
action="store", dest="sshtarget", default=None,
- help="target to run tests requiring ssh, e.g. user at codespeak.net"),
+ help=("target to run tests requiring ssh, e.g. "
+ "user at codespeak.net")),
)
class ApiGen:
@@ -32,6 +33,12 @@
get_doc_storage = staticmethod(get_doc_storage)
def write_docs(ds):
- from py.__.apigen.rest.genrest import DirectPaste, RestGen, DirWriter
- RestGen(ds, DirectPaste(), DirWriter("/tmp/output")).write()
+ from py.__.apigen.rest.genrest import DirectPaste, RestGen, \
+ HTMLDirWriter
+ from py.__.apigen.rest.htmlhandlers import IndexHandler, PageHandler
+ outdir = py.path.local('/tmp/output')
+ RestGen(ds, DirectPaste(),
+ HTMLDirWriter(IndexHandler, PageHandler, outdir)).write()
+ if not outdir.join('style.css').check():
+ py.magic.autopath().dirpath().join('apigen/style.css').copy(outdir)
write_docs = staticmethod(write_docs)
Modified: py/dist/py/rst/transform.py
==============================================================================
--- py/dist/py/rst/transform.py (original)
+++ py/dist/py/rst/transform.py Wed Nov 15 10:49:47 2006
@@ -1,3 +1,4 @@
+import py
from py.__.rst import rst
class RestTransformer(object):
@@ -16,13 +17,7 @@
name = node.__class__.__name__
if name == 'Rest':
continue
- try:
- getattr(self, 'handle_%s' % (name,))(node, handler)
- except AttributeError:
- # caused by the handler not implementing something (well, let's
- # assume that at least ;)
- py.std.sys.stderr.write('Warning: error handling node %s\n' % (
- node,))
+ getattr(self, 'handle_%s' % (name,))(node, handler)
def handle_Title(self, node, handler):
depthkey = (node.abovechar, node.belowchar)
if depthkey not in self._titledepths:
More information about the pytest-commit
mailing list