athena-python-docx 0.45.0__tar.gz → 0.45.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (503) hide show
  1. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/PKG-INFO +1 -1
  2. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/__init__.py +1 -1
  3. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_asset_token.py +18 -0
  4. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_http.py +25 -0
  5. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_http_doc.py +10 -0
  6. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/pyproject.toml +1 -1
  7. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_asset_tokens.py +63 -5
  8. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_public_create.py +67 -4
  9. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/uv.lock +1 -1
  10. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/.gitignore +0 -0
  11. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/AGENTS.md +0 -0
  12. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/CLAUDE.md +0 -0
  13. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/DOCX_EXEC_LAB.md +0 -0
  14. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/README.md +0 -0
  15. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_athena_extension.py +0 -0
  16. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_batching.py +0 -0
  17. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_buffer.py +0 -0
  18. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_capabilities.py +0 -0
  19. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_citations.py +0 -0
  20. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_execution.py +0 -0
  21. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_image_utils.py +0 -0
  22. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_postproc.py +0 -0
  23. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_proxy.py +0 -0
  24. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_ptc.py +0 -0
  25. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_public_create.py +0 -0
  26. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_references.py +0 -0
  27. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_run_order.py +0 -0
  28. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_table_styles.py +0 -0
  29. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_timeouts.py +0 -0
  30. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_tracked.py +0 -0
  31. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_xml_text.py +0 -0
  32. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/api.py +0 -0
  33. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/blkcntnr.py +0 -0
  34. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/bookmarks.py +0 -0
  35. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/charts.py +0 -0
  36. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/client.py +0 -0
  37. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/commands.py +0 -0
  38. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/comments.py +0 -0
  39. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/document.py +0 -0
  40. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/drawing/__init__.py +0 -0
  41. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/enum/__init__.py +0 -0
  42. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/enum/base.py +0 -0
  43. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/enum/dml.py +0 -0
  44. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/enum/section.py +0 -0
  45. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/enum/shape.py +0 -0
  46. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/enum/style.py +0 -0
  47. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/enum/table.py +0 -0
  48. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/enum/text.py +0 -0
  49. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/errors.py +0 -0
  50. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/exceptions.py +0 -0
  51. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/fields.py +0 -0
  52. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/footnotes.py +0 -0
  53. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/image/__init__.py +0 -0
  54. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/image/exceptions.py +0 -0
  55. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/image/image.py +0 -0
  56. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/math.py +0 -0
  57. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/opc/__init__.py +0 -0
  58. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/opc/coreprops.py +0 -0
  59. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/oxml/__init__.py +0 -0
  60. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/revisions.py +0 -0
  61. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/sdt.py +0 -0
  62. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/section.py +0 -0
  63. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/session.py +0 -0
  64. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/settings.py +0 -0
  65. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/shape.py +0 -0
  66. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/shared.py +0 -0
  67. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/styles/__init__.py +0 -0
  68. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/styles/_table.py +0 -0
  69. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/styles/latent.py +0 -0
  70. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/styles/style.py +0 -0
  71. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/styles/styles.py +0 -0
  72. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/table.py +0 -0
  73. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/text/__init__.py +0 -0
  74. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/text/font.py +0 -0
  75. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/text/hyperlink.py +0 -0
  76. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/text/pagebreak.py +0 -0
  77. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/text/paragraph.py +0 -0
  78. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/text/parfmt.py +0 -0
  79. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/text/run.py +0 -0
  80. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/text/tabstops.py +0 -0
  81. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/toc.py +0 -0
  82. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/typing.py +0 -0
  83. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/scripts/docx_exec_lab.py +0 -0
  84. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/scripts/docx_exec_lab_examples/fast_table_fill.py +0 -0
  85. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/scripts/docx_exec_lab_examples/find_replace_literal.py +0 -0
  86. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/scripts/docx_exec_lab_server.py +0 -0
  87. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/scripts/dump_wire_fixtures.py +0 -0
  88. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/scripts/release.sh +0 -0
  89. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/scripts/round_trip_smoke.py +0 -0
  90. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/scripts/smoke_test_block_not_found.py +0 -0
  91. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/scripts/validate_find_replace_asset.py +0 -0
  92. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/__init__.py +0 -0
  93. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/conftest.py +0 -0
  94. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/METHODOLOGY.md +0 -0
  95. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/README.md +0 -0
  96. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/__init__.py +0 -0
  97. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ab_probe/__init__.py +0 -0
  98. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ab_probe/agent_documents.py +0 -0
  99. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ab_probe/default_style_run_formatting.py +0 -0
  100. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ab_probe/header_footer_pictures.py +0 -0
  101. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ab_probe/less_used_writes.py +0 -0
  102. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ab_probe/merged_cell_identity.py +0 -0
  103. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ab_probe/paragraph_text_setter.py +0 -0
  104. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ab_probe/picture_runs.py +0 -0
  105. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ab_probe/proxy_equality.py +0 -0
  106. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ab_probe/return_types.py +0 -0
  107. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ab_probe/xml_incompatible_text.py +0 -0
  108. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ab_probe/zero_and_negative_indents.py +0 -0
  109. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ab_probe_cases.py +0 -0
  110. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ab_probe_runner.py +0 -0
  111. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/auto_gen_cases.py +0 -0
  112. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/binary_round_trip.py +0 -0
  113. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/cases.py +0 -0
  114. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/complex_cases.py +0 -0
  115. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/coverage_report.py +0 -0
  116. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/extract.py +0 -0
  117. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/extreme_cases.py +0 -0
  118. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/fake_session.py +0 -0
  119. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/firm_templates/README.md +0 -0
  120. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/firm_templates/__init__.py +0 -0
  121. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/firm_templates/_runner.py +0 -0
  122. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/firm_templates/extractor.py +0 -0
  123. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/firm_templates/test_pw_corpus.py +0 -0
  124. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/firm_templates/test_pw_research_digest.py +0 -0
  125. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/local_runner.py +0 -0
  126. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/mega_cases.py +0 -0
  127. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshot.py +0 -0
  128. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/01_basic_paragraph.json +0 -0
  129. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/02_multiple_headings.json +0 -0
  130. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/03_runs_with_formatting.json +0 -0
  131. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/04_font_name_and_size.json +0 -0
  132. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/05_font_color_rgb.json +0 -0
  133. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/06_font_character_properties.json +0 -0
  134. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/07_font_subscript_superscript.json +0 -0
  135. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/08_font_highlight.json +0 -0
  136. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/09_paragraph_alignment.json +0 -0
  137. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/100_table_negative_indexing.json +0 -0
  138. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/101_table_cells_flat_iteration.json +0 -0
  139. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/102_text_with_embedded_special_chars.json +0 -0
  140. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/104_core_properties_datetime.json +0 -0
  141. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/105_default_one_section.json +0 -0
  142. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/106_heading_paragraph_format.json +0 -0
  143. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/107_varying_row_heights.json +0 -0
  144. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/10_paragraph_indents.json +0 -0
  145. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/11_paragraph_spacing.json +0 -0
  146. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/12_paragraph_keep_options.json +0 -0
  147. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/13_paragraph_tab_stops.json +0 -0
  148. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/14_run_add_tab_and_break.json +0 -0
  149. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/15_run_add_break_page.json +0 -0
  150. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/16_paragraph_clear_and_insert_before.json +0 -0
  151. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/17_table_basic.json +0 -0
  152. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/18_table_cell_text.json +0 -0
  153. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/19_table_row_column_sizing.json +0 -0
  154. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/20_table_cell_vertical_alignment.json +0 -0
  155. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/21_table_alignment_and_autofit.json +0 -0
  156. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/22_table_cell_paragraphs_iteration.json +0 -0
  157. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/24_table_add_row_column.json +0 -0
  158. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/25_table_merge_cells.json +0 -0
  159. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/26_section_page_setup.json +0 -0
  160. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/27_section_margins.json +0 -0
  161. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/28_section_add_new.json +0 -0
  162. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/29_section_headers_linked.json +0 -0
  163. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/30_styles_iteration.json +0 -0
  164. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/31_styles_lookup_and_default.json +0 -0
  165. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/32_styles_add_paragraph_style.json +0 -0
  166. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/33_core_properties_set_and_get.json +0 -0
  167. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/34_inline_shapes_iterate_empty.json +0 -0
  168. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/35_full_report.json +0 -0
  169. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/36_replace_text_in_paragraph.json +0 -0
  170. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/37_iterate_runs_and_format_all_bold.json +0 -0
  171. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/38_font_all_properties.json +0 -0
  172. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/39_large_body_100_paragraphs.json +0 -0
  173. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/40_large_table_10x10.json +0 -0
  174. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/41_unicode_and_emoji.json +0 -0
  175. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/42_very_long_paragraph.json +0 -0
  176. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/43_paragraph_text_round_trip.json +0 -0
  177. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/44_paragraph_alignment_round_trip.json +0 -0
  178. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/45_cell_text_round_trip.json +0 -0
  179. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/46_run_text_setter_round_trip.json +0 -0
  180. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/47_font_size_round_trip.json +0 -0
  181. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/48_font_color_round_trip.json +0 -0
  182. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/49_resume_layout.json +0 -0
  183. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/50_multi_section_doc.json +0 -0
  184. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/52_iterate_everything.json +0 -0
  185. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/53_apply_style_to_paragraphs.json +0 -0
  186. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/54_empty_everything.json +0 -0
  187. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/55_single_character_runs.json +0 -0
  188. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/56_everything_in_one.json +0 -0
  189. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/57_runs_after_multiple_text_appends.json +0 -0
  190. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/58_modify_runs_in_place.json +0 -0
  191. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/59_indent_round_trip.json +0 -0
  192. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/60_space_round_trip.json +0 -0
  193. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/61_cell_paragraph_with_runs.json +0 -0
  194. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/62_many_cell_paragraphs.json +0 -0
  195. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/63_table_style_round_trip.json +0 -0
  196. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/64_many_sections.json +0 -0
  197. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/65_20x20_table_formatted.json +0 -0
  198. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/66_toc_like_structure.json +0 -0
  199. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/67_paragraph_insert_before_chain.json +0 -0
  200. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/68_invoice.json +0 -0
  201. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/69_newsletter.json +0 -0
  202. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/70_add_and_iterate_back.json +0 -0
  203. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/71_academic_paper.json +0 -0
  204. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/72_legal_contract.json +0 -0
  205. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/73_form_with_many_tables.json +0 -0
  206. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/74_paragraph_with_10_runs.json +0 -0
  207. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/75_paragraph_negative_first_line_indent.json +0 -0
  208. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/76_rgbcolor_from_string.json +0 -0
  209. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/77_length_unit_conversions.json +0 -0
  210. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/78_paragraph_copy_style.json +0 -0
  211. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/79_bulk_cell_formatting.json +0 -0
  212. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/80_apply_style_after_add_run.json +0 -0
  213. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/81_multi_page_with_breaks.json +0 -0
  214. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/82_add_text_on_existing_run.json +0 -0
  215. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/83_clear_then_repopulate_paragraph.json +0 -0
  216. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/84_table_reread_row_count.json +0 -0
  217. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/85_header_footer_access.json +0 -0
  218. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/86_font_read_unset_returns_none.json +0 -0
  219. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/87_500_paragraph_doc.json +0 -0
  220. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/88_mixed_content_iteration.json +0 -0
  221. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/89_alignment_clear_via_none.json +0 -0
  222. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/90_cell_add_paragraph_styled.json +0 -0
  223. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/91_many_small_tables.json +0 -0
  224. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/92_margins_every_section.json +0 -0
  225. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/93_font_bool_reads_after_set.json +0 -0
  226. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/94_page_break_before_paragraph.json +0 -0
  227. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/95_paragraph_hyperlinks_empty.json +0 -0
  228. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/96_paragraph_contains_page_break.json +0 -0
  229. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/97_document_styles_by_key.json +0 -0
  230. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/98_style_contains_check.json +0 -0
  231. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/99_run_add_picture_from_bytes.json +0 -0
  232. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex02_unicode_everywhere.json +0 -0
  233. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex03_1000_paragraphs.json +0 -0
  234. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex04_50x50_table.json +0 -0
  235. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex05_long_text_in_cell.json +0 -0
  236. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex06_hundred_tiny_runs.json +0 -0
  237. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex07_every_font_boolean.json +0 -0
  238. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex08_many_continuous_sections.json +0 -0
  239. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex09_many_tab_stops.json +0 -0
  240. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex10_complex_bom.json +0 -0
  241. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex11_banded_rows_formatting.json +0 -0
  242. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex12_section_reconfigure.json +0 -0
  243. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex13_cell_with_10_paragraphs.json +0 -0
  244. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex14_styled_report_table.json +0 -0
  245. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex15_paragraph_all_format_props.json +0 -0
  246. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex16_runs_interleaved_with_breaks.json +0 -0
  247. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex17_all_break_kinds.json +0 -0
  248. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex18_read_back_large_doc.json +0 -0
  249. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex19_mutate_all_runs.json +0 -0
  250. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex20_kitchen_sink_v2.json +0 -0
  251. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/mega01_book_chapter.json +0 -0
  252. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/mega02_research_proposal.json +0 -0
  253. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/mega03_financial_statement.json +0 -0
  254. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/mega04_recipe_card.json +0 -0
  255. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/mega05_user_manual.json +0 -0
  256. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/mega06_complex_newsletter.json +0 -0
  257. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/mega07_budget_spreadsheet.json +0 -0
  258. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/mega08_product_catalog.json +0 -0
  259. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/mega09_signed_contract.json +0 -0
  260. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/mega10_api_documentation.json +0 -0
  261. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw01_official_quickstart.json +0 -0
  262. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw02_paragraph_style_list.json +0 -0
  263. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw03_character_formatting.json +0 -0
  264. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw04_section_page_setup.json +0 -0
  265. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw05_toc_pattern.json +0 -0
  266. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw06_meeting_minutes.json +0 -0
  267. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw07_dense_formatting_demo.json +0 -0
  268. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw08_table_merged_header.json +0 -0
  269. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw09_bulk_run_iteration.json +0 -0
  270. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw10_colored_grid_table.json +0 -0
  271. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw11_header_text.json +0 -0
  272. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw12_first_page_footer.json +0 -0
  273. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw13_even_page_header.json +0 -0
  274. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw15_paragraph_style_instance.json +0 -0
  275. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw16_header_footer_tables.json +0 -0
  276. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw17_header_letterhead_filled.json +0 -0
  277. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw18_header_table_properties.json +0 -0
  278. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw19_header_table_rows_columns.json +0 -0
  279. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw20_header_table_merges.json +0 -0
  280. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ours_spec.json +0 -0
  281. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/parity_crawl.py +0 -0
  282. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/parity_diff.json +0 -0
  283. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/real_world_cases.py +0 -0
  284. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/round_trip_tests.py +0 -0
  285. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/stock_spec.json +0 -0
  286. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/test_e2e_against_staging.py +0 -0
  287. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fixtures/field_reads.json +0 -0
  288. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fixtures/note_reference_reads.json +0 -0
  289. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fixtures/ruby_reads.json +0 -0
  290. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fixtures/symbol_reads.json +0 -0
  291. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/live/__init__.py +0 -0
  292. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/live/baseline.json +0 -0
  293. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/live/fixture_scripts.py +0 -0
  294. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/live/reader.py +0 -0
  295. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/live/runner.py +0 -0
  296. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/live/sdk_driver.py +0 -0
  297. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/live/stock_driver.py +0 -0
  298. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/live/test_live_runner.py +0 -0
  299. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/parity/README.md +0 -0
  300. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/parity/__init__.py +0 -0
  301. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/parity/baseline_gaps.json +0 -0
  302. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/parity/compare.py +0 -0
  303. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/parity/intentional_deviations.json +0 -0
  304. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/parity/introspect.py +0 -0
  305. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/parity/reports/GAP_ANALYSIS.md +0 -0
  306. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/parity/reports/gap_report.json +0 -0
  307. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/parity/run_parity.py +0 -0
  308. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/parity/snapshots/athena_latest.json +0 -0
  309. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/parity/snapshots/upstream_python_docx_1.2.0.json +0 -0
  310. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/parity/test_parity_gap.py +0 -0
  311. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_add_section.py +0 -0
  312. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_add_section_extract_items.py +0 -0
  313. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_alignment_values.py +0 -0
  314. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_athena_extension_creates_session_open.py +0 -0
  315. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_athena_extensions_contract.py +0 -0
  316. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_athena_extensions_registry.py +0 -0
  317. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_batch_chunking.py +0 -0
  318. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_batching_perf.py +0 -0
  319. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_battery_cases.py +0 -0
  320. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_block_not_found_error.py +0 -0
  321. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_buffer.py +0 -0
  322. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_cell_add_paragraph_wire_shape.py +0 -0
  323. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_cell_add_table_not_supported.py +0 -0
  324. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_cell_borders_spec.py +0 -0
  325. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_cell_fastpath_runs.py +0 -0
  326. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_cell_inner_add_hyperlink_stash.py +0 -0
  327. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_cell_inner_add_run_via_cell_insert.py +0 -0
  328. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_cell_inner_format_stash.py +0 -0
  329. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_cell_inner_run_format_stash.py +0 -0
  330. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_cell_inner_run_guard.py +0 -0
  331. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_cell_merge.py +0 -0
  332. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_cell_nested_tables.py +0 -0
  333. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_cell_paragraphs_listed.py +0 -0
  334. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_cell_text_plain_fastpath.py +0 -0
  335. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_cell_text_replace_semantics.py +0 -0
  336. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_citations.py +0 -0
  337. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_collapsed_range_format.py +0 -0
  338. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_color_format_theme.py +0 -0
  339. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_command_dataclasses.py +0 -0
  340. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_commands.py +0 -0
  341. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_comment_paragraphs.py +0 -0
  342. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_comments.py +0 -0
  343. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_comments_first_read.py +0 -0
  344. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_content_control_value.py +0 -0
  345. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_core_properties.py +0 -0
  346. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_create_workspace.py +0 -0
  347. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_document_asset_id_property.py +0 -0
  348. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_document_clear.py +0 -0
  349. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_document_create.py +0 -0
  350. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_document_create_from_template.py +0 -0
  351. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_document_factory_validation.py +0 -0
  352. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_document_settings_session_open.py +0 -0
  353. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_docx_exec_lab.py +0 -0
  354. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_docx_exec_lab_server.py +0 -0
  355. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_drawing_image.py +0 -0
  356. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_e2e_partial_failure_cascade.py +0 -0
  357. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_empty_hyperlinks.py +0 -0
  358. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_enum_parity.py +0 -0
  359. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_execution_scope.py +0 -0
  360. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_export_docx_clean.py +0 -0
  361. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_export_rescue_anchors.py +0 -0
  362. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_field_reads_python_docx_parity.py +0 -0
  363. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_field_refresh.py +0 -0
  364. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_field_runs.py +0 -0
  365. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_find_replace_session_open.py +0 -0
  366. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_flushed_write_failures.py +0 -0
  367. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_http_transport.py +0 -0
  368. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_hyperlink_coalescing.py +0 -0
  369. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_image_url_data_uri.py +0 -0
  370. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_inline_page_break.py +0 -0
  371. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_inline_shape_alt_text.py +0 -0
  372. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_inline_shape_size.py +0 -0
  373. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_inline_shape_type.py +0 -0
  374. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_inline_shapes_floating.py +0 -0
  375. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_insert_deferred.py +0 -0
  376. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_iter_inner_content.py +0 -0
  377. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_latent_style_writes.py +0 -0
  378. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_line_clear_break.py +0 -0
  379. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_list_styles.py +0 -0
  380. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_listed_paragraph_reads.py +0 -0
  381. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_literal_no_break_hyphens.py +0 -0
  382. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_literal_soft_hyphens.py +0 -0
  383. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_merged_cell_identity.py +0 -0
  384. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_merged_cell_secondary_slot.py +0 -0
  385. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_merged_cells.py +0 -0
  386. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_missing_modules.py +0 -0
  387. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_nested_table_refused.py +0 -0
  388. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_note_reference_reads_python_docx_parity.py +0 -0
  389. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_oxml_shim.py +0 -0
  390. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_page_break.py +0 -0
  391. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_paragraph_delete.py +0 -0
  392. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_paragraph_indent_reads.py +0 -0
  393. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_paragraph_runs_hyperlinks.py +0 -0
  394. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_paragraph_text_empty_run.py +0 -0
  395. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_paragraph_text_len_cache.py +0 -0
  396. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_parfmt_clears.py +0 -0
  397. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_parity_misc.py +0 -0
  398. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_parity_round2.py +0 -0
  399. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_partial_failure_cascade.py +0 -0
  400. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_pdf_export_and_page_renders.py +0 -0
  401. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_phase_a_behavior.py +0 -0
  402. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_phase_b_headers_footers.py +0 -0
  403. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_phase_c_tables.py +0 -0
  404. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_positional_cell_id.py +0 -0
  405. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_postproc_cell_format_rewrite.py +0 -0
  406. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_postproc_cell_run_format_rewrite.py +0 -0
  407. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_postproc_ref_restore.py +0 -0
  408. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_pr19766_review_fixes.py +0 -0
  409. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_proxy_equality.py +0 -0
  410. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_ptc.py +0 -0
  411. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_python_docx_api_parity.py +0 -0
  412. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_read_run_ranges.py +0 -0
  413. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_rendered_page_breaks.py +0 -0
  414. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_repeated_node_read.py +0 -0
  415. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_restart_numbering.py +0 -0
  416. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_revisions.py +0 -0
  417. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_round_trip_smoke_script.py +0 -0
  418. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_ruby_reads_python_docx_parity.py +0 -0
  419. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_run_add_picture_anchor.py +0 -0
  420. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_run_break_inner_content.py +0 -0
  421. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_run_edges.py +0 -0
  422. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_run_formatting_wire.py +0 -0
  423. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_run_identity.py +0 -0
  424. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_run_later_runs.py +0 -0
  425. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_run_mark_inheritance.py +0 -0
  426. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_run_page_number_blocks.py +0 -0
  427. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_run_table_style_objects.py +0 -0
  428. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_run_text_python_docx.py +0 -0
  429. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_run_text_refreshes_paragraph.py +0 -0
  430. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_run_unmodeled_toggles.py +0 -0
  431. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_sdk_reads_served.py +0 -0
  432. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_section_read_lengths.py +0 -0
  433. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_sections_empty_list.py +0 -0
  434. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_add_paragraph_style.py +0 -0
  435. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_add_picture.py +0 -0
  436. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_add_run.py +0 -0
  437. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_cell_add_paragraph.py +0 -0
  438. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_comments_add_comment.py +0 -0
  439. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_comments_get.py +0 -0
  440. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_document_audit.py +0 -0
  441. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_document_element.py +0 -0
  442. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_enum_section.py +0 -0
  443. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_font_audit.py +0 -0
  444. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_header_footer.py +0 -0
  445. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_hyperlink.py +0 -0
  446. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_inline_shape.py +0 -0
  447. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_insert_paragraph_before.py +0 -0
  448. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_misc.py +0 -0
  449. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_paragraph_strict.py +0 -0
  450. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_paragraph_style.py +0 -0
  451. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_paragraph_style_strict.py +0 -0
  452. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_parfmt.py +0 -0
  453. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_row_col_cell.py +0 -0
  454. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_run_add_break.py +0 -0
  455. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_run_bool_setters.py +0 -0
  456. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_run_style.py +0 -0
  457. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_run_style_strict.py +0 -0
  458. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_run_text.py +0 -0
  459. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_run_underline.py +0 -0
  460. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_section_audit.py +0 -0
  461. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_section_dimensions.py +0 -0
  462. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_section_onoff.py +0 -0
  463. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_settings.py +0 -0
  464. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_shared_audit.py +0 -0
  465. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_style.py +0 -0
  466. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_styles.py +0 -0
  467. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_table_audit.py +0 -0
  468. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_table_cell.py +0 -0
  469. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_table_dimensions.py +0 -0
  470. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_table_layout.py +0 -0
  471. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_smoke_integration.py +0 -0
  472. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_style_acceptance.py +0 -0
  473. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_style_delete.py +0 -0
  474. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_style_font.py +0 -0
  475. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_style_formatting_writes.py +0 -0
  476. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_style_metadata_writes.py +0 -0
  477. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_style_names.py +0 -0
  478. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_style_resolution.py +0 -0
  479. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_style_setters_contract.py +0 -0
  480. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_style_tab_stops.py +0 -0
  481. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_style_tab_stops_read.py +0 -0
  482. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_symbol_reads_python_docx_parity.py +0 -0
  483. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_tab_stop_writes.py +0 -0
  484. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_table_add_row_grid_row.py +0 -0
  485. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_table_anchors.py +0 -0
  486. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_table_clears.py +0 -0
  487. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_table_direction.py +0 -0
  488. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_table_length_reads.py +0 -0
  489. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_table_listing_reads.py +0 -0
  490. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_table_read_reuse.py +0 -0
  491. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_table_set_cell_perf.py +0 -0
  492. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_table_style_id_resolution.py +0 -0
  493. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_temporarily_unavailable.py +0 -0
  494. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_text_control_characters.py +0 -0
  495. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_tracked_revisions_offsets.py +0 -0
  496. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_unmapped_alignment_reads.py +0 -0
  497. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_uv_lock_version.py +0 -0
  498. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_validate_find_replace_asset_script.py +0 -0
  499. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_versioned_read_reuse.py +0 -0
  500. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_wire_contract.py +0 -0
  501. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_xml_attr_guard.py +0 -0
  502. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_xml_incompatible_text.py +0 -0
  503. {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_zod_wire_contract.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: athena-python-docx
3
- Version: 0.45.0
3
+ Version: 0.45.1
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.45.0"
9
+ __version__ = "0.45.1"
10
10
 
11
11
  from docx.api import Document
12
12
  from docx._buffer import discard_all, flush_all
@@ -17,6 +17,14 @@ Creating a document (``Document.create``, its upload) keeps the key of 1, 2 or
17
17
  API creates it instead (``docx._public_create``). A token goes only to its own
18
18
  document's routes.
19
19
 
20
+ An Athena runtime credential (a computer's, a session VM's or a notebook
21
+ kernel's ``ATHENA_API_KEY``: ``athcomp_``, ``athsvm_``, ``athnb_``) is never
22
+ sent to DOCX Studio, which takes none, nor to Athena's older creation routes
23
+ outside its public API: a call that would send one (another document's routes,
24
+ an Athena without the studio-token route, no ``ATHENA_API_URL``, a create or an
25
+ upload Athena's public API cannot take) refuses before any request, naming what
26
+ to set (:func:`is_runtime_credential`).
27
+
20
28
  A token is minted once per (agora, key, asset, access) for the whole process,
21
29
  again 90 seconds before it expires, and once more when the studio answers 401.
22
30
  A read mints a read-only token (``{"access": "view"}``: the version check, the
@@ -70,6 +78,16 @@ PUBLIC_API_PREFIX = "/api/v0"
70
78
  VIEW = "view"
71
79
  EDIT = "edit"
72
80
 
81
+ #: How the credentials Athena mints for a runtime begin: a computer's, a session
82
+ #: VM's and a notebook kernel's own ``ATHENA_API_KEY``. Only Athena's public API
83
+ #: takes one; a studio never does.
84
+ RUNTIME_CREDENTIAL_PREFIXES = ("athcomp_", "athsvm_", "athnb_")
85
+
86
+
87
+ def is_runtime_credential(key: str | None) -> bool:
88
+ """Whether ``key`` is a credential Athena minted for a runtime, which no studio takes."""
89
+ return bool(key) and str(key).startswith(RUNTIME_CREDENTIAL_PREFIXES)
90
+
73
91
  #: Minted again this long before Athena's ``expires_at_ms``.
74
92
  REFRESH_BEFORE_EXPIRY_SECONDS = 90.0
75
93
  #: The longest a token is held, whatever the local clock says (Athena's lifetime).
@@ -54,6 +54,29 @@ def _resolve_api_key(api_key: str | None) -> str | None:
54
54
  return api_key or os.environ.get(_API_KEY_ENV) or os.environ.get("ATHENA_API_KEY")
55
55
 
56
56
 
57
+ def _refuse_runtime_credential(*, key: str | None, action: str) -> None:
58
+ """Refuse, before any request, to send an Athena runtime credential where
59
+ Athena's public API could not take the call.
60
+
61
+ A computer's, session VM's or notebook's own ``ATHENA_API_KEY`` is accepted
62
+ only by Athena's public API (``/api/v0``). Reaching this point means that
63
+ API could not take the create (no ``ATHENA_API_URL``, or an Athena older
64
+ than its creation routes), and DOCX Studio and agora's older routes refuse
65
+ the credential.
66
+ """
67
+ from docx._asset_token import is_runtime_credential
68
+
69
+ if is_runtime_credential(key):
70
+ raise AuthenticationError(
71
+ f"Cannot {action}: ATHENA_API_KEY here is an Athena runtime credential (a "
72
+ "computer's, session's or notebook's own key), which only Athena's public "
73
+ "API accepts, and that API could not take this call (ATHENA_API_URL is "
74
+ "unset, or that Athena predates it). Set ATHENA_API_URL, or set "
75
+ "ATHENA_DOCX_API_KEY (or pass api_key=) to an Athena API key DOCX Studio "
76
+ "accepts.",
77
+ )
78
+
79
+
57
80
  def _derive_agora_base_url(docx_base_url: str) -> str | None:
58
81
  """Best-effort derive an Agora base URL from a docx-studio base URL.
59
82
 
@@ -153,6 +176,7 @@ def create_empty_document(
153
176
  "Pass api_key= to Document.create() or set the env var "
154
177
  "(or set ATHENA_API_KEY as a fallback).",
155
178
  )
179
+ _refuse_runtime_credential(key=resolved_key, action="create the document on DOCX Studio")
156
180
 
157
181
  url: str = resolved_base.rstrip("/") + "/docs/empty"
158
182
  # The document is born as its creator's: its first write is signed as the
@@ -406,6 +430,7 @@ def upload_document(
406
430
  "Pass api_key= to Document.create() or set the env var "
407
431
  "(or set ATHENA_API_KEY as a fallback).",
408
432
  )
433
+ _refuse_runtime_credential(key=resolved_key, action="upload the document through agora")
409
434
 
410
435
  if not os.path.exists(docx_path):
411
436
  raise SessionError(f"DOCX file not found: {docx_path}")
@@ -51,6 +51,7 @@ from docx._asset_token import (
51
51
  SigningUnavailable,
52
52
  StudioToken,
53
53
  TokenMinter,
54
+ is_runtime_credential,
54
55
  )
55
56
  from docx._batching import call_abandoned, note_progress
56
57
  from docx._buffer import CommandBuffer, keep_reported_message
@@ -1155,6 +1156,15 @@ class HttpClient:
1155
1156
  is sent once more with a newly minted one: docx-studio refused it before
1156
1157
  acting on it, so nothing is applied twice."""
1157
1158
  bearer, grant = self._bearer(asset_id=asset_id, access=access)
1159
+ if grant is None and is_runtime_credential(bearer):
1160
+ raise AuthenticationError(
1161
+ f"DOCX Studio takes no Athena runtime credential, and this client "
1162
+ f"carries no token of {asset_id}. ATHENA_API_KEY here is a computer's, "
1163
+ "session's or notebook's own key, which only Athena's public API "
1164
+ "accepts. Open the document by its asset id (asset_...) with "
1165
+ "ATHENA_API_URL set, or set ATHENA_DOCX_API_KEY (or pass api_key=) to "
1166
+ "an Athena API key DOCX Studio accepts."
1167
+ )
1158
1168
  try:
1159
1169
  return send(bearer)
1160
1170
  except AuthenticationError as exc:
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "athena-python-docx"
7
- version = "0.45.0"
7
+ version = "0.45.1"
8
8
  description = "Drop-in replacement for python-docx that connects to Athena's DOCX Studio collaborative document stack"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -38,6 +38,8 @@ ASSET = "asset_8eaf4c95-0d4e-4f4e-9a8f-0b1c2d3e4f50"
38
38
  OTHER = "asset_1c2d3e4f-0d4e-4f4e-9a8f-0b1c2d3e4f51"
39
39
  # Shaped like the scoped credentials Athena puts in ATHENA_API_KEY.
40
40
  SCOPED_KEY = "athcomp_scoped-credential"
41
+ # A person's Athena API key, which DOCX Studio takes as it is.
42
+ PERSON_KEY = "person-api-key"
41
43
  MINT_URL = f"{AGORA}/api/v0/assets/{ASSET}/studio-token"
42
44
 
43
45
 
@@ -231,12 +233,34 @@ def test_without_athena_api_url_athena_api_key_is_the_bearer_as_before(
231
233
  world: _World, monkeypatch: pytest.MonkeyPatch
232
234
  ) -> None:
233
235
  monkeypatch.delenv("ATHENA_API_URL")
236
+ monkeypatch.setenv("ATHENA_API_KEY", PERSON_KEY)
234
237
  world.studio.append(_applied())
235
238
 
236
239
  _batch(_client())
237
240
 
238
241
  assert world.mint_calls() == []
239
- assert [call.bearer for call in world.studio_calls()] == [SCOPED_KEY]
242
+ assert [call.bearer for call in world.studio_calls()] == [PERSON_KEY]
243
+
244
+
245
+ @pytest.mark.parametrize("prefix", ["athcomp_", "athsvm_", "athnb_"])
246
+ def test_a_runtime_credential_never_goes_to_the_studio(
247
+ world: _World, monkeypatch: pytest.MonkeyPatch, prefix: str
248
+ ) -> None:
249
+ # Without ATHENA_API_URL nothing mints a token, and DOCX Studio takes no
250
+ # computer's, session VM's or notebook's own key: refused before sending.
251
+ monkeypatch.delenv("ATHENA_API_URL")
252
+ monkeypatch.setenv("ATHENA_API_KEY", f"{prefix}credential")
253
+ client = _client()
254
+
255
+ with pytest.raises(AuthenticationError, match="takes no Athena runtime credential") as caught:
256
+ _batch(client)
257
+ with pytest.raises(AuthenticationError, match="takes no Athena runtime credential"):
258
+ client.get_layout(ASSET)
259
+ with pytest.raises(AuthenticationError, match="takes no Athena runtime credential"):
260
+ _batch(_client(api_key=f"{prefix}credential"))
261
+
262
+ assert "ATHENA_DOCX_API_KEY" in str(caught.value)
263
+ assert world.calls == []
240
264
 
241
265
 
242
266
  @pytest.mark.parametrize(
@@ -284,15 +308,34 @@ def test_a_token_goes_only_to_its_own_documents_routes(world: _World) -> None:
284
308
  client = _client()
285
309
 
286
310
  _batch(client)
287
- _batch(client, OTHER)
311
+ # Another document gets no token, and the scoped key is never sent to the
312
+ # studio in its place.
313
+ with pytest.raises(AuthenticationError, match="takes no Athena runtime credential"):
314
+ _batch(client, OTHER)
288
315
 
289
316
  assert [(call.url, call.bearer) for call in world.studio_calls()] == [
290
317
  (f"{STUDIO}/docs/{ASSET}/commands", f"aat_{ASSET}_edit_1"),
291
- (f"{STUDIO}/docs/{OTHER}/commands", SCOPED_KEY),
292
318
  ]
293
319
  assert len(world.mint_calls()) == 1
294
320
 
295
321
 
322
+ def test_with_a_person_key_another_documents_routes_keep_the_key(
323
+ world: _World, monkeypatch: pytest.MonkeyPatch
324
+ ) -> None:
325
+ monkeypatch.setenv("ATHENA_API_KEY", PERSON_KEY)
326
+ world.mints.append(world.mint_ok())
327
+ world.studio.append(_applied())
328
+ client = _client()
329
+
330
+ _batch(client)
331
+ _batch(client, OTHER)
332
+
333
+ assert [(call.url, call.bearer) for call in world.studio_calls()] == [
334
+ (f"{STUDIO}/docs/{ASSET}/commands", f"aat_{ASSET}_edit_1"),
335
+ (f"{STUDIO}/docs/{OTHER}/commands", PERSON_KEY),
336
+ ]
337
+
338
+
296
339
  # --- read and write access -----------------------------------------------------
297
340
 
298
341
 
@@ -452,7 +495,10 @@ def test_a_503_falls_back_to_a_studio_key_set_since(
452
495
  assert len(world.mint_calls()) == 1
453
496
 
454
497
 
455
- def test_an_athena_without_the_mint_route_gets_athena_api_key_as_before(world: _World) -> None:
498
+ def test_an_athena_without_the_mint_route_gets_athena_api_key_as_before(
499
+ world: _World, monkeypatch: pytest.MonkeyPatch
500
+ ) -> None:
501
+ monkeypatch.setenv("ATHENA_API_KEY", PERSON_KEY)
456
502
  # An Athena older than the route: FastAPI's bare 404 for a path no route matches.
457
503
  world.mints.append(_response(404, {"detail": "Not Found"}))
458
504
  world.studio.extend([_response(200, {"pageCount": 1, "pages": []}), _applied()])
@@ -462,7 +508,19 @@ def test_an_athena_without_the_mint_route_gets_athena_api_key_as_before(world: _
462
508
  _batch(client)
463
509
 
464
510
  assert len(world.mint_calls()) == 1
465
- assert [call.bearer for call in world.studio_calls()] == [SCOPED_KEY, SCOPED_KEY]
511
+ assert [call.bearer for call in world.studio_calls()] == [PERSON_KEY, PERSON_KEY]
512
+
513
+
514
+ def test_an_athena_without_the_mint_route_never_gets_the_scoped_key_sent_on(
515
+ world: _World,
516
+ ) -> None:
517
+ world.mints.append(_response(404, {"detail": "Not Found"}))
518
+ client = _client()
519
+
520
+ with pytest.raises(AuthenticationError, match="takes no Athena runtime credential"):
521
+ client.get_layout(ASSET)
522
+
523
+ assert world.studio_calls() == []
466
524
 
467
525
 
468
526
  def test_athenas_own_asset_not_found_stays_final(world: _World) -> None:
@@ -31,6 +31,8 @@ STUDIO = "https://docx.example.com"
31
31
  AGORA = "https://agora.example.com"
32
32
  ASSET = "asset_8eaf4c95-0d4e-4f4e-9a8f-0b1c2d3e4f50"
33
33
  SCOPED_KEY = "athcomp_scoped-credential"
34
+ # A person's Athena API key, which DOCX Studio takes as it is.
35
+ PERSON_KEY = "person-api-key"
34
36
  CREATE_URL = f"{AGORA}/api/v0/assets/create"
35
37
  FROM_FILE_URL = f"{AGORA}/api/v0/assets/create-from-file"
36
38
  CREATED = {"asset_id": ASSET, "title": "Memo", "workspace_id": "ws_1"}
@@ -187,7 +189,7 @@ def test_the_sandbox_workspace_and_the_agent_run_are_named(
187
189
  [
188
190
  ({"ATHENA_DOCX_API_KEY": "studio-key"}, None, "studio-key"),
189
191
  ({}, "explicit-key", "explicit-key"),
190
- ({"ATHENA_API_URL": None}, None, SCOPED_KEY),
192
+ ({"ATHENA_API_URL": None, "ATHENA_API_KEY": PERSON_KEY}, None, PERSON_KEY),
191
193
  ],
192
194
  )
193
195
  def test_a_studio_key_an_explicit_key_or_no_api_url_keep_docx_studio(
@@ -216,7 +218,53 @@ def test_a_studio_key_an_explicit_key_or_no_api_url_keep_docx_studio(
216
218
  assert sent[0].get_header("Authorization") == f"Bearer {expected_bearer}"
217
219
 
218
220
 
219
- def test_an_athena_without_the_word_document_type_gets_docx_studio(athena: _Athena) -> None:
221
+ @pytest.mark.parametrize("prefix", ["athcomp_", "athsvm_", "athnb_"])
222
+ def test_without_athena_api_url_a_runtime_credential_never_goes_to_docx_studio(
223
+ athena: _Athena, monkeypatch: pytest.MonkeyPatch, prefix: str, docx_file: Path
224
+ ) -> None:
225
+ monkeypatch.delenv("ATHENA_API_URL")
226
+ monkeypatch.setenv("ATHENA_API_KEY", f"{prefix}credential")
227
+
228
+ with patch("docx._http.urllib.request.urlopen") as urlopen:
229
+ with pytest.raises(AuthenticationError, match="Athena runtime credential"):
230
+ create_empty_document(name="Memo")
231
+ with pytest.raises(AuthenticationError, match="Athena runtime credential"):
232
+ upload_document(docx_path=str(docx_file), agora_base_url=AGORA)
233
+
234
+ urlopen.assert_not_called()
235
+ assert athena.calls == []
236
+
237
+
238
+ def test_an_athena_without_the_word_document_type_never_gets_a_runtime_credential(
239
+ athena: _Athena,
240
+ ) -> None:
241
+ athena.answers.append(
242
+ _response(
243
+ 422,
244
+ {
245
+ "detail": [
246
+ {
247
+ "type": "value_error",
248
+ "loc": ["body", "asset_type"],
249
+ "msg": "Value error, Unsupported asset type: 'word_document'.",
250
+ }
251
+ ]
252
+ },
253
+ )
254
+ )
255
+
256
+ with patch("docx._http.urllib.request.urlopen") as urlopen:
257
+ with pytest.raises(AuthenticationError, match="Athena runtime credential"):
258
+ create_empty_document(name="Memo")
259
+
260
+ urlopen.assert_not_called()
261
+ assert len(athena.calls) == 1
262
+
263
+
264
+ def test_an_athena_without_the_word_document_type_gets_docx_studio(
265
+ athena: _Athena, monkeypatch: pytest.MonkeyPatch
266
+ ) -> None:
267
+ monkeypatch.setenv("ATHENA_API_KEY", PERSON_KEY)
220
268
  athena.answers.append(
221
269
  _response(
222
270
  422,
@@ -242,7 +290,7 @@ def test_an_athena_without_the_word_document_type_gets_docx_studio(athena: _Athe
242
290
 
243
291
  assert created["asset_id"] == ASSET
244
292
  assert [request.full_url for request in sent] == [f"{STUDIO}/docs/empty"]
245
- assert sent[0].get_header("Authorization") == f"Bearer {SCOPED_KEY}"
293
+ assert sent[0].get_header("Authorization") == f"Bearer {PERSON_KEY}"
246
294
 
247
295
 
248
296
  @pytest.mark.parametrize(
@@ -324,10 +372,25 @@ def test_document_create_from_a_file_goes_through_athena(
324
372
  assert athena.calls[0].params == {"title": "Memo"}
325
373
 
326
374
 
375
+ def test_an_athena_without_create_from_file_never_gets_a_runtime_credential(
376
+ athena: _Athena,
377
+ docx_file: Path,
378
+ ) -> None:
379
+ athena.answers.append(_response(405, {"detail": "Method Not Allowed"}))
380
+
381
+ with patch("docx._http.urllib.request.urlopen") as urlopen:
382
+ with pytest.raises(AuthenticationError, match="Athena runtime credential"):
383
+ upload_document(docx_path=str(docx_file), agora_base_url=AGORA)
384
+
385
+ urlopen.assert_not_called()
386
+
387
+
327
388
  def test_an_athena_without_create_from_file_gets_the_agora_upload(
328
389
  athena: _Athena,
329
390
  docx_file: Path,
391
+ monkeypatch: pytest.MonkeyPatch,
330
392
  ) -> None:
393
+ monkeypatch.setenv("ATHENA_API_KEY", PERSON_KEY)
331
394
  # /assets/{asset_id} takes GET and PATCH only, so an older Athena answers 405.
332
395
  athena.answers.append(_response(405, {"detail": "Method Not Allowed"}))
333
396
  sent: list[Any] = []
@@ -345,7 +408,7 @@ def test_an_athena_without_create_from_file_gets_the_agora_upload(
345
408
  f"{AGORA}/api/docx-studio/assets",
346
409
  f"{AGORA}/api/docx-studio/assets/{ASSET}/import",
347
410
  ]
348
- assert sent[0].get_header("Authorization") == f"Bearer {SCOPED_KEY}"
411
+ assert sent[0].get_header("Authorization") == f"Bearer {PERSON_KEY}"
349
412
 
350
413
 
351
414
  def test_a_file_athena_cannot_import_raises(athena: _Athena, docx_file: Path) -> None:
@@ -8,7 +8,7 @@ resolution-markers = [
8
8
 
9
9
  [[package]]
10
10
  name = "athena-python-docx"
11
- version = "0.45.0"
11
+ version = "0.45.1"
12
12
  source = { editable = "." }
13
13
  dependencies = [
14
14
  { name = "athena-references" },