Coverage for src/extratools_core/strtools.py: 100%

18 statements  

« prev     ^ index     » next       coverage.py v7.8.1, created at 2025-06-19 04:20 -0700

1import gzip 

2from base64 import b64decode, b64encode 

3from collections.abc import Callable, Iterable 

4 

5from .iter import iter_to_grams 

6from .seq.subseq import common_subseq, enumerate_subseqs 

7 

8 

9def str_to_grams( 

10 s: str, 

11 *, 

12 n: int, 

13 pad: str = '', 

14) -> Iterable[str]: 

15 if n < 1 or len(pad) > 1: 

16 raise ValueError 

17 

18 for c in iter_to_grams(s, n=n, pad=pad or None): 

19 yield ''.join(c) 

20 

21 

22def common_substr(a: str, b: str) -> str: 

23 return ''.join(common_subseq(a, b)) 

24 

25 

26def enumerate_substrs(s: str) -> Iterable[str]: 

27 return map(str, enumerate_subseqs(s)) 

28 

29 

30def compress( 

31 s: str, 

32 compress_func: Callable[[bytes], bytes] = gzip.compress, 

33) -> str: 

34 """ 

35 Compress a string by GZip + Base64 encoding. 

36 

37 https://base64.guru/developers/data-uri/gzip 

38 

39 Parameters 

40 ---------- 

41 s : str 

42 String to compress 

43 compress_func : Callable[[bytes], bytes] 

44 Optional function to compress (`gzip.compress` in default) 

45 

46 Returns 

47 ------- 

48 str 

49 Compressed string 

50 """ 

51 

52 return b64encode(compress_func(s.encode())).decode() 

53 

54 

55def decompress( 

56 s: str, 

57 decompress_func: Callable[[bytes], bytes] = gzip.decompress, 

58) -> str: 

59 """ 

60 Decompress a string with GZip + Base64 encoding. 

61 

62 https://base64.guru/developers/data-uri/gzip 

63 

64 Parameters 

65 ---------- 

66 s : str 

67 String to decompress 

68 compress_func : Callable[[bytes], bytes] 

69 Optional function to decompress (`gzip.decompress` in default) 

70 

71 Returns 

72 ------- 

73 str 

74 Decompressed string 

75 """ 

76 

77 return decompress_func(b64decode(s.encode())).decode()