From f98fe80e98fa653482585c5e991d08d5bcfb8648 Mon Sep 17 00:00:00 2001 From: Matt Seddon Date: Fri, 6 Oct 2023 09:52:50 +1100 Subject: [PATCH 1/2] Fill template anchors inserted into custom template strings --- src/dvc_render/vega_templates.py | 2 ++ tests/test_vega.py | 38 ++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/src/dvc_render/vega_templates.py b/src/dvc_render/vega_templates.py index 82fb527..36e23d9 100644 --- a/src/dvc_render/vega_templates.py +++ b/src/dvc_render/vega_templates.py @@ -43,6 +43,8 @@ def dict_replace_value(d: dict, name: str, value: Any) -> dict: if v == name: x[k] = value continue + if name in v and isinstance(value, str): + v = v.replace(name, value) x[k] = v return x diff --git a/tests/test_vega.py b/tests/test_vega.py index f545665..0cdd3a9 100644 --- a/tests/test_vega.py +++ b/tests/test_vega.py @@ -229,3 +229,41 @@ def test_escape_special_characters(): assert filled["encoding"]["x"]["title"] == "foo.bar[0]" assert filled["encoding"]["y"]["field"] == "foo\\.bar\\[1\\]" assert filled["encoding"]["y"]["title"] == "foo.bar[1]" + + +def test_fill_anchor_in_string(tmp_dir): + y = "lab" + x = "SR" + tmp_dir.gen( + "custom.json", + json.dumps( + { + "data": {"values": Template.anchor("data")}, + "transform": [ + {"joinaggregate": [{"op": "mean", "field": "lab", "as": "mean_y"}]}, + { + "calculate": "pow(" + + "datum. - datum.,2" + + ")", + "as": "SR", + }, + {"joinaggregate": [{"op": "sum", "field": "SR", "as": "SSR"}]}, + ], + "encoding": { + "x": {"field": Template.anchor("x")}, + "y": {"field": Template.anchor("y")}, + }, + }, + ), + ) + datapoints = [ + {x: "B", y: "A"}, + {x: "A", y: "A"}, + ] + props = {"template": "custom.json", "x": x, "y": y} + + renderer = VegaRenderer(datapoints, "foo", **props) + filled = renderer.get_filled_template(as_string=False) + assert filled["transform"][1]["calculate"] == "pow(datum.lab - datum.SR,2)" + assert filled["encoding"]["x"]["field"] == x + assert filled["encoding"]["y"]["field"] == y From 65386041325ef342db3b7d455e8c94ed775ec4fa Mon Sep 17 00:00:00 2001 From: Matt Seddon Date: Fri, 6 Oct 2023 10:00:55 +1100 Subject: [PATCH 2/2] Appease mypy --- src/dvc_render/vega.py | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/src/dvc_render/vega.py b/src/dvc_render/vega.py index 24c287b..b10ab0a 100644 --- a/src/dvc_render/vega.py +++ b/src/dvc_render/vega.py @@ -117,22 +117,23 @@ def generate_markdown(self, report_path=None) -> str: data[x] = list(map(float, data[x])) data[y] = list(map(float, data[y])) - plt.title(self.properties.get("title", Path(self.name).stem)) - plt.xlabel(self.properties.get("x_label", x)) - plt.ylabel(self.properties.get("y_label", y)) - plt.plot(x, y, data=data) - plt.tight_layout() - plt.savefig(output_file) - plt.close() - - if report_path: - return f"\n![{self.name}]({output_file.relative_to(report_folder)})" - - base64_str = base64.b64encode( - output_file.getvalue() # type: ignore - ).decode() - src = f"data:image/png;base64,{base64_str}" - - return f"\n![{self.name}]({src})" + if x is not None and y is not None: + plt.title(self.properties.get("title", Path(self.name).stem)) + plt.xlabel(self.properties.get("x_label", x)) + plt.ylabel(self.properties.get("y_label", y)) + plt.plot(x, y, data=data) + plt.tight_layout() + plt.savefig(output_file) + plt.close() + + if report_path: + return f"\n![{self.name}]({output_file.relative_to(report_folder)})" + + base64_str = base64.b64encode( + output_file.getvalue() # type: ignore + ).decode() + src = f"data:image/png;base64,{base64_str}" + + return f"\n![{self.name}]({src})" return ""