refactor shared metadata source payload

This commit is contained in:
Dariusz L
2026-08-09 00:16:50 +02:00
parent 593a85062a
commit eeeb939b9a
3 changed files with 88 additions and 40 deletions
+37
View File
@@ -11,6 +11,43 @@ from .path_utils import (
)
def build_metadata_source_payload(
*,
source: str,
details_source: str,
filename: str,
category: str,
model_name: str,
model_type: str,
sha256: str,
size: Any,
result: Dict[str, Any],
description: str,
version_description: str,
extra_fields: Optional[Dict[str, Any]] = None,
) -> Dict[str, Any]:
"""Build the normalized source payload passed to the sidecar writer."""
payload = {
"source": source,
"details_source": details_source,
"filename": filename,
"category": category,
"model_name": model_name,
"name": model_name,
"model_type": model_type,
"sha256": sha256,
"size": size,
"base_model": result.get("base_model"),
"base_model_source": result.get("base_model_source"),
"base_model_inferred": bool(result.get("base_model_inferred")),
"description": description,
"model_description": description,
"version_description": version_description,
}
payload.update(extra_fields or {})
return payload
def build_sidecar_file_identity(
model_path: str,
*,
+4 -39
View File
@@ -1,48 +1,13 @@
"""CivitAI model search service."""
from .. import path_utils
from ..metadata_utils import build_metadata_source_payload
from ..request_utils import extract_request_sha256
from ..routes.context import RouteContext
from ..sources.common import collect_download_urls
from .model_utils import CivitAISearchDependencies, ModelServiceDependencies
def _build_metadata_sidecar_payload(
*,
source,
details_source,
filename,
category,
model_name,
model_type,
sha256,
size,
result,
description,
version_description,
extra_fields=None,
):
payload = {
"source": source,
"details_source": details_source,
"filename": filename,
"category": category,
"model_name": model_name,
"name": model_name,
"model_type": model_type,
"sha256": sha256,
"size": size,
"base_model": result.get("base_model"),
"base_model_source": result.get("base_model_source"),
"base_model_inferred": bool(result.get("base_model_inferred")),
"description": description,
"model_description": description,
"version_description": version_description,
}
payload.update(extra_fields or {})
return payload
class CivitAISearchService(ModelServiceDependencies):
"""Execute exact-match CivitAI and model metadata searches."""
@@ -489,7 +454,7 @@ class CivitAISearchService(ModelServiceDependencies):
model_type = result.get("model_type", "") or result.get(
"type", ""
)
metadata_payload = _build_metadata_sidecar_payload(
metadata_payload = build_metadata_source_payload(
source=source_name,
details_source=result.get("details_source") or source_name,
filename=filename,
@@ -591,7 +556,7 @@ class CivitAISearchService(ModelServiceDependencies):
split_result_descriptions(result)
)
model_type = result.get("model_type", "")
metadata_payload = _build_metadata_sidecar_payload(
metadata_payload = build_metadata_source_payload(
source="metadata_import",
details_source=result.get("source") or "metadata",
filename=filename,
@@ -858,7 +823,7 @@ class CivitAISearchService(ModelServiceDependencies):
model_description = response.get("model_description") or response.get(
"description"
) or ""
metadata_payload = _build_metadata_sidecar_payload(
metadata_payload = build_metadata_source_payload(
source="local",
details_source=response.get("details_source") or "",
filename=filename,
+47 -1
View File
@@ -13,11 +13,57 @@ from core.metadata_builder import (
build_missing_local_metadata,
normalize_metadata_build_mode,
)
from core.metadata_utils import build_sidecar_file_identity, merge_counted_payload
from core.metadata_utils import (
build_metadata_source_payload,
build_sidecar_file_identity,
merge_counted_payload,
)
from core.path_utils import get_model_resolver_sidecar_path
class MetadataBuilderTests(unittest.TestCase):
def test_build_metadata_source_payload_preserves_common_source_fields(self):
payload = build_metadata_source_payload(
source="civitai",
details_source="civitai",
filename="model.safetensors",
category="checkpoints",
model_name="Example Model",
model_type="Checkpoint",
sha256="a" * 64,
size=1234,
result={
"base_model": "SDXL",
"base_model_source": "civitai",
"base_model_inferred": 1,
},
description="Model description",
version_description="Version description",
extra_fields={"author": "Author", "size": 5678},
)
self.assertEqual(
{
"source": "civitai",
"details_source": "civitai",
"filename": "model.safetensors",
"category": "checkpoints",
"model_name": "Example Model",
"name": "Example Model",
"model_type": "Checkpoint",
"sha256": "a" * 64,
"size": 5678,
"base_model": "SDXL",
"base_model_source": "civitai",
"base_model_inferred": True,
"description": "Model description",
"model_description": "Model description",
"version_description": "Version description",
"author": "Author",
},
payload,
)
def test_build_sidecar_file_identity_returns_common_schema_fields(self):
identity = build_sidecar_file_identity(
r"models\example.safetensors",