def _get_ast_hash(path: str) -> str: # Generates a hash based on the AST of a script. with Path(path).open() as fp: ast_list = [ast.parse(fp.read(), path)] base_path = str(check_for_project(path)) for obj in [ i for i in ast_list[0].body if isinstance(i, (ast.Import, ast.ImportFrom)) ]: if isinstance(obj, ast.Import): name = obj.names[0].name # type: ignore else: name = obj.module # type: ignore try: origin = importlib.util.find_spec(name).origin except Exception: warnings.warn( f"{Path(path).name}, unable to determine import spec for '{name}'," " the --update flag may not work correctly with this test file", ImportWarning, ) continue if origin is not None and base_path in origin: with open(origin) as fp: ast_list.append(ast.parse(fp.read(), origin)) dump = "\n".join(ast.dump(i) for i in ast_list) return sha1(dump.encode()).hexdigest()
def get_ast_hash(path): '''Generates a hash based on the AST of a script. Args: path: path of the script to hash Returns: sha1 hash as bytes''' with Path(path).open() as fp: ast_list = [ast.parse(fp.read(), path)] base_path = str(check_for_project(path)) for obj in [ i for i in ast_list[0].body if type(i) in (ast.Import, ast.ImportFrom) ]: if type(obj) is ast.Import: name = obj.names[0].name else: name = obj.module try: origin = importlib.util.find_spec(name).origin except Exception as e: raise type(e)(f"in {path} - {e}") from None if base_path in origin: with open(origin) as fp: ast_list.append(ast.parse(fp.read(), origin)) dump = "\n".join(ast.dump(i) for i in ast_list) return sha1(dump.encode()).hexdigest()