[py-svn] r36282 - in py/dist/py/apigen: rest rest/testing source tracer

fijal at codespeak.net fijal at codespeak.net
Mon Jan 8 16:50:21 CET 2007


Author: fijal
Date: Mon Jan  8 16:50:20 2007
New Revision: 36282

Modified:
   py/dist/py/apigen/rest/genrest.py
   py/dist/py/apigen/rest/testing/test_rest.py
   py/dist/py/apigen/source/server.py
   py/dist/py/apigen/tracer/docstorage.py
Log:
Add a link to source viewer.


Modified: py/dist/py/apigen/rest/genrest.py
==============================================================================
--- py/dist/py/apigen/rest/genrest.py	(original)
+++ py/dist/py/apigen/rest/genrest.py	Mon Jan  8 16:50:20 2007
@@ -17,6 +17,9 @@
     There should exist various classes for that, different for Trac,
     different for CVSView, etc.
     """
+    def getlinkobj(self, obj, name):
+        return None
+    
     def getlink(self, filename, lineno, funcname):
         raise NotImplementedError("Abstract link writer")
     
@@ -57,6 +60,8 @@
             self.baseurl = baseurl[:-1]
 
     def getlink(self, filename, lineno, funcname):
+        if filename.endswith('.pyc'):
+            filename = filename[:-1]
         if filename is None:
             return "<UNKNOWN>:%s" % funcname,""
         pkgpath = self.getpkgpath(filename)
@@ -73,6 +78,13 @@
         return "%s:%s" % (relname, funcname),\
             "%s%s#%s" % (self.baseurl, relname, funcname)
 
+    def getlinkobj(self, name, obj):
+        try:
+            filename = sys.modules[obj.__module__].__file__
+            return self.getlink(filename, 0, name)
+        except AttributeError:
+            return None
+
 class DirectPaste(AbstractLinkWriter):
     """ No-link writer (inliner)
     """
@@ -272,6 +284,9 @@
         for cls, bases, functions in classes:
             rest = [Title('class: %s' % (cls,), belowchar='='),
                     LiteralBlock(self.dsa.get_doc(cls))]
+            # link to source
+            self.dsa.get_class_definition(cls)
+            
             if bases:
                 rest.append(Title('base classes:', belowchar='^')),
                 for base in bases:
@@ -378,8 +393,12 @@
         else:
             title = Title('function: %s' % (functionname,),
                           belowchar=belowchar)
+        
         lst = [title, LiteralBlock(self.dsa.get_doc(functionname)),
                LiteralBlock(self.dsa.get_function_definition(functionname))]
+        link_to_function = self.linkgen.getlinkobj(functionname, self.dsa.get_obj(functionname))
+        if link_to_function:
+            lst.insert(1, Paragraph(Text("source: "), Link(*link_to_function)))
         
         opar = Paragraph(Strong('origin'), ":")
         if origin:

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	Mon Jan  8 16:50:20 2007
@@ -437,3 +437,20 @@
         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
 
+    def test_sourceview_fun(self):
+        def f():
+            pass
+
+        descs = {'f':f}
+        ds = DocStorage().from_dict(descs)
+        t = Tracer(ds)
+        t.start_tracing()
+        f()
+        t.end_tracing()
+        tempdir = temppath.ensure("sourceview_fun", dir=True)
+        lg = SourceView('http://localhost:8000')
+        r = RestGen(ds, lg, DirWriter(tempdir))
+        r.write()
+        self.check_rest(tempdir)
+        assert tempdir.join('function_f.txt').open().read().find(
+            '.. _`/py/apigen/rest/testing/test\_rest.py\:f`: http://localhost:8000/py/apigen/rest/testing/test_rest.py#f') != -1

Modified: py/dist/py/apigen/source/server.py
==============================================================================
--- py/dist/py/apigen/source/server.py	(original)
+++ py/dist/py/apigen/source/server.py	Mon Jan  8 16:50:20 2007
@@ -41,7 +41,7 @@
         return f
 
 def _main():
-    server.start_server(handler=Handler, start_new=False)
+    server.start_server(handler=Handler)
 
 if __name__ == '__main__':
     _main()

Modified: py/dist/py/apigen/tracer/docstorage.py
==============================================================================
--- py/dist/py/apigen/tracer/docstorage.py	(original)
+++ py/dist/py/apigen/tracer/docstorage.py	Mon Jan  8 16:50:20 2007
@@ -288,6 +288,9 @@
                 retval.append(desc)
         return retval
 
+    def get_class_definition(self, name):
+        desc = self.ds.descs[name]
+
     def desc_from_pyobj(self, pyobj, name):
         for desc in self.ds.descs.values():
             if isinstance(desc, ClassDesc) and desc.pyobj is pyobj:
@@ -299,3 +302,5 @@
         # and make sure we'll not try to link to it directly
         return desc
 
+    def get_obj(self, name):
+        return self.ds.descs[name].pyobj


More information about the py-svn mailing list