|
1 |
| -import sys |
2 | 1 | import importlib.machinery
|
| 2 | +import inspect |
| 3 | +import sys |
3 | 4 | import types
|
4 |
| -import ast |
5 | 5 | import mypy.fastparse
|
6 |
| -import inspect |
7 | 6 |
|
8 | 7 |
|
9 |
| -annotation = sys.argv[1] |
10 |
| -project_root = sys.argv[2] |
11 |
| -path = sys.argv[3] |
12 |
| -for extra_path in sys.argv[4:]: |
13 |
| - sys.path.append(extra_path) |
| 8 | +def main(annotation: str, project_root: str, path: str): |
| 9 | + def walk_mypy_type(mypy_type) -> str: |
| 10 | + try: |
| 11 | + source = inspect.getfile(eval(mypy_type.name)) |
| 12 | + in_project = source.startswith(project_root) |
| 13 | + except: |
| 14 | + in_project = False |
| 15 | + |
| 16 | + modname = eval(mypy_type.name).__module__ |
| 17 | + if modname != '' and not in_project: |
| 18 | + file_name = mypy_type.name.split('.')[-1] |
| 19 | + fullname = f'{modname}.{file_name}' |
| 20 | + else: |
| 21 | + fullname = mypy_type.name |
| 22 | + |
| 23 | + result = fullname |
| 24 | + if len(mypy_type.args) != 0: |
| 25 | + arg_strs = [ |
| 26 | + walk_mypy_type(arg) |
| 27 | + for arg in mypy_type.args |
| 28 | + ] |
| 29 | + result += f"[{', '.join(arg_strs)}]" |
| 30 | + return result |
14 | 31 |
|
15 |
| - |
16 |
| -def walk_mypy_type(mypy_type): |
17 | 32 | try:
|
18 |
| - source = inspect.getfile(eval(mypy_type.name)) |
19 |
| - in_project = source.startswith(project_root) |
20 |
| - except: |
21 |
| - in_project = False |
| 33 | + loader = importlib.machinery.SourceFileLoader('', path) |
| 34 | + mod = types.ModuleType(loader.name) |
| 35 | + loader.exec_module(mod) |
22 | 36 |
|
23 |
| - modname = eval(mypy_type.name).__module__ |
24 |
| - if modname != "" and (not in_project): |
25 |
| - name = mypy_type.name.split('.')[-1] |
26 |
| - fullname = modname + '.' + name |
27 |
| - else: |
28 |
| - fullname = mypy_type.name |
| 37 | + for name in dir(mod): |
| 38 | + globals()[name] = getattr(mod, name) |
29 | 39 |
|
30 |
| - result = fullname |
31 |
| - if len(mypy_type.args) != 0: |
32 |
| - arg_strs = [] |
33 |
| - for arg in mypy_type.args: |
34 |
| - arg_strs.append(walk_mypy_type(arg)) |
35 |
| - result += '[' + ','.join(arg_strs) + ']' |
36 |
| - return result |
| 40 | + mypy_type_ = mypy.fastparse.parse_type_string(annotation, annotation, -1, -1) |
| 41 | + print(walk_mypy_type(mypy_type_), end='') |
37 | 42 |
|
| 43 | + except: |
| 44 | + print(annotation, end='') |
38 | 45 |
|
39 |
| -try: |
40 |
| - loader = importlib.machinery.SourceFileLoader("", path) |
41 |
| - mod = types.ModuleType(loader.name) |
42 |
| - loader.exec_module(mod) |
43 | 46 |
|
44 |
| - for name in dir(mod): |
45 |
| - globals()[name] = getattr(mod, name) |
| 47 | +def get_args(): |
| 48 | + annotation = sys.argv[1] |
| 49 | + project_root = sys.argv[2] |
| 50 | + path = sys.argv[3] |
| 51 | + for extra_path in sys.argv[4:]: |
| 52 | + sys.path.append(extra_path) |
| 53 | + return annotation, project_root, path |
46 | 54 |
|
47 |
| - mypy_type = mypy.fastparse.parse_type_string(annotation, annotation, -1, -1) |
48 |
| - print(walk_mypy_type(mypy_type)) |
49 | 55 |
|
50 |
| -except: |
51 |
| - print(annotation) |
| 56 | +if __name__ == '__main__': |
| 57 | + main(*get_args()) |
0 commit comments