Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,5 @@ dist/
*.egg-info/
__pycache__/
*.pyc
debug/
*.log
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
3 changes: 1 addition & 2 deletions src/script_maa/adapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
Expand Down Expand Up @@ -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(
Expand Down
4 changes: 2 additions & 2 deletions src/script_maa/maa_task/AutoProxy.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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,
Expand Down
4 changes: 2 additions & 2 deletions src/script_maa/maa_task/ManualReview.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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__()
Expand Down
5 changes: 3 additions & 2 deletions src/script_maa/maa_task/ScriptConfig.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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__()
Expand Down
97 changes: 97 additions & 0 deletions tests/test_adapter_storage_boundary.py
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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