athena-python-docx 0.15.3__tar.gz → 0.15.5__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.15.3 → athena_python_docx-0.15.5}/PKG-INFO +1 -1
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/__init__.py +1 -1
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/_buffer.py +24 -9
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/_http_doc.py +18 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/_timeouts.py +7 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/client.py +2 -2
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/pyproject.toml +1 -1
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_buffer.py +40 -1
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_http_transport.py +68 -1
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/uv.lock +1 -1
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/.gitignore +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/CLAUDE.md +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/DOCX_EXEC_LAB.md +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/README.md +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/_athena_extension.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/_batching.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/_execution.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/_http.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/_image_utils.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/_postproc.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/_ptc.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/_table_styles.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/api.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/bookmarks.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/charts.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/commands.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/comments.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/document.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/enum/__init__.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/enum/section.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/enum/style.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/enum/table.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/enum/text.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/errors.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/exceptions.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/fields.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/footnotes.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/math.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/opc/__init__.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/opc/coreprops.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/oxml/__init__.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/revisions.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/sdt.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/section.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/session.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/settings.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/shape.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/shared.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/styles/__init__.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/styles/style.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/styles/styles.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/table.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/text/__init__.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/text/font.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/text/hyperlink.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/text/pagebreak.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/text/paragraph.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/text/parfmt.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/text/run.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/text/tabstops.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/toc.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/docx/typing.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/scripts/docx_exec_lab.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/scripts/docx_exec_lab_examples/fast_table_fill.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/scripts/docx_exec_lab_examples/find_replace_literal.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/scripts/docx_exec_lab_server.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/scripts/publish.sh +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/scripts/release.sh +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/scripts/round_trip_smoke.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/scripts/smoke_test_block_not_found.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/scripts/validate_find_replace_asset.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/__init__.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/conftest.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/METHODOLOGY.md +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/README.md +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/__init__.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/ab_probe_cases.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/ab_probe_runner.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/auto_gen_cases.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/binary_round_trip.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/cases.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/complex_cases.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/coverage_report.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/extract.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/extreme_cases.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/fake_session.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/firm_templates/README.md +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/firm_templates/__init__.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/firm_templates/_runner.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/firm_templates/extractor.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/firm_templates/test_pw_corpus.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/firm_templates/test_pw_research_digest.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/local_runner.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/mega_cases.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshot.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/01_basic_paragraph.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/02_multiple_headings.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/03_runs_with_formatting.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/04_font_name_and_size.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/05_font_color_rgb.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/06_font_character_properties.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/07_font_subscript_superscript.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/08_font_highlight.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/09_paragraph_alignment.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/100_table_negative_indexing.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/101_table_cells_flat_iteration.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/102_text_with_embedded_special_chars.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/104_core_properties_datetime.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/105_default_one_section.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/106_heading_paragraph_format.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/107_varying_row_heights.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/10_paragraph_indents.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/11_paragraph_spacing.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/12_paragraph_keep_options.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/13_paragraph_tab_stops.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/14_run_add_tab_and_break.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/15_run_add_break_page.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/16_paragraph_clear_and_insert_before.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/17_table_basic.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/18_table_cell_text.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/19_table_row_column_sizing.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/20_table_cell_vertical_alignment.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/21_table_alignment_and_autofit.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/22_table_cell_paragraphs_iteration.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/24_table_add_row_column.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/25_table_merge_cells.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/26_section_page_setup.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/27_section_margins.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/28_section_add_new.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/29_section_headers_linked.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/30_styles_iteration.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/31_styles_lookup_and_default.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/32_styles_add_paragraph_style.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/33_core_properties_set_and_get.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/34_inline_shapes_iterate_empty.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/35_full_report.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/36_replace_text_in_paragraph.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/37_iterate_runs_and_format_all_bold.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/38_font_all_properties.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/39_large_body_100_paragraphs.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/40_large_table_10x10.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/41_unicode_and_emoji.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/42_very_long_paragraph.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/43_paragraph_text_round_trip.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/44_paragraph_alignment_round_trip.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/45_cell_text_round_trip.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/46_run_text_setter_round_trip.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/47_font_size_round_trip.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/48_font_color_round_trip.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/49_resume_layout.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/50_multi_section_doc.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/52_iterate_everything.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/53_apply_style_to_paragraphs.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/54_empty_everything.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/55_single_character_runs.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/56_everything_in_one.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/57_runs_after_multiple_text_appends.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/58_modify_runs_in_place.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/59_indent_round_trip.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/60_space_round_trip.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/61_cell_paragraph_with_runs.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/62_many_cell_paragraphs.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/63_table_style_round_trip.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/64_many_sections.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/65_20x20_table_formatted.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/66_toc_like_structure.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/67_paragraph_insert_before_chain.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/68_invoice.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/69_newsletter.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/70_add_and_iterate_back.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/71_academic_paper.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/72_legal_contract.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/73_form_with_many_tables.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/74_paragraph_with_10_runs.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/75_paragraph_negative_first_line_indent.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/76_rgbcolor_from_string.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/77_length_unit_conversions.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/78_paragraph_copy_style.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/79_bulk_cell_formatting.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/80_apply_style_after_add_run.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/81_multi_page_with_breaks.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/82_add_text_on_existing_run.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/83_clear_then_repopulate_paragraph.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/84_table_reread_row_count.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/85_header_footer_access.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/86_font_read_unset_returns_none.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/87_500_paragraph_doc.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/88_mixed_content_iteration.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/89_alignment_clear_via_none.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/90_cell_add_paragraph_styled.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/91_many_small_tables.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/92_margins_every_section.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/93_font_bool_reads_after_set.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/94_page_break_before_paragraph.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/95_paragraph_hyperlinks_empty.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/96_paragraph_contains_page_break.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/97_document_styles_by_key.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/98_style_contains_check.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/99_run_add_picture_from_bytes.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/ex02_unicode_everywhere.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/ex03_1000_paragraphs.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/ex04_50x50_table.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/ex05_long_text_in_cell.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/ex06_hundred_tiny_runs.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/ex07_every_font_boolean.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/ex08_many_continuous_sections.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/ex09_many_tab_stops.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/ex10_complex_bom.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/ex11_banded_rows_formatting.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/ex12_section_reconfigure.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/ex13_cell_with_10_paragraphs.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/ex14_styled_report_table.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/ex15_paragraph_all_format_props.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/ex16_runs_interleaved_with_breaks.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/ex17_all_break_kinds.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/ex18_read_back_large_doc.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/ex19_mutate_all_runs.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/ex20_kitchen_sink_v2.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/mega01_book_chapter.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/mega02_research_proposal.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/mega03_financial_statement.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/mega04_recipe_card.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/mega05_user_manual.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/mega06_complex_newsletter.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/mega07_budget_spreadsheet.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/mega08_product_catalog.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/mega09_signed_contract.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/mega10_api_documentation.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/rw01_official_quickstart.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/rw02_paragraph_style_list.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/rw03_character_formatting.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/rw04_section_page_setup.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/rw05_toc_pattern.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/rw06_meeting_minutes.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/rw07_dense_formatting_demo.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/rw08_table_merged_header.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/rw09_bulk_run_iteration.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/rw10_colored_grid_table.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/rw11_header_text.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/rw12_first_page_footer.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/rw13_even_page_header.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/op_snapshots/rw15_paragraph_style_instance.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/ours_spec.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/parity_crawl.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/parity_diff.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/real_world_cases.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/round_trip_tests.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/runner.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/stock_spec.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/test_e2e_against_staging.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/parity/README.md +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/parity/__init__.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/parity/baseline_gaps.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/parity/compare.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/parity/intentional_deviations.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/parity/introspect.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/parity/reports/GAP_ANALYSIS.md +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/parity/reports/gap_report.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/parity/run_parity.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/parity/snapshots/athena_latest.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/parity/snapshots/upstream_python_docx_1.2.0.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/parity/test_parity_gap.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_add_section_extract_items.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_athena_extensions_contract.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_athena_extensions_registry.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_batching_perf.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_block_not_found_error.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_cell_add_paragraph_wire_shape.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_cell_add_table_not_supported.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_cell_inner_add_hyperlink_stash.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_cell_inner_add_run_via_cell_insert.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_cell_inner_format_stash.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_cell_inner_run_format_stash.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_cell_inner_run_guard.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_cell_text_plain_fastpath.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_cell_text_replace_semantics.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_collapsed_range_format.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_command_dataclasses.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_commands.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_comments.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_document_asset_id_property.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_document_clear.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_document_create.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_document_create_from_template.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_document_factory_validation.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_docx_exec_lab.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_docx_exec_lab_server.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_e2e_partial_failure_cascade.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_execution_scope.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_find_replace_session_open.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_hyperlink_coalescing.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_insert_deferred.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_iter_inner_content.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_list_styles.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_merged_cell_secondary_slot.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_merged_cells.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_oxml_shim.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_paragraph_text_len_cache.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_parity_misc.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_parity_round2.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_partial_failure_cascade.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_phase_a_behavior.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_phase_b_headers_footers.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_phase_c_tables.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_postproc_cell_format_rewrite.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_postproc_cell_run_format_rewrite.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_postproc_ref_restore.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_pr19766_review_fixes.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_ptc.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_python_docx_api_parity.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_revisions.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_add_paragraph_style.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_add_picture.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_add_run.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_cell_add_paragraph.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_comments_add_comment.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_comments_get.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_document_audit.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_document_element.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_enum_section.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_font_audit.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_header_footer.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_hyperlink.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_inline_shape.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_insert_paragraph_before.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_misc.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_paragraph_strict.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_paragraph_style.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_paragraph_style_strict.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_parfmt.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_row_col_cell.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_run_add_break.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_run_bool_setters.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_run_style.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_run_style_strict.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_run_text.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_run_underline.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_section_audit.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_section_dimensions.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_section_onoff.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_settings.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_shared_audit.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_style.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_styles.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_table_audit.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_table_cell.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_table_dimensions.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_silent_stub_table_layout.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_smoke_integration.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_style_acceptance.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_style_font.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_style_setters_contract.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_table_set_cell_perf.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_table_style_id_resolution.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_temporarily_unavailable.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_validate_find_replace_asset_script.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_wire_contract.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_xml_attr_guard.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/test_zod_wire_contract.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: athena-python-docx
|
|
3
|
-
Version: 0.15.
|
|
3
|
+
Version: 0.15.5
|
|
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>
|
|
@@ -21,9 +21,9 @@ best-effort coalesce — if the loop thread races us we just flush twice
|
|
|
21
21
|
(or zero times; the next loop-thread call drains it).
|
|
22
22
|
|
|
23
23
|
`flush_all` is a process-wide hook used by the Daytona sandbox prelude to
|
|
24
|
-
make sure pending writes hit Keryx
|
|
25
|
-
|
|
26
|
-
alive.
|
|
24
|
+
make sure pending writes hit Keryx and server-side edit sessions are
|
|
25
|
+
checkpointed before the sandbox is suspended. It walks a weak-ref registry
|
|
26
|
+
so dead Document instances don't keep their buffers alive.
|
|
27
27
|
"""
|
|
28
28
|
|
|
29
29
|
from __future__ import annotations
|
|
@@ -180,11 +180,12 @@ def _unregister(buffer: "CommandBuffer") -> None:
|
|
|
180
180
|
|
|
181
181
|
|
|
182
182
|
def flush_all(*, strict: bool = False) -> None:
|
|
183
|
-
"""Flush every live CommandBuffer in this process.
|
|
183
|
+
"""Flush and checkpoint every live CommandBuffer in this process.
|
|
184
184
|
|
|
185
185
|
Used by the Daytona sandbox prelude after user code returns, so
|
|
186
|
-
buffered mutations make it to Keryx
|
|
187
|
-
Safe to call when no
|
|
186
|
+
buffered mutations make it to Keryx and server-side edit sessions are
|
|
187
|
+
durably released before the sandbox is suspended. Safe to call when no
|
|
188
|
+
Buffers exist (no-op).
|
|
188
189
|
|
|
189
190
|
By default, failures are logged and swallowed for backwards
|
|
190
191
|
compatibility with existing local scripts. The executor calls
|
|
@@ -216,9 +217,9 @@ def flush_all(*, strict: bool = False) -> None:
|
|
|
216
217
|
sys.stderr.write(f"[docx-sdk] flush_all: {msg}\n")
|
|
217
218
|
continue
|
|
218
219
|
try:
|
|
219
|
-
buf.
|
|
220
|
+
buf.commit()
|
|
220
221
|
except Exception as e: # noqa: BLE001
|
|
221
|
-
msg = f"buffer {buf.asset_id} flush failed: {e}"
|
|
222
|
+
msg = f"buffer {buf.asset_id} flush/commit failed: {e}"
|
|
222
223
|
if strict:
|
|
223
224
|
failures.append(msg)
|
|
224
225
|
else:
|
|
@@ -499,6 +500,20 @@ class CommandBuffer:
|
|
|
499
500
|
_apply_proxy_id_rewrites(results, proxy_id_refs)
|
|
500
501
|
return results
|
|
501
502
|
|
|
503
|
+
def commit(self) -> None:
|
|
504
|
+
"""Flush pending commands and release the server-side edit session.
|
|
505
|
+
|
|
506
|
+
The HTTP command response tells us docx-studio applied the batch to its
|
|
507
|
+
pooled SuperDoc handle. Releasing the handle closes the collaboration
|
|
508
|
+
session without discard on the server, which is the durability
|
|
509
|
+
checkpoint for asset-backed document edits.
|
|
510
|
+
"""
|
|
511
|
+
self._assert_current_execution()
|
|
512
|
+
self.flush()
|
|
513
|
+
release_asset = getattr(self._client, "release_asset", None)
|
|
514
|
+
if callable(release_asset):
|
|
515
|
+
release_asset(self._asset_id)
|
|
516
|
+
|
|
502
517
|
def close(self) -> None:
|
|
503
518
|
"""Flush and disable. Idempotent."""
|
|
504
519
|
if self._closed:
|
|
@@ -513,7 +528,7 @@ class CommandBuffer:
|
|
|
513
528
|
self._proxy_id_refs = {}
|
|
514
529
|
_ptc_emit_end_batch(pending, is_error=True)
|
|
515
530
|
else:
|
|
516
|
-
self.
|
|
531
|
+
self.commit()
|
|
517
532
|
finally:
|
|
518
533
|
self._closed = True
|
|
519
534
|
_unregister(self)
|
|
@@ -699,6 +699,24 @@ class HttpClient:
|
|
|
699
699
|
except Exception: # noqa: BLE001
|
|
700
700
|
pass
|
|
701
701
|
|
|
702
|
+
def release_asset(self, asset_id: str) -> None:
|
|
703
|
+
"""Ask docx-studio to close its pooled SuperDoc session for ``asset_id``.
|
|
704
|
+
|
|
705
|
+
Command POSTs only prove that the server accepted and applied the
|
|
706
|
+
mutation batch to its live SuperDoc handle. The durable checkpoint for
|
|
707
|
+
collaborative sessions happens when that handle is closed without
|
|
708
|
+
discard, so ``Document.save()`` and the Daytona ``flush_all`` cleanup
|
|
709
|
+
call this endpoint after draining the command buffer.
|
|
710
|
+
"""
|
|
711
|
+
url: str = f"{self._base_url}/docs/{asset_id}/session/release"
|
|
712
|
+
_http_post_json(
|
|
713
|
+
session=self._session,
|
|
714
|
+
url=url,
|
|
715
|
+
api_key=self._api_key,
|
|
716
|
+
body={},
|
|
717
|
+
timeout=30.0,
|
|
718
|
+
)
|
|
719
|
+
|
|
702
720
|
def execute_batch(
|
|
703
721
|
self,
|
|
704
722
|
asset_id: str,
|
|
@@ -13,6 +13,13 @@ LONG_RUNNING_COMMAND_TIMEOUT_SECONDS: float = 300.0
|
|
|
13
13
|
|
|
14
14
|
_LONG_RUNNING_COMMAND_TYPES: frozenset[str] = frozenset(
|
|
15
15
|
{
|
|
16
|
+
# The first write to a large imported document can spend close to a
|
|
17
|
+
# minute opening/syncing the server-side SuperDoc session before the
|
|
18
|
+
# block creation itself is applied. These are ordinary agent primitives
|
|
19
|
+
# for "append a summary/TLDR", so give the first batch enough room.
|
|
20
|
+
"CreateHeading",
|
|
21
|
+
"CreateParagraph",
|
|
22
|
+
"CreateSectionBreak",
|
|
16
23
|
"FindReplace",
|
|
17
24
|
# Plain ``cell.text = value`` table fills are buffered as TableSetCell
|
|
18
25
|
# commands. On dense legal documents, SuperDoc can spend well over the
|
|
@@ -231,8 +231,8 @@ class Session:
|
|
|
231
231
|
handle = self._doc_handle
|
|
232
232
|
buffer = getattr(handle, "buffer", None) if handle is not None else None
|
|
233
233
|
if buffer is not None:
|
|
234
|
-
buffer.
|
|
235
|
-
_log_info(f"Saved {self._asset_id} (buffer drained)")
|
|
234
|
+
buffer.commit()
|
|
235
|
+
_log_info(f"Saved {self._asset_id} (buffer drained and session released)")
|
|
236
236
|
|
|
237
237
|
async def close(self) -> None:
|
|
238
238
|
"""Close the session. Idempotent."""
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "athena-python-docx"
|
|
7
|
-
version = "0.15.
|
|
7
|
+
version = "0.15.5"
|
|
8
8
|
description = "Drop-in replacement for python-docx that connects to Athena's Superdoc/Keryx collaborative document stack"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
@@ -7,8 +7,9 @@ Verifies that:
|
|
|
7
7
|
- Creates WITH a client id (the transparent-batching path) defer,
|
|
8
8
|
- pending mutations drain in the same batch as an eager call,
|
|
9
9
|
- ``flush()`` drains explicitly,
|
|
10
|
+
- ``commit()`` drains and releases the server-side session,
|
|
10
11
|
- the idle timer auto-flushes after a configurable window,
|
|
11
|
-
- the process-wide ``flush_all`` walks every live buffer.
|
|
12
|
+
- the process-wide ``flush_all`` walks every live buffer and commits it.
|
|
12
13
|
"""
|
|
13
14
|
|
|
14
15
|
from __future__ import annotations
|
|
@@ -26,6 +27,7 @@ from docx._timeouts import DEFAULT_OP_TIMEOUT_SECONDS, LONG_RUNNING_COMMAND_TIME
|
|
|
26
27
|
from docx.commands import (
|
|
27
28
|
BlocksList,
|
|
28
29
|
Command,
|
|
30
|
+
CreateHeading,
|
|
29
31
|
CreateParagraph,
|
|
30
32
|
FormatApply,
|
|
31
33
|
Replace,
|
|
@@ -44,6 +46,7 @@ class _FakeClient:
|
|
|
44
46
|
# Envelope-level fields recorded per batch — used by
|
|
45
47
|
# track-changes tests to verify changeMode / user propagation.
|
|
46
48
|
self.envelopes: list[dict[str, Any]] = []
|
|
49
|
+
self.releases: list[str] = []
|
|
47
50
|
self._lock = threading.Lock()
|
|
48
51
|
|
|
49
52
|
def execute_batch(
|
|
@@ -62,6 +65,10 @@ class _FakeClient:
|
|
|
62
65
|
# Mimic per-command result envelope.
|
|
63
66
|
return [{"index": i, "ok": True} for i, _ in enumerate(commands)]
|
|
64
67
|
|
|
68
|
+
def release_asset(self, asset_id: str) -> None:
|
|
69
|
+
with self._lock:
|
|
70
|
+
self.releases.append(asset_id)
|
|
71
|
+
|
|
65
72
|
|
|
66
73
|
class _FakeDocHandle:
|
|
67
74
|
def __init__(self, buffer: CommandBuffer) -> None:
|
|
@@ -109,6 +116,23 @@ def test_pending_timeout_extends_for_table_set_cell_batches() -> None:
|
|
|
109
116
|
buf.close()
|
|
110
117
|
|
|
111
118
|
|
|
119
|
+
def test_pending_timeout_extends_for_block_creation_batches() -> None:
|
|
120
|
+
fake = _FakeClient()
|
|
121
|
+
buf = CommandBuffer(fake, "asset_1", auto_flush_seconds=0.0)
|
|
122
|
+
|
|
123
|
+
buf.call(
|
|
124
|
+
CreateHeading(
|
|
125
|
+
text="TLDR",
|
|
126
|
+
level=1,
|
|
127
|
+
at={"kind": "documentEnd"},
|
|
128
|
+
client_node_id="h_test",
|
|
129
|
+
)
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
assert buf.pending_timeout_seconds == LONG_RUNNING_COMMAND_TIMEOUT_SECONDS
|
|
133
|
+
buf.close()
|
|
134
|
+
|
|
135
|
+
|
|
112
136
|
def test_session_pending_timeout_reads_command_buffer_budget() -> None:
|
|
113
137
|
from docx.client import Session
|
|
114
138
|
|
|
@@ -189,6 +213,19 @@ def test_flush_with_empty_queue_is_noop() -> None:
|
|
|
189
213
|
buf.close()
|
|
190
214
|
|
|
191
215
|
|
|
216
|
+
def test_commit_drains_pending_and_releases_server_session() -> None:
|
|
217
|
+
fake = _FakeClient()
|
|
218
|
+
buf = CommandBuffer(fake, "asset_1", auto_flush_seconds=0.0)
|
|
219
|
+
|
|
220
|
+
buf.call(FormatApply(target={"kind": "block"}, inline={"bold": True}))
|
|
221
|
+
buf.commit()
|
|
222
|
+
|
|
223
|
+
assert len(fake.batches) == 1
|
|
224
|
+
assert _types(fake.batches[0]) == ["FormatApply"]
|
|
225
|
+
assert fake.releases == ["asset_1"]
|
|
226
|
+
buf.close()
|
|
227
|
+
|
|
228
|
+
|
|
192
229
|
def test_idle_timer_auto_flushes() -> None:
|
|
193
230
|
"""A non-zero idle window should flush after inactivity.
|
|
194
231
|
|
|
@@ -282,6 +319,8 @@ def test_flush_all_walks_every_live_buffer() -> None:
|
|
|
282
319
|
flush_all()
|
|
283
320
|
assert len(fake_a.batches) == 1
|
|
284
321
|
assert len(fake_b.batches) == 1
|
|
322
|
+
assert fake_a.releases == ["asset_a"]
|
|
323
|
+
assert fake_b.releases == ["asset_b"]
|
|
285
324
|
buf_a.close()
|
|
286
325
|
buf_b.close()
|
|
287
326
|
|
|
@@ -17,7 +17,7 @@ import requests
|
|
|
17
17
|
from docx import __version__ as SDK_VERSION
|
|
18
18
|
from docx._http_doc import HttpClient, HttpDocHandle
|
|
19
19
|
from docx._timeouts import LONG_RUNNING_COMMAND_TIMEOUT_SECONDS
|
|
20
|
-
from docx.commands import FindReplace, TableSetCell
|
|
20
|
+
from docx.commands import CreateParagraph, FindReplace, TableSetCell
|
|
21
21
|
from docx.errors import AuthenticationError, DocxError, SessionError
|
|
22
22
|
|
|
23
23
|
|
|
@@ -145,6 +145,73 @@ def test_table_set_cell_batch_uses_long_running_http_timeout() -> None:
|
|
|
145
145
|
assert captured["timeout"] == LONG_RUNNING_COMMAND_TIMEOUT_SECONDS
|
|
146
146
|
|
|
147
147
|
|
|
148
|
+
def test_block_creation_batch_uses_long_running_http_timeout() -> None:
|
|
149
|
+
captured: dict[str, Any] = {}
|
|
150
|
+
|
|
151
|
+
def _capture(url: str, **kwargs: Any) -> _FakeResponse: # noqa: ARG001
|
|
152
|
+
captured["timeout"] = kwargs["timeout"]
|
|
153
|
+
return _FakeResponse(
|
|
154
|
+
status_code=200,
|
|
155
|
+
body=_ok_body(
|
|
156
|
+
[
|
|
157
|
+
{
|
|
158
|
+
"index": 0,
|
|
159
|
+
"type": "CreateParagraph",
|
|
160
|
+
"result": {
|
|
161
|
+
"client_node_id": "p_test",
|
|
162
|
+
"real_node_id": "paragraph_real",
|
|
163
|
+
},
|
|
164
|
+
}
|
|
165
|
+
],
|
|
166
|
+
),
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
client = HttpClient(base_url="https://example.com", api_key="bg_key")
|
|
170
|
+
|
|
171
|
+
with patch.object(client._session, "post", side_effect=_capture):
|
|
172
|
+
result = client.execute_batch(
|
|
173
|
+
"asset_test",
|
|
174
|
+
[
|
|
175
|
+
CreateParagraph(
|
|
176
|
+
text="DLDR",
|
|
177
|
+
at={"kind": "documentEnd"},
|
|
178
|
+
client_node_id="p_test",
|
|
179
|
+
)
|
|
180
|
+
],
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
assert result == [
|
|
184
|
+
{"client_node_id": "p_test", "real_node_id": "paragraph_real"}
|
|
185
|
+
]
|
|
186
|
+
assert captured["timeout"] == LONG_RUNNING_COMMAND_TIMEOUT_SECONDS
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def test_release_asset_posts_to_session_release_endpoint() -> None:
|
|
190
|
+
captured: dict[str, Any] = {}
|
|
191
|
+
|
|
192
|
+
def _capture(url: str, **kwargs: Any) -> _FakeResponse:
|
|
193
|
+
captured["url"] = url
|
|
194
|
+
captured["body"] = json.loads(kwargs["data"].decode("utf-8"))
|
|
195
|
+
captured["auth"] = kwargs["headers"].get("Authorization")
|
|
196
|
+
captured["timeout"] = kwargs["timeout"]
|
|
197
|
+
return _FakeResponse(
|
|
198
|
+
status_code=200,
|
|
199
|
+
body=b'{"assetId":"asset_test","released":true}',
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
client = HttpClient(base_url="https://example.com", api_key="bg_key")
|
|
203
|
+
|
|
204
|
+
with patch.object(client._session, "post", side_effect=_capture):
|
|
205
|
+
client.release_asset("asset_test")
|
|
206
|
+
|
|
207
|
+
assert captured == {
|
|
208
|
+
"url": "https://example.com/docs/asset_test/session/release",
|
|
209
|
+
"body": {},
|
|
210
|
+
"auth": "Bearer bg_key",
|
|
211
|
+
"timeout": 30.0,
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
|
|
148
215
|
def test_deeply_nested_paths() -> None:
|
|
149
216
|
"""``doc.format.paragraph.set_alignment(p)`` walks three levels and
|
|
150
217
|
serializes as ``SetParagraphAlignment``. It's a pure mutation, so it
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/scripts/smoke_test_block_not_found.py
RENAMED
|
File without changes
|
{athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/scripts/validate_find_replace_asset.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/firm_templates/README.md
RENAMED
|
File without changes
|
{athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/firm_templates/__init__.py
RENAMED
|
File without changes
|
{athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/firm_templates/_runner.py
RENAMED
|
File without changes
|
{athena_python_docx-0.15.3 → athena_python_docx-0.15.5}/tests/fidelity/firm_templates/extractor.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|