athena-python-docx 0.17.0__tar.gz → 0.18.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/PKG-INFO +1 -1
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/__init__.py +1 -1
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/document.py +10 -2
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/text/run.py +29 -5
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/pyproject.toml +1 -1
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/fake_session.py +9 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_cell_inner_run_format_stash.py +79 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_iter_inner_content.py +25 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/.gitignore +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/CLAUDE.md +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/DOCX_EXEC_LAB.md +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/README.md +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/_athena_extension.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/_batching.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/_buffer.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/_execution.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/_http.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/_http_doc.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/_image_utils.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/_postproc.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/_ptc.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/_table_styles.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/_timeouts.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/api.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/bookmarks.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/charts.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/client.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/commands.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/comments.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/enum/__init__.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/enum/section.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/enum/style.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/enum/table.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/enum/text.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/errors.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/exceptions.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/fields.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/footnotes.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/math.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/opc/__init__.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/opc/coreprops.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/oxml/__init__.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/revisions.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/sdt.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/section.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/session.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/settings.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/shape.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/shared.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/styles/__init__.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/styles/style.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/styles/styles.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/table.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/text/__init__.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/text/font.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/text/hyperlink.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/text/pagebreak.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/text/paragraph.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/text/parfmt.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/text/tabstops.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/toc.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/docx/typing.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/scripts/docx_exec_lab.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/scripts/docx_exec_lab_examples/fast_table_fill.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/scripts/docx_exec_lab_examples/find_replace_literal.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/scripts/docx_exec_lab_server.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/scripts/publish.sh +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/scripts/release.sh +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/scripts/round_trip_smoke.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/scripts/smoke_test_block_not_found.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/scripts/validate_find_replace_asset.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/__init__.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/conftest.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/METHODOLOGY.md +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/README.md +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/__init__.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/ab_probe_cases.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/ab_probe_runner.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/auto_gen_cases.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/binary_round_trip.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/cases.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/complex_cases.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/coverage_report.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/extract.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/extreme_cases.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/firm_templates/README.md +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/firm_templates/__init__.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/firm_templates/_runner.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/firm_templates/extractor.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/firm_templates/test_pw_corpus.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/firm_templates/test_pw_research_digest.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/local_runner.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/mega_cases.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshot.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/01_basic_paragraph.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/02_multiple_headings.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/03_runs_with_formatting.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/04_font_name_and_size.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/05_font_color_rgb.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/06_font_character_properties.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/07_font_subscript_superscript.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/08_font_highlight.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/09_paragraph_alignment.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/100_table_negative_indexing.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/101_table_cells_flat_iteration.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/102_text_with_embedded_special_chars.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/104_core_properties_datetime.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/105_default_one_section.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/106_heading_paragraph_format.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/107_varying_row_heights.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/10_paragraph_indents.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/11_paragraph_spacing.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/12_paragraph_keep_options.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/13_paragraph_tab_stops.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/14_run_add_tab_and_break.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/15_run_add_break_page.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/16_paragraph_clear_and_insert_before.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/17_table_basic.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/18_table_cell_text.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/19_table_row_column_sizing.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/20_table_cell_vertical_alignment.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/21_table_alignment_and_autofit.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/22_table_cell_paragraphs_iteration.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/24_table_add_row_column.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/25_table_merge_cells.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/26_section_page_setup.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/27_section_margins.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/28_section_add_new.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/29_section_headers_linked.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/30_styles_iteration.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/31_styles_lookup_and_default.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/32_styles_add_paragraph_style.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/33_core_properties_set_and_get.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/34_inline_shapes_iterate_empty.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/35_full_report.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/36_replace_text_in_paragraph.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/37_iterate_runs_and_format_all_bold.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/38_font_all_properties.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/39_large_body_100_paragraphs.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/40_large_table_10x10.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/41_unicode_and_emoji.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/42_very_long_paragraph.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/43_paragraph_text_round_trip.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/44_paragraph_alignment_round_trip.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/45_cell_text_round_trip.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/46_run_text_setter_round_trip.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/47_font_size_round_trip.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/48_font_color_round_trip.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/49_resume_layout.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/50_multi_section_doc.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/52_iterate_everything.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/53_apply_style_to_paragraphs.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/54_empty_everything.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/55_single_character_runs.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/56_everything_in_one.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/57_runs_after_multiple_text_appends.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/58_modify_runs_in_place.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/59_indent_round_trip.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/60_space_round_trip.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/61_cell_paragraph_with_runs.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/62_many_cell_paragraphs.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/63_table_style_round_trip.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/64_many_sections.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/65_20x20_table_formatted.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/66_toc_like_structure.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/67_paragraph_insert_before_chain.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/68_invoice.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/69_newsletter.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/70_add_and_iterate_back.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/71_academic_paper.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/72_legal_contract.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/73_form_with_many_tables.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/74_paragraph_with_10_runs.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/75_paragraph_negative_first_line_indent.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/76_rgbcolor_from_string.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/77_length_unit_conversions.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/78_paragraph_copy_style.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/79_bulk_cell_formatting.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/80_apply_style_after_add_run.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/81_multi_page_with_breaks.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/82_add_text_on_existing_run.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/83_clear_then_repopulate_paragraph.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/84_table_reread_row_count.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/85_header_footer_access.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/86_font_read_unset_returns_none.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/87_500_paragraph_doc.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/88_mixed_content_iteration.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/89_alignment_clear_via_none.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/90_cell_add_paragraph_styled.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/91_many_small_tables.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/92_margins_every_section.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/93_font_bool_reads_after_set.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/94_page_break_before_paragraph.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/95_paragraph_hyperlinks_empty.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/96_paragraph_contains_page_break.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/97_document_styles_by_key.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/98_style_contains_check.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/99_run_add_picture_from_bytes.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/ex02_unicode_everywhere.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/ex03_1000_paragraphs.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/ex04_50x50_table.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/ex05_long_text_in_cell.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/ex06_hundred_tiny_runs.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/ex07_every_font_boolean.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/ex08_many_continuous_sections.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/ex09_many_tab_stops.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/ex10_complex_bom.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/ex11_banded_rows_formatting.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/ex12_section_reconfigure.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/ex13_cell_with_10_paragraphs.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/ex14_styled_report_table.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/ex15_paragraph_all_format_props.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/ex16_runs_interleaved_with_breaks.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/ex17_all_break_kinds.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/ex18_read_back_large_doc.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/ex19_mutate_all_runs.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/ex20_kitchen_sink_v2.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/mega01_book_chapter.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/mega02_research_proposal.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/mega03_financial_statement.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/mega04_recipe_card.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/mega05_user_manual.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/mega06_complex_newsletter.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/mega07_budget_spreadsheet.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/mega08_product_catalog.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/mega09_signed_contract.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/mega10_api_documentation.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/rw01_official_quickstart.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/rw02_paragraph_style_list.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/rw03_character_formatting.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/rw04_section_page_setup.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/rw05_toc_pattern.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/rw06_meeting_minutes.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/rw07_dense_formatting_demo.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/rw08_table_merged_header.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/rw09_bulk_run_iteration.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/rw10_colored_grid_table.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/rw11_header_text.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/rw12_first_page_footer.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/rw13_even_page_header.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/op_snapshots/rw15_paragraph_style_instance.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/ours_spec.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/parity_crawl.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/parity_diff.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/real_world_cases.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/round_trip_tests.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/runner.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/stock_spec.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/test_e2e_against_staging.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/parity/README.md +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/parity/__init__.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/parity/baseline_gaps.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/parity/compare.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/parity/intentional_deviations.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/parity/introspect.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/parity/reports/GAP_ANALYSIS.md +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/parity/reports/gap_report.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/parity/run_parity.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/parity/snapshots/athena_latest.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/parity/snapshots/upstream_python_docx_1.2.0.json +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/parity/test_parity_gap.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_add_section_extract_items.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_athena_extensions_contract.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_athena_extensions_registry.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_batching_perf.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_block_not_found_error.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_buffer.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_cell_add_paragraph_wire_shape.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_cell_add_table_not_supported.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_cell_inner_add_hyperlink_stash.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_cell_inner_add_run_via_cell_insert.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_cell_inner_format_stash.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_cell_inner_run_guard.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_cell_text_plain_fastpath.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_cell_text_replace_semantics.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_collapsed_range_format.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_command_dataclasses.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_commands.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_comments.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_document_asset_id_property.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_document_clear.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_document_create.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_document_create_from_template.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_document_factory_validation.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_docx_exec_lab.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_docx_exec_lab_server.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_e2e_partial_failure_cascade.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_execution_scope.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_find_replace_session_open.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_http_transport.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_hyperlink_coalescing.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_image_url_data_uri.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_insert_deferred.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_list_styles.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_merged_cell_secondary_slot.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_merged_cells.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_oxml_shim.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_paragraph_text_len_cache.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_parity_misc.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_parity_round2.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_partial_failure_cascade.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_phase_a_behavior.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_phase_b_headers_footers.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_phase_c_tables.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_postproc_cell_format_rewrite.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_postproc_cell_run_format_rewrite.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_postproc_ref_restore.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_pr19766_review_fixes.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_ptc.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_python_docx_api_parity.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_revisions.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_add_paragraph_style.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_add_picture.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_add_run.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_cell_add_paragraph.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_comments_add_comment.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_comments_get.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_document_audit.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_document_element.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_enum_section.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_font_audit.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_header_footer.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_hyperlink.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_inline_shape.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_insert_paragraph_before.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_misc.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_paragraph_strict.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_paragraph_style.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_paragraph_style_strict.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_parfmt.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_row_col_cell.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_run_add_break.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_run_bool_setters.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_run_style.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_run_style_strict.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_run_text.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_run_underline.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_section_audit.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_section_dimensions.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_section_onoff.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_settings.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_shared_audit.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_style.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_styles.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_table_audit.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_table_cell.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_table_dimensions.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_silent_stub_table_layout.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_smoke_integration.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_style_acceptance.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_style_font.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_style_setters_contract.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_table_set_cell_perf.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_table_style_id_resolution.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_temporarily_unavailable.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_validate_find_replace_asset_script.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_wire_contract.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_xml_attr_guard.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_zod_wire_contract.py +0 -0
- {athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: athena-python-docx
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.18.0
|
|
4
4
|
Summary: Drop-in replacement for python-docx that connects to Athena's Superdoc/Keryx collaborative document stack
|
|
5
5
|
Project-URL: Homepage, https://athenaintelligence.ai
|
|
6
6
|
Author-email: Athena Intelligence <engineering@athenaintelligence.ai>
|
|
@@ -386,10 +386,18 @@ class Document:
|
|
|
386
386
|
for b in blocks:
|
|
387
387
|
if not isinstance(b, dict):
|
|
388
388
|
continue
|
|
389
|
+
nt_raw = b.get("nodeType")
|
|
390
|
+
nt: str = nt_raw if isinstance(nt_raw, str) and nt_raw else "paragraph"
|
|
391
|
+
# Tables belong to ``Document.tables``, never ``Document.paragraphs``
|
|
392
|
+
# (python-docx parity). The server honors the ``nodeTypes`` filter,
|
|
393
|
+
# but defend against an unfiltered response too: skip table blocks so
|
|
394
|
+
# they never surface here as Paragraph proxies (each would otherwise
|
|
395
|
+
# cost 3 live reads in a paragraph loop). Denylist, not allowlist, so
|
|
396
|
+
# we don't drop paragraph-like types we don't explicitly know.
|
|
397
|
+
if nt == "table":
|
|
398
|
+
continue
|
|
389
399
|
node_id: str = str(b.get("nodeId", ""))
|
|
390
400
|
if node_id:
|
|
391
|
-
nt_raw = b.get("nodeType")
|
|
392
|
-
nt: str = nt_raw if isinstance(nt_raw, str) and nt_raw else "paragraph"
|
|
393
401
|
# Seed the read cache when the server inlined this block's runs.
|
|
394
402
|
# The snapshot is ``get_node_by_id``-shaped so
|
|
395
403
|
# ``Paragraph._node_info`` and the text/runs/style getters consume
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import re
|
|
5
6
|
from typing import TYPE_CHECKING, Any, BinaryIO
|
|
6
7
|
|
|
7
8
|
from docx._athena_extension import athena_extension
|
|
@@ -9,6 +10,14 @@ from docx._batching import run_sync
|
|
|
9
10
|
from docx.enum.text import WD_BREAK
|
|
10
11
|
from docx.shared import Length, Pt, RGBColor # noqa: F401
|
|
11
12
|
|
|
13
|
+
# docx-editor addresses cell-inner paragraphs by the cell's synthetic id
|
|
14
|
+
# (``tc:tableIndex:row:col``) because cell paragraphs carry no paraId. Its
|
|
15
|
+
# applier routes a ``FormatApply`` against such an id to a positional
|
|
16
|
+
# whole-cell mark, so cell-inner run formatting can apply live. SuperDoc cell
|
|
17
|
+
# ids are not ``tc:``-shaped, so this discriminator leaves the SuperDoc
|
|
18
|
+
# warn-and-skip path (post-export OOXML rewrite only) untouched.
|
|
19
|
+
_DOCX_EDITOR_CELL_ID_RE = re.compile(r"^tc:\d+:\d+:\d+$")
|
|
20
|
+
|
|
12
21
|
|
|
13
22
|
class PendingBreakDegradationWarning(UserWarning):
|
|
14
23
|
"""Emitted when ``Run.add_break`` is called with a break type that
|
|
@@ -970,12 +979,27 @@ class Run:
|
|
|
970
979
|
# has text — see ``_pending_inline`` in ``__init__`` for the
|
|
971
980
|
# python-docx parity rationale.
|
|
972
981
|
if getattr(self, "_in_cell", False):
|
|
973
|
-
#
|
|
974
|
-
#
|
|
975
|
-
#
|
|
976
|
-
#
|
|
977
|
-
# the formatting still lands in the exported ``.docx``.
|
|
982
|
+
# Stash for the post-export OOXML rewrite FIRST so the formatting
|
|
983
|
+
# lands in the exported ``.docx`` regardless of engine (and is the
|
|
984
|
+
# only path on the legacy SuperDoc engine, which rejects
|
|
985
|
+
# ``doc.format.apply`` for paragraphs nested inside ``tableCell``).
|
|
978
986
|
self._stash_cell_inner_run_format(kwargs)
|
|
987
|
+
# docx-editor CAN apply cell-inner formatting live: it addresses
|
|
988
|
+
# the cell paragraph by the cell's synthetic id and routes a
|
|
989
|
+
# ``FormatApply`` against that id to a positional whole-cell mark.
|
|
990
|
+
# Ship it so collaborators see the change immediately instead of
|
|
991
|
+
# only at export. The ``tc:``-shape discriminator keeps the
|
|
992
|
+
# SuperDoc warn-and-skip path intact (its cell ids differ).
|
|
993
|
+
block_id = getattr(self, "_block_id", "")
|
|
994
|
+
if isinstance(block_id, str) and _DOCX_EDITOR_CELL_ID_RE.match(
|
|
995
|
+
block_id,
|
|
996
|
+
):
|
|
997
|
+
run_sync(
|
|
998
|
+
self._session.doc.format.apply(
|
|
999
|
+
{"target": self._text_range, "inline": kwargs},
|
|
1000
|
+
),
|
|
1001
|
+
)
|
|
1002
|
+
return
|
|
979
1003
|
self._check_cell_inner(
|
|
980
1004
|
"font/format (bold/italic/font.size/etc.)",
|
|
981
1005
|
)
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "athena-python-docx"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.18.0"
|
|
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"
|
|
@@ -121,6 +121,11 @@ class FakeDocState:
|
|
|
121
121
|
self.sections: list[_Section] = [_Section("sec_1")]
|
|
122
122
|
self.images: list[dict] = []
|
|
123
123
|
self.calls: list[tuple[str, dict]] = []
|
|
124
|
+
# When True, ``blocks.list`` ignores the requested ``nodeTypes`` and
|
|
125
|
+
# returns every block (tables included), simulating the docx-editor
|
|
126
|
+
# server before it honored the filter. Lets tests verify the SDK's own
|
|
127
|
+
# table denylist in ``Document.paragraphs``.
|
|
128
|
+
self.blocks_list_ignore_node_types: bool = False
|
|
124
129
|
|
|
125
130
|
def _new_id(self, prefix: str) -> str:
|
|
126
131
|
return f"{prefix}_{next(self._ids)}"
|
|
@@ -296,6 +301,10 @@ class FakeDocState:
|
|
|
296
301
|
|
|
297
302
|
if op == "blocks.list":
|
|
298
303
|
types = params.get("nodeTypes") or None
|
|
304
|
+
# Simulate the pre-fix docx-editor server that ignored the filter and
|
|
305
|
+
# returned every block (tables included), to exercise the SDK denylist.
|
|
306
|
+
if self.blocks_list_ignore_node_types:
|
|
307
|
+
types = None
|
|
299
308
|
include_runs = bool(params.get("includeRuns"))
|
|
300
309
|
out_blocks: list[dict] = []
|
|
301
310
|
for b in self.blocks:
|
{athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/test_cell_inner_run_format_stash.py
RENAMED
|
@@ -281,3 +281,82 @@ def test_paragraph_add_run_returns_run_carrying_cell_ooxml_address(
|
|
|
281
281
|
r = p.add_run("hello")
|
|
282
282
|
assert r._in_cell is True
|
|
283
283
|
assert r._cell_ooxml_address == (None, 5, 2, 1, 0)
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
# ---- docx-editor live-ship path (block_id is a `tc:` synthetic cell id) ----
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
def _make_docx_editor_cell_run(
|
|
290
|
+
mock_session: Any,
|
|
291
|
+
*,
|
|
292
|
+
cell_ooxml_address: tuple[int | None, int, int, int, int] | None = None,
|
|
293
|
+
) -> Any:
|
|
294
|
+
"""A cell-inner Run whose ``block_id`` is the docx-editor synthetic cell
|
|
295
|
+
id (``tc:table:row:col``) — the shape ``cell.paragraphs[].runs`` produce
|
|
296
|
+
on the docx-editor engine, where cell paragraphs have no paraId."""
|
|
297
|
+
from docx.text.run import Run
|
|
298
|
+
|
|
299
|
+
return Run(
|
|
300
|
+
session=mock_session,
|
|
301
|
+
block_id="tc:0:1:2",
|
|
302
|
+
range_=(0, 5),
|
|
303
|
+
in_cell=True,
|
|
304
|
+
cell_ooxml_address=cell_ooxml_address,
|
|
305
|
+
)
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
def test_docx_editor_cell_run_font_size_ships_format_apply_live(
|
|
309
|
+
mock_session: Any, fake_sd_methods: Any
|
|
310
|
+
) -> None:
|
|
311
|
+
"""On docx-editor, setting ``run.font.size`` on a cell-inner run ships a
|
|
312
|
+
live ``format.apply`` targeting the cell's synthetic id — no warn-and-skip.
|
|
313
|
+
The applier routes that target to a positional whole-cell mark."""
|
|
314
|
+
from docx.shared import Pt
|
|
315
|
+
|
|
316
|
+
with warnings.catch_warnings(record=True) as w:
|
|
317
|
+
warnings.simplefilter("always", CellInnerFormatNotSupportedWarning)
|
|
318
|
+
r = _make_docx_editor_cell_run(mock_session)
|
|
319
|
+
r.font.size = Pt(9)
|
|
320
|
+
warned = [
|
|
321
|
+
x for x in w if issubclass(x.category, CellInnerFormatNotSupportedWarning)
|
|
322
|
+
]
|
|
323
|
+
# No warn-and-skip on docx-editor — it applies live.
|
|
324
|
+
assert warned == []
|
|
325
|
+
format_apply_ops = [c for c in fake_sd_methods.calls if c[0] == "format.apply"]
|
|
326
|
+
assert len(format_apply_ops) == 1
|
|
327
|
+
_, params = format_apply_ops[0]
|
|
328
|
+
assert params["target"]["blockId"] == "tc:0:1:2"
|
|
329
|
+
assert params["target"]["range"] == {"start": 0, "end": 5}
|
|
330
|
+
assert params["inline"] == {"fontSize": 9.0}
|
|
331
|
+
|
|
332
|
+
|
|
333
|
+
def test_docx_editor_cell_run_bold_ships_format_apply_live(
|
|
334
|
+
mock_session: Any, fake_sd_methods: Any
|
|
335
|
+
) -> None:
|
|
336
|
+
r = _make_docx_editor_cell_run(mock_session)
|
|
337
|
+
with warnings.catch_warnings():
|
|
338
|
+
warnings.simplefilter("ignore", CellInnerFormatNotSupportedWarning)
|
|
339
|
+
r.bold = True
|
|
340
|
+
format_apply_ops = [c for c in fake_sd_methods.calls if c[0] == "format.apply"]
|
|
341
|
+
assert len(format_apply_ops) == 1
|
|
342
|
+
assert format_apply_ops[0][1]["inline"] == {"bold": True}
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
def test_docx_editor_cell_run_still_stashes_for_export_when_addressable(
|
|
346
|
+
mock_session: Any, fake_sd_methods: Any
|
|
347
|
+
) -> None:
|
|
348
|
+
"""When the parent table was created in-session (cell_ooxml_address set),
|
|
349
|
+
the run both ships live AND stashes for the post-export OOXML rewrite, so
|
|
350
|
+
``export_docx`` carries the formatting too."""
|
|
351
|
+
from docx.shared import Pt
|
|
352
|
+
|
|
353
|
+
ops = _attach_real_post_export_ops(mock_session)
|
|
354
|
+
r = _make_docx_editor_cell_run(mock_session, cell_ooxml_address=(None, 0, 1, 2, 0))
|
|
355
|
+
with warnings.catch_warnings():
|
|
356
|
+
warnings.simplefilter("ignore", CellInnerFormatNotSupportedWarning)
|
|
357
|
+
r.font.size = Pt(9)
|
|
358
|
+
# Live wire call shipped.
|
|
359
|
+
assert any(c[0] == "format.apply" for c in fake_sd_methods.calls)
|
|
360
|
+
# AND stashed for export fidelity.
|
|
361
|
+
addr = CellAddress(table_doc_index=0, row=1, col=2, paragraph_index=0)
|
|
362
|
+
assert ops._cell_run_format_ops[addr]["font_size_pt"] == 9.0
|
|
@@ -133,6 +133,31 @@ def test_document_tables_uses_lightweight_block_listing() -> None:
|
|
|
133
133
|
assert not any(op == "find" and params == {"type": "table"} for op, params in calls)
|
|
134
134
|
|
|
135
135
|
|
|
136
|
+
def test_document_paragraphs_excludes_tables_even_if_server_unfiltered() -> None:
|
|
137
|
+
"""``Document.paragraphs`` must never return tables (python-docx parity).
|
|
138
|
+
The docx-editor server now honors the ``nodeTypes`` filter, but the SDK also
|
|
139
|
+
denylists table blocks defensively — verified here by simulating the pre-fix
|
|
140
|
+
server that returned every block regardless of the requested ``nodeTypes``."""
|
|
141
|
+
install_fake_session()
|
|
142
|
+
from docx import Document
|
|
143
|
+
from docx.text.paragraph import Paragraph
|
|
144
|
+
|
|
145
|
+
doc = Document("asset_fake")
|
|
146
|
+
doc.add_paragraph("Body one")
|
|
147
|
+
doc.add_paragraph("Body two")
|
|
148
|
+
doc.add_table(rows=2, cols=2)
|
|
149
|
+
|
|
150
|
+
# Simulate the unfiltered docx-editor server (tables leak into the response).
|
|
151
|
+
doc._session.state().blocks_list_ignore_node_types = True
|
|
152
|
+
|
|
153
|
+
paras = doc.paragraphs
|
|
154
|
+
# Every returned item is a Paragraph and NONE is a table block.
|
|
155
|
+
assert all(isinstance(p, Paragraph) for p in paras)
|
|
156
|
+
assert all(p._node_type != "table" for p in paras)
|
|
157
|
+
# Exactly the two body paragraphs — the table is excluded.
|
|
158
|
+
assert len(paras) == 2
|
|
159
|
+
|
|
160
|
+
|
|
136
161
|
def test_paragraph_iter_inner_content_yields_runs() -> None:
|
|
137
162
|
install_fake_session()
|
|
138
163
|
from docx import Document
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.17.0 → athena_python_docx-0.18.0}/scripts/smoke_test_block_not_found.py
RENAMED
|
File without changes
|
{athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/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
|
{athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/firm_templates/README.md
RENAMED
|
File without changes
|
{athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/firm_templates/__init__.py
RENAMED
|
File without changes
|
{athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/tests/fidelity/firm_templates/_runner.py
RENAMED
|
File without changes
|
{athena_python_docx-0.17.0 → athena_python_docx-0.18.0}/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
|