Coverage for src/extratools_core/path.py: 0%

31 statements  

« prev     ^ index     » next       coverage.py v7.8.1, created at 2025-05-27 07:45 -0700

1from collections.abc import Iterable 

2from datetime import UTC, datetime, timedelta 

3 

4from .typing import PathLike 

5 

6 

7def clear_dir(curr_dir: PathLike) -> None: 

8 """ 

9 Based on example in https://docs.python.org/3/library/pathlib.html#pathlib.Path.walk 

10 """ 

11 

12 if not curr_dir.is_dir(): 

13 raise ValueError 

14 

15 for parent, dirs, files in curr_dir.walk(top_down=False): 

16 for filename in files: 

17 (parent / filename).unlink() 

18 for dirname in dirs: 

19 (parent / dirname).rmdir() 

20 

21 

22def rm_with_empty_parents( 

23 curr: PathLike, 

24 *, 

25 stop: PathLike | None = None, 

26) -> None: 

27 curr.unlink() 

28 

29 for parent in curr.parents: 

30 if parent == stop: 

31 return 

32 

33 if parent.is_dir() and next(iter(parent.iterdir()), None) is None: 

34 parent.rmdir() 

35 

36 

37def cleanup_dir_by_ttl( 

38 curr_dir: PathLike, 

39 ttl: timedelta, 

40 *, 

41 include_empty_parents: bool = True, 

42) -> Iterable[tuple[PathLike, datetime]]: 

43 if not curr_dir.is_dir(): 

44 raise ValueError 

45 

46 now: datetime = datetime.now(UTC) 

47 

48 for parent, _, files in curr_dir.walk(top_down=False): 

49 for filename in files: 

50 f: PathLike = (parent / filename) 

51 

52 last_modified_time: datetime = datetime.fromtimestamp(f.stat().st_mtime, UTC) 

53 if last_modified_time + ttl < now: 

54 if include_empty_parents: 

55 rm_with_empty_parents(f, stop=curr_dir) 

56 else: 

57 f.unlink() 

58 

59 yield (f, last_modified_time)