From 9eb42ed19d4572055eb8ea4a65011aeacf0661c2 Mon Sep 17 00:00:00 2001 From: seonghobae <8172694+seonghobae@users.noreply.github.com> Date: Sun, 9 Aug 2026 10:03:23 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=A7=B9=20[=EC=BD=94=EB=93=9C=20=ED=80=84?= =?UTF-8?q?=EB=A6=AC=ED=8B=B0=20=EA=B0=9C=EC=84=A0]=20`=5Fexport=5Fuv=5Flo?= =?UTF-8?q?ck`=EC=97=90=EC=84=9C=20=EA=B2=80=EC=A6=9D=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🎯 **What:** `_export_uv_lock` ν•¨μˆ˜μ—μ„œ 검증(validation) 및 μ—λŸ¬ 핸듀링 λ‘œμ§μ„ μƒˆλ‘œμš΄ `_validate_uv_export` ν•¨μˆ˜λ‘œ λΆ„λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€. πŸ’‘ **Why:** `_export_uv_lock` ν•¨μˆ˜μ˜ 길이가 κΈΈκ³  λ³΅μž‘ν•΄μ§€λŠ” 것을 막고, 검증 λ‘œμ§μ„ λΆ„λ¦¬ν•˜μ—¬ 핡심 ν•¨μˆ˜μ˜ μ±…μž„μ„ 쀄이고 가독성과 μœ μ§€λ³΄μˆ˜μ„±μ„ 높이기 μœ„ν•¨μž…λ‹ˆλ‹€. βœ… **Verification:** `tests/test_materialize_base_python_requirements.py` ν…ŒμŠ€νŠΈλ₯Ό μˆ˜ν–‰ν•˜μ—¬ λͺ¨λ“  κΈ°λŠ₯이 정상 λ™μž‘ν•¨μ„ ν™•μΈν–ˆκ³ , `interrogate`λ₯Ό 톡해 Docstring 컀버리지 100%λ₯Ό μœ μ§€ν•¨μ„ κ²€μ¦ν–ˆμŠ΅λ‹ˆλ‹€. ✨ **Result:** 핡심 κΈ°λŠ₯을 μœ μ§€ν•˜λ©΄μ„œ ν•¨μˆ˜μ˜ λ‹¨μœ„κ°€ 더 λͺ¨λ“ˆν™”λ˜κ³  읽기 μ‰¬μ›Œμ‘ŒμŠ΅λ‹ˆλ‹€. --- .../materialize_base_python_requirements.py | 47 +++++++++++-------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/scripts/ci/materialize_base_python_requirements.py b/scripts/ci/materialize_base_python_requirements.py index 98cdad459..a24dea985 100755 --- a/scripts/ci/materialize_base_python_requirements.py +++ b/scripts/ci/materialize_base_python_requirements.py @@ -370,6 +370,32 @@ def _reject_unsupported_uv_workspace( ) +def _validate_uv_export( + completed: subprocess.CompletedProcess[bytes], lock_path: str +) -> bytes | None: + """Validate a completed uv export and return its hash-pinned requirements.""" + if completed.returncode != 0: + stderr = completed.stderr.decode("utf-8", errors="replace") + normalized_stderr = " ".join(stderr.split()) + detail = ( + normalized_stderr[:500] + if normalized_stderr + else f"exit status {completed.returncode}" + ) + raise RuntimeError( + f"uv export failed for tracked base lock {lock_path}: {detail}" + ) + + exported = completed.stdout + if not _requirement_lines(exported): + return None + if not _is_fully_hash_pinned_export(exported): + raise RuntimeError( + f"uv export for tracked base lock {lock_path} was not fully hash-pinned" + ) + return exported + + def _export_uv_lock( repo_root: pathlib.Path, base_sha: str, lock_path: str ) -> bytes | None: @@ -399,26 +425,7 @@ def _export_uv_lock( f"{type(exc).__name__}" ) from exc - if completed.returncode != 0: - stderr = completed.stderr.decode("utf-8", errors="replace") - normalized_stderr = " ".join(stderr.split()) - detail = ( - normalized_stderr[:500] - if normalized_stderr - else f"exit status {completed.returncode}" - ) - raise RuntimeError( - f"uv export failed for tracked base lock {lock_path}: {detail}" - ) - - exported = completed.stdout - if not _requirement_lines(exported): - return None - if not _is_fully_hash_pinned_export(exported): - raise RuntimeError( - f"uv export for tracked base lock {lock_path} was not fully hash-pinned" - ) - return exported + return _validate_uv_export(completed, lock_path) def _regular_base_blob_paths(entries: bytes) -> list[tuple[str, pathlib.PurePosixPath]]: