• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python
2# coding=utf-8
3##############################################
4# Copyright (c) 2021-2022 Huawei Device Co., Ltd.
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9#     http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16##############################################
17
18import json
19import os
20import re
21import openpyxl
22from typedef.parser.parser import DifferApiRegular, DifferApiInfor
23
24
25def compare_json_file(generate_json, original_json):  # 获取对比结果
26    with open(generate_json, 'r', encoding='utf-8') as g_js:
27        generate_data_dict = json.load(g_js)
28    with open(original_json, 'r') as o_js:
29        original_data_dict = json.load(o_js)
30    compare_result = []
31    generate_data_only = []  # 装解析生成的json独有的数据
32    result_api = filter_compare(generate_data_dict)
33    for it in result_api:
34        result_name = it["name"]
35        key = 0
36        for item in original_data_dict:
37            if item["name"] == result_name:
38                key = 1
39                compare_result.append(it)
40                break
41        if key == 0:
42            generate_data_only.append(it)
43    original_data_only = get_difference_data(compare_result, original_data_dict)  # 获取提供的json独有的数据
44    g_js.close()
45    o_js.close()
46    return compare_result, generate_data_only, original_data_only
47
48
49def get_difference_data(compare_result, original_data):
50    original_data_only = []
51    for item in original_data:
52        original_name = item["name"]
53        key = 0
54        for it in compare_result:
55            compare_name = it["name"]
56            if original_name == compare_name:
57                key = 1
58                break
59        if key == 0:
60            original_data_only.append(item)
61    return original_data_only
62
63
64def filter_compare(analytic_data):  # 获取函数和变量
65    result_api = []
66    for it in analytic_data:
67        get_result_api(it, result_api)
68    return result_api
69
70
71def difference_api(api_data: dict):
72    api_name = api_data['name']
73    differ_infor = DifferApiInfor.THIRD_PARTY_API.value
74    closed_pattern = DifferApiRegular.CLOSED_SOURCE_API_REGULAR.value
75    open_pattern = DifferApiRegular.OPEN_SOURCE_API_REGULAR.value
76    if re.search(closed_pattern, api_name, flags=re.IGNORECASE):
77        differ_infor = DifferApiInfor.CLOSED_SOURCE_API.value
78    elif re.search(open_pattern, api_name, flags=re.IGNORECASE):
79        differ_infor = DifferApiInfor.OPEN_SOURCE_API.value
80
81    return differ_infor
82
83
84def get_result_api(file_data, result_api):
85    if 'children' in file_data:
86        for item1 in file_data["children"]:  # 抛开根节点
87            if (item1["kind"] == 'FUNCTION_DECL' or item1["kind"] == 'VAR_DECL') and item1["is_extern"]:
88                differ_infor = difference_api(item1)
89                item1['differ_infor'] = differ_infor
90                item = filter_func(item1)
91                result_api.append(item)
92
93
94def get_parm(item, parm):
95    if item["parm"]:
96        for i in range(len(item["parm"])):
97            if item["parm"][i]["kind"] != 'PARM_DECL':
98                continue
99            else:
100                str_parm = '{} {}'.format(item["parm"][i]["type"], item["parm"][i]["name"])
101                parm.append(str_parm)
102        item["parm"] = parm
103
104
105def filter_func(item):
106    del item["is_extern"]  # 剔除is_extern键值对,过滤后都是extern
107    del item["comment"]
108    if "type_ref" in list(item.keys()):
109        del item["type_ref"]
110    if "children" in list(item.keys()):
111        del item["children"]
112
113    item["location_path"] = item["location"]["location_path"]
114    item["location"] = item["location"]["location_line"]
115    if item["kind"] == 'FUNCTION_DECL':
116        item["kind"] = '函数类型'
117        parm = []  # 装函数参数
118        if "parm" in item:
119            get_parm(item, parm)
120    else:
121        item["kind"] = '变量类型'
122        del item["is_const"]
123    return item
124
125
126def collated_api_data(api_data: list):
127    collated_data_total = []
128    for api in api_data:
129        api_content = ''
130        if 'node_content' in api and 'content' in api['node_content']:
131            api_content = api['node_content']['content']
132            api_content = api_content.replace('   ', '')
133        collated_data = [
134            api.get('module_name'),
135            api.get('class_name'),
136            api.get('name'),
137            api_content,
138            api.get('kind'),
139            api.get('since'),
140            api.get('deprecate_since'),
141            api.get('syscap'),
142            api.get('error_num'),
143            api.get('is_system_api'),
144            api.get('model_constraint'),
145            api.get('permission'),
146            api.get('cross_platform'),
147            api.get('form'),
148            api.get('atomic_service'),
149            api.get('decorator'),
150            api.get('kit_name'),
151            api.get('location_path'),
152            api.get('sub_system'),
153            api.get('unique_id'),
154            api.get('differ_infor')
155        ]
156        collated_data_total.append(collated_data)
157    return collated_data_total
158
159
160def generate_excel(array, name, generate_json_unique, original_json_unique):
161    first_line_infor = ['模块名', '类名', '方法名', '函数', '类型', '起始版本',
162                        '废弃版本', 'syscap', '错误码', '是否为系统API', '模型限制',
163                        '权限', '是否支持跨平台', '是否支持卡片应用', '是否支持高阶API',
164                        '装饰器', 'kit', '文件路径', '子系统', '接口全路径', '开源/闭源/三方库API']
165    workbook = openpyxl.Workbook()
166    work_sheet1 = workbook.active
167    work_sheet1.title = '对比结果'
168    work_sheet1.append(first_line_infor)
169    array_update = collated_api_data(array)
170    write_information_to_worksheet(work_sheet1, array_update)
171
172    work_sheet2 = workbook.create_sheet('生成json独有')
173    work_sheet2.append(first_line_infor)
174    generate_json_unique_update = collated_api_data(generate_json_unique)
175    write_information_to_worksheet(work_sheet2, generate_json_unique_update)
176
177    work_sheet3 = workbook.create_sheet('原有json独有')
178    write_original_infor_to_worksheet(work_sheet3, original_json_unique)
179    workbook.save(name)
180
181
182def write_information_to_worksheet(work_sheet, information_data):
183    for data in information_data:
184        write_data = data[0], data[1], data[2], data[3], data[4], \
185                     data[5], data[6], data[7], data[8], data[9], \
186                     data[10], data[11], data[12], data[13], data[14], \
187                     data[15], data[16], data[17], data[18], data[19], data[20]
188        work_sheet.append(write_data)
189
190
191def write_original_infor_to_worksheet(work_sheet, original_data):
192    first_line_infor = ['first_introduced', '名称']
193    work_sheet.append(first_line_infor)
194    collated_original_total = []
195    for element in original_data:
196        original_list = []
197        if 'first_introduced' in element:
198            original_list.append(element['first_introduced'])
199        else:
200            original_list.append('')
201        if 'name' in element:
202            original_list.append(element['name'])
203        else:
204            original_list.append('')
205        collated_original_total.append(original_list)
206
207    for collated_element in collated_original_total:
208        write_data = collated_element[0], collated_element[1]
209        work_sheet.append(write_data)
210
211
212def del_repetition_value(generate_data_only_list, compare_list):
213    data = []
214    for item in generate_data_only_list:
215        if item not in compare_list:
216            data.append(item)
217    return data
218
219
220def get_json_file(generate_json_file, original_json_file):  # 获取生成的json文件
221    generate_json_file_path = r'{}'.format(generate_json_file)  # 获取要对比的json文件
222    head_name = os.path.splitext(generate_json_file_path)  # 去掉文件名后缀
223    head_name = head_name[0] + '.xlsx'  # 加后缀
224    compare_result_list = []
225    generate_data_only = []
226    original_data_only = []
227    for item in original_json_file:  # 对比每一个json(目录下的)
228        # 对比两个json文件
229        result_list_part, generate_data, original_data = compare_json_file(generate_json_file_path, item)
230        compare_result_list.extend(result_list_part)
231        generate_data_only.extend(generate_data)
232        original_data_only.extend(original_data)
233    generate_data_only_new = del_repetition_value(generate_data_only, compare_result_list)
234    return compare_result_list, head_name, generate_data_only_new, original_data_only  # 返回对比数据,和所需表格名
235
236
237def get_parser_json_data(generate_json_file_path, parser_data):
238    generate_json_file_path = r'{}'.format(generate_json_file_path)  # 获取要对比的json文件
239    head_name = os.path.splitext(generate_json_file_path)  # 去掉文件名后缀
240    head_name = head_name[0] + '.xlsx'  # 加后缀
241    compare_result_list = []
242    generate_data_only = filter_compare(parser_data)
243    original_data_only = []
244    return compare_result_list, head_name, generate_data_only, original_data_only  # 返回对比数据,和所需表格名
245
246
247def get_api_data(parser_data, excel_file_name):
248    generate_json_unique = []
249    original_json_unique = []
250    api_data_list = filter_compare(parser_data)
251    generate_excel(api_data_list, excel_file_name, generate_json_unique, original_json_unique)
252