48 lines
1.8 KiB
Python
48 lines
1.8 KiB
Python
import re
|
|
import logging
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class ScriptVerifier:
|
|
"""수정된 스크립트가 원본의 필수 구조/데이터(파라미터 placeholder)를 유지하는지 검증.
|
|
|
|
구 N-profiling/script_verifier.py 이식 (로직 동일, 외부 의존성 없음).
|
|
"""
|
|
|
|
def verify_script(self, original_script: list, modified_script: list) -> bool:
|
|
if not isinstance(modified_script, list):
|
|
logger.warning("Verification Failed: Modified script is not a list.")
|
|
return False
|
|
|
|
original_params = self._extract_params(original_script)
|
|
modified_params = self._extract_params(modified_script)
|
|
|
|
# 원본의 모든 파라미터가 수정본에 존재해야 한다(데이터 주입 보장).
|
|
missing_params = original_params - modified_params
|
|
if missing_params:
|
|
logger.warning(f"Verification Failed: Missing parameters {missing_params}")
|
|
return False
|
|
|
|
# 환각으로 추가된 파라미터(원본에 없던 변수) 금지.
|
|
added_params = modified_params - original_params
|
|
if added_params:
|
|
logger.warning(f"Verification Failed: Added unknown parameters {added_params}")
|
|
return False
|
|
|
|
return True
|
|
|
|
def _extract_params(self, script: list) -> set:
|
|
"""스크립트 구조에서 {param_name} 형태 파라미터를 추출한다."""
|
|
params = set()
|
|
for block in script:
|
|
if not isinstance(block, dict):
|
|
continue
|
|
children = block.get("children", [])
|
|
for child in children:
|
|
text = child.get("text", "")
|
|
matches = re.findall(r"\{([^}]+)\}", text)
|
|
for match in matches:
|
|
params.add(match)
|
|
return params
|