From 259ad0f1730a7a96dbeeabf484c21ce6bf4f9a83 Mon Sep 17 00:00:00 2001 From: bymyself Date: Fri, 11 Apr 2025 07:51:45 -0700 Subject: [PATCH 1/4] support 3d model filtering --- folder_paths.py | 8 ++++++-- .../folder_paths_test/filter_by_content_types_test.py | 3 ++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/folder_paths.py b/folder_paths.py index 72c70f594..fccf82b8d 100644 --- a/folder_paths.py +++ b/folder_paths.py @@ -85,6 +85,7 @@ cache_helper = CacheHelper() extension_mimetypes_cache = { "webp" : "image", + "fbx" : "model", } def map_legacy(folder_name: str) -> str: @@ -140,11 +141,14 @@ def get_directory_by_type(type_name: str) -> str | None: return get_input_directory() return None -def filter_files_content_types(files: list[str], content_types: Literal["image", "video", "audio"]) -> list[str]: +def filter_files_content_types(files: list[str], content_types: Literal["image", "video", "audio", "model"]) -> list[str]: """ Example: files = os.listdir(folder_paths.get_input_directory()) - filter_files_content_types(files, ["image", "audio", "video"]) + videos = filter_files_content_types(files, ["video"]) + + Note: + - 'model' in MIME context refers to 3D models, not files containing trained weights and parameters """ global extension_mimetypes_cache result = [] diff --git a/tests-unit/folder_paths_test/filter_by_content_types_test.py b/tests-unit/folder_paths_test/filter_by_content_types_test.py index 423677a60..c6d82b6f0 100644 --- a/tests-unit/folder_paths_test/filter_by_content_types_test.py +++ b/tests-unit/folder_paths_test/filter_by_content_types_test.py @@ -8,7 +8,8 @@ def file_extensions(): return { 'image': ['gif', 'heif', 'ico', 'jpeg', 'jpg', 'png', 'pnm', 'ppm', 'svg', 'tiff', 'webp', 'xbm', 'xpm'], 'audio': ['aif', 'aifc', 'aiff', 'au', 'flac', 'm4a', 'mp2', 'mp3', 'ogg', 'snd', 'wav'], - 'video': ['avi', 'm2v', 'm4v', 'mkv', 'mov', 'mp4', 'mpeg', 'mpg', 'ogv', 'qt', 'webm', 'wmv'] + 'video': ['avi', 'm2v', 'm4v', 'mkv', 'mov', 'mp4', 'mpeg', 'mpg', 'ogv', 'qt', 'webm', 'wmv'], + 'model': ['gltf', 'glb', 'obj', 'mtl', 'fbx', 'stl'] } From 1bad3b8629cbc126c0c0d82fbbeb01a63f07361a Mon Sep 17 00:00:00 2001 From: bymyself Date: Fri, 11 Apr 2025 07:57:52 -0700 Subject: [PATCH 2/4] fix lint error: blank line contains whitespace --- folder_paths.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/folder_paths.py b/folder_paths.py index fccf82b8d..9a525e5a1 100644 --- a/folder_paths.py +++ b/folder_paths.py @@ -146,7 +146,7 @@ def filter_files_content_types(files: list[str], content_types: Literal["image", Example: files = os.listdir(folder_paths.get_input_directory()) videos = filter_files_content_types(files, ["video"]) - + Note: - 'model' in MIME context refers to 3D models, not files containing trained weights and parameters """ From 02fe68121a876fe310000bab8e364b78e3a4f8d9 Mon Sep 17 00:00:00 2001 From: bymyself Date: Fri, 11 Apr 2025 08:04:53 -0700 Subject: [PATCH 3/4] add model extensions to test runner mimetype cache manually --- .../filter_by_content_types_test.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/tests-unit/folder_paths_test/filter_by_content_types_test.py b/tests-unit/folder_paths_test/filter_by_content_types_test.py index c6d82b6f0..189fa44d3 100644 --- a/tests-unit/folder_paths_test/filter_by_content_types_test.py +++ b/tests-unit/folder_paths_test/filter_by_content_types_test.py @@ -1,7 +1,8 @@ import pytest import os import tempfile -from folder_paths import filter_files_content_types +from folder_paths import filter_files_content_types, extension_mimetypes_cache +import mimetypes @pytest.fixture(scope="module") def file_extensions(): @@ -12,6 +13,20 @@ def file_extensions(): 'model': ['gltf', 'glb', 'obj', 'mtl', 'fbx', 'stl'] } +@pytest.fixture(scope="function") +def mock_model_mimetypes(file_extensions): + # Store original cache + original_cache = extension_mimetypes_cache.copy() + + # Add model extensions to cache + for extension in file_extensions['model']: + extension_mimetypes_cache[extension] = 'model' + + yield + + # Restore original cache + extension_mimetypes_cache.clear() + extension_mimetypes_cache.update(original_cache) @pytest.fixture(scope="module") def mock_dir(file_extensions): @@ -23,7 +38,7 @@ def mock_dir(file_extensions): yield directory -def test_categorizes_all_correctly(mock_dir, file_extensions): +def test_categorizes_all_correctly(mock_dir, file_extensions, mock_model_mimetypes): files = os.listdir(mock_dir) for content_type, extensions in file_extensions.items(): filtered_files = filter_files_content_types(files, [content_type]) From e526eab3c5ce8f7600569bc97528d492cf181315 Mon Sep 17 00:00:00 2001 From: bymyself Date: Fri, 11 Apr 2025 09:08:03 -0700 Subject: [PATCH 4/4] use unittest.mock.patch --- .../filter_by_content_types_test.py | 32 +++++++++---------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/tests-unit/folder_paths_test/filter_by_content_types_test.py b/tests-unit/folder_paths_test/filter_by_content_types_test.py index 189fa44d3..5fb1b0e7b 100644 --- a/tests-unit/folder_paths_test/filter_by_content_types_test.py +++ b/tests-unit/folder_paths_test/filter_by_content_types_test.py @@ -2,7 +2,8 @@ import pytest import os import tempfile from folder_paths import filter_files_content_types, extension_mimetypes_cache -import mimetypes +from unittest.mock import patch + @pytest.fixture(scope="module") def file_extensions(): @@ -13,20 +14,6 @@ def file_extensions(): 'model': ['gltf', 'glb', 'obj', 'mtl', 'fbx', 'stl'] } -@pytest.fixture(scope="function") -def mock_model_mimetypes(file_extensions): - # Store original cache - original_cache = extension_mimetypes_cache.copy() - - # Add model extensions to cache - for extension in file_extensions['model']: - extension_mimetypes_cache[extension] = 'model' - - yield - - # Restore original cache - extension_mimetypes_cache.clear() - extension_mimetypes_cache.update(original_cache) @pytest.fixture(scope="module") def mock_dir(file_extensions): @@ -38,7 +25,18 @@ def mock_dir(file_extensions): yield directory -def test_categorizes_all_correctly(mock_dir, file_extensions, mock_model_mimetypes): +@pytest.fixture +def patched_mimetype_cache(file_extensions): + # Mock model file extensions since they may not be in the test-runner system's mimetype cache + new_cache = extension_mimetypes_cache.copy() + for extension in file_extensions["model"]: + new_cache[extension] = "model" + + with patch("folder_paths.extension_mimetypes_cache", new_cache): + yield + + +def test_categorizes_all_correctly(mock_dir, file_extensions, patched_mimetype_cache): files = os.listdir(mock_dir) for content_type, extensions in file_extensions.items(): filtered_files = filter_files_content_types(files, [content_type]) @@ -46,7 +44,7 @@ def test_categorizes_all_correctly(mock_dir, file_extensions, mock_model_mimetyp assert f"sample_{content_type}.{extension}" in filtered_files -def test_categorizes_all_uniquely(mock_dir, file_extensions): +def test_categorizes_all_uniquely(mock_dir, file_extensions, patched_mimetype_cache): files = os.listdir(mock_dir) for content_type, extensions in file_extensions.items(): filtered_files = filter_files_content_types(files, [content_type])