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

guido at codespeak.net guido at codespeak.net
Sat Jan 13 19:44:55 CET 2007


Author: guido
Date: Sat Jan 13 19:44:52 2007
New Revision: 36698

Modified:
   py/dist/py/apigen/apigen.py
   py/dist/py/apigen/htmlgen.py
   py/dist/py/apigen/testing/test_apigen_example.py
   py/dist/py/apigen/testing/test_apigen_functional.py
Log:
Building pages for namespaces, fixed bare except (now catches
SystemExit/KeyboardInterrupt).


Modified: py/dist/py/apigen/apigen.py
==============================================================================
--- py/dist/py/apigen/apigen.py	(original)
+++ py/dist/py/apigen/apigen.py	Sat Jan 13 19:44:52 2007
@@ -34,6 +34,8 @@
         targetdir = py.path.local('/tmp/py_apigen_output')
     targetdir.ensure(dir=True)
 
+    all_names = dsa._get_names(filter=lambda x, y: True)
+    ns_data = htmlgen.prepare_namespace_api_pages(l, dsa, targetdir, all_names)
     class_names = dsa.get_class_names()
     class_data, method_data = htmlgen.prepare_class_api_pages(l, dsa,
                                                               targetdir,
@@ -43,6 +45,7 @@
                                                   function_names)
     source_data = htmlgen.prepare_source_pages(l, pkgdir, targetdir)
 
+    htmlgen.build_namespace_api_pages(ns_data, proj, targetdir)
     htmlgen.build_class_api_pages(class_data, proj, targetdir)
     htmlgen.build_method_api_pages(method_data, proj, targetdir)
     htmlgen.build_function_api_pages(func_data, proj, targetdir)

Modified: py/dist/py/apigen/htmlgen.py
==============================================================================
--- py/dist/py/apigen/htmlgen.py	(original)
+++ py/dist/py/apigen/htmlgen.py	Sat Jan 13 19:44:52 2007
@@ -11,6 +11,15 @@
     class Description(html.div):
         style = html.Style(margin_left='10em')
     
+    class NamespaceDescription(Description):
+        pass
+
+    class NamespaceItem(html.div):
+        pass
+
+    class NamespaceDef(html.h1):
+        pass
+
     class ClassDescription(Description):
         pass
 
@@ -117,14 +126,50 @@
                                            '%s.%s' % (dotted_name, method))
     return snippet
 
-def build_method_view(base, linker, dsa, dotted_name):
-    pass
+def build_namespace_view(base, linker, dsa, namespace_dotted_name,
+                         item_dotted_names):
+    """ build the html for a namespace (module) """
+    snippet = H.NamespaceDescription(
+        H.NamespaceDef(namespace_dotted_name),
+    )
+    for dotted_name in item_dotted_names:
+        snippet.append(
+            H.NamespaceItem(
+                H.a(dotted_name.split('.')[-1],
+                    href=linker.get_lazyhref(dotted_name)
+                )
+            )
+        )
+    return snippet
 
 # XXX nav functions need cleanup!!
-def build_package_navigation(linker, dotted_name):
-    # import dotted name
-    # build nav from sub items
-    return H.Navigation('navigation')
+def build_namespace_navigation(linker, dsa, dotted_name, item_dotted_names):
+    navitems = []
+    path = dotted_name.split('.')
+    indent = 0
+    if len(path) > 1:
+        parent_dotted_name = '.'.join(path[:-1])
+        navitems.append(indent * 2 * u'\xa0')
+        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 item_dotted_name in item_dotted_names:
+        navitems.append(indent * 2 * u'\xa0')
+        itemname = item_dotted_name.split('.')[-1]
+        navitems.append(H.NavigationItem(
+                            H.a(itemname,
+                                href=linker.get_lazyhref(item_dotted_name))))
+        navitems.append(H.br())
+    return H.Navigation(*navitems)
 
 def build_class_navigation(linker, dsa, dotted_name):
     navitems = []
@@ -133,15 +178,10 @@
     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)
-        else:
-            navitems.append(H.NavigationItem(
-                                H.a(parent_dotted_name,
-                                    href=linker.get_lazyhref(
-                                            parent_dotted_name))))
+        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')
@@ -249,6 +289,8 @@
         if fspath.check(ext='.py'):
             try:
                 tag, nav = build_source_python_page(fspath)
+            except (KeyboardInterrupt, SystemError):
+                raise
             except: # XXX strange stuff going wrong at times... need to fix
                 tag, nav = build_source_nonpython_page(fspath)
         elif fspath.check(dir=True):
@@ -325,6 +367,40 @@
         targetpath.ensure()
         targetpath.write(content.encode("utf8"))
 
+def create_namespace_tree(dsa, dotted_names):
+    ret = {}
+    class_names = dsa.get_class_names()
+    for dn in dotted_names:
+        if not '.' in dn:
+            continue
+        namespace, itemname = dn.rsplit('.', 1)
+        if namespace in class_names:
+            continue
+        ret.setdefault(namespace, []).append(dn)
+    return ret
+
+def prepare_namespace_api_pages(linker, dsa, base, all_dotted_names):
+    passed = []
+    namespace_tree = create_namespace_tree(dsa, all_dotted_names)
+    for dotted_name, subitem_dotted_names in namespace_tree.iteritems():
+        tag = build_namespace_view(base, linker, dsa, dotted_name,
+                                   subitem_dotted_names)
+        nav = build_namespace_navigation(linker, dsa, dotted_name,
+                                         subitem_dotted_names)
+        reltargetpath = "api/%s.html" % (dotted_name,)
+        linker.set_link(dotted_name, reltargetpath)
+        passed.append((dotted_name, tag, nav, reltargetpath))
+    return passed
+
+def build_namespace_api_pages(data, project, outputbase):
+    for dotted_name, tag, nav, reltargetpath in data:
+        page = wrap_page(project, 'index of namespace %s' % (dotted_name,),
+                         tag, nav, outputbase)
+        content = page.unicode()
+        targetpath = outputbase.join(reltargetpath)
+        targetpath.ensure()
+        targetpath.write(content.encode("utf8"))
+
 def wrap_page(project, title, contentel, navel, outputpath):
     page = LayoutPage(project, title, nav=navel, encoding='UTF-8',
                       stylesheeturl='style.css',

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	Sat Jan 13 19:44:52 2007
@@ -103,6 +103,10 @@
         data, methodsdata = prepare_class_api_pages(self.linker, self.dsa,
                                                     base, ['pkg.SomeClass'])
         prepare_source_pages(self.linker, self.fs_root, base)
+        prepare_namespace_api_pages(self.linker, self.dsa, base,
+                                    ['pkg.sub.func',
+                                     'pkg.SomeClass',
+                                     'pkg.SomeSubClass'])
         build_class_api_pages(data, self.project, base)
         build_method_api_pages(methodsdata, self.project, base)
         clsfile = base.join('api/pkg.SomeClass.html')
@@ -115,6 +119,10 @@
         data, methodsdata = prepare_class_api_pages(self.linker, self.dsa,
                                 base, ['pkg.SomeSubClass', 'pkg.SomeClass'])
         prepare_source_pages(self.linker, self.fs_root, base)
+        prepare_namespace_api_pages(self.linker, self.dsa, base,
+                                    ['pkg.sub.func',
+                                     'pkg.SomeClass',
+                                     'pkg.SomeSubClass'])
         build_class_api_pages(data, self.project, base)
         build_method_api_pages(methodsdata, self.project, base)
         clsfile = base.join('api/pkg.SomeClass.html')
@@ -129,6 +137,10 @@
         data, methodsdata = prepare_class_api_pages(self.linker, self.dsa,
                                 base, ['pkg.SomeSubClass', 'pkg.SomeClass'])
         prepare_source_pages(self.linker, self.fs_root, base)
+        prepare_namespace_api_pages(self.linker, self.dsa, base,
+                                    ['pkg.sub.func',
+                                     'pkg.SomeClass',
+                                     'pkg.SomeSubClass'])
         build_class_api_pages(data, self.project, base)
         build_method_api_pages(methodsdata, self.project, base)
         clsfile = base.join('api/pkg.SomeSubClass.html')
@@ -149,6 +161,10 @@
         data, methodsdata = prepare_class_api_pages(self.linker, self.dsa,
                                 base, ['pkg.SomeSubClass', 'pkg.SomeClass'])
         sourcedata = prepare_source_pages(self.linker, self.fs_root, base)
+        prepare_namespace_api_pages(self.linker, self.dsa, base,
+                                    ['pkg.sub.func',
+                                     'pkg.SomeClass',
+                                     'pkg.SomeSubClass'])
         build_class_api_pages(data, self.project, base)
         build_method_api_pages(methodsdata, self.project, base)
         build_source_pages(sourcedata, self.project, base)
@@ -156,3 +172,45 @@
         assert funchtml.find('href="source/pkg/someclass.py.html"') > -1
         _checkhtml(funchtml)
 
+    def test_create_namespace_tree(self):
+        namespace_tree = create_namespace_tree(self.dsa,
+                                               ['pkg.sub.func',
+                                                'pkg.SomeClass',
+                                                'pkg.SomeSubClass'])
+        assert namespace_tree == {'pkg.sub': ['pkg.sub.func'],
+                                  'pkg': ['pkg.SomeClass', 'pkg.SomeSubClass']}
+
+    def test_build_namespace_api_pages_index(self):
+        base = py.test.ensuretemp('build_namespace_api_pages')
+        data = prepare_namespace_api_pages(self.linker, self.dsa, base,
+                                           ['pkg.sub.func',
+                                            'pkg.SomeClass',
+                                            'pkg.SomeSubClass'])
+        prepare_class_api_pages(self.linker, self.dsa, base,
+                                ['pkg.SomeClass', 'pkg.SomeSubClass'])
+        prepare_function_api_pages(self.linker, self.dsa, base,
+                                   ['pkg.sub.func'])
+        prepare_source_pages(self.linker, self.fs_root, base)
+        build_namespace_api_pages(data, self.project, base)
+        pkgfile = base.join('api/pkg.html')
+        assert pkgfile.check()
+        html = pkgfile.read()
+        _checkhtml(html)
+
+    def test_build_namespace_api_pages_subnamespace(self):
+        base = py.test.ensuretemp('build_namespace_api_pages')
+        data = prepare_namespace_api_pages(self.linker, self.dsa, base,
+                                           ['pkg.sub.func',
+                                            'pkg.SomeClass',
+                                            'pkg.SomeSubClass'])
+        prepare_class_api_pages(self.linker, self.dsa, base,
+                                ['pkg.SomeClass', 'pkg.SomeSubClass'])
+        prepare_function_api_pages(self.linker, self.dsa, base,
+                                   ['pkg.sub.func'])
+        prepare_source_pages(self.linker, self.fs_root, base)
+        build_namespace_api_pages(data, self.project, base)
+        subfile = base.join('api/pkg.sub.html')
+        assert subfile.check()
+        html = subfile.read()
+        _checkhtml(html)
+

Modified: py/dist/py/apigen/testing/test_apigen_functional.py
==============================================================================
--- py/dist/py/apigen/testing/test_apigen_functional.py	(original)
+++ py/dist/py/apigen/testing/test_apigen_functional.py	Sat Jan 13 19:44:52 2007
@@ -28,6 +28,10 @@
     assert someclass_init_api.check(file=True)
     assert someclass_init_api.read().find(
             '<a href="api/pkg.SomeClass.__init__.html">__init__</a>') > -1
+    namespace_api = apidir.join('pkg.html')
+    assert namespace_api.check(file=True)
+    assert namespace_api.read().find(
+            '<a href="api/pkg.SomeClass.html">SomeClass</a>') > -1
 
     sourcedir = tempdir.join('source')
     assert sourcedir.check(dir=True)



More information about the pytest-commit mailing list