Coverage for src / competitive_verifier / util.py: 98%

34 statements  

« prev     ^ index     » next       coverage.py v7.13.1, created at 2026-03-05 16:00 +0000

1import pathlib 

2 

3from charset_normalizer import from_bytes 

4 

5 

6def to_relative(path: pathlib.Path) -> pathlib.Path | None: 

7 try: 

8 return path.resolve().relative_to(pathlib.Path.cwd().resolve()) 

9 except ValueError: 

10 return None 

11 

12 

13def _resolve_relative_or_abs_path_inner( 

14 target_path: str, 

15 *, 

16 basedir: pathlib.Path, 

17): 

18 if target_path.startswith(("./", "../")): 

19 # a relative path 

20 path = basedir / pathlib.Path(target_path) 

21 if path.exists(): 

22 return path 

23 elif target_path.startswith("//"): 

24 # from the document root 

25 path = pathlib.Path(target_path[2:]) 

26 if path.exists(): 

27 return path 

28 

29 path = pathlib.Path(target_path) 

30 if path.exists(): 

31 return path 

32 

33 path = basedir / pathlib.Path(target_path) 

34 if path.exists(): 

35 return path 

36 return None 

37 

38 

39def resolve_relative_or_abs_path( 

40 target_path: str, 

41 *, 

42 basedir: pathlib.Path, 

43) -> pathlib.Path | None: 

44 path = _resolve_relative_or_abs_path_inner(target_path, basedir=basedir) 

45 if path: 

46 path = path.resolve() 

47 if path.is_relative_to(pathlib.Path.cwd()): 47 ↛ 49line 47 didn't jump to line 49 because the condition on line 47 was always true

48 return path.relative_to(pathlib.Path.cwd()) 

49 return None 

50 

51 

52def read_text_normalized(path: pathlib.Path) -> str: 

53 return normalize_bytes_text(path.read_bytes()) 

54 

55 

56def normalize_bytes_text(b: bytes) -> str: 

57 return str(from_bytes(b).best())