createdoc.py
author Sandro Knauß <knauss@netzguerilla.net>
Sun, 22 Jan 2012 23:53:27 +0100
branchdevel
changeset 108 cadc01b2bdc0
parent 92 f479738b4879
child 250 91890ea7ed81
permissions -rwxr-xr-x
model.user uses now the decorator DBDefer

#!/usr/bin/env python2.7
# -*- coding: utf-8 -*- 

from genshi.template import TemplateLoader

loader = TemplateLoader('doc/tmpl', auto_reload=True)

import re
import inspect
from iro.user import User as Current
from iro.controller.viewinterface import Interface as New

from createerm import createSchemaPlot, tables



class Link():
    def __init__(self,name,title):
        self.name=name
        self.title=title

    def getLink(self):
        return self.name

    def __getitem__(self,name):
        if name == "link":
            return self.getLink()
        return AttributeError(name)

class Site(Link):
    pass


class Keyword():
    def __init__(self,name,typ,description):
        self.name=name
        self.typ=typ
        self.description=description

def section(text):
    ret={}
    li=[]
    kw=None
    for line in text.split("\n"):
        if re.match("^\s*$",line):
            continue

        if line[0] not in (" ","\t"):
            if kw:
                ret[kw.name]=kw
                li.append(kw)
            l=re.match(r"^(?P<name>[a-zA-Z0-9-_.]*)\[(?P<typ>[a-zA-Z0-9-_|]*)\]:(?P<d>.*)$",line)
            kw=Keyword(name=l.group("name"),typ=l.group("typ"),description=l.group("d"))
        else:
            kw.description+="\n"+line.strip()
    if kw:
        ret[kw.name]=kw
        li.append(kw)
    return ret,li



def keywords(f):
    doc=f.__doc__.decode('utf8')
    kwds=re.search("Keywords:\n(?P<keywords>(?P<whitespace>\s*)(.+\n)*)\n",doc)
    k=kwds.group("keywords")
    #get rid of beginning whitespaces
    k=re.sub(re.compile(r"^"+kwds.group("whitespace"),re.M),"",k)
    return section(k)

def ret(f):
    doc=f.__doc__.decode('utf8')
    kwds=re.search("Return:\n(?P<ret>(?P<whitespace>\s*)(.+\n)*)\n",doc)
    k=kwds.group("ret")
    #get rid of beginning whitespaces
    k=re.sub(re.compile(r"^"+kwds.group("whitespace"),re.M),"",k)
    return section(k)



class Arg():
    def __init__(self,name,f):
        self.name=name
        k,_ = keywords(f)
        kwd=k[name]
        self.typ=kwd.typ
        self.description=kwd.description

        

class Method(Link):
    def __init__(self,name,methods):
        title=name[0].upper()+name[1:]
        Link.__init__(self,name,title)
        m=methods[name]
        (args, varargs, keywords, defaults)=inspect.getargspec(m)
        args= [b for b in args if b is not "self"]
        self.func_line=inspect.formatargspec(args, varargs, keywords, defaults)
        self.description = m.__doc__.split("\n")[0].decode("utf8")
        self.args=[Arg(a,m) for a in args]
        _, self.rets=ret(m)

class Table(Link):
    def __init__(self,cls):
        name=cls.__name__
        self.tablename=cls.__tablename__
        title=self.tablename[0].upper()+self.tablename[1:]
        Link.__init__(self,name,title)
        self.description = cls.__doc__.split("\n")[0].decode("utf8") 


def main():
    sites=[Site("index.html","Iro"),
           Site("current.html","API Documentation"),
           Site("new.html","geplante API Documentation"),
           Site("database.html","Datenbank Schema"),
           Site("impressum.html","Impressum"),
           ]

    current_methods = dict(inspect.getmembers(Current(None,None)))
    current=[
            Method("startSMS",current_methods),
            Method("startFAX",current_methods),
            Method("startMail",current_methods),
            
            Method("status",current_methods),
            Method("stop",current_methods),
            
            Method("getProvider",current_methods),
            Method("getDefaultProvider",current_methods),
            ]

    new_methods = dict(inspect.getmembers(New()))
    newm=[
            Method("sms",new_methods),
            Method("fax",new_methods),
            Method("mail",new_methods),
            
            Method("status",new_methods),
            Method("stop",new_methods),
            
            Method("routes",new_methods),
            Method("defaultRoute",new_methods),
            ]
    
    t = [Table(f.class_) for f in tables]
    createSchemaPlot('doc/images/db-schema.svg')

    for site in sites:
        print("generiere %s" % site.name)
        tmpl = loader.load(site.name)
        def a(s):
            if s == site:
                return {"class":"menu active"}
        stream = tmpl.generate(sites=sites,active=a,current=current,new=newm,tables=t)
        with open('doc/'+site.name, "w") as g:
            g.write(stream.render('html', doctype='html'))

if __name__ == '__main__':
    main()