-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpython_parser.py
More file actions
106 lines (70 loc) · 2.06 KB
/
Copy pathpython_parser.py
File metadata and controls
106 lines (70 loc) · 2.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
"""
RepoForge Python Intelligence Analyzer
Analyzes Python source code using AST.
"""
import ast
from typing import Dict, Any, List
from repoforge.intelligence.analyzer import CodeAnalyzer
class PythonAnalyzer(CodeAnalyzer):
"""
Understands Python source structure.
"""
def analyze(self) -> Dict[str, Any]:
with open(
self.file_path,
"r",
encoding="utf-8"
) as file:
source = file.read()
tree = ast.parse(
source
)
result = {
"file": self.file_path,
"language": "python",
"classes": [],
"functions": [],
"imports": [],
}
for node in ast.walk(tree):
if isinstance(
node,
ast.ClassDef
):
result["classes"].append(
{
"name": node.name,
"methods": [
m.name
for m in node.body
if isinstance(
m,
ast.FunctionDef
)
]
}
)
elif isinstance(
node,
ast.FunctionDef
):
result["functions"].append(
node.name
)
elif isinstance(
node,
ast.Import
):
for item in node.names:
result["imports"].append(
item.name
)
elif isinstance(
node,
ast.ImportFrom
):
if node.module:
result["imports"].append(
node.module
)
return result