Protokoll #11731
| ID | 11731 |
|---|---|
| Zeitstempel | 2025-12-23 21:02:33.682401 |
| Client | root |
| IP | Warning: Undefined array key "request_ip" in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 13 Deprecated: htmlspecialchars(): Passing null to parameter #1 ($string) of type string is deprecated in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 13 |
| Modell | claude-sonnet-4-20250514 |
| Status | completed |
| Tokens | 1,789 (Input: 0, Output: 0) |
| Dauer | 91 ms |
| Request-Zeit | Warning: Undefined array key "request_timestamp" in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 18 |
| Response-Zeit | - |
Warning: Undefined array key "error_message" in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 22
Request
{
"event": "PreToolUse",
"tool_name": "Write",
"tool_input": {
"file_path": "\/var\/www\/dev.campus.systemische-tools.de\/src\/Infrastructure\/CodeAnalysis\/scripts\/python_parser.py",
"content": "#!\/usr\/bin\/env python3\n\"\"\"\nPython File Parser - AST-basierte Dependency-Extraktion.\n\nGibt JSON auf stdout aus mit:\n- imports: Liste der Import-Statements\n- classes: Liste der Klassen mit Basisklassen\n- functions: Liste der Top-Level Funktionen\n- error: Fehler falls vorhanden\n\"\"\"\n\nimport ast\nimport json\nimport sys\nfrom pathlib import Path\n\n\ndef parse_file(file_path: str) -> dict:\n \"\"\"Parst eine Python-Datei und extrahiert Metadaten.\"\"\"\n result = {\n \"imports\": [],\n \"classes\": [],\n \"functions\": [],\n \"extends\": [],\n \"error\": None,\n }\n\n try:\n content = Path(file_path).read_text(encoding=\"utf-8\")\n tree = ast.parse(content, filename=file_path)\n except SyntaxError as e:\n result[\"error\"] = f\"SyntaxError: {e.msg} (line {e.lineno})\"\n return result\n except Exception as e:\n result[\"error\"] = str(e)\n return result\n\n for node in ast.walk(tree):\n # Import statements\n if isinstance(node, ast.Import):\n for alias in node.names:\n result[\"imports\"].append({\n \"type\": \"import\",\n \"module\": alias.name,\n \"name\": alias.asname or alias.name,\n \"line\": node.lineno,\n })\n\n elif isinstance(node, ast.ImportFrom):\n module = node.module or \"\"\n for alias in node.names:\n full_name = f\"{module}.{alias.name}\" if module else alias.name\n result[\"imports\"].append({\n \"type\": \"from\",\n \"module\": module,\n \"name\": alias.name,\n \"full\": full_name,\n \"line\": node.lineno,\n })\n\n # Class definitions\n elif isinstance(node, ast.ClassDef):\n bases = []\n for base in node.bases:\n if isinstance(base, ast.Name):\n bases.append(base.id)\n elif isinstance(base, ast.Attribute):\n bases.append(ast.unparse(base))\n\n result[\"classes\"].append({\n \"name\": node.name,\n \"bases\": bases,\n \"line\": node.lineno,\n })\n\n # Track inheritance\n for base in bases:\n if base not in [\"object\", \"ABC\", \"Exception\", \"BaseException\"]:\n result[\"extends\"].append(base)\n\n # Top-level function definitions\n elif isinstance(node, ast.FunctionDef) or isinstance(node, ast.AsyncFunctionDef):\n # Only top-level functions (not methods)\n if hasattr(node, \"col_offset\") and node.col_offset == 0:\n result[\"functions\"].append({\n \"name\": node.name,\n \"async\": isinstance(node, ast.AsyncFunctionDef),\n \"line\": node.lineno,\n })\n\n return result\n\n\ndef main():\n if len(sys.argv) < 2:\n print(json.dumps({\"error\": \"Usage: python_parser.py <file_path>\"}))\n sys.exit(1)\n\n file_path = sys.argv[1]\n result = parse_file(file_path)\n print(json.dumps(result))\n\n\nif __name__ == \"__main__\":\n main()\n"
}
}
Response
{
"tool_response": {
"type": "create",
"filePath": "\/var\/www\/dev.campus.systemische-tools.de\/src\/Infrastructure\/CodeAnalysis\/scripts\/python_parser.py",
"content": "#!\/usr\/bin\/env python3\n\"\"\"\nPython File Parser - AST-basierte Dependency-Extraktion.\n\nGibt JSON auf stdout aus mit:\n- imports: Liste der Import-Statements\n- classes: Liste der Klassen mit Basisklassen\n- functions: Liste der Top-Level Funktionen\n- error: Fehler falls vorhanden\n\"\"\"\n\nimport ast\nimport json\nimport sys\nfrom pathlib import Path\n\n\ndef parse_file(file_path: str) -> dict:\n \"\"\"Parst eine Python-Datei und extrahiert Metadaten.\"\"\"\n result = {\n \"imports\": [],\n \"classes\": [],\n \"functions\": [],\n \"extends\": [],\n \"error\": None,\n }\n\n try:\n content = Path(file_path).read_text(encoding=\"utf-8\")\n tree = ast.parse(content, filename=file_path)\n except SyntaxError as e:\n result[\"error\"] = f\"SyntaxError: {e.msg} (line {e.lineno})\"\n return result\n except Exception as e:\n result[\"error\"] = str(e)\n return result\n\n for node in ast.walk(tree):\n # Import statements\n if isinstance(node, ast.Import):\n for alias in node.names:\n result[\"imports\"].append({\n \"type\": \"import\",\n \"module\": alias.name,\n \"name\": alias.asname or alias.name,\n \"line\": node.lineno,\n })\n\n elif isinstance(node, ast.ImportFrom):\n module = node.module or \"\"\n for alias in node.names:\n full_name = f\"{module}.{alias.name}\" if module else alias.name\n result[\"imports\"].append({\n \"type\": \"from\",\n \"module\": module,\n \"name\": alias.name,\n \"full\": full_name,\n \"line\": node.lineno,\n })\n\n # Class definitions\n elif isinstance(node, ast.ClassDef):\n bases = []\n for base in node.bases:\n if isinstance(base, ast.Name):\n bases.append(base.id)\n elif isinstance(base, ast.Attribute):\n bases.append(ast.unparse(base))\n\n result[\"classes\"].append({\n \"name\": node.name,\n \"bases\": bases,\n \"line\": node.lineno,\n })\n\n # Track inheritance\n for base in bases:\n if base not in [\"object\", \"ABC\", \"Exception\", \"BaseException\"]:\n result[\"extends\"].append(base)\n\n # Top-level function definitions\n elif isinstance(node, ast.FunctionDef) or isinstance(node, ast.AsyncFunctionDef):\n # Only top-level functions (not methods)\n if hasattr(node, \"col_offset\") and node.col_offset == 0:\n result[\"functions\"].append({\n \"name\": node.name,\n \"async\": isinstance(node, ast.AsyncFunctionDef),\n \"line\": node.lineno,\n })\n\n return result\n\n\ndef main():\n if len(sys.argv) < 2:\n print(json.dumps({\"error\": \"Usage: python_parser.py <file_path>\"}))\n sys.exit(1)\n\n file_path = sys.argv[1]\n result = parse_file(file_path)\n print(json.dumps(result))\n\n\nif __name__ == \"__main__\":\n main()\n",
"structuredPatch": [],
"originalFile": null
}
}