Skip to content

Commit

Permalink
add graphviz module
Browse files Browse the repository at this point in the history
  • Loading branch information
njwilson23 committed Jun 2, 2018
1 parent 5a7407f commit e73dfdf
Showing 1 changed file with 48 additions and 0 deletions.
48 changes: 48 additions & 0 deletions depgraph/graphviz.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
from .depgraph import get_descendent_edges, get_ancestor_edges

def graphviz(*datasets, **kwargs):
""" Return a graphviz diagram in dot format describing the dependency
graph.
Parameters
----------
*datasets : Dataset instances
node_id : function(Dataset) -> str, optional
Callable taking a Dataset and returning a name to use as a graphviz node
id. Default is Dataset.name.
style : function(Dataset) -> dict, optional
Callable taking a Dataset and returning graphviz styling attributes.
Default is bare styling.
include : function(Dataset, Dataset) -> bool, optional
Callable taking a Dataset and returning a boolean indicating whether a
dataset should be included in the graph. Default is to include all
datasets.
Returns
-------
str : graphviz visualization in dot format
"""
f_id = kwargs.get("node_id", lambda d: d.name)
f_style = kwargs.get("style", lambda d1, d2: {})
f_incl = kwargs.get("include", lambda d1, d2: True)

# Make a list of edges (parent, child)
edges = []
for ds in datasets:
edges.extend(e for e in get_descendent_edges(ds) if e not in edges)
edges.extend(e for e in get_ancestor_edges(ds) if e not in edges)

relations = []
for e in edges:
if f_incl(*e):
s = f_style(*e)
if len(s) != 0:
s = " [{}]".format(",".join(["{}={}".format(*kv) for kv in s.items()]))
relations.append("\"{}\" -> \"{}\"{}".format(f_id(e[0]), f_id(e[1]), s))

dotstr = """strict digraph {{
{0}
}}""".format("\n ".join(relations))
return dotstr


0 comments on commit e73dfdf

Please sign in to comment.