Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,21 @@
[![License](https://img.shields.io/github/license/ewoks-kit/ewoksdraw)](https://github.com/ewoks-kit/ewoksdraw/blob/main/LICENSE.md)
[![Coverage](https://codecov.io/gh/ewoks-kit/ewoksdraw/branch/main/graph/badge.svg)](https://codecov.io/gh/ewoks-kit/ewoksdraw)

A project to generate SVG mock-ups out of Ewoks workflows.
A library to generate SVG mock-ups out of Ewoks workflows.

## Quick start

```bash
pip install "git+https://github.com/ewoks-kit/ewoksdraw.git"
ewoksdraw <name_of_output_file>
```

```python
from ewoks import load_graph
from ewoksdraw import graph_to_svg

# Load a graph with `ewoks.load_graph`
graph = load_graph(...)

# Generate the SVG
graph_to_svg(graph, output_path='my_workflow.svg')
```
3 changes: 0 additions & 3 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,6 @@ Repository = "https://github.com/ewoks-kit/ewoksdraw/"
Issues = "https://github.com/ewoks-kit/ewoksdraw/issues/"
Changelog = "https://github.com/ewoks-kit/ewoksdraw/-/blob/main/CHANGELOG.md"

[project.scripts]
ewoksdraw = "ewoksdraw.main:main"

[project.optional-dependencies]
test = [
"pytest >=7",
Expand Down
37 changes: 36 additions & 1 deletion src/ewoksdraw/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1,36 @@
# This file is intentionally left blank.
import random
from pathlib import Path

from ewokscore.graph import TaskGraph
from ewokscore.graph.inputs import _get_all_node_inputs
from ewokscore.graph.inputs import _get_all_task_output_names

from .svg import SvgBackground
from .svg import SvgCanvas
from .svg import SvgTask


def graph_to_svg(graph: TaskGraph, output_path: str | Path):
canvas_width = 500
canvas_height = 500

canvas = SvgCanvas(width=canvas_width, height=canvas_height)
svg_background = SvgBackground(canvas_width, canvas_height)
canvas.add_element(svg_background)

for node_id, node_attrs in graph.graph.nodes.items():
node_inputs = _get_all_node_inputs(node_id, node_attrs)
node_outputs = _get_all_task_output_names(
node_attrs["task_type"], node_attrs["task_identifier"]
)
svg_task = SvgTask(
task_name=node_id,
input_names=[n.name for n in node_inputs],
output_names=node_outputs,
)

svg_task.translate(x=random.randint(5, 400), y=random.randint(5, 400))

canvas.add_element(svg_task)

canvas.draw(output_path)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note that the SvgCanvas can also generate SVG dict and string representations, not just files. Not sure we should already anticipate this usage.

60 changes: 0 additions & 60 deletions src/ewoksdraw/main.py

This file was deleted.

31 changes: 31 additions & 0 deletions src/ewoksdraw/tests/test_graph_to_svg.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
from pathlib import Path
from xml.etree import ElementTree

import pytest
from ewokscore import load_graph
from ewokscore.tests.examples.graphs import get_graph
from ewokscore.tests.examples.graphs import graph_names

from ewoksdraw import graph_to_svg


def _get_svg_groups(output_path: Path):
tree = ElementTree.parse(output_path)
root = tree.getroot()
return [child for child in root if child.tag.endswith("g")]


@pytest.mark.parametrize("graph_name", graph_names())
def test_groups_are_matching_nodes(graph_name, tmp_path: Path):
output_path = tmp_path / "test.svg"

graph, _ = get_graph(graph_name)
ewoksgraph = load_graph(graph)

graph_to_svg(ewoksgraph, output_path)

assert output_path.is_file()

groups = _get_svg_groups(output_path)
for group, node_name in zip(groups, ewoksgraph.graph.nodes.keys()):
assert group[0].text == node_name
25 changes: 0 additions & 25 deletions src/ewoksdraw/tests/test_main.py

This file was deleted.

Loading