Coverage for tarjinja/choice.py: 71%

51 statements  

« prev     ^ index     » next       coverage.py v7.16.0, created at 2026-09-05 14:24 +0000

1import os 

2 

3from .dirtree import * 

4from .git import * 

5from .iface import Filter, Input, Output 

6from .jinjafilter import * 

7from .makofilter import * 

8from .multifilter import * 

9from .nullfilter import * 

10from .reversefilter import * 

11from .strfilter import * 

12from .tar import * 

13from .zip import * 

14 

15 

16def isX(v, x): 

17 if not isinstance(v, type): 

18 return False 

19 if not issubclass(v, x): 

20 return False 

21 if "Abstract" in v.__name__: 

22 return False 

23 return v is not x 

24 

25 

26def input_items(): 

27 for k, v in globals().items(): 

28 if isX(v, Input): 

29 k = k.removesuffix("Input") 

30 yield k, v 

31 

32 

33def output_items(): 

34 for k, v in globals().items(): 

35 if isX(v, Output): 

36 k = k.removesuffix("Output") 

37 yield k, v 

38 

39 

40def filter_items(): 

41 for k, v in globals().items(): 

42 if isX(v, Filter): 

43 k = k.removesuffix("Filter") 

44 yield k, v 

45 

46 

47def auto_detect(filename, defval): 

48 extmap = { 

49 ".tar.gz": "Tar", 

50 ".tar.bz2": "Tar", 

51 ".tar.xz": "Tar", 

52 ".tar": "Tar", 

53 ".tgz": "Tar", 

54 ".tbz2": "Tar", 

55 ".txz": "Tar", 

56 ".zip": "Zip", 

57 ".git": "Git", 

58 } 

59 if os.path.isdir(filename): 

60 return "Dir" 

61 for k, v in extmap.items(): 

62 if filename.endswith(k): 

63 return v 

64 if os.path.exists(os.path.join(filename, ".git")) or filename.startswith("http"): 

65 return "Git" 

66 if os.path.exists(filename): 

67 return "Single" 

68 return defval 

69 

70 

71def detect_input(fn: str, guess: str) -> Input: 

72 return dict(input_items()).get(auto_detect(fn, guess)) 

73 

74 

75def detect_output(fn: str, guess: str) -> Output: 

76 return dict(output_items()).get(auto_detect(fn, guess), DirOutput)