Coverage for little_loops / learning_tests / import_scan.py: 29%
17 statements
« prev ^ index » next coverage.py v7.12.0, created at 2026-06-26 17:38 -0500
« prev ^ index » next coverage.py v7.12.0, created at 2026-06-26 17:38 -0500
1"""Shared utility for scanning Python source files for imported package names (ENH-2214, ENH-2216)."""
3from __future__ import annotations
5import re
6from pathlib import Path
8_PY_IMPORT_RE = re.compile(r"^(?:import|from)\s+([A-Za-z_][A-Za-z0-9_]*)", re.MULTILINE)
11def get_imported_packages(source_dirs: list[Path]) -> set[str]:
12 """Return unique top-level package names imported across all .py files in source_dirs.
14 Args:
15 source_dirs: Directories to scan recursively for .py files.
17 Returns:
18 Set of unique top-level package names (e.g., ``"requests"``, ``"anthropic"``).
19 """
20 packages: set[str] = set()
21 for source_dir in source_dirs:
22 if not source_dir.is_dir():
23 continue
24 for py_file in source_dir.rglob("*.py"):
25 try:
26 content = py_file.read_text(encoding="utf-8", errors="ignore")
27 except OSError:
28 continue
29 for m in _PY_IMPORT_RE.finditer(content):
30 packages.add(m.group(1))
31 return packages