| Index: tools/telemetry/telemetry/value/scalar.py
|
| diff --git a/tools/telemetry/telemetry/value/scalar.py b/tools/telemetry/telemetry/value/scalar.py
|
| index 35884a08ee00e8d14044ff8ff24cf7b2735168a4..95522fb036ca6a50d879e4106a0b5fa8b35b323e 100644
|
| --- a/tools/telemetry/telemetry/value/scalar.py
|
| +++ b/tools/telemetry/telemetry/value/scalar.py
|
| @@ -6,11 +6,12 @@ import numbers
|
|
|
| from telemetry import value as value_module
|
| from telemetry.value import list_of_scalar_values
|
| +from telemetry.value import none_values
|
|
|
|
|
| class ScalarValue(value_module.Value):
|
| def __init__(self, page, name, units, value, important=True,
|
| - description=None):
|
| + description=None, none_value_reason=None):
|
| """A single value (float or integer) result from a test.
|
|
|
| A test that counts the number of DOM elements in a page might produce a
|
| @@ -18,8 +19,10 @@ class ScalarValue(value_module.Value):
|
| ScalarValue(page, 'num_dom_elements', 'count', num_elements)
|
| """
|
| super(ScalarValue, self).__init__(page, name, units, important, description)
|
| - assert isinstance(value, numbers.Number)
|
| + assert value is None or isinstance(value, numbers.Number)
|
| + none_values.ValidateValue(value, none_value_reason)
|
| self.value = value
|
| + self.none_value_reason = none_value_reason
|
|
|
| def __repr__(self):
|
| if self.page:
|
| @@ -57,6 +60,10 @@ class ScalarValue(value_module.Value):
|
| def AsDict(self):
|
| d = super(ScalarValue, self).AsDict()
|
| d['value'] = self.value
|
| +
|
| + if self.none_value_reason is not None:
|
| + d['none_value_reason'] = self.none_value_reason
|
| +
|
| return d
|
|
|
| @staticmethod
|
| @@ -64,27 +71,33 @@ class ScalarValue(value_module.Value):
|
| kwargs = value_module.Value.GetConstructorKwArgs(value_dict, page_dict)
|
| kwargs['value'] = value_dict['value']
|
|
|
| + if 'none_value_reason' in value_dict:
|
| + kwargs['none_value_reason'] = value_dict['none_value_reason']
|
| +
|
| return ScalarValue(**kwargs)
|
|
|
| @classmethod
|
| def MergeLikeValuesFromSamePage(cls, values):
|
| assert len(values) > 0
|
| v0 = values[0]
|
| - return list_of_scalar_values.ListOfScalarValues(
|
| - v0.page, v0.name, v0.units,
|
| - [v.value for v in values],
|
| - important=v0.important)
|
| + return cls._MergeLikeValues(values, v0.page, v0.name)
|
|
|
| @classmethod
|
| def MergeLikeValuesFromDifferentPages(cls, values,
|
| group_by_name_suffix=False):
|
| assert len(values) > 0
|
| v0 = values[0]
|
| - if not group_by_name_suffix:
|
| - name = v0.name
|
| - else:
|
| - name = v0.name_suffix
|
| + name = v0.name_suffix if group_by_name_suffix else v0.name
|
| + return cls._MergeLikeValues(values, None, name)
|
| +
|
| + @classmethod
|
| + def _MergeLikeValues(cls, values, page, name):
|
| + v0 = values[0]
|
| + merged_value = [v.value for v in values]
|
| + none_value_reason = None
|
| + if None in merged_value:
|
| + merged_value = None
|
| + none_value_reason = none_values.MERGE_FAILURE_REASON
|
| return list_of_scalar_values.ListOfScalarValues(
|
| - None, name, v0.units,
|
| - [v.value for v in values],
|
| - important=v0.important)
|
| + page, name, v0.units, merged_value, important=v0.important,
|
| + none_value_reason=none_value_reason)
|
|
|