Beispiel #1
0
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)
Beispiel #2
0
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)
Beispiel #3
0
 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)
Beispiel #4
0
    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()
Beispiel #5
0
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)
Beispiel #6
0
 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
Beispiel #7
0
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)
Beispiel #8
0
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)
Beispiel #9
0
 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