1 # Copyright 2014 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.
6 from telemetry.results import page_measurement_results
7 from telemetry.value import merge_values
10 class CsvPageMeasurementResults(
11 page_measurement_results.PageMeasurementResults):
12 def __init__(self, output_stream, output_after_every_page=None):
13 super(CsvPageMeasurementResults, self).__init__(output_stream)
14 self._results_writer = csv.writer(self._output_stream)
15 self._did_output_header = False
16 self._header_names_written_to_writer = None
17 self._output_after_every_page = output_after_every_page
19 def DidMeasurePage(self):
21 assert self.page_specific_values_for_current_page != None
23 values = self.page_specific_values_for_current_page
24 if not values or not self._output_after_every_page:
25 # Do not output if no results were added on this page or if output flag
29 if not self._did_output_header:
32 self._ValidateOutputNamesForCurrentPage()
33 self._OutputValuesForPage(values[0].page, values)
35 super(CsvPageMeasurementResults, self).DidMeasurePage()
37 def PrintSummary(self):
39 if self._output_after_every_page:
43 values = merge_values.MergeLikeValuesFromSamePage(
44 self.all_page_specific_values)
45 value_groups_by_page = merge_values.GroupStably(
46 values, lambda value: value.page.url)
47 for values_for_page in value_groups_by_page:
48 self._OutputValuesForPage(values_for_page[0].page, values_for_page)
50 super(CsvPageMeasurementResults, self).PrintSummary()
52 def _ValidateOutputNamesForCurrentPage(self):
53 assert self._did_output_header
54 current_page_value_names = set([
55 value.name for value in self.page_specific_values_for_current_page])
56 header_names_written_to_writer = set(self._header_names_written_to_writer)
57 assert header_names_written_to_writer >= current_page_value_names, \
58 """To use CsvPageMeasurementResults, you must add the same
59 result names for every page. In this case, the following extra results were
62 """ % (current_page_value_names - header_names_written_to_writer)
64 def _OutputHeader(self):
65 assert not self._did_output_header
66 all_value_names = list(
67 self.all_value_names_that_have_been_seen)
68 all_value_names.sort()
69 self._did_output_header = True
70 self._header_names_written_to_writer = list(all_value_names)
73 for value_name in all_value_names:
74 units = self.GetUnitsForValueName(value_name)
75 row.append('%s (%s)' % (value_name, units))
76 self._results_writer.writerow(row)
77 self._output_stream.flush()
79 def _OutputValuesForPage(self, page, page_values):
80 row = [page.display_name]
81 values_by_value_name = {}
82 for value in page_values:
83 values_by_value_name[value.name] = value
85 for value_name in self._header_names_written_to_writer:
86 value = values_by_value_name.get(value_name, None)
87 if value and value.GetRepresentativeNumber():
88 row.append('%s' % value.GetRepresentativeNumber())
91 self._results_writer.writerow(row)
92 self._output_stream.flush()