athena-python-docx 0.38.0__tar.gz → 0.40.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 (499) hide show
  1. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/AGENTS.md +165 -19
  2. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/PKG-INFO +1 -1
  3. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/__init__.py +1 -1
  4. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/_buffer.py +386 -15
  5. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/_http_doc.py +66 -4
  6. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/commands.py +15 -0
  7. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/comments.py +35 -17
  8. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/document.py +34 -6
  9. athena_python_docx-0.40.0/docx/drawing/__init__.py +136 -0
  10. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/opc/coreprops.py +27 -8
  11. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/section.py +216 -23
  12. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/shape.py +23 -8
  13. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/styles/_table.py +114 -46
  14. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/styles/style.py +40 -14
  15. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/styles/styles.py +22 -12
  16. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/table.py +518 -80
  17. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/text/hyperlink.py +47 -14
  18. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/text/paragraph.py +199 -17
  19. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/text/parfmt.py +13 -8
  20. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/text/run.py +96 -17
  21. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/text/tabstops.py +1 -3
  22. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/pyproject.toml +1 -1
  23. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/fake_session.py +10 -0
  24. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fixtures/note_reference_reads.json +0 -1
  25. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/live/baseline.json +50 -105
  26. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/live/fixture_scripts.py +154 -0
  27. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/live/test_live_runner.py +46 -0
  28. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/parity/intentional_deviations.json +120 -0
  29. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_comments.py +52 -7
  30. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_comments_first_read.py +5 -3
  31. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_core_properties.py +26 -0
  32. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_inline_shape_type.py +31 -0
  33. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_inline_shapes_floating.py +22 -0
  34. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_iter_inner_content.py +1 -1
  35. athena_python_docx-0.40.0/tests/test_listed_paragraph_reads.py +98 -0
  36. athena_python_docx-0.40.0/tests/test_literal_no_break_hyphens.py +140 -0
  37. athena_python_docx-0.40.0/tests/test_literal_soft_hyphens.py +59 -0
  38. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_paragraph_runs_hyperlinks.py +46 -0
  39. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_parfmt_clears.py +13 -7
  40. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_phase_b_headers_footers.py +38 -1
  41. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_run_break_inner_content.py +36 -0
  42. athena_python_docx-0.40.0/tests/test_sections_empty_list.py +49 -0
  43. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_style_names.py +27 -0
  44. athena_python_docx-0.40.0/tests/test_style_resolution.py +173 -0
  45. athena_python_docx-0.40.0/tests/test_table_length_reads.py +49 -0
  46. athena_python_docx-0.40.0/tests/test_table_listing_reads.py +410 -0
  47. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_table_read_reuse.py +106 -34
  48. athena_python_docx-0.40.0/tests/test_versioned_read_reuse.py +768 -0
  49. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_wire_contract.py +2 -1
  50. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/uv.lock +1 -1
  51. athena_python_docx-0.38.0/docx/drawing/__init__.py +0 -68
  52. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/.gitignore +0 -0
  53. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/CLAUDE.md +0 -0
  54. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/DOCX_EXEC_LAB.md +0 -0
  55. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/README.md +0 -0
  56. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/_athena_extension.py +0 -0
  57. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/_batching.py +0 -0
  58. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/_capabilities.py +0 -0
  59. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/_citations.py +0 -0
  60. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/_execution.py +0 -0
  61. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/_http.py +0 -0
  62. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/_image_utils.py +0 -0
  63. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/_postproc.py +0 -0
  64. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/_proxy.py +0 -0
  65. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/_ptc.py +0 -0
  66. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/_references.py +0 -0
  67. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/_run_order.py +0 -0
  68. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/_table_styles.py +0 -0
  69. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/_timeouts.py +0 -0
  70. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/_tracked.py +0 -0
  71. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/_xml_text.py +0 -0
  72. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/api.py +0 -0
  73. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/blkcntnr.py +0 -0
  74. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/bookmarks.py +0 -0
  75. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/charts.py +0 -0
  76. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/client.py +0 -0
  77. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/enum/__init__.py +0 -0
  78. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/enum/base.py +0 -0
  79. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/enum/dml.py +0 -0
  80. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/enum/section.py +0 -0
  81. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/enum/shape.py +0 -0
  82. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/enum/style.py +0 -0
  83. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/enum/table.py +0 -0
  84. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/enum/text.py +0 -0
  85. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/errors.py +0 -0
  86. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/exceptions.py +0 -0
  87. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/fields.py +0 -0
  88. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/footnotes.py +0 -0
  89. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/image/__init__.py +0 -0
  90. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/image/exceptions.py +0 -0
  91. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/image/image.py +0 -0
  92. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/math.py +0 -0
  93. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/opc/__init__.py +0 -0
  94. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/oxml/__init__.py +0 -0
  95. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/revisions.py +0 -0
  96. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/sdt.py +0 -0
  97. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/session.py +0 -0
  98. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/settings.py +0 -0
  99. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/shared.py +0 -0
  100. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/styles/__init__.py +0 -0
  101. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/styles/latent.py +0 -0
  102. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/text/__init__.py +0 -0
  103. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/text/font.py +0 -0
  104. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/text/pagebreak.py +0 -0
  105. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/toc.py +0 -0
  106. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/docx/typing.py +0 -0
  107. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/scripts/docx_exec_lab.py +0 -0
  108. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/scripts/docx_exec_lab_examples/fast_table_fill.py +0 -0
  109. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/scripts/docx_exec_lab_examples/find_replace_literal.py +0 -0
  110. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/scripts/docx_exec_lab_server.py +0 -0
  111. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/scripts/dump_wire_fixtures.py +0 -0
  112. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/scripts/release.sh +0 -0
  113. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/scripts/round_trip_smoke.py +0 -0
  114. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/scripts/smoke_test_block_not_found.py +0 -0
  115. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/scripts/validate_find_replace_asset.py +0 -0
  116. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/__init__.py +0 -0
  117. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/conftest.py +0 -0
  118. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/METHODOLOGY.md +0 -0
  119. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/README.md +0 -0
  120. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/__init__.py +0 -0
  121. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/ab_probe/__init__.py +0 -0
  122. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/ab_probe/agent_documents.py +0 -0
  123. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/ab_probe/default_style_run_formatting.py +0 -0
  124. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/ab_probe/header_footer_pictures.py +0 -0
  125. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/ab_probe/less_used_writes.py +0 -0
  126. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/ab_probe/merged_cell_identity.py +0 -0
  127. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/ab_probe/paragraph_text_setter.py +0 -0
  128. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/ab_probe/picture_runs.py +0 -0
  129. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/ab_probe/proxy_equality.py +0 -0
  130. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/ab_probe/return_types.py +0 -0
  131. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/ab_probe/xml_incompatible_text.py +0 -0
  132. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/ab_probe/zero_and_negative_indents.py +0 -0
  133. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/ab_probe_cases.py +0 -0
  134. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/ab_probe_runner.py +0 -0
  135. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/auto_gen_cases.py +0 -0
  136. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/binary_round_trip.py +0 -0
  137. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/cases.py +0 -0
  138. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/complex_cases.py +0 -0
  139. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/coverage_report.py +0 -0
  140. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/extract.py +0 -0
  141. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/extreme_cases.py +0 -0
  142. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/firm_templates/README.md +0 -0
  143. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/firm_templates/__init__.py +0 -0
  144. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/firm_templates/_runner.py +0 -0
  145. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/firm_templates/extractor.py +0 -0
  146. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/firm_templates/test_pw_corpus.py +0 -0
  147. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/firm_templates/test_pw_research_digest.py +0 -0
  148. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/local_runner.py +0 -0
  149. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/mega_cases.py +0 -0
  150. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshot.py +0 -0
  151. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/01_basic_paragraph.json +0 -0
  152. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/02_multiple_headings.json +0 -0
  153. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/03_runs_with_formatting.json +0 -0
  154. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/04_font_name_and_size.json +0 -0
  155. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/05_font_color_rgb.json +0 -0
  156. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/06_font_character_properties.json +0 -0
  157. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/07_font_subscript_superscript.json +0 -0
  158. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/08_font_highlight.json +0 -0
  159. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/09_paragraph_alignment.json +0 -0
  160. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/100_table_negative_indexing.json +0 -0
  161. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/101_table_cells_flat_iteration.json +0 -0
  162. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/102_text_with_embedded_special_chars.json +0 -0
  163. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/104_core_properties_datetime.json +0 -0
  164. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/105_default_one_section.json +0 -0
  165. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/106_heading_paragraph_format.json +0 -0
  166. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/107_varying_row_heights.json +0 -0
  167. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/10_paragraph_indents.json +0 -0
  168. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/11_paragraph_spacing.json +0 -0
  169. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/12_paragraph_keep_options.json +0 -0
  170. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/13_paragraph_tab_stops.json +0 -0
  171. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/14_run_add_tab_and_break.json +0 -0
  172. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/15_run_add_break_page.json +0 -0
  173. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/16_paragraph_clear_and_insert_before.json +0 -0
  174. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/17_table_basic.json +0 -0
  175. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/18_table_cell_text.json +0 -0
  176. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/19_table_row_column_sizing.json +0 -0
  177. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/20_table_cell_vertical_alignment.json +0 -0
  178. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/21_table_alignment_and_autofit.json +0 -0
  179. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/22_table_cell_paragraphs_iteration.json +0 -0
  180. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/24_table_add_row_column.json +0 -0
  181. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/25_table_merge_cells.json +0 -0
  182. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/26_section_page_setup.json +0 -0
  183. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/27_section_margins.json +0 -0
  184. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/28_section_add_new.json +0 -0
  185. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/29_section_headers_linked.json +0 -0
  186. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/30_styles_iteration.json +0 -0
  187. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/31_styles_lookup_and_default.json +0 -0
  188. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/32_styles_add_paragraph_style.json +0 -0
  189. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/33_core_properties_set_and_get.json +0 -0
  190. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/34_inline_shapes_iterate_empty.json +0 -0
  191. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/35_full_report.json +0 -0
  192. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/36_replace_text_in_paragraph.json +0 -0
  193. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/37_iterate_runs_and_format_all_bold.json +0 -0
  194. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/38_font_all_properties.json +0 -0
  195. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/39_large_body_100_paragraphs.json +0 -0
  196. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/40_large_table_10x10.json +0 -0
  197. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/41_unicode_and_emoji.json +0 -0
  198. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/42_very_long_paragraph.json +0 -0
  199. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/43_paragraph_text_round_trip.json +0 -0
  200. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/44_paragraph_alignment_round_trip.json +0 -0
  201. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/45_cell_text_round_trip.json +0 -0
  202. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/46_run_text_setter_round_trip.json +0 -0
  203. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/47_font_size_round_trip.json +0 -0
  204. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/48_font_color_round_trip.json +0 -0
  205. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/49_resume_layout.json +0 -0
  206. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/50_multi_section_doc.json +0 -0
  207. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/52_iterate_everything.json +0 -0
  208. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/53_apply_style_to_paragraphs.json +0 -0
  209. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/54_empty_everything.json +0 -0
  210. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/55_single_character_runs.json +0 -0
  211. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/56_everything_in_one.json +0 -0
  212. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/57_runs_after_multiple_text_appends.json +0 -0
  213. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/58_modify_runs_in_place.json +0 -0
  214. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/59_indent_round_trip.json +0 -0
  215. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/60_space_round_trip.json +0 -0
  216. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/61_cell_paragraph_with_runs.json +0 -0
  217. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/62_many_cell_paragraphs.json +0 -0
  218. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/63_table_style_round_trip.json +0 -0
  219. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/64_many_sections.json +0 -0
  220. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/65_20x20_table_formatted.json +0 -0
  221. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/66_toc_like_structure.json +0 -0
  222. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/67_paragraph_insert_before_chain.json +0 -0
  223. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/68_invoice.json +0 -0
  224. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/69_newsletter.json +0 -0
  225. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/70_add_and_iterate_back.json +0 -0
  226. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/71_academic_paper.json +0 -0
  227. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/72_legal_contract.json +0 -0
  228. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/73_form_with_many_tables.json +0 -0
  229. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/74_paragraph_with_10_runs.json +0 -0
  230. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/75_paragraph_negative_first_line_indent.json +0 -0
  231. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/76_rgbcolor_from_string.json +0 -0
  232. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/77_length_unit_conversions.json +0 -0
  233. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/78_paragraph_copy_style.json +0 -0
  234. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/79_bulk_cell_formatting.json +0 -0
  235. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/80_apply_style_after_add_run.json +0 -0
  236. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/81_multi_page_with_breaks.json +0 -0
  237. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/82_add_text_on_existing_run.json +0 -0
  238. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/83_clear_then_repopulate_paragraph.json +0 -0
  239. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/84_table_reread_row_count.json +0 -0
  240. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/85_header_footer_access.json +0 -0
  241. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/86_font_read_unset_returns_none.json +0 -0
  242. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/87_500_paragraph_doc.json +0 -0
  243. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/88_mixed_content_iteration.json +0 -0
  244. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/89_alignment_clear_via_none.json +0 -0
  245. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/90_cell_add_paragraph_styled.json +0 -0
  246. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/91_many_small_tables.json +0 -0
  247. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/92_margins_every_section.json +0 -0
  248. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/93_font_bool_reads_after_set.json +0 -0
  249. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/94_page_break_before_paragraph.json +0 -0
  250. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/95_paragraph_hyperlinks_empty.json +0 -0
  251. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/96_paragraph_contains_page_break.json +0 -0
  252. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/97_document_styles_by_key.json +0 -0
  253. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/98_style_contains_check.json +0 -0
  254. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/99_run_add_picture_from_bytes.json +0 -0
  255. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/ex02_unicode_everywhere.json +0 -0
  256. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/ex03_1000_paragraphs.json +0 -0
  257. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/ex04_50x50_table.json +0 -0
  258. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/ex05_long_text_in_cell.json +0 -0
  259. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/ex06_hundred_tiny_runs.json +0 -0
  260. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/ex07_every_font_boolean.json +0 -0
  261. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/ex08_many_continuous_sections.json +0 -0
  262. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/ex09_many_tab_stops.json +0 -0
  263. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/ex10_complex_bom.json +0 -0
  264. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/ex11_banded_rows_formatting.json +0 -0
  265. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/ex12_section_reconfigure.json +0 -0
  266. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/ex13_cell_with_10_paragraphs.json +0 -0
  267. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/ex14_styled_report_table.json +0 -0
  268. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/ex15_paragraph_all_format_props.json +0 -0
  269. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/ex16_runs_interleaved_with_breaks.json +0 -0
  270. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/ex17_all_break_kinds.json +0 -0
  271. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/ex18_read_back_large_doc.json +0 -0
  272. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/ex19_mutate_all_runs.json +0 -0
  273. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/ex20_kitchen_sink_v2.json +0 -0
  274. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/mega01_book_chapter.json +0 -0
  275. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/mega02_research_proposal.json +0 -0
  276. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/mega03_financial_statement.json +0 -0
  277. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/mega04_recipe_card.json +0 -0
  278. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/mega05_user_manual.json +0 -0
  279. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/mega06_complex_newsletter.json +0 -0
  280. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/mega07_budget_spreadsheet.json +0 -0
  281. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/mega08_product_catalog.json +0 -0
  282. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/mega09_signed_contract.json +0 -0
  283. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/mega10_api_documentation.json +0 -0
  284. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/rw01_official_quickstart.json +0 -0
  285. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/rw02_paragraph_style_list.json +0 -0
  286. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/rw03_character_formatting.json +0 -0
  287. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/rw04_section_page_setup.json +0 -0
  288. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/rw05_toc_pattern.json +0 -0
  289. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/rw06_meeting_minutes.json +0 -0
  290. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/rw07_dense_formatting_demo.json +0 -0
  291. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/rw08_table_merged_header.json +0 -0
  292. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/rw09_bulk_run_iteration.json +0 -0
  293. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/rw10_colored_grid_table.json +0 -0
  294. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/rw11_header_text.json +0 -0
  295. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/rw12_first_page_footer.json +0 -0
  296. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/rw13_even_page_header.json +0 -0
  297. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/rw15_paragraph_style_instance.json +0 -0
  298. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/rw16_header_footer_tables.json +0 -0
  299. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/rw17_header_letterhead_filled.json +0 -0
  300. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/rw18_header_table_properties.json +0 -0
  301. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/rw19_header_table_rows_columns.json +0 -0
  302. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/op_snapshots/rw20_header_table_merges.json +0 -0
  303. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/ours_spec.json +0 -0
  304. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/parity_crawl.py +0 -0
  305. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/parity_diff.json +0 -0
  306. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/real_world_cases.py +0 -0
  307. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/round_trip_tests.py +0 -0
  308. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/stock_spec.json +0 -0
  309. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fidelity/test_e2e_against_staging.py +0 -0
  310. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fixtures/field_reads.json +0 -0
  311. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fixtures/ruby_reads.json +0 -0
  312. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/fixtures/symbol_reads.json +0 -0
  313. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/live/__init__.py +0 -0
  314. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/live/reader.py +0 -0
  315. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/live/runner.py +0 -0
  316. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/live/sdk_driver.py +0 -0
  317. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/live/stock_driver.py +0 -0
  318. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/parity/README.md +0 -0
  319. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/parity/__init__.py +0 -0
  320. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/parity/baseline_gaps.json +0 -0
  321. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/parity/compare.py +0 -0
  322. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/parity/introspect.py +0 -0
  323. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/parity/reports/GAP_ANALYSIS.md +0 -0
  324. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/parity/reports/gap_report.json +0 -0
  325. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/parity/run_parity.py +0 -0
  326. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/parity/snapshots/athena_latest.json +0 -0
  327. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/parity/snapshots/upstream_python_docx_1.2.0.json +0 -0
  328. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/parity/test_parity_gap.py +0 -0
  329. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_add_section.py +0 -0
  330. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_add_section_extract_items.py +0 -0
  331. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_alignment_values.py +0 -0
  332. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_athena_extension_creates_session_open.py +0 -0
  333. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_athena_extensions_contract.py +0 -0
  334. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_athena_extensions_registry.py +0 -0
  335. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_batch_chunking.py +0 -0
  336. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_batching_perf.py +0 -0
  337. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_battery_cases.py +0 -0
  338. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_block_not_found_error.py +0 -0
  339. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_buffer.py +0 -0
  340. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_cell_add_paragraph_wire_shape.py +0 -0
  341. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_cell_add_table_not_supported.py +0 -0
  342. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_cell_borders_spec.py +0 -0
  343. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_cell_fastpath_runs.py +0 -0
  344. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_cell_inner_add_hyperlink_stash.py +0 -0
  345. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_cell_inner_add_run_via_cell_insert.py +0 -0
  346. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_cell_inner_format_stash.py +0 -0
  347. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_cell_inner_run_format_stash.py +0 -0
  348. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_cell_inner_run_guard.py +0 -0
  349. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_cell_merge.py +0 -0
  350. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_cell_nested_tables.py +0 -0
  351. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_cell_paragraphs_listed.py +0 -0
  352. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_cell_text_plain_fastpath.py +0 -0
  353. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_cell_text_replace_semantics.py +0 -0
  354. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_citations.py +0 -0
  355. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_collapsed_range_format.py +0 -0
  356. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_color_format_theme.py +0 -0
  357. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_command_dataclasses.py +0 -0
  358. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_commands.py +0 -0
  359. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_comment_paragraphs.py +0 -0
  360. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_content_control_value.py +0 -0
  361. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_document_asset_id_property.py +0 -0
  362. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_document_clear.py +0 -0
  363. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_document_create.py +0 -0
  364. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_document_create_from_template.py +0 -0
  365. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_document_factory_validation.py +0 -0
  366. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_document_settings_session_open.py +0 -0
  367. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_docx_exec_lab.py +0 -0
  368. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_docx_exec_lab_server.py +0 -0
  369. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_drawing_image.py +0 -0
  370. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_e2e_partial_failure_cascade.py +0 -0
  371. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_empty_hyperlinks.py +0 -0
  372. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_enum_parity.py +0 -0
  373. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_execution_scope.py +0 -0
  374. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_export_docx_clean.py +0 -0
  375. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_export_rescue_anchors.py +0 -0
  376. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_field_reads_python_docx_parity.py +0 -0
  377. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_field_refresh.py +0 -0
  378. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_field_runs.py +0 -0
  379. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_find_replace_session_open.py +0 -0
  380. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_flushed_write_failures.py +0 -0
  381. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_http_transport.py +0 -0
  382. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_hyperlink_coalescing.py +0 -0
  383. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_image_url_data_uri.py +0 -0
  384. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_inline_page_break.py +0 -0
  385. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_inline_shape_alt_text.py +0 -0
  386. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_inline_shape_size.py +0 -0
  387. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_insert_deferred.py +0 -0
  388. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_latent_style_writes.py +0 -0
  389. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_line_clear_break.py +0 -0
  390. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_list_styles.py +0 -0
  391. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_merged_cell_identity.py +0 -0
  392. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_merged_cell_secondary_slot.py +0 -0
  393. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_merged_cells.py +0 -0
  394. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_missing_modules.py +0 -0
  395. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_nested_table_refused.py +0 -0
  396. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_note_reference_reads_python_docx_parity.py +0 -0
  397. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_oxml_shim.py +0 -0
  398. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_page_break.py +0 -0
  399. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_paragraph_delete.py +0 -0
  400. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_paragraph_indent_reads.py +0 -0
  401. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_paragraph_text_empty_run.py +0 -0
  402. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_paragraph_text_len_cache.py +0 -0
  403. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_parity_misc.py +0 -0
  404. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_parity_round2.py +0 -0
  405. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_partial_failure_cascade.py +0 -0
  406. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_pdf_export_and_page_renders.py +0 -0
  407. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_phase_a_behavior.py +0 -0
  408. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_phase_c_tables.py +0 -0
  409. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_positional_cell_id.py +0 -0
  410. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_postproc_cell_format_rewrite.py +0 -0
  411. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_postproc_cell_run_format_rewrite.py +0 -0
  412. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_postproc_ref_restore.py +0 -0
  413. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_pr19766_review_fixes.py +0 -0
  414. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_proxy_equality.py +0 -0
  415. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_ptc.py +0 -0
  416. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_python_docx_api_parity.py +0 -0
  417. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_read_run_ranges.py +0 -0
  418. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_rendered_page_breaks.py +0 -0
  419. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_repeated_node_read.py +0 -0
  420. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_restart_numbering.py +0 -0
  421. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_revisions.py +0 -0
  422. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_round_trip_smoke_script.py +0 -0
  423. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_ruby_reads_python_docx_parity.py +0 -0
  424. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_run_add_picture_anchor.py +0 -0
  425. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_run_edges.py +0 -0
  426. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_run_formatting_wire.py +0 -0
  427. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_run_identity.py +0 -0
  428. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_run_later_runs.py +0 -0
  429. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_run_mark_inheritance.py +0 -0
  430. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_run_page_number_blocks.py +0 -0
  431. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_run_table_style_objects.py +0 -0
  432. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_run_text_python_docx.py +0 -0
  433. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_run_text_refreshes_paragraph.py +0 -0
  434. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_run_unmodeled_toggles.py +0 -0
  435. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_sdk_reads_served.py +0 -0
  436. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_section_read_lengths.py +0 -0
  437. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_add_paragraph_style.py +0 -0
  438. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_add_picture.py +0 -0
  439. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_add_run.py +0 -0
  440. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_cell_add_paragraph.py +0 -0
  441. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_comments_add_comment.py +0 -0
  442. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_comments_get.py +0 -0
  443. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_document_audit.py +0 -0
  444. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_document_element.py +0 -0
  445. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_enum_section.py +0 -0
  446. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_font_audit.py +0 -0
  447. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_header_footer.py +0 -0
  448. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_hyperlink.py +0 -0
  449. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_inline_shape.py +0 -0
  450. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_insert_paragraph_before.py +0 -0
  451. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_misc.py +0 -0
  452. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_paragraph_strict.py +0 -0
  453. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_paragraph_style.py +0 -0
  454. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_paragraph_style_strict.py +0 -0
  455. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_parfmt.py +0 -0
  456. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_row_col_cell.py +0 -0
  457. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_run_add_break.py +0 -0
  458. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_run_bool_setters.py +0 -0
  459. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_run_style.py +0 -0
  460. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_run_style_strict.py +0 -0
  461. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_run_text.py +0 -0
  462. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_run_underline.py +0 -0
  463. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_section_audit.py +0 -0
  464. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_section_dimensions.py +0 -0
  465. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_section_onoff.py +0 -0
  466. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_settings.py +0 -0
  467. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_shared_audit.py +0 -0
  468. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_style.py +0 -0
  469. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_styles.py +0 -0
  470. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_table_audit.py +0 -0
  471. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_table_cell.py +0 -0
  472. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_table_dimensions.py +0 -0
  473. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_silent_stub_table_layout.py +0 -0
  474. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_smoke_integration.py +0 -0
  475. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_style_acceptance.py +0 -0
  476. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_style_delete.py +0 -0
  477. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_style_font.py +0 -0
  478. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_style_formatting_writes.py +0 -0
  479. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_style_metadata_writes.py +0 -0
  480. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_style_setters_contract.py +0 -0
  481. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_style_tab_stops.py +0 -0
  482. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_style_tab_stops_read.py +0 -0
  483. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_symbol_reads_python_docx_parity.py +0 -0
  484. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_tab_stop_writes.py +0 -0
  485. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_table_add_row_grid_row.py +0 -0
  486. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_table_anchors.py +0 -0
  487. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_table_clears.py +0 -0
  488. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_table_direction.py +0 -0
  489. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_table_set_cell_perf.py +0 -0
  490. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_table_style_id_resolution.py +0 -0
  491. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_temporarily_unavailable.py +0 -0
  492. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_text_control_characters.py +0 -0
  493. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_tracked_revisions_offsets.py +0 -0
  494. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_unmapped_alignment_reads.py +0 -0
  495. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_uv_lock_version.py +0 -0
  496. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_validate_find_replace_asset_script.py +0 -0
  497. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_xml_attr_guard.py +0 -0
  498. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_xml_incompatible_text.py +0 -0
  499. {athena_python_docx-0.38.0 → athena_python_docx-0.40.0}/tests/test_zod_wire_contract.py +0 -0
@@ -136,12 +136,24 @@ pinned by focused tests and documented in
136
136
  r.add_picture(img)` writes the bold `w:rPr` beside the `w:drawing`. An older
137
137
  docx-studio puts the picture in a run of its own (`tests/test_drawing_image.py`,
138
138
  battery `ab_probe/picture_runs.py`).
139
- - **A run holding only a page or column break yields `""` from
140
- `Run.iter_inner_content()`,** as python-docx reads a `w:br` of type `page`
141
- or `column` as empty text; an empty run (a comment reference's) yields
142
- nothing. docx-studio's read marks such a run with `break`, and
143
- `Run.add_break` marks the run it adds one to. Against an older docx-studio,
144
- which sends no `break`, a re-read run yields nothing.
139
+ - **A run holding only a page or column break, or an empty text element
140
+ (`<w:t/>`), yields `""` from `Run.iter_inner_content()`,** as python-docx
141
+ reads a `w:br` of type `page` or `column`, and a `w:t` with no text, as
142
+ empty text; an empty run (a comment reference's) yields nothing.
143
+ docx-studio's read marks such a run with `break` (or `emptyText`), and
144
+ `Run.add_break` marks the run it adds one to; a text write to the run
145
+ drops `emptyText`. Against an older docx-studio, which sends neither, a
146
+ re-read run yields nothing.
147
+ - **`doc.inline_shapes` lists a picture in a text box twice, as python-docx
148
+ does.** Word writes a text box in `mc:AlternateContent` as a DrawingML
149
+ shape and as its VML copy, each with the box's text, and python-docx's
150
+ `//w:p/w:r/w:drawing/wp:inline` finds the picture in both. The SDK asks
151
+ `ImagesList` for the second (`fallbackCopies`): a row under no id
152
+ (`fallbackCopy`) that reads its size, type and alt text as the export
153
+ writes the copy. A change of its size, alt text, title or decorative flag
154
+ warns (`DocxUnsupportedCommandWarning`) and sends nothing, as docx-studio
155
+ writes the copy from the box (`tests/test_inline_shape_type.py`). An older
156
+ docx-studio lists the picture once.
145
157
  - **`Styles.latent_styles`** (`docx.styles.latent.LatentStyles`) reads
146
158
  the document's `<w:latentStyles>` (defaults and each `w:lsdException`)
147
159
  from docx-studio's `Info` (`includeStyles` → `latentStyles`), as python-docx
@@ -351,6 +363,13 @@ Issue numbers reference `python-openxml/python-docx`.
351
363
  through `CreateHyperlink` (DOCX Studio `doc.hyperlinks.create`). Returns
352
364
  the same `Hyperlink` class the read path already exposes. Also
353
365
  available as `Run.add_hyperlink` for convenience.
366
+ A link whose target has a scheme the editor does not keep (`file:`, a
367
+ mistyped `Mail:`, `javascript:`), written by a script or in the source, is
368
+ stored as written beside an empty clickable target (`unsafeHref`): it reads
369
+ as python-docx reads it (`Hyperlink`, `address`, `url`, its runs), the
370
+ export writes the target back, and the editor draws its text as a link that
371
+ nothing makes clickable (owner decision, 2026-10-23;
372
+ `hyperlinks-unlisted-schemes`).
354
373
 
355
374
  - **`Run.add_field(kind, *, args=None, cached_result=None) -> Field`**
356
375
  + **`Document.fields: Fields`** — generic Word field insertion.
@@ -1019,8 +1038,17 @@ architecture or a DOCX Studio constraint:
1019
1038
  the UI name (`"Heading 1"`), `.style_id` the id (`"Heading1"`), read from
1020
1039
  the document's style table (docx-studio `Info` with `includeStyles`,
1021
1040
  fetched once per session in `docx/styles/_table.py`). A style set by name
1022
- or id is sent as the document's id, and an unstyled paragraph reads as the
1023
- default paragraph style. `paragraph.style = …` raises `KeyError` for a
1041
+ or id is sent as the document's id. A style read resolves as python-docx's
1042
+ `Styles.get_by_id`: the document's first style of the stored id when it is
1043
+ of the type read; else, for an unstyled paragraph, run or table or one
1044
+ naming a style of another type, the type's default style (the last the
1045
+ document flags `w:default`), and None in a document that flags none, as
1046
+ generated documents often do (`styles.default(...)` is None there too).
1047
+ Each `w:style` is a style of its own, a second definition of an id (and
1048
+ one with no `w:name`, whose name is None) included, reading its own name,
1049
+ flags and formatting; a write to it changes the first definition of its id,
1050
+ which docx-studio addresses by the id, where python-docx changes the one it
1051
+ wraps. `paragraph.style = …` raises `KeyError` for a
1024
1052
  name the document defines no style for, like python-docx — except the
1025
1053
  Word built-ins docx-studio holds a definition of
1026
1054
  (`BUILTIN_PARAGRAPH_STYLE_NAMES`: `"Heading 4"`, `"List Bullet"`,
@@ -1028,7 +1056,16 @@ architecture or a DOCX Studio constraint:
1028
1056
  `styles.xml` until used. Those are sent by their Word id; the paragraph
1029
1057
  holds `w:pStyle` alone, the editor paints it from that definition and
1030
1058
  the export adds the definition (with a list of the document's own for a
1031
- numbered list style), as Word does when the style is applied. Heading 1–9,
1059
+ numbered list style), as Word does when the style is applied, so the
1060
+ paragraph reads back as that built-in. A built-in the uploaded document's
1061
+ source already named without defining it (`Info`'s `undefinedStyleIds`)
1062
+ reads as the default paragraph style, as python-docx reads it and Word
1063
+ draws it: the editor paints it so and the export adds no definition.
1064
+ A header or footer part a read adds
1065
+ (python-docx's `default-header.xml`) names `Header` (`Footer`) only where
1066
+ the document defines it: elsewhere python-docx's reference resolves to the
1067
+ default paragraph style and adds no definition, so the SDK's paragraph
1068
+ names no style and the export adds none. Heading 1–9,
1032
1069
  Title, Subtitle, Quote, Intense Quote, List Paragraph, No Spacing and
1033
1070
  Caption are defined by hand to current Word's definitions
1034
1071
  (`packages/core/src/prosemirror/styles/latentBuiltInStyles.ts`); the
@@ -1104,13 +1141,12 @@ architecture or a DOCX Studio constraint:
1104
1141
  wins in the save that writes it (a later save in the same batch stamps
1105
1142
  again). Every read asks docx-studio, which saves the batch's edits before it
1106
1143
  answers, so a read sees the stamp, and a collaborator's save. A package
1107
- without `docProps/core.xml` reads
1108
- every property as missing, where python-docx adds its own default part
1109
- (title "Word Document", last modified by "python-docx").
1110
-
1111
- - **`Comment.comment_id` returns `str`, not `int`.** DOCX Studio uses
1112
- non-numeric entity ids (`"c-42"`), so the upstream `int` contract
1113
- can't be honored. Tracked in `DOCX_STUDIO_LIMITATIONS.md`.
1144
+ without `docProps/core.xml` reads as the default part python-docx adds to
1145
+ it on first access (title "Word Document", last modified by
1146
+ "python-docx", revision 1, and as `modified` the time of the session's
1147
+ first read, which later reads keep, as python-docx keeps its part's;
1148
+ docx-studio's `Info` marks it `corePropertiesDefault`), and a property set
1149
+ there is written into that part, as python-docx writes it.
1114
1150
 
1115
1151
  - **`add_comment` without an `author` stores the session's name, not
1116
1152
  `""`.** `Document.add_comment` / `Comments.add_comment` send `author`
@@ -1166,12 +1202,29 @@ architecture or a DOCX Studio constraint:
1166
1202
  the base text keeps its room in the text-address space (`ruby` spans on the
1167
1203
  read's run; `tests/test_ruby_reads_python_docx_parity.py`). That holds while
1168
1204
  the paragraph's runs are as its records hold them, in the body, a table cell,
1169
- a header, a footer or a comment; a paragraph with a link or a tracked change
1170
- reads its runs from their marks, the base text included. A write to the run
1205
+ a header, a footer or a comment; a body or cell paragraph with a link or an
1206
+ inline content control reads its runs from the records its import keeps for
1207
+ the reads alone (`_readRunRecords`), carried through an SDK run write
1208
+ (`_writtenRunRecords`), until another edit changes them, a header's or
1209
+ footer's with a link always does, and a paragraph with a tracked change, an
1210
+ edited one with a link, and a comment's with a link read their runs from
1211
+ their marks, the base text included. A write to the run
1171
1212
  (its text, an append, its formatting) makes the base text ordinary text,
1172
1213
  which then reads as text: docx-studio keeps no guide through an edit, where
1173
1214
  upstream keeps the `w:ruby` through all but a text write.
1174
1215
 
1216
+ - **A character of one of Word's run elements that the source wrote as text
1217
+ reads as written.** A source can write a non-breaking or soft hyphen as the
1218
+ character in a `w:t` (generated text holds them so), which upstream reads as
1219
+ it is, where it reads a `w:noBreakHyphen` as `-` and a `w:softHyphen` as
1220
+ nothing. docx-studio keeps each character it lists
1221
+ (`LITERAL_CHARACTERS`, `packages/core/src/utils/wordCharacters.ts`) apart
1222
+ from the element under the `literalCharacter` mark, and its reads send their
1223
+ offsets in a run's text (`literalCharacters`), which `_word_text` reads as
1224
+ written; a docx-studio that sends none reads each as the element, as before.
1225
+ The export writes them back in a `w:t`, and text a script writes holds them
1226
+ as upstream writes it, in a `w:t`.
1227
+
1175
1228
  - **`CoreProperties.modified` is the time of the last save.** The asset is a
1176
1229
  live Word document, and docx-studio stamps `dcterms:modified` when it saves
1177
1230
  a change to the package: a section, style or property write, and the export
@@ -1191,6 +1244,95 @@ architecture or a DOCX Studio constraint:
1191
1244
  Markup) show insertions and hide deletions, as these reads do.
1192
1245
  `doc.revisions` lists every change (`tests/test_run_text_python_docx.py`).
1193
1246
 
1247
+ - **Runs inside an inline wrapper read as the paragraph's.** The runs of a
1248
+ `w:smartTag`, an inline `w:customXml`, a `w:dir` or a `w:bdo` read in
1249
+ `Paragraph.text`, `runs`, `iter_inner_content()`, `Hyperlink.runs` and
1250
+ `_Cell.text`, as Word shows them; upstream reads only a `w:p`'s direct
1251
+ `w:r` and `w:hyperlink` children, so it cannot see their text. With
1252
+ upstream's reads, `p.text = p.text.replace(...)` on such a paragraph would
1253
+ delete the wrapped text, which the setter clears unseen: 62 of 6,803
1254
+ customer uploads hold text inside smart tags. Decided on 2026-10-21 under
1255
+ the Word fidelity goal (owner question 47), the same choice as tracked
1256
+ changes; the owner may overrule it. Recorded in
1257
+ `tests/parity/intentional_deviations.json` (`live_deviations`).
1258
+
1259
+ - **Two things a source writes that the model holds otherwise read as the
1260
+ model holds them** (2026-10-22 SDK live parity run over 398 customer
1261
+ documents). Each is recorded in
1262
+ `tests/parity/intentional_deviations.json` (`live_deviations`) with a
1263
+ synthetic fixture of `docx-fidelity/regression-fixtures/`:
1264
+ - A run size written as a measure with a unit (`w:sz w:val="6mm"`, as
1265
+ Microsoft Teams transcripts write it; 9 documents) reads in whole
1266
+ half-points (`Length(215900)`, 17pt, where upstream reads 216000): under
1267
+ a hundredth of a point, and holding the measure would change the stored
1268
+ model of a run (`runs-measured-sizes`). Confirmed by the owner,
1269
+ 2026-10-23.
1270
+ - A page margin written as decimal twips (`w:left="1440.0000000000002"`;
1271
+ 1 document) reads as the length it holds, where upstream raises
1272
+ `ValueError`; the export writes it in whole twips
1273
+ (`sections-fractional-twips`). Confirmed by the owner, 2026-10-23.
1274
+
1275
+ - **Four more things a source writes that the model holds otherwise read as the
1276
+ model holds them** (2026-10-22 SDK live parity run over 398 customer
1277
+ documents, round 2). Each is recorded in `tests/parity/intentional_deviations.json`
1278
+ (`live_deviations`) with a synthetic fixture of
1279
+ `docx-fidelity/regression-fixtures/`:
1280
+ - A run that holds Word's rendered page break before a page break
1281
+ (`<w:lastRenderedPageBreak/><w:br w:type="page"/>`; 2 documents) yields the
1282
+ page break's `""` before the `RenderedPageBreak`, as a run that holds them
1283
+ the other way round does: the model holds the page break apart from the
1284
+ paragraph and keeps no order between the two
1285
+ (`breaks-rendered-before-page-break`). Confirmed by the owner, 2026-10-23.
1286
+ - A rendered page break in the run that begins a field (2 documents) reads
1287
+ in no run and no paragraph: the import keeps none in a field's own runs,
1288
+ which its node stands for (`fields-rendered-break-begin-run`). Confirmed
1289
+ by the owner, 2026-10-23.
1290
+ - A table that names a table style its styles.xml does not define (1
1291
+ document; 16 of 6,806 uploads) reads as Word's built-in style of that id,
1292
+ which the editor draws it with, where upstream reads the default table
1293
+ style; reading the default would change how such tables draw. The export
1294
+ leaves the style undefined, as the source has it: an unedited download of
1295
+ a document imported since is the source's bytes (owner, 2026-10-23). The read is kept until Word can be
1296
+ checked, as no Word probe can be made on the machine that recorded it
1297
+ (`tables-undefined-style`).
1298
+ - A package with no styles part (1 document) reads Word's built-in styles,
1299
+ which the editor gives it, where upstream reads its own default template's
1300
+ (`styles-part-absent`). Confirmed by the owner, 2026-10-23.
1301
+
1302
+ - **Two more reads follow the model where python-docx reads the source**
1303
+ (2026-10-22 SDK live parity run over 398 customer documents, round 3). Each is
1304
+ recorded in `tests/parity/intentional_deviations.json` (`live_deviations`)
1305
+ with a synthetic fixture:
1306
+ - A comment whose range ends between paragraphs (`w:commentRangeEnd` a
1307
+ child of `w:body`; 1 document, 11 of 6,826 uploads) reads its reference
1308
+ run at the end of the last paragraph its mark covers, where the export
1309
+ writes it from the model, where upstream reads it in the paragraph after
1310
+ the range end: the model holds a range as a mark on its text and no range
1311
+ end between paragraphs (`comments-range-end-between-paragraphs`).
1312
+ Confirmed by the owner, 2026-10-23.
1313
+ - A comment's annotation reference run that names no character style
1314
+ (1 document, 13 of 6,826 uploads) reads in the CommentReference style, in
1315
+ which the export writes every comment's annotation run when it writes the
1316
+ comments part: the model holds no annotation mark, and the parser keeps the
1317
+ run as an empty run nothing tells from another
1318
+ (`comments-annotation-ref-unstyled`). Confirmed by the owner, 2026-10-23.
1319
+
1320
+ A third, runs of one formatting read and exported joined after a run write
1321
+ in a paragraph with a link, an inline content control, an equation or a
1322
+ field beside a picture, is no longer a deviation (the owner asked for it to
1323
+ be fixed, 2026-10-23, #46477): a run write (a format, `run.text`,
1324
+ `add_run`, `add_text`) carries the records the read takes of such a
1325
+ paragraph's runs (`_writtenRunRecords`), each `w:r` kept with the written
1326
+ run changed as python-docx changes it, and the export writes the paragraph
1327
+ from them. A write the records cannot describe (a format of a field's runs,
1328
+ a write across a field, a run the offsets cannot tell from an empty one
1329
+ beside it) leaves the paragraph as before: a link paragraph's kept content,
1330
+ else the runs its marks make. Fixture scripts
1331
+ `fixture-links-run-write-keeps-runs`, `fixture-links-run-writes`,
1332
+ `fixture-content-controls-inline-run-writes`,
1333
+ `fixture-equations-beside-runs-run-writes` and
1334
+ `fixture-fields-beside-pictures-run-writes`.
1335
+
1194
1336
  - **A citation link Athena added reads as its text, as the export writes it**
1195
1337
  (owner decision #40122). Athena's citation flow stamps the links it writes
1196
1338
  with the `Athena citation` tooltip. These links only navigate inside Athena,
@@ -1217,7 +1359,11 @@ architecture or a DOCX Studio constraint:
1217
1359
  is the link's, as in python-docx. Each paragraph of a field that spans
1218
1360
  paragraphs (a table of contents) holds the field character runs it has
1219
1361
  (`tests/test_field_reads_python_docx_parity.py`, against stock python-docx
1220
- on the same `.docx`; `DOCX_STUDIO_LIMITATIONS.md` § 27). A field takes no
1362
+ on the same `.docx`; `DOCX_STUDIO_LIMITATIONS.md` § 27). A field the source
1363
+ wrote whole in one `w:r` (begin, field code, separate and end, no result, as
1364
+ generators write a page number) is that one run, a `begin` run with that
1365
+ run's formatting, as python-docx reads it, and docx-studio writes it back
1366
+ as one run. A field takes no
1221
1367
  room in the text-address space, so its runs stand at one offset. Writes:
1222
1368
  - setting a result run's `.text` changes the field's displayed result,
1223
1369
  as in python-docx (`Replace` with a `field` target): the export keeps
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: athena-python-docx
3
- Version: 0.38.0
3
+ Version: 0.40.0
4
4
  Summary: Drop-in replacement for python-docx that connects to Athena's DOCX Studio 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.38.0"
9
+ __version__ = "0.40.0"
10
10
 
11
11
  from docx.api import Document
12
12
  from docx._buffer import discard_all, flush_all