projects/guix·blob ruby-team · refs

160 lines · 5.5 KiB

1From ac1bd55d07fd1bad2f4a92dc0809607c407d9140 Mon Sep 17 00:00:00 2001
2From: "Maciej A. Czyzewski" <[email protected]>
3Date: Wed, 9 Jun 2021 15:29:18 +0200
4Subject: [PATCH] feature: new params for graphviz + solves #70
5
6- solve abs path bug #70
7- new params for graphviz (ranksep; layout)
8- tested layout `dot`; `fdp` (square graph)
9- updated `.gitignore` (files gen. after `visualize_pyan_architecture.sh`)
10---
11 .gitignore | 5 ++++
12 README.md | 6 ++--
13 pyan/main.py | 55 +++++++++++++++++++++++++++++++---
14 visualize_pyan_architecture.sh | 5 ++++
15 4 files changed, 64 insertions(+), 7 deletions(-)
16
17diff --git a/.gitignore b/.gitignore
18index 990fdc0c..93313aaf 100644
19--- a/.gitignore
20+++ b/.gitignore
21@@ -162,3 +162,8 @@ htmlcov
22 .idea/
23 .history/
24 .vscode/
25+
26+# our vis. of architecture
27+architecture.dot
28+architecture.html
29+architecture.svg
30diff --git a/README.md b/README.md
31index d1f19dcf..9e6919a3 100644
32--- a/README.md
33+++ b/README.md
34@@ -48,7 +48,7 @@ See `pyan3 --help`.
35
36 Example:
37
38-`pyan *.py --uses --no-defines --colored --grouped --annotated --dot >myuses.dot`
39+`pyan3 *.py --uses --no-defines --colored --grouped --annotated --dot >myuses.dot`
40
41 Then render using your favorite GraphViz filter, mainly `dot` or `fdp`:
42
43@@ -56,11 +56,11 @@ Then render using your favorite GraphViz filter, mainly `dot` or `fdp`:
44
45 Or use directly
46
47-`pyan *.py --uses --no-defines --colored --grouped --annotated --svg >myuses.svg`
48+`pyan3 *.py --uses --no-defines --colored --grouped --annotated --svg >myuses.svg`
49
50 You can also export as an interactive HTML
51
52-`pyan *.py --uses --no-defines --colored --grouped --annotated --html > myuses.html`
53+`pyan3 *.py --uses --no-defines --colored --grouped --annotated --html > myuses.html`
54
55 Alternatively, you can call `pyan` from a script
56
57diff --git a/pyan/main.py b/pyan/main.py
58index 5d079714..b1a16f63 100644
59--- a/pyan/main.py
60+++ b/pyan/main.py
61@@ -141,6 +141,31 @@ def main(cli_args=None):
62 ),
63 )
64
65+ parser.add_argument(
66+ "--dot-ranksep",
67+ default="0.5",
68+ dest="ranksep",
69+ help=(
70+ "specifies the dot graph 'ranksep' property for "
71+ "controlling desired rank separation, in inches. "
72+ "Allowed values: [0.02 .. 1000.0]. "
73+ "[dot only]"
74+ ),
75+ )
76+
77+ parser.add_argument(
78+ "--graphviz-layout",
79+ default="dot",
80+ dest="layout",
81+ help=(
82+ "specifies the graphviz 'layout' property for "
83+ "the name of the layout algorithm to use. "
84+ "Allowed values: ['dot', 'neato', 'fdp', 'sfdp', 'twopi', 'circo']. "
85+ "Recommended values: ['dot', 'fdp']. "
86+ "[graphviz only]"
87+ ),
88+ )
89+
90 parser.add_argument(
91 "-a",
92 "--annotated",
93@@ -159,7 +184,12 @@ def main(cli_args=None):
94
95 known_args, unknown_args = parser.parse_known_args(cli_args)
96
97- filenames = [fn2 for fn in unknown_args for fn2 in glob(fn, recursive=True)]
98+
99+ filenames = []
100+ for fn in unknown_args:
101+ for fn2 in glob(fn, recursive=True):
102+ abs_fn2 = os.path.abspath(fn2)
103+ filenames.append(abs_fn2)
104
105 # determine root
106 if known_args.root is not None:
107@@ -203,6 +233,11 @@ def main(cli_args=None):
108 handler = logging.FileHandler(known_args.logname)
109 logger.addHandler(handler)
110
111+ logger.debug(f"[files] {unknown_args}")
112+
113+ if root:
114+ root = os.path.abspath(root)
115+
116 v = CallGraphVisitor(filenames, logger=logger, root=root)
117
118 if known_args.function or known_args.namespace:
119@@ -222,13 +257,25 @@ def main(cli_args=None):
120 writer = None
121
122 if known_args.dot:
123- writer = DotWriter(graph, options=["rankdir=" + known_args.rankdir], output=known_args.filename, logger=logger)
124+ writer = DotWriter(graph, options=[
125+ "rankdir=" + known_args.rankdir,
126+ "ranksep=" + known_args.ranksep,
127+ "layout=" + known_args.layout,
128+ ], output=known_args.filename, logger=logger)
129
130 if known_args.html:
131- writer = HTMLWriter(graph, options=["rankdir=" + known_args.rankdir], output=known_args.filename, logger=logger)
132+ writer = HTMLWriter(graph, options=[
133+ "rankdir=" + known_args.rankdir,
134+ "ranksep=" + known_args.ranksep,
135+ "layout=" + known_args.layout,
136+ ], output=known_args.filename, logger=logger)
137
138 if known_args.svg:
139- writer = SVGWriter(graph, options=["rankdir=" + known_args.rankdir], output=known_args.filename, logger=logger)
140+ writer = SVGWriter(graph, options=[
141+ "rankdir=" + known_args.rankdir,
142+ "ranksep=" + known_args.ranksep,
143+ "layout=" + known_args.layout,
144+ ], output=known_args.filename, logger=logger)
145
146 if known_args.tgf:
147 writer = TgfWriter(graph, output=known_args.filename, logger=logger)
148diff --git a/visualize_pyan_architecture.sh b/visualize_pyan_architecture.sh
149index 22c63342..81b6ca24 100755
150--- a/visualize_pyan_architecture.sh
151+++ b/visualize_pyan_architecture.sh
152@@ -2,3 +2,8 @@
153 echo -ne "Pyan architecture: generating architecture.{dot,svg}\n"
154 python3 -m pyan pyan/*.py --no-defines --uses --colored --annotate --dot -V >architecture.dot 2>architecture.log
155 dot -Tsvg architecture.dot >architecture.svg
156+echo -ne "Pyan architecture: generating architecture.{html,graphviz=fdp}\n"
157+python3 -m pyan pyan/*.py --no-defines --uses \
158+ --grouped --nested-groups \
159+ --graphviz-layout fdp \
160+ --colored --html > architecture.html