[py-svn] r37782 - py/trunk/py/doc

guido at codespeak.net guido at codespeak.net
Fri Feb 2 01:01:06 CET 2007


Author: guido
Date: Fri Feb  2 01:00:50 2007
New Revision: 37782

Modified:
   py/trunk/py/doc/conftest.py
   py/trunk/py/doc/test_conftest.py
Log:
Changed the checking in resolve_linkrole() so that instead of the apigen
results (the directory with HTML files) it uses the py lib object tree and
source tree to find out whether links are valid.


Modified: py/trunk/py/doc/conftest.py
==============================================================================
--- py/trunk/py/doc/conftest.py	(original)
+++ py/trunk/py/doc/conftest.py	Fri Feb  2 01:00:50 2007
@@ -14,19 +14,18 @@
         )
 ) 
 
+_initialized = False
 def checkdocutils():
+    global _initialized
     try:
         import docutils
     except ImportError:
         py.test.skip("docutils not importable")
-
-def initrestdirectives(path):
-    from py.__.rest import directive
-    dirpath = path.dirpath()
-    # XXX note that this gets called for every test, because the path is
-    # different every test...
-    directive.register_linkrole('api', get_resolve_linkrole(dirpath))
-    directive.register_linkrole('source', get_resolve_linkrole(dirpath))
+    if not _initialized:
+        from py.__.rest import directive
+        directive.register_linkrole('api', resolve_linkrole)
+        directive.register_linkrole('source', resolve_linkrole)
+        _initialized = True
 
 def restcheck(path):
     localpath = path
@@ -34,7 +33,6 @@
         localpath = path.localpath
     _checkskip(localpath)
     checkdocutils() 
-    initrestdirectives(localpath)
     import docutils.utils
 
     try: 
@@ -236,35 +234,42 @@
             return self.ReSTChecker(p, parent=self) 
 Directory = DocDirectory
 
-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], py.path.local(checkpath).join(ret[1])))
-        return ret
-    return resolve_linkrole
+def resolve_linkrole(name, text, check=True):
+    if name == 'api':
+        if text == 'py':
+            return ('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
+            path = dotted_name.split('.')[1:]
+            dotted_name = '.'.join(path)
+            obj = py
+            if check:
+                for chunk in path:
+                    try:
+                        obj = getattr(obj, chunk)
+                    except AttributeError:
+                        raise AssertionError(
+                            'problem with linkrole :api:`%s`: can not resolve '
+                            'dotted name %s' % (text, dotted_name,))
+            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 check:
+            pkgroot = py.__package__.getpath()
+            abspath = pkgroot.join(relpath)
+            assert pkgroot.join(relpath).check(), (
+                    'problem with linkrole :source:`%s`: '
+                    'path %s does not exist' % (text, relpath))
+        if relpath.endswith('/') or not relpath:
+            relpath += 'index.html'
+        else:
+            relpath += '.html'
+        return (text, '../../apigen/source/%s' % (relpath,))
 

Modified: py/trunk/py/doc/test_conftest.py
==============================================================================
--- py/trunk/py/doc/test_conftest.py	(original)
+++ py/trunk/py/doc/test_conftest.py	Fri Feb  2 01:00:50 2007
@@ -70,31 +70,30 @@
     assert len(l+l2) == 3
 
 def test_resolve_linkrole():
-    from py.__.doc.conftest import get_resolve_linkrole
-    resolve_linkrole = get_resolve_linkrole(None)
-    assert resolve_linkrole('api', 'py.foo.bar') == (
+    from py.__.doc.conftest import resolve_linkrole
+    assert resolve_linkrole('api', 'py.foo.bar', False) == (
         'py.foo.bar', '../../apigen/api/foo.bar.html')
-    assert resolve_linkrole('api', 'py.foo.bar()') == (
+    assert resolve_linkrole('api', 'py.foo.bar()', False) == (
         'py.foo.bar()', '../../apigen/api/foo.bar.html')
-    assert resolve_linkrole('api', 'py') == (
+    assert resolve_linkrole('api', 'py', False) == (
         'py', '../../apigen/api/index.html')
     py.test.raises(AssertionError, 'resolve_linkrole("api", "foo.bar")')
-    assert resolve_linkrole('source', 'py/foo/bar.py') == (
+    assert resolve_linkrole('source', 'py/foo/bar.py', False) == (
         'py/foo/bar.py', '../../apigen/source/foo/bar.py.html')
-    assert resolve_linkrole('source', 'py/foo/') == (
+    assert resolve_linkrole('source', 'py/foo/', False) == (
         'py/foo/', '../../apigen/source/foo/index.html')
-    assert resolve_linkrole('source', 'py/') == (
+    assert resolve_linkrole('source', 'py/', False) == (
         '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')
+def test_resolve_linkrole_check_api():
+    from py.__.doc.conftest import resolve_linkrole
+    assert resolve_linkrole('api', 'py.test.ensuretemp')
     py.test.raises(AssertionError, "resolve_linkrole('api', 'py.foo.baz')")
 
+def test_resolve_linkrole_check_source():
+    from py.__.doc.conftest import resolve_linkrole
+    assert resolve_linkrole('source', 'py/path/common.py')
+    py.test.raises(AssertionError,
+                   "resolve_linkrole('source', 'py/foo/bar.py')")
+



More information about the pytest-commit mailing list