diff --git a/insta-lab/app/design_importer.py b/insta-lab/app/design_importer.py index cc9821b..794eddf 100644 --- a/insta-lab/app/design_importer.py +++ b/insta-lab/app/design_importer.py @@ -102,8 +102,16 @@ def _build_mapping(pngs: List[str]) -> Dict[str, int]: return mapping +_EXPECTED_RATIO = 1080 / 1350 # 4:5 = 0.8 +_RATIO_TOLERANCE = 0.02 # ±2% (1122/1402 ≈ 0.80028도 통과) + + def _validate_images(pages_dir: Path) -> None: - """모든 PNG가 정확히 1080×1350인지 검증. 다르면 ValueError. + """모든 PNG가 4:5 종횡비(1080x1350 권장)에 가까운지 검증. + + Vision은 base64로 원본을 분석하고 Playwright는 background-size: cover로 + 1080x1350 컨테이너에 fit하므로 절대 사이즈는 유연. 단 종횡비가 어긋나면 + 카드가 늘어나거나 잘리므로 ±2% 허용 범위 내에서만 통과. early-exit 하지 않고 전체 파일을 검사한 뒤 한 메시지에 모아 raise. """ @@ -111,12 +119,17 @@ def _validate_images(pages_dir: Path) -> None: bad = [] for png_path in sorted(pages_dir.glob("*.png")): with Image.open(png_path) as img: - if img.size != _EXPECTED_SIZE: + w, h = img.size + if h == 0: + bad.append((png_path.name, img.size)) + continue + ratio = w / h + if abs(ratio - _EXPECTED_RATIO) > _RATIO_TOLERANCE: bad.append((png_path.name, img.size)) if bad: msg = "; ".join(f"{n}: {s[0]}x{s[1]}" for n, s in bad) raise ValueError( - f"모든 카드 디자인은 1080x1350이어야 함. 잘못된 파일: {msg}" + f"카드 디자인은 4:5 비율(1080x1350 권장)이어야 함. 잘못된 파일: {msg}" ) diff --git a/insta-lab/tests/test_design_importer.py b/insta-lab/tests/test_design_importer.py index e81e203..81baf89 100644 --- a/insta-lab/tests/test_design_importer.py +++ b/insta-lab/tests/test_design_importer.py @@ -86,6 +86,14 @@ def _make_png(path: Path, size: tuple[int, int]) -> None: Image.new("RGB", size, color=(200, 200, 200)).save(path, format="PNG") +def test_validate_images_accepts_higher_resolution_4_5_ratio(tmp_theme): + """1080x1350 외에도 같은 4:5 비율이면 통과 (예: 1122x1402, 디자인 도구 export 흔한 사이즈).""" + pages = tmp_theme / "pages" + for i in range(10): + _make_png(pages / f"insta_card_{i:02d}.png", (1122, 1402)) + design_importer._validate_images(pages) # 예외 없으면 통과 + + def test_validate_images_accepts_1080x1350(tmp_theme): pages = tmp_theme / "pages" for i in range(10):