[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