Index: telemetry/telemetry/internal/results/csv_output_formatter.py |
diff --git a/telemetry/telemetry/internal/results/csv_output_formatter.py b/telemetry/telemetry/internal/results/csv_output_formatter.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d9dc885e86c13c5aa17a8df3546cfd0da041c21a |
--- /dev/null |
+++ b/telemetry/telemetry/internal/results/csv_output_formatter.py |
@@ -0,0 +1,56 @@ |
+# Copyright 2017 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+import collections |
+import csv |
+import json |
+import os |
+import tempfile |
+ |
+from telemetry.internal.results import output_formatter |
+from tracing.value import histograms_to_csv |
+ |
+ |
+def _ReadCsv(text): |
+ dicts = [] |
+ header = None |
+ for row in csv.reader(text.split('\n')): |
+ if header is None: |
+ header = row |
+ elif row: |
+ dicts.append(collections.OrderedDict(zip(header, row))) |
+ return dicts |
+ |
+ |
+def _WriteCsv(dicts, fileobj): |
+ header = [] |
+ for d in dicts: |
+ for k in d.iterkeys(): |
+ if k not in header: |
+ header.append(k) |
+ rows = [header] |
+ for d in dicts: |
+ rows.append([d.get(k, '') for k in header]) |
+ csv.writer(fileobj).writerows(rows) |
+ |
+ |
+class CsvOutputFormatter(output_formatter.OutputFormatter): |
+ def __init__(self, output_stream, reset_results=False): |
+ super(CsvOutputFormatter, self).__init__(output_stream) |
+ self._reset_results = reset_results |
+ |
+ def Format(self, page_test_results): |
+ histograms = page_test_results.AsHistogramDicts() |
+ file_descriptor, json_path = tempfile.mkstemp() |
+ os.close(file_descriptor) |
+ json.dump(histograms, file(json_path, 'w')) |
+ vinn_result = histograms_to_csv.HistogramsToCsv(json_path) |
+ dicts = _ReadCsv(vinn_result.stdout) |
+ |
+ self._output_stream.seek(0) |
+ if not self._reset_results: |
+ dicts += _ReadCsv(self._output_stream.read()) |
+ self._output_stream.seek(0) |
+ _WriteCsv(dicts, self._output_stream) |
+ self._output_stream.truncate() |