python-hwpx 5.7.0__tar.gz → 6.0.2__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 (275) hide show
  1. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/NOTICE +8 -0
  2. {python_hwpx-5.7.0/src/python_hwpx.egg-info → python_hwpx-6.0.2}/PKG-INFO +19 -9
  3. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/README.md +18 -8
  4. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/pyproject.toml +51 -1
  5. python_hwpx-5.7.0/src/hwpx/document.py → python_hwpx-6.0.2/src/hwpx/_document/_legacy.py +1177 -1535
  6. python_hwpx-6.0.2/src/hwpx/_document/_resolve.py +173 -0
  7. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/_document/fields.py +212 -62
  8. python_hwpx-6.0.2/src/hwpx/_document/headings.py +187 -0
  9. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/_document/layout.py +171 -59
  10. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/_document/media.py +122 -38
  11. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/_document/memos.py +49 -13
  12. python_hwpx-6.0.2/src/hwpx/_document/ns/__init__.py +68 -0
  13. python_hwpx-6.0.2/src/hwpx/_document/ns/_base.py +40 -0
  14. python_hwpx-6.0.2/src/hwpx/_document/ns/fields.py +160 -0
  15. python_hwpx-6.0.2/src/hwpx/_document/ns/media.py +92 -0
  16. python_hwpx-6.0.2/src/hwpx/_document/ns/notes.py +210 -0
  17. python_hwpx-6.0.2/src/hwpx/_document/ns/page.py +468 -0
  18. python_hwpx-6.0.2/src/hwpx/_document/ns/parts.py +68 -0
  19. python_hwpx-6.0.2/src/hwpx/_document/ns/refs.py +72 -0
  20. python_hwpx-6.0.2/src/hwpx/_document/ns/shapes.py +250 -0
  21. python_hwpx-6.0.2/src/hwpx/_document/ns/styles.py +371 -0
  22. python_hwpx-6.0.2/src/hwpx/_document/ns/tables.py +80 -0
  23. python_hwpx-6.0.2/src/hwpx/_document/ns/text.py +146 -0
  24. python_hwpx-6.0.2/src/hwpx/_document/ns/tracking.py +151 -0
  25. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/_document/persistence.py +11 -3
  26. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/_document/shapes.py +44 -15
  27. python_hwpx-6.0.2/src/hwpx/_document/tracked.py +242 -0
  28. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/body_patch.py +78 -12
  29. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/capabilities.py +275 -3
  30. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/data/contract_docs/support-matrix.md +34 -2
  31. python_hwpx-6.0.2/src/hwpx/document.py +785 -0
  32. python_hwpx-6.0.2/src/hwpx/errors.py +270 -0
  33. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/layout/lint.py +8 -3
  34. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/layout/report.py +11 -2
  35. python_hwpx-6.0.2/src/hwpx/model.py +78 -0
  36. python_hwpx-6.0.2/src/hwpx/objects/__init__.py +57 -0
  37. python_hwpx-6.0.2/src/hwpx/objects/binary_item.py +58 -0
  38. python_hwpx-6.0.2/src/hwpx/objects/checkbox.py +103 -0
  39. python_hwpx-6.0.2/src/hwpx/objects/form_field.py +191 -0
  40. python_hwpx-6.0.2/src/hwpx/objects/results.py +242 -0
  41. python_hwpx-6.0.2/src/hwpx/objects/tracked.py +66 -0
  42. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/_document_primitives.py +71 -0
  43. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/document_parts.py +28 -12
  44. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/header_part.py +114 -3
  45. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/memo.py +78 -0
  46. python_hwpx-6.0.2/src/hwpx/oxml/section_format.py +1178 -0
  47. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/patch.py +22 -1
  48. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/quality/report.py +34 -2
  49. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/quality/save_pipeline.py +21 -4
  50. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/table_patch.py +1 -1
  51. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/idempotence.py +7 -5
  52. {python_hwpx-5.7.0 → python_hwpx-6.0.2/src/python_hwpx.egg-info}/PKG-INFO +19 -9
  53. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/python_hwpx.egg-info/SOURCES.txt +40 -0
  54. python_hwpx-6.0.2/tests/test_add_heading.py +289 -0
  55. python_hwpx-6.0.2/tests/test_body_patch.py +162 -0
  56. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_capabilities_surface.py +62 -1
  57. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_check_box_authoring.py +8 -8
  58. python_hwpx-6.0.2/tests/test_coverage_ledger.py +414 -0
  59. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_document_facade_surface.py +14 -3
  60. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_document_formatting.py +241 -0
  61. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_documentation_code_fences.py +1 -1
  62. python_hwpx-6.0.2/tests/test_engine_surface_6_0.py +447 -0
  63. python_hwpx-6.0.2/tests/test_error_contract.py +235 -0
  64. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_existing_document_format_editing.py +9 -6
  65. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_form_field_authoring.py +30 -31
  66. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_form_fields.py +16 -15
  67. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_form_fit_integration.py +18 -12
  68. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_golden_api.py +4 -4
  69. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_image_object_workflow.py +4 -4
  70. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_memo_and_style_editing.py +19 -7
  71. python_hwpx-6.0.2/tests/test_namespace_hygiene.py +151 -0
  72. python_hwpx-6.0.2/tests/test_ns_fields.py +157 -0
  73. python_hwpx-6.0.2/tests/test_ns_media.py +94 -0
  74. python_hwpx-6.0.2/tests/test_ns_notes.py +120 -0
  75. python_hwpx-6.0.2/tests/test_ns_page.py +237 -0
  76. python_hwpx-6.0.2/tests/test_ns_refs.py +65 -0
  77. python_hwpx-6.0.2/tests/test_ns_shapes.py +77 -0
  78. python_hwpx-6.0.2/tests/test_ns_tables.py +109 -0
  79. python_hwpx-6.0.2/tests/test_ns_tracking.py +142 -0
  80. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_product_boundary.py +6 -1
  81. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_public_artifact_hygiene.py +5 -0
  82. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_redline_authoring.py +13 -7
  83. python_hwpx-6.0.2/tests/test_return_contract.py +517 -0
  84. python_hwpx-6.0.2/tests/test_section_properties_real_roundtrip.py +101 -0
  85. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_set_paragraph_format_keep.py +1 -1
  86. python_hwpx-6.0.2/tests/test_style_resolution.py +295 -0
  87. python_hwpx-5.7.0/src/hwpx/_document/tracked.py +0 -170
  88. python_hwpx-5.7.0/src/hwpx/errors.py +0 -77
  89. python_hwpx-5.7.0/src/hwpx/oxml/section_format.py +0 -513
  90. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/LICENSE +0 -0
  91. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/setup.cfg +0 -0
  92. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/__init__.py +0 -0
  93. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/_document/__init__.py +0 -0
  94. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/_document/_units.py +0 -0
  95. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/data/Skeleton.hwpx +0 -0
  96. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/data/contract_docs/known-traps.md +0 -0
  97. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/data/contract_docs/mutation-semantics.md +0 -0
  98. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/data/contract_docs/recipes-traversal.md +0 -0
  99. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/equation/__init__.py +0 -0
  100. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/equation/authoring.py +0 -0
  101. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/equation/eqedit.py +0 -0
  102. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/equation/mathml.py +0 -0
  103. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/equation/render.py +0 -0
  104. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/equation/tokens.py +0 -0
  105. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/experimental.py +0 -0
  106. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/form_fit/__init__.py +0 -0
  107. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/form_fit/apply.py +0 -0
  108. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/form_fit/engine.py +0 -0
  109. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/form_fit/measure.py +0 -0
  110. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/form_fit/policy.py +0 -0
  111. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/form_fit/report.py +0 -0
  112. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/ingest/__init__.py +0 -0
  113. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/ingest/base.py +0 -0
  114. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/ingest/hwpx_converter.py +0 -0
  115. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/layout/__init__.py +0 -0
  116. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/mutation_report.py +0 -0
  117. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/opc/package.py +0 -0
  118. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/opc/relationships.py +0 -0
  119. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/opc/security.py +0 -0
  120. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/opc/xml_utils.py +0 -0
  121. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/__init__.py +0 -0
  122. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/_document_impl.py +0 -0
  123. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/body.py +0 -0
  124. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/canonical_defaults.py +0 -0
  125. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/color.py +0 -0
  126. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/common.py +0 -0
  127. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/document.py +0 -0
  128. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/header.py +0 -0
  129. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/namespaces.py +0 -0
  130. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/numbering.py +0 -0
  131. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/objects.py +0 -0
  132. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/paragraph.py +0 -0
  133. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/parser.py +0 -0
  134. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/run.py +0 -0
  135. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/schema.py +0 -0
  136. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/section.py +0 -0
  137. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/section_story.py +0 -0
  138. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/simple_parts.py +0 -0
  139. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/table.py +0 -0
  140. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/utils.py +0 -0
  141. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/package.py +0 -0
  142. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/plan/__init__.py +0 -0
  143. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/plan/_execute.py +0 -0
  144. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/plan/_model.py +0 -0
  145. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/plan/_schema.py +0 -0
  146. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/plan/_validate.py +0 -0
  147. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/py.typed +0 -0
  148. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/quality/__init__.py +0 -0
  149. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/quality/ledger.py +0 -0
  150. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/quality/policy.py +0 -0
  151. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/quality/rendering.py +0 -0
  152. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/templates.py +0 -0
  153. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/__init__.py +0 -0
  154. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/_schemas/header.xsd +0 -0
  155. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/_schemas/section.xsd +0 -0
  156. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/archive_cli.py +0 -0
  157. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/doc_diff.py +0 -0
  158. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/document_viewer.py +0 -0
  159. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/exporter.py +0 -0
  160. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/generic_inventory.py +0 -0
  161. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/id_integrity.py +0 -0
  162. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/ir_equality.py +0 -0
  163. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/layout_preview.py +0 -0
  164. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/mail_merge.py +0 -0
  165. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/markdown_export.py +0 -0
  166. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/object_finder.py +0 -0
  167. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/package_reconcile.py +0 -0
  168. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/package_validator.py +0 -0
  169. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/page_guard.py +0 -0
  170. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/read_fidelity.py +0 -0
  171. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/recover.py +0 -0
  172. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/redline.py +0 -0
  173. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/repair.py +0 -0
  174. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/report_utils.py +0 -0
  175. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/roundtrip_diff.py +0 -0
  176. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/table_cleanup.py +0 -0
  177. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/table_navigation.py +0 -0
  178. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/template_analyzer.py +0 -0
  179. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/text_extract_cli.py +0 -0
  180. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/text_extractor.py +0 -0
  181. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/toc_author.py +0 -0
  182. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/toc_fidelity.py +0 -0
  183. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/validator.py +0 -0
  184. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/python_hwpx.egg-info/dependency_links.txt +0 -0
  185. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/python_hwpx.egg-info/entry_points.txt +0 -0
  186. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/python_hwpx.egg-info/requires.txt +0 -0
  187. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/python_hwpx.egg-info/top_level.txt +0 -0
  188. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_add_control.py +0 -0
  189. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_adoption_metrics_snapshot.py +0 -0
  190. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_authoring_defaults.py +0 -0
  191. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_authoring_quality_corpus.py +0 -0
  192. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_blind_eval_fixture.py +0 -0
  193. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_byte_patch_identity.py +0 -0
  194. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_cell_line_spacing.py +0 -0
  195. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_chart_authoring.py +0 -0
  196. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_comment_node_robustness.py +0 -0
  197. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_contract_docs_sync.py +0 -0
  198. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_corpus_read_fidelity.py +0 -0
  199. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_coverage_promotion.py +0 -0
  200. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_coverage_targets.py +0 -0
  201. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_deviations_registry.py +0 -0
  202. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_doc_diff.py +0 -0
  203. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_document_context_manager.py +0 -0
  204. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_document_ops_runtime_boundary.py +0 -0
  205. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_document_save_api.py +0 -0
  206. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_document_viewer.py +0 -0
  207. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_edit_plan.py +0 -0
  208. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_equation_authoring.py +0 -0
  209. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_equation_converter.py +0 -0
  210. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_equation_render.py +0 -0
  211. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_error_messages.py +0 -0
  212. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_evalplan_core_primitives.py +0 -0
  213. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_form_fill_core_primitives.py +0 -0
  214. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_form_fit.py +0 -0
  215. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_fuzz_catalog_derive_expected.py +0 -0
  216. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_fuzz_loop.py +0 -0
  217. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_fuzz_regressions.py +0 -0
  218. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_gap_closure_tools.py +0 -0
  219. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_hp_tab_support.py +0 -0
  220. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_hwpxlib_corpus_read.py +0 -0
  221. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_id_generator_range.py +0 -0
  222. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_ingest.py +0 -0
  223. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_inline_models.py +0 -0
  224. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_integration_hwpx_compatibility.py +0 -0
  225. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_integration_roundtrip.py +0 -0
  226. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_layout_cache_scope.py +0 -0
  227. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_layout_lint.py +0 -0
  228. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_layout_preview.py +0 -0
  229. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_library_boundary_closure.py +0 -0
  230. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_llms_txt.py +0 -0
  231. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_mail_merge_xlsx.py +0 -0
  232. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_markdown_export.py +0 -0
  233. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_moved_surface_hints.py +0 -0
  234. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_mutation_report.py +0 -0
  235. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_namespace_handling.py +0 -0
  236. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_new_features.py +0 -0
  237. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_note_authoring_contract.py +0 -0
  238. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_opc_package.py +0 -0
  239. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_open_safety_corpus.py +0 -0
  240. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_oxml_modularization.py +0 -0
  241. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_oxml_parsing.py +0 -0
  242. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_packaging_license_metadata.py +0 -0
  243. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_packaging_py_typed.py +0 -0
  244. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_paragraph_keep_together.py +0 -0
  245. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_paragraph_section_management.py +0 -0
  246. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_public_runtime_boundary.py +0 -0
  247. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_read_fidelity.py +0 -0
  248. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_recover_broken_zip.py +0 -0
  249. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_redline_verify.py +0 -0
  250. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_release_workflow_safety.py +0 -0
  251. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_repair_repack.py +0 -0
  252. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_report_utils.py +0 -0
  253. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_repr_snapshots.py +0 -0
  254. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_roundtrip_fidelity.py +0 -0
  255. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_row_heights.py +0 -0
  256. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_save_pipeline.py +0 -0
  257. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_section_headers.py +0 -0
  258. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_shape_geometry_contract.py +0 -0
  259. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_skeleton_template_ids.py +0 -0
  260. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_split_cell.py +0 -0
  261. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_split_merged_cell.py +0 -0
  262. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_stable_surface.py +0 -0
  263. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_table_cleanup.py +0 -0
  264. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_table_navigation.py +0 -0
  265. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_table_patch.py +0 -0
  266. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_table_patch_dryrun.py +0 -0
  267. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_table_patch_m105.py +0 -0
  268. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_tables_default_border.py +0 -0
  269. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_template_analyzer_enrichment.py +0 -0
  270. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_text_extractor_annotations.py +0 -0
  271. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_toc_author.py +0 -0
  272. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_toc_fidelity.py +0 -0
  273. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_validation_severity.py +0 -0
  274. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_validator_comment_nodes.py +0 -0
  275. {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_version_metadata.py +0 -0
@@ -58,6 +58,14 @@ neolord0/hwpxlib (https://github.com/neolord0/hwpxlib), licensed Apache-2.0.
58
58
  Only sample DATA files are vendored; no hwpxlib source code or structure is
59
59
  copied (clean-room). Pinned ref is recorded in manifest.json.
60
60
 
61
+ ## Hancom file-format specification attribution
62
+
63
+ Parts of this project were developed with reference to the publicly
64
+ released Hancom file-format documentation (HWP 5.0 / HWPML) and the
65
+ public OWPML schema. As required by that documentation:
66
+
67
+ “본 제품은 한글과컴퓨터의 ᄒᆞᆫ글 문서 파일(.hwp) 공개 문서를 참고하여 개발하였습니다.”
68
+
61
69
  ────────────────────────────────────────
62
70
  DISCLAIMER — HWPX Format
63
71
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-hwpx
3
- Version: 5.7.0
3
+ Version: 6.0.2
4
4
  Summary: 한글 없이 HWPX 문서를 열고, 편집하고, 생성하고, 검증하는 Python 문서 라이브러리
5
5
  Author: python-hwpx Maintainers
6
6
  License-Expression: Apache-2.0
@@ -100,16 +100,21 @@ AI 도구가 정확한 API를 배우도록 [llms.txt](https://airmang.github.io/
100
100
  pip install python-hwpx # Python 3.10+
101
101
  ```
102
102
 
103
+ <!-- standalone-python-example -->
104
+
103
105
  ```python
104
106
  from hwpx import HwpxDocument
105
107
 
106
- doc = HwpxDocument.open("보고서.hwpx")
107
- doc.add_paragraph("자동화로 추가한 문단입니다.")
108
- doc.save_to_path("보고서-수정.hwpx")
108
+ doc = HwpxDocument.new()
109
+ doc.add_heading("2026 운영계획", level=1)
110
+ doc.add_paragraph("가. 추진 배경", style="개요 2")
111
+ doc.save_to_path("계획.hwpx")
109
112
  ```
110
113
 
111
- 백지에서 시작할 때는 `HwpxDocument.new()`로 만들어 같은 API로 문단·표·머리말을
112
- 채우면 됩니다. 문서 저작·양식 채움·시험지 조판 같은 상위 워크플로가 필요하면
114
+ 스타일은 이름으로 지정하고, 오타는 저장이 아니라 **그 줄에서** 잡힌다.
115
+ 기존 문서를 고치려면 `HwpxDocument.open("보고서.hwpx")`로 시작하면 된다.
116
+
117
+ 문서 저작·양식 채움·시험지 조판 같은 상위 워크플로가 필요하면
113
118
  [`python-hwpx-automation`](https://github.com/airmang/python-hwpx-automation)을
114
119
  함께 설치하세요.
115
120
 
@@ -158,10 +163,15 @@ print(report.preservation.untouched_part_payloads.to_dict())
158
163
 
159
164
  ## 실측으로 말합니다
160
165
 
161
- 만든 파일이 실제 한컴오피스에서 열리는지, 동결 코퍼스 전수(N=497)를 재서
162
- 그대로 공개합니다:
166
+ 만든 파일이 실제 한컴오피스에서 열리는지 재서 그대로 공개합니다. 측정마다
167
+ 스택과 날짜를 병기합니다:
163
168
 
164
- - **한컴 열림 476/476** — 우리가 만든 파일을 실한컴이 전부 엽니다
169
+ - **한컴 열림 120/120 · 렌더 검증 120/120** — 현행 스택(5.7.0 · 실한컴
170
+ 12.0.0.3288 · 2026-08-03)의 축소 측정: 기준 스트라텀 + 신규 저작 표면
171
+ 6종(각주·누름틀·수식·차트·체크박스·편집 계획). 영수증은 행마다 bucket이
172
+ 있어 `jq` 한 줄로 재현됩니다
173
+ - **한컴 열림 476/476** — 전수 동결 코퍼스(N=497) 측정
174
+ (3.4.1 · 실한컴 12.0.0.3288 · 2026-07-19)
165
175
  - **미수정 영역 바이트 보존 497/497** · 개인정보 유출 0
166
176
  - **렌더 검증 416/476** — 한컴 자체가 PDF 내보내기를 거부한 43건도 숨기지 않고 집계
167
177
  - 전체 수치와 주의사항: [실측 코퍼스 메트릭](https://airmang.github.io/python-hwpx/corpus-metrics.html) · 기능별 등급: [지원 매트릭스](docs/support-matrix.md)
@@ -49,16 +49,21 @@ AI 도구가 정확한 API를 배우도록 [llms.txt](https://airmang.github.io/
49
49
  pip install python-hwpx # Python 3.10+
50
50
  ```
51
51
 
52
+ <!-- standalone-python-example -->
53
+
52
54
  ```python
53
55
  from hwpx import HwpxDocument
54
56
 
55
- doc = HwpxDocument.open("보고서.hwpx")
56
- doc.add_paragraph("자동화로 추가한 문단입니다.")
57
- doc.save_to_path("보고서-수정.hwpx")
57
+ doc = HwpxDocument.new()
58
+ doc.add_heading("2026 운영계획", level=1)
59
+ doc.add_paragraph("가. 추진 배경", style="개요 2")
60
+ doc.save_to_path("계획.hwpx")
58
61
  ```
59
62
 
60
- 백지에서 시작할 때는 `HwpxDocument.new()`로 만들어 같은 API로 문단·표·머리말을
61
- 채우면 됩니다. 문서 저작·양식 채움·시험지 조판 같은 상위 워크플로가 필요하면
63
+ 스타일은 이름으로 지정하고, 오타는 저장이 아니라 **그 줄에서** 잡힌다.
64
+ 기존 문서를 고치려면 `HwpxDocument.open("보고서.hwpx")`로 시작하면 된다.
65
+
66
+ 문서 저작·양식 채움·시험지 조판 같은 상위 워크플로가 필요하면
62
67
  [`python-hwpx-automation`](https://github.com/airmang/python-hwpx-automation)을
63
68
  함께 설치하세요.
64
69
 
@@ -107,10 +112,15 @@ print(report.preservation.untouched_part_payloads.to_dict())
107
112
 
108
113
  ## 실측으로 말합니다
109
114
 
110
- 만든 파일이 실제 한컴오피스에서 열리는지, 동결 코퍼스 전수(N=497)를 재서
111
- 그대로 공개합니다:
115
+ 만든 파일이 실제 한컴오피스에서 열리는지 재서 그대로 공개합니다. 측정마다
116
+ 스택과 날짜를 병기합니다:
112
117
 
113
- - **한컴 열림 476/476** — 우리가 만든 파일을 실한컴이 전부 엽니다
118
+ - **한컴 열림 120/120 · 렌더 검증 120/120** — 현행 스택(5.7.0 · 실한컴
119
+ 12.0.0.3288 · 2026-08-03)의 축소 측정: 기준 스트라텀 + 신규 저작 표면
120
+ 6종(각주·누름틀·수식·차트·체크박스·편집 계획). 영수증은 행마다 bucket이
121
+ 있어 `jq` 한 줄로 재현됩니다
122
+ - **한컴 열림 476/476** — 전수 동결 코퍼스(N=497) 측정
123
+ (3.4.1 · 실한컴 12.0.0.3288 · 2026-07-19)
114
124
  - **미수정 영역 바이트 보존 497/497** · 개인정보 유출 0
115
125
  - **렌더 검증 416/476** — 한컴 자체가 PDF 내보내기를 거부한 43건도 숨기지 않고 집계
116
126
  - 전체 수치와 주의사항: [실측 코퍼스 메트릭](https://airmang.github.io/python-hwpx/corpus-metrics.html) · 기능별 등급: [지원 매트릭스](docs/support-matrix.md)
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "python-hwpx"
7
- version = "5.7.0"
7
+ version = "6.0.2"
8
8
  description = "한글 없이 HWPX 문서를 열고, 편집하고, 생성하고, 검증하는 Python 문서 라이브러리"
9
9
  readme = { file = "README.md", content-type = "text/markdown" }
10
10
  license = "Apache-2.0"
@@ -102,11 +102,17 @@ include-package-data = true
102
102
  packages = [
103
103
  "hwpx",
104
104
  "hwpx._document",
105
+ # 6.0: 루트 표면 34 뒤의 11개 도메인 네임스페이스. 이 줄이 없으면 휠이
106
+ # `hwpx._document.ns` 없이 나가고 `import hwpx` 자체가 깨진다 — 소스
107
+ # 트리에서만 통과하는 종류의 결함이라 doc-fence 휠 실행 게이트가 잡았다.
108
+ "hwpx._document.ns",
105
109
  "hwpx.data",
106
110
  "hwpx.equation",
107
111
  "hwpx.form_fit",
108
112
  "hwpx.ingest",
109
113
  "hwpx.layout",
114
+ # 6.0: add_* 가 반환하는 도메인 객체·결과 dataclass (WP-C가 채운다).
115
+ "hwpx.objects",
110
116
  "hwpx.opc",
111
117
  "hwpx.oxml",
112
118
  "hwpx.plan",
@@ -162,6 +168,28 @@ files = [
162
168
  "src/hwpx/tools/mail_merge.py",
163
169
  "src/hwpx/tools/redline.py",
164
170
  "src/hwpx/_document/_units.py",
171
+ # 6.0 (062-engine-surface WP-A): 새 모듈은 게이트 안에서 태어난다. 이
172
+ # 목록이 옛 모듈을 점진 편입하는 것이라고 해서, 새로 만드는 것까지 밖에
173
+ # 둘 이유는 없다.
174
+ #
175
+ # 예외 하나: `_document/_legacy.py`. 본문이 5.8.0 `document.py`의 것을
176
+ # **그대로** 옮긴 것이고(그 자리에서는 타입 청결했다), 믹스인으로 분리된
177
+ # 탓에 `self`가 `HwpxDocument`가 아니라 `Self@_LegacyFacade`로 좁혀져
178
+ # 위임 호출 52건이 전부 같은 한 가지 이유로 붉어진다. `self` 주석을 달면
179
+ # `inspect.signature`가 바뀌어 shim 락의 시그니처 동일성(이주 창의 핵심
180
+ # 약속)이 깨진다. 7.0에서 파일째 삭제되므로 편입하지 않는다.
181
+ "src/hwpx/model.py",
182
+ "src/hwpx/objects/__init__.py",
183
+ # 6.0 (062-engine-surface WP-C): 반환 규약 소유 모듈 5종 — 같은 이유로
184
+ # 게이트 안에서 태어난다(위 WP-A 주석 참조).
185
+ "src/hwpx/objects/binary_item.py",
186
+ "src/hwpx/objects/checkbox.py",
187
+ "src/hwpx/objects/form_field.py",
188
+ "src/hwpx/objects/results.py",
189
+ "src/hwpx/objects/tracked.py",
190
+ "src/hwpx/_document/_resolve.py",
191
+ "src/hwpx/_document/headings.py",
192
+ "src/hwpx/_document/ns",
165
193
  "src/hwpx/_document/fields.py",
166
194
  "src/hwpx/_document/layout.py",
167
195
  "src/hwpx/_document/media.py",
@@ -223,6 +251,28 @@ include = [
223
251
  "src/hwpx/tools/mail_merge.py",
224
252
  "src/hwpx/tools/redline.py",
225
253
  "src/hwpx/_document/_units.py",
254
+ # 6.0 (062-engine-surface WP-A): 새 모듈은 게이트 안에서 태어난다. 이
255
+ # 목록이 옛 모듈을 점진 편입하는 것이라고 해서, 새로 만드는 것까지 밖에
256
+ # 둘 이유는 없다.
257
+ #
258
+ # 예외 하나: `_document/_legacy.py`. 본문이 5.8.0 `document.py`의 것을
259
+ # **그대로** 옮긴 것이고(그 자리에서는 타입 청결했다), 믹스인으로 분리된
260
+ # 탓에 `self`가 `HwpxDocument`가 아니라 `Self@_LegacyFacade`로 좁혀져
261
+ # 위임 호출 52건이 전부 같은 한 가지 이유로 붉어진다. `self` 주석을 달면
262
+ # `inspect.signature`가 바뀌어 shim 락의 시그니처 동일성(이주 창의 핵심
263
+ # 약속)이 깨진다. 7.0에서 파일째 삭제되므로 편입하지 않는다.
264
+ "src/hwpx/model.py",
265
+ "src/hwpx/objects/__init__.py",
266
+ # 6.0 (062-engine-surface WP-C): 반환 규약 소유 모듈 5종 — 같은 이유로
267
+ # 게이트 안에서 태어난다(위 WP-A 주석 참조).
268
+ "src/hwpx/objects/binary_item.py",
269
+ "src/hwpx/objects/checkbox.py",
270
+ "src/hwpx/objects/form_field.py",
271
+ "src/hwpx/objects/results.py",
272
+ "src/hwpx/objects/tracked.py",
273
+ "src/hwpx/_document/_resolve.py",
274
+ "src/hwpx/_document/headings.py",
275
+ "src/hwpx/_document/ns",
226
276
  "src/hwpx/_document/fields.py",
227
277
  "src/hwpx/_document/layout.py",
228
278
  "src/hwpx/_document/media.py",