[py-svn] r36570 - in py/dist/py/apigen: . testing

guido at codespeak.net guido at codespeak.net
Fri Jan 12 14:06:45 CET 2007


Author: guido
Date: Fri Jan 12 14:06:35 2007
New Revision: 36570

Modified:
   py/dist/py/apigen/htmlgen.py
   py/dist/py/apigen/testing/test_apigen_example.py
Log:
Building function page navigation, small HTML beautifications.


Modified: py/dist/py/apigen/htmlgen.py
==============================================================================
--- py/dist/py/apigen/htmlgen.py	(original)
+++ py/dist/py/apigen/htmlgen.py	Fri Jan 12 14:06:35 2007
@@ -6,13 +6,13 @@
     class ClassDescription(html.div):
         pass
 
-    class ClassDef(html.div):
+    class ClassDef(html.h1):
         pass
 
     class MethodDescription(html.div):
         pass
 
-    class MethodDef(html.div):
+    class MethodDef(html.h2):
         pass
 
     class ParameterDescription(html.div):
@@ -43,7 +43,7 @@
     docstring = func.__doc__
     local_methodname = func.__name__
     snippet = H.MethodDescription(
-        H.MethodDef(local_methodname, "(", params, "):"),
+        H.MethodDef(local_methodname, params, ":"),
         H.Docstring(docstring),
     )
     return snippet
@@ -55,7 +55,7 @@
     docstring = func.__doc__
     local_methodname = func.__name__
     snippet = H.MethodDescription(
-        H.MethodDef(local_methodname, "(", params, "):"),
+        H.MethodDef(local_methodname, params, ":"),
         H.Docstring(docstring),
         # XXX more info here...
     )
@@ -84,6 +84,7 @@
         H.ClassDef('%s(' % (cls.__name__,), *basehtml),
         H.Docstring(docstring),
     )
+    snippet.append(H.h2('Functions:'))
     for method in methods:
         snippet += build_short_method_view(linker, dsa, '%s.%s' % (dotted_name,
                                                                    method))
@@ -98,8 +99,6 @@
     return H.Navigation('navigation')
 
 def build_class_navigation(linker, dsa, dotted_name):
-    # import dotted name
-    # build nav from sub items + parent
     navitems = []
     path = dotted_name.split('.')
     indent = 0
@@ -137,6 +136,45 @@
     # build nav from self + parent + parent's items
     return H.Navigation('navigation')
 
+def build_function_navigation(linker, dsa, dotted_name):
+    navitems = []
+    path = dotted_name.split('.')
+    indent = 0
+    if len(path) > 1:
+        parent_dotted_name = '.'.join(path[:-1])
+        navitems.append(indent * 2 * u'\xa0')
+        try:
+            obj = dsa.get_obj(parent_dotted_name)
+        except KeyError:
+            navitems.append(parent_dotted_name)
+            navitems.append(H.br())
+            indent += 1
+            navitems.append(indent * 2 * u'\xa0')
+            navitems.append(H.NavigationItem(
+                                H.a(dotted_name,
+                                    href=linker.get_lazyhref(dotted_name))))
+        else:
+            navitems.append(H.NavigationItem(
+                                H.a(parent_dotted_name,
+                                    href=linker.get_lazyhref(
+                                            parent_dotted_name))))
+            navitems.append(H.br())
+            indent += 1
+            navitems.append(indent * 2 * u'\xa0')
+            navitems.append(H.NavigationItem(
+                                H.a(dotted_name.split('.')[-1],
+                                    href=linker.get_lazyhref(dotted_name))))
+            navitems.append(H.br())
+            indent += 1
+            for funcname in dsa.get_class_methods(dotted_name):
+                func_dotted_name = '%s.%s' % (dotted_name, funcname)
+                navitems.append(indent * 2 * u'\xa0')
+                navitems.append(H.NavigationItem(
+                                    H.a(funcname,
+                                        href=linker.get_lazyhref(func_dotted_name))))
+                navitems.append(H.br())
+    return H.Navigation(*navitems)
+
 # the build_*_pages methods all do two-pass page generation (first pass builds
 # the link db, second uses it)
 def build_source_pages(linker, base):
@@ -166,7 +204,8 @@
                                dsa.get_class_methods(dotted_name)]
         build_method_api_pages(project, linker, dsa, base, method_dotted_names)
     for dotted_name, tag, nav, reltargetpath in passed:
-        page = wrap_page(project, linker, tag, nav)
+        page = wrap_page(project, linker,
+                         'api documentation for %s' % (dotted_name,), tag, nav)
         content = page.unicode()
         targetpath = base.ensure(reltargetpath)
         targetpath.write(content.encode("utf8"))
@@ -174,20 +213,41 @@
 def build_method_api_pages(project, linker, dsa, base, methods_dotted_names):
     passed = []
     for dotted_name in methods_dotted_names:
+        print 'building full method view for', dotted_name
+        tag = build_full_method_view(linker, dsa, dotted_name)
+        nav = build_class_navigation(linker, dsa,
+                                     '.'.join(dotted_name.split('.')[:-1]))
+        reltargetpath = "api/%s.html" % (dotted_name,)
+        linker.set_link(dotted_name, reltargetpath)
+        passed.append((dotted_name, tag, nav, reltargetpath))
+    for dotted_name, tag, nav, reltargetpath in passed:
+        page = wrap_page(project, linker,
+                         'api documentation for %s' % (dotted_name,), tag, nav)
+        content = page.unicode()
+        targetpath = base.join(reltargetpath)
+        targetpath.ensure()
+        targetpath.write(content.encode("utf8"))
+
+def build_function_api_pages(project, linker, dsa, base, methods_dotted_names):
+    passed = []
+    for dotted_name in methods_dotted_names:
+        print 'building function view for', dotted_name
+        # XXX should we call build_full_function_view instead?
         tag = build_full_method_view(linker, dsa, dotted_name)
-        nav = build_method_navigation(linker, dotted_name)
+        nav = build_function_navigation(linker, dsa, dotted_name)
         reltargetpath = "api/%s.html" % (dotted_name,)
         linker.set_link(dotted_name, reltargetpath)
         passed.append((dotted_name, tag, nav, reltargetpath))
     for dotted_name, tag, nav, reltargetpath in passed:
-        page = wrap_page(project, linker, tag, nav)
+        page = wrap_page(project, linker,
+                         'api documentation for %s' % (dotted_name,), tag, nav)
         content = page.unicode()
         targetpath = base.join(reltargetpath)
         targetpath.ensure()
         targetpath.write(content.encode("utf8"))
 
-def wrap_page(project, linker, contentel, navel):
-    page = LayoutPage(project, 'XXX Page Title', nav=navel)
+def wrap_page(project, linker, title, contentel, navel):
+    page = LayoutPage(project, title, nav=navel)
     page.set_content(contentel)
     return page
 

Modified: py/dist/py/apigen/testing/test_apigen_example.py
==============================================================================
--- py/dist/py/apigen/testing/test_apigen_example.py	(original)
+++ py/dist/py/apigen/testing/test_apigen_example.py	Fri Jan 12 14:06:35 2007
@@ -27,6 +27,7 @@
     temp.ensure('pkg/somesubclass.py').write(py.code.Source("""
         from someclass import SomeClass
         class SomeSubClass(SomeClass):
+            " docstring somesubclass "
             def get_somevar(self):
                 return self.somevar + 1
     """))
@@ -64,9 +65,9 @@
         print html
         parseString(html)
 
-    def test_build_method_api_pages(self):
-        base = py.test.ensuretemp('build_method_api_pages')
-        build_method_api_pages(self.project, self.linker, self.dsa, base,
+    def test_build_function_api_pages(self):
+        base = py.test.ensuretemp('build_function_api_pages')
+        build_function_api_pages(self.project, self.linker, self.dsa, base,
                                ['pkg.sub.func'])
         funcfile = base.join('api/pkg.sub.func.html')
         assert funcfile.check()



More information about the pytest-commit mailing list