refactor: remove dead compatibility shims
This commit is contained in:
-41
@@ -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:
|
||||
|
||||
@@ -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",
|
||||
]
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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]] = {}
|
||||
|
||||
@@ -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": [
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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__":
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user