Skip to content

Commit ac1bd55

Browse files
feature: new params for graphviz + solves Technologicat#70
- solve abs path bug Technologicat#70 - new params for graphviz (ranksep; layout) - tested layout `dot`; `fdp` (square graph) - updated `.gitignore` (files gen. after `visualize_pyan_architecture.sh`)
1 parent 350ea49 commit ac1bd55

File tree

4 files changed

+64
-7
lines changed

4 files changed

+64
-7
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

+51-4
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,7 +184,12 @@ 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+
188+
filenames = []
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
165195
if known_args.root is not None:
@@ -203,6 +233,11 @@ def main(cli_args=None):
203233
handler = logging.FileHandler(known_args.logname)
204234
logger.addHandler(handler)
205235

236+
logger.debug(f"[files] {unknown_args}")
237+
238+
if root:
239+
root = os.path.abspath(root)
240+
206241
v = CallGraphVisitor(filenames, logger=logger, root=root)
207242

208243
if known_args.function or known_args.namespace:
@@ -222,13 +257,25 @@ def main(cli_args=None):
222257
writer = None
223258

224259
if known_args.dot:
225-
writer = DotWriter(graph, options=["rankdir=" + known_args.rankdir], output=known_args.filename, logger=logger)
260+
writer = DotWriter(graph, options=[
261+
"rankdir=" + known_args.rankdir,
262+
"ranksep=" + known_args.ranksep,
263+
"layout=" + known_args.layout,
264+
], output=known_args.filename, logger=logger)
226265

227266
if known_args.html:
228-
writer = HTMLWriter(graph, options=["rankdir=" + known_args.rankdir], output=known_args.filename, logger=logger)
267+
writer = HTMLWriter(graph, options=[
268+
"rankdir=" + known_args.rankdir,
269+
"ranksep=" + known_args.ranksep,
270+
"layout=" + known_args.layout,
271+
], output=known_args.filename, logger=logger)
229272

230273
if known_args.svg:
231-
writer = SVGWriter(graph, options=["rankdir=" + known_args.rankdir], output=known_args.filename, logger=logger)
274+
writer = SVGWriter(graph, options=[
275+
"rankdir=" + known_args.rankdir,
276+
"ranksep=" + known_args.ranksep,
277+
"layout=" + known_args.layout,
278+
], output=known_args.filename, logger=logger)
232279

233280
if known_args.tgf:
234281
writer = TgfWriter(graph, output=known_args.filename, logger=logger)

visualize_pyan_architecture.sh

+5
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,8 @@
22
echo -ne "Pyan architecture: generating architecture.{dot,svg}\n"
33
python3 -m pyan pyan/*.py --no-defines --uses --colored --annotate --dot -V >architecture.dot 2>architecture.log
44
dot -Tsvg architecture.dot >architecture.svg
5+
echo -ne "Pyan architecture: generating architecture.{html,graphviz=fdp}\n"
6+
python3 -m pyan pyan/*.py --no-defines --uses \
7+
--grouped --nested-groups \
8+
--graphviz-layout fdp \
9+
--colored --html > architecture.html

0 commit comments

Comments
 (0)