athena-python-docx 0.21.5__tar.gz → 0.21.7__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.21.5 → athena_python_docx-0.21.7}/PKG-INFO +1 -1
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/__init__.py +1 -1
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/document.py +17 -1
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/table.py +5 -4
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/text/run.py +16 -1
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/pyproject.toml +7 -1
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_find_replace_session_open.py +19 -0
- athena_python_docx-0.21.7/tests/test_run_add_picture_anchor.py +69 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/.gitignore +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/CLAUDE.md +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/DOCX_EXEC_LAB.md +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/README.md +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/_athena_extension.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/_batching.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/_buffer.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/_citations.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/_execution.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/_http.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/_http_doc.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/_image_utils.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/_postproc.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/_ptc.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/_references.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/_table_styles.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/_timeouts.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/api.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/bookmarks.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/charts.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/client.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/commands.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/comments.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/enum/__init__.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/enum/section.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/enum/shape.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/enum/style.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/enum/table.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/enum/text.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/errors.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/exceptions.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/fields.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/footnotes.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/math.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/opc/__init__.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/opc/coreprops.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/oxml/__init__.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/revisions.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/sdt.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/section.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/session.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/settings.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/shape.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/shared.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/styles/__init__.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/styles/style.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/styles/styles.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/text/__init__.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/text/font.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/text/hyperlink.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/text/pagebreak.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/text/paragraph.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/text/parfmt.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/text/tabstops.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/toc.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/docx/typing.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/scripts/docx_exec_lab.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/scripts/docx_exec_lab_examples/fast_table_fill.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/scripts/docx_exec_lab_examples/find_replace_literal.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/scripts/docx_exec_lab_server.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/scripts/dump_wire_fixtures.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/scripts/publish.sh +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/scripts/release.sh +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/scripts/round_trip_smoke.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/scripts/smoke_test_block_not_found.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/scripts/validate_find_replace_asset.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/__init__.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/conftest.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/METHODOLOGY.md +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/README.md +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/__init__.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/ab_probe_cases.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/ab_probe_runner.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/auto_gen_cases.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/binary_round_trip.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/cases.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/complex_cases.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/coverage_report.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/extract.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/extreme_cases.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/fake_session.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/firm_templates/README.md +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/firm_templates/__init__.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/firm_templates/_runner.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/firm_templates/extractor.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/firm_templates/test_pw_corpus.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/firm_templates/test_pw_research_digest.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/local_runner.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/mega_cases.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshot.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/01_basic_paragraph.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/02_multiple_headings.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/03_runs_with_formatting.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/04_font_name_and_size.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/05_font_color_rgb.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/06_font_character_properties.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/07_font_subscript_superscript.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/08_font_highlight.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/09_paragraph_alignment.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/100_table_negative_indexing.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/101_table_cells_flat_iteration.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/102_text_with_embedded_special_chars.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/104_core_properties_datetime.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/105_default_one_section.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/106_heading_paragraph_format.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/107_varying_row_heights.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/10_paragraph_indents.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/11_paragraph_spacing.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/12_paragraph_keep_options.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/13_paragraph_tab_stops.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/14_run_add_tab_and_break.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/15_run_add_break_page.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/16_paragraph_clear_and_insert_before.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/17_table_basic.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/18_table_cell_text.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/19_table_row_column_sizing.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/20_table_cell_vertical_alignment.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/21_table_alignment_and_autofit.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/22_table_cell_paragraphs_iteration.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/24_table_add_row_column.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/25_table_merge_cells.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/26_section_page_setup.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/27_section_margins.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/28_section_add_new.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/29_section_headers_linked.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/30_styles_iteration.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/31_styles_lookup_and_default.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/32_styles_add_paragraph_style.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/33_core_properties_set_and_get.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/34_inline_shapes_iterate_empty.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/35_full_report.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/36_replace_text_in_paragraph.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/37_iterate_runs_and_format_all_bold.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/38_font_all_properties.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/39_large_body_100_paragraphs.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/40_large_table_10x10.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/41_unicode_and_emoji.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/42_very_long_paragraph.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/43_paragraph_text_round_trip.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/44_paragraph_alignment_round_trip.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/45_cell_text_round_trip.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/46_run_text_setter_round_trip.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/47_font_size_round_trip.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/48_font_color_round_trip.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/49_resume_layout.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/50_multi_section_doc.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/52_iterate_everything.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/53_apply_style_to_paragraphs.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/54_empty_everything.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/55_single_character_runs.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/56_everything_in_one.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/57_runs_after_multiple_text_appends.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/58_modify_runs_in_place.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/59_indent_round_trip.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/60_space_round_trip.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/61_cell_paragraph_with_runs.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/62_many_cell_paragraphs.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/63_table_style_round_trip.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/64_many_sections.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/65_20x20_table_formatted.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/66_toc_like_structure.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/67_paragraph_insert_before_chain.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/68_invoice.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/69_newsletter.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/70_add_and_iterate_back.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/71_academic_paper.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/72_legal_contract.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/73_form_with_many_tables.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/74_paragraph_with_10_runs.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/75_paragraph_negative_first_line_indent.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/76_rgbcolor_from_string.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/77_length_unit_conversions.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/78_paragraph_copy_style.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/79_bulk_cell_formatting.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/80_apply_style_after_add_run.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/81_multi_page_with_breaks.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/82_add_text_on_existing_run.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/83_clear_then_repopulate_paragraph.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/84_table_reread_row_count.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/85_header_footer_access.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/86_font_read_unset_returns_none.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/87_500_paragraph_doc.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/88_mixed_content_iteration.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/89_alignment_clear_via_none.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/90_cell_add_paragraph_styled.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/91_many_small_tables.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/92_margins_every_section.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/93_font_bool_reads_after_set.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/94_page_break_before_paragraph.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/95_paragraph_hyperlinks_empty.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/96_paragraph_contains_page_break.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/97_document_styles_by_key.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/98_style_contains_check.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/99_run_add_picture_from_bytes.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/ex02_unicode_everywhere.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/ex03_1000_paragraphs.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/ex04_50x50_table.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/ex05_long_text_in_cell.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/ex06_hundred_tiny_runs.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/ex07_every_font_boolean.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/ex08_many_continuous_sections.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/ex09_many_tab_stops.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/ex10_complex_bom.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/ex11_banded_rows_formatting.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/ex12_section_reconfigure.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/ex13_cell_with_10_paragraphs.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/ex14_styled_report_table.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/ex15_paragraph_all_format_props.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/ex16_runs_interleaved_with_breaks.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/ex17_all_break_kinds.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/ex18_read_back_large_doc.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/ex19_mutate_all_runs.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/ex20_kitchen_sink_v2.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/mega01_book_chapter.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/mega02_research_proposal.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/mega03_financial_statement.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/mega04_recipe_card.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/mega05_user_manual.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/mega06_complex_newsletter.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/mega07_budget_spreadsheet.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/mega08_product_catalog.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/mega09_signed_contract.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/mega10_api_documentation.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/rw01_official_quickstart.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/rw02_paragraph_style_list.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/rw03_character_formatting.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/rw04_section_page_setup.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/rw05_toc_pattern.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/rw06_meeting_minutes.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/rw07_dense_formatting_demo.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/rw08_table_merged_header.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/rw09_bulk_run_iteration.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/rw10_colored_grid_table.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/rw11_header_text.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/rw12_first_page_footer.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/rw13_even_page_header.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/op_snapshots/rw15_paragraph_style_instance.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/ours_spec.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/parity_crawl.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/parity_diff.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/real_world_cases.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/round_trip_tests.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/stock_spec.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/test_e2e_against_staging.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/parity/README.md +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/parity/__init__.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/parity/baseline_gaps.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/parity/compare.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/parity/intentional_deviations.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/parity/introspect.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/parity/reports/GAP_ANALYSIS.md +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/parity/reports/gap_report.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/parity/run_parity.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/parity/snapshots/athena_latest.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/parity/snapshots/upstream_python_docx_1.2.0.json +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/parity/test_parity_gap.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_add_section_extract_items.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_athena_extensions_contract.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_athena_extensions_registry.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_batching_perf.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_block_not_found_error.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_buffer.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_cell_add_paragraph_wire_shape.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_cell_add_table_not_supported.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_cell_fastpath_runs.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_cell_inner_add_hyperlink_stash.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_cell_inner_add_run_via_cell_insert.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_cell_inner_format_stash.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_cell_inner_run_format_stash.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_cell_inner_run_guard.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_cell_text_plain_fastpath.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_cell_text_replace_semantics.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_citations.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_collapsed_range_format.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_command_dataclasses.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_commands.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_comments.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_document_asset_id_property.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_document_clear.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_document_create.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_document_create_from_template.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_document_factory_validation.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_docx_exec_lab.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_docx_exec_lab_server.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_e2e_partial_failure_cascade.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_execution_scope.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_http_transport.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_hyperlink_coalescing.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_image_url_data_uri.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_insert_deferred.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_iter_inner_content.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_list_styles.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_merged_cell_secondary_slot.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_merged_cells.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_oxml_shim.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_paragraph_text_len_cache.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_parity_misc.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_parity_round2.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_partial_failure_cascade.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_phase_a_behavior.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_phase_b_headers_footers.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_phase_c_tables.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_positional_cell_id.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_postproc_cell_format_rewrite.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_postproc_cell_run_format_rewrite.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_postproc_ref_restore.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_pr19766_review_fixes.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_ptc.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_python_docx_api_parity.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_revisions.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_add_paragraph_style.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_add_picture.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_add_run.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_cell_add_paragraph.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_comments_add_comment.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_comments_get.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_document_audit.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_document_element.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_enum_section.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_font_audit.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_header_footer.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_hyperlink.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_inline_shape.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_insert_paragraph_before.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_misc.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_paragraph_strict.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_paragraph_style.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_paragraph_style_strict.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_parfmt.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_row_col_cell.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_run_add_break.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_run_bool_setters.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_run_style.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_run_style_strict.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_run_text.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_run_underline.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_section_audit.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_section_dimensions.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_section_onoff.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_settings.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_shared_audit.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_style.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_styles.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_table_audit.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_table_cell.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_table_dimensions.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_silent_stub_table_layout.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_smoke_integration.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_style_acceptance.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_style_font.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_style_setters_contract.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_table_set_cell_perf.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_table_style_id_resolution.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_temporarily_unavailable.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_validate_find_replace_asset_script.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_wire_contract.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_xml_attr_guard.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_zod_wire_contract.py +0 -0
- {athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: athena-python-docx
|
|
3
|
-
Version: 0.21.
|
|
3
|
+
Version: 0.21.7
|
|
4
4
|
Summary: Drop-in replacement for python-docx that connects to Athena's DOCX Studio collaborative document stack
|
|
5
5
|
Project-URL: Homepage, https://athenaintelligence.ai
|
|
6
6
|
Author-email: Athena Intelligence <engineering@athenaintelligence.ai>
|
|
@@ -1222,7 +1222,23 @@ class Document:
|
|
|
1222
1222
|
),
|
|
1223
1223
|
)
|
|
1224
1224
|
if isinstance(result, dict):
|
|
1225
|
-
|
|
1225
|
+
# Tolerate an older docx-studio deployment that returned only
|
|
1226
|
+
# ``{"matches": [...]}``. The SDK's public contract promises
|
|
1227
|
+
# ``count`` and ``truncated`` too; normalizing here prevents a
|
|
1228
|
+
# model script from crashing with ``KeyError: 'count'`` during a
|
|
1229
|
+
# rolling deploy. The server now supplies the true total count,
|
|
1230
|
+
# while this fallback can conservatively report the returned size.
|
|
1231
|
+
matches_obj: object = result.get("matches", [])
|
|
1232
|
+
matches: list[object] = matches_obj if isinstance(matches_obj, list) else []
|
|
1233
|
+
count_obj: object = result.get("count", len(matches))
|
|
1234
|
+
count: int = int(count_obj) if isinstance(count_obj, (int, float)) else len(matches)
|
|
1235
|
+
truncated_obj: object = result.get("truncated", count > len(matches))
|
|
1236
|
+
return {
|
|
1237
|
+
**result,
|
|
1238
|
+
"count": count,
|
|
1239
|
+
"matches": matches,
|
|
1240
|
+
"truncated": bool(truncated_obj),
|
|
1241
|
+
}
|
|
1226
1242
|
return {"count": 0, "matches": [], "truncated": False}
|
|
1227
1243
|
|
|
1228
1244
|
@athena_extension(
|
|
@@ -1477,8 +1477,9 @@ class _Cell:
|
|
|
1477
1477
|
|
|
1478
1478
|
def _cell_info_at(self, row: int, col: int) -> dict | None:
|
|
1479
1479
|
"""Raw ``tables.getCells`` for (row, col). Returns ``None`` when
|
|
1480
|
-
DOCX Studio reports no cell at that grid position
|
|
1481
|
-
|
|
1480
|
+
DOCX Studio reports no cell at that grid position. Current servers
|
|
1481
|
+
resolve a secondary slot covered by a colspan to its master cell;
|
|
1482
|
+
older servers returned ``None`` for that case."""
|
|
1482
1483
|
nid: str = self._table._fresh_node_id()
|
|
1483
1484
|
result: object = run_sync(
|
|
1484
1485
|
self._table._session.doc.tables.get_cells(
|
|
@@ -1500,8 +1501,8 @@ class _Cell:
|
|
|
1500
1501
|
def _cell_info(self) -> dict | None:
|
|
1501
1502
|
"""Return the cell info backing ``(self._row, self._col)``.
|
|
1502
1503
|
|
|
1503
|
-
When ``self`` is the secondary slot of a horizontal merge,
|
|
1504
|
-
DOCX Studio
|
|
1504
|
+
When ``self`` is the secondary slot of a horizontal merge, older
|
|
1505
|
+
DOCX Studio deployments return an empty cell list (only the master is
|
|
1505
1506
|
addressable by its top-left position). Mirror python-docx's
|
|
1506
1507
|
``_Cell``-on-merge semantics by walking back along the row to
|
|
1507
1508
|
find the first cell whose ``colspan`` covers our grid column,
|
|
@@ -668,12 +668,27 @@ class Run:
|
|
|
668
668
|
h_px: float = _emu_to_px(h_emu)
|
|
669
669
|
w_pt: float = w_emu / 12700.0
|
|
670
670
|
h_pt: float = h_emu / 12700.0
|
|
671
|
+
# Anchor inside this run's paragraph so the picture lands inline and
|
|
672
|
+
# inherits the paragraph's alignment/spacing — python-docx semantics,
|
|
673
|
+
# where ``run.add_picture`` places the image in that run's paragraph.
|
|
674
|
+
# Cell-inner paragraphs keep the legacy document-end block: their
|
|
675
|
+
# blockIds are not addressable by the applier's selection resolver.
|
|
676
|
+
at: dict = {"kind": "documentEnd"}
|
|
677
|
+
if not getattr(self, "_in_cell", False) and self._block_id:
|
|
678
|
+
at = {
|
|
679
|
+
"kind": "selection",
|
|
680
|
+
"start": {
|
|
681
|
+
"kind": "text",
|
|
682
|
+
"blockId": self._block_id,
|
|
683
|
+
"offset": self._range[1],
|
|
684
|
+
},
|
|
685
|
+
}
|
|
671
686
|
result: object = run_sync(
|
|
672
687
|
self._session.doc.create.image(
|
|
673
688
|
{
|
|
674
689
|
"src": data_uri,
|
|
675
690
|
"size": {"width": w_px, "height": h_px},
|
|
676
|
-
"at":
|
|
691
|
+
"at": at,
|
|
677
692
|
},
|
|
678
693
|
),
|
|
679
694
|
)
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "athena-python-docx"
|
|
7
|
-
version = "0.21.
|
|
7
|
+
version = "0.21.7"
|
|
8
8
|
description = "Drop-in replacement for python-docx that connects to Athena's DOCX Studio collaborative document stack"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
@@ -56,3 +56,9 @@ markers = [
|
|
|
56
56
|
[tool.ruff]
|
|
57
57
|
line-length = 100
|
|
58
58
|
target-version = "py311"
|
|
59
|
+
|
|
60
|
+
[tool.ruff.lint]
|
|
61
|
+
# Keep the SDK's historical Ruff contract explicit. Ruff 0.16 expanded its
|
|
62
|
+
# implicit defaults, which otherwise turns an unpinned CI upgrade into hundreds
|
|
63
|
+
# of unrelated findings. Broader rule families should be adopted deliberately.
|
|
64
|
+
select = ["E4", "E7", "E9", "F"]
|
{athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/test_find_replace_session_open.py
RENAMED
|
@@ -231,3 +231,22 @@ def test_find_text_returns_server_context(fake_sd_methods: Any) -> None:
|
|
|
231
231
|
assert result["truncated"] is True
|
|
232
232
|
assert session.open.await_count == 1
|
|
233
233
|
assert session.send_command.await_count == 1
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
def test_find_text_normalizes_legacy_matches_only_response(
|
|
237
|
+
fake_sd_methods: Any,
|
|
238
|
+
) -> None:
|
|
239
|
+
"""Rolling deploys must not make ``result['count']`` raise KeyError."""
|
|
240
|
+
session = _make_unopened_session(fake_sd_methods)
|
|
241
|
+
session.send_command.return_value = {
|
|
242
|
+
"matches": [{"text": "Buyer"}, {"text": "Buyer"}],
|
|
243
|
+
}
|
|
244
|
+
doc = _make_unopened_document(session)
|
|
245
|
+
|
|
246
|
+
result = doc.find_text("Buyer")
|
|
247
|
+
|
|
248
|
+
assert result == {
|
|
249
|
+
"count": 2,
|
|
250
|
+
"matches": [{"text": "Buyer"}, {"text": "Buyer"}],
|
|
251
|
+
"truncated": False,
|
|
252
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"""``Run.add_picture`` anchors inside its own paragraph (python-docx parity).
|
|
2
|
+
|
|
3
|
+
The picture must land inline in the run's paragraph so it inherits that
|
|
4
|
+
paragraph's alignment and spacing. An unanchored ``documentEnd`` create makes
|
|
5
|
+
the applier wrap the image in a fresh left-aligned paragraph — so e.g. a
|
|
6
|
+
centered logo paragraph stays empty while the logo renders left-aligned in its
|
|
7
|
+
own block. Cell-inner runs and ``Document.add_picture`` keep the document-end
|
|
8
|
+
block form.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import base64
|
|
14
|
+
from typing import Any
|
|
15
|
+
|
|
16
|
+
# Minimal valid 1x1 PNG.
|
|
17
|
+
_PNG = bytes.fromhex(
|
|
18
|
+
"89504e470d0a1a0a0000000d49484452000000010000000108060000001f15c489"
|
|
19
|
+
"0000000a49444154789c6360000002000154a24f5e0000000049454e44ae426082"
|
|
20
|
+
)
|
|
21
|
+
_PNG_URI = f"data:image/png;base64,{base64.b64encode(_PNG).decode()}"
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _image_call(fake_sd_methods: Any) -> dict:
|
|
25
|
+
return next(c for c in fake_sd_methods.calls if c[0] == "create.image")[1]
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def test_run_add_picture_anchors_in_its_paragraph(
|
|
29
|
+
mock_session: Any, fake_sd_methods: Any
|
|
30
|
+
) -> None:
|
|
31
|
+
from docx.text.run import Run
|
|
32
|
+
|
|
33
|
+
run = Run(session=mock_session, block_id="p-42", range_=(0, 11))
|
|
34
|
+
run.add_picture(_PNG_URI)
|
|
35
|
+
params = _image_call(fake_sd_methods)
|
|
36
|
+
assert params["at"] == {
|
|
37
|
+
"kind": "selection",
|
|
38
|
+
"start": {"kind": "text", "blockId": "p-42", "offset": 11},
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def test_cell_inner_run_add_picture_keeps_document_end(
|
|
43
|
+
mock_session: Any, fake_sd_methods: Any
|
|
44
|
+
) -> None:
|
|
45
|
+
# Cell-inner paragraphs are not addressable by the applier's selection
|
|
46
|
+
# resolver — a blockId anchor would abort the whole batch.
|
|
47
|
+
from docx.text.run import Run
|
|
48
|
+
|
|
49
|
+
run = Run(session=mock_session, block_id="tc:0:0:0", range_=(0, 0), in_cell=True)
|
|
50
|
+
run.add_picture(_PNG_URI)
|
|
51
|
+
assert _image_call(fake_sd_methods)["at"] == {"kind": "documentEnd"}
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def test_document_add_picture_keeps_document_end(
|
|
55
|
+
mock_session: Any, fake_sd_methods: Any
|
|
56
|
+
) -> None:
|
|
57
|
+
# python-docx parity: Document.add_picture appends a new paragraph holding
|
|
58
|
+
# the picture, so the block-creating document-end form is correct there.
|
|
59
|
+
from docx.document import Document as DocClass
|
|
60
|
+
|
|
61
|
+
doc = DocClass.__new__(DocClass)
|
|
62
|
+
doc._session = mock_session
|
|
63
|
+
doc._saved = False
|
|
64
|
+
doc._closed = False
|
|
65
|
+
doc._pending_user_name = None
|
|
66
|
+
doc._pending_user_email = None
|
|
67
|
+
doc._pending_track_revisions = False
|
|
68
|
+
doc.add_picture(_PNG_URI)
|
|
69
|
+
assert _image_call(fake_sd_methods)["at"] == {"kind": "documentEnd"}
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/scripts/smoke_test_block_not_found.py
RENAMED
|
File without changes
|
{athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/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.21.5 → athena_python_docx-0.21.7}/tests/fidelity/firm_templates/README.md
RENAMED
|
File without changes
|
{athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/firm_templates/__init__.py
RENAMED
|
File without changes
|
{athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/tests/fidelity/firm_templates/_runner.py
RENAMED
|
File without changes
|
{athena_python_docx-0.21.5 → athena_python_docx-0.21.7}/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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|