Skip to content

Commit e04c5de

Browse files
authored
Fill template anchors inside custom template strings (#145)
* Fill template anchors inserted into custom template strings * Appease mypy
1 parent 6d045d7 commit e04c5de

File tree

3 files changed

+58
-17
lines changed

3 files changed

+58
-17
lines changed

src/dvc_render/vega.py

+18-17
Original file line numberDiff line numberDiff line change
@@ -117,22 +117,23 @@ def generate_markdown(self, report_path=None) -> str:
117117
data[x] = list(map(float, data[x]))
118118
data[y] = list(map(float, data[y]))
119119

120-
plt.title(self.properties.get("title", Path(self.name).stem))
121-
plt.xlabel(self.properties.get("x_label", x))
122-
plt.ylabel(self.properties.get("y_label", y))
123-
plt.plot(x, y, data=data)
124-
plt.tight_layout()
125-
plt.savefig(output_file)
126-
plt.close()
127-
128-
if report_path:
129-
return f"\n![{self.name}]({output_file.relative_to(report_folder)})"
130-
131-
base64_str = base64.b64encode(
132-
output_file.getvalue() # type: ignore
133-
).decode()
134-
src = f"data:image/png;base64,{base64_str}"
135-
136-
return f"\n![{self.name}]({src})"
120+
if x is not None and y is not None:
121+
plt.title(self.properties.get("title", Path(self.name).stem))
122+
plt.xlabel(self.properties.get("x_label", x))
123+
plt.ylabel(self.properties.get("y_label", y))
124+
plt.plot(x, y, data=data)
125+
plt.tight_layout()
126+
plt.savefig(output_file)
127+
plt.close()
128+
129+
if report_path:
130+
return f"\n![{self.name}]({output_file.relative_to(report_folder)})"
131+
132+
base64_str = base64.b64encode(
133+
output_file.getvalue() # type: ignore
134+
).decode()
135+
src = f"data:image/png;base64,{base64_str}"
136+
137+
return f"\n![{self.name}]({src})"
137138

138139
return ""

src/dvc_render/vega_templates.py

+2
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ def dict_replace_value(d: dict, name: str, value: Any) -> dict:
4343
if v == name:
4444
x[k] = value
4545
continue
46+
if name in v and isinstance(value, str):
47+
v = v.replace(name, value)
4648
x[k] = v
4749
return x
4850

tests/test_vega.py

+38
Original file line numberDiff line numberDiff line change
@@ -229,3 +229,41 @@ def test_escape_special_characters():
229229
assert filled["encoding"]["x"]["title"] == "foo.bar[0]"
230230
assert filled["encoding"]["y"]["field"] == "foo\\.bar\\[1\\]"
231231
assert filled["encoding"]["y"]["title"] == "foo.bar[1]"
232+
233+
234+
def test_fill_anchor_in_string(tmp_dir):
235+
y = "lab"
236+
x = "SR"
237+
tmp_dir.gen(
238+
"custom.json",
239+
json.dumps(
240+
{
241+
"data": {"values": Template.anchor("data")},
242+
"transform": [
243+
{"joinaggregate": [{"op": "mean", "field": "lab", "as": "mean_y"}]},
244+
{
245+
"calculate": "pow("
246+
+ "datum.<DVC_METRIC_Y> - datum.<DVC_METRIC_X>,2"
247+
+ ")",
248+
"as": "SR",
249+
},
250+
{"joinaggregate": [{"op": "sum", "field": "SR", "as": "SSR"}]},
251+
],
252+
"encoding": {
253+
"x": {"field": Template.anchor("x")},
254+
"y": {"field": Template.anchor("y")},
255+
},
256+
},
257+
),
258+
)
259+
datapoints = [
260+
{x: "B", y: "A"},
261+
{x: "A", y: "A"},
262+
]
263+
props = {"template": "custom.json", "x": x, "y": y}
264+
265+
renderer = VegaRenderer(datapoints, "foo", **props)
266+
filled = renderer.get_filled_template(as_string=False)
267+
assert filled["transform"][1]["calculate"] == "pow(datum.lab - datum.SR,2)"
268+
assert filled["encoding"]["x"]["field"] == x
269+
assert filled["encoding"]["y"]["field"] == y

0 commit comments

Comments
 (0)