From aa81ffa1770ee32103769c598531b21692985fb5 Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Thu, 14 Dec 2023 18:05:23 +0800 Subject: :recycle: 使用子命令实现命令行 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/infini/__main__.py | 38 +++++++++++++++++++++----------------- src/infini/utils/cli.py | 19 ++++++++++++++----- 2 files changed, 35 insertions(+), 22 deletions(-) (limited to 'src') diff --git a/src/infini/__main__.py b/src/infini/__main__.py index bd6a2b64..47c82b75 100644 --- a/src/infini/__main__.py +++ b/src/infini/__main__.py @@ -16,12 +16,9 @@ def main(): sys.exit(1) path = Path(args.path).resolve() if args.path else Path(os.getcwd()).resolve() - if args.new and args.test: - logger.error("无法确定的指令要求: 你同时指定了new与test指令。") - sys.exit(1) - if args.new: - if path.exists(): + if args.operate == "new": + if path.exists() and not args.force: logger.error("指定的文件夹已经存在!") sys.exit(1) @@ -32,20 +29,27 @@ def main(): logger.success("HydroRoll 规则包模板已创建!") - if args.load: - sys.path.append(str(path)) - importlib.import_module("event") - importlib.import_module("handler") - sys.path.remove(str(path)) - - if args.test: - logger.info(f"开始测试规则包: {str(path)}...") + if args.operate == "test": + logger.info(f"开始测试规则包: {path.name}...") sys.path.append(str(path)) - importlib.import_module("event") - importlib.import_module("handler") - tests = importlib.import_module("tests") - tests.test() + logger.info(f"初始化规则包中...") + try: + importlib.import_module("event") + importlib.import_module("handler") + except Exception as error: + if args.verbose: + logger.exception(error) + logger.critical(f"初始化规则包时出现异常: {error}") + return + try: + errors = importlib.import_module("tests").test() + except Exception as error: + if args.verbose: + logger.exception(error) + logger.critical(f"测试规则包时出现异常: {error}") + return sys.path.remove(str(path)) + logger.info(f"测试规则包 {path.name} 出现 {len(errors)} 个异常, 测试完成.") if __name__ == "__main__": diff --git a/src/infini/utils/cli.py b/src/infini/utils/cli.py index b594cdd8..cb794133 100644 --- a/src/infini/utils/cli.py +++ b/src/infini/utils/cli.py @@ -5,11 +5,20 @@ import sys def parse_args(argv: list[str] | None = None) -> argparse.Namespace: parser = argparse.ArgumentParser(prog="Infini CLI", description="Infini 命令行工具") - parser.add_argument("--new", action="store_true", help="创建一个 Infini 规则包模板") - parser.add_argument("--load", action="store_true", help="导入 Infini 规则包") - parser.add_argument("--test", action="store_true", help="运行 Infini 规则包测试") - parser.add_argument("--gui", action="store_true", help="显示弹窗") - parser.add_argument("--path", help="指定路径") + parser.add_argument("--gui", action="store_true", help="启用 GUI 模式") + + subparsers = parser.add_subparsers(title="功能件", dest="operate") + + # 子命令 `new` + new_parser = subparsers.add_parser("new", help="创建一个 Infini 规则包模板") + new_parser.add_argument("path", help="目标位置") + new_parser.add_argument("-v", "--verbose", action="store_true", help="异常追踪") + new_parser.add_argument("-f", "--force", action="store_true", help="强制创建") + + # 子命令 `test` + test_parser = subparsers.add_parser("test", help="测试 Infini 规则包") + test_parser.add_argument("path", help="目标位置") + test_parser.add_argument("-v", "--verbose", action="store_true", help="异常追踪") args = parser.parse_args(argv if argv else sys.argv[1:]) return args -- cgit v1.2.3-70-g09d2