athena-python-docx 0.11.3__tar.gz → 0.13.0__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 (343) hide show
  1. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/CLAUDE.md +206 -0
  2. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/PKG-INFO +1 -1
  3. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/__init__.py +1 -1
  4. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/_http_doc.py +73 -9
  5. athena_python_docx-0.13.0/docx/_postproc.py +1627 -0
  6. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/client.py +8 -0
  7. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/commands.py +36 -1
  8. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/document.py +189 -1
  9. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/oxml/__init__.py +100 -4
  10. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/section.py +65 -3
  11. athena_python_docx-0.13.0/docx/session.py +27 -0
  12. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/table.py +417 -33
  13. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/text/paragraph.py +379 -4
  14. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/text/parfmt.py +100 -35
  15. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/text/run.py +217 -7
  16. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/pyproject.toml +1 -1
  17. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/22_table_cell_paragraphs_iteration.json +3 -0
  18. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/35_full_report.json +0 -3
  19. athena_python_docx-0.13.0/tests/fidelity/op_snapshots/61_cell_paragraph_with_runs.json +19 -0
  20. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/62_many_cell_paragraphs.json +15 -0
  21. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/65_20x20_table_formatted.json +1 -201
  22. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/69_newsletter.json +12 -1
  23. athena_python_docx-0.11.3/tests/fidelity/op_snapshots/61_cell_paragraph_with_runs.json → athena_python_docx-0.13.0/tests/fidelity/op_snapshots/90_cell_add_paragraph_styled.json +5 -4
  24. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/ex10_complex_bom.json +0 -15
  25. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/ex11_banded_rows_formatting.json +0 -40
  26. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/ex13_cell_with_10_paragraphs.json +30 -10
  27. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/ex14_styled_report_table.json +1 -16
  28. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/ex20_kitchen_sink_v2.json +0 -20
  29. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/mega01_book_chapter.json +18 -15
  30. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/mega02_research_proposal.json +0 -3
  31. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/mega03_financial_statement.json +1 -8
  32. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/mega05_user_manual.json +0 -8
  33. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/mega07_budget_spreadsheet.json +1 -11
  34. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/mega09_signed_contract.json +0 -2
  35. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/mega10_api_documentation.json +0 -16
  36. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/rw10_colored_grid_table.json +1 -17
  37. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/parity/reports/GAP_ANALYSIS.md +1 -1
  38. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/parity/reports/gap_report.json +27 -3
  39. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/parity/snapshots/athena_latest.json +772 -25
  40. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_athena_extensions_registry.py +1 -0
  41. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_block_not_found_error.py +18 -13
  42. athena_python_docx-0.13.0/tests/test_cell_inner_add_run_via_cell_insert.py +302 -0
  43. athena_python_docx-0.13.0/tests/test_cell_inner_format_stash.py +431 -0
  44. athena_python_docx-0.13.0/tests/test_cell_inner_run_format_stash.py +283 -0
  45. athena_python_docx-0.13.0/tests/test_cell_inner_run_guard.py +236 -0
  46. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_oxml_shim.py +24 -0
  47. athena_python_docx-0.13.0/tests/test_postproc_cell_format_rewrite.py +826 -0
  48. athena_python_docx-0.13.0/tests/test_postproc_cell_run_format_rewrite.py +530 -0
  49. athena_python_docx-0.13.0/tests/test_postproc_ref_restore.py +489 -0
  50. athena_python_docx-0.13.0/tests/test_xml_attr_guard.py +178 -0
  51. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/uv.lock +1 -1
  52. athena_python_docx-0.11.3/tests/fidelity/op_snapshots/90_cell_add_paragraph_styled.json +0 -11
  53. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/.gitignore +0 -0
  54. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/README.md +0 -0
  55. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/_athena_extension.py +0 -0
  56. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/_batching.py +0 -0
  57. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/_buffer.py +0 -0
  58. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/_http.py +0 -0
  59. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/_image_utils.py +0 -0
  60. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/_ptc.py +0 -0
  61. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/_table_styles.py +0 -0
  62. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/api.py +0 -0
  63. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/bookmarks.py +0 -0
  64. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/charts.py +0 -0
  65. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/comments.py +0 -0
  66. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/enum/__init__.py +0 -0
  67. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/enum/section.py +0 -0
  68. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/enum/style.py +0 -0
  69. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/enum/table.py +0 -0
  70. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/enum/text.py +0 -0
  71. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/errors.py +0 -0
  72. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/exceptions.py +0 -0
  73. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/fields.py +0 -0
  74. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/footnotes.py +0 -0
  75. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/math.py +0 -0
  76. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/opc/__init__.py +0 -0
  77. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/opc/coreprops.py +0 -0
  78. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/revisions.py +0 -0
  79. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/sdt.py +0 -0
  80. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/settings.py +0 -0
  81. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/shape.py +0 -0
  82. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/shared.py +0 -0
  83. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/styles/__init__.py +0 -0
  84. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/styles/style.py +0 -0
  85. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/styles/styles.py +0 -0
  86. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/text/__init__.py +0 -0
  87. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/text/font.py +0 -0
  88. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/text/hyperlink.py +0 -0
  89. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/text/pagebreak.py +0 -0
  90. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/text/tabstops.py +0 -0
  91. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/toc.py +0 -0
  92. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/docx/typing.py +0 -0
  93. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/scripts/publish.sh +0 -0
  94. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/scripts/release.sh +0 -0
  95. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/scripts/round_trip_smoke.py +0 -0
  96. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/scripts/smoke_test_block_not_found.py +0 -0
  97. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/__init__.py +0 -0
  98. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/conftest.py +0 -0
  99. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/METHODOLOGY.md +0 -0
  100. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/README.md +0 -0
  101. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/__init__.py +0 -0
  102. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/ab_probe_cases.py +0 -0
  103. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/ab_probe_runner.py +0 -0
  104. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/auto_gen_cases.py +0 -0
  105. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/binary_round_trip.py +0 -0
  106. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/cases.py +0 -0
  107. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/complex_cases.py +0 -0
  108. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/coverage_report.py +0 -0
  109. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/extract.py +0 -0
  110. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/extreme_cases.py +0 -0
  111. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/fake_session.py +0 -0
  112. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/firm_templates/README.md +0 -0
  113. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/firm_templates/__init__.py +0 -0
  114. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/firm_templates/_runner.py +0 -0
  115. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/firm_templates/extractor.py +0 -0
  116. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/firm_templates/test_pw_corpus.py +0 -0
  117. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/firm_templates/test_pw_research_digest.py +0 -0
  118. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/local_runner.py +0 -0
  119. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/mega_cases.py +0 -0
  120. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshot.py +0 -0
  121. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/01_basic_paragraph.json +0 -0
  122. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/02_multiple_headings.json +0 -0
  123. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/03_runs_with_formatting.json +0 -0
  124. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/04_font_name_and_size.json +0 -0
  125. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/05_font_color_rgb.json +0 -0
  126. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/06_font_character_properties.json +0 -0
  127. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/07_font_subscript_superscript.json +0 -0
  128. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/08_font_highlight.json +0 -0
  129. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/09_paragraph_alignment.json +0 -0
  130. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/100_table_negative_indexing.json +0 -0
  131. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/101_table_cells_flat_iteration.json +0 -0
  132. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/102_text_with_embedded_special_chars.json +0 -0
  133. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/104_core_properties_datetime.json +0 -0
  134. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/105_default_one_section.json +0 -0
  135. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/106_heading_paragraph_format.json +0 -0
  136. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/107_varying_row_heights.json +0 -0
  137. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/10_paragraph_indents.json +0 -0
  138. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/11_paragraph_spacing.json +0 -0
  139. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/12_paragraph_keep_options.json +0 -0
  140. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/13_paragraph_tab_stops.json +0 -0
  141. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/14_run_add_tab_and_break.json +0 -0
  142. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/15_run_add_break_page.json +0 -0
  143. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/16_paragraph_clear_and_insert_before.json +0 -0
  144. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/17_table_basic.json +0 -0
  145. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/18_table_cell_text.json +0 -0
  146. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/19_table_row_column_sizing.json +0 -0
  147. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/20_table_cell_vertical_alignment.json +0 -0
  148. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/21_table_alignment_and_autofit.json +0 -0
  149. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/24_table_add_row_column.json +0 -0
  150. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/25_table_merge_cells.json +0 -0
  151. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/26_section_page_setup.json +0 -0
  152. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/27_section_margins.json +0 -0
  153. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/28_section_add_new.json +0 -0
  154. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/29_section_headers_linked.json +0 -0
  155. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/30_styles_iteration.json +0 -0
  156. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/31_styles_lookup_and_default.json +0 -0
  157. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/32_styles_add_paragraph_style.json +0 -0
  158. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/33_core_properties_set_and_get.json +0 -0
  159. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/34_inline_shapes_iterate_empty.json +0 -0
  160. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/36_replace_text_in_paragraph.json +0 -0
  161. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/37_iterate_runs_and_format_all_bold.json +0 -0
  162. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/38_font_all_properties.json +0 -0
  163. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/39_large_body_100_paragraphs.json +0 -0
  164. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/40_large_table_10x10.json +0 -0
  165. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/41_unicode_and_emoji.json +0 -0
  166. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/42_very_long_paragraph.json +0 -0
  167. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/43_paragraph_text_round_trip.json +0 -0
  168. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/44_paragraph_alignment_round_trip.json +0 -0
  169. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/45_cell_text_round_trip.json +0 -0
  170. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/46_run_text_setter_round_trip.json +0 -0
  171. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/47_font_size_round_trip.json +0 -0
  172. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/48_font_color_round_trip.json +0 -0
  173. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/49_resume_layout.json +0 -0
  174. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/50_multi_section_doc.json +0 -0
  175. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/52_iterate_everything.json +0 -0
  176. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/53_apply_style_to_paragraphs.json +0 -0
  177. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/54_empty_everything.json +0 -0
  178. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/55_single_character_runs.json +0 -0
  179. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/56_everything_in_one.json +0 -0
  180. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/57_runs_after_multiple_text_appends.json +0 -0
  181. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/58_modify_runs_in_place.json +0 -0
  182. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/59_indent_round_trip.json +0 -0
  183. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/60_space_round_trip.json +0 -0
  184. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/63_table_style_round_trip.json +0 -0
  185. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/64_many_sections.json +0 -0
  186. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/66_toc_like_structure.json +0 -0
  187. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/67_paragraph_insert_before_chain.json +0 -0
  188. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/68_invoice.json +0 -0
  189. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/70_add_and_iterate_back.json +0 -0
  190. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/71_academic_paper.json +0 -0
  191. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/72_legal_contract.json +0 -0
  192. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/73_form_with_many_tables.json +0 -0
  193. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/74_paragraph_with_10_runs.json +0 -0
  194. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/75_paragraph_negative_first_line_indent.json +0 -0
  195. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/76_rgbcolor_from_string.json +0 -0
  196. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/77_length_unit_conversions.json +0 -0
  197. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/78_paragraph_copy_style.json +0 -0
  198. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/79_bulk_cell_formatting.json +0 -0
  199. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/80_apply_style_after_add_run.json +0 -0
  200. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/81_multi_page_with_breaks.json +0 -0
  201. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/82_add_text_on_existing_run.json +0 -0
  202. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/83_clear_then_repopulate_paragraph.json +0 -0
  203. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/84_table_reread_row_count.json +0 -0
  204. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/85_header_footer_access.json +0 -0
  205. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/86_font_read_unset_returns_none.json +0 -0
  206. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/87_500_paragraph_doc.json +0 -0
  207. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/88_mixed_content_iteration.json +0 -0
  208. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/89_alignment_clear_via_none.json +0 -0
  209. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/91_many_small_tables.json +0 -0
  210. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/92_margins_every_section.json +0 -0
  211. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/93_font_bool_reads_after_set.json +0 -0
  212. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/94_page_break_before_paragraph.json +0 -0
  213. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/95_paragraph_hyperlinks_empty.json +0 -0
  214. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/96_paragraph_contains_page_break.json +0 -0
  215. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/97_document_styles_by_key.json +0 -0
  216. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/98_style_contains_check.json +0 -0
  217. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/99_run_add_picture_from_bytes.json +0 -0
  218. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/ex02_unicode_everywhere.json +0 -0
  219. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/ex03_1000_paragraphs.json +0 -0
  220. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/ex04_50x50_table.json +0 -0
  221. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/ex05_long_text_in_cell.json +0 -0
  222. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/ex06_hundred_tiny_runs.json +0 -0
  223. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/ex07_every_font_boolean.json +0 -0
  224. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/ex08_many_continuous_sections.json +0 -0
  225. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/ex09_many_tab_stops.json +0 -0
  226. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/ex12_section_reconfigure.json +0 -0
  227. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/ex15_paragraph_all_format_props.json +0 -0
  228. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/ex16_runs_interleaved_with_breaks.json +0 -0
  229. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/ex17_all_break_kinds.json +0 -0
  230. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/ex18_read_back_large_doc.json +0 -0
  231. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/ex19_mutate_all_runs.json +0 -0
  232. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/mega04_recipe_card.json +0 -0
  233. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/mega06_complex_newsletter.json +0 -0
  234. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/mega08_product_catalog.json +0 -0
  235. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/rw01_official_quickstart.json +0 -0
  236. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/rw02_paragraph_style_list.json +0 -0
  237. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/rw03_character_formatting.json +0 -0
  238. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/rw04_section_page_setup.json +0 -0
  239. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/rw05_toc_pattern.json +0 -0
  240. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/rw06_meeting_minutes.json +0 -0
  241. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/rw07_dense_formatting_demo.json +0 -0
  242. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/rw08_table_merged_header.json +0 -0
  243. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/rw09_bulk_run_iteration.json +0 -0
  244. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/rw11_header_text.json +0 -0
  245. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/rw12_first_page_footer.json +0 -0
  246. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/rw13_even_page_header.json +0 -0
  247. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/op_snapshots/rw15_paragraph_style_instance.json +0 -0
  248. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/ours_spec.json +0 -0
  249. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/parity_crawl.py +0 -0
  250. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/parity_diff.json +0 -0
  251. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/real_world_cases.py +0 -0
  252. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/round_trip_tests.py +0 -0
  253. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/runner.py +0 -0
  254. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/stock_spec.json +0 -0
  255. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/fidelity/test_e2e_against_staging.py +0 -0
  256. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/parity/README.md +0 -0
  257. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/parity/__init__.py +0 -0
  258. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/parity/baseline_gaps.json +0 -0
  259. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/parity/compare.py +0 -0
  260. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/parity/intentional_deviations.json +0 -0
  261. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/parity/introspect.py +0 -0
  262. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/parity/run_parity.py +0 -0
  263. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/parity/snapshots/upstream_python_docx_1.2.0.json +0 -0
  264. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/parity/test_parity_gap.py +0 -0
  265. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_athena_extensions_contract.py +0 -0
  266. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_batching_perf.py +0 -0
  267. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_buffer.py +0 -0
  268. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_cell_add_paragraph_wire_shape.py +0 -0
  269. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_cell_add_table_not_supported.py +0 -0
  270. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_cell_text_plain_fastpath.py +0 -0
  271. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_collapsed_range_format.py +0 -0
  272. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_command_dataclasses.py +0 -0
  273. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_commands.py +0 -0
  274. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_comments.py +0 -0
  275. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_document_asset_id_property.py +0 -0
  276. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_document_create.py +0 -0
  277. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_document_create_from_template.py +0 -0
  278. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_document_factory_validation.py +0 -0
  279. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_e2e_partial_failure_cascade.py +0 -0
  280. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_http_transport.py +0 -0
  281. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_hyperlink_coalescing.py +0 -0
  282. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_insert_deferred.py +0 -0
  283. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_iter_inner_content.py +0 -0
  284. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_list_styles.py +0 -0
  285. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_merged_cell_secondary_slot.py +0 -0
  286. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_merged_cells.py +0 -0
  287. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_paragraph_text_len_cache.py +0 -0
  288. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_parity_misc.py +0 -0
  289. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_parity_round2.py +0 -0
  290. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_partial_failure_cascade.py +0 -0
  291. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_phase_a_behavior.py +0 -0
  292. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_phase_b_headers_footers.py +0 -0
  293. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_phase_c_tables.py +0 -0
  294. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_pr19766_review_fixes.py +0 -0
  295. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_ptc.py +0 -0
  296. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_python_docx_api_parity.py +0 -0
  297. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_revisions.py +0 -0
  298. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_add_paragraph_style.py +0 -0
  299. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_add_picture.py +0 -0
  300. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_add_run.py +0 -0
  301. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_cell_add_paragraph.py +0 -0
  302. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_comments_add_comment.py +0 -0
  303. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_comments_get.py +0 -0
  304. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_document_audit.py +0 -0
  305. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_document_element.py +0 -0
  306. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_enum_section.py +0 -0
  307. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_font_audit.py +0 -0
  308. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_header_footer.py +0 -0
  309. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_hyperlink.py +0 -0
  310. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_inline_shape.py +0 -0
  311. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_insert_paragraph_before.py +0 -0
  312. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_misc.py +0 -0
  313. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_paragraph_strict.py +0 -0
  314. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_paragraph_style.py +0 -0
  315. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_paragraph_style_strict.py +0 -0
  316. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_parfmt.py +0 -0
  317. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_row_col_cell.py +0 -0
  318. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_run_add_break.py +0 -0
  319. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_run_bool_setters.py +0 -0
  320. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_run_style.py +0 -0
  321. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_run_style_strict.py +0 -0
  322. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_run_text.py +0 -0
  323. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_run_underline.py +0 -0
  324. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_section_audit.py +0 -0
  325. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_section_dimensions.py +0 -0
  326. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_section_onoff.py +0 -0
  327. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_settings.py +0 -0
  328. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_shared_audit.py +0 -0
  329. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_style.py +0 -0
  330. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_styles.py +0 -0
  331. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_table_audit.py +0 -0
  332. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_table_cell.py +0 -0
  333. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_table_dimensions.py +0 -0
  334. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_silent_stub_table_layout.py +0 -0
  335. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_smoke_integration.py +0 -0
  336. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_style_acceptance.py +0 -0
  337. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_style_font.py +0 -0
  338. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_style_setters_contract.py +0 -0
  339. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_table_set_cell_perf.py +0 -0
  340. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_table_style_id_resolution.py +0 -0
  341. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_temporarily_unavailable.py +0 -0
  342. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_wire_contract.py +0 -0
  343. {athena_python_docx-0.11.3 → athena_python_docx-0.13.0}/tests/test_zod_wire_contract.py +0 -0
@@ -349,6 +349,212 @@ Issue numbers reference `python-openxml/python-docx`.
349
349
  wontfix upstream but the request keeps recurring. Routes through
350
350
  `ExportPDF` (SuperDoc handles the actual conversion).
351
351
 
352
+ - **`Document.export_docx(path=None, *, include_revisions=False)
353
+ -> bytes`** (0.11.4+) — export the document's current state as
354
+ ``.docx`` bytes, optionally writing to ``path``. Closes the gap
355
+ left by ``Document.save(path)`` raising
356
+ ``LocalSaveTargetNotSupportedError`` in this SDK: parity test
357
+ harnesses and CI workflows need a programmatic .docx export to
358
+ diff against ``python-docx`` output that doesn't require a
359
+ human-driven Olympus UI action. Routes through ``ExportDocx`` →
360
+ apps/api → SuperDoc's official ``doc.save({out: <tmp>})`` (the
361
+ recommended backend export path per the SuperDoc team — Document
362
+ API, not the browser-side ``editor.exportDocx`` shim). apps/api
363
+ writes the session state to a temp ``.docx``, reads bytes back,
364
+ base64-encodes for the wire, and unlinks the temp in a
365
+ ``finally`` block. The SDK decodes and writes to ``path``.
366
+ ``include_revisions=True`` raises ``DocxError`` pre-flight:
367
+ ``@superdoc-dev/sdk@1.8.1``'s ``DocSaveParams`` has no
368
+ ``includeRevisions`` field, so honoring the flag isn't possible
369
+ through ``doc.save({out})``.
370
+
371
+ Template seeding: ``Document.create()`` (no ``docx=``) already
372
+ produces an exportable asset because ``POST /docs/empty`` seeds
373
+ from the default Athena template, so ``export_docx`` works
374
+ out-of-the-box. Pass ``docx='template.docx'`` only when you need
375
+ brand-specific scaffolding (styles, numbering, headers, rels,
376
+ media) baked in — not as a workaround for empty rooms.
377
+
378
+ ### 0.11.4 behavior fixes for cell-inner paragraphs
379
+
380
+ Format ops on cell-inner paragraphs (`paragraph.alignment`,
381
+ `paragraph.style`, every `paragraph_format` setter, and
382
+ `paragraph.add_hyperlink`) used to cascade-fail the entire HTTP
383
+ batch. SuperDoc 1.8.1's
384
+ ``SetParagraphAlignment``/``SetParagraphStyle``/``SetParagraphIndentation``/``SetParagraphSpacing``/``CreateHyperlink``
385
+ reject cell-inner block targets with ``BlockNotFoundError``, and the
386
+ applier's all-or-nothing batch model meant one cell-paragraph
387
+ mistake mid-script nuked every other unrelated create/format command
388
+ queued before it (``applied: []``).
389
+
390
+ As of 0.11.4 these setters check the paragraph proxy's ``_in_cell``
391
+ flag (set by ``_Cell.add_paragraph`` and ``_Cell.paragraphs``) and
392
+ emit ``docx.text.paragraph.CellInnerFormatNotSupportedWarning``
393
+ instead of forwarding the broken command. The format op is dropped,
394
+ the surrounding batch survives, and the workaround pointer (
395
+ ``cell.text = 'value'`` to materialize, then ``cell.paragraphs[0]``
396
+ for the addressable proxy) is in the warning text. Tracked at
397
+ ``docx-studio/SUPERDOC_UPSTREAM_REQUESTS.md`` § 13.
398
+
399
+ **0.11.5 follow-up: post-export OOXML rewrite.** When the parent
400
+ table was created via ``Document.add_table`` in this session
401
+ (``Table._doc_index`` set), the format setters also stash the
402
+ OOXML-shaped props (``alignment``, ``style``, ``left_twips``,
403
+ ``before_twips``, etc.) on ``Session._post_export_ops`` (a
404
+ :class:`docx._postproc.PostExportOps` collector). ``Document.export_docx``
405
+ applies them via an OOXML rewrite of ``word/document.xml`` before
406
+ returning bytes — so the **exported ``.docx`` carries the formatting
407
+ the agent asked for** even though SuperDoc never accepted the wire
408
+ op. Live-session state is unchanged (Olympus collaborators don't
409
+ see the formatting until export). Template-seeded tables where
410
+ ``_doc_index`` is ``None`` still warn-and-skip (no stable OOXML
411
+ address). Behavior pinned by ``tests/test_cell_inner_format_stash.py``
412
+ + ``tests/test_postproc_cell_format_rewrite.py``.
413
+
414
+ **0.13.0: cell-inner ``Paragraph.add_run(text)`` now materializes the
415
+ text live (not just at export).** The agent's standard ``fill_cell``
416
+ helper pattern —
417
+
418
+ .. code-block:: python
419
+
420
+ p = cell.add_paragraph("")
421
+ r = p.add_run("Hello world")
422
+ r.bold = True
423
+
424
+ — used to silently drop both the ``Hello world`` text AND the bold
425
+ format because ``Paragraph.add_run`` on a cell-inner paragraph
426
+ returned a stub Run with collapsed range, and SuperDoc 1.8.1
427
+ rejected the wire-level ``doc.insert`` against the cell-inner
428
+ paragraph's blockId with ``Block <id> not found``. The 0.13.0 fix
429
+ adds a ``_cell`` back-reference to every cell-inner Paragraph proxy
430
+ (set by ``_Cell.add_paragraph`` / ``_Cell.paragraphs`` /
431
+ ``_Cell.iter_inner_content``). When ``Paragraph.add_run(text)`` is
432
+ called on a cell-inner paragraph with non-empty text AND the
433
+ back-ref is set, the SDK ships ``doc.insert(target=cell,
434
+ placement="insideEnd", content=paragraph-fragment-with-text)``
435
+ instead — the SAME wire path ``_Cell.add_paragraph(text)`` already
436
+ uses. SuperDoc collapses the new paragraph into the cell's single
437
+ template paragraph as an inline run; the exported DOCX expands each
438
+ non-empty inline run into its own ``<w:p>``. The returned Run is
439
+ real (non-collapsed range) and carries the new exported-paragraph
440
+ OOXML address, so subsequent ``r.bold = True``-style setters stash
441
+ to the correct cell location for the post-export OOXML rewrite.
442
+
443
+ Fallback: empty text (``add_run("")``) and paragraphs without a
444
+ ``_cell`` back-ref (constructed outside the ``_Cell`` paths) still
445
+ hit the warn-and-stub fallback so the surrounding batch survives.
446
+ Wire failures inside the materialization path also fall back
447
+ silently — one ``add_run`` failure should never cascade-fail a
448
+ whole agent script.
449
+
450
+ **0.13.0: cell-inner per-run formatting + cell-inner ``add_hyperlink``
451
+ land at export time.** When a cell-inner ``Run`` has a stable OOXML
452
+ address (parent paragraph came from a ``Document.add_table`` table —
453
+ same ``_doc_index`` tracking as the cell-paragraph format stash),
454
+ every per-run setter (``run.bold = True``, ``run.italic``,
455
+ ``run.font.size = Pt(11)``, ``run.font.color.rgb = …``,
456
+ ``run.font.name``, ``run.font.highlight_color``,
457
+ ``run.font.strike``, ``run.underline``, ``run.style``) stashes the
458
+ prop on ``Session._post_export_ops._cell_run_format_ops`` instead
459
+ of dropping it silently at the wire layer. The post-export rewrite
460
+ walks every ``<w:r>`` in the targeted cell paragraph and injects
461
+ ``<w:rPr>`` carrying the props — so ``cell.text = "Total"; cell.
462
+ paragraphs[0].runs[0].bold = True`` produces a bold ``Total`` in
463
+ the exported ``.docx`` even though SuperDoc never committed the
464
+ format wire op. Apply-to-all-runs semantics: the rewrite targets
465
+ every ``<w:r>`` in the cell paragraph, because run-level addressing
466
+ inside a cell isn't recoverable after SuperDoc collapses cell-
467
+ inner inserts. Multi-run cell paragraphs with partial-run
468
+ formatting are a documented limitation — agents should use one
469
+ run per format intent.
470
+
471
+ Same export-time machinery rescues ``paragraph.add_hyperlink`` on a
472
+ cell-inner paragraph. Pre-0.13.0 the call dropped both the URL AND
473
+ the visible link text (the SDK returned a stub ``Hyperlink`` with
474
+ an empty range because ``Insert`` on a cell-inner paragraph also
475
+ fails with ``BlockNotFoundError``). As of 0.13.0 the URL + visible
476
+ text + optional tooltip + optional bookmark fragment are stashed
477
+ on ``Session._post_export_ops._cell_hyperlink_ops`` and the post-
478
+ export OOXML rewrite appends a real ``<w:hyperlink>`` to the cell
479
+ paragraph plus a matching ``Relationship`` entry in
480
+ ``word/_rels/document.xml.rels``. External URLs use ``r:id`` and
481
+ get the document's built-in ``Hyperlink`` character style for the
482
+ standard blue + underline appearance; internal bookmark anchors
483
+ (``fragment="MyBookmark"`` with no ``url``) use ``w:anchor`` and
484
+ don't add a rels entry. Repeated same-URL inserts coalesce to one
485
+ rels entry so the rels file doesn't grow unboundedly. Behavior
486
+ pinned by ``tests/test_postproc_cell_run_format_rewrite.py``.
487
+
488
+ Live Olympus rendering still won't show cell-inner formatting or
489
+ hyperlinks until SuperDoc lands the corresponding wire ops —
490
+ ``Document.export_docx`` is the source of truth for the
491
+ deliverable until then.
492
+
493
+ ### 0.11.4 behavior fixes elsewhere
494
+
495
+ - **`Sections.__getitem__` short-circuits on empty docs.**
496
+ ``Document.create()`` doesn't materialize a section client-side,
497
+ so ``sections.list`` returns ``[]`` or times out at the full
498
+ command-budget. Pre-0.11.4 ``doc.sections[0]`` either raised an
499
+ un-contextualized ``IndexError`` from ``items[index]`` or hung
500
+ for ~60s. The cache-then-raise path now fails fast with a clear
501
+ workaround pointer and avoids re-issuing the slow query.
502
+ - **`Table._fresh_node_info` rotation tracking.** Each ``Table``
503
+ created via ``Document.add_table`` records its document-order
504
+ position as ``_doc_index``. When SuperDoc rotates the table's
505
+ nodeId between saves, the fallback resolves the rotated address
506
+ by position instead of always picking the last ``doc.find`` item.
507
+ Pre-0.11.4 the "take the last" heuristic silently mapped N
508
+ rotated proxies onto a single target, surfacing as
509
+ ``ValidationError: Cell (r,c) not found in table table-auto-…``
510
+ on the next cell access.
511
+ - **`set_borders` accepts string and dict.** Both
512
+ ``cell.set_borders(top="single 0.5pt #DDDDDD")`` and
513
+ ``cell.set_borders(top={"style": "single", "size_pt": 0.5,
514
+ "color": "#DDDDDD"})`` work; the string form is normalized via
515
+ ``_normalize_border_spec`` to the wire shape the server's Zod
516
+ validator expects. Pre-0.11.4 only the dict was accepted —
517
+ the string variant documented in the skill produced an immediate
518
+ HTTP 400 from the server's validator.
519
+ - **`Run.add_field` segments shape.** ``run.add_field("PAGE")`` (and
520
+ every other field kind) now emits ``at.segments`` with
521
+ ``[{blockId, start, end}]`` instead of the ``{kind: "selection",
522
+ start, end}`` cursor envelope used by other create-ops.
523
+ SuperDoc's ``doc.fields.insert`` rejects the cursor form with
524
+ ``SuperDocCliError: fields insert:at.segments is required``;
525
+ pre-0.11.4 the call took down the whole batch on every flush.
526
+
527
+ ### 0.11.5 — `REF` field round-trip preservation (post-export rewrite)
528
+
529
+ SuperDoc 1.23.1 / SDK 1.8.1 strips ``REF`` field codes
530
+ (``<w:fldChar>`` / ``<w:instrText REF …>`` / result-runs / end
531
+ ``<w:fldChar>``) on import. On the Paul Weiss Purchase Agreement
532
+ this loses all 301 cross-references — readers see chains of empty
533
+ commas instead of "Section 3.02(b)" cross-refs. Tracked at
534
+ ``docx-studio/SUPERDOC_UPSTREAM_REQUESTS.md`` § 18.
535
+
536
+ As of 0.11.5, ``Document.create(docx=template.docx)`` scans the
537
+ local template bytes with a stdlib zipfile + xml.etree parser and
538
+ captures every ``<w:p>`` containing 1+ REF fields. Captures are
539
+ stashed on ``Session._post_export_ops._captured_refs`` (list of
540
+ :class:`docx._postproc.CapturedRefParagraph`). On
541
+ ``Document.export_docx``, the post-export OOXML rewrite walks the
542
+ exported body; if any captured paragraph's exported counterpart has
543
+ fewer REFs AND fingerprint-matches (plain-text content excluding
544
+ field result runs), the exported ``<w:p>`` element is replaced
545
+ wholesale with the captured XML. Behavior pinned by
546
+ ``tests/test_postproc_ref_restore.py``.
547
+
548
+ Limitations: (1) restoration is in-process only — works when the
549
+ same Python process that called ``Document.create(docx=...)`` also
550
+ calls ``export_docx``. Cross-process flows (agent A creates, agent
551
+ B exports) need agora-side persistence (separate follow-up). (2)
552
+ Paragraph-wholesale replacement preserves the source paragraph but
553
+ overwrites any SuperDoc in-paragraph edits — for round-trip
554
+ preservation (the primary use case) this is exactly right. (3) Only
555
+ top-level body paragraphs are scanned; cell-inner REFs aren't
556
+ captured (rare for legal cross-references).
557
+
352
558
  These additions are surfaced under their natural python-docx-shaped
353
559
  names. When python-docx upstream eventually ships any of them
354
560
  natively, the SDK should swap to the upstream signature in place;
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: athena-python-docx
3
- Version: 0.11.3
3
+ Version: 0.13.0
4
4
  Summary: Drop-in replacement for python-docx that connects to Athena's Superdoc/Keryx collaborative document stack
5
5
  Project-URL: Homepage, https://athenaintelligence.ai
6
6
  Author-email: Athena Intelligence <engineering@athenaintelligence.ai>
@@ -6,7 +6,7 @@ See CLAUDE.md for the API parity contract.
6
6
 
7
7
  from __future__ import annotations
8
8
 
9
- __version__ = "0.11.3"
9
+ __version__ = "0.13.0"
10
10
 
11
11
  from docx.api import Document
12
12
  from docx._buffer import flush_all
@@ -262,14 +262,24 @@ _CELL_PARAGRAPH_HINT: str = (
262
262
  "\n\nHint: SuperDoc 1.8.1 cannot format paragraphs nested inside "
263
263
  "table cells via SetParagraphAlignment / SetParagraphStyle / "
264
264
  "SetParagraphIndentation / SetParagraphSpacing / doc.insert with "
265
- "a paragraph-block target, or any FormatApply on a cell-inner run. "
266
- "The cell's inner paragraph id is returned by cell.getNodeById but "
267
- "isn't a top-level addressable block. Materialize the cell's "
268
- 'paragraph first via ``cell.text = "value"``, then re-read '
269
- "``cell.paragraphs[0]`` and apply format ops to that post-"
270
- "materialization Paragraph proxy. Tracked upstream at "
271
- "docx-studio/SUPERDOC_UPSTREAM_REQUESTS.md § 'cell-inner paragraph "
272
- "addressing'."
265
+ "a paragraph-block target. The cell's original inner paragraph id "
266
+ "(returned by ``cell.paragraphs[0]`` on a freshly-loaded cell) "
267
+ "isn't a top-level addressable block.\n\nWorkaround: create a "
268
+ "fresh paragraph in the cell via ``para = cell.add_paragraph(text)`` "
269
+ "— 0.11.1+ routes that through ``doc.insert`` against the cell "
270
+ "with ``placement: 'insideEnd'``, so the returned ``Paragraph`` "
271
+ "proxy points at an addressable block. Apply format ops to that "
272
+ "proxy:\n\n"
273
+ ' para = cell.add_paragraph("MAY 2026")\n'
274
+ " para.alignment = WD_ALIGN_PARAGRAPH.RIGHT # works\n"
275
+ " para.add_run(...).bold = True # also works\n\n"
276
+ "Do NOT use ``cell.paragraphs[0].alignment = X`` on a freshly-"
277
+ "loaded cell — that targets the original cell-inner paragraph "
278
+ "which can't be addressed for format ops. If the cell already "
279
+ "has agent-authored content, use ``cell.paragraphs[-1]`` (the "
280
+ "most-recently-inserted paragraph, which is addressable). "
281
+ "Tracked upstream at docx-studio/SUPERDOC_UPSTREAM_REQUESTS.md "
282
+ "§ 'cell-inner paragraph addressing'."
273
283
  )
274
284
 
275
285
 
@@ -480,12 +490,66 @@ def _http_post_json(
480
490
  timeout=timeout,
481
491
  )
482
492
  except requests.ConnectionError as e:
493
+ # ``RemoteDisconnected`` (server closed the TCP connection
494
+ # without a response) and ``ProtocolError`` (connection
495
+ # aborted mid-response) typically surface on long-running
496
+ # batches — the docx-studio nginx ingress idle-timeout or
497
+ # the SuperDoc CLI worker watchdog can both kill an
498
+ # in-flight request after a few minutes. We don't
499
+ # auto-retry these because the server may have already
500
+ # committed the work; a transport-level retry would risk
501
+ # double-applying the prefix that succeeded server-side.
502
+ # Instead, surface a typed error with actionable guidance
503
+ # so the agent can split the work into smaller batches.
504
+ # Identify the underlying error class without importing it
505
+ # — ``urllib3.exceptions.ProtocolError`` /
506
+ # ``http.client.RemoteDisconnected`` sit several wrap-layers
507
+ # deep and the import paths are version-sensitive.
508
+ err_chain = repr(e)
509
+ is_remote_disconnect = (
510
+ "RemoteDisconnected" in err_chain
511
+ or "ProtocolError" in err_chain
512
+ or "Connection aborted" in err_chain
513
+ )
514
+ if is_remote_disconnect:
515
+ n_commands = (
516
+ len(body.get("commands", []))
517
+ if isinstance(body, dict)
518
+ and isinstance(body.get("commands"), list)
519
+ else 0
520
+ )
521
+ hint = (
522
+ "docx-studio dropped the connection before sending a "
523
+ f"response (RemoteDisconnected) on a batch of "
524
+ f"~{n_commands} commands. The most common cause is an "
525
+ "idle-timeout on the docx-studio nginx ingress (~60s "
526
+ "wall clock) firing on a long-running SuperDoc CLI "
527
+ "operation. The server may or may not have committed "
528
+ "the work — the SDK cannot safely retry because that "
529
+ "would risk double-applying the successful prefix.\n"
530
+ "Recovery options:\n"
531
+ " 1. Re-open the document (``doc = Document(asset_id)``) "
532
+ "and continue the work in smaller chunks — flush every "
533
+ "~30 commands via ``doc.save()`` so each batch fits "
534
+ "comfortably under the ingress idle window.\n"
535
+ " 2. Break paragraph-heavy sections into separate "
536
+ "tool calls. Each ``execute_word_document_code`` "
537
+ "invocation starts a fresh HTTP connection.\n"
538
+ " 3. If the document already contains everything you "
539
+ "expected, the connection drop happened AFTER the "
540
+ "server committed — re-open and inspect "
541
+ "``len(doc.paragraphs)`` / ``len(doc.tables)`` before "
542
+ "retrying."
543
+ )
544
+ raise SessionError(f"{hint}\n\nOriginal error: {e}") from e
483
545
  raise SessionError(
484
546
  f"Unable to reach docx-studio at {url}: {e}",
485
547
  ) from e
486
548
  except requests.Timeout as e:
487
549
  raise SessionError(
488
- f"docx-studio timed out at {url}: {e}",
550
+ f"docx-studio timed out at {url}: {e}. Split the work "
551
+ "into smaller batches (~30 commands per ``doc.save()``) "
552
+ "to fit under the ingress idle window.",
489
553
  ) from e
490
554
 
491
555
  # 207 (Multi-Status) is the server's signal for partial-batch