Skip to content

Commit f159ed0

Browse files
committed
Fix mypy error when passing class method to with_argparser() and as_subcommand_to().
1 parent 5dec613 commit f159ed0

File tree

2 files changed

+18
-52
lines changed

2 files changed

+18
-52
lines changed

cmd2/decorators.py

Lines changed: 17 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111
Optional,
1212
Sequence,
1313
Tuple,
14+
Type,
1415
TypeVar,
1516
Union,
16-
overload,
1717
)
1818

1919
from . import (
@@ -65,19 +65,18 @@ def cat_decorator(func: CommandFunc) -> CommandFunc:
6565
return cat_decorator
6666

6767

68-
##########################
69-
# The _parse_positionals and _arg_swap functions allow for additional positional args to be preserved
70-
# in cmd2 command functions/callables. As long as the 2-ple of arguments we expect to be there can be
71-
# found we can swap out the statement with each decorator's specific parameters
72-
##########################
73-
74-
7568
CommandParent = TypeVar('CommandParent', bound=Union['cmd2.Cmd', CommandSet])
69+
CommandParentType = TypeVar('CommandParentType', bound=Union[Type['cmd2.Cmd'], Type[CommandSet]])
7670

7771

7872
RawCommandFuncOptionalBoolReturn = Callable[[CommandParent, Union[Statement, str]], Optional[bool]]
7973

8074

75+
##########################
76+
# The _parse_positionals and _arg_swap functions allow for additional positional args to be preserved
77+
# in cmd2 command functions/callables. As long as the 2-ple of arguments we expect to be there can be
78+
# found we can swap out the statement with each decorator's specific parameters
79+
##########################
8180
def _parse_positionals(args: Tuple[Any, ...]) -> Tuple['cmd2.Cmd', Union[Statement, str]]:
8281
"""
8382
Helper function for cmd2 decorators to inspect the positional arguments until the cmd2.Cmd argument is found
@@ -265,28 +264,12 @@ def _set_parser_prog(parser: argparse.ArgumentParser, prog: str) -> None:
265264
]
266265

267266

268-
@overload
269-
def with_argparser(
270-
parser: argparse.ArgumentParser,
271-
*,
272-
ns_provider: Optional[Callable[..., argparse.Namespace]] = None,
273-
preserve_quotes: bool = False,
274-
with_unknown_args: bool = False,
275-
) -> Callable[[ArgparseCommandFunc[CommandParent]], RawCommandFuncOptionalBoolReturn[CommandParent]]: ... # pragma: no cover
276-
277-
278-
@overload
279-
def with_argparser(
280-
parser: Callable[[], argparse.ArgumentParser],
281-
*,
282-
ns_provider: Optional[Callable[..., argparse.Namespace]] = None,
283-
preserve_quotes: bool = False,
284-
with_unknown_args: bool = False,
285-
) -> Callable[[ArgparseCommandFunc[CommandParent]], RawCommandFuncOptionalBoolReturn[CommandParent]]: ... # pragma: no cover
286-
287-
288267
def with_argparser(
289-
parser: Union[argparse.ArgumentParser, Callable[[], argparse.ArgumentParser]],
268+
parser: Union[
269+
argparse.ArgumentParser, # existing parser
270+
Callable[[], argparse.ArgumentParser], # function or staticmethod
271+
Callable[[CommandParentType], argparse.ArgumentParser], # Cmd or CommandSet classmethod
272+
],
290273
*,
291274
ns_provider: Optional[Callable[..., argparse.Namespace]] = None,
292275
preserve_quotes: bool = False,
@@ -413,32 +396,14 @@ def cmd_wrapper(*args: Any, **kwargs: Dict[str, Any]) -> Optional[bool]:
413396
return arg_decorator
414397

415398

416-
@overload
417-
def as_subcommand_to(
418-
command: str,
419-
subcommand: str,
420-
parser: argparse.ArgumentParser,
421-
*,
422-
help: Optional[str] = None,
423-
aliases: Optional[List[str]] = None,
424-
) -> Callable[[ArgparseCommandFunc[CommandParent]], ArgparseCommandFunc[CommandParent]]: ... # pragma: no cover
425-
426-
427-
@overload
428-
def as_subcommand_to(
429-
command: str,
430-
subcommand: str,
431-
parser: Callable[[], argparse.ArgumentParser],
432-
*,
433-
help: Optional[str] = None,
434-
aliases: Optional[List[str]] = None,
435-
) -> Callable[[ArgparseCommandFunc[CommandParent]], ArgparseCommandFunc[CommandParent]]: ... # pragma: no cover
436-
437-
438399
def as_subcommand_to(
439400
command: str,
440401
subcommand: str,
441-
parser: Union[argparse.ArgumentParser, Callable[[], argparse.ArgumentParser]],
402+
parser: Union[
403+
argparse.ArgumentParser, # existing parser
404+
Callable[[], argparse.ArgumentParser], # function or staticmethod
405+
Callable[[CommandParentType], argparse.ArgumentParser], # Cmd or CommandSet classmethod
406+
],
442407
*,
443408
help: Optional[str] = None,
444409
aliases: Optional[List[str]] = None,

docs/conf.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@
185185
('py:class', 'ArgparseCommandFunc'),
186186
('py:class', 'argparse._SubParsersAction'),
187187
('py:class', 'cmd2.decorators.CommandParent'),
188+
('py:class', 'cmd2.decorators.CommandParentType'),
188189
('py:class', 'cmd2.utils._T'),
189190
('py:class', 'CommandParent'),
190191
('py:class', 'frame'),

0 commit comments

Comments
 (0)