From 1924efdc9788d1e2770388c8c62ef1d0dfab9469 Mon Sep 17 00:00:00 2001 From: bennaaym Date: Fri, 11 Feb 2022 00:39:08 +0300 Subject: [PATCH] bennaaym/graphviz_support: package issues fixed | examples added --- .github/workflows/graphviz.yml | 4 +- extensions/graphviz_support/README.md | 40 ++++++++++++++----- .../graphviz_support/__init__.py | 7 ++++ .../graphviz_support/errors/__init__.py | 2 + .../examples/graph_w_logging.py | 15 +++++++ .../graphviz_support/examples/simple_viz.py | 15 +++++++ .../generate_graphviz/__init__.py | 2 + .../generate_graphviz/generate_graphviz.py | 8 ++-- .../graphviz_node/__init__.py | 2 + extensions/graphviz_support/setup.py | 3 +- 10 files changed, 84 insertions(+), 14 deletions(-) create mode 100644 extensions/graphviz_support/graphviz_support/__init__.py create mode 100644 extensions/graphviz_support/graphviz_support/errors/__init__.py create mode 100644 extensions/graphviz_support/graphviz_support/examples/graph_w_logging.py create mode 100644 extensions/graphviz_support/graphviz_support/examples/simple_viz.py create mode 100644 extensions/graphviz_support/graphviz_support/generate_graphviz/__init__.py create mode 100644 extensions/graphviz_support/graphviz_support/graphviz_node/__init__.py diff --git a/.github/workflows/graphviz.yml b/.github/workflows/graphviz.yml index fa339de11..092130768 100644 --- a/.github/workflows/graphviz.yml +++ b/.github/workflows/graphviz.yml @@ -17,4 +17,6 @@ jobs: pip install extensions/graphviz_support - name: Run graphviz_support tests run: | - python -m extensions.graphviz_support.graphviz_support.tests.test_lg_graphviz_api \ No newline at end of file + python -m extensions.graphviz_support.graphviz_support.tests.test_lg_graphviz_api + python -m extensions.graphviz_support.graphviz_support.examples.simple_viz + python -m extensions.graphviz_support.graphviz_support.examples.graph_w_logging diff --git a/extensions/graphviz_support/README.md b/extensions/graphviz_support/README.md index 9bacfeae4..7e9aa23e4 100644 --- a/extensions/graphviz_support/README.md +++ b/extensions/graphviz_support/README.md @@ -1,18 +1,19 @@ -# Graphviz for LabGraph graphs +# Graphviz for LabGraph Graphs -This extension provides an API to generate a graphviz visualization of the LabGraph topology. +This extension provides an API to generate a graphviz visualization of the LabGraph topology. ## Quick Start ### Method 1 - building from source code **Prerequisites**: -* Python3\ -Supported python version(s) - * [Python3.6](https://www.python.org/downloads/) - * [Python3.8](https://www.python.org/downloads/) (**RECOMMENDED**) -* Make sure to install [labgraph](https://github.com/facebookresearch/labgraph) before proceeding -* Make sure to install [graphviz](https://graphviz.org/download/) on your main OS before proceeding + +- Python3\ + Supported python version(s) + _ [Python3.6](https://www.python.org/downloads/) + _ [Python3.8](https://www.python.org/downloads/) (**RECOMMENDED**) +- Make sure to install [labgraph](https://github.com/facebookresearch/labgraph) before proceeding +- Make sure to install [graphviz](https://graphviz.org/download/) on your main OS before proceeding ``` cd labgraph/extensions/graphviz_support @@ -24,21 +25,42 @@ python setup.py install To make sure things are working: 1- Move to the root of the LabGraph directory: + ``` labgraph\extensions\graphviz_support> cd ../.. labgraph> ``` + 2- Run the following test + ``` python -m extensions.graphviz_support.graphviz_support.tests.test_lg_graphviz_api ``` + **The output of the file for this test can be found at:**\ extensions\graphviz_support\graphviz_support\tests\output + ### Generating a graphviz file To generate a graph visualization just call 'generate_graphviz' function and pass the appropriate parameters + ``` -from extensions/graphviz_support/graphviz_support/generate_graphviz/generate_graphviz.py import generate_graphviz.py +from graphviz_support import generate_graphviz generate_graphviz(graph, output_file) ``` + +### Examples: + +To get a better understanding of Graphviz API, please check the following examples + +``` +python -m extensions.graphviz_support.graphviz_support.examples.simple_viz +``` + +``` +python -m extensions.graphviz_support.graphviz_support.examples.graph_w_logging +``` + +**(!) The outputs of the above examples can be found under the following folder** +extensions\graphviz_support\graphviz_support\examples\output diff --git a/extensions/graphviz_support/graphviz_support/__init__.py b/extensions/graphviz_support/graphviz_support/__init__.py new file mode 100644 index 000000000..dc1abf4fe --- /dev/null +++ b/extensions/graphviz_support/graphviz_support/__init__.py @@ -0,0 +1,7 @@ +#!/usr/bin/env python3 +# Copyright 2004-present Facebook. All Rights Reserved. + + +from .generate_graphviz.generate_graphviz import generate_graphviz + +__all__ = ['generate_graphviz'] diff --git a/extensions/graphviz_support/graphviz_support/errors/__init__.py b/extensions/graphviz_support/graphviz_support/errors/__init__.py new file mode 100644 index 000000000..860ac27c6 --- /dev/null +++ b/extensions/graphviz_support/graphviz_support/errors/__init__.py @@ -0,0 +1,2 @@ +#!/usr/bin/env python3 +# Copyright 2004-present Facebook. All Rights Reserved. diff --git a/extensions/graphviz_support/graphviz_support/examples/graph_w_logging.py b/extensions/graphviz_support/graphviz_support/examples/graph_w_logging.py new file mode 100644 index 000000000..fedaeff4e --- /dev/null +++ b/extensions/graphviz_support/graphviz_support/examples/graph_w_logging.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python3 +# Copyright 2004-present Facebook. All Rights Reserve + +from labgraph.examples.graph_w_logging import Demo as GraphWLogging +from graphviz_support import generate_graphviz +import pathlib + + +if __name__ == '__main__': + graph_w_logging = GraphWLogging() + out_dir: str = pathlib.Path(__file__).parent.absolute() + generate_graphviz( + graph_w_logging, + f'{out_dir}/output/graph_w_logging.svg' + ) diff --git a/extensions/graphviz_support/graphviz_support/examples/simple_viz.py b/extensions/graphviz_support/graphviz_support/examples/simple_viz.py new file mode 100644 index 000000000..a42f1f83b --- /dev/null +++ b/extensions/graphviz_support/graphviz_support/examples/simple_viz.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python3 +# Copyright 2004-present Facebook. All Rights Reserve + +from labgraph.examples.simple_viz import Demo as SimpleVizGraph +from graphviz_support import generate_graphviz +import pathlib + + +if __name__ == '__main__': + simple_viz_graph = SimpleVizGraph() + out_dir: str = pathlib.Path(__file__).parent.absolute() + generate_graphviz( + simple_viz_graph, + f'{out_dir}/output/simple_viz.svg' + ) diff --git a/extensions/graphviz_support/graphviz_support/generate_graphviz/__init__.py b/extensions/graphviz_support/graphviz_support/generate_graphviz/__init__.py new file mode 100644 index 000000000..860ac27c6 --- /dev/null +++ b/extensions/graphviz_support/graphviz_support/generate_graphviz/__init__.py @@ -0,0 +1,2 @@ +#!/usr/bin/env python3 +# Copyright 2004-present Facebook. All Rights Reserved. diff --git a/extensions/graphviz_support/graphviz_support/generate_graphviz/generate_graphviz.py b/extensions/graphviz_support/graphviz_support/generate_graphviz/generate_graphviz.py index 8fa182be9..0f820199f 100644 --- a/extensions/graphviz_support/graphviz_support/generate_graphviz/generate_graphviz.py +++ b/extensions/graphviz_support/graphviz_support/generate_graphviz/generate_graphviz.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 # Copyright 2004-present Facebook. All Rights Reserve +import os import labgraph as lg from labgraph.graphs.stream import Stream from graphviz import Digraph @@ -79,7 +80,7 @@ def in_out_edge_mapper(streams: Stream) -> Dict[str, str]: difference = set(stream.topic_paths).difference(GraphVizNode.in_edges) if difference: - upstream_edge = difference.pop() + upstream_edge = max(difference, key=len) for edge in stream.topic_paths: if edge != upstream_edge: in_out_edge_map[edge] = upstream_edge @@ -171,7 +172,8 @@ def generate_graphviz(graph: lg.Graph, output_file: str) -> None: raise GenerateGraphvizError( "Parameter 'output_file' cannot be null or empty string." ) - filename, format = output_file.split('.') + + filename, format = os.path.splitext(output_file) # Local variables nodes: List[GraphVizNode] = [] @@ -187,5 +189,5 @@ def generate_graphviz(graph: lg.Graph, output_file: str) -> None: type(graph).__name__, nodes, filename, - format + format[1:] ) diff --git a/extensions/graphviz_support/graphviz_support/graphviz_node/__init__.py b/extensions/graphviz_support/graphviz_support/graphviz_node/__init__.py new file mode 100644 index 000000000..860ac27c6 --- /dev/null +++ b/extensions/graphviz_support/graphviz_support/graphviz_node/__init__.py @@ -0,0 +1,2 @@ +#!/usr/bin/env python3 +# Copyright 2004-present Facebook. All Rights Reserved. diff --git a/extensions/graphviz_support/setup.py b/extensions/graphviz_support/setup.py index 89118d520..bdbcc9dec 100644 --- a/extensions/graphviz_support/setup.py +++ b/extensions/graphviz_support/setup.py @@ -3,10 +3,11 @@ from setuptools import find_packages, setup + setup( name="graphviz_support", version="1.0.0", - description="LabGraph Monitor Improvement - Graphviz for LabGraph graphs", + description="Graphviz Extension For LabGraph", packages=find_packages(), python_requires=">=3.6", install_requires=[