aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author苏向夜 <fu050409@163.com>2024-01-18 14:17:36 +0800
committer苏向夜 <fu050409@163.com>2024-01-18 14:17:36 +0800
commit4058bd2293f4971627c36cc5400fd17938d890c7 (patch)
treeeeebc55c1ee51419e1ab9ab9a746d9c7191b1274 /src
parent9036bf9638f3c69dcd5f25501a58bb8fa0de1712 (diff)
downloadipm-4058bd2293f4971627c36cc5400fd17938d890c7.tar.gz
ipm-4058bd2293f4971627c36cc5400fd17938d890c7.zip
:recycle: refactor(cli): use typer instead orgparser
Diffstat (limited to 'src')
-rw-r--r--src/ipm/__main__.py106
-rw-r--r--src/ipm/api.py49
-rw-r--r--src/ipm/const.py6
-rw-r--r--src/ipm/utils/freeze.py14
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})