diff --git a/dvc/repo/plots/__init__.py b/dvc/repo/plots/__init__.py index d95394efc3..a6347c5ede 100644 --- a/dvc/repo/plots/__init__.py +++ b/dvc/repo/plots/__init__.py @@ -14,6 +14,7 @@ List, Optional, Set, + Union, ) import dpath.options @@ -444,16 +445,22 @@ def _collect_pipeline_files(repo, targets: List[str], props, onerror=None): if isinstance(dvcfile, PipelineFile): dvcfile_path = _relpath(repo.dvcfs, dvcfile.path) dvcfile_defs = dvcfile.load().get("plots", {}) + dvcfile_defs_dict: Dict[str, Union[Dict, None]] = {} if isinstance(dvcfile_defs, list): - dvcfile_defs = { - k: v for elem in dvcfile_defs for k, v in elem.items() - } + for elem in dvcfile_defs: + if isinstance(elem, str): + dvcfile_defs_dict[elem] = None + else: + k, v = list(elem.items())[0] + dvcfile_defs_dict[k] = v + else: + dvcfile_defs_dict = dvcfile_defs resolved = _resolve_definitions( repo.dvcfs, targets, props, dvcfile_path, - dvcfile_defs, + dvcfile_defs_dict, onerror=onerror, ) dpath.util.merge( diff --git a/dvc/schema.py b/dvc/schema.py index 191e67eea0..d18ad6af26 100644 --- a/dvc/schema.py +++ b/dvc/schema.py @@ -127,7 +127,7 @@ def validator(data): str: either_or(STAGE_DEFINITION, FOREACH_IN, [FOREACH_KWD, DO_KWD]) } MULTI_STAGE_SCHEMA = { - PLOTS: Any(SINGLE_PLOT_SCHEMA, [SINGLE_PLOT_SCHEMA]), + PLOTS: Any(SINGLE_PLOT_SCHEMA, [Any(str, SINGLE_PLOT_SCHEMA)]), STAGES: SINGLE_PIPELINE_STAGE_SCHEMA, VARS_KWD: VARS_SCHEMA, } diff --git a/tests/func/test_dvcfile.py b/tests/func/test_dvcfile.py index 9b2f6b88f7..adcd8f4aab 100644 --- a/tests/func/test_dvcfile.py +++ b/tests/func/test_dvcfile.py @@ -418,6 +418,7 @@ def test_dvcfile_load_dump_stage_with_desc_meta(tmp_dir, dvc): "plots": { "path/to/plot": {"x": "value", "y": "value"}, "path/to/another/plot": {"x": "value", "y": "value"}, + "path/to/empty/plot": None, }, "stages": STAGE_EXAMPLE, }, @@ -425,6 +426,8 @@ def test_dvcfile_load_dump_stage_with_desc_meta(tmp_dir, dvc): "plots": [ {"path/to/plot": {"x": "value", "y": "value"}}, {"path/to/another/plot": {"x": "value", "y": "value"}}, + {"path/to/empty/plot": None}, + "path/to/plot/str", ], "stages": STAGE_EXAMPLE, },