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
« prev ^ index » next coverage.py v7.13.1, created at 2026-03-05 16:00 +0000
1import pathlib
3from charset_normalizer import from_bytes
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
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
29 path = pathlib.Path(target_path)
30 if path.exists():
31 return path
33 path = basedir / pathlib.Path(target_path)
34 if path.exists():
35 return path
36 return None
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
52def read_text_normalized(path: pathlib.Path) -> str:
53 return normalize_bytes_text(path.read_bytes())
56def normalize_bytes_text(b: bytes) -> str:
57 return str(from_bytes(b).best())