annotate dottoxml/doc/index.wiki @ 4:4fa7bf58e914

first release
author dwinter
date Mon, 23 Jul 2012 09:58:50 +0200
parents d5de1d6e9338
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
d5de1d6e9338 first release
dwinter
parents:
diff changeset
1 @title: dottoxml
d5de1d6e9338 first release
dwinter
parents:
diff changeset
2 @author: Dirk Baechle
d5de1d6e9338 first release
dwinter
parents:
diff changeset
3
d5de1d6e9338 first release
dwinter
parents:
diff changeset
4 While trying to get a deeper understanding for the source of the build
d5de1d6e9338 first release
dwinter
parents:
diff changeset
5 system [[http://www.scons.org SCons]], I actually wanted to see the classes
d5de1d6e9338 first release
dwinter
parents:
diff changeset
6 and their dependencies. Googling around I found these two tools that could
d5de1d6e9338 first release
dwinter
parents:
diff changeset
7 produce DOT graph files for class or import dependencies from Python source trees.
d5de1d6e9338 first release
dwinter
parents:
diff changeset
8
d5de1d6e9338 first release
dwinter
parents:
diff changeset
9 ~[[http://furius.ca/snakefood snakefood]]||Creates module import dependency graphs. Use the Mercurial command %%hg clone https://hg.furius.ca/public/snakefood%% for a checkout of the current sources.
d5de1d6e9338 first release
dwinter
parents:
diff changeset
10 ~[[http://www.logilab.org/project/pylint pyreverse]]||As part of pylint it analyzes class dependencies.
d5de1d6e9338 first release
dwinter
parents:
diff changeset
11
d5de1d6e9338 first release
dwinter
parents:
diff changeset
12 Unfortunately, the resulting graphs were pretty large and visualizing them via
d5de1d6e9338 first release
dwinter
parents:
diff changeset
13 the $$dot$$ tool did not help. PNG, PS or SVG output, the images got too large and
d5de1d6e9338 first release
dwinter
parents:
diff changeset
14 the layout of the nodes and edges left a lot to desire (Example: SCons dependencies
d5de1d6e9338 first release
dwinter
parents:
diff changeset
15 in [[scons.ps Postscript]] and [[scons.svg SVG]] format).
d5de1d6e9338 first release
dwinter
parents:
diff changeset
16
d5de1d6e9338 first release
dwinter
parents:
diff changeset
17 Then I remembered the [[http://www.yworks.com/en/products_yed_about.html yEd graph editor]], a
d5de1d6e9338 first release
dwinter
parents:
diff changeset
18 great application that can layout and handle even very large datasets...if you find a
d5de1d6e9338 first release
dwinter
parents:
diff changeset
19 way to get the data inside. Since it does not import DOT files (yet), I wrote this
d5de1d6e9338 first release
dwinter
parents:
diff changeset
20 little converter script that outputs yEd's native file format Graphml (XML).
d5de1d6e9338 first release
dwinter
parents:
diff changeset
21
d5de1d6e9338 first release
dwinter
parents:
diff changeset
22 Now looking at complicated DOT graphs is a snap...have a try!
d5de1d6e9338 first release
dwinter
parents:
diff changeset
23
d5de1d6e9338 first release
dwinter
parents:
diff changeset
24
d5de1d6e9338 first release
dwinter
parents:
diff changeset
25 == Current version == current
d5de1d6e9338 first release
dwinter
parents:
diff changeset
26
d5de1d6e9338 first release
dwinter
parents:
diff changeset
27 ~[[dottoxml.zip dottoxml.zip]]||Archived folder with the Python scripts for $$dottoxml$$.
d5de1d6e9338 first release
dwinter
parents:
diff changeset
28
d5de1d6e9338 first release
dwinter
parents:
diff changeset
29 == Contributions == contrib
d5de1d6e9338 first release
dwinter
parents:
diff changeset
30
d5de1d6e9338 first release
dwinter
parents:
diff changeset
31 ~2010-11-13||Daniel Reynaud: error report and patch (copying of attributes for default nodes and edges did not work, due to a copy-paste error).
d5de1d6e9338 first release
dwinter
parents:
diff changeset
32 ~2010-01-27||Martin Bijl-Schwab: error report and patch ($$self.sections$$ did not get initialized in all cases).
d5de1d6e9338 first release
dwinter
parents:
diff changeset
33
d5de1d6e9338 first release
dwinter
parents:
diff changeset
34 == Basic usage == basic
d5de1d6e9338 first release
dwinter
parents:
diff changeset
35
d5de1d6e9338 first release
dwinter
parents:
diff changeset
36 Note:
d5de1d6e9338 first release
dwinter
parents:
diff changeset
37 The following screenshots are not from a dependency analysis but a profiling
d5de1d6e9338 first release
dwinter
parents:
diff changeset
38 of [[http://scons.tigris.org SCons]] at runtime. Using a combination of
d5de1d6e9338 first release
dwinter
parents:
diff changeset
39 [[http://code.google.com/p/jrfonseca/wiki/Gprof2Dot $$Gprof2Dot$$]] and [[http://www.graphviz.org Graphviz DOT]],
d5de1d6e9338 first release
dwinter
parents:
diff changeset
40 Nitro Zark has published the results of his investigations on
d5de1d6e9338 first release
dwinter
parents:
diff changeset
41 [[http://nitrozark.free.fr/scons/bench1/benchmark-gfw-20090702.html his webpage]]. I picked the file $$benchgen-full-dry-run.dot$$
d5de1d6e9338 first release
dwinter
parents:
diff changeset
42 because it uses colors to a great extent, which gives a nice looking graph.
d5de1d6e9338 first release
dwinter
parents:
diff changeset
43
d5de1d6e9338 first release
dwinter
parents:
diff changeset
44 Start the script with the ''-h'' or ''--help'' option and the
d5de1d6e9338 first release
dwinter
parents:
diff changeset
45 full set of available commands is displayed.
d5de1d6e9338 first release
dwinter
parents:
diff changeset
46
d5de1d6e9338 first release
dwinter
parents:
diff changeset
47 The straightforward way to create a Graphml file out of a DOT is:
d5de1d6e9338 first release
dwinter
parents:
diff changeset
48
d5de1d6e9338 first release
dwinter
parents:
diff changeset
49 Code:
d5de1d6e9338 first release
dwinter
parents:
diff changeset
50 python dottoxml.py infile.dot outfile.graphml
d5de1d6e9338 first release
dwinter
parents:
diff changeset
51
d5de1d6e9338 first release
dwinter
parents:
diff changeset
52 Then open the new Graphml file in the [[http://www.yworks.com/en/products_yed_about.html yEd editor]]. The nodes of the
d5de1d6e9338 first release
dwinter
parents:
diff changeset
53 graph are now all centered to the origin and have a standard size of
d5de1d6e9338 first release
dwinter
parents:
diff changeset
54 30x30.
d5de1d6e9338 first release
dwinter
parents:
diff changeset
55
d5de1d6e9338 first release
dwinter
parents:
diff changeset
56 [[yed1.png <<yed1.png||alt="Centered nodes" width="100%">>]]
d5de1d6e9338 first release
dwinter
parents:
diff changeset
57
d5de1d6e9338 first release
dwinter
parents:
diff changeset
58 Change the latter by using the ''Tools'' menu in yEd and select the
d5de1d6e9338 first release
dwinter
parents:
diff changeset
59 entry ''Fit Nodes to Label''. This feature adapts the size of each node
d5de1d6e9338 first release
dwinter
parents:
diff changeset
60 to the text that is displayed within.
d5de1d6e9338 first release
dwinter
parents:
diff changeset
61
d5de1d6e9338 first release
dwinter
parents:
diff changeset
62 [[yed1.png <<yed2.png||alt="Fitted nodes" width="100%">>]]
d5de1d6e9338 first release
dwinter
parents:
diff changeset
63
d5de1d6e9338 first release
dwinter
parents:
diff changeset
64 Now you can select one of the automatic layout strategies from the ''Layout''
d5de1d6e9338 first release
dwinter
parents:
diff changeset
65 menu. Often, one or two dialogs with special options appear.
d5de1d6e9338 first release
dwinter
parents:
diff changeset
66
d5de1d6e9338 first release
dwinter
parents:
diff changeset
67 [[yed3.png <<yed3.png||alt="Options dialog" width="100%">>]]
d5de1d6e9338 first release
dwinter
parents:
diff changeset
68
d5de1d6e9338 first release
dwinter
parents:
diff changeset
69 Just go
d5de1d6e9338 first release
dwinter
parents:
diff changeset
70 with the default settings and click OK. The nodes in the graph are then
d5de1d6e9338 first release
dwinter
parents:
diff changeset
71 rearranged, according to your selected strategy. Here we see the
d5de1d6e9338 first release
dwinter
parents:
diff changeset
72 layout ''Hierarchical, classic'':
d5de1d6e9338 first release
dwinter
parents:
diff changeset
73
d5de1d6e9338 first release
dwinter
parents:
diff changeset
74 [[yed4.png <<yed4.png||alt="Full graph" width="100%">>]]
d5de1d6e9338 first release
dwinter
parents:
diff changeset
75
d5de1d6e9338 first release
dwinter
parents:
diff changeset
76 And another time, in a randomly chosen closeup:
d5de1d6e9338 first release
dwinter
parents:
diff changeset
77
d5de1d6e9338 first release
dwinter
parents:
diff changeset
78 [[yed5.png <<yed5.png||alt="Closeup" width="100%">>]]
d5de1d6e9338 first release
dwinter
parents:
diff changeset
79
d5de1d6e9338 first release
dwinter
parents:
diff changeset
80 For further advice about the display or editing of graphs in [[http://www.yworks.com/en/products_yed_about.html yEd]],
d5de1d6e9338 first release
dwinter
parents:
diff changeset
81 refer to its manual please.
d5de1d6e9338 first release
dwinter
parents:
diff changeset
82
d5de1d6e9338 first release
dwinter
parents:
diff changeset
83 == Color options == colors
d5de1d6e9338 first release
dwinter
parents:
diff changeset
84
d5de1d6e9338 first release
dwinter
parents:
diff changeset
85 In the screenshots above, the nodes are colored because the DOT file contained the necessary
d5de1d6e9338 first release
dwinter
parents:
diff changeset
86 attribute statements. The $$dottoxml$$ script tries to pick up as much information as possible from the
d5de1d6e9338 first release
dwinter
parents:
diff changeset
87 input file, not only colors but also arrow shapes (''arrow'' vs. ''diamond'') for example.
d5de1d6e9338 first release
dwinter
parents:
diff changeset
88
d5de1d6e9338 first release
dwinter
parents:
diff changeset
89 If no color information is present in the DOT file, $$dottoxml$$ falls back to its defaults
d5de1d6e9338 first release
dwinter
parents:
diff changeset
90 which are: some sort of grey (#CCCCFF) for the node background, and black (#000000) for the outline,
d5de1d6e9338 first release
dwinter
parents:
diff changeset
91 the labels and the arrows.
d5de1d6e9338 first release
dwinter
parents:
diff changeset
92
d5de1d6e9338 first release
dwinter
parents:
diff changeset
93 [[yed6.png <<yed6.png||alt="Default colors" width="100%">>]]
d5de1d6e9338 first release
dwinter
parents:
diff changeset
94
d5de1d6e9338 first release
dwinter
parents:
diff changeset
95 You can override the default colors with the four commandline options:
d5de1d6e9338 first release
dwinter
parents:
diff changeset
96
d5de1d6e9338 first release
dwinter
parents:
diff changeset
97 ~$$--cn$$|| Node background color
d5de1d6e9338 first release
dwinter
parents:
diff changeset
98 ~$$--ce$$|| Edge color
d5de1d6e9338 first release
dwinter
parents:
diff changeset
99 ~$$--cnt$$|| Node label color
d5de1d6e9338 first release
dwinter
parents:
diff changeset
100 ~$$--cet$$|| Edge label color
d5de1d6e9338 first release
dwinter
parents:
diff changeset
101
d5de1d6e9338 first release
dwinter
parents:
diff changeset
102 An example:
d5de1d6e9338 first release
dwinter
parents:
diff changeset
103
d5de1d6e9338 first release
dwinter
parents:
diff changeset
104 Code:
d5de1d6e9338 first release
dwinter
parents:
diff changeset
105 python dottoxml.py --cn #FF0000 infile.dot outfile.graphml
d5de1d6e9338 first release
dwinter
parents:
diff changeset
106
d5de1d6e9338 first release
dwinter
parents:
diff changeset
107 sets the standard node background to a pure ''red''. Instead of
d5de1d6e9338 first release
dwinter
parents:
diff changeset
108 giving RGB triplets, you can also specify an X11 color name like this:
d5de1d6e9338 first release
dwinter
parents:
diff changeset
109
d5de1d6e9338 first release
dwinter
parents:
diff changeset
110 Code:
d5de1d6e9338 first release
dwinter
parents:
diff changeset
111 python dottoxml.py --cn blanchedalmond infile.dot outfile.graphml
d5de1d6e9338 first release
dwinter
parents:
diff changeset
112
d5de1d6e9338 first release
dwinter
parents:
diff changeset
113 [[yed7.png <<yed7.png||alt="Blanched almond" width="100%">>]]
d5de1d6e9338 first release
dwinter
parents:
diff changeset
114
d5de1d6e9338 first release
dwinter
parents:
diff changeset
115 == Other specials == specials
d5de1d6e9338 first release
dwinter
parents:
diff changeset
116
d5de1d6e9338 first release
dwinter
parents:
diff changeset
117 Very simple graphs often contain only the node labels and the edge information
d5de1d6e9338 first release
dwinter
parents:
diff changeset
118 itself, but no labels for the edges. With the option ''$$--ae$$'' you can enable
d5de1d6e9338 first release
dwinter
parents:
diff changeset
119 the ''Auto labeling''. This means that for every edge that does not provide its
d5de1d6e9338 first release
dwinter
parents:
diff changeset
120 own label, $$dottoxml$$ generates one of the form
d5de1d6e9338 first release
dwinter
parents:
diff changeset
121
d5de1d6e9338 first release
dwinter
parents:
diff changeset
122 Code:
d5de1d6e9338 first release
dwinter
parents:
diff changeset
123 source_node_label -> destination_node_label
d5de1d6e9338 first release
dwinter
parents:
diff changeset
124
d5de1d6e9338 first release
dwinter
parents:
diff changeset
125 When analyzing dependencies, there may appear single nodes that are ''isolated''
d5de1d6e9338 first release
dwinter
parents:
diff changeset
126 from the rest of the graph and have no outgoing or incoming edges at all.
d5de1d6e9338 first release
dwinter
parents:
diff changeset
127 If you want to see only ''connected'' nodes, you can enable the ''sweep'' option ''$$-s$$''.
d5de1d6e9338 first release
dwinter
parents:
diff changeset
128 The script then filters out all single nodes and does not output them to the Graphml file.
d5de1d6e9338 first release
dwinter
parents:
diff changeset
129
d5de1d6e9338 first release
dwinter
parents:
diff changeset
130 Finally, a very special option for the work with UML nodes that also contain the names
d5de1d6e9338 first release
dwinter
parents:
diff changeset
131 of attributes and methods for a class. If you activate the ''Fit Label to Nodes'' feature
d5de1d6e9338 first release
dwinter
parents:
diff changeset
132 in yEd, the nodes are expanded only around the class name (=label) but not the methods.
d5de1d6e9338 first release
dwinter
parents:
diff changeset
133 As a workaround you can enable the ''lumping attributes'' option ''$$--la$$'', which
d5de1d6e9338 first release
dwinter
parents:
diff changeset
134 collects all the text data for the UML node and puts it into the label. The single
d5de1d6e9338 first release
dwinter
parents:
diff changeset
135 sections are divided by separators, built with the ''separator char'' given by the ''$$--sc$$''
d5de1d6e9338 first release
dwinter
parents:
diff changeset
136 option.
d5de1d6e9338 first release
dwinter
parents:
diff changeset
137
d5de1d6e9338 first release
dwinter
parents:
diff changeset
138 == Restrictions == restrict
d5de1d6e9338 first release
dwinter
parents:
diff changeset
139
d5de1d6e9338 first release
dwinter
parents:
diff changeset
140 This script is still under development and far from stable! Please note the following
d5de1d6e9338 first release
dwinter
parents:
diff changeset
141 remarks and restrictions:
d5de1d6e9338 first release
dwinter
parents:
diff changeset
142
d5de1d6e9338 first release
dwinter
parents:
diff changeset
143 #At the moment, the DOT parser is very simple and line-based. It detects only node and
d5de1d6e9338 first release
dwinter
parents:
diff changeset
144 edge lines, no subgraphs are handled. Node and edge specifications must be in a single
d5de1d6e9338 first release
dwinter
parents:
diff changeset
145 line!
d5de1d6e9338 first release
dwinter
parents:
diff changeset
146 #I tried to do my best, but the whole encoding part (Unicode support and detection of
d5de1d6e9338 first release
dwinter
parents:
diff changeset
147 input encoding) still appears to be a little bit ''shaky'' to me. Do not expect too much
d5de1d6e9338 first release
dwinter
parents:
diff changeset
148 here.
d5de1d6e9338 first release
dwinter
parents:
diff changeset
149
d5de1d6e9338 first release
dwinter
parents:
diff changeset
150 == More examples == more
d5de1d6e9338 first release
dwinter
parents:
diff changeset
151
d5de1d6e9338 first release
dwinter
parents:
diff changeset
152 More examples and screenshots can be found at the [[http://scons.org/wiki/VisualizeDependencies VisualizeDependencies]] page in the
d5de1d6e9338 first release
dwinter
parents:
diff changeset
153 [[http://scons.org/wiki SCons Wiki]]...
d5de1d6e9338 first release
dwinter
parents:
diff changeset
154