Skip to content

Commit c7a7720

Browse files
committed
feature: new params for graphviz + solves Technologicat#70
cf. maciejczyzewski@ac1bd55
1 parent 5283e48 commit c7a7720

File tree

4 files changed

+90
-10
lines changed

4 files changed

+90
-10
lines changed

.gitignore

+5
Original file line numberDiff line numberDiff line change
@@ -162,3 +162,8 @@ htmlcov
162162
.idea/
163163
.history/
164164
.vscode/
165+
166+
# our vis. of architecture
167+
architecture.dot
168+
architecture.html
169+
architecture.svg

README.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -48,19 +48,19 @@ See `pyan3 --help`.
4848

4949
Example:
5050

51-
`pyan *.py --uses --no-defines --colored --grouped --annotated --dot >myuses.dot`
51+
`pyan3 *.py --uses --no-defines --colored --grouped --annotated --dot >myuses.dot`
5252

5353
Then render using your favorite GraphViz filter, mainly `dot` or `fdp`:
5454

5555
`dot -Tsvg myuses.dot >myuses.svg`
5656

5757
Or use directly
5858

59-
`pyan *.py --uses --no-defines --colored --grouped --annotated --svg >myuses.svg`
59+
`pyan3 *.py --uses --no-defines --colored --grouped --annotated --svg >myuses.svg`
6060

6161
You can also export as an interactive HTML
6262

63-
`pyan *.py --uses --no-defines --colored --grouped --annotated --html > myuses.html`
63+
`pyan3 *.py --uses --no-defines --colored --grouped --annotated --html > myuses.html`
6464

6565
Alternatively, you can call `pyan` from a script
6666

pyan/main.py

+68-5
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,31 @@ def main(cli_args=None):
141141
),
142142
)
143143

144+
parser.add_argument(
145+
"--dot-ranksep",
146+
default="0.5",
147+
dest="ranksep",
148+
help=(
149+
"specifies the dot graph 'ranksep' property for "
150+
"controlling desired rank separation, in inches. "
151+
"Allowed values: [0.02 .. 1000.0]. "
152+
"[dot only]"
153+
),
154+
)
155+
156+
parser.add_argument(
157+
"--graphviz-layout",
158+
default="dot",
159+
dest="layout",
160+
help=(
161+
"specifies the graphviz 'layout' property for "
162+
"the name of the layout algorithm to use. "
163+
"Allowed values: ['dot', 'neato', 'fdp', 'sfdp', 'twopi', 'circo']. "
164+
"Recommended values: ['dot', 'fdp']. "
165+
"[graphviz only]"
166+
),
167+
)
168+
144169
parser.add_argument(
145170
"-a",
146171
"--annotated",
@@ -159,9 +184,15 @@ def main(cli_args=None):
159184

160185
known_args, unknown_args = parser.parse_known_args(cli_args)
161186

162-
filenames = [fn2 for fn in unknown_args for fn2 in glob(fn, recursive=True)]
187+
filenames = []
188+
189+
for fn in unknown_args:
190+
for fn2 in glob(fn, recursive=True):
191+
abs_fn2 = os.path.abspath(fn2)
192+
filenames.append(abs_fn2)
163193

164194
# determine root
195+
165196
if known_args.root is not None:
166197
root = os.path.abspath(known_args.root)
167198
else:
@@ -203,7 +234,12 @@ def main(cli_args=None):
203234
handler = logging.FileHandler(known_args.logname)
204235
logger.addHandler(handler)
205236

206-
v = CallGraphVisitor(filenames, logger=logger, root=root)
237+
logger.debug(f"[files] {unknown_args}")
238+
239+
if root:
240+
root = os.path.abspath(root)
241+
242+
v = CallGraphVisitor(filenames, logger=logger, root=root) # type: ignore
207243

208244
if known_args.function or known_args.namespace:
209245

@@ -222,13 +258,40 @@ def main(cli_args=None):
222258
writer = None
223259

224260
if known_args.dot:
225-
writer = DotWriter(graph, options=["rankdir=" + known_args.rankdir], output=known_args.filename, logger=logger)
261+
writer = DotWriter(
262+
graph,
263+
options=[
264+
"rankdir=" + known_args.rankdir,
265+
"ranksep=" + known_args.ranksep,
266+
"layout=" + known_args.layout,
267+
],
268+
output=known_args.filename,
269+
logger=logger,
270+
)
226271

227272
if known_args.html:
228-
writer = HTMLWriter(graph, options=["rankdir=" + known_args.rankdir], output=known_args.filename, logger=logger)
273+
writer = HTMLWriter(
274+
graph,
275+
options=[
276+
"rankdir=" + known_args.rankdir,
277+
"ranksep=" + known_args.ranksep,
278+
"layout=" + known_args.layout,
279+
],
280+
output=known_args.filename,
281+
logger=logger,
282+
)
229283

230284
if known_args.svg:
231-
writer = SVGWriter(graph, options=["rankdir=" + known_args.rankdir], output=known_args.filename, logger=logger)
285+
writer = SVGWriter(
286+
graph,
287+
options=[
288+
"rankdir=" + known_args.rankdir,
289+
"ranksep=" + known_args.ranksep,
290+
"layout=" + known_args.layout,
291+
],
292+
output=known_args.filename,
293+
logger=logger,
294+
)
232295

233296
if known_args.tgf:
234297
writer = TgfWriter(graph, output=known_args.filename, logger=logger)

visualize_pyan_architecture.sh

+14-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,16 @@
1-
#!/bin/bash
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
IFS=$'\n\t'
4+
25
echo -ne "Pyan architecture: generating architecture.{dot,svg}\n"
3-
python3 -m pyan pyan/*.py --no-defines --uses --colored --annotate --dot -V >architecture.dot 2>architecture.log
6+
python3 \
7+
-m pyan pyan/*.py \
8+
--no-defines --uses --colored --annotate --dot -V \
9+
>architecture.dot \
10+
2>architecture.log
411
dot -Tsvg architecture.dot >architecture.svg
12+
13+
python3 -m pyan pyan/*.py --no-defines --uses \
14+
--grouped --nested-groups \
15+
--graphviz-layout fdp \
16+
--colored --html >architecture.html

0 commit comments

Comments
 (0)