From 80a0045805e6163badfe534c98c3ff359530989b Mon Sep 17 00:00:00 2001 From: guido Date: Thu, 1 Feb 2007 23:30:51 +0100 Subject: [PATCH] [svn r37774] Adding support for checking generated API links (for link roles). --HG-- branch : trunk --- py/doc/conftest.py | 60 ++++++++++++++++++++++++----------------- py/doc/test_conftest.py | 14 +++++++++- 2 files changed, 48 insertions(+), 26 deletions(-) diff --git a/py/doc/conftest.py b/py/doc/conftest.py index 066ceb6d8..ab853f161 100644 --- a/py/doc/conftest.py +++ b/py/doc/conftest.py @@ -15,7 +15,7 @@ option = py.test.config.addoptions("documentation check options", ) _initialized = False -def checkdocutils(): +def checkdocutils(path): global _initialized try: import docutils @@ -23,8 +23,8 @@ def checkdocutils(): py.test.skip("docutils not importable") if not _initialized: from py.__.rest import directive - directive.register_linkrole('api', resolve_linkrole) - directive.register_linkrole('source', resolve_linkrole) + directive.register_linkrole('api', get_resolve_linkrole(path)) + directive.register_linkrole('source', get_resolve_linkrole(path)) _initialized = True def restcheck(path): @@ -32,7 +32,7 @@ def restcheck(path): if hasattr(path, 'localpath'): localpath = path.localpath _checkskip(localpath) - checkdocutils() + checkdocutils(localpath) import docutils.utils try: @@ -234,24 +234,34 @@ class DocDirectory(py.test.collect.Directory): return self.ReSTChecker(p, parent=self) Directory = DocDirectory -def resolve_linkrole(name, text): - if name == 'api': - if text == 'py': - return 'py', '../../apigen/api/index.html' - assert text.startswith('py.'), ( - 'api link "%s" does not point to the py package') % (text,) - dotted_name = text - if dotted_name.find('(') > -1: - dotted_name = dotted_name[:text.find('(')] - dotted_name = '.'.join(dotted_name.split('.')[1:]) # remove pkg root - return text, '../../apigen/api/%s.html' % (dotted_name,) - elif name == 'source': - assert text.startswith('py/'), ('source link "%s" does not point ' - 'to the py package') % (text,) - relpath = '/'.join(text.split('/')[1:]) - if relpath.endswith('/') or not relpath: - relpath += 'index.html' - else: - relpath += '.html' - return text, '../../apigen/source/%s' % (relpath,) - +def get_resolve_linkrole(checkpath=None): + # XXX yuck... + def resolve_linkrole(name, text): + if name == 'api': + if text == 'py': + ret = ('py', '../../apigen/api/index.html') + else: + assert text.startswith('py.'), ( + 'api link "%s" does not point to the py package') % (text,) + dotted_name = text + if dotted_name.find('(') > -1: + dotted_name = dotted_name[:text.find('(')] + # remove pkg root + dotted_name = '.'.join(dotted_name.split('.')[1:]) + ret = (text, '../../apigen/api/%s.html' % (dotted_name,)) + elif name == 'source': + assert text.startswith('py/'), ('source link "%s" does not point ' + 'to the py package') % (text,) + relpath = '/'.join(text.split('/')[1:]) + if relpath.endswith('/') or not relpath: + relpath += 'index.html' + else: + relpath += '.html' + ret = (text, '../../apigen/source/%s' % (relpath,)) + if checkpath: + if not py.path.local(checkpath).join(ret[1]).check(): + raise AssertionError( + '%s linkrole: %s points to non-existant path %s' % ( + name, ret[0], ret[1])) + return ret + return resolve_linkrole diff --git a/py/doc/test_conftest.py b/py/doc/test_conftest.py index 155c0c49e..0953ac673 100644 --- a/py/doc/test_conftest.py +++ b/py/doc/test_conftest.py @@ -70,7 +70,8 @@ def test_js_ignore(): assert len(l+l2) == 3 def test_resolve_linkrole(): - from py.__.doc.conftest import resolve_linkrole + from py.__.doc.conftest import get_resolve_linkrole + resolve_linkrole = get_resolve_linkrole(None) assert resolve_linkrole('api', 'py.foo.bar') == ( 'py.foo.bar', '../../apigen/api/foo.bar.html') assert resolve_linkrole('api', 'py.foo.bar()') == ( @@ -86,3 +87,14 @@ def test_resolve_linkrole(): 'py/', '../../apigen/source/index.html') py.test.raises(AssertionError, 'resolve_linkrole("source", "/foo/bar/")') +def test_resolve_linkrole_relpath(): + from py.__.doc.conftest import get_resolve_linkrole + pypath = tmpdir.join('py') + docpath = pypath.join('doc') + apipath = tmpdir.join('apigen/api') + apipath.ensure('foo.bar.html') + resolve_linkrole = get_resolve_linkrole(docpath) + + assert resolve_linkrole('api', 'py.foo.bar') + py.test.raises(AssertionError, "resolve_linkrole('api', 'py.foo.baz')") +