Coverage for graphica/plugin/testing.py: 94.4%
18 statements
« prev ^ index » next coverage.py v7.16.2, created at 2026-10-12 16:38 +0000
« prev ^ index » next coverage.py v7.16.2, created at 2026-10-12 16:38 +0000
1"""
2プラグインのテスト用の公開の入口。Graphica を起動せずに試せる。
4 from graphica.plugin.testing import FakeGraphicaPluginAPI, FakePluginContext, load_plugin_like_graphica
5"""
6import os
7import shutil
8import tempfile
10from graphica.core.plugin_api import GraphicaPluginAPI, PluginManager
11from graphica.core.plugin_install import PluginInstallError, install_plugin_zip
12from graphica.core.plugin_testing import FakeGraphicaPluginAPI, FakePluginContext
13from typing import Any
15__all__ = [
16 "FakeGraphicaPluginAPI",
17 "FakePluginContext",
18 "PluginInstallError",
19 "install_zip_like_graphica",
20 "load_plugin_like_graphica",
21]
24def load_plugin_like_graphica(plugin_folder: str, work_dir: str | None = None) -> tuple[GraphicaPluginAPI, dict[str, Any]]:
25 """
26 本体と同じ経路(manifest の検証 → import → register(api))でプラグインを読み込む。
27 相対 import の誤りや api_version の不一致など、偽物の API では見つからない問題を確かめる。
29 Args:
30 plugin_folder (str): plugin.json と __init__.py のあるフォルダ。
31 work_dir (str | None): 写しを置く場所(pytest の tmp_path など)。省略時は一時フォルダ。
32 Returns:
33 tuple[GraphicaPluginAPI, dict]: 登録を受けた API と、読み込み結果
34 ({"name", "info", "error", "disabled"}。成功なら error は None)。
35 フック単位の失敗は api.registration_errors にある。
36 """
37 plugin_folder = os.path.normpath(plugin_folder)
38 name = os.path.basename(plugin_folder)
39 # 本体は探索フォルダの中のサブフォルダをすべてプラグインとみなすので、対象だけを写した場所で読む。
40 plugins_dir = tempfile.mkdtemp(prefix="graphica_plugins_", dir=work_dir)
41 shutil.copytree(plugin_folder, os.path.join(plugins_dir, name),
42 ignore=shutil.ignore_patterns("__pycache__"))
43 api = GraphicaPluginAPI()
44 records = PluginManager(plugins_dir).load_all(api)
45 return api, records[0]
48def install_zip_like_graphica(zip_path: str, target_dir: str) -> str:
49 """
50 本体の「プラグインをインストール」と同じ処理で zip を target_dir に展開する。
52 Returns:
53 str: インストールされたプラグインのフォルダ名。
54 Raises:
55 PluginInstallError: zip の中身が本体の期待する形でない。
56 """
57 return install_plugin_zip(zip_path, target_dir=target_dir)