1# Copyright (c) 2012 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. 4 5"""A module for manipulating trend graph with analyzer result history.""" 6 7import os 8 9import layouttest_analyzer_helpers 10 11DEFAULT_TREND_GRAPH_PATH = os.path.join('graph', 'graph.html') 12 13# The following is necesasry to decide the point to insert. 14LINE_INSERT_POINT_FOR_NUMBERS = r'// insert 1' 15LINE_INSERT_POINT_FOR_PASSING_RATE = r'// insert 2' 16 17 18class TrendGraph(object): 19 """A class to manage trend graph which is using Google Visualization APIs. 20 21 Google Visualization API (http://code.google.com/apis/chart/interactive/docs/ 22 gallery/annotatedtimeline.html) is used to present the historical analyzer 23 result. Currently, data is directly written to JavaScript file using file 24 in-place replacement for simplicity. 25 26 TODO(imasaki): use GoogleSpreadsheet to store the analyzer result. 27 """ 28 29 def __init__(self, location=DEFAULT_TREND_GRAPH_PATH): 30 """Initialize this object with the location of trend graph.""" 31 self._location = location 32 33 def Update(self, datetime_string, data_map): 34 """Update trend graphs using |datetime_string| and |data_map|. 35 36 There are two kinds of graphs to be updated (one is for numbers and the 37 other is for passing rates). 38 39 Args: 40 datetime_string: a datetime string delimited by ',' 41 (e.g., '2008,1,1,13,45,00)'. For example, in the case of the year 42 2008, this ranges from '2008,1,1,0,0,00' to '2008,12,31,23,59,99'. 43 data_map: a dictionary containing 'whole', 'skip' , 'nonskip', 44 'passingrate' as its keys and (number, tile, text) string tuples 45 as values for graph annotation. 46 """ 47 joined_str = '' 48 # For a date format in GViz, month is shifted (e.g., '2008,2,1' means 49 # March 1, 2008). So, the input parameter |datetime_string| (before this 50 # conversion) must be shifted in order to show the date properly on GViz. 51 # After the below conversion, for example, in the case of the year 2008, 52 # |datetime_string| ranges from '2008,0,1,0,0,00' to '2008,11,31,23,59,99'. 53 str_list = datetime_string.split(',') 54 str_list[1] = str(int(str_list[1])-1) # Month 55 datetime_string = ','.join(str_list) 56 for key in ['whole', 'skip', 'nonskip']: 57 joined_str += str(len(data_map[key][0])) + ',' 58 joined_str += ','.join(data_map[key][1:]) + ',' 59 new_line_for_numbers = ' [new Date(%s),%s],\n' % (datetime_string, 60 joined_str) 61 new_line_for_numbers += ' %s\n' % ( 62 LINE_INSERT_POINT_FOR_NUMBERS) 63 layouttest_analyzer_helpers.ReplaceLineInFile( 64 self._location, LINE_INSERT_POINT_FOR_NUMBERS, 65 new_line_for_numbers) 66 67 joined_str = '%s,%s,%s' % ( 68 str(data_map['passingrate'][0]), data_map['nonskip'][1], 69 data_map['nonskip'][2]) 70 new_line_for_passingrate = ' [new Date(%s),%s],\n' % ( 71 datetime_string, joined_str) 72 new_line_for_passingrate += ' %s\n' % ( 73 LINE_INSERT_POINT_FOR_PASSING_RATE) 74 layouttest_analyzer_helpers.ReplaceLineInFile( 75 self._location, LINE_INSERT_POINT_FOR_PASSING_RATE, 76 new_line_for_passingrate) 77