Skip to content

Instantly share code, notes, and snippets.

@omaraboumrad
Last active October 28, 2016 13:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save omaraboumrad/bf617fe3cde568d87a7586f97faf33ed to your computer and use it in GitHub Desktop.
Save omaraboumrad/bf617fe3cde568d87a7586f97faf33ed to your computer and use it in GitHub Desktop.
Create a block diagram from a python class hierarchy using blockdiag
"""
Dependencies: pip install blockdiag
Run: python visualize.py
"""
from blockdiag import parser, builder, drawer
TEMPLATE = """
blockdiag {{ orientation = portrait
{}
}}"""
def hierarchy(cls):
parents = set(cls.__bases__) - {object}
if parents:
edges = zip(parents, [cls]*len(parents))
for parent in parents:
return edges + hierarchy(parent)
return []
def generate_blockdiag_string(cls):
return TEMPLATE.format('\n'.join(
'{} -> {};'.format(s.__name__, t.__name__) for s, t in hierarchy(cls)))
def build_png(source):
tree = parser.parse_string(source)
diagram = builder.ScreenNodeBuilder.build(tree)
draw = drawer.DiagramDraw('PNG', diagram, filename="foo.png")
draw.draw()
draw.save()
if __name__ == '__main__':
class Closeable(object):
pass
class Clickable(object):
pass
class Widget(Closeable, Clickable):
pass
class Panel(Widget):
pass
build_png(generate_blockdiag_string(Panel))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment