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

1"""Shared helpers for deterministic resource cleanup.""" 

2 

3from loguru import logger 

4 

5 

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. 

14 

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}")