From 3d791778de6ba382dc06c0c3c904578069f2330d Mon Sep 17 00:00:00 2001 From: David de la Iglesia Castro Date: Fri, 27 May 2022 10:39:50 +0200 Subject: [PATCH] plots: Pass `templates_dir` to `match_renderers`. We were forgetting to pass default template dir. Fixes #7817. --- dvc/commands/plots.py | 4 +++- dvc/render/match.py | 2 +- dvc/repo/plots/__init__.py | 3 ++- tests/unit/command/test_plots.py | 30 ++++++++++++++++++++++++++++++ tests/unit/render/test_match.py | 15 +++++++++++++++ 5 files changed, 51 insertions(+), 3 deletions(-) diff --git a/dvc/commands/plots.py b/dvc/commands/plots.py index 10dfb901f8..87735e9c86 100644 --- a/dvc/commands/plots.py +++ b/dvc/commands/plots.py @@ -75,7 +75,9 @@ def run(self): out if self.args.json else os.path.join(out, "static") ) renderers = match_renderers( - plots_data=plots_data, out=renderers_out + plots_data=plots_data, + out=renderers_out, + templates_dir=self.repo.plots.templates_dir, ) if self.args.show_vega: diff --git a/dvc/render/match.py b/dvc/render/match.py index 46feeed6c5..69dff81fc6 100644 --- a/dvc/render/match.py +++ b/dvc/render/match.py @@ -49,7 +49,7 @@ def match_renderers( if out is not None: plot_properties["out"] = out if templates_dir is not None: - plot_properties["templates_dir"] = templates_dir + plot_properties["template_dir"] = templates_dir datapoints, plot_properties = to_datapoints( renderer_class, group, plot_properties ) diff --git a/dvc/repo/plots/__init__.py b/dvc/repo/plots/__init__.py index d8af7fddcd..ec00650f5e 100644 --- a/dvc/repo/plots/__init__.py +++ b/dvc/repo/plots/__init__.py @@ -228,7 +228,8 @@ def modify(self, path, props=None, unset=None): @cached_property def templates_dir(self): - return os.path.join(self.repo.dvc_dir, "plots") + if self.repo.dvc_dir: + return os.path.join(self.repo.dvc_dir, "plots") def _is_plot(out: "Output") -> bool: diff --git a/tests/unit/command/test_plots.py b/tests/unit/command/test_plots.py index a1526a80d9..a2430c786c 100644 --- a/tests/unit/command/test_plots.py +++ b/tests/unit/command/test_plots.py @@ -240,6 +240,36 @@ def test_plots_path_is_quoted_and_resolved_properly( assert expected_url in out +def test_should_pass_template_dir(tmp_dir, dvc, mocker, capsys): + cli_args = parse_args( + [ + "plots", + "diff", + "HEAD~1", + "--json", + "--targets", + "plot.csv", + ] + ) + cmd = cli_args.func(cli_args) + + data = mocker.MagicMock() + mocker.patch("dvc.repo.plots.diff.diff", return_value=data) + + renderers = mocker.MagicMock() + match_renderers = mocker.patch( + "dvc.render.match.match_renderers", return_value=renderers + ) + + assert cmd.run() == 0 + + match_renderers.assert_called_once_with( + plots_data=data, + out="dvc_plots", + templates_dir=str(tmp_dir / ".dvc/plots"), + ) + + @pytest.mark.parametrize( "output", ("some_out", os.path.join("to", "subdir"), None) ) diff --git a/tests/unit/render/test_match.py b/tests/unit/render/test_match.py index b71136e894..f9b9aad81e 100644 --- a/tests/unit/render/test_match.py +++ b/tests/unit/render/test_match.py @@ -178,3 +178,18 @@ def test_match_renderers_with_out(tmp_dir, mocker): assert ( tmp_dir / "foo" / "workspace_other_file.jpg" ).read_bytes() == b"content2" + + +def test_match_renderers_template_dir(mocker): + from dvc_render import vega + + vega_render = mocker.spy(vega.VegaRenderer, "__init__") + data = { + "v1": { + "data": {"file.json": {"data": [{"y": 4}, {"y": 5}], "props": {}}} + }, + } + + match_renderers(data, templates_dir="foo") + + assert vega_render.call_args[1]["template_dir"] == "foo"