diff options
| author | 2024-01-18 14:17:36 +0800 | |
|---|---|---|
| committer | 2024-01-18 14:17:36 +0800 | |
| commit | 4058bd2293f4971627c36cc5400fd17938d890c7 (patch) | |
| tree | eeebc55c1ee51419e1ab9ab9a746d9c7191b1274 /src | |
| parent | 9036bf9638f3c69dcd5f25501a58bb8fa0de1712 (diff) | |
| download | ipm-4058bd2293f4971627c36cc5400fd17938d890c7.tar.gz ipm-4058bd2293f4971627c36cc5400fd17938d890c7.zip | |
:recycle: refactor(cli): use typer instead orgparser
Diffstat (limited to 'src')
| -rw-r--r-- | src/ipm/__main__.py | 106 | ||||
| -rw-r--r-- | src/ipm/api.py | 49 | ||||
| -rw-r--r-- | src/ipm/const.py | 6 | ||||
| -rw-r--r-- | src/ipm/utils/freeze.py | 14 |
4 files changed, 110 insertions, 65 deletions
diff --git a/src/ipm/__main__.py b/src/ipm/__main__.py index e760939..753c3a7 100644 --- a/src/ipm/__main__.py +++ b/src/ipm/__main__.py @@ -1,54 +1,62 @@ -from .api import install, extract, build +from . import api from .exceptions import IpmException from .logging import logger - -import argparse -import sys - - -def main(): - parser = argparse.ArgumentParser( - prog="ipm", description="Infini 包管理器", exit_on_error=False - ) - subparsers = parser.add_subparsers( - title="指令", dest="command", metavar="<operation>" - ) - - # Install command - install_parser = subparsers.add_parser("install", help="安装一个 Infini 规则包到此计算机") - install_parser.add_argument("uri", help="Infini 包的统一资源标识符") - install_parser.add_argument("--index", help="IPM 包服务器") - - # Extract command - extract_parser = subparsers.add_parser("extract", help="解压缩 Infini 包") - extract_parser.add_argument("package", help="Infini 包路径") - extract_parser.add_argument( - "--dist", - default=".", - help="特定的解压路径 (默认: 当前工作目录)", - ) - - # Build command - build_parser = subparsers.add_parser("build", help="打包 Infini 规则包") - build_parser.add_argument("package", nargs="?", help="Infini 库路径", default=".") - - args = parser.parse_args(sys.argv[1:] or ["-h"]) - - if args.command == "install": - try: - install(args.uri, args.index, echo=True) - except IpmException as error: - return logger.error(error) - elif args.command == "extract": - try: - extract(args.package, args.dist, echo=True) - except IpmException as error: - return logger.error(error) - elif args.command == "build": - try: - build(args.package, echo=True) - except IpmException as error: - return logger.error(error) +import typer + +main = typer.Typer( + name="ipm", help="Infini 包管理器", no_args_is_help=True, add_completion=False +) + + +@main.command() +def install( + uri: str = typer.Argument(help="Infini 包的统一资源标识符"), + index: str = typer.Option(None, help="IPM 包服务器"), +): + """安装一个 Infini 规则包到此计算机""" + try: + api.install(uri, index, echo=True) + except IpmException as error: + logger.error(error) + + +@main.command() +def extract( + package: str = typer.Argument(help="Infini 项目路径"), + dist: str = typer.Option(".", help="特定的解压路径"), +): + """解压缩 Infini 包""" + try: + api.extract(package, dist, echo=True) + except IpmException as error: + logger.error(error) + + +@main.command() +def init(force: bool = typer.Option(None, "--force", "-f", help="强制初始化")): + """初始化一个 Infini 项目""" + try: + api.init(".", force, echo=True) + except IpmException as error: + logger.error(error) + + +@main.command() +def new(package: str = typer.Argument(help="Infini 项目路径")): + """新建一个 Infini 项目""" + try: + api.new(package, echo=True) + except IpmException as error: + logger.error(error) + + +@main.command() +def build(package: str = typer.Argument(".", help="Infini 项目路径")): + """打包 Infini 规则包""" + try: + api.build(package, echo=True) + except IpmException as error: + logger.error(error) if __name__ == "__main__": diff --git a/src/ipm/api.py b/src/ipm/api.py index 0a83d6e..caeca6d 100644 --- a/src/ipm/api.py +++ b/src/ipm/api.py @@ -1,25 +1,58 @@ from pathlib import Path from .typing import StrPath from .utils import freeze, urlparser, loader -from .models.ipk import InfiniPackage +from .models.ipk import InfiniPackage, InfiniFrozenPackage from .exceptions import FileTypeMismatch, TomlLoadFailed, FileNotFoundError from .const import INDEX, HOME -from .logging import info, success +from .logging import info, success, warning, error + +import toml + + +def init(source_path: StrPath, force: bool = False, echo: bool = False) -> None: + source_path = Path(source_path).resolve() + if (toml_path := (source_path / "infini.toml")).exists() and not force: + warning(f"无法在已经初始化的地址重新初始化, 如果你的确希望重新初始化, 请使用[ipm init --force].", echo) + + toml_file = toml_path.open("w", encoding="utf-8") + toml.dump( + { + "infini": { + "name": source_path.name, + "version": "0.1.0", + "description": "COC 规则包", + "license": "MIT", + }, + "requirements": {}, + "dependencies": {}, + }, + toml_file, + ) + toml_file.close() + + (source_path / "src").mkdir(parents=True, exist_ok=True) + (source_path / "src" / "__init__.py").write_text( + "# Initialized `__init__.py` generated by ipm." + ) def new(dist_path: StrPath, echo: bool = False) -> None: - ... + info("初始化环境中...") + path = Path(dist_path).resolve() + if path.exists(): + return warning(f"路径[{path}]已经存在.", echo) + path.mkdir(parents=True, exist_ok=True) + return init(path, echo=echo) -def build(source_path: StrPath, echo: bool = False) -> None: +def build(source_path: StrPath, echo: bool = False) -> InfiniFrozenPackage: info("检查构建环境...", echo) try: ipk = InfiniPackage(source_path) info(f"包[{ipk.name}]构建环境载入完毕.", echo) - except TomlLoadFailed as error: - error(f"环境存在异常: {error}", echo) - return - freeze.build_ipk(ipk) + except TomlLoadFailed as e: + return error(f"环境存在异常: {e}", echo) + return freeze.build_ipk(ipk, echo) def extract( diff --git a/src/ipm/const.py b/src/ipm/const.py index c682fdd..d31b10a 100644 --- a/src/ipm/const.py +++ b/src/ipm/const.py @@ -1,8 +1,12 @@ from pathlib import Path +# 控制参数 DEBUG = False +# 初始化参数 INDEX = "https://ipm.hydroroll.team/index/" HOME = Path.home() / ".ipm" / "src" + +# 文本参数 ATTENSION = """# This file is @generated by IPM. -# It is not intended for manual editing.""" +# It is not intended for manual editing.\n\n""" diff --git a/src/ipm/utils/freeze.py b/src/ipm/utils/freeze.py index ef3deb2..ef02473 100644 --- a/src/ipm/utils/freeze.py +++ b/src/ipm/utils/freeze.py @@ -11,7 +11,7 @@ import shutil def build_ipk(ipk: InfiniPackage, echo: bool = False) -> InfiniFrozenPackage: - info("正在初始化开发环境...") + info("正在初始化开发环境...", echo) build_dir = ipk.source_path / "build" src_path = ipk.source_path / "src" dist_path = ipk.source_path / "dist" @@ -25,22 +25,22 @@ def build_ipk(ipk: InfiniPackage, echo: bool = False) -> InfiniFrozenPackage: dist_path.mkdir(parents=True, exist_ok=True) build_dir.mkdir(parents=True, exist_ok=True) - info("开发环境构建完成, 开始复制工程文件...") + info("开发环境构建完成, 开始复制工程文件...", echo) shutil.copytree(src_path, build_dir / "src") shutil.copy2(ipk.source_path / "infini.toml", build_dir / "infini.toml") - info("工程文件复制完毕, 开始打包[ipk]文件...") + info("工程文件复制完毕, 开始打包[ipk]文件...", echo) _freeze.create_tar_gz( str(build_dir), str(ifp_path), ) - success(f"打包文件已存至[{ifp_path}].") - info("开始创建SHA256验证文件...") + success(f"打包文件已存至[{ifp_path}].", echo) + info("开始创建SHA256验证文件...", echo) hash_bytes = ifp_hash(ifp_path) - info(f"文件SHA256值为[{hash_bytes.hex()}].") + info(f"文件SHA256值为[{hash_bytes.hex()}].", echo) (dist_path / ipk.hash_name).write_bytes(hash_bytes) - success(f"包[{ipk.name}]构建成功.") + success(f"包[{ipk.name}]构建成功.", echo) return InfiniFrozenPackage(source_path=ifp_path, **{"name": ipk.name}) |
