from my_logger import Logger
from testapp.command.command_factory import (CommandFactory, is_predefined_command_name,
validate_command, parse_cmd_args)
from testapp.constants import INVALID_COMMAND
from testapp.scripts import get_test_scripts, run_script
[docs]
EXECUTE_VALID_WO_ARGS = 2
[docs]
EXECUTE_VALID_WITH_ARGS = 1
[docs]
class TestShell:
"""
TestShell 클래스는 명령어를 실행하고, 사전 정의된 명령어 또는 테스트 스크립트를 실행하는 기능을 제공합니다.
"""
[docs]
def execute(self, cmd: str) -> int:
"""
주어진 명령어를 실행합니다.
Args:
cmd (str): 실행할 명령어
Returns:
int: 명령어 실행 결과 코드
- EXECUTE_VALID_WO_ARGS (2): 인자가 없는 유효한 명령어
- EXECUTE_VALID_WITH_ARGS (1): 인자가 있는 유효한 명령어
- EXECUTE_INVALID (0): 유효하지 않은 명령어
"""
if len(cmd) == 0:
return EXECUTE_EMPTY
cmd = cmd.strip()
cmd_option = cmd.split()[0]
if is_predefined_command_name(cmd_option):
if not validate_command(cmd):
return EXECUTE_INVALID
cmd_option, cmd_args = parse_cmd_args(cmd)
cmd_obj = CommandFactory.get_command_instance(cmd_option)
cmd_obj.run(*cmd_args)
return EXECUTE_VALID_WITH_ARGS if cmd_args else EXECUTE_VALID_WO_ARGS
else: # test script 중에 있으면 동작
ts_dict = get_test_scripts() # UpperCamelCase
ts_dict.update({k.lower(): v for k, v in ts_dict.items()}) # lower case 도 포함
if cmd_option in ts_dict.keys():
success = run_script(ts_dict[cmd_option], use_print=True)
Logger().info('PASS' if success else 'FAIL!')
return EXECUTE_VALID_WO_ARGS if success else EXECUTE_FAIL
return EXECUTE_INVALID
[docs]
def main():
"""
TestShell의 메인 루프를 실행합니다.
사용자가 명령어를 입력하고 이를 처리합니다.
"""
ts = TestShell()
while True:
cmd = input("> ")
try:
if ts.execute(cmd) == EXECUTE_INVALID:
Logger().info(INVALID_COMMAND)
except Exception as e:
err_message = str(e) if str(e) else INVALID_COMMAND
Logger().error(err_message)