From e0fd0790fc77b19694aabef3c94b52e7cd0135f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Redzy=C5=84ski?= Date: Mon, 1 Nov 2021 13:56:28 +0100 Subject: [PATCH] plots: special chars handling for vega plots paths Fixes: #6894 --- dvc/render/base.py | 11 ++++++++++- tests/unit/render/test_renderer.py | 9 +++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 tests/unit/render/test_renderer.py diff --git a/dvc/render/base.py b/dvc/render/base.py index b92976b83d..60506f9469 100644 --- a/dvc/render/base.py +++ b/dvc/render/base.py @@ -45,8 +45,17 @@ def SCRIPTS(self): def as_json(self): raise NotImplementedError + @staticmethod + def _remove_special_chars(string: str): + return string.translate( + {ord(c): "_" for c in r"!@#$%^&*()[]{};,<>?\/:.|`~=_+"} + ) + def generate_html(self, path: "StrPath"): """this method might edit content of path""" partial = self._convert(path) - div_id = f"plot_{self.filename.replace('.', '_').replace('/', '_')}" + + div_id = self._remove_special_chars(self.filename) + div_id = f"plot_{div_id}" + return self.DIV.format(id=div_id, partial=partial) diff --git a/tests/unit/render/test_renderer.py b/tests/unit/render/test_renderer.py new file mode 100644 index 0000000000..86e3f15f9b --- /dev/null +++ b/tests/unit/render/test_renderer.py @@ -0,0 +1,9 @@ +from dvc.render.base import Renderer + + +def test_remove_special_characters(): + special_chars = r"!@#$%^&*()[]{};,<>?\/:.|`~=_+" + dirty = f"plot_name{special_chars}" + assert Renderer._remove_special_chars(dirty) == "plot_name" + "_" * len( + special_chars + )