File: check.py

package info (click to toggle)
python-ast-decompiler 0.8.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 228 kB
  • sloc: python: 1,738; makefile: 3
file content (31 lines) | stat: -rw-r--r-- 899 bytes parent folder | download
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
import ast
from ast_decompiler import decompile
import difflib


def check(code: str) -> None:
    """Checks that the code remains the same when decompiled and re-parsed."""
    tree = ast.parse(code)
    new_code = decompile(tree)
    try:
        new_tree = ast.parse(new_code)
    except SyntaxError as e:
        if e.lineno is None:
            raise
        print(">>> syntax error:")
        lineno = e.lineno - 1
        min_lineno = max(0, lineno - 3)
        max_lineno = lineno + 3
        for line in new_code.splitlines()[min_lineno:max_lineno]:
            print(line)
        raise

    dumped = ast.dump(ast.parse(code))
    new_dumped = ast.dump(new_tree)

    if dumped != new_dumped:
        print(code)
        print(new_code)
        for line in difflib.unified_diff(dumped.split(), new_dumped.split()):
            print(line)
        assert False, f"{dumped} != {new_dumped}"