plot: check field exists (#3742)

This commit is contained in:
Paweł Redzyński
2020-05-06 18:33:10 +03:00
committed by GitHub
parent 26e203242f
commit aa99cc9934
2 changed files with 33 additions and 0 deletions
+20
View File
@@ -24,6 +24,13 @@ class NoDataForTemplateError(DvcException):
)
class NoFieldInDataError(DvcException):
def __init__(self, field_name):
super().__init__(
"Field '{}' does not exist in provided data.".format(field_name)
)
class Template:
INDENT = 4
SEPARATORS = (",", ": ")
@@ -91,6 +98,11 @@ class Template:
with open(template_path, "r") as fobj:
result_content = fobj.read()
if x_field:
Template._check_field_exists(data, x_field)
if y_field:
Template._check_field_exists(data, y_field)
result_content = Template._replace_data_anchors(
result_content, data, priority_datafile
)
@@ -101,6 +113,14 @@ class Template:
return result_content
@staticmethod
def _check_field_exists(data, field):
for file, data_points in data.items():
if not any(
field in data_point.keys() for data_point in data_points
):
raise NoFieldInDataError(field)
@staticmethod
def _replace_metadata_anchors(
result_content, title, x_field, x_title, y_field, y_title
+13
View File
@@ -18,6 +18,7 @@ from dvc.repo.plot.data import (
from dvc.repo.plot.template import (
TemplateNotFoundError,
NoDataForTemplateError,
NoFieldInDataError,
)
from dvc.repo.plot import NoDataOrTemplateProvided
@@ -502,3 +503,15 @@ def test_plot_yaml(tmp_dir, scm, dvc):
{"val": 2, PlotData.INDEX_FIELD: 0, "rev": "workspace"},
{"val": 3, PlotData.INDEX_FIELD: 1, "rev": "workspace"},
]
def test_raise_on_wrong_field(tmp_dir, scm, dvc):
metric = [{"val": 2}, {"val": 3}]
_write_json(tmp_dir, metric, "metric.json")
_run_with_metric(tmp_dir, "metric.json", "first run")
with pytest.raises(NoFieldInDataError):
dvc.plot("metric.json", x_field="no_val")
with pytest.raises(NoFieldInDataError):
dvc.plot("metric.json", y_field="no_val")