| Index: third_party/pylint/pyreverse/writer.py
|
| ===================================================================
|
| --- third_party/pylint/pyreverse/writer.py (revision 292986)
|
| +++ third_party/pylint/pyreverse/writer.py (working copy)
|
| @@ -1,5 +1,5 @@
|
| # -*- coding: utf-8 -*-
|
| -# Copyright (c) 2008-2010 LOGILAB S.A. (Paris, FRANCE).
|
| +# Copyright (c) 2008-2013 LOGILAB S.A. (Paris, FRANCE).
|
| # http://www.logilab.fr/ -- mailto:contact@logilab.fr
|
| #
|
| # This program is free software; you can redistribute it and/or modify it under
|
| @@ -13,10 +13,8 @@
|
| #
|
| # You should have received a copy of the GNU General Public License along with
|
| # this program; if not, write to the Free Software Foundation, Inc.,
|
| -# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
| -"""
|
| -Utilities for creating VCG and Dot diagrams.
|
| -"""
|
| +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
| +"""Utilities for creating VCG and Dot diagrams"""
|
|
|
| from logilab.common.vcgutils import VCGPrinter
|
| from logilab.common.graph import DotBackend
|
| @@ -23,7 +21,7 @@
|
|
|
| from pylint.pyreverse.utils import is_exception
|
|
|
| -class DiagramWriter:
|
| +class DiagramWriter(object):
|
| """base class for writing project diagrams
|
| """
|
| def __init__(self, config, styles):
|
| @@ -46,30 +44,33 @@
|
|
|
| def write_packages(self, diagram):
|
| """write a package diagram"""
|
| - for obj in diagram.modules():
|
| - label = self.get_title(obj)
|
| - self.printer.emit_node(obj.fig_id, label=label, shape='box')
|
| + # sorted to get predictable (hence testable) results
|
| + for i, obj in enumerate(sorted(diagram.modules(), key=lambda x: x.title)):
|
| + self.printer.emit_node(i, label=self.get_title(obj), shape='box')
|
| + obj.fig_id = i
|
| # package dependencies
|
| - for rel in diagram.relationships.get('depends', ()):
|
| + for rel in diagram.get_relationships('depends'):
|
| self.printer.emit_edge(rel.from_object.fig_id, rel.to_object.fig_id,
|
| - **self.pkg_edges)
|
| + **self.pkg_edges)
|
|
|
| def write_classes(self, diagram):
|
| """write a class diagram"""
|
| - for obj in diagram.objects:
|
| - self.printer.emit_node(obj.fig_id, **self.get_values(obj) )
|
| + # sorted to get predictable (hence testable) results
|
| + for i, obj in enumerate(sorted(diagram.objects, key=lambda x: x.title)):
|
| + self.printer.emit_node(i, **self.get_values(obj))
|
| + obj.fig_id = i
|
| # inheritance links
|
| - for rel in diagram.relationships.get('specialization', ()):
|
| + for rel in diagram.get_relationships('specialization'):
|
| self.printer.emit_edge(rel.from_object.fig_id, rel.to_object.fig_id,
|
| - **self.inh_edges)
|
| + **self.inh_edges)
|
| # implementation links
|
| - for rel in diagram.relationships.get('implements', ()):
|
| + for rel in diagram.get_relationships('implements'):
|
| self.printer.emit_edge(rel.from_object.fig_id, rel.to_object.fig_id,
|
| - **self.imp_edges)
|
| + **self.imp_edges)
|
| # generate associations
|
| - for rel in diagram.relationships.get('association', ()):
|
| + for rel in diagram.get_relationships('association'):
|
| self.printer.emit_edge(rel.from_object.fig_id, rel.to_object.fig_id,
|
| - label=rel.name, **self.ass_edges)
|
| + label=rel.name, **self.ass_edges)
|
|
|
| def set_printer(self, file_name, basename):
|
| """set printer"""
|
| @@ -93,11 +94,12 @@
|
| """
|
|
|
| def __init__(self, config):
|
| - styles = [dict(arrowtail='none', arrowhead="open"),
|
| - dict(arrowtail = "none", arrowhead='empty'),
|
| - dict(arrowtail="node", arrowhead='empty', style='dashed'),
|
| + 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') ]
|
| + arrowhead='diamond', style='solid'),
|
| + ]
|
| DiagramWriter.__init__(self, config, styles)
|
|
|
| def set_printer(self, file_name, basename):
|
| @@ -113,20 +115,20 @@
|
|
|
| def get_values(self, obj):
|
| """get label and shape for classes.
|
| -
|
| +
|
| The label contains all attributes and methods
|
| """
|
| - label = obj.title
|
| + label = obj.title
|
| if obj.shape == 'interface':
|
| - label = "«interface»\\n%s" % label
|
| + label = u'«interface»\\n%s' % label
|
| if not self.config.only_classnames:
|
| - label = "%s|%s\l|" % (label, r"\l".join(obj.attrs) )
|
| + 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")
|
| + 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>"""
|
| @@ -139,12 +141,13 @@
|
| def __init__(self, config):
|
| styles = [dict(arrowstyle='solid', backarrowstyle='none',
|
| backarrowsize=0),
|
| - dict(arrowstyle='solid', backarrowstyle='none',
|
| + dict(arrowstyle='solid', backarrowstyle='none',
|
| backarrowsize=10),
|
| dict(arrowstyle='solid', backarrowstyle='none',
|
| linestyle='dotted', backarrowsize=10),
|
| dict(arrowstyle='solid', backarrowstyle='none',
|
| - textcolor='green') ]
|
| + textcolor='green'),
|
| + ]
|
| DiagramWriter.__init__(self, config, styles)
|
|
|
| def set_printer(self, file_name, basename):
|
| @@ -163,7 +166,7 @@
|
|
|
| def get_values(self, obj):
|
| """get label and shape for classes.
|
| -
|
| +
|
| The label contains all attributes and methods
|
| """
|
| if is_exception(obj.node):
|
| @@ -179,7 +182,7 @@
|
| methods = [func.name for func in obj.methods]
|
| # box width for UML like diagram
|
| maxlen = max(len(name) for name in [obj.title] + methods + attrs)
|
| - line = "_" * (maxlen + 2)
|
| + line = '_' * (maxlen + 2)
|
| label = r'%s\n\f%s' % (label, line)
|
| for attr in attrs:
|
| label = r'%s\n\f08%s' % (label, attr)
|
|
|