Skip to content

Commit 82352e7

Browse files
committed
Align tooling with engine package semantics
1 parent ffa66d0 commit 82352e7

14 files changed

Lines changed: 1077 additions & 349 deletions

.github/workflows/tests.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ jobs:
3636

3737
- name: Run tests and keep summary log
3838
env:
39-
# 단계적 도입: 기준을 50 -> 60 -> 70으로 상향합니다.
40-
COVERAGE_FAIL_UNDER: 50
39+
# 이번 hardening 범위에서 안정적으로 지킬 수 있는 수준까지 현실적으로 상향합니다.
40+
COVERAGE_FAIL_UNDER: 60
4141
run: |
4242
pytest -v -ra --cov=hwpx --cov-report=term-missing --cov-fail-under=${COVERAGE_FAIL_UNDER} 2>&1 | tee pytest-summary.log
4343

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,14 @@
22

33
모든 중요한 변경 사항은 이 문서에 기록됩니다. 형식은 [Keep a Changelog](https://keepachangelog.com/ko/1.1.0/)[Semantic Versioning](https://semver.org/lang/ko/)을 따릅니다.
44

5+
## [2.8] - 2026-03-08
6+
### 변경
7+
- `HwpxPackage`와 OXML 로딩/저장이 rootfile/manifest-relative 경로를 실제로 따르도록 정렬했습니다.
8+
- `hwpx-analyze-template --extract-dir`가 pack-ready 작업 디렉터리와 `.hwpx-pack-metadata.json`을 생성하도록 확장했습니다.
9+
- `hwpx-validate-package`를 엔진 정합 기준으로 재작성해 dynamic rootfile/manifest 관계, CRC, fallback warning을 구분하도록 했습니다.
10+
- `hwpx-unpack` 기본값을 raw-byte preserving으로 바꾸고 `--pretty-xml` opt-in을 추가했습니다.
11+
- tooling/OPC 회귀 테스트를 확대하고, coverage threshold를 60으로 올렸으며, pyright는 touched OPC/tooling 범위에서 `basic`으로 상향했습니다.
12+
513
## [2.7.1] - 2026-03-08
614
### 변경
715
- 공개 저장소와 배포 산출물에서 내부 감사 문서를 제거했습니다.

README.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,12 +217,15 @@ hwpx-validate 문서.hwpx
217217
# ZIP/OPC/HWPX 패키지 구조 검사
218218
hwpx-validate-package 문서.hwpx
219219

220-
# HWPX 풀기 / 다시 묶기
220+
# HWPX 풀기 / 다시 묶기 (기본값: XML/HWPF 바이트 보존)
221221
hwpx-unpack 문서.hwpx ./unpacked
222+
hwpx-unpack 문서.hwpx ./pretty-unpacked --pretty-xml
222223
hwpx-pack ./unpacked ./repacked.hwpx
223224

224-
# 레퍼런스 템플릿 분석과 파트 추출
225+
# 레퍼런스 템플릿 분석과 pack-ready 추출
225226
hwpx-analyze-template 문서.hwpx --extract-dir ./template-parts --json
227+
hwpx-pack ./template-parts ./template-roundtrip.hwpx
228+
hwpx-validate-package ./template-roundtrip.hwpx
226229

227230
# plain / markdown 텍스트 추출
228231
hwpx-text-extract 문서.hwpx --format markdown --output 문서.md
@@ -233,6 +236,10 @@ hwpx-page-guard --reference 원본.hwpx --output 결과.hwpx
233236

234237
`hwpx-page-guard`는 렌더된 실제 쪽수를 계산하지 않습니다. 대신 단락 수, 표 수, shape/control 수, 명시적 page/column break, 텍스트 길이 통계를 비교해 레이아웃 드리프트 위험을 탐지하는 프록시 도구입니다.
235238

239+
`hwpx-validate-package``Contents/content.hpf` 같은 고정 경로를 강제하지 않고, `META-INF/container.xml`과 선택된 rootfile/manifest 관계를 따라가며 검사합니다. 엔진이 fallback으로 열 수 있는 비표준 패키지는 가능한 경우 경고로 구분합니다.
240+
241+
`hwpx-analyze-template --extract-dir`는 covered fixture 기준으로 `hwpx-pack``hwpx-validate-package`, 그리고 엔진 open 경로에 다시 투입할 수 있는 pack-ready 작업 디렉터리를 만듭니다. 이건 재패킹 가능성을 목표로 한 것이지, 렌더링 fidelity를 보장한다는 뜻은 아닙니다.
242+
236243
## 문서
237244

238245
| | |

docs/usage.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,15 @@ python-hwpx는 HWPX 컨테이너를 검증하고 편집하기 위한 여러 계
1010
# 패키지 구조 점검
1111
hwpx-validate-package sample.hwpx
1212

13-
# XML-first 편집용 unpack / pack
13+
# XML-first 편집용 unpack / pack (기본값: XML/HWPF 바이트 보존)
1414
hwpx-unpack sample.hwpx ./sample-unpacked
15+
hwpx-unpack sample.hwpx ./sample-pretty --pretty-xml
1516
hwpx-pack ./sample-unpacked ./sample-repacked.hwpx
1617

17-
# 템플릿 분석과 파트 추출
18+
# 템플릿 분석과 pack-ready 작업 디렉터리 추출
1819
hwpx-analyze-template sample.hwpx --extract-dir ./template-parts --json
20+
hwpx-pack ./template-parts ./template-roundtrip.hwpx
21+
hwpx-validate-package ./template-roundtrip.hwpx
1922

2023
# 텍스트 추출
2124
hwpx-text-extract sample.hwpx --format markdown --output sample.md
@@ -26,6 +29,10 @@ hwpx-page-guard --reference sample.hwpx --output edited.hwpx
2629

2730
`hwpx-page-guard`는 실제 렌더러의 쪽수를 계산하지 않고, 구조 및 텍스트 통계를 비교해 레이아웃 변화 위험을 탐지하는 프록시 검사기입니다.
2831

32+
`hwpx-validate-package`는 고정 기본 경로를 가정하지 않고 `container.xml`과 rootfile/manifest 관계를 따라가며 검사합니다. 엔진이 fallback으로 열 수 있는 비표준 패키지는 에러 대신 경고로 분리할 수 있습니다.
33+
34+
`hwpx-analyze-template --extract-dir``mimetype`, `META-INF/container.xml`, rootfile, manifest-related parts, 중요 자산, `.hwpx-pack-metadata.json`을 포함한 pack-ready 작업 디렉터리를 만듭니다. covered fixture 기준으로 재패킹/재검증 가능한 범위를 목표로 하며, 렌더링 fidelity를 보장하지는 않습니다.
35+
2936
## 빠른 예제 모음
3037

3138
### 예제 1: 문단 수 세기

pyproject.toml

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "python-hwpx"
7-
version = "2.7.1"
7+
version = "2.8"
88
description = "Hancom HWPX 패키지를 로드하고 편집하기 위한 Python 유틸리티 모음"
99
readme = { file = "README.md", content-type = "text/markdown" }
1010
license = { file = "LICENSE" }
@@ -78,15 +78,37 @@ testpaths = ["tests"]
7878

7979
[tool.mypy]
8080
python_version = "3.10"
81-
files = ["src/hwpx/document.py", "src/hwpx/oxml/document.py"]
81+
files = [
82+
"src/hwpx/document.py",
83+
"src/hwpx/oxml/document.py",
84+
"src/hwpx/opc/package.py",
85+
"src/hwpx/opc/relationships.py",
86+
"src/hwpx/tools/archive_cli.py",
87+
"src/hwpx/tools/package_validator.py",
88+
"src/hwpx/tools/page_guard.py",
89+
"src/hwpx/tools/template_analyzer.py",
90+
"src/hwpx/tools/text_extract_cli.py",
91+
"src/hwpx/tools/text_extractor.py",
92+
]
8293
ignore_missing_imports = true
8394

8495
[[tool.mypy.overrides]]
8596
module = ["hwpx.document", "hwpx.oxml.document"]
8697
ignore_errors = true
8798

8899
[tool.pyright]
89-
include = ["src/hwpx/document.py", "src/hwpx/oxml/document.py"]
100+
# Keep basic pyright focused on OPC/tooling modules that currently pass
101+
# without suppressing their real diagnostics.
102+
include = [
103+
"src/hwpx/opc/package.py",
104+
"src/hwpx/opc/relationships.py",
105+
"src/hwpx/tools/archive_cli.py",
106+
"src/hwpx/tools/package_validator.py",
107+
"src/hwpx/tools/page_guard.py",
108+
"src/hwpx/tools/template_analyzer.py",
109+
"src/hwpx/tools/text_extract_cli.py",
110+
"src/hwpx/tools/text_extractor.py",
111+
]
90112
pythonVersion = "3.10"
91-
typeCheckingMode = "off"
113+
typeCheckingMode = "basic"
92114
reportMissingTypeStubs = false

0 commit comments

Comments
 (0)