athena-python-docx 0.12.0__tar.gz → 0.14.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.
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/CLAUDE.md +145 -15
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/PKG-INFO +1 -1
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/__init__.py +1 -1
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/_http_doc.py +68 -1
- athena_python_docx-0.14.0/docx/_postproc.py +2762 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/client.py +8 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/commands.py +96 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/document.py +138 -26
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/oxml/__init__.py +84 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/section.py +340 -62
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/table.py +412 -17
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/text/paragraph.py +399 -29
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/text/parfmt.py +46 -6
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/text/run.py +226 -17
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/pyproject.toml +1 -1
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/fake_session.py +25 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/22_table_cell_paragraphs_iteration.json +3 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/35_full_report.json +0 -3
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/61_cell_paragraph_with_runs.json +8 -2
- athena_python_docx-0.12.0/tests/fidelity/op_snapshots/ex13_cell_with_10_paragraphs.json → athena_python_docx-0.14.0/tests/fidelity/op_snapshots/62_many_cell_paragraphs.json +4 -15
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/65_20x20_table_formatted.json +1 -201
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/69_newsletter.json +12 -1
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/90_cell_add_paragraph_styled.json +3 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/ex10_complex_bom.json +0 -15
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/ex11_banded_rows_formatting.json +0 -40
- athena_python_docx-0.14.0/tests/fidelity/op_snapshots/ex13_cell_with_10_paragraphs.json +94 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/ex14_styled_report_table.json +1 -16
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/ex20_kitchen_sink_v2.json +0 -20
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/mega01_book_chapter.json +18 -15
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/mega02_research_proposal.json +0 -3
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/mega03_financial_statement.json +1 -8
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/mega05_user_manual.json +0 -8
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/mega07_budget_spreadsheet.json +1 -11
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/mega09_signed_contract.json +0 -2
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/mega10_api_documentation.json +0 -16
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/rw10_colored_grid_table.json +1 -17
- athena_python_docx-0.14.0/tests/fidelity/op_snapshots/rw11_header_text.json +6 -0
- athena_python_docx-0.14.0/tests/fidelity/op_snapshots/rw12_first_page_footer.json +10 -0
- athena_python_docx-0.14.0/tests/fidelity/op_snapshots/rw13_even_page_header.json +9 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/parity/reports/GAP_ANALYSIS.md +1 -1
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/parity/reports/gap_report.json +39 -3
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/parity/snapshots/athena_latest.json +3278 -1543
- athena_python_docx-0.14.0/tests/test_add_section_extract_items.py +137 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_athena_extensions_registry.py +1 -0
- athena_python_docx-0.14.0/tests/test_cell_inner_add_hyperlink_stash.py +110 -0
- athena_python_docx-0.14.0/tests/test_cell_inner_add_run_via_cell_insert.py +302 -0
- athena_python_docx-0.14.0/tests/test_cell_inner_format_stash.py +523 -0
- athena_python_docx-0.14.0/tests/test_cell_inner_run_format_stash.py +283 -0
- athena_python_docx-0.14.0/tests/test_cell_inner_run_guard.py +236 -0
- athena_python_docx-0.14.0/tests/test_find_replace_session_open.py +105 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_phase_b_headers_footers.py +116 -28
- athena_python_docx-0.14.0/tests/test_postproc_cell_format_rewrite.py +1548 -0
- athena_python_docx-0.14.0/tests/test_postproc_cell_run_format_rewrite.py +604 -0
- athena_python_docx-0.14.0/tests/test_postproc_ref_restore.py +489 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_header_footer.py +6 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_section_dimensions.py +72 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_wire_contract.py +31 -0
- athena_python_docx-0.14.0/tests/test_xml_attr_guard.py +178 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/uv.lock +1 -1
- athena_python_docx-0.12.0/tests/fidelity/op_snapshots/62_many_cell_paragraphs.json +0 -38
- athena_python_docx-0.12.0/tests/fidelity/op_snapshots/rw11_header_text.json +0 -4
- athena_python_docx-0.12.0/tests/fidelity/op_snapshots/rw12_first_page_footer.json +0 -6
- athena_python_docx-0.12.0/tests/fidelity/op_snapshots/rw13_even_page_header.json +0 -5
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/.gitignore +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/README.md +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/_athena_extension.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/_batching.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/_buffer.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/_http.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/_image_utils.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/_ptc.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/_table_styles.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/api.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/bookmarks.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/charts.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/comments.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/enum/__init__.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/enum/section.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/enum/style.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/enum/table.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/enum/text.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/errors.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/exceptions.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/fields.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/footnotes.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/math.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/opc/__init__.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/opc/coreprops.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/revisions.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/sdt.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/session.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/settings.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/shape.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/shared.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/styles/__init__.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/styles/style.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/styles/styles.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/text/__init__.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/text/font.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/text/hyperlink.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/text/pagebreak.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/text/tabstops.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/toc.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/docx/typing.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/scripts/publish.sh +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/scripts/release.sh +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/scripts/round_trip_smoke.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/scripts/smoke_test_block_not_found.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/__init__.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/conftest.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/METHODOLOGY.md +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/README.md +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/__init__.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/ab_probe_cases.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/ab_probe_runner.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/auto_gen_cases.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/binary_round_trip.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/cases.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/complex_cases.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/coverage_report.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/extract.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/extreme_cases.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/firm_templates/README.md +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/firm_templates/__init__.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/firm_templates/_runner.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/firm_templates/extractor.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/firm_templates/test_pw_corpus.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/firm_templates/test_pw_research_digest.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/local_runner.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/mega_cases.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshot.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/01_basic_paragraph.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/02_multiple_headings.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/03_runs_with_formatting.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/04_font_name_and_size.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/05_font_color_rgb.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/06_font_character_properties.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/07_font_subscript_superscript.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/08_font_highlight.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/09_paragraph_alignment.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/100_table_negative_indexing.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/101_table_cells_flat_iteration.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/102_text_with_embedded_special_chars.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/104_core_properties_datetime.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/105_default_one_section.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/106_heading_paragraph_format.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/107_varying_row_heights.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/10_paragraph_indents.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/11_paragraph_spacing.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/12_paragraph_keep_options.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/13_paragraph_tab_stops.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/14_run_add_tab_and_break.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/15_run_add_break_page.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/16_paragraph_clear_and_insert_before.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/17_table_basic.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/18_table_cell_text.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/19_table_row_column_sizing.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/20_table_cell_vertical_alignment.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/21_table_alignment_and_autofit.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/24_table_add_row_column.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/25_table_merge_cells.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/26_section_page_setup.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/27_section_margins.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/28_section_add_new.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/29_section_headers_linked.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/30_styles_iteration.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/31_styles_lookup_and_default.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/32_styles_add_paragraph_style.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/33_core_properties_set_and_get.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/34_inline_shapes_iterate_empty.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/36_replace_text_in_paragraph.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/37_iterate_runs_and_format_all_bold.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/38_font_all_properties.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/39_large_body_100_paragraphs.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/40_large_table_10x10.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/41_unicode_and_emoji.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/42_very_long_paragraph.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/43_paragraph_text_round_trip.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/44_paragraph_alignment_round_trip.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/45_cell_text_round_trip.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/46_run_text_setter_round_trip.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/47_font_size_round_trip.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/48_font_color_round_trip.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/49_resume_layout.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/50_multi_section_doc.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/52_iterate_everything.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/53_apply_style_to_paragraphs.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/54_empty_everything.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/55_single_character_runs.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/56_everything_in_one.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/57_runs_after_multiple_text_appends.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/58_modify_runs_in_place.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/59_indent_round_trip.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/60_space_round_trip.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/63_table_style_round_trip.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/64_many_sections.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/66_toc_like_structure.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/67_paragraph_insert_before_chain.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/68_invoice.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/70_add_and_iterate_back.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/71_academic_paper.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/72_legal_contract.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/73_form_with_many_tables.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/74_paragraph_with_10_runs.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/75_paragraph_negative_first_line_indent.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/76_rgbcolor_from_string.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/77_length_unit_conversions.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/78_paragraph_copy_style.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/79_bulk_cell_formatting.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/80_apply_style_after_add_run.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/81_multi_page_with_breaks.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/82_add_text_on_existing_run.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/83_clear_then_repopulate_paragraph.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/84_table_reread_row_count.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/85_header_footer_access.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/86_font_read_unset_returns_none.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/87_500_paragraph_doc.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/88_mixed_content_iteration.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/89_alignment_clear_via_none.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/91_many_small_tables.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/92_margins_every_section.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/93_font_bool_reads_after_set.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/94_page_break_before_paragraph.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/95_paragraph_hyperlinks_empty.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/96_paragraph_contains_page_break.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/97_document_styles_by_key.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/98_style_contains_check.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/99_run_add_picture_from_bytes.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/ex02_unicode_everywhere.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/ex03_1000_paragraphs.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/ex04_50x50_table.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/ex05_long_text_in_cell.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/ex06_hundred_tiny_runs.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/ex07_every_font_boolean.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/ex08_many_continuous_sections.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/ex09_many_tab_stops.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/ex12_section_reconfigure.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/ex15_paragraph_all_format_props.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/ex16_runs_interleaved_with_breaks.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/ex17_all_break_kinds.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/ex18_read_back_large_doc.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/ex19_mutate_all_runs.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/mega04_recipe_card.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/mega06_complex_newsletter.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/mega08_product_catalog.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/rw01_official_quickstart.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/rw02_paragraph_style_list.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/rw03_character_formatting.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/rw04_section_page_setup.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/rw05_toc_pattern.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/rw06_meeting_minutes.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/rw07_dense_formatting_demo.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/rw08_table_merged_header.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/rw09_bulk_run_iteration.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/op_snapshots/rw15_paragraph_style_instance.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/ours_spec.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/parity_crawl.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/parity_diff.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/real_world_cases.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/round_trip_tests.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/runner.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/stock_spec.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/fidelity/test_e2e_against_staging.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/parity/README.md +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/parity/__init__.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/parity/baseline_gaps.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/parity/compare.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/parity/intentional_deviations.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/parity/introspect.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/parity/run_parity.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/parity/snapshots/upstream_python_docx_1.2.0.json +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/parity/test_parity_gap.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_athena_extensions_contract.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_batching_perf.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_block_not_found_error.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_buffer.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_cell_add_paragraph_wire_shape.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_cell_add_table_not_supported.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_cell_text_plain_fastpath.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_collapsed_range_format.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_command_dataclasses.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_commands.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_comments.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_document_asset_id_property.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_document_create.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_document_create_from_template.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_document_factory_validation.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_e2e_partial_failure_cascade.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_http_transport.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_hyperlink_coalescing.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_insert_deferred.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_iter_inner_content.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_list_styles.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_merged_cell_secondary_slot.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_merged_cells.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_oxml_shim.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_paragraph_text_len_cache.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_parity_misc.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_parity_round2.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_partial_failure_cascade.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_phase_a_behavior.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_phase_c_tables.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_pr19766_review_fixes.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_ptc.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_python_docx_api_parity.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_revisions.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_add_paragraph_style.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_add_picture.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_add_run.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_cell_add_paragraph.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_comments_add_comment.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_comments_get.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_document_audit.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_document_element.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_enum_section.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_font_audit.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_hyperlink.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_inline_shape.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_insert_paragraph_before.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_misc.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_paragraph_strict.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_paragraph_style.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_paragraph_style_strict.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_parfmt.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_row_col_cell.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_run_add_break.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_run_bool_setters.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_run_style.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_run_style_strict.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_run_text.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_run_underline.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_section_audit.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_section_onoff.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_settings.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_shared_audit.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_style.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_styles.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_table_audit.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_table_cell.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_table_dimensions.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_silent_stub_table_layout.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_smoke_integration.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_style_acceptance.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_style_font.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_style_setters_contract.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_table_set_cell_perf.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_table_style_id_resolution.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_temporarily_unavailable.py +0 -0
- {athena_python_docx-0.12.0 → athena_python_docx-0.14.0}/tests/test_zod_wire_contract.py +0 -0
|
@@ -355,11 +355,25 @@ Issue numbers reference `python-openxml/python-docx`.
|
|
|
355
355
|
left by ``Document.save(path)`` raising
|
|
356
356
|
``LocalSaveTargetNotSupportedError`` in this SDK: parity test
|
|
357
357
|
harnesses and CI workflows need a programmatic .docx export to
|
|
358
|
-
diff against ``python-docx`` output
|
|
359
|
-
Olympus
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
358
|
+
diff against ``python-docx`` output that doesn't require a
|
|
359
|
+
human-driven Olympus UI action. Routes through ``ExportDocx`` →
|
|
360
|
+
apps/api → SuperDoc's official ``doc.save({out: <tmp>})`` (the
|
|
361
|
+
recommended backend export path per the SuperDoc team — Document
|
|
362
|
+
API, not the browser-side ``editor.exportDocx`` shim). apps/api
|
|
363
|
+
writes the session state to a temp ``.docx``, reads bytes back,
|
|
364
|
+
base64-encodes for the wire, and unlinks the temp in a
|
|
365
|
+
``finally`` block. The SDK decodes and writes to ``path``.
|
|
366
|
+
``include_revisions=True`` raises ``DocxError`` pre-flight:
|
|
367
|
+
``@superdoc-dev/sdk@1.8.1``'s ``DocSaveParams`` has no
|
|
368
|
+
``includeRevisions`` field, so honoring the flag isn't possible
|
|
369
|
+
through ``doc.save({out})``.
|
|
370
|
+
|
|
371
|
+
Template seeding: ``Document.create()`` (no ``docx=``) already
|
|
372
|
+
produces an exportable asset because ``POST /docs/empty`` seeds
|
|
373
|
+
from the default Athena template, so ``export_docx`` works
|
|
374
|
+
out-of-the-box. Pass ``docx='template.docx'`` only when you need
|
|
375
|
+
brand-specific scaffolding (styles, numbering, headers, rels,
|
|
376
|
+
media) baked in — not as a workaround for empty rooms.
|
|
363
377
|
|
|
364
378
|
### 0.11.4 behavior fixes for cell-inner paragraphs
|
|
365
379
|
|
|
@@ -380,16 +394,101 @@ instead of forwarding the broken command. The format op is dropped,
|
|
|
380
394
|
the surrounding batch survives, and the workaround pointer (
|
|
381
395
|
``cell.text = 'value'`` to materialize, then ``cell.paragraphs[0]``
|
|
382
396
|
for the addressable proxy) is in the warning text. Tracked at
|
|
383
|
-
``docx-studio/SUPERDOC_UPSTREAM_REQUESTS.md`` § 13.
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
the
|
|
397
|
+
``docx-studio/SUPERDOC_UPSTREAM_REQUESTS.md`` § 13.
|
|
398
|
+
|
|
399
|
+
**0.11.5 follow-up: post-export OOXML rewrite.** When the parent
|
|
400
|
+
table was created via ``Document.add_table`` in this session
|
|
401
|
+
(``Table._doc_index`` set), the format setters also stash the
|
|
402
|
+
OOXML-shaped props (``alignment``, ``style``, ``left_twips``,
|
|
403
|
+
``before_twips``, etc.) on ``Session._post_export_ops`` (a
|
|
404
|
+
:class:`docx._postproc.PostExportOps` collector). ``Document.export_docx``
|
|
405
|
+
applies them via an OOXML rewrite of ``word/document.xml`` before
|
|
406
|
+
returning bytes — so the **exported ``.docx`` carries the formatting
|
|
407
|
+
the agent asked for** even though SuperDoc never accepted the wire
|
|
408
|
+
op. Live-session state is unchanged (Olympus collaborators don't
|
|
409
|
+
see the formatting until export). Template-seeded tables where
|
|
410
|
+
``_doc_index`` is ``None`` still warn-and-skip (no stable OOXML
|
|
411
|
+
address). Behavior pinned by ``tests/test_cell_inner_format_stash.py``
|
|
412
|
+
+ ``tests/test_postproc_cell_format_rewrite.py``.
|
|
413
|
+
|
|
414
|
+
**0.13.0: cell-inner ``Paragraph.add_run(text)`` now materializes the
|
|
415
|
+
text live (not just at export).** The agent's standard ``fill_cell``
|
|
416
|
+
helper pattern —
|
|
417
|
+
|
|
418
|
+
.. code-block:: python
|
|
419
|
+
|
|
420
|
+
p = cell.add_paragraph("")
|
|
421
|
+
r = p.add_run("Hello world")
|
|
422
|
+
r.bold = True
|
|
423
|
+
|
|
424
|
+
— used to silently drop both the ``Hello world`` text AND the bold
|
|
425
|
+
format because ``Paragraph.add_run`` on a cell-inner paragraph
|
|
426
|
+
returned a stub Run with collapsed range, and SuperDoc 1.8.1
|
|
427
|
+
rejected the wire-level ``doc.insert`` against the cell-inner
|
|
428
|
+
paragraph's blockId with ``Block <id> not found``. The 0.13.0 fix
|
|
429
|
+
adds a ``_cell`` back-reference to every cell-inner Paragraph proxy
|
|
430
|
+
(set by ``_Cell.add_paragraph`` / ``_Cell.paragraphs`` /
|
|
431
|
+
``_Cell.iter_inner_content``). When ``Paragraph.add_run(text)`` is
|
|
432
|
+
called on a cell-inner paragraph with non-empty text AND the
|
|
433
|
+
back-ref is set, the SDK ships ``doc.insert(target=cell,
|
|
434
|
+
placement="insideEnd", content=paragraph-fragment-with-text)``
|
|
435
|
+
instead — the SAME wire path ``_Cell.add_paragraph(text)`` already
|
|
436
|
+
uses. SuperDoc collapses the new paragraph into the cell's single
|
|
437
|
+
template paragraph as an inline run; the exported DOCX expands each
|
|
438
|
+
non-empty inline run into its own ``<w:p>``. The returned Run is
|
|
439
|
+
real (non-collapsed range) and carries the new exported-paragraph
|
|
440
|
+
OOXML address, so subsequent ``r.bold = True``-style setters stash
|
|
441
|
+
to the correct cell location for the post-export OOXML rewrite.
|
|
442
|
+
|
|
443
|
+
Fallback: empty text (``add_run("")``) and paragraphs without a
|
|
444
|
+
``_cell`` back-ref (constructed outside the ``_Cell`` paths) still
|
|
445
|
+
hit the warn-and-stub fallback so the surrounding batch survives.
|
|
446
|
+
Wire failures inside the materialization path also fall back
|
|
447
|
+
silently — one ``add_run`` failure should never cascade-fail a
|
|
448
|
+
whole agent script.
|
|
449
|
+
|
|
450
|
+
**0.13.0: cell-inner per-run formatting + cell-inner ``add_hyperlink``
|
|
451
|
+
land at export time.** When a cell-inner ``Run`` has a stable OOXML
|
|
452
|
+
address (parent paragraph came from a ``Document.add_table`` table —
|
|
453
|
+
same ``_doc_index`` tracking as the cell-paragraph format stash),
|
|
454
|
+
every per-run setter (``run.bold = True``, ``run.italic``,
|
|
455
|
+
``run.font.size = Pt(11)``, ``run.font.color.rgb = …``,
|
|
456
|
+
``run.font.name``, ``run.font.highlight_color``,
|
|
457
|
+
``run.font.strike``, ``run.underline``, ``run.style``) stashes the
|
|
458
|
+
prop on ``Session._post_export_ops._cell_run_format_ops`` instead
|
|
459
|
+
of dropping it silently at the wire layer. The post-export rewrite
|
|
460
|
+
walks every ``<w:r>`` in the targeted cell paragraph and injects
|
|
461
|
+
``<w:rPr>`` carrying the props — so ``cell.text = "Total"; cell.
|
|
462
|
+
paragraphs[0].runs[0].bold = True`` produces a bold ``Total`` in
|
|
463
|
+
the exported ``.docx`` even though SuperDoc never committed the
|
|
464
|
+
format wire op. Apply-to-all-runs semantics: the rewrite targets
|
|
465
|
+
every ``<w:r>`` in the cell paragraph, because run-level addressing
|
|
466
|
+
inside a cell isn't recoverable after SuperDoc collapses cell-
|
|
467
|
+
inner inserts. Multi-run cell paragraphs with partial-run
|
|
468
|
+
formatting are a documented limitation — agents should use one
|
|
469
|
+
run per format intent.
|
|
470
|
+
|
|
471
|
+
Same export-time machinery rescues ``paragraph.add_hyperlink`` on a
|
|
472
|
+
cell-inner paragraph. Pre-0.13.0 the call dropped both the URL AND
|
|
473
|
+
the visible link text (the SDK returned a stub ``Hyperlink`` with
|
|
474
|
+
an empty range because ``Insert`` on a cell-inner paragraph also
|
|
475
|
+
fails with ``BlockNotFoundError``). As of 0.13.0 the URL + visible
|
|
476
|
+
text + optional tooltip + optional bookmark fragment are stashed
|
|
477
|
+
on ``Session._post_export_ops._cell_hyperlink_ops`` and the post-
|
|
478
|
+
export OOXML rewrite appends a real ``<w:hyperlink>`` to the cell
|
|
479
|
+
paragraph plus a matching ``Relationship`` entry in
|
|
480
|
+
``word/_rels/document.xml.rels``. External URLs use ``r:id`` and
|
|
481
|
+
get the document's built-in ``Hyperlink`` character style for the
|
|
482
|
+
standard blue + underline appearance; internal bookmark anchors
|
|
483
|
+
(``fragment="MyBookmark"`` with no ``url``) use ``w:anchor`` and
|
|
484
|
+
don't add a rels entry. Repeated same-URL inserts coalesce to one
|
|
485
|
+
rels entry so the rels file doesn't grow unboundedly. Behavior
|
|
486
|
+
pinned by ``tests/test_postproc_cell_run_format_rewrite.py``.
|
|
487
|
+
|
|
488
|
+
Live Olympus rendering still won't show cell-inner formatting or
|
|
489
|
+
hyperlinks until SuperDoc lands the corresponding wire ops —
|
|
490
|
+
``Document.export_docx`` is the source of truth for the
|
|
491
|
+
deliverable until then.
|
|
393
492
|
|
|
394
493
|
### 0.11.4 behavior fixes elsewhere
|
|
395
494
|
|
|
@@ -425,6 +524,37 @@ the link text to survive.
|
|
|
425
524
|
``SuperDocCliError: fields insert:at.segments is required``;
|
|
426
525
|
pre-0.11.4 the call took down the whole batch on every flush.
|
|
427
526
|
|
|
527
|
+
### 0.11.5 — `REF` field round-trip preservation (post-export rewrite)
|
|
528
|
+
|
|
529
|
+
SuperDoc 1.23.1 / SDK 1.8.1 strips ``REF`` field codes
|
|
530
|
+
(``<w:fldChar>`` / ``<w:instrText REF …>`` / result-runs / end
|
|
531
|
+
``<w:fldChar>``) on import. On the Paul Weiss Purchase Agreement
|
|
532
|
+
this loses all 301 cross-references — readers see chains of empty
|
|
533
|
+
commas instead of "Section 3.02(b)" cross-refs. Tracked at
|
|
534
|
+
``docx-studio/SUPERDOC_UPSTREAM_REQUESTS.md`` § 18.
|
|
535
|
+
|
|
536
|
+
As of 0.11.5, ``Document.create(docx=template.docx)`` scans the
|
|
537
|
+
local template bytes with a stdlib zipfile + xml.etree parser and
|
|
538
|
+
captures every ``<w:p>`` containing 1+ REF fields. Captures are
|
|
539
|
+
stashed on ``Session._post_export_ops._captured_refs`` (list of
|
|
540
|
+
:class:`docx._postproc.CapturedRefParagraph`). On
|
|
541
|
+
``Document.export_docx``, the post-export OOXML rewrite walks the
|
|
542
|
+
exported body; if any captured paragraph's exported counterpart has
|
|
543
|
+
fewer REFs AND fingerprint-matches (plain-text content excluding
|
|
544
|
+
field result runs), the exported ``<w:p>`` element is replaced
|
|
545
|
+
wholesale with the captured XML. Behavior pinned by
|
|
546
|
+
``tests/test_postproc_ref_restore.py``.
|
|
547
|
+
|
|
548
|
+
Limitations: (1) restoration is in-process only — works when the
|
|
549
|
+
same Python process that called ``Document.create(docx=...)`` also
|
|
550
|
+
calls ``export_docx``. Cross-process flows (agent A creates, agent
|
|
551
|
+
B exports) need agora-side persistence (separate follow-up). (2)
|
|
552
|
+
Paragraph-wholesale replacement preserves the source paragraph but
|
|
553
|
+
overwrites any SuperDoc in-paragraph edits — for round-trip
|
|
554
|
+
preservation (the primary use case) this is exactly right. (3) Only
|
|
555
|
+
top-level body paragraphs are scanned; cell-inner REFs aren't
|
|
556
|
+
captured (rare for legal cross-references).
|
|
557
|
+
|
|
428
558
|
These additions are surfaced under their natural python-docx-shaped
|
|
429
559
|
names. When python-docx upstream eventually ships any of them
|
|
430
560
|
natively, the SDK should swap to the upstream signature in place;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: athena-python-docx
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.14.0
|
|
4
4
|
Summary: Drop-in replacement for python-docx that connects to Athena's Superdoc/Keryx collaborative document stack
|
|
5
5
|
Project-URL: Homepage, https://athenaintelligence.ai
|
|
6
6
|
Author-email: Athena Intelligence <engineering@athenaintelligence.ai>
|
|
@@ -95,6 +95,11 @@ from docx.commands import (
|
|
|
95
95
|
GetNodeById,
|
|
96
96
|
HeaderFootersGet,
|
|
97
97
|
HeaderFootersList,
|
|
98
|
+
HeaderFootersPartsCreate,
|
|
99
|
+
HeaderFootersPartsDelete,
|
|
100
|
+
HeaderFootersPartsList,
|
|
101
|
+
HeaderFootersRefsClear,
|
|
102
|
+
HeaderFootersRefsSet,
|
|
98
103
|
HeaderFootersRefsSetLinkedToPrevious,
|
|
99
104
|
HeaderFootersResolve,
|
|
100
105
|
ImagesGet,
|
|
@@ -152,6 +157,7 @@ from docx.commands import (
|
|
|
152
157
|
TablesSetColumnWidth,
|
|
153
158
|
TablesSetLayout,
|
|
154
159
|
TablesSetRowHeight,
|
|
160
|
+
TablesSetRowOptions,
|
|
155
161
|
TablesSetStyle,
|
|
156
162
|
TablesSetTableOptions,
|
|
157
163
|
TableSetCell,
|
|
@@ -307,6 +313,7 @@ _TABLE_QUERY_COMMANDS: frozenset[str] = frozenset(
|
|
|
307
313
|
"TablesSetCellProperties",
|
|
308
314
|
"TablesSetColumnWidth",
|
|
309
315
|
"TablesSetRowHeight",
|
|
316
|
+
"TablesSetRowOptions",
|
|
310
317
|
"TablesInsertRow",
|
|
311
318
|
"TablesInsertColumn",
|
|
312
319
|
"TablesMergeCells",
|
|
@@ -490,12 +497,66 @@ def _http_post_json(
|
|
|
490
497
|
timeout=timeout,
|
|
491
498
|
)
|
|
492
499
|
except requests.ConnectionError as e:
|
|
500
|
+
# ``RemoteDisconnected`` (server closed the TCP connection
|
|
501
|
+
# without a response) and ``ProtocolError`` (connection
|
|
502
|
+
# aborted mid-response) typically surface on long-running
|
|
503
|
+
# batches — the docx-studio nginx ingress idle-timeout or
|
|
504
|
+
# the SuperDoc CLI worker watchdog can both kill an
|
|
505
|
+
# in-flight request after a few minutes. We don't
|
|
506
|
+
# auto-retry these because the server may have already
|
|
507
|
+
# committed the work; a transport-level retry would risk
|
|
508
|
+
# double-applying the prefix that succeeded server-side.
|
|
509
|
+
# Instead, surface a typed error with actionable guidance
|
|
510
|
+
# so the agent can split the work into smaller batches.
|
|
511
|
+
# Identify the underlying error class without importing it
|
|
512
|
+
# — ``urllib3.exceptions.ProtocolError`` /
|
|
513
|
+
# ``http.client.RemoteDisconnected`` sit several wrap-layers
|
|
514
|
+
# deep and the import paths are version-sensitive.
|
|
515
|
+
err_chain = repr(e)
|
|
516
|
+
is_remote_disconnect = (
|
|
517
|
+
"RemoteDisconnected" in err_chain
|
|
518
|
+
or "ProtocolError" in err_chain
|
|
519
|
+
or "Connection aborted" in err_chain
|
|
520
|
+
)
|
|
521
|
+
if is_remote_disconnect:
|
|
522
|
+
n_commands = (
|
|
523
|
+
len(body.get("commands", []))
|
|
524
|
+
if isinstance(body, dict)
|
|
525
|
+
and isinstance(body.get("commands"), list)
|
|
526
|
+
else 0
|
|
527
|
+
)
|
|
528
|
+
hint = (
|
|
529
|
+
"docx-studio dropped the connection before sending a "
|
|
530
|
+
f"response (RemoteDisconnected) on a batch of "
|
|
531
|
+
f"~{n_commands} commands. The most common cause is an "
|
|
532
|
+
"idle-timeout on the docx-studio nginx ingress (~60s "
|
|
533
|
+
"wall clock) firing on a long-running SuperDoc CLI "
|
|
534
|
+
"operation. The server may or may not have committed "
|
|
535
|
+
"the work — the SDK cannot safely retry because that "
|
|
536
|
+
"would risk double-applying the successful prefix.\n"
|
|
537
|
+
"Recovery options:\n"
|
|
538
|
+
" 1. Re-open the document (``doc = Document(asset_id)``) "
|
|
539
|
+
"and continue the work in smaller chunks — flush every "
|
|
540
|
+
"~30 commands via ``doc.save()`` so each batch fits "
|
|
541
|
+
"comfortably under the ingress idle window.\n"
|
|
542
|
+
" 2. Break paragraph-heavy sections into separate "
|
|
543
|
+
"tool calls. Each ``execute_word_document_code`` "
|
|
544
|
+
"invocation starts a fresh HTTP connection.\n"
|
|
545
|
+
" 3. If the document already contains everything you "
|
|
546
|
+
"expected, the connection drop happened AFTER the "
|
|
547
|
+
"server committed — re-open and inspect "
|
|
548
|
+
"``len(doc.paragraphs)`` / ``len(doc.tables)`` before "
|
|
549
|
+
"retrying."
|
|
550
|
+
)
|
|
551
|
+
raise SessionError(f"{hint}\n\nOriginal error: {e}") from e
|
|
493
552
|
raise SessionError(
|
|
494
553
|
f"Unable to reach docx-studio at {url}: {e}",
|
|
495
554
|
) from e
|
|
496
555
|
except requests.Timeout as e:
|
|
497
556
|
raise SessionError(
|
|
498
|
-
f"docx-studio timed out at {url}: {e}"
|
|
557
|
+
f"docx-studio timed out at {url}: {e}. Split the work "
|
|
558
|
+
"into smaller batches (~30 commands per ``doc.save()``) "
|
|
559
|
+
"to fit under the ingress idle window.",
|
|
499
560
|
) from e
|
|
500
561
|
|
|
501
562
|
# 207 (Multi-Status) is the server's signal for partial-batch
|
|
@@ -767,6 +828,7 @@ _OP_TO_COMMAND: dict[str, type[Command]] = {
|
|
|
767
828
|
"tables.set_cell_properties": TablesSetCellProperties,
|
|
768
829
|
"tables.set_column_width": TablesSetColumnWidth,
|
|
769
830
|
"tables.set_row_height": TablesSetRowHeight,
|
|
831
|
+
"tables.set_row_options": TablesSetRowOptions,
|
|
770
832
|
"tables.set_cell": TableSetCell,
|
|
771
833
|
# Images (mutations)
|
|
772
834
|
"images.set_size": SetImageSize,
|
|
@@ -797,6 +859,11 @@ _OP_TO_COMMAND: dict[str, type[Command]] = {
|
|
|
797
859
|
"header_footers.get": HeaderFootersGet,
|
|
798
860
|
"header_footers.resolve": HeaderFootersResolve,
|
|
799
861
|
"header_footers.refs.set_linked_to_previous": HeaderFootersRefsSetLinkedToPrevious,
|
|
862
|
+
"header_footers.parts.create": HeaderFootersPartsCreate,
|
|
863
|
+
"header_footers.parts.list": HeaderFootersPartsList,
|
|
864
|
+
"header_footers.parts.delete": HeaderFootersPartsDelete,
|
|
865
|
+
"header_footers.refs.set": HeaderFootersRefsSet,
|
|
866
|
+
"header_footers.refs.clear": HeaderFootersRefsClear,
|
|
800
867
|
# Lists & Selection. ``lists.create`` and ``lists.attach`` are
|
|
801
868
|
# consumed internally by ``Document.add_paragraph`` to make
|
|
802
869
|
# ``style="List Bullet" | "List Number"`` produce real list
|