2
Auto-generate tqdm/completion.sh from docstrings.
6
from pathlib import Path
8
sys.path.insert(0, str(Path(__file__).parent.parent))
12
RE_OPT = re.compile(r'(\w+) :', flags=re.M)
13
RE_OPT_INPUT = re.compile(r'(\w+) : (?:str|int|float|chr|dict|tuple)', flags=re.M)
16
def doc2opt(doc, user_input=True):
18
doc : str, document to parse
19
user_input : bool, optional.
20
[default: True] for only options requiring user input
22
RE = RE_OPT_INPUT if user_input else RE_OPT
23
return ('--' + i for i in RE.findall(doc))
27
options = {'-h', '--help', '-v', '--version'}
29
for doc in (tqdm.tqdm.__doc__, tqdm.cli.CLI_EXTRA_DOC):
30
options.update(doc2opt(doc, user_input=False))
31
options_input.update(doc2opt(doc, user_input=True))
32
options.difference_update('--' + i for i in ('name',) + tqdm.cli.UNSUPPORTED_OPTS)
33
options_input &= options
34
options_input -= {"--log"} # manually dealt with
39
cur="${{COMP_WORDS[COMP_CWORD]}}"
40
prv="${{COMP_WORDS[COMP_CWORD - 1]}}"
47
COMPREPLY=($(compgen -W \
48
'CRITICAL FATAL ERROR WARN WARNING INFO DEBUG NOTSET' -- ${{cur}}))
51
COMPREPLY=($(compgen -W '{opts}' -- ${{cur}}))
56
""".format(opts=' '.join(sorted(options)), opts_manual='|'.join(sorted(options_input)))
58
if __name__ == "__main__":
59
(Path(__file__).resolve().parent.parent / 'tqdm' / 'completion.sh').write_text(
60
completion, encoding='utf-8')