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.
Files changed (93) hide show
  1. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/.claude-plugin/plugin.json +1 -1
  2. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/PKG-INFO +3 -3
  3. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/README.md +2 -2
  4. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/pyproject.toml +1 -1
  5. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/skills/table-calc/SKILL.md +11 -1
  6. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/cli.py +3 -0
  7. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/fmt.py +13 -3
  8. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/format.py +18 -0
  9. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_format.py +39 -0
  10. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/.claude-plugin/marketplace.json +0 -0
  11. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  12. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  13. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/.github/workflows/tests.yml +0 -0
  14. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/.gitignore +0 -0
  15. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/CLAUDE.md +0 -0
  16. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/LICENSE +0 -0
  17. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/commands/hwpx.md +0 -0
  18. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/docs/images/After.png +0 -0
  19. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/docs/images/Before.png +0 -0
  20. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/docs/images/Tasking.png +0 -0
  21. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/install.ps1 +0 -0
  22. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/install.sh +0 -0
  23. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/sample-values.json +0 -0
  24. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/scripts/build_skill_package.py +0 -0
  25. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/scripts/check_stdout_purity.py +0 -0
  26. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/scripts/make_sample.py +0 -0
  27. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/skills/doc-create/SKILL.md +0 -0
  28. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/skills/format-convert/SKILL.md +0 -0
  29. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/skills/gongmun-format/SKILL.md +0 -0
  30. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/skills/hwpx-form/SKILL.md +0 -0
  31. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/skills/office-export/SKILL.md +0 -0
  32. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/__init__.py +0 -0
  33. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/adapter/__init__.py +0 -0
  34. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/adapter/base.py +0 -0
  35. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/adapter/hwpx_engine.py +0 -0
  36. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/adapter/kordoc_engine.py +0 -0
  37. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/adapter/office_readers.py +0 -0
  38. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/__init__.py +0 -0
  39. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/analyze.py +0 -0
  40. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/convert.py +0 -0
  41. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/export.py +0 -0
  42. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/fill.py +0 -0
  43. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/fill_batch.py +0 -0
  44. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/generate.py +0 -0
  45. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/header_footer.py +0 -0
  46. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/image_add.py +0 -0
  47. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/inspect_doc.py +0 -0
  48. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/outline.py +0 -0
  49. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/page_break.py +0 -0
  50. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/read.py +0 -0
  51. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/render.py +0 -0
  52. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/row_height.py +0 -0
  53. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/table_clear.py +0 -0
  54. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/table_copy.py +0 -0
  55. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/table_map_cmd.py +0 -0
  56. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/table_new.py +0 -0
  57. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/table_rows.py +0 -0
  58. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/table_set.py +0 -0
  59. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/commands/validate.py +0 -0
  60. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/inspect_rules.py +0 -0
  61. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/src/hwpx_kit/output.py +0 -0
  62. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/templates/Default_Template.hwpx +0 -0
  63. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/__init__.py +0 -0
  64. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/conftest.py +0 -0
  65. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/fixtures/real/legacy-sample.hwp +0 -0
  66. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/fixtures/real/seoul-attachment.hwpx +0 -0
  67. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/fixtures/real/seoul-body.hwpx +0 -0
  68. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/fixtures/real/seoul-report-brief.hwpx +0 -0
  69. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/fixtures/real/seoul-report-cover.hwpx +0 -0
  70. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_adapter.py +0 -0
  71. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_analyze.py +0 -0
  72. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_cli.py +0 -0
  73. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_convert.py +0 -0
  74. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_export.py +0 -0
  75. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_fill.py +0 -0
  76. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_fill_batch.py +0 -0
  77. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_image_header.py +0 -0
  78. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_inspect.py +0 -0
  79. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_integration.py +0 -0
  80. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_kordoc.py +0 -0
  81. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_office_readers.py +0 -0
  82. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_output.py +0 -0
  83. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_page_break.py +0 -0
  84. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_read_validate.py +0 -0
  85. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_real_forms.py +0 -0
  86. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_row_height.py +0 -0
  87. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_skill_package.py +0 -0
  88. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_stdout_purity.py +0 -0
  89. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_table_clear.py +0 -0
  90. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_table_copy.py +0 -0
  91. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_table_map_new.py +0 -0
  92. {hwpx_kit_cli-0.4.0 → hwpx_kit_cli-0.4.1}/tests/test_table_rows.py +0 -0
  93. {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.0",
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.0
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
  [![PyPI](https://img.shields.io/pypi/v/hwpx-kit-cli.svg)](https://pypi.org/project/hwpx-kit-cli/)
34
34
  [![Python](https://img.shields.io/badge/python-3.10%2B-3776AB.svg)](https://www.python.org/)
35
35
  [![Claude Code](https://img.shields.io/badge/Claude%20Code-plugin-d97757.svg)](https://claude.com/claude-code)
36
- [![Tests](https://img.shields.io/badge/tests-186%20passing-brightgreen.svg)](tests/)
36
+ [![Tests](https://img.shields.io/badge/tests-190%20passing-brightgreen.svg)](tests/)
37
37
 
38
38
  </div>
39
39
 
@@ -208,7 +208,7 @@ templates/ 기본 계획서 템플릿 (표지·장 헤더·표 골격, 마커
208
208
 
209
209
  ## 검증
210
210
 
211
- - 자동 테스트 186개 (pytest)
211
+ - 자동 테스트 190개 (pytest)
212
212
  - 실서식 수렴 테스트: 보도자료·신청서·계획서·회의록·공고문 5계열,
213
213
  실제 공공기관 문서 30여 종으로 analyze→fill→validate 왕복
214
214
  - 실사용 시나리오 테스트 3회 (백지 생성 12분 완주, 장·표 동적 추가, 보도자료 변환)
@@ -10,7 +10,7 @@
10
10
  [![PyPI](https://img.shields.io/pypi/v/hwpx-kit-cli.svg)](https://pypi.org/project/hwpx-kit-cli/)
11
11
  [![Python](https://img.shields.io/badge/python-3.10%2B-3776AB.svg)](https://www.python.org/)
12
12
  [![Claude Code](https://img.shields.io/badge/Claude%20Code-plugin-d97757.svg)](https://claude.com/claude-code)
13
- [![Tests](https://img.shields.io/badge/tests-186%20passing-brightgreen.svg)](tests/)
13
+ [![Tests](https://img.shields.io/badge/tests-190%20passing-brightgreen.svg)](tests/)
14
14
 
15
15
  </div>
16
16
 
@@ -185,7 +185,7 @@ templates/ 기본 계획서 템플릿 (표지·장 헤더·표 골격, 마커
185
185
 
186
186
  ## 검증
187
187
 
188
- - 자동 테스트 186개 (pytest)
188
+ - 자동 테스트 190개 (pytest)
189
189
  - 실서식 수렴 테스트: 보도자료·신청서·계획서·회의록·공고문 5계열,
190
190
  실제 공공기관 문서 30여 종으로 analyze→fill→validate 왕복
191
191
  - 실사용 시나리오 테스트 3회 (백지 생성 12분 완주, 장·표 동적 추가, 보도자료 변환)
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "hwpx-kit-cli"
3
- version = "0.4.0"
3
+ version = "0.4.1"
4
4
  description = "한글(HWPX) 문서 자동화 CLI — Korean HWPX document automation for AI agents: analyze, fill, read, validate, table ops"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -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)) if v is not None]
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