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

fijal at codespeak.net fijal at codespeak.net
Thu Dec 7 16:04:47 CET 2006


Author: fijal
Date: Thu Dec  7 16:04:45 2006
New Revision: 35439

Modified:
   py/dist/py/apigen/rest/genrest.py
   py/dist/py/apigen/rest/testing/test_rest.py
Log:
Added SourceView link viewer


Modified: py/dist/py/apigen/rest/genrest.py
==============================================================================
--- py/dist/py/apigen/rest/genrest.py	(original)
+++ py/dist/py/apigen/rest/genrest.py	Thu Dec  7 16:04:45 2006
@@ -17,16 +17,9 @@
     There should exist various classes for that, different for Trac,
     different for CVSView, etc.
     """
-    def getlink(self, filename, lineno):
+    def getlink(self, filename, lineno, funcname):
         raise NotImplementedError("Abstract link writer")
     
-class ViewVC(AbstractLinkWriter):
-    """ Link writer for ViewVC version control viewer
-    """
-    def __init__(self, basepath):
-        # XXX: should try to guess from a working copy of svn
-        self.basepath = basepath
-    
     def getpkgpath(self, filename):
         # XXX: very simple thing
         path = py.path.local(filename).dirpath()
@@ -37,7 +30,14 @@
             except py.error.ENOENT:
                 return path
     
-    def getlink(self, filename, lineno):
+class ViewVC(AbstractLinkWriter):
+    """ Link writer for ViewVC version control viewer
+    """
+    def __init__(self, basepath):
+        # XXX: should try to guess from a working copy of svn
+        self.basepath = basepath
+    
+    def getlink(self, filename, lineno, funcname):
         path = str(self.getpkgpath(filename))
         assert filename.startswith(path), (
             "%s does not belong to package %s" % (filename, path))
@@ -49,17 +49,34 @@
             relname = relname.replace(sep, '/')
         return ('%s:%s' % (filename, lineno),
                 self.basepath + relname[1:] + '?view=markup')
+    
+class SourceView(AbstractLinkWriter):
+    def __init__(self, baseurl):
+        self.baseurl = baseurl
+
+    def getlink(self, filename, lineno, funcname):
+        pkgpath = self.getpkgpath(filename)
+        assert filename.startswith(str(pkgpath)), (
+            "%s does not belong to package %s" % (filename, pkgpath))
+        relname = filename[len(str(pkgpath)):]
+        if relname.endswith('.pyc'):
+            relname = relname[:-1]
+        sep = py.std.os.sep
+        if sep != '/':
+            relname = relname.replace(sep, '/')
+        return "%s:%s" % (relname, funcname),\
+            "%s%s#%s" % (self.baseurl, relname, funcname)
 
 class DirectPaste(AbstractLinkWriter):
     """ No-link writer (inliner)
     """
-    def getlink(self, filename, lineno):
+    def getlink(self, filename, lineno, funcname):
         return ('%s:%s' % (filename, lineno), "")
 
 class DirectFS(AbstractLinkWriter):
     """ Creates links to the files on the file system (for local docs)
     """
-    def getlink(self, filename, lineno):
+    def getlink(self, filename, lineno, funcname):
         return ('%s:%s' % (filename, lineno), 'file://%s' % (filename,))
 
 class PipeWriter(object):
@@ -446,7 +463,8 @@
         for line in call_site:
             lineno = line.lineno - line.code.firstlineno
             linkname, linktarget = self.linkgen.getlink(line.code.filename,
-                                                        line.lineno + 1)
+                                                        line.lineno + 1,
+                                                        funcname)
             if linktarget:
                 tbrest.append(Paragraph(Link(linkname, linktarget)))
             else:

Modified: py/dist/py/apigen/rest/testing/test_rest.py
==============================================================================
--- py/dist/py/apigen/rest/testing/test_rest.py	(original)
+++ py/dist/py/apigen/rest/testing/test_rest.py	Thu Dec  7 16:04:45 2006
@@ -8,7 +8,7 @@
 from py.__.apigen.rest.genrest import ViewVC, RestGen, PipeWriter, \
                                             DirWriter, FileWriter, \
                                             DirectPaste, DirectFS, \
-                                            HTMLDirWriter
+                                            HTMLDirWriter, SourceView
 from py.__.apigen.tracer.tracer import Tracer
 from py.__.apigen.tracer.docstorage import DocStorage
 
@@ -61,20 +61,20 @@
 
 def test_direct_link():
     fname = cut_pyc(__file__)
-    title, link = DirectPaste().getlink(fname, 2)
+    title, link = DirectPaste().getlink(fname, 2, "")
     assert title == '%s:%s' % (fname, 2)
     assert link == ''
 
 def test_viewvc_link():
     vcview = ViewVC("http://codespeak.net/viewvc/")
     fname = cut_pyc(__file__)
-    title, link = vcview.getlink(fname, 0)
+    title, link = vcview.getlink(fname, 0, "")
     assert title == '%s:%s' % (fname, 0)
     assert link == ('http://codespeak.net/viewvc/py/apigen/rest/'
                         'testing/test_rest.py?view=markup')
 
 def test_fs_link():
-    title, link = DirectFS().getlink('/foo/bar/baz.py', 100)
+    title, link = DirectFS().getlink('/foo/bar/baz.py', 100, "func")
     assert title == '/foo/bar/baz.py:100'
     assert link == 'file:///foo/bar/baz.py'
 
@@ -417,3 +417,23 @@
         r = RestGen(ds, lg, DirWriter(tempdir))
         r.write()
         self.check_rest(tempdir)
+
+    def test_sourceview(self):
+        class A:
+            def method(self):
+                pass
+        
+        descs = {'A':A}
+        ds = DocStorage().from_dict(descs)
+        t = Tracer(ds)
+        t.start_tracing()
+        A().method()
+        t.end_tracing()
+        lg = SourceView('http://localhost:8000')
+        tempdir = temppath.ensure("sourceview", dir=True)
+        r = RestGen(ds, lg, DirWriter(tempdir))
+        r.write()
+        self.check_rest(tempdir)
+        assert tempdir.join('traceback_A.method.0.txt').open().read().find(
+           '.. _`/py/apigen/rest/testing/test\_rest.py\:A.method`: http://localhost:8000/py/apigen/rest/testing/test_rest.py#A.method') != -1
+


More information about the py-svn mailing list