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

1""" 

2プラグインのテスト用の公開の入口。Graphica を起動せずに試せる。 

3 

4 from graphica.plugin.testing import FakeGraphicaPluginAPI, FakePluginContext, load_plugin_like_graphica 

5""" 

6import os 

7import shutil 

8import tempfile 

9 

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 

14 

15__all__ = [ 

16 "FakeGraphicaPluginAPI", 

17 "FakePluginContext", 

18 "PluginInstallError", 

19 "install_zip_like_graphica", 

20 "load_plugin_like_graphica", 

21] 

22 

23 

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 では見つからない問題を確かめる。 

28 

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] 

46 

47 

48def install_zip_like_graphica(zip_path: str, target_dir: str) -> str: 

49 """ 

50 本体の「プラグインをインストール」と同じ処理で zip を target_dir に展開する。 

51 

52 Returns: 

53 str: インストールされたプラグインのフォルダ名。 

54 Raises: 

55 PluginInstallError: zip の中身が本体の期待する形でない。 

56 """ 

57 return install_plugin_zip(zip_path, target_dir=target_dir)