diff --git a/mapper.py b/mapper.py index 81e8d22..a42a2d6 100644 --- a/mapper.py +++ b/mapper.py @@ -92,7 +92,7 @@ class ModelMapper: try: import folder_paths - self._folder_files = {} + folder_files = {} for folder_type in folder_paths.folder_names_and_paths: if folder_type in EXCLUDED_FOLDER_TYPES: continue @@ -101,13 +101,17 @@ class ModelMapper: except Exception: 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) - self._reverse = {} - for folder_type, files in self._folder_files.items(): + # Build reverse map: filename -> folder_type (last write wins on collision) + reverse = {} + for folder_type, files in folder_files.items(): 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: logger.warning("ModelMapper: failed to build model map", exc_info=True) diff --git a/tests/test_model_mapper.py b/tests/test_model_mapper.py index 0df081a..6bfd339 100644 --- a/tests/test_model_mapper.py +++ b/tests/test_model_mapper.py @@ -53,7 +53,7 @@ def test_unknown_filename_returns_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() fake_node_cls = MagicMock() @@ -72,13 +72,13 @@ def test_extract_models_from_prompt(): } 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) 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() 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"}}} 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) assert results == []