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" 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