From 90b56df198c093a62e288224ac0a8d151d0df4e5 Mon Sep 17 00:00:00 2001 From: qiyinxi Date: Sun, 26 Jul 2026 21:56:47 +0800 Subject: [PATCH 1/2] =?UTF-8?q?refactor(maa):=20=E8=A7=A3=E8=80=A6?= =?UTF-8?q?=E5=AE=BF=E4=B8=BB=E9=81=97=E7=95=99=E9=85=8D=E7=BD=AE=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 任务构造签名由 MultipleConfig 改为 Mapping[uuid.UUID, Any] - adapter 类型校验改用 runtime.type_key,移除 script_types 兼容查询 - 补充存储边界与遗留导入防回归测试 Co-Authored-By: Claude Fable 5 --- src/script_maa/adapter.py | 3 +- src/script_maa/maa_task/AutoProxy.py | 4 +- src/script_maa/maa_task/ManualReview.py | 4 +- src/script_maa/maa_task/ScriptConfig.py | 5 +- tests/test_adapter_storage_boundary.py | 97 +++++++++++++++++++++++++ 5 files changed, 105 insertions(+), 8 deletions(-) diff --git a/src/script_maa/adapter.py b/src/script_maa/adapter.py index c416dd1..46e975f 100644 --- a/src/script_maa/adapter.py +++ b/src/script_maa/adapter.py @@ -3,7 +3,6 @@ from datetime import datetime from typing import Any -from app.core.script_types import is_script_config_compatible_with_type_key from app.models.task import UserItem from app.plugins import ScriptAdapterHooks, ScriptAdapterRuntime from app.plugins.schema_utils import ( @@ -187,7 +186,7 @@ async def check(self, runtime: ScriptAdapterRuntime) -> str: script_config = await runtime.build_script_model() runtime.script_config = script_config - if not is_script_config_compatible_with_type_key(script_config, "MAA"): + if runtime.type_key != "MAA": return "脚本配置类型错误, 不是 MAA 脚本类型" if script_config.get("Emulator", "Id") == "-" or script_config.get( diff --git a/src/script_maa/maa_task/AutoProxy.py b/src/script_maa/maa_task/AutoProxy.py index aa35e6e..5f5f1a9 100644 --- a/src/script_maa/maa_task/AutoProxy.py +++ b/src/script_maa/maa_task/AutoProxy.py @@ -24,13 +24,13 @@ import uuid import asyncio import shutil +from collections.abc import Mapping from pathlib import Path from datetime import datetime, timedelta from typing import Any from app.core import Config from app.models.task import TaskExecuteBase, ScriptItem, LogRecord -from app.models.ConfigBase import MultipleConfig from app.models.emulator import DeviceInfo, DeviceBase from app.services import System from app.tools import skland_sign_in @@ -69,7 +69,7 @@ def __init__( self, script_info: ScriptItem, script_config: Any, - user_config: MultipleConfig[Any], + user_config: Mapping[uuid.UUID, Any], emulator_manager: DeviceBase, notify_service: Any | None = None, notify_channels: list[str] | None = None, diff --git a/src/script_maa/maa_task/ManualReview.py b/src/script_maa/maa_task/ManualReview.py index 980ba48..a6d1b17 100644 --- a/src/script_maa/maa_task/ManualReview.py +++ b/src/script_maa/maa_task/ManualReview.py @@ -24,13 +24,13 @@ import uuid import asyncio import shutil +from collections.abc import Mapping from pathlib import Path from datetime import datetime, timedelta from typing import Any from app.core import Config, Broadcast from app.models.task import TaskExecuteBase, ScriptItem, LogRecord -from app.models.ConfigBase import MultipleConfig from app.models.emulator import DeviceInfo, DeviceBase from app.services import System from app.utils import get_logger, LogMonitor, ProcessManager @@ -49,7 +49,7 @@ def __init__( self, script_info: ScriptItem, script_config: Any, - user_config: MultipleConfig[Any], + user_config: Mapping[uuid.UUID, Any], emulator_manager: DeviceBase, ): super().__init__() diff --git a/src/script_maa/maa_task/ScriptConfig.py b/src/script_maa/maa_task/ScriptConfig.py index d68f007..51d9064 100644 --- a/src/script_maa/maa_task/ScriptConfig.py +++ b/src/script_maa/maa_task/ScriptConfig.py @@ -20,14 +20,15 @@ # Contact: DLmaster_361@163.com import json +import uuid import asyncio import shutil +from collections.abc import Mapping from pathlib import Path from typing import Any from app.core import Config from app.models.task import TaskExecuteBase, ScriptItem -from app.models.ConfigBase import MultipleConfig from app.models.emulator import DeviceBase from app.services import System from app.utils import get_logger, ProcessManager @@ -45,7 +46,7 @@ def __init__( self, script_info: ScriptItem, script_config: Any, - user_config: MultipleConfig[Any], + user_config: Mapping[uuid.UUID, Any], emulator_manager: DeviceBase, ): super().__init__() diff --git a/tests/test_adapter_storage_boundary.py b/tests/test_adapter_storage_boundary.py index 7e8a445..fe1e128 100644 --- a/tests/test_adapter_storage_boundary.py +++ b/tests/test_adapter_storage_boundary.py @@ -1,11 +1,33 @@ from __future__ import annotations +import uuid +from pathlib import Path from types import SimpleNamespace from unittest.mock import AsyncMock import pytest from script_maa.adapter import MaaAdapterHooks +from script_maa.maa_task.AutoProxy import AutoProxyTask +from script_maa.maa_task.ManualReview import ManualReviewTask +from script_maa.maa_task.ScriptConfig import ScriptConfigTask + + +class ConfigStub: + def __init__(self) -> None: + self.values = { + "Info": { + "Name": "测试用户", + "Status": True, + "RemainedDay": -1, + } + } + + def get(self, group: str, name: str): + return self.values[group][name] + + async def set(self, group: str, name: str, value: object) -> None: + self.values[group][name] = value @pytest.mark.asyncio @@ -23,3 +45,78 @@ async def test_prepare_unlocks_storage_when_initialization_fails() -> None: storage.lock.assert_awaited_once() storage.unlock.assert_awaited_once() + + +@pytest.mark.asyncio +async def test_check_uses_runtime_type_key_without_legacy_model_lookup() -> None: + runtime = SimpleNamespace( + mode="AutoProxy", + type_key="SRC", + script_config=None, + build_script_model=AsyncMock(return_value=ConfigStub()), + ) + + result = await MaaAdapterHooks().check(runtime) + + assert result == "脚本配置类型错误, 不是 MAA 脚本类型" + assert runtime.script_config is not None + + +@pytest.mark.parametrize( + "task_class", + (AutoProxyTask, ManualReviewTask, ScriptConfigTask), +) +def test_task_constructors_accept_mapping_user_collection(task_class) -> None: + user_id = uuid.uuid4() + user_config = ConfigStub() + script_info = SimpleNamespace( + task_info=SimpleNamespace(), + user_list=[SimpleNamespace(user_id=str(user_id))], + current_index=0, + ) + + task = task_class( + script_info, + ConfigStub(), + {user_id: user_config}, + SimpleNamespace(), + ) + + assert task.user_config[user_id] is user_config + if task_class is not ScriptConfigTask: + assert task.cur_user_config is user_config + + +@pytest.mark.parametrize( + "relative_path", + ( + "AutoProxy.py", + "ManualReview.py", + "ScriptConfig.py", + ), +) +def test_task_modules_do_not_import_legacy_config_models( + relative_path: str, +) -> None: + module_path = ( + Path(__file__).parents[1] + / "src" + / "script_maa" + / "maa_task" + / relative_path + ) + source = module_path.read_text(encoding="utf-8") + + assert "app.models.ConfigBase" not in source + assert "app.models.config" not in source + + +def test_adapter_does_not_call_legacy_config_compatibility_lookup() -> None: + adapter_path = ( + Path(__file__).parents[1] / "src" / "script_maa" / "adapter.py" + ) + source = adapter_path.read_text(encoding="utf-8") + + assert "app.core.script_types" not in source + assert "app.models.ConfigBase" not in source + assert "app.models.config" not in source From a570a0afe70660c33411b77515a9ba6ef4b7371e Mon Sep 17 00:00:00 2001 From: qiyinxi Date: Sun, 26 Jul 2026 21:56:47 +0800 Subject: [PATCH 2/2] =?UTF-8?q?chore(release):=20=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8D=87=E7=BA=A7=E8=87=B3=200.0.6=20=E5=B9=B6=E5=A2=9E?= =?UTF-8?q?=E8=A1=A5=20.gitignore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - .gitignore 新增 debug/ 与 *.log Co-Authored-By: Claude Fable 5 --- .gitignore | 2 ++ pyproject.toml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 571716c..8eb0932 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ dist/ *.egg-info/ __pycache__/ *.pyc +debug/ +*.log diff --git a/pyproject.toml b/pyproject.toml index be808dc..7c42626 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "automas_script_maa" -version = "0.0.5" +version = "0.0.6" description = "MAA 专项适配" readme = { file = "README.md", content-type = "text/markdown" } requires-python = ">=3.10"