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:
@@ -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)
|
||||||
|
|||||||
@@ -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 == []
|
||||||
|
|||||||
Reference in New Issue
Block a user