athena-python-docx 0.15.3__tar.gz → 0.15.4__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.4}/PKG-INFO +1 -1
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/__init__.py +1 -1
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/_buffer.py +24 -9
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/_http_doc.py +18 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/client.py +2 -2
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/pyproject.toml +1 -1
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_buffer.py +22 -1
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_http_transport.py +26 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/uv.lock +1 -1
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/.gitignore +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/CLAUDE.md +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/DOCX_EXEC_LAB.md +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/README.md +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/_athena_extension.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/_batching.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/_execution.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/_http.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/_image_utils.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/_postproc.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/_ptc.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/_table_styles.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/_timeouts.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/api.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/bookmarks.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/charts.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/commands.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/comments.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/document.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/enum/__init__.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/enum/section.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/enum/style.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/enum/table.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/enum/text.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/errors.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/exceptions.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/fields.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/footnotes.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/math.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/opc/__init__.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/opc/coreprops.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/oxml/__init__.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/revisions.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/sdt.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/section.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/session.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/settings.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/shape.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/shared.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/styles/__init__.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/styles/style.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/styles/styles.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/table.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/text/__init__.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/text/font.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/text/hyperlink.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/text/pagebreak.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/text/paragraph.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/text/parfmt.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/text/run.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/text/tabstops.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/toc.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/docx/typing.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/scripts/docx_exec_lab.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/scripts/docx_exec_lab_examples/fast_table_fill.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/scripts/docx_exec_lab_examples/find_replace_literal.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/scripts/docx_exec_lab_server.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/scripts/publish.sh +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/scripts/release.sh +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/scripts/round_trip_smoke.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/scripts/smoke_test_block_not_found.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/scripts/validate_find_replace_asset.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/__init__.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/conftest.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/METHODOLOGY.md +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/README.md +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/__init__.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/ab_probe_cases.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/ab_probe_runner.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/auto_gen_cases.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/binary_round_trip.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/cases.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/complex_cases.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/coverage_report.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/extract.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/extreme_cases.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/fake_session.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/firm_templates/README.md +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/firm_templates/__init__.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/firm_templates/_runner.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/firm_templates/extractor.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/firm_templates/test_pw_corpus.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/firm_templates/test_pw_research_digest.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/local_runner.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/mega_cases.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshot.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/01_basic_paragraph.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/02_multiple_headings.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/03_runs_with_formatting.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/04_font_name_and_size.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/05_font_color_rgb.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/06_font_character_properties.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/07_font_subscript_superscript.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/08_font_highlight.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/09_paragraph_alignment.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/100_table_negative_indexing.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/101_table_cells_flat_iteration.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/102_text_with_embedded_special_chars.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/104_core_properties_datetime.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/105_default_one_section.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/106_heading_paragraph_format.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/107_varying_row_heights.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/10_paragraph_indents.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/11_paragraph_spacing.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/12_paragraph_keep_options.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/13_paragraph_tab_stops.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/14_run_add_tab_and_break.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/15_run_add_break_page.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/16_paragraph_clear_and_insert_before.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/17_table_basic.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/18_table_cell_text.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/19_table_row_column_sizing.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/20_table_cell_vertical_alignment.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/21_table_alignment_and_autofit.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/22_table_cell_paragraphs_iteration.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/24_table_add_row_column.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/25_table_merge_cells.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/26_section_page_setup.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/27_section_margins.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/28_section_add_new.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/29_section_headers_linked.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/30_styles_iteration.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/31_styles_lookup_and_default.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/32_styles_add_paragraph_style.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/33_core_properties_set_and_get.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/34_inline_shapes_iterate_empty.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/35_full_report.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/36_replace_text_in_paragraph.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/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.4}/tests/fidelity/op_snapshots/38_font_all_properties.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/39_large_body_100_paragraphs.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/40_large_table_10x10.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/41_unicode_and_emoji.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/42_very_long_paragraph.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/43_paragraph_text_round_trip.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/44_paragraph_alignment_round_trip.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/45_cell_text_round_trip.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/46_run_text_setter_round_trip.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/47_font_size_round_trip.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/48_font_color_round_trip.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/49_resume_layout.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/50_multi_section_doc.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/52_iterate_everything.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/53_apply_style_to_paragraphs.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/54_empty_everything.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/55_single_character_runs.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/56_everything_in_one.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/57_runs_after_multiple_text_appends.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/58_modify_runs_in_place.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/59_indent_round_trip.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/60_space_round_trip.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/61_cell_paragraph_with_runs.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/62_many_cell_paragraphs.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/63_table_style_round_trip.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/64_many_sections.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/65_20x20_table_formatted.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/66_toc_like_structure.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/67_paragraph_insert_before_chain.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/68_invoice.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/69_newsletter.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/70_add_and_iterate_back.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/71_academic_paper.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/72_legal_contract.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/73_form_with_many_tables.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/74_paragraph_with_10_runs.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/75_paragraph_negative_first_line_indent.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/76_rgbcolor_from_string.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/77_length_unit_conversions.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/78_paragraph_copy_style.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/79_bulk_cell_formatting.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/80_apply_style_after_add_run.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/81_multi_page_with_breaks.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/82_add_text_on_existing_run.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/83_clear_then_repopulate_paragraph.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/84_table_reread_row_count.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/85_header_footer_access.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/86_font_read_unset_returns_none.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/87_500_paragraph_doc.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/88_mixed_content_iteration.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/89_alignment_clear_via_none.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/90_cell_add_paragraph_styled.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/91_many_small_tables.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/92_margins_every_section.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/93_font_bool_reads_after_set.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/94_page_break_before_paragraph.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/95_paragraph_hyperlinks_empty.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/96_paragraph_contains_page_break.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/97_document_styles_by_key.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/98_style_contains_check.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/99_run_add_picture_from_bytes.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/ex02_unicode_everywhere.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/ex03_1000_paragraphs.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/ex04_50x50_table.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/ex05_long_text_in_cell.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/ex06_hundred_tiny_runs.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/ex07_every_font_boolean.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/ex08_many_continuous_sections.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/ex09_many_tab_stops.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/ex10_complex_bom.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/ex11_banded_rows_formatting.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/ex12_section_reconfigure.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/ex13_cell_with_10_paragraphs.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/ex14_styled_report_table.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/ex15_paragraph_all_format_props.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/ex16_runs_interleaved_with_breaks.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/ex17_all_break_kinds.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/ex18_read_back_large_doc.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/ex19_mutate_all_runs.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/ex20_kitchen_sink_v2.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/mega01_book_chapter.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/mega02_research_proposal.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/mega03_financial_statement.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/mega04_recipe_card.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/mega05_user_manual.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/mega06_complex_newsletter.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/mega07_budget_spreadsheet.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/mega08_product_catalog.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/mega09_signed_contract.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/mega10_api_documentation.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/rw01_official_quickstart.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/rw02_paragraph_style_list.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/rw03_character_formatting.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/rw04_section_page_setup.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/rw05_toc_pattern.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/rw06_meeting_minutes.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/rw07_dense_formatting_demo.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/rw08_table_merged_header.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/rw09_bulk_run_iteration.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/rw10_colored_grid_table.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/rw11_header_text.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/rw12_first_page_footer.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/rw13_even_page_header.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/op_snapshots/rw15_paragraph_style_instance.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/ours_spec.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/parity_crawl.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/parity_diff.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/real_world_cases.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/round_trip_tests.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/runner.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/stock_spec.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/test_e2e_against_staging.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/parity/README.md +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/parity/__init__.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/parity/baseline_gaps.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/parity/compare.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/parity/intentional_deviations.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/parity/introspect.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/parity/reports/GAP_ANALYSIS.md +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/parity/reports/gap_report.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/parity/run_parity.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/parity/snapshots/athena_latest.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/parity/snapshots/upstream_python_docx_1.2.0.json +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/parity/test_parity_gap.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_add_section_extract_items.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_athena_extensions_contract.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_athena_extensions_registry.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_batching_perf.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_block_not_found_error.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_cell_add_paragraph_wire_shape.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_cell_add_table_not_supported.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_cell_inner_add_hyperlink_stash.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_cell_inner_add_run_via_cell_insert.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_cell_inner_format_stash.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_cell_inner_run_format_stash.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_cell_inner_run_guard.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_cell_text_plain_fastpath.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_cell_text_replace_semantics.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_collapsed_range_format.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_command_dataclasses.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_commands.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_comments.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_document_asset_id_property.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_document_clear.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_document_create.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_document_create_from_template.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_document_factory_validation.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_docx_exec_lab.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_docx_exec_lab_server.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_e2e_partial_failure_cascade.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_execution_scope.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_find_replace_session_open.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_hyperlink_coalescing.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_insert_deferred.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_iter_inner_content.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_list_styles.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_merged_cell_secondary_slot.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_merged_cells.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_oxml_shim.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_paragraph_text_len_cache.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_parity_misc.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_parity_round2.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_partial_failure_cascade.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_phase_a_behavior.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_phase_b_headers_footers.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_phase_c_tables.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_postproc_cell_format_rewrite.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_postproc_cell_run_format_rewrite.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_postproc_ref_restore.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_pr19766_review_fixes.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_ptc.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_python_docx_api_parity.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_revisions.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_add_paragraph_style.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_add_picture.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_add_run.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_cell_add_paragraph.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_comments_add_comment.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_comments_get.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_document_audit.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_document_element.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_enum_section.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_font_audit.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_header_footer.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_hyperlink.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_inline_shape.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_insert_paragraph_before.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_misc.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_paragraph_strict.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_paragraph_style.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_paragraph_style_strict.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_parfmt.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_row_col_cell.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_run_add_break.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_run_bool_setters.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_run_style.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_run_style_strict.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_run_text.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_run_underline.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_section_audit.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_section_dimensions.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_section_onoff.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_settings.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_shared_audit.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_style.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_styles.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_table_audit.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_table_cell.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_table_dimensions.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_silent_stub_table_layout.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_smoke_integration.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_style_acceptance.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_style_font.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_style_setters_contract.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_table_set_cell_perf.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_table_style_id_resolution.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_temporarily_unavailable.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_validate_find_replace_asset_script.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_wire_contract.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/test_xml_attr_guard.py +0 -0
- {athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/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.4
|
|
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,
|
|
@@ -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.4"
|
|
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
|
|
@@ -44,6 +45,7 @@ class _FakeClient:
|
|
|
44
45
|
# Envelope-level fields recorded per batch — used by
|
|
45
46
|
# track-changes tests to verify changeMode / user propagation.
|
|
46
47
|
self.envelopes: list[dict[str, Any]] = []
|
|
48
|
+
self.releases: list[str] = []
|
|
47
49
|
self._lock = threading.Lock()
|
|
48
50
|
|
|
49
51
|
def execute_batch(
|
|
@@ -62,6 +64,10 @@ class _FakeClient:
|
|
|
62
64
|
# Mimic per-command result envelope.
|
|
63
65
|
return [{"index": i, "ok": True} for i, _ in enumerate(commands)]
|
|
64
66
|
|
|
67
|
+
def release_asset(self, asset_id: str) -> None:
|
|
68
|
+
with self._lock:
|
|
69
|
+
self.releases.append(asset_id)
|
|
70
|
+
|
|
65
71
|
|
|
66
72
|
class _FakeDocHandle:
|
|
67
73
|
def __init__(self, buffer: CommandBuffer) -> None:
|
|
@@ -189,6 +195,19 @@ def test_flush_with_empty_queue_is_noop() -> None:
|
|
|
189
195
|
buf.close()
|
|
190
196
|
|
|
191
197
|
|
|
198
|
+
def test_commit_drains_pending_and_releases_server_session() -> None:
|
|
199
|
+
fake = _FakeClient()
|
|
200
|
+
buf = CommandBuffer(fake, "asset_1", auto_flush_seconds=0.0)
|
|
201
|
+
|
|
202
|
+
buf.call(FormatApply(target={"kind": "block"}, inline={"bold": True}))
|
|
203
|
+
buf.commit()
|
|
204
|
+
|
|
205
|
+
assert len(fake.batches) == 1
|
|
206
|
+
assert _types(fake.batches[0]) == ["FormatApply"]
|
|
207
|
+
assert fake.releases == ["asset_1"]
|
|
208
|
+
buf.close()
|
|
209
|
+
|
|
210
|
+
|
|
192
211
|
def test_idle_timer_auto_flushes() -> None:
|
|
193
212
|
"""A non-zero idle window should flush after inactivity.
|
|
194
213
|
|
|
@@ -282,6 +301,8 @@ def test_flush_all_walks_every_live_buffer() -> None:
|
|
|
282
301
|
flush_all()
|
|
283
302
|
assert len(fake_a.batches) == 1
|
|
284
303
|
assert len(fake_b.batches) == 1
|
|
304
|
+
assert fake_a.releases == ["asset_a"]
|
|
305
|
+
assert fake_b.releases == ["asset_b"]
|
|
285
306
|
buf_a.close()
|
|
286
307
|
buf_b.close()
|
|
287
308
|
|
|
@@ -145,6 +145,32 @@ 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_release_asset_posts_to_session_release_endpoint() -> None:
|
|
149
|
+
captured: dict[str, Any] = {}
|
|
150
|
+
|
|
151
|
+
def _capture(url: str, **kwargs: Any) -> _FakeResponse:
|
|
152
|
+
captured["url"] = url
|
|
153
|
+
captured["body"] = json.loads(kwargs["data"].decode("utf-8"))
|
|
154
|
+
captured["auth"] = kwargs["headers"].get("Authorization")
|
|
155
|
+
captured["timeout"] = kwargs["timeout"]
|
|
156
|
+
return _FakeResponse(
|
|
157
|
+
status_code=200,
|
|
158
|
+
body=b'{"assetId":"asset_test","released":true}',
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
client = HttpClient(base_url="https://example.com", api_key="bg_key")
|
|
162
|
+
|
|
163
|
+
with patch.object(client._session, "post", side_effect=_capture):
|
|
164
|
+
client.release_asset("asset_test")
|
|
165
|
+
|
|
166
|
+
assert captured == {
|
|
167
|
+
"url": "https://example.com/docs/asset_test/session/release",
|
|
168
|
+
"body": {},
|
|
169
|
+
"auth": "Bearer bg_key",
|
|
170
|
+
"timeout": 30.0,
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
|
|
148
174
|
def test_deeply_nested_paths() -> None:
|
|
149
175
|
"""``doc.format.paragraph.set_alignment(p)`` walks three levels and
|
|
150
176
|
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
|
|
File without changes
|
{athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/scripts/smoke_test_block_not_found.py
RENAMED
|
File without changes
|
{athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/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.4}/tests/fidelity/firm_templates/README.md
RENAMED
|
File without changes
|
{athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/firm_templates/__init__.py
RENAMED
|
File without changes
|
{athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/tests/fidelity/firm_templates/_runner.py
RENAMED
|
File without changes
|
{athena_python_docx-0.15.3 → athena_python_docx-0.15.4}/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
|
|
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
|