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 item = filter_func(item1) 89 result_api.append(item) 90 91 92def get_parm(item, parm): 93 if item["parm"]: 94 for i in range(len(item["parm"])): 95 if item["parm"][i]["kind"] != 'PARM_DECL': 96 continue 97 else: 98 str_parm = '{} {}'.format(item["parm"][i]["type"], item["parm"][i]["name"]) 99 parm.append(str_parm) 100 item["parm"] = parm 101 102 103def filter_func(item): 104 del item["is_extern"] # 剔除is_extern键值对,过滤后都是extern 105 del item["comment"] 106 if "type_ref" in list(item.keys()): 107 del item["type_ref"] 108 if "children" in list(item.keys()): 109 del item["children"] 110 111 item["location_path"] = item["location"]["location_path"] 112 item["location"] = item["location"]["location_line"] 113 if item["kind"] == 'FUNCTION_DECL': 114 item["kind"] = '函数类型' 115 parm = [] # 装函数参数 116 if "parm" in item: 117 get_parm(item, parm) 118 else: 119 item["kind"] = '变量类型' 120 del item["is_const"] 121 return item 122 123 124def collated_api_data(api_data: list): 125 collated_data_total = [] 126 for api in api_data: 127 api_content = '' 128 if 'node_content' in api and 'content' in api['node_content']: 129 api_content = api['node_content']['content'] 130 api_content = api_content.replace(' ', '') 131 collated_data = [ 132 api.get('module_name'), 133 api.get('class_name'), 134 api.get('name'), 135 api_content, 136 api.get('kind'), 137 api.get('since'), 138 api.get('deprecate_since'), 139 api.get('syscap'), 140 api.get('error_num'), 141 api.get('is_system_api'), 142 api.get('model_constraint'), 143 api.get('permission'), 144 api.get('cross_platform'), 145 api.get('form'), 146 api.get('atomic_service'), 147 api.get('decorator'), 148 api.get('kit_name'), 149 api.get('location_path'), 150 api.get('sub_system'), 151 api.get('unique_id'), 152 api.get('open_close_api'), 153 api.get('is_third_party_api') 154 ] 155 collated_data_total.append(collated_data) 156 return collated_data_total 157 158 159def generate_excel(array, name, generate_json_unique, original_json_unique): 160 first_line_infor = ['模块名', '类名', '方法名', '函数', '类型', '起始版本', 161 '废弃版本', 'syscap', '错误码', '是否为系统API', '模型限制', 162 '权限', '是否支持跨平台', '是否支持卡片应用', '是否支持高阶API', 163 '装饰器', 'kit', '文件路径', '子系统', '接口全路径', '开源/闭源API', '是否是三方库API'] 164 workbook = openpyxl.Workbook() 165 work_sheet1 = workbook.active 166 work_sheet1.title = '对比结果' 167 work_sheet1.append(first_line_infor) 168 array_update = collated_api_data(array) 169 write_information_to_worksheet(work_sheet1, array_update) 170 171 work_sheet2 = workbook.create_sheet('生成json独有') 172 work_sheet2.append(first_line_infor) 173 generate_json_unique_update = collated_api_data(generate_json_unique) 174 write_information_to_worksheet(work_sheet2, generate_json_unique_update) 175 176 work_sheet3 = workbook.create_sheet('原有json独有') 177 write_original_infor_to_worksheet(work_sheet3, original_json_unique) 178 workbook.save(name) 179 180 181def write_information_to_worksheet(work_sheet, information_data): 182 for data in information_data: 183 write_data = data[0], data[1], data[2], data[3], data[4], \ 184 data[5], data[6], data[7], data[8], data[9], \ 185 data[10], data[11], data[12], data[13], data[14], \ 186 data[15], data[16], data[17], data[18], data[19], data[20], data[21] 187 work_sheet.append(write_data) 188 189 190def write_original_infor_to_worksheet(work_sheet, original_data): 191 first_line_infor = ['first_introduced', '名称'] 192 work_sheet.append(first_line_infor) 193 collated_original_total = [] 194 for element in original_data: 195 original_list = [] 196 if 'first_introduced' in element: 197 original_list.append(element['first_introduced']) 198 else: 199 original_list.append('') 200 if 'name' in element: 201 original_list.append(element['name']) 202 else: 203 original_list.append('') 204 collated_original_total.append(original_list) 205 206 for collated_element in collated_original_total: 207 write_data = collated_element[0], collated_element[1] 208 work_sheet.append(write_data) 209 210 211def del_repetition_value(generate_data_only_list, compare_list): 212 data = [] 213 for item in generate_data_only_list: 214 if item not in compare_list: 215 data.append(item) 216 return data 217 218 219def get_json_file(generate_json_file, original_json_file): # 获取生成的json文件 220 generate_json_file_path = r'{}'.format(generate_json_file) # 获取要对比的json文件 221 head_name = os.path.splitext(generate_json_file_path) # 去掉文件名后缀 222 head_name = head_name[0] + '.xlsx' # 加后缀 223 compare_result_list = [] 224 generate_data_only = [] 225 original_data_only = [] 226 for item in original_json_file: # 对比每一个json(目录下的) 227 # 对比两个json文件 228 result_list_part, generate_data, original_data = compare_json_file(generate_json_file_path, item) 229 compare_result_list.extend(result_list_part) 230 generate_data_only.extend(generate_data) 231 original_data_only.extend(original_data) 232 generate_data_only_new = del_repetition_value(generate_data_only, compare_result_list) 233 return compare_result_list, head_name, generate_data_only_new, original_data_only # 返回对比数据,和所需表格名 234 235 236def get_parser_json_data(generate_json_file_path, parser_data): 237 generate_json_file_path = r'{}'.format(generate_json_file_path) # 获取要对比的json文件 238 head_name = os.path.splitext(generate_json_file_path) # 去掉文件名后缀 239 head_name = head_name[0] + '.xlsx' # 加后缀 240 compare_result_list = [] 241 generate_data_only = filter_compare(parser_data) 242 original_data_only = [] 243 return compare_result_list, head_name, generate_data_only, original_data_only # 返回对比数据,和所需表格名 244 245 246def get_api_data(parser_data, excel_file_name): 247 generate_json_unique = [] 248 original_json_unique = [] 249 api_data_list = filter_compare(parser_data) 250 generate_excel(api_data_list, excel_file_name, generate_json_unique, original_json_unique) 251