make difference between NoRoute and NoRouteForTask
NoRoute - a Offer exception
NoRouteForTask - no route found to send message
#!/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()