import codecs import hashlib import json import lyrebird from flask import request from lyrebird_api_coverage.client.load_base import DEFAULT_BASE from lyrebird_api_coverage.client.context import app_context from lyrebird_api_coverage.client.merge_algorithm import mergeAlgorithm from lyrebird_api_coverage.handlers.base_source_handler import DEFAULT_BASE, BaseDataHandler from lyrebird import context """ ImportHandler base导入处理器 result导入处理器 """ class ImportHandler: def import_base_handler(self): json_file = request.files.get('json-import') mimetype = json_file.content_type # 判断是不是json格式的文件 if mimetype == 'application/json': # 读取文件流,注意文件流只能read一次 bytes_obj = json_file.read() try: check_result = BaseDataHandler().check_base(json.loads(bytes_obj)) if check_result: return check_result self.write_wb(DEFAULT_BASE, bytes_obj) # 读取json文件 json_obj = json.loads(codecs.open(DEFAULT_BASE, 'r', 'utf-8').read()) # 获取文件的sha1 app_context.base_sha1 = self.get_sha1(bytes_obj) # 初次处理,切换后的result mergeAlgorithm.first_result_handler(json_obj) mergeAlgorithm.coverage_arithmetic(json_obj) resp = context.make_ok_response() lyrebird.publish('api_coverage', 'operation', name='import_base') except Exception as e: resp = context.make_fail_response('导入文件内容格式有误:' + str(e)) lyrebird.publish('api_coverage', 'error', name='import_base') else: resp = context.make_fail_response("Error.The selected non - JSON file.") lyrebird.publish('api_coverage', 'error', name='import_base') return resp def import_result_handler(self): json_file = request.files.get('json-import') mimetype = json_file.content_type # 读取文件流,注意文件流只能read一次 bytes_obj = json_file.read() try: result_obj = json.loads(bytes_obj) # 获取import文件的sha1 import_sha1 = result_obj.get('base_sha1') if app_context.base_sha1 == import_sha1: # merge import result and cache result # check_result_schema(result_obj) app_context.coverage = json.loads(bytes_obj).get('coverage') mergeAlgorithm.merge_resume(result_obj.get('test_data')) # 放入缓存 # app_context.merge_list = json.loads(bytes_obj).get('test_data') # app_context.coverage = json.loads(bytes_obj).get('coverage') resp = context.make_ok_response() lyrebird.publish('api_coverage', 'operation', name='import_result') else: resp = context.make_fail_response('导入的测试结果和之前选择base不匹配') lyrebird.publish('api_coverage', 'error', name='import_result') except Exception as e: resp = context.make_fail_response('导入文件内容格式有误:' + str(e)) lyrebird.publish('api_coverage', 'error', name='import_result') return resp def write_wb(self, path, obj): f = codecs.open(path, 'wb') f.write(obj) f.close() def get_sha1(self, obj): sha1obj = hashlib.sha1() sha1obj.update(obj) hash_sha1 = sha1obj.hexdigest() return hash_sha1