[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