summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore3
-rwxr-xr-xcmd2/argparse_completer.py44
-rw-r--r--cmd2/cmd2.py14
-rw-r--r--tests/test_cmd2.py2
4 files changed, 34 insertions, 29 deletions
diff --git a/.gitignore b/.gitignore
index ad7f428b..46298801 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,3 +17,6 @@ htmlcov
# Visual Studio Code
.vscode
+
+# mypy optional static type checker
+.mypy_cache
diff --git a/cmd2/argparse_completer.py b/cmd2/argparse_completer.py
index 904fb7b3..1bc7f342 100755
--- a/cmd2/argparse_completer.py
+++ b/cmd2/argparse_completer.py
@@ -80,16 +80,16 @@ ACTION_SUPPRESS_HINT = 'suppress_hint'
class CompletionItem(str):
- def __new__(cls, o, desc='', *args, **kwargs):
+ def __new__(cls, o, desc='', *args, **kwargs) -> str:
return str.__new__(cls, o, *args, **kwargs)
# noinspection PyMissingConstructor,PyUnusedLocal
- def __init__(self, o, desc='', *args, **kwargs):
+ def __init__(self, o, desc='', *args, **kwargs) -> None:
self.description = desc
class _RangeAction(object):
- def __init__(self, nargs: Union[int, str, Tuple[int, int], None]):
+ def __init__(self, nargs: Union[int, str, Tuple[int, int], None]) -> None:
self.nargs_min = None
self.nargs_max = None
@@ -128,7 +128,7 @@ class _StoreRangeAction(argparse._StoreAction, _RangeAction):
choices=None,
required=False,
help=None,
- metavar=None):
+ metavar=None) -> None:
_RangeAction.__init__(self, nargs)
@@ -157,7 +157,7 @@ class _AppendRangeAction(argparse._AppendAction, _RangeAction):
choices=None,
required=False,
help=None,
- metavar=None):
+ metavar=None) -> None:
_RangeAction.__init__(self, nargs)
@@ -174,7 +174,7 @@ class _AppendRangeAction(argparse._AppendAction, _RangeAction):
metavar=metavar)
-def register_custom_actions(parser: argparse.ArgumentParser):
+def register_custom_actions(parser: argparse.ArgumentParser) -> None:
"""Register custom argument action types"""
parser.register('action', None, _StoreRangeAction)
parser.register('action', 'store', _StoreRangeAction)
@@ -185,14 +185,14 @@ class AutoCompleter(object):
"""Automatically command line tab completion based on argparse parameters"""
class _ArgumentState(object):
- def __init__(self):
+ def __init__(self) -> None:
self.min = None
self.max = None
self.count = 0
self.needed = False
self.variable = False
- def reset(self):
+ def reset(self) -> None:
"""reset tracking values"""
self.min = None
self.max = None
@@ -206,7 +206,7 @@ class AutoCompleter(object):
arg_choices: Dict[str, Union[List, Tuple, Callable]] = None,
subcmd_args_lookup: dict = None,
tab_for_arg_help: bool = True,
- cmd2_app=None):
+ cmd2_app=None) -> None:
"""
Create an AutoCompleter
@@ -439,7 +439,7 @@ class AutoCompleter(object):
return completion_results
- def _format_completions(self, action, completions: List[Union[str, CompletionItem]]):
+ def _format_completions(self, action, completions: List[Union[str, CompletionItem]]) -> List[str]:
if completions and len(completions) > 1 and isinstance(completions[0], CompletionItem):
token_width = len(action.dest)
completions_with_desc = []
@@ -665,7 +665,7 @@ class AutoCompleter(object):
class ACHelpFormatter(argparse.HelpFormatter):
"""Custom help formatter to configure ordering of help text"""
- def _format_usage(self, usage, actions, groups, prefix):
+ def _format_usage(self, usage, actions, groups, prefix) -> str:
if prefix is None:
prefix = _('Usage: ')
@@ -778,7 +778,7 @@ class ACHelpFormatter(argparse.HelpFormatter):
# prefix with 'usage:'
return '%s%s\n\n' % (prefix, usage)
- def _format_action_invocation(self, action):
+ def _format_action_invocation(self, action) -> str:
if not action.option_strings:
default = self._get_default_metavar_for_positional(action)
metavar, = self._metavar_formatter(action, default)(1)
@@ -803,7 +803,7 @@ class ACHelpFormatter(argparse.HelpFormatter):
return ', '.join(action.option_strings) + ' ' + args_string
# End cmd2 customization
- def _metavar_formatter(self, action, default_metavar):
+ def _metavar_formatter(self, action, default_metavar) -> Callable:
if action.metavar is not None:
result = action.metavar
elif action.choices is not None:
@@ -822,7 +822,7 @@ class ACHelpFormatter(argparse.HelpFormatter):
return (result, ) * tuple_size
return format
- def _format_args(self, action, default_metavar):
+ def _format_args(self, action, default_metavar) -> str:
get_metavar = self._metavar_formatter(action, default_metavar)
# Begin cmd2 customization (less verbose)
if isinstance(action, _RangeAction) and \
@@ -837,7 +837,7 @@ class ACHelpFormatter(argparse.HelpFormatter):
result = super()._format_args(action, default_metavar)
return result
- def _split_lines(self, text, width):
+ def _split_lines(self, text: str, width) -> List[str]:
return text.splitlines()
@@ -845,7 +845,7 @@ class ACHelpFormatter(argparse.HelpFormatter):
class ACArgumentParser(argparse.ArgumentParser):
"""Custom argparse class to override error method to change default help text."""
- def __init__(self, *args, **kwargs):
+ def __init__(self, *args, **kwargs) -> None:
if 'formatter_class' not in kwargs:
kwargs['formatter_class'] = ACHelpFormatter
@@ -855,7 +855,7 @@ class ACArgumentParser(argparse.ArgumentParser):
self._custom_error_message = ''
# Begin cmd2 customization
- def set_custom_message(self, custom_message=''):
+ def set_custom_message(self, custom_message: str='') -> None:
"""
Allows an error message override to the error() function, useful when forcing a
re-parse of arguments with newly required parameters
@@ -863,7 +863,7 @@ class ACArgumentParser(argparse.ArgumentParser):
self._custom_error_message = custom_message
# End cmd2 customization
- def error(self, message):
+ def error(self, message: str) -> None:
"""Custom error override. Allows application to control the error being displayed by argparse"""
if len(self._custom_error_message) > 0:
message = self._custom_error_message
@@ -884,7 +884,7 @@ class ACArgumentParser(argparse.ArgumentParser):
self.print_help()
sys.exit(1)
- def format_help(self):
+ def format_help(self) -> str:
"""Copy of format_help() from argparse.ArgumentParser with tweaks to separately display required parameters"""
formatter = self._get_formatter()
@@ -934,7 +934,7 @@ class ACArgumentParser(argparse.ArgumentParser):
# determine help from format above
return formatter.format_help()
- def _get_nargs_pattern(self, action):
+ def _get_nargs_pattern(self, action) -> str:
# Override _get_nargs_pattern behavior to use the nargs ranges provided by AutoCompleter
if isinstance(action, _RangeAction) and \
action.nargs_min is not None and action.nargs_max is not None:
@@ -947,7 +947,7 @@ class ACArgumentParser(argparse.ArgumentParser):
return nargs_pattern
return super(ACArgumentParser, self)._get_nargs_pattern(action)
- def _match_argument(self, action, arg_strings_pattern):
+ def _match_argument(self, action, arg_strings_pattern) -> int:
# match the pattern for this action to the arg strings
nargs_pattern = self._get_nargs_pattern(action)
match = _re.match(nargs_pattern, arg_strings_pattern)
@@ -963,7 +963,7 @@ class ACArgumentParser(argparse.ArgumentParser):
# This is the official python implementation with a 5 year old patch applied
# See the comment below describing the patch
- def _parse_known_args(self, arg_strings, namespace): # pragma: no cover
+ def _parse_known_args(self, arg_strings, namespace) -> Tuple[argparse.Namespace, List[str]]: # pragma: no cover
# replace arg strings that are file references
if self.fromfile_prefix_chars is not None:
arg_strings = self._read_args_from_files(arg_strings)
diff --git a/cmd2/cmd2.py b/cmd2/cmd2.py
index 4b6185dd..3d2a8afe 100644
--- a/cmd2/cmd2.py
+++ b/cmd2/cmd2.py
@@ -39,7 +39,7 @@ import platform
import re
import shlex
import sys
-from typing import Any, Callable, Dict, List, Optional, Tuple, Union
+from typing import Any, Callable, Dict, List, Mapping, Optional, Tuple, Union
import pyperclip
@@ -940,7 +940,7 @@ class Cmd(cmd.Cmd):
return completions_matches
def index_based_complete(self, text: str, line: str, begidx: int, endidx: int,
- index_dict: Dict[int, Union[Iterable, Callable]],
+ index_dict: Mapping[int, Union[Iterable, Callable]],
all_else: Union[None, Iterable, Callable] = None) -> List[str]:
"""
Tab completes based on a fixed position in the input string
@@ -1950,7 +1950,8 @@ class Cmd(cmd.Cmd):
"""
funcname = self._func_named(statement.command)
if not funcname:
- return self.default(statement)
+ self.default(statement)
+ return
# Since we have a valid command store it in the history
if statement.command not in self.exclude_from_history:
@@ -1959,7 +1960,8 @@ class Cmd(cmd.Cmd):
try:
func = getattr(self, funcname)
except AttributeError:
- return self.default(statement)
+ self.default(statement)
+ return
stop = func(statement)
return stop
@@ -2420,8 +2422,8 @@ Usage: Usage: unalias [-a] name [name ...]
readline.remove_history_item(hlen - 1)
try:
- response = int(response)
- result = fulloptions[response - 1][0]
+ choice = int(response)
+ result = fulloptions[choice - 1][0]
break
except (ValueError, IndexError):
self.poutput("{!r} isn't a valid choice. Pick a number between 1 and {}:\n".format(response,
diff --git a/tests/test_cmd2.py b/tests/test_cmd2.py
index 941f7339..f167793e 100644
--- a/tests/test_cmd2.py
+++ b/tests/test_cmd2.py
@@ -1309,7 +1309,7 @@ def test_select_invalid_option(select_app):
expected = normalize("""
1. sweet
2. salty
-3 isn't a valid choice. Pick a number between 1 and 2:
+'3' isn't a valid choice. Pick a number between 1 and 2:
{} with sweet sauce, yum!
""".format(food))