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

1import enum 

2import pathlib 

3from typing import TYPE_CHECKING, TypeAlias, cast 

4 

5from natsort import natsort_keygen, ns 

6 

7if TYPE_CHECKING: 

8 from collections.abc import Callable 

9 

10 

11class PathSortOrder(str, enum.Enum): 

12 lexicographic = "lexicographic" 

13 natural = "natural" 

14 

15 

16_NaturalPrimaryKey: TypeAlias = tuple[object, ...] 

17_NaturalSortKey: TypeAlias = tuple[_NaturalPrimaryKey, str] 

18_LexicographicSortKey: TypeAlias = tuple[str] 

19_PathSortKey: TypeAlias = _NaturalSortKey | _LexicographicSortKey 

20 

21_NATURAL_PATH_SORT_KEY = cast( 

22 "Callable[[pathlib.PurePath], _NaturalPrimaryKey]", 

23 natsort_keygen(alg=ns.INT | ns.IGNORECASE | ns.PATH), 

24) 

25 

26 

27def normalize_path_sort_order(order: PathSortOrder | None) -> PathSortOrder: 

28 return order or PathSortOrder.lexicographic 

29 

30 

31def is_natural_path_sort(order: PathSortOrder | None) -> bool: 

32 return normalize_path_sort_order(order) == PathSortOrder.natural 

33 

34 

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(),) 

42 

43 return (_NATURAL_PATH_SORT_KEY(path), value)