import importlib import importlib.util import sys from pathlib import Path from types import ModuleType, SimpleNamespace from unittest.mock import patch from blender_test_support import mock_bpy_imports PROJECT_ROOT = Path(__file__).resolve().parents[1] SOURCE_ROOT = PROJECT_ROOT / "src" sys.path.insert(0, str(SOURCE_ROOT)) def load_common_modules(): fake_bpy = ModuleType("bpy") fake_bpy.props = SimpleNamespace( BoolProperty=lambda **options: options, EnumProperty=lambda **options: options, FloatProperty=lambda **options: options, IntProperty=lambda **options: options, StringProperty=lambda **options: options, ) fake_bpy.types = SimpleNamespace(Menu=object, Operator=object) fake_bpy.path = SimpleNamespace(abspath=lambda path: path) fake_bpy.context = SimpleNamespace(scene=None) module_paths = ( ( "anyimage.common.image", PROJECT_ROOT / "src" / "anyimage" / "common" / "image.py", ), ( "anyimage.common.node", PROJECT_ROOT / "src" / "anyimage" / "common" / "node.py", ), ( "anyimage.common.material", PROJECT_ROOT / "src" / "anyimage" / "common" / "material.py", ), ( "anyimage.common.object", PROJECT_ROOT / "src" / "anyimage" / "common" / "object.py", ), ) packages = { name: ModuleType(name) for name in ( "anyimage", "anyimage.operators", "anyimage.common", "anyimage.operators.convert_to_plane", ) } for package in packages.values(): package.__path__ = [] loaded = [] preferences = ModuleType("anyimage.preferences") preferences.configured_material_view_adaptation = lambda: True with mock_bpy_imports(fake_bpy), patch.dict(sys.modules, {"anyimage.preferences": preferences, **packages}): for module_name, module_path in module_paths: specification = importlib.util.spec_from_file_location( module_name, module_path, ) module = importlib.util.module_from_spec(specification) sys.modules[module_name] = module specification.loader.exec_module(module) loaded.append(module) return SimpleNamespace(image=loaded[0], node=loaded[1], material=loaded[2], object=loaded[3])