Coverage for tarjinja/choice.py: 71%
51 statements
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-05 14:24 +0000
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-05 14:24 +0000
1import os
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 *
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
26def input_items():
27 for k, v in globals().items():
28 if isX(v, Input):
29 k = k.removesuffix("Input")
30 yield k, v
33def output_items():
34 for k, v in globals().items():
35 if isX(v, Output):
36 k = k.removesuffix("Output")
37 yield k, v
40def filter_items():
41 for k, v in globals().items():
42 if isX(v, Filter):
43 k = k.removesuffix("Filter")
44 yield k, v
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
71def detect_input(fn: str, guess: str) -> Input:
72 return dict(input_items()).get(auto_detect(fn, guess))
75def detect_output(fn: str, guess: str) -> Output:
76 return dict(output_items()).get(auto_detect(fn, guess), DirOutput)