feat(B05): 숨긴 옵션은 필수 아님 — 저장 검증이 M02 옵션 보이기 표를 봄 · 시험 한 건
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L6KXAabDTenEU7hrDQmCKY
This commit is contained in:
@@ -14,6 +14,7 @@ from typing import Any, Iterable
|
||||
|
||||
from B05_Profile.B05_Profile_Structures_Schema import StructureInstance, structure_type_map
|
||||
from common_util.common_util_json import atomic_write_json
|
||||
from M02_MasterTemplete.M02_MasterTemplete_Options import hidden_keys
|
||||
|
||||
STRUCTURES_FILE_NAME = "structures.json"
|
||||
_STAGE_DIR = os.path.join("B05_Profile", "route")
|
||||
@@ -168,6 +169,7 @@ def _validate_types(items: list[StructureInstance]) -> None:
|
||||
들어간다(2026-08-16 크로스체크 지적 2). 정본에 닿는 마지막 관문은 여기다.
|
||||
"""
|
||||
types = structure_type_map()
|
||||
hidden = hidden_keys() # M02 「구조물 옵션 보이기」 — 숨긴 옵션은 필수 아님
|
||||
for item in items:
|
||||
definition = types.get(item.type_id)
|
||||
if definition is None:
|
||||
@@ -182,10 +184,10 @@ def _validate_types(items: list[StructureInstance]) -> None:
|
||||
f"{definition.name}의 배치형태는 {definition.placement}인데 "
|
||||
f"{item.placement}로 보냈습니다."
|
||||
)
|
||||
_validate_options(item, definition)
|
||||
_validate_options(item, definition, hidden.get(item.type_id, set()))
|
||||
|
||||
|
||||
def _validate_options(item: StructureInstance, definition) -> None:
|
||||
def _validate_options(item: StructureInstance, definition, hidden: set[str] = frozenset()) -> None:
|
||||
allowed = {option.key: option for option in definition.options}
|
||||
for key, value in item.options.items():
|
||||
option = allowed.get(key)
|
||||
@@ -203,6 +205,8 @@ def _validate_options(item: StructureInstance, definition) -> None:
|
||||
# 강제하지 않는다. 필수 원칙은 유지되고 시점만 미뤄진다(2026-08-17 사용자 확정).
|
||||
if option.phase == "detail":
|
||||
continue
|
||||
if option.key in hidden: # 화면에서 숨긴 옵션은 값을 못 넣으므로 필수로 안 침
|
||||
continue
|
||||
if option.required and item.options.get(option.key) in (None, ""):
|
||||
raise ValueError(
|
||||
f"{definition.name}의 {option.label}은(는) 필수 입력입니다 — "
|
||||
|
||||
Reference in New Issue
Block a user