Add support for parsers that can be used bare, no required args.

This commit is contained in:
Ethan Dalool 2020-02-07 12:33:46 -08:00
parent abe73ae24d
commit 87ab04abab

View file

@ -3,6 +3,18 @@ import functools
HELPSTRINGS = {'', 'help', '-h', '--help'} HELPSTRINGS = {'', 'help', '-h', '--help'}
def can_use_bare(parser):
has_func = bool(parser.get_default('func'))
has_required_args = any(action.required for action in parser._actions)
return has_func and not has_required_args
def can_use_bare_subparsers(subparser_action):
can_bares = set(
sp_name for (sp_name, sp) in subparser_action.choices.items()
if can_use_bare(sp)
)
return can_bares
def docstring_preview(text): def docstring_preview(text):
''' '''
This function assumes that your docstring is formatted with a single blank This function assumes that your docstring is formatted with a single blank
@ -49,12 +61,15 @@ def betterhelp(parser, docstring):
lesser of two evils. Plus, maybe someday I'll find a need for it and won't lesser of two evils. Plus, maybe someday I'll find a need for it and won't
have to make any changes to do it. have to make any changes to do it.
''' '''
can_bare = can_use_bare(parser)
def wrapper(main): def wrapper(main):
@functools.wraps(main) @functools.wraps(main)
def wrapped(argv): def wrapped(argv):
argument = listget(argv, 0, '').lower() argument = listget(argv, 0, '').lower()
if argument in HELPSTRINGS: if argument == '' and can_bare:
pass
elif argument in HELPSTRINGS:
print(docstring) print(docstring)
return 1 return 1
@ -68,7 +83,6 @@ def get_subparser_action(parser):
return action return action
raise TypeError('Couldn\'t locate the SubParsersAction.') raise TypeError('Couldn\'t locate the SubParsersAction.')
def set_alias_docstrings(sub_docstrings, subparser_action): def set_alias_docstrings(sub_docstrings, subparser_action):
''' '''
When using subparser aliases: When using subparser aliases:
@ -102,22 +116,31 @@ def set_alias_docstrings(sub_docstrings, subparser_action):
def subparser_betterhelp(parser, main_docstring, sub_docstrings): def subparser_betterhelp(parser, main_docstring, sub_docstrings):
subparser_action = get_subparser_action(parser) subparser_action = get_subparser_action(parser)
sub_docstrings = set_alias_docstrings(sub_docstrings, subparser_action) sub_docstrings = set_alias_docstrings(sub_docstrings, subparser_action)
can_bare = can_use_bare(parser)
can_bares = can_use_bare_subparsers(subparser_action)
def wrapper(main): def wrapper(main):
@functools.wraps(main) @functools.wraps(main)
def wrapped(argv): def wrapped(argv):
command = listget(argv, 0, '').lower() command = listget(argv, 0, '').lower()
if command == '' and can_bare:
return main(argv)
if command not in sub_docstrings: if command not in sub_docstrings:
print(main_docstring) print(main_docstring)
if command == '': if command == '':
print('You are seeing the default help text because you did not choose a command.') because = 'you did not choose a command.'
print(f'You are seeing the default help text because {because}')
elif command not in HELPSTRINGS: elif command not in HELPSTRINGS:
print(f'You are seeing the default help text because "{command}" was not recognized') because = f'"{command}" was not recognized'
print(f'You are seeing the default help text because {because}')
return 1 return 1
argument = listget(argv, 1, '').lower() argument = listget(argv, 1, '').lower()
if argument in HELPSTRINGS: if argument == '' and command in can_bares:
pass
elif argument in HELPSTRINGS:
print(sub_docstrings[command]) print(sub_docstrings[command])
return 1 return 1