Fix API compatibility and add user/role/permission and asset import/export
This commit is contained in:
176
backend_new/verify_phase7.py
Normal file
176
backend_new/verify_phase7.py
Normal file
@@ -0,0 +1,176 @@
|
||||
"""
|
||||
Phase 7 代码质量验证脚本
|
||||
"""
|
||||
import os
|
||||
import re
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def check_file_exists(filepath):
|
||||
"""检查文件是否存在"""
|
||||
if os.path.exists(filepath):
|
||||
print(f"[OK] {filepath}")
|
||||
return True
|
||||
else:
|
||||
print(f"[FAIL] {filepath} - 文件不存在")
|
||||
return False
|
||||
|
||||
|
||||
def check_file_syntax(filepath):
|
||||
"""检查文件语法"""
|
||||
try:
|
||||
with open(filepath, 'r', encoding='utf-8') as f:
|
||||
code = f.read()
|
||||
compile(code, filepath, 'exec')
|
||||
print(f"[OK] {filepath} - 语法检查通过")
|
||||
return True
|
||||
except Exception as e:
|
||||
print(f"[FAIL] {filepath} - 语法错误: {e}")
|
||||
return False
|
||||
|
||||
|
||||
def check_docstring(filepath):
|
||||
"""检查文件是否有docstring"""
|
||||
try:
|
||||
with open(filepath, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
|
||||
# 检查模块docstring
|
||||
has_module_docstring = '"""' in content[:500]
|
||||
|
||||
# 统计函数docstring
|
||||
function_pattern = r'def\s+\w+\([^)]*\):[^)]*"""'
|
||||
function_docstrings = len(re.findall(function_pattern, content))
|
||||
|
||||
# 统计类docstring
|
||||
class_pattern = r'class\s+\w+.*?:[^)]*"""'
|
||||
class_docstrings = len(re.findall(class_pattern, content))
|
||||
|
||||
print(f"[OK] {filepath} - 模块文档: {has_module_docstring}, 函数文档: {function_docstrings}, 类文档: {class_docstrings}")
|
||||
return True
|
||||
except Exception as e:
|
||||
print(f"[WARN] {filepath} - 无法检查文档: {e}")
|
||||
return False
|
||||
|
||||
|
||||
def check_type_hints(filepath):
|
||||
"""检查类型注解"""
|
||||
try:
|
||||
with open(filepath, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
|
||||
# 统计函数定义
|
||||
def_count = len(re.findall(r'def\s+\w+', content))
|
||||
|
||||
# 统计类型注解
|
||||
param_hints = len(re.findall(r'def\s+\w+\([^)]*:\s*\w+', content))
|
||||
return_hints = len(re.findall(r'->\s*\w+', content))
|
||||
|
||||
coverage = (param_hints + return_hints) / (2 * def_count) * 100 if def_count > 0 else 0
|
||||
|
||||
print(f"[OK] {filepath} - 类型注解覆盖率: {coverage:.1f}%")
|
||||
return True
|
||||
except Exception as e:
|
||||
print(f"[WARN] {filepath} - 无法检查类型注解: {e}")
|
||||
return False
|
||||
|
||||
|
||||
def main():
|
||||
"""主验证函数"""
|
||||
print("=" * 60)
|
||||
print("Phase 7 代码质量验证")
|
||||
print("=" * 60)
|
||||
|
||||
base_path = Path("C:/Users/Administrator/asset_management_backend")
|
||||
|
||||
# 需要检查的文件列表
|
||||
files_to_check = [
|
||||
# 模型层
|
||||
"app/models/system_config.py",
|
||||
"app/models/operation_log.py",
|
||||
"app/models/notification.py",
|
||||
|
||||
# Schema层
|
||||
"app/schemas/system_config.py",
|
||||
"app/schemas/operation_log.py",
|
||||
"app/schemas/notification.py",
|
||||
"app/schemas/statistics.py",
|
||||
|
||||
# CRUD层
|
||||
"app/crud/system_config.py",
|
||||
"app/crud/operation_log.py",
|
||||
"app/crud/notification.py",
|
||||
|
||||
# 服务层
|
||||
"app/services/system_config_service.py",
|
||||
"app/services/operation_log_service.py",
|
||||
"app/services/notification_service.py",
|
||||
"app/services/statistics_service.py",
|
||||
|
||||
# API层
|
||||
"app/api/v1/statistics.py",
|
||||
"app/api/v1/system_config.py",
|
||||
"app/api/v1/operation_logs.py",
|
||||
"app/api/v1/notifications.py",
|
||||
|
||||
# 中间件
|
||||
"app/middleware/operation_log.py",
|
||||
|
||||
# 工具
|
||||
"app/utils/redis_client.py",
|
||||
]
|
||||
|
||||
print("\n1. 检查文件是否存在")
|
||||
print("-" * 60)
|
||||
exist_results = []
|
||||
for filepath in files_to_check:
|
||||
full_path = base_path / filepath
|
||||
exist_results.append(check_file_exists(str(full_path)))
|
||||
|
||||
print("\n2. 检查文件语法")
|
||||
print("-" * 60)
|
||||
syntax_results = []
|
||||
for filepath in files_to_check:
|
||||
full_path = base_path / filepath
|
||||
if os.path.exists(str(full_path)):
|
||||
syntax_results.append(check_file_syntax(str(full_path)))
|
||||
|
||||
print("\n3. 检查文档注释")
|
||||
print("-" * 60)
|
||||
doc_results = []
|
||||
for filepath in files_to_check:
|
||||
full_path = base_path / filepath
|
||||
if os.path.exists(str(full_path)):
|
||||
doc_results.append(check_docstring(str(full_path)))
|
||||
|
||||
print("\n4. 检查类型注解")
|
||||
print("-" * 60)
|
||||
type_results = []
|
||||
for filepath in files_to_check:
|
||||
full_path = base_path / filepath
|
||||
if os.path.exists(str(full_path)):
|
||||
type_results.append(check_type_hints(str(full_path)))
|
||||
|
||||
# 统计结果
|
||||
print("\n" + "=" * 60)
|
||||
print("验证结果汇总")
|
||||
print("=" * 60)
|
||||
|
||||
total_files = len(files_to_check)
|
||||
existing_files = sum(exist_results)
|
||||
syntax_passed = sum(syntax_results)
|
||||
|
||||
print(f"总文件数: {total_files}")
|
||||
print(f"文件存在: {existing_files}/{total_files} ({existing_files/total_files*100:.1f}%)")
|
||||
print(f"语法检查: {syntax_passed}/{existing_files} ({syntax_passed/existing_files*100 if existing_files > 0 else 0:.1f}%)")
|
||||
|
||||
if existing_files == total_files and syntax_passed == existing_files:
|
||||
print("\n[SUCCESS] 所有检查通过!Phase 7 开发完成!")
|
||||
return 0
|
||||
else:
|
||||
print("\n[FAIL] 部分检查未通过,请查看详情")
|
||||
return 1
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
exit(main())
|
||||
Reference in New Issue
Block a user