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) |