Publish first RF4 fish quality upgrades
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s

This commit is contained in:
ik
2026-09-15 11:45:54 +07:00
parent 7d009c932f
commit a8c0da837a
85 changed files with 1733 additions and 556 deletions
+56 -1
View File
@@ -6,7 +6,7 @@ import io
import pytest
from PIL import Image
from rf4_research.media_assets import approve_stored_assets, audit_media_catalog, extract_media_candidates, inspect_image, media_coverage, media_quality_report, merge_manifest, reconcile_queued_duplicates, review_asset, store_asset
from rf4_research.media_assets import approve_stored_assets, audit_media_catalog, compare_quality_upgrades, extract_media_candidates, inspect_image, media_coverage, media_quality_report, merge_manifest, publish_quality_upgrades, queue_quality_upgrades, reconcile_queued_duplicates, review_asset, store_asset
def test_extracts_and_classifies_unique_https_media() -> None:
@@ -193,3 +193,58 @@ def test_quality_report_finds_low_resolution_asset_and_known_alternative(tmp_pat
assert (report["published"], report["below_minimum"], report["upsampled_in_cards"]) == (2, 1, 1)
assert report["known_alternative_urls"] == 1
assert report["by_source"]["small.example"]["below_minimum"] == 1
def test_quality_upgrade_queue_preserves_published_fallback(tmp_path: Path) -> None:
path = tmp_path / "manifest.json"
path.write_text(json.dumps({"assets": [
{"entity_type": "fish", "label": "Щука", "status": "approved", "asset_url": "https://small.example/pike.png", "width": 48, "height": 48},
{"entity_type": "fish", "label": "Щука", "status": "duplicate", "asset_url": "https://large.example/pike.webp", "duplicate_of": "https://small.example/pike.png"},
{"entity_type": "fish", "label": "Окунь", "status": "approved", "asset_url": "https://large.example/perch.webp", "width": 1024, "height": 1024},
]}), encoding="utf-8")
report = queue_quality_upgrades(path)
assets = json.loads(path.read_text(encoding="utf-8"))["assets"]
assert report == {"minimum_dimension": 256, "low_resolution_published": 1, "upgrade_queued": 1}
assert assets[0]["status"] == "approved"
assert assets[1]["status"] == "upgrade_queued"
def test_compare_quality_upgrades_checks_candidate_and_fallback(tmp_path: Path) -> None:
small = Image.new("RGBA", (48, 48), (1, 2, 3, 0))
large = Image.new("RGBA", (512, 512), (1, 2, 3, 0))
small_body = io.BytesIO()
large_body = io.BytesIO()
small.save(small_body, format="PNG")
large.save(large_body, format="WEBP")
small_digest, small_path, *_ = store_asset(tmp_path, small_body.getvalue(), content_type="image/png", source_url="https://small/pike.png")
large_digest, large_path, *_ = store_asset(tmp_path, large_body.getvalue(), content_type="image/webp", source_url="https://large/pike.webp")
(tmp_path / "manifest.json").write_text(json.dumps({"assets": [
{"entity_type": "fish", "label": "Щука", "status": "approved", "asset_url": "https://small/pike.png", "local_path": small_path, "sha256": small_digest, "width": 48, "height": 48, "bytes": len(small_body.getvalue()), "content_type": "image/png"},
{"entity_type": "fish", "label": "Щука", "status": "upgrade_stored", "asset_url": "https://large/pike.webp", "duplicate_of": "https://small/pike.png", "local_path": large_path, "sha256": large_digest, "width": 512, "height": 512, "bytes": len(large_body.getvalue()), "content_type": "image/webp"},
]}), encoding="utf-8")
report = compare_quality_upgrades(tmp_path)
assert (report["compared"], report["meets_minimum"], report["aspect_ratio_matches"]) == (1, 1, 1)
assert report["issues"] == []
assert report["comparisons"][0]["candidate"]["alpha"] is True
def test_publish_quality_upgrades_switches_mapping_and_retains_fallback(tmp_path: Path) -> None:
path = tmp_path / "manifest.json"
path.write_text(json.dumps({"assets": [
{"entity_type": "fish", "entity_key": "fish:pike", "status": "approved", "asset_url": "https://small/pike.png", "local_path": "files/small.png", "sha256": "a" * 64},
{"entity_type": "fish", "status": "upgrade_stored", "asset_url": "https://large/pike.webp", "duplicate_of": "https://small/pike.png", "local_path": "files/large.webp", "sha256": "b" * 64, "width": 512, "height": 512},
]}), encoding="utf-8")
report = publish_quality_upgrades(path, note="owner approved quality upgrades")
assets = json.loads(path.read_text(encoding="utf-8"))["assets"]
assert report == {"published": 1, "retained_fallbacks": 1}
assert assets[0]["status"] == "superseded"
assert assets[0]["replaced_by"] == assets[1]["asset_url"]
assert assets[1]["status"] == "approved"
assert assets[1]["entity_key"] == "fish:pike"
assert assets[1]["supersedes"] == assets[0]["asset_url"]