convertor.py
5.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#!/usr/bin/python
#-*- coding: UTF-8 -*-
# ----------------------------------------------------------------------------
# Convert the performance test result from json files to excel.
#
# Author: Bill Zhang
#
# License: MIT
# ----------------------------------------------------------------------------
'''
Convert the performance test result from json files to excel.
'''
import xlwt
import os
import json
from argparse import ArgumentParser
DEFAULT_STYLE = 'borders: left thin, right thin, top thin, bottom thin;'
CONDITION_STYLE = 'pattern: pattern solid, fore_color light_green;'
RESULT_STYLE = 'pattern: pattern solid, fore_color light_yellow;'
BASE_KEYS = [
    'osVersion',
    'fileVersion',
    'timeStamp',
    'engineVersion',
    'device'
]
KEY_CONDITION_HEADERS = "conditionHeaders"
KEY_RESULT_HEADERS    = "resultHeaders"
KEY_RESULTS           = "results"
START_COL_INDEX = 0
START_ROW_INDEX = 0
class KnownException(Exception):
    pass
class Convertor:
    def __init__(self, src_path, output_path=None):
        self.src_path = self.change_to_abspath(src_path)
        if not os.path.exists(self.src_path):
            raise KnownException('%s is not existed!' % self.src_path)
        if output_path is None:
            # not specified output path, default use source path
            if os.path.isfile(self.src_path):
                self.output_path = os.path.dirname(self.src_path)
            else:
                self.output_path = self.src_path
        else:
            self.output_path = self.change_to_abspath(output_path)
    def change_to_abspath(self, path):
        ret = os.path.expanduser(path)
        if not os.path.isabs(ret):
            ret = os.path.abspath(ret)
        ret = os.path.normpath(ret)
        return ret
    def get_col_width(self, col_str):
        return 256 * (len(col_str) + 1)
    def convert_file(self, file_path):
        f = open(file_path)
        testData = json.load(f)
        f.close()
        basename, ext = os.path.splitext(os.path.basename(file_path))
        dst_file_path = os.path.join(self.output_path, "%s.xls" % basename)
        if os.path.isfile(dst_file_path):
            os.remove(dst_file_path)
        workbook = xlwt.Workbook(encoding = 'ascii')
        default_style = xlwt.Style.easyxf(DEFAULT_STYLE)
        con_style = xlwt.Style.easyxf("%s%s" % (DEFAULT_STYLE, CONDITION_STYLE))
        ret_style = xlwt.Style.easyxf("%s%s" % (DEFAULT_STYLE, RESULT_STYLE))
        for key in testData.keys():
            if key in BASE_KEYS:
                continue
            # create a sheet for the test case
            sheetObj = workbook.add_sheet(key)
            # get test case data
            caseInfo = testData[key]
            # Add headers for the test case
            condHeaders = caseInfo[KEY_CONDITION_HEADERS]
            retHeaders = caseInfo[KEY_RESULT_HEADERS]
            curRow = START_ROW_INDEX
            curCol = START_COL_INDEX
            col_widths = {}
            for header in (condHeaders + retHeaders):
                sheetObj.write(curRow, curCol, header, default_style)
                col_width = self.get_col_width(header)
                col_widths[curCol] = col_width
                sheetObj.col(curCol).width = col_width
                curCol += 1
            rets = caseInfo[KEY_RESULTS]
            for retInfo in rets:
                curRow += 1
                curCol = START_COL_INDEX
                for ret in retInfo:
                    if (curCol - START_COL_INDEX) < len(condHeaders):
                        use_style = con_style
                    else:
                        use_style = ret_style
                    sheetObj.write(curRow, curCol, ret, use_style)
                    new_width = self.get_col_width(ret)
                    old_width = col_widths[curCol]
                    if new_width > old_width:
                        sheetObj.col(curCol).width = new_width
                        col_widths[curCol] = new_width
                    curCol += 1
        workbook.save(dst_file_path)
        print("%s is generated." % dst_file_path)
    def do_convert(self):
        if not os.path.exists(self.output_path):
            os.makedirs(self.output_path)
        if os.path.isfile(self.src_path):
            self.convert_file(self.src_path)
        else:
            for f in os.listdir(self.src_path):
                full_path = os.path.join(self.src_path, f)
                ignore, ext = os.path.splitext(f)
                if os.path.isfile(full_path) and ext == '.json':
                    self.convert_file(full_path)
if __name__ == '__main__':
    parser = ArgumentParser(description="Performance test data convertor.")
    parser.add_argument('-s', dest='src_path', required=True, help='Specify the json file path or the folder path of json files.')
    parser.add_argument('-o', dest='output_path', help='Specify the output path of excel files.')
    (args, unknown) = parser.parse_known_args()
    try:
        convertor = Convertor(args.src_path, args.output_path)
        convertor.do_convert()
    except Exception as e:
        if e.__class__.__name__ == "KnownException":
            print(' '.join(e.args))
        else:
            raise