Skip to content

fix: 폐기 경고·문서·예외 체계·작은 결함 정리 - #678

Merged
airmang merged 8 commits into
mainfrom
fix/audit-docs-api
Nov 10, 2026
Merged

airmang merged 8 commits into
mainfrom
fix/audit-docs-api

Conversation

@airmang

@airmang airmang commented Nov 10, 2026

Copy link
Copy Markdown
Owner

요약

2026-11-10 점검에서 나온 문서·공개 API·오류형 쪽 항목을 고칩니다. 커밋은 항목별로 나눴습니다.

  • 폐기 경고가 없는 API를 가리키던 것. 이동 대상 79개 중 2개가 존재하지 않았습니다(doc.styles.style, doc.fields.check_box(...).checked). doc.styles.get, doc.fields.set_check_box로 고치고, 79개가 실제 속성으로 풀리는지 보는 테스트를 넣었습니다.
  • 현재 코드와 반대로 말하던 문서. llms.txt의 ".hwp를 열면 BadZipFile"을 고쳤습니다. api_reference.md의 없어진 save() 설명을 고쳤습니다. usage.md의 5.x 평면 이름 64곳을 6.x 이름으로 바꿨습니다. examples/build_release_checklist.py는 실행하면 죽던 것을 공개 6.x API로 다시 쓰고 실행 테스트를 넣었습니다.
  • 공개 예외 7종이 HwpxError도 상속합니다. 기존 ValueError·RuntimeError 부모는 그대로입니다.
  • 손상된 HWPX를 열 때의 오류형. HwpxArchiveError, HwpxCompressedDataError, HwpxXmlSyntaxError를 더했습니다. 모두 HwpxStructureError의 하위이면서 원래 예외(BadZipFile, zlib.error, XMLSyntaxError)도 함께 상속하므로 기존 except는 그대로 잡힙니다.
  • 작은 결함. HwpxDocument.new()로 만든 문서의 지은이가 synthetic-fixture-author, 만든 날이 2025-09-17로 고정이던 것을 빈 값과 만든 시각으로 바꿨습니다(SOURCE_DATE_EPOCH를 따릅니다). historylastdoc.hml의 to_model()이 죽던 것을 고쳤습니다. doc.text.html()의 병합 표에 colspan·rowspan을 넣었습니다.
  • 장부와 지원 표. 장부의 읽기 판정에서 hwp5/가 써내는 코드를 뺐습니다(읽기 266 → 256). capabilities.py와 지원 표의 API 자리 안내를 실제에 맞췄습니다.
  • ingest 변환기가 빠뜨린 요소를 알립니다. metadata["left_out"], warnings, lossiness에 싣습니다. README의 "읽기·추출" 문구를 실제 범위에 맞췄습니다.
  • dev extra를 CONTRIBUTING·CI와 맞췄습니다.

병합 전에 볼 것

  • 새 문서의 CreatedDate가 만든 시각이 되면서 HwpxDocument.new().to_bytes()가 호출 시각마다 달라집니다. 바이트 재현이 필요하면 SOURCE_DATE_EPOCH를 씁니다.
  • 지은이와 date가 빈 새 문서를 한/글에서 열어 보지는 않았습니다. 엔진의 열림 검사는 통과합니다.
  • 기존 테스트 2개의 기대값을 바꿨습니다(test_document_metadata, test_ns_refs). 둘 다 위 변경과 충돌하던 것입니다.
  • hp:btn·hp:radioBtn에 붙은 Render-verified 표시는 그대로입니다. tests/test_coverage_ledger.py가 고정하고 있습니다.
  • .hwp 쓰기와 README의 정확도 숫자에 관한 문구는 바꾸지 않았습니다.

관련 이슈

없음

변경 종류

  • 버그 수정
  • 기능
  • 문서
  • 리팩터링

체크리스트

  • pytest 테스트가 통과합니다. — Windows 11에서 7,796 통과, 18 실패. 14건은 이 변경 전 main에서도 같은 이름으로 실패하던 것입니다(cp949, 심볼릭 링크 권한, CRLF). 나머지 4건(test_deviations_registry의 dev029~032)은 다른 작업이 함께 돌아 메모리가 부족하던 전체 실행에서만 실패했고, 그 파일만 따로 돌리면 통과합니다. Linux CI 결과는 이 PR의 체크로 확인해 주세요.
  • CHANGELOG.md를 갱신했습니다(해당하는 경우).
  • 문서 갱신이 필요한지 확인했습니다.

🤖 Generated with Claude Code

airmang and others added 8 commits November 10, 2026 15:34
- doc.style → doc.styles.get, doc.set_check_box → doc.fields.set_check_box
  (전에는 없는 doc.styles.style, doc.fields.check_box(...).checked)
- 이동 대상 79개가 실제 속성으로 풀리는지 확인하는 테스트 추가
- llms.txt: .hwp는 BadZipFile이 아니라 열린다
- api_reference: HwpxDocument.save()는 없다
- examples/build_release_checklist.py를 공개 6.x API로 다시 쓰고 실행 테스트 추가
- usage.md의 5.x 평면 이름을 6.x 이름으로 (예제 장부·지문 갱신)

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
EquationConversionError, UnsupportedLatexError, MathMLUnavailableError,
DocumentIngestError, UnsupportedDocumentFormat, RecoverError,
WordBoxExtractorRequired. 기존 ValueError·RuntimeError 부모는 유지한다.
코드 7개와 도메인 4개(equation, ingest, recover, toc)를 레지스트리에
올리고 docs/error-codes.md를 다시 만들었다.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
HwpxDocument.open / HwpxPackage.open이 손상 종류마다 BadZipFile,
zlib.error, lxml XMLSyntaxError를 그대로 올리던 것을 HwpxStructureError
하위 클래스로 감싼다. 원래 예외는 __cause__에 둔다.

- HwpxArchiveError(HwpxStructureError, BadZipFile)
- HwpxCompressedDataError(HwpxStructureError, zlib.error)
- HwpxXmlSyntaxError(HwpxStructureError, XMLSyntaxError), part_name 포함

각 클래스가 전에 나던 예외도 상속하므로 기존 except는 그대로 잡는다
(docs/stable-api.md가 적어 둔 BadZipFile 계약 유지). open의 독스트링,
stable-api, api_reference를 실제와 맞췄다. opc/security.py는 건드리지
않았다.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
- HwpxDocument.new(): 템플릿의 지은이(synthetic-fixture-author)와
  2025-09-17 고정 날짜 대신 빈 지은이와 만든 시각(UTC)을 쓴다.
  Skeleton.hwpx와 blank_document_bytes()는 그대로 두고
  templates.new_document_bytes()가 content.hpf의 메타데이터만 바꾼다.
- doc.parts.histories: historylastdoc.hml(HWPML 스냅숏)의 to_model()이
  죽지 않고 빈 History를 돌려준다. is_version_log 추가.
- doc.text.html(): 병합 칸에 colspan·rowspan.
- doc.tables.all 독스트링을 실제 범위(본문 바로 아래 표)로.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
…-24)

HwpxMarkdownConverter가 lossiness="low", warnings=[]를 고정으로 붙이던
것을, Markdown에 글이 실리지 않은 요소를 결과와 대조해 종류별로 세도록
바꿨다(metadata["left_out"], warnings, lossiness low/medium/high).
미리 정한 목록이 아니라 결과 대조라, 내보내기가 어떤 종류를 싣게 되면
보고에서도 빠진다. 변경 추적으로 지운 글 표시는 따로 경고한다.

README의 "읽기·추출" 문구를 실제 범위로 고쳤다: 각주·미주는
notes=True·rich Markdown·TextExtractor에서, 머리말·꼬리말·메모는
TextExtractor에서만, 수식·글자 겹침·양식 개체 캡션은 어느 경로에도 없다.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
CONTRIBUTING은 `.[dev]` 설치 뒤 ruff와 pytest를 돌리라고 하는데 dev에
ruff·pillow·openpyxl·pyyaml·pytest-cov·numpy가 없었다. dev를 CI가 쓰는
test + typecheck의 상위 집합(+ twine)으로 만들고, CONTRIBUTING과
installation.md에 CI extra를 함께 적었다. 테스트가 세 곳의 일치를 본다.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
- scripts/coverage_ledger.py: src/hwpx/hwp5/(.hwp → HWPX 변환기)에 나오는
  HWPX 태그는 방출이므로 읽기로 세지 않는다. 읽기 266 → 256
  (hp:hiddenComment 등 10개). 쓰기 판정은 전과 같다(api 209 그대로).
- capabilities.py: 차례·상호참조, 제목 차례 표시, 색인 표시, 날짜·교정
  부호·파일 이름 필드, 메일머지 표시 필드는 doc.refs·doc.fields에 없다.
  namespace를 None으로, 진입점을 실제 모듈·문단 클래스로 고쳤다.
- support-matrix.md: 같은 자리 표, arc·polygon·curve·connectLine 행의
  자기모순(저작 API 없음 ↔ add_curve·add_connector), 차트 행의
  add_chart(chart_xml) 설명. 계약 문서 사본·장부·표면 인벤토리 재생성.

읽지도 쓰지도 못하는 요소(hp:btn·hp:radioBtn)의 by-capability-area
표시는 그대로다: tests/test_coverage_ledger.py가 그 값을 고정하고 있고
그 파일은 이 갈래에서 고치지 않는다.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
전체 테스트에서 새로 깨진 4건을 바로잡는다.
- test_document_metadata: 새 문서는 템플릿의 date를 물려받지 않는다(ENG-36)
- model_surface.json·stable-api.md: History에 is_version_log 추가(ENG-36)
- python-example-ledger.json: README 문구 변경에 따른 해시(ENG-21)
- test_ns_refs: toc-crossref의 namespace는 None(ENG-33)

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>

@airmang airmang left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed 5f2a412, including damaged-input exception MRO and cause preservation, fresh-document metadata/SOURCE_DATE_EPOCH, HTML cell spans, ingest loss reporting, public migration targets and the runnable example. Exact-head CI: all 13 checks pass; Python 3.12 log records 7,814 passed, 23 skipped, 1 xfailed. Local focused checks: 377 passed, 10 skipped. Rebuilt the merge tree against latest main 431be59 after #676, with 388 passed, 10 skipped in that integration tree. No unresolved correctness issue found. COMMENT is used because the signed-in account owns this PR. No package/plugin release or Hancom process was launched.

@airmang
airmang merged commit 7f5a201 into main Nov 10, 2026
13 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant