1 # Copyright 2013 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
7 from telemetry import value as value_module
8 from telemetry.value import none_values
12 return float(sum(values)) / len(values) if len(values) > 0 else 0.0
15 class ListOfScalarValues(value_module.Value):
16 def __init__(self, page, name, units, values,
17 important=True, description=None, none_value_reason=None,
18 same_page_merge_policy=value_module.CONCATENATE):
19 super(ListOfScalarValues, self).__init__(page, name, units, important,
21 if values is not None:
22 assert isinstance(values, list)
23 assert len(values) > 0
24 assert all(isinstance(v, numbers.Number) for v in values)
25 none_values.ValidateNoneValueReason(values, none_value_reason)
27 self.none_value_reason = none_value_reason
28 self.same_page_merge_policy = same_page_merge_policy
32 page_name = self.page.url
35 if self.same_page_merge_policy == value_module.CONCATENATE:
36 merge_policy = 'CONCATENATE'
38 merge_policy = 'PICK_FIRST'
39 return ('ListOfScalarValues(%s, %s, %s, %s, '
40 'important=%s, description=%s, same_page_merge_policy=%s)') % (
49 def GetBuildbotDataType(self, output_context):
50 if self._IsImportantGivenOutputIntent(output_context):
54 def GetBuildbotValue(self):
57 def GetRepresentativeNumber(self):
58 return _Mean(self.values)
60 def GetRepresentativeString(self):
61 return repr(self.values)
63 def IsMergableWith(self, that):
64 return (super(ListOfScalarValues, self).IsMergableWith(that) and
65 self.same_page_merge_policy == that.same_page_merge_policy)
68 def GetJSONTypeName():
69 return 'list_of_scalar_values'
72 d = super(ListOfScalarValues, self).AsDict()
73 d['values'] = self.values
75 if self.none_value_reason is not None:
76 d['none_value_reason'] = self.none_value_reason
81 def FromDict(value_dict, page_dict):
82 kwargs = value_module.Value.GetConstructorKwArgs(value_dict, page_dict)
83 kwargs['values'] = value_dict['values']
85 if 'none_value_reason' in value_dict:
86 kwargs['none_value_reason'] = value_dict['none_value_reason']
88 return ListOfScalarValues(**kwargs)
91 def MergeLikeValuesFromSamePage(cls, values):
92 assert len(values) > 0
95 if v0.same_page_merge_policy == value_module.PICK_FIRST:
96 return ListOfScalarValues(
97 v0.page, v0.name, v0.units,
99 important=v0.important,
100 same_page_merge_policy=v0.same_page_merge_policy,
101 none_value_reason=v0.none_value_reason)
103 assert v0.same_page_merge_policy == value_module.CONCATENATE
104 return cls._MergeLikeValues(values, v0.page, v0.name)
107 def MergeLikeValuesFromDifferentPages(cls, values,
108 group_by_name_suffix=False):
109 assert len(values) > 0
111 name = v0.name_suffix if group_by_name_suffix else v0.name
112 return cls._MergeLikeValues(values, None, name)
115 def _MergeLikeValues(cls, values, page, name):
118 none_value_reason = None
122 none_value_reason = none_values.MERGE_FAILURE_REASON
124 merged_values.extend(v.values)
125 return ListOfScalarValues(
126 page, name, v0.units,
128 important=v0.important,
129 same_page_merge_policy=v0.same_page_merge_policy,
130 none_value_reason=none_value_reason)