Coverage for src / competitive_verifier / documents / path_sort.py: 100%
21 statements
« prev ^ index » next coverage.py v7.13.1, created at 2026-06-05 08:59 +0900
« prev ^ index » next coverage.py v7.13.1, created at 2026-06-05 08:59 +0900
1import enum
2import pathlib
3from typing import TYPE_CHECKING, TypeAlias, cast
5from natsort import natsort_keygen, ns
7if TYPE_CHECKING:
8 from collections.abc import Callable
11class PathSortOrder(str, enum.Enum):
12 lexicographic = "lexicographic"
13 natural = "natural"
16_NaturalPrimaryKey: TypeAlias = tuple[object, ...]
17_NaturalSortKey: TypeAlias = tuple[_NaturalPrimaryKey, str]
18_LexicographicSortKey: TypeAlias = tuple[str]
19_PathSortKey: TypeAlias = _NaturalSortKey | _LexicographicSortKey
21_NATURAL_PATH_SORT_KEY = cast(
22 "Callable[[pathlib.PurePath], _NaturalPrimaryKey]",
23 natsort_keygen(alg=ns.INT | ns.IGNORECASE | ns.PATH),
24)
27def normalize_path_sort_order(order: PathSortOrder | None) -> PathSortOrder:
28 return order or PathSortOrder.lexicographic
31def is_natural_path_sort(order: PathSortOrder | None) -> bool:
32 return normalize_path_sort_order(order) == PathSortOrder.natural
35def path_sort_key_path(
36 path: pathlib.PurePath,
37 order: PathSortOrder | None,
38) -> _PathSortKey:
39 value = path.as_posix()
40 if not is_natural_path_sort(order):
41 return (value.casefold(),)
43 return (_NATURAL_PATH_SORT_KEY(path), value)