Key features implemented: - Updated package metadata and dependencies in PKG-INFO, setup files - Added main.py entry point for backward compatibility with README launch method - Enhanced CLI with config options, system info command, and proper signal handling - Implemented minimal PluginManager loading only plugin-loader core plugin - Refactored PluginLoader to follow minimal core design, removed sandbox/isolation complexity - Updated auto-dependency plugin with safer PL injection mechanism and disabled pl_injection - Removed legacy plugin files (firewall, frp_proxy, ftp_server, multi_lang_deploy, ops_toolbox, security_gateway) as functionality moved to core plugin system - Improved gitignore with comprehensive ignore patterns The changes implement a minimal core framework design where only the plugin-loader is directly loaded by the core, with all other plugins managed through the PL injection mechanism, significantly simplifying the architecture.
101 lines
3.2 KiB
Python
101 lines
3.2 KiB
Python
"""质量检查器"""
|
|
import ast
|
|
|
|
|
|
class QualityChecker:
|
|
"""质量检查器"""
|
|
|
|
def check(self, filepath: str, content: str) -> list:
|
|
"""执行质量检查"""
|
|
issues = []
|
|
|
|
# 检查函数长度
|
|
issues.extend(self._check_function_length(filepath, content))
|
|
|
|
# 检查参数数量
|
|
issues.extend(self._check_parameter_count(filepath, content))
|
|
|
|
# 检查复杂度
|
|
issues.extend(self._check_complexity(filepath, content))
|
|
|
|
return issues
|
|
|
|
def _check_function_length(self, filepath: str, content: str) -> list:
|
|
"""检查函数长度"""
|
|
issues = []
|
|
|
|
try:
|
|
tree = ast.parse(content)
|
|
for node in ast.walk(tree):
|
|
if isinstance(node, ast.FunctionDef):
|
|
lines = node.end_lineno - node.lineno
|
|
if lines > 100:
|
|
issues.append({
|
|
"file": filepath,
|
|
"line": node.lineno,
|
|
"severity": "warning",
|
|
"type": "long_function",
|
|
"message": f"函数 {node.name} 过长 ({lines} 行)"
|
|
})
|
|
except:
|
|
pass
|
|
|
|
return issues
|
|
|
|
def _check_parameter_count(self, filepath: str, content: str) -> list:
|
|
"""检查参数数量"""
|
|
issues = []
|
|
|
|
try:
|
|
tree = ast.parse(content)
|
|
for node in ast.walk(tree):
|
|
if isinstance(node, ast.FunctionDef):
|
|
args = node.args
|
|
count = len(args.args)
|
|
if count > 5:
|
|
issues.append({
|
|
"file": filepath,
|
|
"line": node.lineno,
|
|
"severity": "info",
|
|
"type": "too_many_params",
|
|
"message": f"函数 {node.name} 参数过多 ({count} 个)"
|
|
})
|
|
except:
|
|
pass
|
|
|
|
return issues
|
|
|
|
def _check_complexity(self, filepath: str, content: str) -> list:
|
|
"""检查圈复杂度"""
|
|
issues = []
|
|
|
|
try:
|
|
tree = ast.parse(content)
|
|
for node in ast.walk(tree):
|
|
if isinstance(node, ast.FunctionDef):
|
|
complexity = self._calculate_complexity(node)
|
|
if complexity > 10:
|
|
issues.append({
|
|
"file": filepath,
|
|
"line": node.lineno,
|
|
"severity": "warning",
|
|
"type": "high_complexity",
|
|
"message": f"函数 {node.name} 复杂度过高 (圈复杂度: {complexity})"
|
|
})
|
|
except:
|
|
pass
|
|
|
|
return issues
|
|
|
|
def _calculate_complexity(self, node: ast.AST) -> int:
|
|
"""计算圈复杂度"""
|
|
complexity = 1
|
|
|
|
for child in ast.walk(node):
|
|
if isinstance(child, (ast.If, ast.While, ast.For, ast.Try, ast.With)):
|
|
complexity += 1
|
|
elif isinstance(child, ast.BoolOp):
|
|
complexity += len(child.values) - 1
|
|
|
|
return complexity
|