hwpx-kit-cli 0.4.0__tar.gz → 0.4.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/.claude-plugin/plugin.json +1 -1
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/PKG-INFO +3 -3
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/README.md +2 -2
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/pyproject.toml +1 -1
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/skills/table-calc/SKILL.md +11 -1
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/cli.py +3 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/fmt.py +13 -3
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/format.py +18 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_format.py +39 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/.claude-plugin/marketplace.json +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/.github/workflows/tests.yml +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/.gitignore +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/CLAUDE.md +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/LICENSE +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/commands/hwpx.md +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/docs/images/After.png +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/docs/images/Before.png +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/docs/images/Tasking.png +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/install.ps1 +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/install.sh +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/sample-values.json +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/scripts/build_skill_package.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/scripts/check_stdout_purity.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/scripts/make_sample.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/skills/doc-create/SKILL.md +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/skills/format-convert/SKILL.md +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/skills/gongmun-format/SKILL.md +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/skills/hwpx-form/SKILL.md +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/skills/office-export/SKILL.md +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/__init__.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/adapter/__init__.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/adapter/base.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/adapter/hwpx_engine.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/adapter/kordoc_engine.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/adapter/office_readers.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/__init__.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/analyze.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/convert.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/export.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/fill.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/fill_batch.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/generate.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/header_footer.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/image_add.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/inspect_doc.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/outline.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/page_break.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/read.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/render.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/row_height.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/table_clear.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/table_copy.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/table_map_cmd.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/table_new.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/table_rows.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/table_set.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/validate.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/inspect_rules.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/output.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/templates/Default_Template.hwpx +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/__init__.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/conftest.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/fixtures/real/legacy-sample.hwp +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/fixtures/real/seoul-attachment.hwpx +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/fixtures/real/seoul-body.hwpx +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/fixtures/real/seoul-report-brief.hwpx +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/fixtures/real/seoul-report-cover.hwpx +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_adapter.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_analyze.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_cli.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_convert.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_export.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_fill.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_fill_batch.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_image_header.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_inspect.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_integration.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_kordoc.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_office_readers.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_output.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_page_break.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_read_validate.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_real_forms.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_row_height.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_skill_package.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_stdout_purity.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_table_clear.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_table_copy.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_table_map_new.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_table_rows.py +0 -0
- {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_table_set.py +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hwpx-kit",
|
|
3
3
|
"description": "한글(HWPX/HWP) 문서 자동화 스킬 모음 — 양식 분석·채우기·백지 생성·표기 변환·공문 규약·표 계산·오피스 출력. CLI는 첫 사용 시 스킬이 설치를 안내 (Python 3.10+ 필요).",
|
|
4
|
-
"version": "0.4.
|
|
4
|
+
"version": "0.4.1",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "6aneffy",
|
|
7
7
|
"email": "tkdgus990809@gmail.com"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: hwpx-kit-cli
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.1
|
|
4
4
|
Summary: 한글(HWPX) 문서 자동화 CLI — Korean HWPX document automation for AI agents: analyze, fill, read, validate, table ops
|
|
5
5
|
Project-URL: Homepage, https://github.com/6aneffy/hwpx-kit
|
|
6
6
|
Project-URL: Repository, https://github.com/6aneffy/hwpx-kit
|
|
@@ -33,7 +33,7 @@ Description-Content-Type: text/markdown
|
|
|
33
33
|
[](https://pypi.org/project/hwpx-kit-cli/)
|
|
34
34
|
[](https://www.python.org/)
|
|
35
35
|
[](https://claude.com/claude-code)
|
|
36
|
-
[](tests/)
|
|
37
37
|
|
|
38
38
|
</div>
|
|
39
39
|
|
|
@@ -208,7 +208,7 @@ templates/ 기본 계획서 템플릿 (표지·장 헤더·표 골격, 마커
|
|
|
208
208
|
|
|
209
209
|
## 검증
|
|
210
210
|
|
|
211
|
-
- 자동 테스트
|
|
211
|
+
- 자동 테스트 190개 (pytest)
|
|
212
212
|
- 실서식 수렴 테스트: 보도자료·신청서·계획서·회의록·공고문 5계열,
|
|
213
213
|
실제 공공기관 문서 30여 종으로 analyze→fill→validate 왕복
|
|
214
214
|
- 실사용 시나리오 테스트 3회 (백지 생성 12분 완주, 장·표 동적 추가, 보도자료 변환)
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
[](https://pypi.org/project/hwpx-kit-cli/)
|
|
11
11
|
[](https://www.python.org/)
|
|
12
12
|
[](https://claude.com/claude-code)
|
|
13
|
-
[](tests/)
|
|
14
14
|
|
|
15
15
|
</div>
|
|
16
16
|
|
|
@@ -185,7 +185,7 @@ templates/ 기본 계획서 템플릿 (표지·장 헤더·표 골격, 마커
|
|
|
185
185
|
|
|
186
186
|
## 검증
|
|
187
187
|
|
|
188
|
-
- 자동 테스트
|
|
188
|
+
- 자동 테스트 190개 (pytest)
|
|
189
189
|
- 실서식 수렴 테스트: 보도자료·신청서·계획서·회의록·공고문 5계열,
|
|
190
190
|
실제 공공기관 문서 30여 종으로 analyze→fill→validate 왕복
|
|
191
191
|
- 실사용 시나리오 테스트 3회 (백지 생성 12분 완주, 장·표 동적 추가, 보도자료 변환)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: table-calc
|
|
3
|
-
description: 보고서 표 수치 작업 — 증감(△·▲▽·↑↓·%·%p), 비율, 순번, 세자리 콤마, 합계·역합계 계산과 공무원 관습 표기. hwpx 표에 "증감 채워줘", "비율 계산해서 넣어줘", "합계 맞춰줘", "표 계산해줘" 요청 시 사용. Triggers: calculate table totals in Korean report style.
|
|
3
|
+
description: 보고서 표 수치 작업 — 증감(△·▲▽·↑↓·%·%p), 비율, 순번, 세자리 콤마, 합계·역합계 계산과 공무원 관습 표기. hwpx 표에 "증감 채워줘", "비율 계산해서 넣어줘", "합계 맞춰줘", "표 계산해줘", "천원/백만원 단위로 바꿔줘" 요청 시 사용. Triggers: calculate table totals in Korean report style.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# table-calc: 표 수치 계산·표기
|
|
@@ -36,6 +36,16 @@ description: 보고서 표 수치 작업 — 증감(△·▲▽·↑↓·%·%p),
|
|
|
36
36
|
- **검산**: 채우기 전에 합계 행이 항목 합과 일치하는지 확인, 불일치하면 채우지
|
|
37
37
|
말고 사용자에게 보고
|
|
38
38
|
|
|
39
|
+
## 표 단위 변환 — "이 표 천원/백만원 단위로 바꿔줘"
|
|
40
|
+
|
|
41
|
+
1. `table-map`으로 대상 표의 수치 셀 수집 (원 단위 원본 값)
|
|
42
|
+
2. 셀마다 `hwpx-kit fmt --scale <원값> --unit 천원` (또는 백만원) — 사사오입
|
|
43
|
+
반올림+콤마를 도구가 보장 (암산 금지). 여러 값이면 fmt를 && 체이닝
|
|
44
|
+
3. `table-set --data`로 일괄 기입 + 표 위/아래에 `(단위: 천원)` 캡션이 없으면
|
|
45
|
+
text: 교체나 table-set으로 추가 (캡션 위치는 문서 관례 — 보통 표 우측 상단)
|
|
46
|
+
4. **검산**: 변환 후 합계 행 = 항목 합 (반올림 누적 오차로 ±1 어긋나면
|
|
47
|
+
합계 셀은 원값 합의 변환값으로 맞추고 사용자에게 알림)
|
|
48
|
+
|
|
39
49
|
## 착지 (문서에 쓰기)
|
|
40
50
|
|
|
41
51
|
계산 결과는 hwpx-form 스킬의 fill 계약으로 셀에 넣는다 — 새 방식을 만들지 말 것:
|
|
@@ -196,6 +196,8 @@ def _build_parser() -> argparse.ArgumentParser:
|
|
|
196
196
|
pt.add_argument("--date", help="날짜 YYYYMMDD → YYYY.M.D.(요일)")
|
|
197
197
|
pt.add_argument("--age", help="생년월일 YYMMDD → YYMMDD(만나이)")
|
|
198
198
|
pt.add_argument("--base", help="만나이 기준일 YYYYMMDD (기본 오늘)")
|
|
199
|
+
pt.add_argument("--scale", help="원 단위 금액 → --unit 단위로 환산 (반올림·콤마)")
|
|
200
|
+
pt.add_argument("--unit", default="천원", choices=["천원", "백만원"], help="--scale 대상 단위 (기본 천원)")
|
|
199
201
|
pt.add_argument("--json", action="store_true")
|
|
200
202
|
|
|
201
203
|
return p
|
|
@@ -240,6 +242,7 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
240
242
|
data = run_fmt(
|
|
241
243
|
amount=args.amount, date=args.date, age=args.age,
|
|
242
244
|
base=args.base, style=args.style,
|
|
245
|
+
scale=args.scale, unit=args.unit,
|
|
243
246
|
)
|
|
244
247
|
elif args.command == "row-height":
|
|
245
248
|
data = run_row_height(
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"""
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
7
|
-
from hwpx_kit.format import format_amount, gongmun_date, korean_age
|
|
7
|
+
from hwpx_kit.format import format_amount, gongmun_date, korean_age, scale_amount
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
def run_fmt(
|
|
@@ -13,10 +13,20 @@ def run_fmt(
|
|
|
13
13
|
age: str | None = None,
|
|
14
14
|
base: str | None = None,
|
|
15
15
|
style: str = "gongmun",
|
|
16
|
+
scale: str | None = None,
|
|
17
|
+
unit: str = "천원",
|
|
16
18
|
) -> dict:
|
|
17
|
-
targets = [k for k, v in (("amount", amount), ("date", date), ("age", age)
|
|
19
|
+
targets = [k for k, v in (("amount", amount), ("date", date), ("age", age),
|
|
20
|
+
("scale", scale)) if v is not None]
|
|
18
21
|
if len(targets) != 1:
|
|
19
|
-
raise ValueError("--amount / --date / --age 중 정확히 하나를 지정하세요.")
|
|
22
|
+
raise ValueError("--amount / --date / --age / --scale 중 정확히 하나를 지정하세요.")
|
|
23
|
+
|
|
24
|
+
if scale is not None:
|
|
25
|
+
cleaned = scale.replace(",", "").strip()
|
|
26
|
+
if not cleaned.isdigit():
|
|
27
|
+
raise ValueError(f"금액은 정수여야 합니다: {scale}")
|
|
28
|
+
return {"kind": "scale", "input": scale, "unit": unit,
|
|
29
|
+
"result": scale_amount(int(cleaned), unit)}
|
|
20
30
|
|
|
21
31
|
if amount is not None:
|
|
22
32
|
cleaned = amount.replace(",", "").strip()
|
|
@@ -92,3 +92,21 @@ def korean_age(yymmdd: str, base: str | None = None) -> str:
|
|
|
92
92
|
if age < 0:
|
|
93
93
|
raise ValueError("기준일이 생년월일보다 앞섭니다.")
|
|
94
94
|
return f"{digits}({age})"
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
_SCALE_UNITS = {"천원": 1_000, "백만원": 1_000_000}
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def scale_amount(won: int, unit: str) -> str:
|
|
101
|
+
"""원 단위 금액 → 천원/백만원 단위 문자열 (반올림, 세 자리 콤마).
|
|
102
|
+
|
|
103
|
+
예산표 "단위: 천원" 관습용. 반내림이 필요한 특수 규정은 호출자가 처리.
|
|
104
|
+
"""
|
|
105
|
+
from decimal import ROUND_HALF_UP, Decimal
|
|
106
|
+
|
|
107
|
+
divisor = _SCALE_UNITS.get(unit)
|
|
108
|
+
if divisor is None:
|
|
109
|
+
raise ValueError(f"지원 단위: {', '.join(_SCALE_UNITS)} (받은 값: {unit})")
|
|
110
|
+
# 파이썬 round()는 은행가 반올림(0.5→0) — 행정 관습은 사사오입(0.5→1)
|
|
111
|
+
scaled = int((Decimal(won) / Decimal(divisor)).quantize(Decimal(1), rounding=ROUND_HALF_UP))
|
|
112
|
+
return f"{scaled:,}"
|
|
@@ -144,3 +144,42 @@ def test_cli_fmt_requires_exactly_one(capsys):
|
|
|
144
144
|
env = _last_json(capsys)
|
|
145
145
|
assert code == 1
|
|
146
146
|
assert env["ok"] is False
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
# ── 표 단위 변환 (천원/백만원) ────────────────────────────────
|
|
150
|
+
|
|
151
|
+
def test_scale_amount_to_cheonwon():
|
|
152
|
+
from hwpx_kit.format import scale_amount
|
|
153
|
+
|
|
154
|
+
# 관습: 반올림, 세 자리 콤마
|
|
155
|
+
assert scale_amount(1234567, "천원") == "1,235"
|
|
156
|
+
assert scale_amount(1000, "천원") == "1"
|
|
157
|
+
assert scale_amount(37000000, "천원") == "37,000"
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def test_scale_amount_to_baekmanwon():
|
|
161
|
+
from hwpx_kit.format import scale_amount
|
|
162
|
+
|
|
163
|
+
assert scale_amount(37000000, "백만원") == "37"
|
|
164
|
+
assert scale_amount(1234567890, "백만원") == "1,235"
|
|
165
|
+
assert scale_amount(500000, "백만원") == "1" # 반올림 올라감
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def test_scale_amount_rejects_unknown_unit():
|
|
169
|
+
import pytest as _pytest
|
|
170
|
+
|
|
171
|
+
from hwpx_kit.format import scale_amount
|
|
172
|
+
|
|
173
|
+
with _pytest.raises(ValueError):
|
|
174
|
+
scale_amount(1000, "억원")
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def test_cli_fmt_scale(capsys):
|
|
178
|
+
import json as _json
|
|
179
|
+
|
|
180
|
+
from hwpx_kit.cli import main
|
|
181
|
+
|
|
182
|
+
code = main(["fmt", "--scale", "1,234,567", "--unit", "천원", "--json"])
|
|
183
|
+
env = _json.loads(capsys.readouterr().out.strip().splitlines()[-1])
|
|
184
|
+
assert code == 0
|
|
185
|
+
assert env["data"]["result"] == "1,235"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|