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