"""
http://www.graphviz.org/doc/info/attrs.html
"""
from sys import stderr
import re
from objectmodel import ObjectModel, Class, Property
import qname
import langio
class Error(RuntimeError):
pass
class Generator (langio.ModelGenerator):
"""
>>> import loader
>>> m = loader.load('test-data/poscond2.asn')
>>> import graphviz
>>> g = graphviz.Generator(model=m)
>>> g.run()
"""
def __init__(self, **kwargs):
super(Generator, self).__init__(**kwargs)
def qname(self, obj) :
return self.map.qname(getattr(obj, "name", obj))
def qqname(self, obj) :
return '"'+self.qname(obj)+'"'
def run(self):
counts = self.model.namespaces_with_count(self.map)
self.default_short = counts[-1][1]
self.map.bind('', self.map.getLong(self.default_short))
self.out("digraph {\n")
self.out(' fontname = "Bitstream Vera Sans"\n')
self.out(' rankdir = BT\n')
self.out('\n')
self.out('node [ style=filled, shape=rectangle, fillcolor=bisque, fontname = "Bitstream Vera Sans" ]')
self.out('\n')
for c in self.model.classes:
for sub in self.model.subclassesForClass(c):
self.out(' '+self.qqname(sub)+" -> "+self.qqname(c))
self.out(' [ arrowhead="empty" ]\n')
for prop in self.model.properties:
if prop.list or prop.multi:
suffix = "*"
else:
suffix = ""
self.out(' '+self.qqname(prop.to)+" -> "+self.qqname(prop.domain))
self.out(' [ arrowhead = "diamond" ')
self.out(' taillabel = "%s%s" ]\n' %
(suffix, self.qname(prop)))
self.out("\n}\n")
def outPropertyInner(self, prop):
name = self.qname(prop.name)
self.out("element", name, "{")
self.out(self.qname(prop.to) + suffix)
self.out("}\n")
def outProperty(self, prop):
name = self.qname(prop.name)
self.out(name, "= ")
self.outPropertyInner(prop)
if __name__ == "__main__":
import doctest, sys
doctest.testmod(sys.modules[__name__])