refactor: remove dead compatibility shims

This commit is contained in:
Dariusz L
2026-08-02 04:03:09 +02:00
parent bb0e921511
commit 57b79ba208
13 changed files with 28 additions and 208 deletions
-41
View File
@@ -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:
-11
View File
@@ -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",
]
-34
View File
@@ -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
-1
View File
@@ -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,
-1
View File
@@ -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,
-24
View File
@@ -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,
+1 -50
View File
@@ -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"]
-9
View File
@@ -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]] = {}
+9 -9
View File
@@ -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": [
+9 -11
View File
@@ -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
+2 -7
View File
@@ -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__":
+4 -7
View File
@@ -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",
+3 -3
View File
@@ -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",