代码测试
This commit is contained in:
174
app.py
174
app.py
@@ -3,6 +3,7 @@
|
||||
|
||||
import os
|
||||
import logging
|
||||
import traceback
|
||||
from typing import Dict, Tuple, Any
|
||||
import json
|
||||
|
||||
@@ -298,6 +299,7 @@ def handle_pull_request(payload: Dict[str, Any]) -> Tuple[Dict, int]:
|
||||
logger.info(f'PR #{pr_number} 扫描完成')
|
||||
|
||||
except Exception as e:
|
||||
traceback.print_exc()
|
||||
logger.error(f'扫描 PR #{pr_number} 失败: {str(e)}')
|
||||
return jsonify({'error': str(e)}), 500
|
||||
|
||||
@@ -667,6 +669,178 @@ def api_get_pr_file_content(pr_id):
|
||||
return jsonify({'error': str(e)}), 500
|
||||
|
||||
|
||||
@app.route('/api/prs/<int:pr_id>/quality')
|
||||
def api_get_quality_score(pr_id):
|
||||
"""获取 PR 的代码质量评分"""
|
||||
try:
|
||||
pr = PRScanDB.get_pr_by_id(pr_id)
|
||||
if not pr:
|
||||
return jsonify({'error': 'PR not found'}), 404
|
||||
|
||||
# 从 scan_result 中获取质量评分
|
||||
scan_result = pr.get('scan_result')
|
||||
if isinstance(scan_result, str):
|
||||
try:
|
||||
scan_result = json.loads(scan_result)
|
||||
except:
|
||||
scan_result = None
|
||||
|
||||
quality_score = None
|
||||
if scan_result and scan_result.get('ai'):
|
||||
quality_score = scan_result['ai'].get('quality_score')
|
||||
|
||||
if not quality_score:
|
||||
return jsonify({'error': '暂无质量评分'}), 404
|
||||
|
||||
return jsonify(quality_score)
|
||||
except Exception as e:
|
||||
logger.error(f'获取质量评分失败: {str(e)}')
|
||||
return jsonify({'error': str(e)}), 500
|
||||
|
||||
|
||||
@app.route('/api/prs/<int:pr_id>/stats')
|
||||
def api_get_issue_stats(pr_id):
|
||||
"""获取 PR 的问题统计"""
|
||||
try:
|
||||
pr = PRScanDB.get_pr_by_id(pr_id)
|
||||
if not pr:
|
||||
return jsonify({'error': 'PR not found'}), 404
|
||||
|
||||
# 获取 scan_details_with_code
|
||||
scan_details = pr.get('scan_details_with_code')
|
||||
if isinstance(scan_details, str):
|
||||
try:
|
||||
scan_details = json.loads(scan_details)
|
||||
except:
|
||||
scan_details = None
|
||||
|
||||
if not scan_details:
|
||||
return jsonify({'error': '暂无扫描详情'}), 404
|
||||
|
||||
# 统计各扫描器的问题
|
||||
stats = {
|
||||
'by_severity': {'error': 0, 'warning': 0, 'info': 0},
|
||||
'by_scanner': {},
|
||||
'total': 0
|
||||
}
|
||||
|
||||
# 统计静态扫描器
|
||||
for scanner in scan_details.get('scanners', []):
|
||||
scanner_name = scanner.get('name', 'unknown')
|
||||
scanner_issues = scanner.get('issues', [])
|
||||
stats['by_scanner'][scanner_name] = len(scanner_issues)
|
||||
|
||||
for issue in scanner_issues:
|
||||
sev = (issue.get('severity') or 'info').lower()
|
||||
if sev in stats['by_severity']:
|
||||
stats['by_severity'][sev] += 1
|
||||
stats['total'] += 1
|
||||
|
||||
# 统计 AI 扫描器
|
||||
ai_data = scan_details.get('ai', {})
|
||||
if ai_data:
|
||||
ai_issues = ai_data.get('issues', [])
|
||||
stats['by_scanner']['AI'] = len(ai_issues)
|
||||
for issue in ai_issues:
|
||||
sev = (issue.get('severity') or 'info').lower()
|
||||
if sev in stats['by_severity']:
|
||||
stats['by_severity'][sev] += 1
|
||||
stats['total'] += 1
|
||||
|
||||
return jsonify(stats)
|
||||
except Exception as e:
|
||||
logger.error(f'获取问题统计失败: {str(e)}')
|
||||
return jsonify({'error': str(e)}), 500
|
||||
|
||||
|
||||
@app.route('/api/prs/<int:pr_id>/fix', methods=['POST'])
|
||||
def api_generate_fix(pr_id):
|
||||
"""生成问题修复建议"""
|
||||
try:
|
||||
data = request.get_json()
|
||||
if not data:
|
||||
return jsonify({'error': '请求体为空'}), 400
|
||||
|
||||
file_path = data.get('file')
|
||||
line = data.get('line', 1)
|
||||
message = data.get('message', '')
|
||||
code = data.get('code', '')
|
||||
|
||||
if not file_path or not message:
|
||||
return jsonify({'error': '缺少必要参数'}), 400
|
||||
|
||||
# 调用 AI 生成修复建议
|
||||
fix_result = ai_reviewer.generate_fix_suggestion(file_path, line, message, code)
|
||||
|
||||
if fix_result:
|
||||
return jsonify(fix_result)
|
||||
else:
|
||||
return jsonify({'error': '生成修复建议失败'}), 500
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f'生成修复建议失败: {str(e)}')
|
||||
return jsonify({'error': str(e)}), 500
|
||||
|
||||
|
||||
@app.route('/api/prs/history')
|
||||
def api_get_pr_history():
|
||||
"""获取 PR 扫描历史趋势"""
|
||||
try:
|
||||
limit = request.args.get('limit', 20, type=int)
|
||||
repo_name = request.args.get('repo_name', '')
|
||||
|
||||
# 获取 PR 列表
|
||||
prs = PRScanDB.get_all_prs(status='completed')
|
||||
if repo_name:
|
||||
prs = [p for p in prs if p.get('repo_name') == repo_name]
|
||||
|
||||
# 只取最近的 N 个
|
||||
prs = prs[:limit]
|
||||
|
||||
# 构建趋势数据
|
||||
history = []
|
||||
for pr in reversed(prs): # 从旧到新
|
||||
issues_count = pr.get('issues_count', 0)
|
||||
|
||||
# 从 scan_result 中各扫描器汇总 error/warning 数量
|
||||
scan_result = pr.get('scan_result')
|
||||
if isinstance(scan_result, str):
|
||||
try:
|
||||
scan_result = json.loads(scan_result)
|
||||
except:
|
||||
scan_result = None
|
||||
|
||||
error_count = 0
|
||||
warning_count = 0
|
||||
if scan_result and isinstance(scan_result, dict):
|
||||
# 遍历各扫描器,汇总 error 和 warning
|
||||
for scanner_name, scanner_result in scan_result.items():
|
||||
if isinstance(scanner_result, dict):
|
||||
summary = scanner_result.get('summary', {})
|
||||
if isinstance(summary, dict):
|
||||
error_count += summary.get('error', 0)
|
||||
warning_count += summary.get('warning', 0)
|
||||
|
||||
history.append({
|
||||
'pr_id': pr.get('id'),
|
||||
'pr_number': pr.get('pr_number'),
|
||||
'repo_name': pr.get('repo_name'),
|
||||
'title': pr.get('pr_title', ''),
|
||||
'author': pr.get('author', ''),
|
||||
'created_at': pr.get('created_at', ''),
|
||||
'issues_count': issues_count,
|
||||
'error_count': error_count,
|
||||
'warning_count': warning_count,
|
||||
'total_issues': error_count + warning_count,
|
||||
'state': pr.get('state', '')
|
||||
})
|
||||
|
||||
return jsonify(history)
|
||||
except Exception as e:
|
||||
logger.error(f'获取历史趋势失败: {str(e)}')
|
||||
return jsonify({'error': str(e)}), 500
|
||||
|
||||
|
||||
@app.route('/api/prs/<int:pr_id>/merge', methods=['POST'])
|
||||
def api_merge_pr(pr_id):
|
||||
"""合并 PR"""
|
||||
|
||||
Reference in New Issue
Block a user