Source code for impscan.scanner.ast_utils

import ast
from pathlib import Path

import chardet

from .import_utils import get_imported_name_sources, get_sibling_module_names

__all__ = ["retrieve_imported_modules"]


[docs]def retrieve_imported_modules(py_file_path: Path) -> set: """ Return a set of imported names (excluding stdlib modules) by parsing the AST for import statements (ignoring relative imports). """ fb = py_file_path.read_bytes() fd = chardet.detect(fb) fe = fd["encoding"] dconf = fd["confidence"] try: if dconf < 0.5: fc = fb.decode() else: fc = fb.decode(encoding=fe) trunk = ast.parse(fc).body except Exception as e: raise e # do not intercept for now module_sibling_names = get_sibling_module_names(py_file_path) trunk_imports = get_imported_name_sources(trunk) imported_names = { name for name in trunk_imports if name not in module_sibling_names } return imported_names