diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6c904c7..3f1d2b6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,14 +1,49 @@ +### General guidelines + CONTRIBUTING.md ### Pixi +This project is managed by [Pixi](https://pixi.prefix.dev/) with a single environment (`default`). + +We reproduce below the most relevant commands. For more, see [Pixi's Getting Started](https://pixi.prefix.dev/latest/getting_started/) + +#### Install the project + ```bash pixi install pixi update +``` + +#### Run the tests + +```bash pixi run test pixi run test-lowest pixi run lint pixi run typecheck pixi run full-ci -pixi run graph-to-svg acyclic1 +``` + +#### Run the example + +Turn a workflow into a SVG + +``` +pixi run graph-to-svg +``` + +If `workflow_name` is not given, `ewoksdraw` will use a test workflow. + + +#### Add dependencies + +```bash +pixi add +``` + +By default, this will install the conda package (if there is one). To install from PyPI: + +```bash +pixi add --pypi ``` \ No newline at end of file diff --git a/src/ewoksdraw/css_styles/css_background.css b/src/ewoksdraw/css_styles/css_background.css index 11e262c..731832c 100644 --- a/src/ewoksdraw/css_styles/css_background.css +++ b/src/ewoksdraw/css_styles/css_background.css @@ -1,3 +1,3 @@ .background { - fill: #000000; + fill: var(--bg-color); } \ No newline at end of file diff --git a/src/ewoksdraw/css_styles/css_link_cubic_bezier.css b/src/ewoksdraw/css_styles/css_link_cubic_bezier.css index e33e3ee..5cf1ab2 100644 --- a/src/ewoksdraw/css_styles/css_link_cubic_bezier.css +++ b/src/ewoksdraw/css_styles/css_link_cubic_bezier.css @@ -1,6 +1,6 @@ .link_cubic_bezier { fill: none; - stroke: #ffffff; + stroke: var(--stroke-color); stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; diff --git a/src/ewoksdraw/css_styles/css_task_anchor_link.css b/src/ewoksdraw/css_styles/css_task_anchor_link.css index 55465d3..ac61bfe 100644 --- a/src/ewoksdraw/css_styles/css_task_anchor_link.css +++ b/src/ewoksdraw/css_styles/css_task_anchor_link.css @@ -1,3 +1,3 @@ .task_anchor_link { - fill: rgb(176, 147, 255); + fill: var(--link-color); } diff --git a/src/ewoksdraw/css_styles/css_task_box.css b/src/ewoksdraw/css_styles/css_task_box.css index 4ffe920..0d9fe21 100644 --- a/src/ewoksdraw/css_styles/css_task_box.css +++ b/src/ewoksdraw/css_styles/css_task_box.css @@ -1,8 +1,7 @@ .task_box { - fill: #00000000; - stroke: rgb(255, 255, 255); - stroke-width: 0.2%; + fill: var(--transparent); + stroke: var(--stroke-color); + stroke-width: var(--stroke-width); rx: 0.5%; ry: 0.5%; } - diff --git a/src/ewoksdraw/css_styles/css_task_line.css b/src/ewoksdraw/css_styles/css_task_line.css index 05a295b..040b56d 100644 --- a/src/ewoksdraw/css_styles/css_task_line.css +++ b/src/ewoksdraw/css_styles/css_task_line.css @@ -1,5 +1,4 @@ .task_line { - stroke: #ffffff; - stroke-width: 1; - stroke-dasharray: none; -} \ No newline at end of file + stroke: var(--stroke-color); + stroke-width: var(--stroke-width); +} diff --git a/src/ewoksdraw/css_styles/css_task_text_io.css b/src/ewoksdraw/css_styles/css_task_text_io.css index 613e90d..c975e92 100644 --- a/src/ewoksdraw/css_styles/css_task_text_io.css +++ b/src/ewoksdraw/css_styles/css_task_text_io.css @@ -1,4 +1,4 @@ .task_text_io { font-family: Helvetica, sans-serif; - fill: rgb(255, 255, 255); + fill: var(--text-color); } \ No newline at end of file diff --git a/src/ewoksdraw/css_styles/css_task_title.css b/src/ewoksdraw/css_styles/css_task_title.css index 7884b8b..e412024 100644 --- a/src/ewoksdraw/css_styles/css_task_title.css +++ b/src/ewoksdraw/css_styles/css_task_title.css @@ -1,4 +1,4 @@ .task_title { font-family: Helvetica, sans-serif; - fill: rgb(255, 255, 255); + fill: var(--text-color); } \ No newline at end of file diff --git a/src/ewoksdraw/css_styles/root.css b/src/ewoksdraw/css_styles/root.css new file mode 100644 index 0000000..41cc9c1 --- /dev/null +++ b/src/ewoksdraw/css_styles/root.css @@ -0,0 +1,8 @@ +.ewoksdraw { + --bg-color: rgb(0, 0, 0); + --link-color: rgb(176, 147, 255); + --stroke-color: rgb(255, 255, 255); + --stroke-width: 1; + --text-color: rgb(255, 255, 255); + --transparent: rgba(0, 0, 0, 0) +} \ No newline at end of file diff --git a/src/ewoksdraw/svg/svg_canvas.py b/src/ewoksdraw/svg/svg_canvas.py index e407e6b..ba4979d 100644 --- a/src/ewoksdraw/svg/svg_canvas.py +++ b/src/ewoksdraw/svg/svg_canvas.py @@ -12,6 +12,7 @@ from .svg_background import SvgBackground from .svg_element import SvgElement from .svg_group import SvgGroup +from .utils import generate_style_element Number = Union[int, float] @@ -96,6 +97,7 @@ def _generate_xml_svg(self) -> Element: width=str(self.width), height=str(self.height), ) + xml_svg.set("class", "ewoksdraw") style_elements = self._gather_all_styles() seen_styles = set() @@ -136,4 +138,7 @@ def _gather_all_styles(self) -> List[Element]: for element in self.elements: all_styles.extend(self._yield_styles(element)) - return all_styles + root_element = generate_style_element("root.css") + if root_element is None: + return all_styles + return [root_element, *all_styles] diff --git a/src/ewoksdraw/svg/svg_element.py b/src/ewoksdraw/svg/svg_element.py index 4e399b5..db86be0 100644 --- a/src/ewoksdraw/svg/svg_element.py +++ b/src/ewoksdraw/svg/svg_element.py @@ -1,10 +1,11 @@ import warnings -from pathlib import Path from typing import Literal from typing import Optional from typing import get_args from xml.etree.ElementTree import Element +from .utils import generate_style_element + SvgTag = Literal["rect", "circle", "text", "line", "path"] SUPPORTED_TAGS: tuple[SvgTag, ...] = get_args(SvgTag) @@ -125,12 +126,4 @@ def _load_css_style(self) -> Optional[Element]: if not self._css_class: return None - css_file_path = Path(f"src/ewoksdraw/css_styles/css_{self._css_class}.css") - if not css_file_path.exists(): - return None - - with open(css_file_path, "r") as css_file: - css_content = css_file.read() - style = Element("style") - style.text = f"" - return style + return generate_style_element(css_file_name=f"css_{self._css_class}.css") diff --git a/src/ewoksdraw/svg/svg_task.py b/src/ewoksdraw/svg/svg_task.py index 421187e..ff6d579 100644 --- a/src/ewoksdraw/svg/svg_task.py +++ b/src/ewoksdraw/svg/svg_task.py @@ -53,7 +53,6 @@ def __init__( list_io=output_names, io_type="output", vertical_spacing=8 ) self._line_title = SvgTaskLine(x1=0, y1=0, x2=0, y2=0) - self._init_elements() def _init_elements(self) -> None: diff --git a/src/ewoksdraw/svg/utils.py b/src/ewoksdraw/svg/utils.py new file mode 100644 index 0000000..db523f5 --- /dev/null +++ b/src/ewoksdraw/svg/utils.py @@ -0,0 +1,16 @@ +from pathlib import Path +from xml.etree.ElementTree import Element + +CSS_DIR = Path(__file__).parent.parent / "css_styles" + + +def generate_style_element(css_file_name: str) -> None | Element: + css_file_path = CSS_DIR / css_file_name + if not css_file_path.exists(): + return None + + with open(css_file_path, "r") as css_file: + css_content = css_file.read() + style = Element("style") + style.text = f"" + return style