class DotWriter(DiagramWriter): """write dot graphs from a diagram definition and a project """ def __init__(self, config): styles = [ dict(arrowtail='none', arrowhead="open"), dict(arrowtail='none', arrowhead='empty'), dict(arrowtail='node', arrowhead='empty', style='dashed'), dict(fontcolor='green', arrowtail='none', arrowhead='diamond', style='solid'), ] DiagramWriter.__init__(self, config, styles) def set_printer(self, file_name, basename): """initialize DotWriter and add options for layout. """ layout = dict(rankdir="BT") self.printer = DotBackend(basename, additionnal_param=layout) self.file_name = file_name def get_title(self, obj): """get project title""" return obj.title def get_values(self, obj): """get label and shape for classes. The label contains all attributes and methods """ label = obj.title if obj.shape == 'interface': label = u'«interface»\\n%s' % label if not self.config.only_classnames: label = r'%s|%s\l|' % (label, r'\l'.join(obj.attrs)) for func in obj.methods: label = r'%s%s()\l' % (label, func.name) label = '{%s}' % label if is_exception(obj.node): return dict(fontcolor='red', label=label, shape='record') return dict(label=label, shape='record') def close_graph(self): """print the dot graph into <file_name>""" self.printer.generate(self.file_name)
class DotWriter(DiagramWriter): """write dot graphs from a diagram definition and a project """ def __init__(self, config): styles = [dict(arrowtail='none', arrowhead="open"), dict(arrowtail='none', arrowhead='empty'), dict(arrowtail='node', arrowhead='empty', style='dashed'), dict(fontcolor='green', arrowtail='none', arrowhead='diamond', style='solid'), ] DiagramWriter.__init__(self, config, styles) def set_printer(self, file_name, basename): """initialize DotWriter and add options for layout. """ layout = dict(rankdir="BT") self.printer = DotBackend(basename, additionnal_param=layout) self.file_name = file_name def get_title(self, obj): """get project title""" return obj.title def get_values(self, obj): """get label and shape for classes. The label contains all attributes and methods """ label = obj.title if obj.shape == 'interface': label = u'«interface»\\n%s' % label if not self.config.only_classnames: label = r'%s|%s\l|' % (label, r'\l'.join(obj.attrs)) for func in obj.methods: label = r'%s%s()\l' % (label, func.name) label = '{%s}' % label if is_exception(obj.node): return dict(fontcolor='red', label=label, shape='record') return dict(label=label, shape='record') def close_graph(self): """print the dot graph into <file_name>""" self.printer.generate(self.file_name)
def call(self, etype=None, rtype=None, alt=''): if 'MSIE 8' in self._cw.useragent(): return schema = self._cw.vreg.schema if etype: assert rtype is None visitor = OneHopESchemaVisitor(self._cw, schema.eschema(etype), skiptypes=skip_types(self._cw)) alt = self._cw._('graphical representation of the %(etype)s ' 'entity type from %(appid)s data model') elif rtype: visitor = OneHopRSchemaVisitor(self._cw, schema.rschema(rtype), skiptypes=skip_types(self._cw)) alt = self._cw._('graphical representation of the %(rtype)s ' 'relation type from %(appid)s data model') else: visitor = FullSchemaVisitor(self._cw, schema, skiptypes=skip_types(self._cw)) alt = self._cw._( 'graphical representation of %(appid)s data model') alt %= { 'rtype': rtype, 'etype': etype, 'appid': self._cw.vreg.config.appid } prophdlr = CWSchemaDotPropsHandler(visitor, self._cw) generator = GraphGenerator( DotBackend('schema', 'BT', ratio='compress', size=None, renderer='dot', additionnal_param={ 'overlap': 'false', 'splines': 'true', 'sep': '0.2', })) # svg image file fd, tmpfile = tempfile.mkstemp('.svg') try: os.close(fd) generator.generate(visitor, prophdlr, tmpfile) with codecs.open(tmpfile, 'rb', encoding='utf-8') as svgfile: self.w(svgfile.read()) finally: os.unlink(tmpfile)
def run(self, args): from subprocess import Popen from tempfile import NamedTemporaryFile from logilab.common.textutils import splitstrip from logilab.common.graph import GraphGenerator, DotBackend from yams import schema2dot as s2d, BASE_TYPES from cubicweb.schema import (META_RTYPES, SCHEMA_TYPES, SYSTEM_RTYPES, WORKFLOW_TYPES, INTERNAL_TYPES) cubes = splitstrip(args[0]) dev_conf = DevConfiguration(*cubes) schema = dev_conf.load_schema() out, viewer = self['output-file'], self['viewer'] if out is None: tmp_file = NamedTemporaryFile(suffix=".svg") out = tmp_file.name skiptypes = BASE_TYPES | SCHEMA_TYPES if not self['show-meta']: skiptypes |= META_RTYPES | SYSTEM_RTYPES | INTERNAL_TYPES if not self['show-workflow']: skiptypes |= WORKFLOW_TYPES if not self['show-cw-user']: skiptypes |= set(('CWUser', 'CWGroup', 'EmailAddress')) skiptypes |= set(self['exclude-type'].split(',')) skiptypes -= set(self['include-type'].split(',')) if not self['show-etype']: s2d.schema2dot(schema, out, skiptypes=skiptypes) else: etype = self['show-etype'] visitor = s2d.OneHopESchemaVisitor(schema[etype], skiptypes=skiptypes) propshdlr = s2d.SchemaDotPropsHandler(visitor) backend = DotBackend('schema', 'BT', ratio='compress', size=None, renderer='dot', additionnal_param={ 'overlap': 'false', 'splines': 'true', 'sep': '0.2' }) generator = s2d.GraphGenerator(backend) generator.generate(visitor, propshdlr, out) if viewer: p = Popen((viewer, out)) p.wait()
def schema2dot(schema=None, outputfile=None, skiptypes=(), visitor=None, prophdlr=None, size=None): """write to the output stream a dot graph representing the given schema""" visitor = visitor or FullSchemaVisitor(schema, skiptypes) prophdlr = prophdlr or SchemaDotPropsHandler(visitor) if outputfile: schemaname = osp.splitext(osp.basename(outputfile))[0] else: schemaname = 'Schema' generator = GraphGenerator(DotBackend(schemaname, 'BT', ratio='compress', size=size, renderer='dot', additionnal_param={ 'overlap':'false', 'splines':'true', #'polylines':'true', 'sep':'0.2' })) return generator.generate(visitor, prophdlr, outputfile)
def set_printer(self, file_name, basename): """initialize DotWriter and add options for layout. """ layout = dict(rankdir="BT") self.printer = DotBackend(basename, additionnal_param=layout) self.file_name = file_name
def dependencies_graph(filename, dep_info): """write dependencies as a dot (graphviz) file """ done = {} printer = DotBackend(filename[:-4], rankdir="LR") printer.emit('URL="." node[shape="box"]') for modname, dependencies in dep_info.items(): done[modname] = 1 printer.emit_node(modname) for modname in dependencies: if modname not in done: done[modname] = 1 printer.emit_node(modname) for depmodname, dependencies in dep_info.items(): for modname in dependencies: printer.emit_edge(modname, depmodname) printer.generate(filename)
def dependencies_graph(filename, dep_info): """write dependencies as a dot (graphviz) file """ done = {} printer = DotBackend(filename[:-4], rankdir='LR') printer.emit('URL="." node[shape="box"]') for modname, dependencies in sorted(dep_info.iteritems()): done[modname] = 1 printer.emit_node(modname) for modname in dependencies: if modname not in done: done[modname] = 1 printer.emit_node(modname) for depmodname, dependencies in sorted(dep_info.iteritems()): for modname in dependencies: printer.emit_edge(modname, depmodname) printer.generate(filename)