[py-svn] r37395 - in py/trunk/py/apigen: . testing
guido at codespeak.net
guido at codespeak.net
Fri Jan 26 16:34:30 CET 2007
Author: guido
Date: Fri Jan 26 16:34:28 2007
New Revision: 37395
Modified:
py/trunk/py/apigen/apigen.py
py/trunk/py/apigen/htmlgen.py
py/trunk/py/apigen/testing/test_apigen_example.py
py/trunk/py/apigen/testing/test_apigen_functional.py
Log:
Fixed some small issues in source nav, turned namespace_tree into an instance
var (finally! :), changed the api nav so it now shows the full tree with the
current item unfolded + siblings of itself and all parents (+ children if it's
a namespace item).
Modified: py/trunk/py/apigen/apigen.py
==============================================================================
--- py/trunk/py/apigen/apigen.py (original)
+++ py/trunk/py/apigen/apigen.py Fri Jan 26 16:34:28 2007
@@ -14,11 +14,7 @@
def get_documentable_items(pkgdir):
sys.path.insert(0, str(pkgdir.dirpath()))
rootmod = __import__(pkgdir.basename)
- #rootmod = import_pkgdir(pkgdir)
- if hasattr(rootmod, '__package__'):
- return rootmod
- # XXX fix non-initpkg situations(?)
- return {}
+ return rootmod
def build(pkgdir, dsa):
l = linker.Linker()
@@ -32,15 +28,14 @@
all_names = dsa._get_names(filter=lambda x, y: True)
namespace_tree = htmlgen.create_namespace_tree(all_names)
- apb = htmlgen.ApiPageBuilder(targetdir, l, dsa, pkgdir)
+ apb = htmlgen.ApiPageBuilder(targetdir, l, dsa, pkgdir, namespace_tree)
spb = htmlgen.SourcePageBuilder(targetdir, l, pkgdir)
- ns_data = apb.prepare_namespace_pages(namespace_tree)
+ ns_data = apb.prepare_namespace_pages()
class_names = dsa.get_class_names()
- class_data = apb.prepare_class_pages(namespace_tree,
- class_names)
+ class_data = apb.prepare_class_pages(class_names)
function_names = dsa.get_function_names()
- func_data = apb.prepare_function_pages(namespace_tree, function_names)
+ func_data = apb.prepare_function_pages(function_names)
source_data = spb.prepare_pages(pkgdir)
apb.build_namespace_pages(ns_data, proj)
Modified: py/trunk/py/apigen/htmlgen.py
==============================================================================
--- py/trunk/py/apigen/htmlgen.py (original)
+++ py/trunk/py/apigen/htmlgen.py Fri Jan 26 16:34:28 2007
@@ -180,16 +180,17 @@
path = relpath.split(os.path.sep)
indent = 0
# build links to parents
- for i in xrange(len(path)):
- dirpath = os.path.sep.join(path[:i])
- abspath = self.projroot.join(dirpath).strpath
- if i == 0:
- text = 'root'
- else:
- text = path[i-1]
- nav.append(build_navitem_html(self.linker, text, abspath,
- indent, False))
- indent += 1
+ if relpath != '':
+ for i in xrange(len(path)):
+ dirpath = os.path.sep.join(path[:i])
+ abspath = self.projroot.join(dirpath).strpath
+ if i == 0:
+ text = self.projroot.basename
+ else:
+ text = path[i-1]
+ nav.append(build_navitem_html(self.linker, text, abspath,
+ indent, False))
+ indent += 1
# build siblings or children and self
if fspath.check(dir=True):
# we're a dir, build ourselves and our children
@@ -296,12 +297,13 @@
class ApiPageBuilder(AbstractPageBuilder):
""" builds the html for an api docs page """
- def __init__(self, base, linker, dsa, projroot):
+ def __init__(self, base, linker, dsa, projroot, namespace_tree):
self.base = base
self.linker = linker
self.dsa = dsa
self.projroot = projroot
self.projpath = py.path.local(projroot)
+ self.namespace_tree = namespace_tree
def build_callable_view(self, dotted_name):
""" build the html for a class method """
@@ -428,18 +430,17 @@
)
return snippet
- def prepare_class_pages(self, namespace_tree, classes_dotted_names):
+ def prepare_class_pages(self, classes_dotted_names):
passed = []
for dotted_name in sorted(classes_dotted_names):
parent_dotted_name, _ = split_of_last_part(dotted_name)
try:
- sibling_dotted_names = namespace_tree[parent_dotted_name]
+ sibling_dotted_names = self.namespace_tree[parent_dotted_name]
except KeyError:
# no siblings (built-in module or sth)
sibling_dotted_names = []
tag = H.Content(self.build_class_view(dotted_name))
- nav = self.build_navigation(parent_dotted_name,
- sibling_dotted_names, dotted_name)
+ nav = self.build_navigation(dotted_name, False)
reltargetpath = "api/%s.html" % (dotted_name,)
self.linker.set_link(dotted_name, reltargetpath)
passed.append((dotted_name, tag, nav, reltargetpath))
@@ -451,17 +452,16 @@
title = 'api documentation for %s' % (dotted_name,)
self.write_page(title, reltargetpath, project, tag, nav)
- def prepare_method_pages(self, namespace_tree, method_dotted_names):
+ def prepare_method_pages(self, method_dotted_names):
# XXX note that even though these pages are still built, there's no nav
# pointing to them anymore...
passed = []
for dotted_name in sorted(method_dotted_names):
parent_dotted_name, _ = split_of_last_part(dotted_name)
module_dotted_name, _ = split_of_last_part(parent_dotted_name)
- sibling_dotted_names = namespace_tree[module_dotted_name]
+ sibling_dotted_names = self.namespace_tree[module_dotted_name]
tag = self.build_callable_view(dotted_name)
- nav = self.build_navigation(parent_dotted_name,
- sibling_dotted_names, dotted_name)
+ nav = self.build_navigation(dotted_name, False)
reltargetpath = "api/%s.html" % (dotted_name,)
self.linker.set_link(dotted_name, reltargetpath)
passed.append((dotted_name, tag, nav, reltargetpath))
@@ -472,15 +472,14 @@
title = 'api documentation for %s' % (dotted_name,)
self.write_page(title, reltargetpath, project, tag, nav)
- def prepare_function_pages(self, namespace_tree, method_dotted_names):
+ def prepare_function_pages(self, method_dotted_names):
passed = []
for dotted_name in sorted(method_dotted_names):
# XXX should we create a build_function_view instead?
parent_dotted_name, _ = split_of_last_part(dotted_name)
- sibling_dotted_names = namespace_tree[parent_dotted_name]
+ sibling_dotted_names = self.namespace_tree[parent_dotted_name]
tag = H.Content(self.build_callable_view(dotted_name))
- nav = self.build_navigation(parent_dotted_name,
- sibling_dotted_names, dotted_name)
+ nav = self.build_navigation(dotted_name, False)
reltargetpath = "api/%s.html" % (dotted_name,)
self.linker.set_link(dotted_name, reltargetpath)
passed.append((dotted_name, tag, nav, reltargetpath))
@@ -491,22 +490,21 @@
title = 'api documentation for %s' % (dotted_name,)
self.write_page(title, reltargetpath, project, tag, nav)
- def prepare_namespace_pages(self, namespace_tree):
+ def prepare_namespace_pages(self):
passed = []
module_name = self.dsa.get_module_name().split('/')[-1]
- names = namespace_tree.keys()
+ names = self.namespace_tree.keys()
names.sort()
function_names = self.dsa.get_function_names()
class_names = self.dsa.get_class_names()
for dotted_name in sorted(names):
if dotted_name in function_names or dotted_name in class_names:
continue
- subitem_dotted_names = namespace_tree[dotted_name]
+ subitem_dotted_names = self.namespace_tree[dotted_name]
tag = H.Content(self.build_namespace_view(dotted_name,
subitem_dotted_names))
- nav = self.build_navigation(dotted_name, subitem_dotted_names,
- dotted_name)
+ nav = self.build_navigation(dotted_name, True)
if dotted_name == '':
reltargetpath = 'api/index.html'
else:
@@ -522,7 +520,39 @@
title = 'index of %s namespace' % (dotted_name,)
self.write_page(title, reltargetpath, project, tag, nav)
- def build_navigation(self, dotted_name, item_dotted_names, selection):
+ def build_navigation(self, dotted_name, build_children=True):
+ navitems = []
+
+ # top namespace, index.html
+ module_name = self.dsa.get_module_name().split('/')[-1]
+ navitems.append(build_navitem_html(self.linker, module_name, '', 0,
+ True))
+ def build_nav_level(dotted_name, depth=1):
+ navitems = []
+ path = dotted_name.split('.')[:depth]
+ siblings = self.namespace_tree.get('.'.join(path[:-1]))
+ for dn in sorted(siblings):
+ selected = dn == '.'.join(path)
+ sibpath = dn.split('.')
+ navitems.append(build_navitem_html(self.linker, sibpath[-1],
+ dn, depth,
+ selected))
+ if selected:
+ lastlevel = dn.count('.') == dotted_name.count('.')
+ if not lastlevel:
+ navitems += build_nav_level(dotted_name, depth+1)
+ elif lastlevel and build_children:
+ # XXX hack
+ navitems += build_nav_level('%s.' % (dotted_name,),
+ depth+2)
+
+ return navitems
+
+ navitems += build_nav_level(dotted_name)
+ return H.Navigation(*navitems)
+
+
+
navitems = []
# top namespace, index.html
Modified: py/trunk/py/apigen/testing/test_apigen_example.py
==============================================================================
--- py/trunk/py/apigen/testing/test_apigen_example.py (original)
+++ py/trunk/py/apigen/testing/test_apigen_example.py Fri Jan 26 16:34:28 2007
@@ -104,15 +104,19 @@
self.base = base = py.test.ensuretemp('%s_%s' % (
self.__class__.__name__, meth.im_func.func_name))
self.linker = linker = LinkerForTests()
- self.apb = ApiPageBuilder(base, linker, self.dsa, self.fs_root)
- self.spb = SourcePageBuilder(base, linker, self.fs_root)
- self.namespace_tree = create_namespace_tree(['main.sub',
- 'main.sub.func',
- 'main.SomeClass',
- 'main.SomeSubClass',
- 'main.SomeInstance',
- 'other.foo',
- 'other.bar'])
+ namespace_tree = create_namespace_tree(['main.sub',
+ 'main.sub.func',
+ 'main.SomeClass',
+ 'main.SomeSubClass',
+ 'main.SomeInstance',
+ 'other.foo',
+ 'other.bar'])
+ self.namespace_tree = namespace_tree
+ self.apb = ApiPageBuilder(base, linker, self.dsa,
+ self.fs_root.join(self.pkg_name),
+ namespace_tree)
+ self.spb = SourcePageBuilder(base, linker,
+ self.fs_root.join(self.pkg_name))
class TestApiPageBuilder(AbstractBuilderTest):
def test_build_callable_view(self):
@@ -123,7 +127,8 @@
pkg.main.sub.func(10)
pkg.main.sub.func(pkg.main.SomeClass(10))
t.end_tracing()
- apb = ApiPageBuilder(self.base, self.linker, dsa, self.fs_root)
+ apb = ApiPageBuilder(self.base, self.linker, dsa, self.fs_root,
+ self.namespace_tree)
snippet = apb.build_callable_view('main.sub.func')
html = snippet.unicode()
print html
@@ -149,8 +154,7 @@
_checkhtmlsnippet(html)
def test_build_function_pages(self):
- data = self.apb.prepare_function_pages(self.namespace_tree,
- ['main.sub.func'])
+ data = self.apb.prepare_function_pages(['main.sub.func'])
self.apb.build_function_pages(data, self.project)
funcfile = self.base.join('api/main.sub.func.html')
assert funcfile.check()
@@ -163,8 +167,7 @@
_checkhtmlsnippet(html)
def test_build_class_pages(self):
- data = self.apb.prepare_class_pages(self.namespace_tree,
- ['main.SomeClass',
+ data = self.apb.prepare_class_pages(['main.SomeClass',
'main.SomeSubClass'])
self.apb.build_class_pages(data, self.project)
clsfile = self.base.join('api/main.SomeClass.html')
@@ -173,8 +176,7 @@
_checkhtml(html)
def test_build_class_pages_instance(self):
- data = self.apb.prepare_class_pages(self.namespace_tree,
- ['main.SomeClass',
+ data = self.apb.prepare_class_pages(['main.SomeClass',
'main.SomeSubClass',
'main.SomeInstance'])
self.apb.build_class_pages(data, self.project)
@@ -187,8 +189,7 @@
])
def test_build_class_pages_nav_links(self):
- data = self.apb.prepare_class_pages(self.namespace_tree,
- ['main.SomeSubClass',
+ data = self.apb.prepare_class_pages(['main.SomeSubClass',
'main.SomeClass'])
# fake some stuff that would be built from other methods
self.linker.set_link('', 'api/index.html')
@@ -212,8 +213,7 @@
_checkhtml(html)
def test_build_class_pages_base_link(self):
- data = self.apb.prepare_class_pages(self.namespace_tree,
- ['main.SomeSubClass',
+ data = self.apb.prepare_class_pages(['main.SomeSubClass',
'main.SomeClass'])
self.apb.build_class_pages(data, self.project)
clsfile = self.base.join('api/main.SomeSubClass.html')
@@ -227,8 +227,7 @@
_checkhtml(html)
def test_source_links(self):
- data = self.apb.prepare_class_pages(self.namespace_tree,
- ['main.SomeSubClass',
+ data = self.apb.prepare_class_pages(['main.SomeSubClass',
'main.SomeClass'])
sourcedata = self.spb.prepare_pages(self.fs_root)
self.apb.build_class_pages(data, self.project)
@@ -238,7 +237,7 @@
_checkhtml(funchtml)
def test_build_namespace_pages(self):
- data = self.apb.prepare_namespace_pages(self.namespace_tree)
+ data = self.apb.prepare_namespace_pages()
self.apb.build_namespace_pages(data, self.project)
mainfile = self.base.join('api/main.html')
assert mainfile.check()
@@ -258,7 +257,7 @@
_checkhtml(otherhtml)
def test_build_namespace_pages_index(self):
- data = self.apb.prepare_namespace_pages(self.namespace_tree)
+ data = self.apb.prepare_namespace_pages()
self.apb.build_namespace_pages(data, self.project)
pkgfile = self.base.join('api/index.html')
assert pkgfile.check()
@@ -267,7 +266,7 @@
_checkhtml(html)
def test_build_namespace_pages_subnamespace(self):
- data = self.apb.prepare_namespace_pages(self.namespace_tree)
+ data = self.apb.prepare_namespace_pages()
self.apb.build_namespace_pages(data, self.project)
subfile = self.base.join('api/main.sub.html')
assert subfile.check()
@@ -275,8 +274,7 @@
_checkhtml(html)
def test_build_function_api_pages_nav(self):
- data = self.apb.prepare_function_pages(self.namespace_tree,
- ['main.sub.func'])
+ data = self.apb.prepare_function_pages(['main.sub.func'])
self.linker.set_link('', 'api/index.html')
self.linker.set_link('main', 'api/main.html')
self.linker.set_link('main.sub', 'api/main.sub.html')
@@ -293,22 +291,30 @@
_checkhtml(html)
def test_build_function_navigation(self):
- self.apb.prepare_namespace_pages(self.namespace_tree)
- self.apb.prepare_function_pages(self.namespace_tree, ['main.sub.func'])
- nav = self.apb.build_navigation('main.sub', ['main.sub.func'],
- 'main.sub.func')
+ self.apb.prepare_namespace_pages()
+ self.apb.prepare_function_pages(['main.sub.func'])
+ self.apb.prepare_class_pages(['main.SomeClass',
+ 'main.SomeSubClass',
+ 'main.SomeInstance'])
+ nav = self.apb.build_navigation('main.sub.func', False)
html = nav.unicode(indent=0)
print html.encode('UTF-8')
- assert (u'<div><a href="api/index.html">pkg</a></div>'
- u'<div>\xa0\xa0<a href="api/main.html">main</a></div>'
- u'<div>\xa0\xa0\xa0\xa0'
+ assert (u'<div class="selected"><a href="api/index.html">pkg</a></div>'
+ u'<div class="selected">\xa0\xa0<a href="api/main.html">main</a></div>'
+ u'<div>\xa0\xa0\xa0\xa0<a href="api/main.SomeClass.html">'
+ u'SomeClass</a></div>'
+ u'<div>\xa0\xa0\xa0\xa0<a href="api/main.SomeInstance.html">'
+ u'SomeInstance</a></div>'
+ u'<div>\xa0\xa0\xa0\xa0<a href="api/main.SomeSubClass.html">'
+ u'SomeSubClass</a></div>'
+ u'<div class="selected">\xa0\xa0\xa0\xa0'
u'<a href="api/main.sub.html">sub</a></div>'
u'<div class="selected">\xa0\xa0\xa0\xa0\xa0\xa0'
u'<a href="api/main.sub.func.html">func</a></div>'
) in html
def test_build_root_namespace_view(self):
- data = self.apb.prepare_namespace_pages(self.namespace_tree)
+ data = self.apb.prepare_namespace_pages()
self.apb.build_namespace_pages(data, self.project)
rootfile = self.base.join('api/index.html')
assert rootfile.check()
@@ -332,7 +338,6 @@
print html
run_string_sequence_test(html, [
'href="../../style.css"',
- '<a href="../index.html">root</a>',
'<a href="index.html">pkg</a>',
'<a href="someclass.py.html">someclass.py</a>',
'<a href="somesubclass.py.html">somesubclass.py</a>',
@@ -347,7 +352,6 @@
print html
run_string_sequence_test(html, [
'href="../../style.css"',
- '<a href="../index.html">root</a>',
'<a href="index.html">pkg</a>',
'<a href="func.py.html">func.py</a>',
'<a href="someclass.py.html">someclass.py</a>',
@@ -362,7 +366,6 @@
html = nav.unicode(indent=0)
print html.encode('UTF-8')
run_string_sequence_test(html, [
- 'href="source/index.html">root',
'href="source/pkg/index.html">pkg',
'href="source/pkg/func.py.html">func.py',
'href="source/pkg/someclass.py.html">someclass.py',
Modified: py/trunk/py/apigen/testing/test_apigen_functional.py
==============================================================================
--- py/trunk/py/apigen/testing/test_apigen_functional.py (original)
+++ py/trunk/py/apigen/testing/test_apigen_functional.py Fri Jan 26 16:34:28 2007
@@ -4,6 +4,7 @@
"""
import py
+from py.__.apigen import apigen
def setup_fs_project():
temp = py.test.ensuretemp('apigen_functional')
@@ -70,6 +71,13 @@
"""))
return temp, 'pkg'
+def test_get_documentable_items():
+ fs_root, package_name = setup_fs_project()
+ documentable = apigen.get_documentable_items(fs_root.join(package_name))
+ assert documentable.__package__.exportdefs.keys() == [
+ 'main.sub.func', 'main.func', 'main.SomeTestSubClass',
+ 'main.SomeTestClass']
+
def test_apigen_functional():
fs_root, package_name = setup_fs_project()
tempdir = py.test.ensuretemp('test_apigen_functional_results')
More information about the pytest-commit
mailing list