mirror of
https://github.com/Shu-Ying/main_plugin_farm.git
synced 2026-10-28 05:00:01 +08:00
71 lines
2.4 KiB
Python
71 lines
2.4 KiB
Python
"""在生成清单前统一格式化内存中的发布代码,不修改开发源文件。"""
|
|
|
|
import importlib.util
|
|
import subprocess
|
|
import sys
|
|
import tempfile
|
|
from pathlib import Path, PurePosixPath
|
|
|
|
|
|
def format_generated(root, files):
|
|
"""仅整理导入和代码格式;成功后一次性更新文件集合。"""
|
|
root = Path(root).resolve()
|
|
if importlib.util.find_spec("ruff") is None:
|
|
raise RuntimeError(
|
|
"Ruff is required to build plugins. Install with: "
|
|
"python -m pip install -r requirements-build.txt"
|
|
)
|
|
selected = {}
|
|
for name, content in files.items():
|
|
if not name.endswith(".py"):
|
|
continue
|
|
path = PurePosixPath(name)
|
|
if (
|
|
path.is_absolute()
|
|
or "\\" in name
|
|
or ":" in name
|
|
or any(part in ("", ".", "..") for part in name.split("/"))
|
|
):
|
|
raise ValueError("Unsafe generated Python path")
|
|
selected[name] = content
|
|
if not selected:
|
|
return
|
|
with tempfile.TemporaryDirectory(prefix="farm-ruff-") as temporary:
|
|
staging = Path(temporary)
|
|
for name, content in selected.items():
|
|
target = staging / name
|
|
target.parent.mkdir(parents=True, exist_ok=True)
|
|
target.write_bytes(content)
|
|
common = ["--config", str(root / "pyproject.toml"), "--no-cache"]
|
|
for arguments in (
|
|
["check", "--select", "I", "--fix"],
|
|
["format"],
|
|
["check", "--select", "I"],
|
|
["format", "--check"],
|
|
):
|
|
result = subprocess.run(
|
|
[
|
|
sys.executable,
|
|
"-m",
|
|
"ruff",
|
|
*arguments,
|
|
*common,
|
|
str(staging),
|
|
],
|
|
cwd=root,
|
|
capture_output=True,
|
|
text=True,
|
|
encoding="utf-8",
|
|
errors="replace",
|
|
timeout=60,
|
|
)
|
|
if result.returncode:
|
|
raise RuntimeError(
|
|
"Generated Python failed Ruff; install the pinned "
|
|
"requirements-build.txt dependencies.\n"
|
|
+ result.stdout
|
|
+ result.stderr
|
|
)
|
|
formatted = {name: (staging / name).read_bytes() for name in selected}
|
|
files.update(formatted)
|