~abentley/bzrtools/bzrtools.dev

« back to all changes in this revision

Viewing changes to dotgraph.py

  • Committer: Aaron Bentley
  • Date: 2005-09-20 20:32:04 UTC
  • Revision ID: abentley@panoramicfeedback.com-20050920203204-23a0f3b8d9bc7e6e
Added edges

Show diffs side-by-side

added added

removed removed

Lines of Context:
77
77
    def __str__(self):
78
78
        return self.name
79
79
 
 
80
class Edge(object):
 
81
    def __init__(self, start, end, label=None):
 
82
        object.__init__(self)
 
83
        self.start = start
 
84
        self.end = end
 
85
        self.label = label
 
86
 
 
87
    def dot(self):
 
88
        attributes = []
 
89
        if self.label is not None:
 
90
            attributes.append(('label', self.label))
 
91
        if len(attributes) > 0:
 
92
            atlist = []
 
93
            for key, value in attributes:
 
94
                atlist.append("%s=\"%s\"" % (key, value))
 
95
            pq = ' '.join(atlist)
 
96
            op = "[%s]" % pq
 
97
        else:
 
98
            op = ""
 
99
        return "%s->%s%s;" % (self.start.name, self.end.name, op)
 
100
 
 
101
def make_edge(relation):
 
102
    return Edge(relation[0], relation[1])
 
103
 
80
104
def dot_output(relations):
81
105
    defined = set()
82
106
    yield "digraph G\n"
83
107
    yield "{\n"
84
108
    clusters = set()
 
109
    edges = [make_edge(f) for f in relations]
85
110
    def rel_appropriate(start, end, cluster):
86
111
        if cluster is None:
87
112
            return (start.cluster is None and end.cluster is None) or \
89
114
        else:
90
115
            return start.cluster==cluster and end.cluster==cluster
91
116
 
92
 
    for (start, end) in relations:
93
 
        if start.cluster is not None:
94
 
            clusters.add(start.cluster)
95
 
        if end.cluster is not None:
96
 
            clusters.add(end.cluster)
 
117
    for edge in edges:
 
118
        if edge.start.cluster is not None:
 
119
            clusters.add(edge.start.cluster)
 
120
        if edge.end.cluster is not None:
 
121
            clusters.add(edge.end.cluster)
97
122
    clusters = list(clusters)
98
123
    clusters.append(None)
99
124
    for index, cluster in enumerate(clusters):
101
126
            yield "subgraph cluster_%s\n" % index
102
127
            yield "{\n"
103
128
            yield '    label="%s"\n' % cluster
104
 
        for (start, end) in relations:
105
 
            if start.name not in defined and start.cluster == cluster:
106
 
                defined.add(start.name)
107
 
                my_def = start.define()
108
 
                if my_def is not None:
109
 
                    yield "    %s;\n" % my_def
110
 
            if end.name not in defined and end.cluster == cluster:
111
 
                defined.add(end.name)
112
 
                my_def = end.define()
113
 
                if my_def is not None:
114
 
                    yield "    %s;\n" % my_def
115
 
            if rel_appropriate(start, end, cluster):
116
 
                yield "    %s->%s;\n" % (start.name, end.name)
 
129
        for edge in edges:
 
130
            if edge.start.name not in defined and edge.start.cluster == cluster:
 
131
                defined.add(edge.start.name)
 
132
                my_def = edge.start.define()
 
133
                if my_def is not None:
 
134
                    yield "    %s\n" % my_def
 
135
            if edge.end.name not in defined and edge.end.cluster == cluster:
 
136
                defined.add(edge.end.name)
 
137
                my_def = edge.end.define()
 
138
                if my_def is not None:
 
139
                    yield "    %s;\n" % my_def
 
140
            if rel_appropriate(edge.start, edge.end, cluster):
 
141
                yield "    %s\n" % edge.dot()
117
142
        if cluster is not None:
118
143
            yield "}\n"
119
144
    yield "}\n"