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 32 33
|
"""Helpers for tests."""
from __future__ import annotations
import os
import sys
from tempfile import gettempdir
from griffe._internal.tests import _TMPDIR_PREFIX
def clear_sys_modules(name: str | None = None) -> None:
"""Clear `sys.modules` of a module and its submodules.
Use this function after having used `temporary_pypackage` and `inspect` together.
Better yet, use `temporary_inspected_package` and `temporary_inspected_module`
which will automatically clear `sys.modules` when exiting.
Parameters:
name: A top-level module name. If None, clear all temporary inspected modules
(located in the OS' default temporary directory).
"""
if name:
for module_name in tuple(sys.modules.keys()):
if module_name == name or module_name.startswith(f"{name}."):
sys.modules.pop(module_name, None)
else:
prefix = os.path.join(gettempdir(), _TMPDIR_PREFIX) # noqa: PTH118
for module_name, module in tuple(sys.modules.items()):
if ((file := getattr(module, "__file__", "")) and file.startswith(prefix)) or (
(paths := getattr(module, "__path__", ())) and any(path.startswith(prefix) for path in paths)
):
sys.modules.pop(module_name, None)
|