• 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                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