Remove obsolete implementation and simplify project structure

This commit is contained in:
2026-08-21 09:46:50 +08:00
parent b5a2f9690c
commit af5603045c
100 changed files with 365 additions and 365 deletions

View File

@@ -19,7 +19,7 @@ class AddonTest(unittest.TestCase):
cls.remove_modules()
def append_status_bar(draw):
draw._owner = "snapform"
draw._owner = "anyimage"
cls.status_bar_draws.append(draw)
fake_bpy = ModuleType("bpy")
@@ -79,28 +79,28 @@ class AddonTest(unittest.TestCase):
sys.modules["bpy"] = fake_bpy
sys.path.insert(0, str(SOURCE_ROOT))
cls.paths_before_import = tuple(sys.path)
cls.addon = importlib.import_module("snapform")
cls.job_runtime = importlib.import_module("snapform.runtime")
cls.model_operators = importlib.import_module("snapform.operators.models")
cls.image_depth = importlib.import_module("snapform.operators.material")
cls.image_data = importlib.import_module("snapform.operators.image")
cls.addon = importlib.import_module("anyimage")
cls.job_runtime = importlib.import_module("anyimage.runtime")
cls.model_operators = importlib.import_module("anyimage.operators.models")
cls.image_depth = importlib.import_module("anyimage.operators.material")
cls.image_data = importlib.import_module("anyimage.operators.image")
cls.depth_operator = importlib.import_module(
"snapform.operators.depth_plane.operator"
"anyimage.operators.depth_plane.operator"
)
cls.depth_build = importlib.import_module(
"snapform.operators.depth_plane.build"
"anyimage.operators.depth_plane.build"
)
cls.image_background = importlib.import_module("snapform.operators.background")
cls.image_mesh = importlib.import_module("snapform.operators.surface")
cls.balloon = importlib.import_module("snapform.operators.balloon.operator")
cls.image_background = importlib.import_module("anyimage.operators.background")
cls.image_mesh = importlib.import_module("anyimage.operators.surface")
cls.balloon = importlib.import_module("anyimage.operators.balloon.operator")
cls.balloon_geometry = importlib.import_module(
"snapform.operators.balloon.geometry"
"anyimage.operators.balloon.geometry"
)
cls.balloon_depth = importlib.import_module("snapform.operators.balloon.depth")
cls.balloon_depth = importlib.import_module("anyimage.operators.balloon.depth")
cls.balloon_poisson = importlib.import_module(
"snapform.operators.balloon.poisson"
"anyimage.operators.balloon.poisson"
)
cls.balloon_teddy = importlib.import_module("snapform.operators.balloon.teddy")
cls.balloon_teddy = importlib.import_module("anyimage.operators.balloon.teddy")
cls.paths_after_import = tuple(sys.path)
cls.fake_bpy = fake_bpy
@@ -113,7 +113,7 @@ class AddonTest(unittest.TestCase):
@staticmethod
def remove_modules():
for module_name in tuple(sys.modules):
if module_name == "snapform" or module_name.startswith("snapform."):
if module_name == "anyimage" or module_name.startswith("anyimage."):
sys.modules.pop(module_name)
def setUp(self):
@@ -122,7 +122,7 @@ class AddonTest(unittest.TestCase):
device="CUDA",
)
self.fake_bpy.context.preferences.addons = {
"snapform": SimpleNamespace(preferences=preferences)
"anyimage": SimpleNamespace(preferences=preferences)
}
def tearDown(self):
@@ -135,8 +135,8 @@ class AddonTest(unittest.TestCase):
self.fake_bpy.data = SimpleNamespace(
objects=SimpleNamespace(get=lambda _name: None),
)
if hasattr(self.fake_bpy.types.Scene, "snapform_settings"):
del self.fake_bpy.types.Scene.snapform_settings
if hasattr(self.fake_bpy.types.Scene, "anyimage_settings"):
del self.fake_bpy.types.Scene.anyimage_settings
def test_runtime_and_operator_support_modules_have_explicit_boundaries(self):
for name in (
@@ -146,13 +146,13 @@ class AddonTest(unittest.TestCase):
"models.py",
"status_bar.py",
):
self.assertFalse((SOURCE_ROOT / "snapform" / name).exists(), name)
self.assertTrue((SOURCE_ROOT / "snapform" / "runtime.py").is_file())
self.assertFalse((SOURCE_ROOT / "snapform" / "job_runtime.py").exists())
self.assertFalse((SOURCE_ROOT / "snapform" / "client").exists())
self.assertFalse((SOURCE_ROOT / "snapform" / "ui").exists())
self.assertFalse((SOURCE_ROOT / "snapform" / "operators.py").exists())
self.assertFalse((SOURCE_ROOT / "snapform" / "blender").exists())
self.assertFalse((SOURCE_ROOT / "anyimage" / name).exists(), name)
self.assertTrue((SOURCE_ROOT / "anyimage" / "runtime.py").is_file())
self.assertFalse((SOURCE_ROOT / "anyimage" / "job_runtime.py").exists())
self.assertFalse((SOURCE_ROOT / "anyimage" / "client").exists())
self.assertFalse((SOURCE_ROOT / "anyimage" / "ui").exists())
self.assertFalse((SOURCE_ROOT / "anyimage" / "operators.py").exists())
self.assertFalse((SOURCE_ROOT / "anyimage" / "blender").exists())
def test_mps_requires_m4_or_newer(self):
properties = self.addon.properties
@@ -205,7 +205,7 @@ class AddonTest(unittest.TestCase):
self.assertEqual(self.paths_after_import, self.paths_before_import)
self.assertFalse(
any(
name == "snapform.server" or name.startswith("snapform.server.")
name == "anyimage.server" or name.startswith("anyimage.server.")
for name in sys.modules
)
)
@@ -217,7 +217,7 @@ class AddonTest(unittest.TestCase):
def test_operator_modules_use_plain_properties(self):
operators = self.addon.operators
for name in (
"SnapFormJobMixin",
"AnyImageJobMixin",
"ImageInputJobOperator",
"GeometryImageJobOperator",
"Da3ImageJobOperator",
@@ -227,11 +227,11 @@ class AddonTest(unittest.TestCase):
self.assertFalse(hasattr(operators, name), name)
for operator in operators.CLASSES:
for name in getattr(operator, "__annotations__", {}):
self.assertFalse(name.startswith("snapform_"), (operator, name))
self.assertFalse(name.startswith("anyimage_"), (operator, name))
def test_concrete_job_operator_is_the_blender_operator(self):
operator = self.addon.operators.GenerateMoge2Depth
self.assertEqual(operator.bl_idname, "snapform.generate_moge2_depth")
self.assertEqual(operator.bl_idname, "anyimage.generate_moge2_depth")
self.assertIn(self.job_runtime.JobOperatorBase, operator.__mro__)
self.assertIn(self.fake_bpy.types.Operator, operator.__mro__)
@@ -364,7 +364,7 @@ class AddonTest(unittest.TestCase):
)
self.assertTrue(callable(runtime.post_install))
def test_snapform_post_install_is_ordinary_code_using_runtime_request(self):
def test_anyimage_post_install_is_ordinary_code_using_runtime_request(self):
calls = []
fake_runtime = SimpleNamespace(
request=lambda job_type, parameters: calls.append((job_type, parameters))
@@ -378,7 +378,7 @@ class AddonTest(unittest.TestCase):
],
)
def test_snapform_post_install_names_each_failed_model(self):
def test_anyimage_post_install_names_each_failed_model(self):
calls = []
def request(_job_type, parameters):
@@ -476,7 +476,7 @@ class AddonTest(unittest.TestCase):
self.assertNotIn("stages", controller.post_status)
def test_conversion_model_lists_default_to_moge2_vits(self):
properties = importlib.import_module("snapform.properties")
properties = importlib.import_module("anyimage.properties")
catalog = (
{
"key": "SMALL",
@@ -534,7 +534,7 @@ class AddonTest(unittest.TestCase):
def separator(self):
calls.append(("separator", self.enabled))
menu = self.addon.SnapFormImageMenu()
menu = self.addon.AnyImageImageMenu()
menu.layout = Layout()
with (
patch.object(
@@ -543,7 +543,7 @@ class AddonTest(unittest.TestCase):
return_value=True,
),
patch(
"snapform.properties.required_models_ready",
"anyimage.properties.required_models_ready",
return_value=False,
),
):
@@ -551,15 +551,15 @@ class AddonTest(unittest.TestCase):
self.assertEqual(
calls[0],
("snapform.activate_balloon_tool", True),
("anyimage.activate_balloon_tool", True),
)
self.assertIn(
("snapform.download_required_models", True),
("anyimage.download_required_models", True),
calls,
)
self.assertIn(("snapform.convert_to_depth_plane", False), calls)
self.assertIn(("snapform.convert_to_surface", False), calls)
self.assertIn(("snapform.remove_image_background", False), calls)
self.assertIn(("anyimage.convert_to_depth_plane", False), calls)
self.assertIn(("anyimage.convert_to_surface", False), calls)
self.assertIn(("anyimage.remove_image_background", False), calls)
def test_image_menu_keeps_disabled_features_when_environment_is_missing(self):
calls = []
@@ -581,7 +581,7 @@ class AddonTest(unittest.TestCase):
def separator(self):
calls.append(("separator", self.enabled))
menu = self.addon.SnapFormImageMenu()
menu = self.addon.AnyImageImageMenu()
menu.layout = Layout()
with (
patch.object(
@@ -590,7 +590,7 @@ class AddonTest(unittest.TestCase):
return_value=False,
),
patch(
"snapform.properties.required_models_ready",
"anyimage.properties.required_models_ready",
return_value=False,
),
):
@@ -598,14 +598,14 @@ class AddonTest(unittest.TestCase):
self.assertEqual(
calls[0],
("snapform.activate_balloon_tool", True),
("anyimage.activate_balloon_tool", True),
)
self.assertIn(("snapform.install_environment", True), calls)
self.assertIn(("snapform.install_environment_mirror", True), calls)
self.assertNotIn(("snapform.download_required_models", True), calls)
self.assertIn(("snapform.convert_to_depth_plane", False), calls)
self.assertIn(("snapform.convert_to_surface", False), calls)
self.assertIn(("snapform.remove_image_background", False), calls)
self.assertIn(("anyimage.install_environment", True), calls)
self.assertIn(("anyimage.install_environment_mirror", True), calls)
self.assertNotIn(("anyimage.download_required_models", True), calls)
self.assertIn(("anyimage.convert_to_depth_plane", False), calls)
self.assertIn(("anyimage.convert_to_surface", False), calls)
self.assertIn(("anyimage.remove_image_background", False), calls)
def test_balloon_contour_is_smooth_and_evenly_resampled(self):
import numpy as np
@@ -892,7 +892,7 @@ class AddonTest(unittest.TestCase):
self.assertIn("contour_analysis", operator.__annotations__)
self.assertIn("depth_analysis", operator.__annotations__)
self.assertIn("depth_model", operator.__annotations__)
settings = self.addon.properties.SnapFormSettings.__annotations__
settings = self.addon.properties.AnyImageSettings.__annotations__
for name in (
"balloon_contour_analysis",
"balloon_depth_analysis",
@@ -908,7 +908,7 @@ class AddonTest(unittest.TestCase):
request_source = inspect.getsource(self.balloon.AnalyzeBalloon.request)
response_source = inspect.getsource(self.balloon.AnalyzeBalloon.response)
tool_source = inspect.getsource(self.balloon.BalloonTool.draw_settings)
self.assertIn("bpy.ops.snapform.analyze_balloon", execute_source)
self.assertIn("bpy.ops.anyimage.analyze_balloon", execute_source)
self.assertIn("prepare_image_input(", execute_source)
self.assertIn(
"settings.balloon_contour_analysis",
@@ -1103,7 +1103,7 @@ class AddonTest(unittest.TestCase):
self.assertIn("resolution", operator.__annotations__)
self.assertIn("reuse_material", operator.__annotations__)
self.assertIn("source_matrix_data", operator.__annotations__)
settings = self.addon.properties.SnapFormSettings.__annotations__
settings = self.addon.properties.AnyImageSettings.__annotations__
self.assertIn("balloon_mode", settings)
self.assertIn("balloon_thickness", settings)
self.assertIn("balloon_resolution", settings)
@@ -1150,7 +1150,7 @@ class AddonTest(unittest.TestCase):
self.assertIn("return self.execute(context)", modal_source)
self.assertIn('return {"RUNNING_MODAL"}', modal_source)
self.assertIn('return {"PASS_THROUGH"}', modal_source)
self.assertNotIn("bpy.ops.snapform.extract_balloon", modal_source)
self.assertNotIn("bpy.ops.anyimage.extract_balloon", modal_source)
tool = self.balloon.BalloonTool
self.assertEqual(tool.bl_space_type, "VIEW_3D")
@@ -1169,11 +1169,11 @@ class AddonTest(unittest.TestCase):
[
(
"data_path_primary",
"scene.snapform_settings.balloon_thickness",
"scene.anyimage_settings.balloon_thickness",
),
(
"zoom_path",
"scene.snapform_settings.balloon_thickness_radial_zoom",
"scene.anyimage_settings.balloon_thickness_radial_zoom",
),
],
)
@@ -1182,11 +1182,11 @@ class AddonTest(unittest.TestCase):
[
(
"data_path_primary",
"scene.snapform_settings.balloon_resolution",
"scene.anyimage_settings.balloon_resolution",
),
(
"zoom_path",
"scene.snapform_settings.balloon_resolution_radial_zoom",
"scene.anyimage_settings.balloon_resolution_radial_zoom",
),
],
)
@@ -1281,20 +1281,20 @@ class AddonTest(unittest.TestCase):
)
marked = MarkedMaterial(
"unrelated-name",
snapform_balloon_material=True,
snapform_source_image=color_image,
anyimage_balloon_material=True,
anyimage_source_image=color_image,
)
marked_other = MarkedMaterial(
"cow",
snapform_balloon_material=True,
snapform_source_image=other_image,
anyimage_balloon_material=True,
anyimage_source_image=other_image,
)
normal_image = SimpleNamespace(name="cow.normal")
marked_normal = MarkedMaterial(
"depth-material",
snapform_balloon_material=True,
snapform_source_image=color_image,
snapform_balloon_normal_image=normal_image,
anyimage_balloon_material=True,
anyimage_source_image=color_image,
anyimage_balloon_normal_image=normal_image,
)
wrong_group = SimpleNamespace(
name="cow",
@@ -1393,7 +1393,7 @@ class AddonTest(unittest.TestCase):
return_value=False,
),
patch(
"snapform.properties.required_models_ready",
"anyimage.properties.required_models_ready",
return_value=models_ready,
),
):
@@ -1414,7 +1414,7 @@ class AddonTest(unittest.TestCase):
self.assertEqual(operator.poll(context), expected)
def test_ui_reads_required_model_files_without_starting_server(self):
properties = importlib.import_module("snapform.properties")
properties = importlib.import_module("anyimage.properties")
with tempfile.TemporaryDirectory() as directory:
root = Path(directory)
moge = root / "models" / "moge-2-vits-normal-onnx"
@@ -1516,7 +1516,7 @@ class AddonTest(unittest.TestCase):
],
)
self.assertEqual(len(self.status_bar_draws), 1)
self.assertEqual(self.status_bar_draws[0]._owner, "snapform")
self.assertEqual(self.status_bar_draws[0]._owner, "anyimage")
self.addon.unregister()
self.assertEqual(self.registered, [])
@@ -1545,7 +1545,7 @@ class AddonTest(unittest.TestCase):
self.assertEqual(calls[0][1]["factor"], 0.4)
self.assertEqual(calls[0][1]["text"], "Working")
self.assertEqual(calls[1], ("operator", "snapform.cancel_job"))
self.assertEqual(calls[1], ("operator", "anyimage.cancel_job"))
def test_moge_depth_request_is_written_on_the_operator(self):
operator = self.addon.operators.GenerateMoge2Depth()
@@ -1555,7 +1555,7 @@ class AddonTest(unittest.TestCase):
operator.resolution_level = 6
operator.remove_background = False
settings = SimpleNamespace(video_frames=12)
context = SimpleNamespace(scene=SimpleNamespace(snapform_settings=settings))
context = SimpleNamespace(scene=SimpleNamespace(anyimage_settings=settings))
with (
patch.object(self.depth_operator, "require_environment"),
@@ -1603,11 +1603,11 @@ class AddonTest(unittest.TestCase):
settings = SimpleNamespace(video_frames=1)
context = SimpleNamespace(
object=source_object,
scene=SimpleNamespace(snapform_settings=settings),
scene=SimpleNamespace(anyimage_settings=settings),
)
calls = []
self.fake_bpy.ops = SimpleNamespace(
snapform=SimpleNamespace(
anyimage=SimpleNamespace(
generate_moge2_depth=lambda **options: (
calls.append(options) or {"RUNNING_MODAL"}
)
@@ -1623,7 +1623,7 @@ class AddonTest(unittest.TestCase):
self.assertEqual(calls[0]["resolution_level"], 7)
self.assertEqual(calls[0]["source_object_name"], "Reference")
self.assertFalse(any(key.startswith("snapform_") for key in calls[0]))
self.assertFalse(any(key.startswith("anyimage_") for key in calls[0]))
if __name__ == "__main__":