summaryrefslogtreecommitdiff
path: root/cmd2/command_definition.py
diff options
context:
space:
mode:
authorEric Lin <anselor@gmail.com>2020-06-14 11:05:24 -0400
committeranselor <anselor@gmail.com>2020-08-04 13:38:08 -0400
commit9ad174a173fdc610c661d588c1f42decbb3d7f5e (patch)
treed380a4101d126b0bdc40e49a81832bef06f2efef /cmd2/command_definition.py
parentc88de7dfcfed716e81d06775b6e7929e4e01428c (diff)
downloadcmd2-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.py29
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