Coverage for src / local_deep_research / utilities / resource_utils.py: 100%
14 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-14 23:55 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-14 23:55 +0000
1"""Shared helpers for deterministic resource cleanup."""
3from loguru import logger
6def safe_close(
7 resource,
8 name: str = "resource",
9 *,
10 allow_none: bool = False,
11 closing_optional: bool = False,
12):
13 """Close a resource, logging a warning on failure. Never raises.
15 Args:
16 resource: The resource to close.
17 name: Human-readable label for log messages.
18 allow_none: If True, silently skip None resources. If False (default),
19 log a warning — the caller likely failed to initialize it.
20 closing_optional: If True, silently skip resources without a close()
21 method. If False (default), log a warning — the caller likely
22 passed the wrong object.
23 """
24 if resource is None:
25 if not allow_none:
26 logger.warning(f"Resource {name!r} is None — nothing to close")
27 return
28 if not hasattr(resource, "close"):
29 if not closing_optional:
30 logger.warning(
31 f"Resource {name!r} ({type(resource).__name__}) has no close() method"
32 )
33 return
34 try:
35 resource.close()
36 except Exception:
37 logger.warning(f"Failed to close {name}")