diff --git a/Pipfile b/Pipfile deleted file mode 100644 index 1531910..0000000 --- a/Pipfile +++ /dev/null @@ -1,20 +0,0 @@ -[[source]] -url = "https://pypi.org/simple" -verify_ssl = true -name = "pypi" - -[packages] -typing_extensions = "*" -pygraphviz = "*" -raven = "*" -"svg.path" = "*" - -[dev-packages] -flake8 = "*" -pytest = "*" -pytest-cov = "*" -coveralls = "*" -sphinx_rtd_theme = "*" -mypy = "*" -black = "==24.3.0" -codecov = "*" diff --git a/README.md b/README.md index 4abff10..c70827b 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ [![twitter](https://img.shields.io/badge/@hmartin-00aced.svg?logo=twitter&logoColor=black)](https://twitter.com/hmartin) -Convert graphviz (dot) files into draw.io (mxGraph) format +Convert graphviz (dot) files into draw.io (mxGraph) format. ## Roadmap for 0.3 release (as of July 2, 2024) @@ -102,6 +102,9 @@ python -m graphviz2drawio test/directed/hello.gv.txt ## Roadmap to 1.0 release - [ ] Complete test suite for official graphviz examples - [ ] Migrate to uv/hatch for packaging and dep mgmt +- [ ] Bezier curve support +- [ ] Port layout +- [ ] Implementation for other outstanding TODOs ## License diff --git a/graphviz2drawio/graphviz2drawio.py b/graphviz2drawio/graphviz2drawio.py index 2af730e..05ef79c 100755 --- a/graphviz2drawio/graphviz2drawio.py +++ b/graphviz2drawio/graphviz2drawio.py @@ -29,10 +29,7 @@ def convert(graph_to_convert, layout_prog="dot"): [n.enrich_from_graph(graph_nodes[n.gid]) for n in nodes.values()] # Put clusters first, so that nodes are drawn in front - nodes_and_clusters = clusters - nodes_and_clusters.update(nodes) - - mx_graph = MxGraph(nodes_and_clusters, edges) + mx_graph = MxGraph(nodes | clusters, edges) return mx_graph.value() diff --git a/graphviz2drawio/models/SvgParser.py b/graphviz2drawio/models/SvgParser.py index b7d6f04..73404d6 100644 --- a/graphviz2drawio/models/SvgParser.py +++ b/graphviz2drawio/models/SvgParser.py @@ -10,16 +10,16 @@ def parse_nodes_edges_clusters( svg_data: bytes, -) -> tuple[dict[str, Node], list[Edge], dict[str, Node]]: +) -> tuple[OrderedDict[str, Node], list[Edge], OrderedDict[str, Node]]: root = ElementTree.fromstring(svg_data)[0] - coords: CoordsTranslate = CoordsTranslate.from_svg_transform(root.attrib["transform"]) + coords = CoordsTranslate.from_svg_transform(root.attrib["transform"]) node_factory = NodeFactory(coords) edge_factory = EdgeFactory(coords) - nodes: dict[str, Node] = OrderedDict() + nodes: OrderedDict[str, Node] = OrderedDict() edges: list[Edge] = [] - clusters: dict[str, Node] = OrderedDict() + clusters: OrderedDict[str, Node] = OrderedDict() for g in root: if SVG.is_tag(g, "g"): diff --git a/graphviz2drawio/mx/MxConst.py b/graphviz2drawio/mx/MxConst.py index da8edef..56efa4b 100644 --- a/graphviz2drawio/mx/MxConst.py +++ b/graphviz2drawio/mx/MxConst.py @@ -1,5 +1,3 @@ -DECLARATION = '' - BLOCK = "block" DIAMOND = "diamond" diff --git a/graphviz2drawio/mx/MxGraph.py b/graphviz2drawio/mx/MxGraph.py index 76cf1cd..bb663c8 100644 --- a/graphviz2drawio/mx/MxGraph.py +++ b/graphviz2drawio/mx/MxGraph.py @@ -133,5 +133,6 @@ def add_mx_geo_with_points(element, curve): def x_y_strs(point): return str(int(point.real)), str(int(point.imag)) - def value(self): - return MxConst.DECLARATION + ET.tostring(self.graph, encoding="unicode") + def value(self) -> str: + ET.indent(self.graph) + return ET.tostring(self.graph, encoding="unicode", xml_declaration=True) diff --git a/test/test_graphs.py b/test/test_graphs.py index d76802e..a3d8fb7 100644 --- a/test/test_graphs.py +++ b/test/test_graphs.py @@ -24,10 +24,10 @@ def check_value(e, check): assert match, "no match found for %s" % value -def check_edge(e, source, target): - assert e.attrib.get("edge") - assert e.attrib["source"] == source.attrib["id"] - assert e.attrib["target"] == target.attrib["id"] +def check_edge(edge, source, target): + assert edge.attrib.get("edge") + assert edge.attrib["source"] == source.attrib["id"] + assert edge.attrib["target"] == target.attrib["id"] def check_edge_dir(e, dx, dy): @@ -63,11 +63,11 @@ def test_hello(): def test_port(): - file = "./directed/port.gv.txt" + file = "test/directed/port.gv.txt" xml = graphviz2drawio.convert(file) root = ET.fromstring(xml) elements = check_xml_top(root) - check_edge(elements[2], elements[4], elements[5]) + check_edge(elements[6], elements[2], elements[3]) def test_polylines():