From 57b79ba2088ecd1564ff23bae3755f58246a3e8e Mon Sep 17 00:00:00 2001 From: Dariusz L Date: Sun, 2 Aug 2026 04:03:09 +0200 Subject: [PATCH] refactor: remove dead compatibility shims --- __init__.py | 41 --------------------- core/__init__.py | 11 ------ core/downloader.py | 34 ------------------ core/metadata_audit.py | 1 - core/metadata_builder.py | 1 - core/path_utils.py | 24 ------------- core/sources/__init__.py | 51 +-------------------------- core/sources/civitai.py | 9 ----- tests/test_downloader_metadata.py | 18 +++++----- tests/test_refactoring_targets.py | 20 +++++------ tests/test_refactoring_unification.py | 9 ++--- tests/test_resolver_robustness.py | 11 +++--- tests/test_unified_helpers.py | 6 ++-- 13 files changed, 28 insertions(+), 208 deletions(-) diff --git a/__init__.py b/__init__.py index 0b9aafa..98768d7 100644 --- a/__init__.py +++ b/__init__.py @@ -23,56 +23,15 @@ if not __package__ or __package__ == "": current_module.__path__ = [this_dir] from .core import node_definitions as _node_definitions from .core.extension import ModelResolverExtension -from .core.file_manager import ( - FileManagerError, - FileManagerUnavailableError, - UnsupportedFileManagerPlatformError, - normalize_file_manager_path, - open_in_file_manager, -) from .core.log_system import create_module_logger -from .core.path_utils import ( - MODEL_RESOLVER_METADATA_SCHEMA, - MODEL_RESOLVER_METADATA_SCHEMA_VERSION, - get_filename_from_path, - get_model_resolver_sidecar_path, - get_safe_model_resolver_sidecar_path, -) -from .core.progress import JobProgressTracker -from .core.version import ( - PROJECT_GITHUB_PYPROJECT_URL, - PROJECT_GITHUB_URL, - PROJECT_VERSION_CACHE_TTL_SECONDS, - PROJECT_VERSION_FILE, - _extract_project_version, - _get_local_project_version, - _get_project_version_info, - _project_version_cache, - _project_version_cache_lock, - _version_sort_key, -) # Web directory for JavaScript interface WEB_DIRECTORY = "./web" ComfyExtension = _node_definitions.ComfyExtension io = _node_definitions.io -ModelResolverDependencyNode = _node_definitions.ModelResolverDependencyNode -MODEL_RESOLVER_DEPENDENCY_NODE_TYPE = ( - _node_definitions.MODEL_RESOLVER_DEPENDENCY_NODE_TYPE -) -MODEL_RESOLVER_DEPENDENCY_NODE_DISPLAY_NAME = ( - _node_definitions.MODEL_RESOLVER_DEPENDENCY_NODE_DISPLAY_NAME -) -MODEL_RESOLVER_DEPENDENCY_NODE_CATEGORY = ( - _node_definitions.MODEL_RESOLVER_DEPENDENCY_NODE_CATEGORY -) -MODEL_RESOLVER_DEPENDENCY_NODE_DESCRIPTION = ( - _node_definitions.MODEL_RESOLVER_DEPENDENCY_NODE_DESCRIPTION -) if ComfyExtension is not None and io is not None: - ModelResolverNodeExtension = _node_definitions.ModelResolverNodeExtension comfy_entrypoint = _node_definitions.comfy_entrypoint __all__ = ["WEB_DIRECTORY", "comfy_entrypoint"] else: diff --git a/core/__init__.py b/core/__init__.py index e8f69a8..2e4a055 100644 --- a/core/__init__.py +++ b/core/__init__.py @@ -10,14 +10,3 @@ Modules: - downloader: Model downloading with progress tracking - sources: Search integrations (HuggingFace, CivitAI, popular models) """ - -from .matcher import find_matches -from .resolver import analyze_and_find_matches, apply_resolution -from .scanner import get_model_files - -__all__ = [ - "analyze_and_find_matches", - "apply_resolution", - "find_matches", - "get_model_files", -] diff --git a/core/downloader.py b/core/downloader.py index 6e748e5..62c2609 100644 --- a/core/downloader.py +++ b/core/downloader.py @@ -762,16 +762,6 @@ def build_model_resolver_metadata( return payload -def build_lora_manager_metadata( - dest_path: str, - metadata: Optional[Dict[str, Any]] = None, - category: str = "", - source_url: str = "", -) -> Dict[str, Any]: - """Compatibility alias for the Model Resolver metadata payload builder.""" - return build_model_resolver_metadata(dest_path, metadata, category, source_url) - - def get_existing_model_preview_path(dest_path: str) -> str: """Return the first adjacent preview media file available for a model.""" model_base_path, _model_ext = os.path.splitext(dest_path) @@ -830,11 +820,6 @@ def _first_model_preview_asset(metadata: Dict[str, Any]) -> Tuple[str, str]: return "", "" -def _first_model_preview_url(metadata: Dict[str, Any]) -> str: - """Return the first preview URL, retained for compatibility with callers.""" - return _first_model_preview_asset(metadata)[0] - - def _rewrite_civitai_preview_url(url: str, media_type: str) -> str: parsed = urlparse(str(url or "")) hostname = (parsed.hostname or "").lower() @@ -1158,25 +1143,6 @@ def write_model_resolver_metadata( return None -def write_lora_manager_metadata( - dest_path: str, - metadata: Optional[Dict[str, Any]] = None, - category: str = "", - source_url: str = "", - create_preview: bool = False, -) -> Optional[str]: - """Compatibility alias that writes only Model Resolver-owned metadata.""" - return write_model_resolver_metadata( - dest_path, - metadata, - category, - source_url, - create_preview, - ) - - - - # Imported from .settings diff --git a/core/metadata_audit.py b/core/metadata_audit.py index 3ceef79..60718d2 100644 --- a/core/metadata_audit.py +++ b/core/metadata_audit.py @@ -11,7 +11,6 @@ from typing import Any, Dict, Iterable, List, Optional, Tuple from .log_system import create_module_logger from .path_utils import ( - _metadata_sidecar_paths, # noqa: F401 find_metadata_sidecar_path, get_filename_from_path, get_path_identity, diff --git a/core/metadata_builder.py b/core/metadata_builder.py index c26f240..fe470b3 100644 --- a/core/metadata_builder.py +++ b/core/metadata_builder.py @@ -17,7 +17,6 @@ from .path_utils import ( MODEL_RESOLVER_METADATA_SCHEMA, MODEL_RESOLVER_METADATA_SCHEMA_VERSION, HashCalculationCancelled, - _metadata_sidecar_paths, # noqa: F401 calculate_file_sha256, extract_safetensors_header_metadata, find_external_metadata_sidecar_path, diff --git a/core/path_utils.py b/core/path_utils.py index 8acdc09..f5bc8c0 100644 --- a/core/path_utils.py +++ b/core/path_utils.py @@ -359,30 +359,6 @@ def read_safetensors_header( return None -def get_or_build_model_sidecar_info( - model_path: str, - *, - read_header_if_missing: bool = False, -) -> Tuple[str, bool, Optional[Dict[str, Any]]]: - """ - Locate or determine the metadata sidecar path for a model file. - Returns a tuple of (sidecar_path, exists_flag, header_json_or_none). - """ - if not model_path: - return "", False, None - - found_path = find_model_resolver_sidecar_path(model_path) - if found_path and os.path.isfile(found_path): - return found_path, True, None - - default_sidecar = get_model_resolver_sidecar_path(model_path) - header_json = None - if read_header_if_missing and str(model_path).lower().endswith(".safetensors"): - header_json = read_safetensors_header(model_path) - - return default_sidecar, False, header_json - - def extract_safetensors_header_sha256( file_path: str, max_header_size: int = SAFETENSORS_HEADER_MAX_BYTES, diff --git a/core/sources/__init__.py b/core/sources/__init__.py index 795ec3b..5911fcd 100644 --- a/core/sources/__init__.py +++ b/core/sources/__init__.py @@ -4,44 +4,18 @@ Model Sources Module Provides search functionality for finding models from various sources. """ -from ..log_system import create_module_logger from .civarchive import ( clear_search_cache as clear_civarchive_search_cache, ) -from .civarchive import ( - is_civarchive_available, - resolve_civarchive_by_hash, - resolve_civarchive_model_version, - search_civarchive, - search_civarchive_for_file, -) from .civitai import ( clear_search_cache as clear_civitai_search_cache, ) -from .civitai import ( - get_civitai_download_url, - search_civitai, - search_civitai_for_file, -) from .huggingface import ( clear_search_cache as clear_huggingface_search_cache, ) -from .huggingface import ( - get_huggingface_download_url, - search_huggingface, - search_huggingface_for_file, -) from .lora_manager_archive import ( clear_search_cache as clear_lora_manager_archive_search_cache, ) -from .lora_manager_archive import ( - get_lora_manager_archive_db_path, - is_lora_manager_archive_available, - search_lora_manager_archive, - search_lora_manager_archive_for_file, -) -from .model_list import search_model_list, search_model_list_multiple -from .popular import get_popular_model_url, search_popular_models def clear_all_search_caches() -> None: @@ -51,27 +25,4 @@ def clear_all_search_caches() -> None: clear_civarchive_search_cache() clear_lora_manager_archive_search_cache() -__all__ = [ - "clear_all_search_caches", - "clear_civarchive_search_cache", - "clear_lora_manager_archive_search_cache", - "get_civitai_download_url", - "get_huggingface_download_url", - "get_lora_manager_archive_db_path", - "get_popular_model_url", - "is_civarchive_available", - "is_lora_manager_archive_available", - "resolve_civarchive_by_hash", - "resolve_civarchive_model_version", - "search_civarchive", - "search_civarchive_for_file", - "search_civitai", - "search_civitai_for_file", - "search_huggingface", - "search_huggingface_for_file", - "search_lora_manager_archive", - "search_lora_manager_archive_for_file", - "search_model_list", - "search_model_list_multiple", - "search_popular_models", -] +__all__ = ["clear_all_search_caches"] diff --git a/core/sources/civitai.py b/core/sources/civitai.py index 4f810cf..6b729dc 100644 --- a/core/sources/civitai.py +++ b/core/sources/civitai.py @@ -50,7 +50,6 @@ from ..type_utils import ( normalize_model_file_info, normalize_model_image, parse_size_to_bytes, - prepare_remote_size_probe_url, resolve_model_category, select_primary_model_file, ) @@ -61,14 +60,6 @@ log = create_module_logger(__name__) CIVITAI_API_URL = "https://civitai.com/api/v1" -def _fetch_civitai_remote_file_size(url: str, timeout: int = 15) -> Optional[int]: - """Probe file size for Civitai remote URLs.""" - from ..type_utils import fetch_remote_file_size_cached - probe_url = prepare_remote_size_probe_url(url, ["civitai.com", "civitai.red"]) - if not probe_url: - return None - return fetch_remote_file_size_cached(probe_url, timeout=timeout) - # Cache for search results and URN resolutions _search_cache: Dict[str, Any] = {} _urn_cache: Dict[tuple[int, int], Dict[str, Any]] = {} diff --git a/tests/test_downloader_metadata.py b/tests/test_downloader_metadata.py index 3c0dd22..7dda149 100644 --- a/tests/test_downloader_metadata.py +++ b/tests/test_downloader_metadata.py @@ -11,10 +11,10 @@ from PIL import Image from core import downloader from core.downloader import ( _extract_expected_sha256, - build_lora_manager_metadata, + build_model_resolver_metadata, download_model, get_progress, - write_lora_manager_metadata, + write_model_resolver_metadata, ) from core.path_utils import get_model_resolver_sidecar_path @@ -54,7 +54,7 @@ class DownloaderMetadataSidecarTests(unittest.TestCase): with open(model_path, "wb") as handle: handle.write(b"abc") - payload = build_lora_manager_metadata( + payload = build_model_resolver_metadata( model_path, { "source": "civitai", @@ -86,7 +86,7 @@ class DownloaderMetadataSidecarTests(unittest.TestCase): with open(model_path, "wb") as handle: handle.write(b"abc") - payload = build_lora_manager_metadata( + payload = build_model_resolver_metadata( model_path, { "source": "civarchive", @@ -119,7 +119,7 @@ class DownloaderMetadataSidecarTests(unittest.TestCase): with open(model_path, "wb") as handle: handle.write(b"abc") - payload = build_lora_manager_metadata( + payload = build_model_resolver_metadata( model_path, { "details_source": "huggingface", @@ -154,7 +154,7 @@ class DownloaderMetadataSidecarTests(unittest.TestCase): with open(external_metadata_path, "w", encoding="utf-8") as handle: json.dump(external_payload, handle) - metadata_path = write_lora_manager_metadata( + metadata_path = write_model_resolver_metadata( model_path, { "details_source": "civitai", @@ -217,7 +217,7 @@ class DownloaderMetadataSidecarTests(unittest.TestCase): with open(model_path, "wb") as handle: handle.write(b"abc") - payload = build_lora_manager_metadata( + payload = build_model_resolver_metadata( model_path, { "source": "civitai", @@ -294,7 +294,7 @@ class DownloaderMetadataSidecarTests(unittest.TestCase): {}, ), ): - metadata_path = write_lora_manager_metadata( + metadata_path = write_model_resolver_metadata( model_path, { "source": "civitai", @@ -369,7 +369,7 @@ class DownloaderMetadataSidecarTests(unittest.TestCase): {}, ), ) as request_preview: - metadata_path = write_lora_manager_metadata( + metadata_path = write_model_resolver_metadata( model_path, { "images": [ diff --git a/tests/test_refactoring_targets.py b/tests/test_refactoring_targets.py index 33571fd..64f6bb9 100644 --- a/tests/test_refactoring_targets.py +++ b/tests/test_refactoring_targets.py @@ -302,13 +302,14 @@ class TestRefactoringTargets(unittest.IsolatedAsyncioTestCase): ) def test_project_version_helpers_preserve_version_comparison_behavior(self): + version_module = importlib.import_module("comfyui-model-resolver.core.version") self.assertEqual( - node_mod._extract_project_version('version = "1.2.3"'), + version_module._extract_project_version('version = "1.2.3"'), "1.2.3", ) - self.assertEqual(node_mod._extract_project_version("name = 'resolver'"), "") - self.assertEqual(node_mod._version_sort_key("v1.10.2-beta"), (1, 10, 2)) - self.assertEqual(node_mod._version_sort_key("unknown"), ()) + self.assertEqual(version_module._extract_project_version("name = 'resolver'"), "") + self.assertEqual(version_module._version_sort_key("v1.10.2-beta"), (1, 10, 2)) + self.assertEqual(version_module._version_sort_key("unknown"), ()) def test_route_context_merges_namespaces_and_validates_required_values(self): context_module = importlib.import_module( @@ -347,7 +348,7 @@ class TestRefactoringTargets(unittest.IsolatedAsyncioTestCase): self.assertEqual(result["current_version"], "1.0.0") self.assertEqual(result["latest_version"], "2.0.0") self.assertEqual(result["status"], "update_available") - self.assertEqual(result["github_url"], node_mod.PROJECT_GITHUB_URL) + self.assertEqual(result["github_url"], version_module.PROJECT_GITHUB_URL) async def test_version_route_returns_version_payload(self): get_handler = routes_registered[("GET", "/model_resolver/version")] @@ -960,9 +961,8 @@ class TestRefactoringTargets(unittest.IsolatedAsyncioTestCase): self.assertNotIn("unet", categories) def test_metadata_sidecar_paths_behavior(self): - from core.metadata_audit import _metadata_sidecar_paths as ma_sidecars - from core.metadata_builder import _metadata_sidecar_paths as mb_sidecars from core.path_utils import ( + _metadata_sidecar_paths, get_metadata_sidecar_path, get_model_resolver_sidecar_path, get_safe_metadata_sidecar_path, @@ -991,10 +991,8 @@ class TestRefactoringTargets(unittest.IsolatedAsyncioTestCase): ) # Test MB and MA sidecar candidates - mb_candidates = mb_sidecars(model_path) - ma_candidates = ma_sidecars(model_path) - self.assertEqual(mb_candidates, ma_candidates) - self.assertIn(expected_sidecar, mb_candidates) + candidates = _metadata_sidecar_paths(model_path) + self.assertIn(expected_sidecar, candidates) def test_select_primary_model_file_extended(self): from core.type_utils import select_primary_model_file diff --git a/tests/test_refactoring_unification.py b/tests/test_refactoring_unification.py index 5f76e1f..2aeac9b 100644 --- a/tests/test_refactoring_unification.py +++ b/tests/test_refactoring_unification.py @@ -175,9 +175,7 @@ class TestRefactoringUnification(unittest.TestCase): def test_tracker_progress_updates(self): - import importlib - node_mod = importlib.import_module("comfyui-model-resolver") - JobProgressTracker = node_mod.JobProgressTracker + from core.progress import JobProgressTracker tracker = JobProgressTracker("Test Tracker") tracker.update("job123", status="running", percent=50) @@ -258,9 +256,7 @@ class TestRefactoringUnification(unittest.TestCase): self.assertEqual(res["hashes"]["sha256"], valid_sha.lower()) def test_job_progress_tracker_update_from_payload(self): - import importlib - node_mod = importlib.import_module("comfyui-model-resolver") - JobProgressTracker = node_mod.JobProgressTracker + from core.progress import JobProgressTracker tracker = JobProgressTracker("Test Job") tracker.update_from_payload("job99", {"stage": "processing", "current": 5, "total": 10, "message": "Working..."}) @@ -330,4 +326,3 @@ if __name__ == "__main__": - diff --git a/tests/test_resolver_robustness.py b/tests/test_resolver_robustness.py index 9e75e4a..1848d21 100644 --- a/tests/test_resolver_robustness.py +++ b/tests/test_resolver_robustness.py @@ -6,12 +6,11 @@ import tempfile import socket import threading from unittest.mock import patch, MagicMock, AsyncMock -import importlib import requests # Ensure we import core modules correctly from core.downloader import ( - write_lora_manager_metadata, + write_model_resolver_metadata, download_model, get_progress, _resolve_download_url_for_aria2, @@ -32,9 +31,7 @@ from core.settings import ( _resolve_base_model_mapping, ) -# Dynamically import hyphenated root package name to access root class JobProgressTracker -node_mod = importlib.import_module("comfyui-model-resolver") -JobProgressTracker = node_mod.JobProgressTracker +from core.progress import JobProgressTracker class ModelResolverRobustnessTests(unittest.TestCase): @@ -42,7 +39,7 @@ class ModelResolverRobustnessTests(unittest.TestCase): def test_metadata_sidecar_credentials_scrubbing(self): """ Covers Requirement: API Token and credential leakage to local JSON metadata files. - Verifies that write_lora_manager_metadata filters authorization headers, + Verifies that write_model_resolver_metadata filters authorization headers, tokens, cookies, and sensitive query keys from URLs and sub-objects, and completely removes the 'headers' wrapper object. """ @@ -66,7 +63,7 @@ class ModelResolverRobustnessTests(unittest.TestCase): } # Act - metadata_path = write_lora_manager_metadata( + metadata_path = write_model_resolver_metadata( model_path, sensitive_metadata, category="loras", diff --git a/tests/test_unified_helpers.py b/tests/test_unified_helpers.py index 6efe801..d67974c 100644 --- a/tests/test_unified_helpers.py +++ b/tests/test_unified_helpers.py @@ -700,10 +700,10 @@ class UnifiedHelpersTests(unittest.TestCase): def test_metadata_sidecar_strict_credential_scrubbing(self): """ Covers Security Risk: API keys, cookies, or authorization tokens leaking into local JSON metadata sidecar files. - Verifies that build_lora_manager_metadata scrubs sensitive query parameters and headers from payloads. + Verifies that build_model_resolver_metadata scrubs sensitive query parameters and headers from payloads. """ import json - from core.downloader import build_lora_manager_metadata + from core.downloader import build_model_resolver_metadata dest_path = "dummy_model.safetensors" metadata = { "download_url": "https://civitai.com/api/download/models/123?token=sensitivetoken123&session=cookie_val", @@ -712,7 +712,7 @@ class UnifiedHelpersTests(unittest.TestCase): "hf_token": "hf_abc123secret", } - payload = build_lora_manager_metadata( + payload = build_model_resolver_metadata( dest_path=dest_path, metadata=metadata, category="loras",