diff options
author | Eric Lin <anselor@gmail.com> | 2020-06-14 11:05:24 -0400 |
---|---|---|
committer | anselor <anselor@gmail.com> | 2020-08-04 13:38:08 -0400 |
commit | 9ad174a173fdc610c661d588c1f42decbb3d7f5e (patch) | |
tree | d380a4101d126b0bdc40e49a81832bef06f2efef /cmd2/command_definition.py | |
parent | c88de7dfcfed716e81d06775b6e7929e4e01428c (diff) | |
download | cmd2-git-9ad174a173fdc610c661d588c1f42decbb3d7f5e.tar.gz |
Fixes issue with locating help_ annd complete_ functions when autoloading command functions
Adds handling of some edge cases. More thorough test coverage.
Diffstat (limited to 'cmd2/command_definition.py')
-rw-r--r-- | cmd2/command_definition.py | 29 |
1 files changed, 8 insertions, 21 deletions
diff --git a/cmd2/command_definition.py b/cmd2/command_definition.py index 115cef64..6996bd9d 100644 --- a/cmd2/command_definition.py +++ b/cmd2/command_definition.py @@ -5,17 +5,16 @@ Supports the definition of commands in separate classes to be composed into cmd2 import functools from typing import ( Callable, + Dict, Iterable, - List, Optional, - Tuple, Type, Union, ) -from .constants import COMMAND_FUNC_PREFIX, HELP_FUNC_PREFIX, COMPLETER_FUNC_PREFIX +from .constants import COMMAND_FUNC_PREFIX # Allows IDEs to resolve types without impacting imports at runtime, breaking circular dependency issues -try: +try: # pragma: no cover from typing import TYPE_CHECKING if TYPE_CHECKING: from .cmd2 import Cmd, Statement @@ -23,7 +22,7 @@ try: except ImportError: pass -_UNBOUND_COMMANDS = [] # type: List[Tuple[str, Callable, Optional[Callable], Optional[Callable]]] +_REGISTERED_COMMANDS = {} # type: Dict[str, Callable] """ Registered command tuples. (command, do_ function, complete_ function, help_ function """ @@ -69,24 +68,12 @@ def register_command(cmd_func: Callable[['Cmd', Union['Statement', 'argparse.Nam """ assert cmd_func.__name__.startswith(COMMAND_FUNC_PREFIX), 'Command functions must start with `do_`' - import inspect - cmd_name = cmd_func.__name__[len(COMMAND_FUNC_PREFIX):] - cmd_completer = None - cmd_help = None - - module = inspect.getmodule(cmd_func) - - module_funcs = [mf for mf in inspect.getmembers(module) if inspect.isfunction(mf[1])] - for mf in module_funcs: - if mf[0] == COMPLETER_FUNC_PREFIX + cmd_name: - cmd_completer = mf[1] - elif mf[0] == HELP_FUNC_PREFIX + cmd_name: - cmd_help = mf[1] - if cmd_completer is not None and cmd_help is not None: - break - _UNBOUND_COMMANDS.append((cmd_name, cmd_func, cmd_completer, cmd_help)) + if cmd_name not in _REGISTERED_COMMANDS: + _REGISTERED_COMMANDS[cmd_name] = cmd_func + else: + raise KeyError('Command ' + cmd_name + ' is already registered') return cmd_func |