fix: atomic ModelMapper build and isolate test NODE_CLASS_MAPPINGS mutations

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-09 18:03:16 +02:00
parent 9891b3ec41
commit 38e95c150a
2 changed files with 14 additions and 10 deletions
+10 -6
View File
@@ -92,7 +92,7 @@ class ModelMapper:
try: try:
import folder_paths import folder_paths
self._folder_files = {} folder_files = {}
for folder_type in folder_paths.folder_names_and_paths: for folder_type in folder_paths.folder_names_and_paths:
if folder_type in EXCLUDED_FOLDER_TYPES: if folder_type in EXCLUDED_FOLDER_TYPES:
continue continue
@@ -101,13 +101,17 @@ class ModelMapper:
except Exception: except Exception:
files = [] files = []
if files: if files:
self._folder_files[folder_type] = frozenset(files) folder_files[folder_type] = frozenset(files)
# Reverse map: filename -> folder_type (last write wins on collision) # Build reverse map: filename -> folder_type (last write wins on collision)
self._reverse = {} reverse = {}
for folder_type, files in self._folder_files.items(): for folder_type, files in folder_files.items():
for f in files: for f in files:
self._reverse[f] = folder_type reverse[f] = folder_type
# Assign atomically only on success
self._folder_files = folder_files
self._reverse = reverse
except Exception: except Exception:
logger.warning("ModelMapper: failed to build model map", exc_info=True) logger.warning("ModelMapper: failed to build model map", exc_info=True)
+4 -4
View File
@@ -53,7 +53,7 @@ def test_unknown_filename_returns_none():
assert m.get_model_type("nonexistent.ckpt") is None assert m.get_model_type("nonexistent.ckpt") is None
def test_extract_models_from_prompt(): def test_extract_models_from_prompt(monkeypatch):
m = _make_mapper() m = _make_mapper()
fake_node_cls = MagicMock() fake_node_cls = MagicMock()
@@ -72,13 +72,13 @@ def test_extract_models_from_prompt():
} }
import nodes as comfy_nodes import nodes as comfy_nodes
comfy_nodes.NODE_CLASS_MAPPINGS = {"CheckpointLoaderSimple": fake_node_cls} monkeypatch.setattr(comfy_nodes, "NODE_CLASS_MAPPINGS", {"CheckpointLoaderSimple": fake_node_cls})
results = m.extract_models_from_prompt(fake_prompt) results = m.extract_models_from_prompt(fake_prompt)
assert ("dream.safetensors", "checkpoints") in results assert ("dream.safetensors", "checkpoints") in results
def test_extract_models_skips_non_list_inputs(): def test_extract_models_skips_non_list_inputs(monkeypatch):
m = _make_mapper() m = _make_mapper()
fake_node_cls = MagicMock() fake_node_cls = MagicMock()
@@ -90,7 +90,7 @@ def test_extract_models_skips_non_list_inputs():
fake_prompt = {"1": {"class_type": "CLIPTextEncode", "inputs": {"text": "hello"}}} fake_prompt = {"1": {"class_type": "CLIPTextEncode", "inputs": {"text": "hello"}}}
import nodes as comfy_nodes import nodes as comfy_nodes
comfy_nodes.NODE_CLASS_MAPPINGS = {"CLIPTextEncode": fake_node_cls} monkeypatch.setattr(comfy_nodes, "NODE_CLASS_MAPPINGS", {"CLIPTextEncode": fake_node_cls})
results = m.extract_models_from_prompt(fake_prompt) results = m.extract_models_from_prompt(fake_prompt)
assert results == [] assert results == []