From e00868e3b12086c3b1f497b4f918b1dda7886eef Mon Sep 17 00:00:00 2001 From: gooker_young Date: Sat, 20 Jun 2026 16:54:47 +0800 Subject: [PATCH] ~ --- src/pyflowx/__init__.py | 8 +- src/pyflowx/cli/__init__.py | 3 - src/pyflowx/cli/pymake.py | 518 +++++++++++++++----------------- src/pyflowx/{cli => }/runner.py | 0 4 files changed, 242 insertions(+), 287 deletions(-) rename src/pyflowx/{cli => }/runner.py (100%) diff --git a/src/pyflowx/__init__.py b/src/pyflowx/__init__.py index 9bda74d..d20b4f4 100644 --- a/src/pyflowx/__init__.py +++ b/src/pyflowx/__init__.py @@ -52,15 +52,14 @@ from __future__ import annotations from .conditions import ( - BuiltinConditions, - Constants, - Condition, IS_LINUX, IS_MACOS, IS_POSIX, IS_WINDOWS, + BuiltinConditions, + Condition, + Constants, ) -from .cli import CliExitCode, CliRunner from .context import Context, build_call_args, describe_injection from .errors import ( CycleError, @@ -75,6 +74,7 @@ from .errors import ( from .executors import run from .graph import Graph from .report import RunReport +from .runner import CliExitCode, CliRunner from .storage import JSONBackend, MemoryBackend, StateBackend from .task import TaskCmd, TaskEvent, TaskResult, TaskSpec, TaskStatus diff --git a/src/pyflowx/cli/__init__.py b/src/pyflowx/cli/__init__.py index c551d2d..e69de29 100644 --- a/src/pyflowx/cli/__init__.py +++ b/src/pyflowx/cli/__init__.py @@ -1,3 +0,0 @@ -from .runner import CliExitCode, CliRunner - -__all__ = ["CliRunner", "CliExitCode"] \ No newline at end of file diff --git a/src/pyflowx/cli/pymake.py b/src/pyflowx/cli/pymake.py index 41e55a4..12740a2 100644 --- a/src/pyflowx/cli/pymake.py +++ b/src/pyflowx/cli/pymake.py @@ -82,312 +82,270 @@ def _build_graphs() -> dict[str, px.Graph]: return { # === 构建命令 === # 构建 Python 包 - "b": px.Graph.from_specs( - [ - px.TaskSpec( - "uv_build", - cmd=conf.BUILD_COMMAND, - conditions=(_UV_CONDITION,), - timeout=conf.TIMEOUT, - ), - ] - ), + "b": px.Graph.from_specs([ + px.TaskSpec( + "uv_build", + cmd=conf.BUILD_COMMAND, + conditions=(_UV_CONDITION,), + timeout=conf.TIMEOUT, + ), + ]), # 构建 Rust 核心模块 - "bc": px.Graph.from_specs( - [ - px.TaskSpec( - "maturin_build", - cmd=_get_maturin_build_command(), - cwd=Path(conf.CORE_DIR), - conditions=(_MATURIN_CONDITION,), - timeout=conf.TIMEOUT, - ), - ] - ), + "bc": px.Graph.from_specs([ + px.TaskSpec( + "maturin_build", + cmd=_get_maturin_build_command(), + cwd=Path(conf.CORE_DIR), + conditions=(_MATURIN_CONDITION,), + timeout=conf.TIMEOUT, + ), + ]), # 构建双包(先 Rust 后 Python) - "ba": px.Graph.from_specs( - [ - px.TaskSpec( - "maturin_build", - cmd=_get_maturin_build_command(), - cwd=Path(conf.CORE_DIR), - conditions=(_MATURIN_CONDITION,), - timeout=conf.TIMEOUT, - ), - px.TaskSpec( - "uv_build", - cmd=conf.BUILD_COMMAND, - conditions=(_UV_CONDITION,), - timeout=conf.TIMEOUT, - depends_on=("maturin_build",), - ), - ] - ), + "ba": px.Graph.from_specs([ + px.TaskSpec( + "maturin_build", + cmd=_get_maturin_build_command(), + cwd=Path(conf.CORE_DIR), + conditions=(_MATURIN_CONDITION,), + timeout=conf.TIMEOUT, + ), + px.TaskSpec( + "uv_build", + cmd=conf.BUILD_COMMAND, + conditions=(_UV_CONDITION,), + timeout=conf.TIMEOUT, + depends_on=("maturin_build",), + ), + ]), # === 安装命令(开发模式) === # 安装 Rust 核心模块 - "ic": px.Graph.from_specs( - [ - px.TaskSpec( - "maturin_dev", - cmd=conf.MATURIN_DEV_COMMAND, - cwd=Path(conf.CORE_DIR), - conditions=(_MATURIN_CONDITION,), - ), - ] - ), + "ic": px.Graph.from_specs([ + px.TaskSpec( + "maturin_dev", + cmd=conf.MATURIN_DEV_COMMAND, + cwd=Path(conf.CORE_DIR), + conditions=(_MATURIN_CONDITION,), + ), + ]), # 安装 Python 主包 - "ip": px.Graph.from_specs( - [ - px.TaskSpec( - "uv_install", - cmd=["uv", "pip", "install", "-e", "."], - conditions=(_UV_CONDITION,), - ), - ] - ), + "ip": px.Graph.from_specs([ + px.TaskSpec( + "uv_install", + cmd=["uv", "pip", "install", "-e", "."], + conditions=(_UV_CONDITION,), + ), + ]), # 安装双包(开发模式) - "ia": px.Graph.from_specs( - [ - px.TaskSpec( - "maturin_dev", - cmd=conf.MATURIN_DEV_COMMAND, - cwd=Path(conf.CORE_DIR), - conditions=(_MATURIN_CONDITION,), - ), - px.TaskSpec( - "uv_install", - cmd=["uv", "pip", "install", "-e", "."], - conditions=(_UV_CONDITION,), - depends_on=("maturin_dev",), - ), - ] - ), + "ia": px.Graph.from_specs([ + px.TaskSpec( + "maturin_dev", + cmd=conf.MATURIN_DEV_COMMAND, + cwd=Path(conf.CORE_DIR), + conditions=(_MATURIN_CONDITION,), + ), + px.TaskSpec( + "uv_install", + cmd=["uv", "pip", "install", "-e", "."], + conditions=(_UV_CONDITION,), + depends_on=("maturin_dev",), + ), + ]), # === 清理命令 === # 清理 Python 构建产物 - "cp": px.Graph.from_specs( - [ - px.TaskSpec( - "git_clean_python", - cmd=["git", "clean", "-xfd", "-e", *conf.DIRS_TO_IGNORE], - conditions=(_GIT_CONDITION,), - ), - ] - ), + "cp": px.Graph.from_specs([ + px.TaskSpec( + "git_clean_python", + cmd=["git", "clean", "-xfd", "-e", *conf.DIRS_TO_IGNORE], + conditions=(_GIT_CONDITION,), + ), + ]), # 清理 Rust 构建产物 - "cc": px.Graph.from_specs( - [ - px.TaskSpec( - "cargo_clean", - cmd=["cargo", "clean"], - cwd=Path(conf.CORE_DIR), - conditions=(_MATURIN_CONDITION,), - ), - ] - ), + "cc": px.Graph.from_specs([ + px.TaskSpec( + "cargo_clean", + cmd=["cargo", "clean"], + cwd=Path(conf.CORE_DIR), + conditions=(_MATURIN_CONDITION,), + ), + ]), # 清理所有构建产物 - "ca": px.Graph.from_specs( - [ - px.TaskSpec( - "cargo_clean", - cmd=["cargo", "clean"], - cwd=Path(conf.CORE_DIR), - conditions=(_MATURIN_CONDITION,), - ), - px.TaskSpec( - "git_clean", - cmd=["git", "clean", "-xfd", "-e", *conf.DIRS_TO_IGNORE], - conditions=(_GIT_CONDITION,), - ), - ] - ), + "ca": px.Graph.from_specs([ + px.TaskSpec( + "cargo_clean", + cmd=["cargo", "clean"], + cwd=Path(conf.CORE_DIR), + conditions=(_MATURIN_CONDITION,), + ), + px.TaskSpec( + "git_clean", + cmd=["git", "clean", "-xfd", "-e", *conf.DIRS_TO_IGNORE], + conditions=(_GIT_CONDITION,), + ), + ]), # === 开发工具 === # 运行测试, 跳过 slow, 并行模式 - "t": px.Graph.from_specs( - [ - px.TaskSpec( + "t": px.Graph.from_specs([ + px.TaskSpec( + "pytest", + cmd=[ "pytest", - cmd=[ - "pytest", - "-m", - "not slow", - "-n", - "8", - "--dist", - "loadfile", - "--color=yes", - "--durations=10", - ], - conditions=(_PYTEST_CONDITION,), - timeout=conf.TIMEOUT, - ), - ] - ), + "-m", + "not slow", + "-n", + "8", + "--dist", + "loadfile", + "--color=yes", + "--durations=10", + ], + conditions=(_PYTEST_CONDITION,), + timeout=conf.TIMEOUT, + ), + ]), # 运行测试, 非并行模式 - "tf": px.Graph.from_specs( - [ - px.TaskSpec( + "tf": px.Graph.from_specs([ + px.TaskSpec( + "pytest", + cmd=[ "pytest", - cmd=[ - "pytest", - "-m", - "not slow", - "--dist", - "loadfile", - "--color=yes", - "--durations=10", - ], - conditions=(_PYTEST_CONDITION,), - timeout=conf.TIMEOUT, - ), - ] - ), + "-m", + "not slow", + "--dist", + "loadfile", + "--color=yes", + "--durations=10", + ], + conditions=(_PYTEST_CONDITION,), + timeout=conf.TIMEOUT, + ), + ]), # 运行测试并生成覆盖率报告, 跳过 slow, 并行模式 - "tc": px.Graph.from_specs( - [ - px.TaskSpec( - "pytest_cov", - cmd=[ - "pytest", - "-m", - "not slow", - "--cov", - "-n", - "auto", - "--dist", - "loadfile", - "--tb=short", - "-v", - "--color=yes", - "--durations=10", - ], - conditions=(_PYTEST_CONDITION,), - timeout=conf.TIMEOUT, - ), - ] - ), + "tc": px.Graph.from_specs([ + px.TaskSpec( + "pytest_cov", + cmd=[ + "pytest", + "-m", + "not slow", + "--cov", + "-n", + "auto", + "--dist", + "loadfile", + "--tb=short", + "-v", + "--color=yes", + "--durations=10", + ], + conditions=(_PYTEST_CONDITION,), + timeout=conf.TIMEOUT, + ), + ]), # 代码格式化与检查 - "lint": px.Graph.from_specs( - [ - px.TaskSpec( - "ruff_check", - cmd=[ - "ruff", - "check", - "--fix", - "--unsafe-fixes", - ], - conditions=(_RUFF_CONDITION,), - timeout=conf.TIMEOUT, - cwd=Path(conf.PROJECT_ROOT), - ), - ] - ), + "lint": px.Graph.from_specs([ + px.TaskSpec( + "ruff_check", + cmd=[ + "ruff", + "check", + "--fix", + "--unsafe-fixes", + ], + conditions=(_RUFF_CONDITION,), + timeout=conf.TIMEOUT, + cwd=Path(conf.PROJECT_ROOT), + ), + ]), # 类型检查 - "typecheck": px.Graph.from_specs( - [ - px.TaskSpec( - "ty_check", - cmd=["ty", "check", "src/bitool"], - conditions=(BuiltinConditions.HAS_APP_INSTALLED("ty"),), - ), - ] - ), + "typecheck": px.Graph.from_specs([ + px.TaskSpec( + "ty_check", + cmd=["ty", "check", "src/bitool"], + conditions=(BuiltinConditions.HAS_APP_INSTALLED("ty"),), + ), + ]), # 构建文档 - "doc": px.Graph.from_specs( - [ - px.TaskSpec( - "sphinx_build", - cmd=conf.DOC_BUILD_COMMAND, - conditions=( - BuiltinConditions.HAS_APP_INSTALLED(conf.DOC_BUILD_TOOL), - ), - ), - ] - ), + "doc": px.Graph.from_specs([ + px.TaskSpec( + "sphinx_build", + cmd=conf.DOC_BUILD_COMMAND, + conditions=(BuiltinConditions.HAS_APP_INSTALLED(conf.DOC_BUILD_TOOL),), + ), + ]), # === 发布命令 === # 发布 Python 主包到 PyPI - "pb": px.Graph.from_specs( - [ - px.TaskSpec( - "publish_python", - cmd=["hatch", "publish"], - cwd=Path(conf.PROJECT_ROOT), - conditions=(_HATCH_CONDITION,), - timeout=conf.TIMEOUT, - ), - ] - ), + "pb": px.Graph.from_specs([ + px.TaskSpec( + "publish_python", + cmd=["hatch", "publish"], + cwd=Path(conf.PROJECT_ROOT), + conditions=(_HATCH_CONDITION,), + timeout=conf.TIMEOUT, + ), + ]), # 发布所有包(先 Rust 后 Python) - "pba": px.Graph.from_specs( - [ - px.TaskSpec( - "publish_rust", - cmd=[ - "twine", - "upload", - "--disable-progress-bar", - conf.CORE_PATTERN, - ], - cwd=Path(conf.CORE_DIR), - conditions=(_MATURIN_CONDITION,), - timeout=conf.TIMEOUT, - ), - px.TaskSpec( - "publish_python", - cmd=["hatch", "publish"], - cwd=Path(conf.PROJECT_ROOT), - conditions=(_HATCH_CONDITION,), - timeout=conf.TIMEOUT, - depends_on=("publish_rust",), - ), - ] - ), + "pba": px.Graph.from_specs([ + px.TaskSpec( + "publish_rust", + cmd=[ + "twine", + "upload", + "--disable-progress-bar", + conf.CORE_PATTERN, + ], + cwd=Path(conf.CORE_DIR), + conditions=(_MATURIN_CONDITION,), + timeout=conf.TIMEOUT, + ), + px.TaskSpec( + "publish_python", + cmd=["hatch", "publish"], + cwd=Path(conf.PROJECT_ROOT), + conditions=(_HATCH_CONDITION,), + timeout=conf.TIMEOUT, + depends_on=("publish_rust",), + ), + ]), # 发布 Rust 核心模块 (maturin publish) - "pbc": px.Graph.from_specs( - [ - px.TaskSpec( - "publish_rust", - cmd=["maturin", "publish"], - cwd=Path(conf.CORE_DIR), - conditions=(_MATURIN_CONDITION,), - timeout=conf.TIMEOUT, - ), - ] - ), + "pbc": px.Graph.from_specs([ + px.TaskSpec( + "publish_rust", + cmd=["maturin", "publish"], + cwd=Path(conf.CORE_DIR), + conditions=(_MATURIN_CONDITION,), + timeout=conf.TIMEOUT, + ), + ]), # === 多版本测试命令 === # 运行多版本 Python 测试 (tox) - "tox": px.Graph.from_specs( - [ - px.TaskSpec( - "tox_run", - cmd=["tox", "-p", "auto"], - conditions=(_TOX_CONDITION,), - timeout=conf.TIMEOUT, - ), - ] - ), + "tox": px.Graph.from_specs([ + px.TaskSpec( + "tox_run", + cmd=["tox", "-p", "auto"], + conditions=(_TOX_CONDITION,), + timeout=conf.TIMEOUT, + ), + ]), # 安装多版本 Python (仅安装不测试) - "tox-install": px.Graph.from_specs( - [ - px.TaskSpec( - "uv_python_install", - cmd=[ - "uv", - "python", - "install", - "3.8", - "3.9", - "3.10", - "3.11", - "3.12", - "3.13", - "3.14", - ], - conditions=(_UV_CONDITION,), - timeout=600, - ), - ] - ), + "tox-install": px.Graph.from_specs([ + px.TaskSpec( + "uv_python_install", + cmd=[ + "uv", + "python", + "install", + "3.8", + "3.9", + "3.10", + "3.11", + "3.12", + "3.13", + "3.14", + ], + conditions=(_UV_CONDITION,), + timeout=600, + ), + ]), } diff --git a/src/pyflowx/cli/runner.py b/src/pyflowx/runner.py similarity index 100% rename from src/pyflowx/cli/runner.py rename to src/pyflowx/runner.py