athena-python-docx 0.41.0__tar.gz → 0.42.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.41.0 → athena_python_docx-0.42.0}/AGENTS.md +54 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/PKG-INFO +1 -1
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/__init__.py +1 -1
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/styles/_table.py +67 -7
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/pyproject.toml +1 -1
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/fake_session.py +5 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/live/fixture_scripts.py +41 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/parity/intentional_deviations.json +48 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_run_table_style_objects.py +58 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/uv.lock +1 -1
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/.gitignore +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/CLAUDE.md +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/DOCX_EXEC_LAB.md +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/README.md +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/_athena_extension.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/_batching.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/_buffer.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/_capabilities.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/_citations.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/_execution.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/_http.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/_http_doc.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/_image_utils.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/_postproc.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/_proxy.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/_ptc.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/_references.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/_run_order.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/_table_styles.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/_timeouts.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/_tracked.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/_xml_text.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/api.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/blkcntnr.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/bookmarks.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/charts.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/client.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/commands.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/comments.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/document.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/drawing/__init__.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/enum/__init__.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/enum/base.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/enum/dml.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/enum/section.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/enum/shape.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/enum/style.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/enum/table.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/enum/text.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/errors.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/exceptions.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/fields.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/footnotes.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/image/__init__.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/image/exceptions.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/image/image.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/math.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/opc/__init__.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/opc/coreprops.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/oxml/__init__.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/revisions.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/sdt.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/section.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/session.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/settings.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/shape.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/shared.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/styles/__init__.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/styles/latent.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/styles/style.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/styles/styles.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/table.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/text/__init__.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/text/font.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/text/hyperlink.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/text/pagebreak.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/text/paragraph.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/text/parfmt.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/text/run.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/text/tabstops.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/toc.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/docx/typing.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/scripts/docx_exec_lab.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/scripts/docx_exec_lab_examples/fast_table_fill.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/scripts/docx_exec_lab_examples/find_replace_literal.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/scripts/docx_exec_lab_server.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/scripts/dump_wire_fixtures.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/scripts/release.sh +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/scripts/round_trip_smoke.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/scripts/smoke_test_block_not_found.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/scripts/validate_find_replace_asset.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/__init__.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/conftest.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/METHODOLOGY.md +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/README.md +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/__init__.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/ab_probe/__init__.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/ab_probe/agent_documents.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/ab_probe/default_style_run_formatting.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/ab_probe/header_footer_pictures.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/ab_probe/less_used_writes.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/ab_probe/merged_cell_identity.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/ab_probe/paragraph_text_setter.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/ab_probe/picture_runs.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/ab_probe/proxy_equality.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/ab_probe/return_types.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/ab_probe/xml_incompatible_text.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/ab_probe/zero_and_negative_indents.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/ab_probe_cases.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/ab_probe_runner.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/auto_gen_cases.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/binary_round_trip.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/cases.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/complex_cases.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/coverage_report.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/extract.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/extreme_cases.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/firm_templates/README.md +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/firm_templates/__init__.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/firm_templates/_runner.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/firm_templates/extractor.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/firm_templates/test_pw_corpus.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/firm_templates/test_pw_research_digest.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/local_runner.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/mega_cases.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshot.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/01_basic_paragraph.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/02_multiple_headings.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/03_runs_with_formatting.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/04_font_name_and_size.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/05_font_color_rgb.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/06_font_character_properties.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/07_font_subscript_superscript.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/08_font_highlight.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/09_paragraph_alignment.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/100_table_negative_indexing.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/101_table_cells_flat_iteration.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/102_text_with_embedded_special_chars.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/104_core_properties_datetime.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/105_default_one_section.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/106_heading_paragraph_format.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/107_varying_row_heights.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/10_paragraph_indents.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/11_paragraph_spacing.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/12_paragraph_keep_options.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/13_paragraph_tab_stops.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/14_run_add_tab_and_break.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/15_run_add_break_page.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/16_paragraph_clear_and_insert_before.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/17_table_basic.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/18_table_cell_text.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/19_table_row_column_sizing.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/20_table_cell_vertical_alignment.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/21_table_alignment_and_autofit.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/22_table_cell_paragraphs_iteration.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/24_table_add_row_column.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/25_table_merge_cells.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/26_section_page_setup.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/27_section_margins.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/28_section_add_new.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/29_section_headers_linked.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/30_styles_iteration.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/31_styles_lookup_and_default.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/32_styles_add_paragraph_style.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/33_core_properties_set_and_get.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/34_inline_shapes_iterate_empty.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/35_full_report.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/36_replace_text_in_paragraph.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/37_iterate_runs_and_format_all_bold.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/38_font_all_properties.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/39_large_body_100_paragraphs.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/40_large_table_10x10.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/41_unicode_and_emoji.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/42_very_long_paragraph.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/43_paragraph_text_round_trip.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/44_paragraph_alignment_round_trip.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/45_cell_text_round_trip.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/46_run_text_setter_round_trip.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/47_font_size_round_trip.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/48_font_color_round_trip.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/49_resume_layout.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/50_multi_section_doc.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/52_iterate_everything.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/53_apply_style_to_paragraphs.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/54_empty_everything.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/55_single_character_runs.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/56_everything_in_one.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/57_runs_after_multiple_text_appends.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/58_modify_runs_in_place.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/59_indent_round_trip.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/60_space_round_trip.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/61_cell_paragraph_with_runs.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/62_many_cell_paragraphs.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/63_table_style_round_trip.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/64_many_sections.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/65_20x20_table_formatted.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/66_toc_like_structure.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/67_paragraph_insert_before_chain.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/68_invoice.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/69_newsletter.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/70_add_and_iterate_back.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/71_academic_paper.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/72_legal_contract.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/73_form_with_many_tables.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/74_paragraph_with_10_runs.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/75_paragraph_negative_first_line_indent.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/76_rgbcolor_from_string.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/77_length_unit_conversions.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/78_paragraph_copy_style.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/79_bulk_cell_formatting.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/80_apply_style_after_add_run.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/81_multi_page_with_breaks.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/82_add_text_on_existing_run.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/83_clear_then_repopulate_paragraph.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/84_table_reread_row_count.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/85_header_footer_access.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/86_font_read_unset_returns_none.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/87_500_paragraph_doc.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/88_mixed_content_iteration.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/89_alignment_clear_via_none.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/90_cell_add_paragraph_styled.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/91_many_small_tables.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/92_margins_every_section.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/93_font_bool_reads_after_set.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/94_page_break_before_paragraph.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/95_paragraph_hyperlinks_empty.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/96_paragraph_contains_page_break.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/97_document_styles_by_key.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/98_style_contains_check.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/99_run_add_picture_from_bytes.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/ex02_unicode_everywhere.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/ex03_1000_paragraphs.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/ex04_50x50_table.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/ex05_long_text_in_cell.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/ex06_hundred_tiny_runs.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/ex07_every_font_boolean.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/ex08_many_continuous_sections.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/ex09_many_tab_stops.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/ex10_complex_bom.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/ex11_banded_rows_formatting.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/ex12_section_reconfigure.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/ex13_cell_with_10_paragraphs.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/ex14_styled_report_table.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/ex15_paragraph_all_format_props.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/ex16_runs_interleaved_with_breaks.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/ex17_all_break_kinds.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/ex18_read_back_large_doc.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/ex19_mutate_all_runs.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/ex20_kitchen_sink_v2.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/mega01_book_chapter.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/mega02_research_proposal.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/mega03_financial_statement.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/mega04_recipe_card.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/mega05_user_manual.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/mega06_complex_newsletter.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/mega07_budget_spreadsheet.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/mega08_product_catalog.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/mega09_signed_contract.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/mega10_api_documentation.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/rw01_official_quickstart.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/rw02_paragraph_style_list.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/rw03_character_formatting.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/rw04_section_page_setup.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/rw05_toc_pattern.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/rw06_meeting_minutes.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/rw07_dense_formatting_demo.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/rw08_table_merged_header.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/rw09_bulk_run_iteration.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/rw10_colored_grid_table.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/rw11_header_text.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/rw12_first_page_footer.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/rw13_even_page_header.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/rw15_paragraph_style_instance.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/rw16_header_footer_tables.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/rw17_header_letterhead_filled.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/rw18_header_table_properties.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/rw19_header_table_rows_columns.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/op_snapshots/rw20_header_table_merges.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/ours_spec.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/parity_crawl.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/parity_diff.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/real_world_cases.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/round_trip_tests.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/stock_spec.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fidelity/test_e2e_against_staging.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fixtures/field_reads.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fixtures/note_reference_reads.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fixtures/ruby_reads.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/fixtures/symbol_reads.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/live/__init__.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/live/baseline.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/live/reader.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/live/runner.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/live/sdk_driver.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/live/stock_driver.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/live/test_live_runner.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/parity/README.md +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/parity/__init__.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/parity/baseline_gaps.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/parity/compare.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/parity/introspect.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/parity/reports/GAP_ANALYSIS.md +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/parity/reports/gap_report.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/parity/run_parity.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/parity/snapshots/athena_latest.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/parity/snapshots/upstream_python_docx_1.2.0.json +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/parity/test_parity_gap.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_add_section.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_add_section_extract_items.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_alignment_values.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_athena_extension_creates_session_open.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_athena_extensions_contract.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_athena_extensions_registry.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_batch_chunking.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_batching_perf.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_battery_cases.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_block_not_found_error.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_buffer.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_cell_add_paragraph_wire_shape.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_cell_add_table_not_supported.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_cell_borders_spec.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_cell_fastpath_runs.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_cell_inner_add_hyperlink_stash.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_cell_inner_add_run_via_cell_insert.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_cell_inner_format_stash.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_cell_inner_run_format_stash.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_cell_inner_run_guard.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_cell_merge.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_cell_nested_tables.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_cell_paragraphs_listed.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_cell_text_plain_fastpath.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_cell_text_replace_semantics.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_citations.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_collapsed_range_format.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_color_format_theme.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_command_dataclasses.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_commands.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_comment_paragraphs.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_comments.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_comments_first_read.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_content_control_value.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_core_properties.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_document_asset_id_property.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_document_clear.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_document_create.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_document_create_from_template.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_document_factory_validation.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_document_settings_session_open.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_docx_exec_lab.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_docx_exec_lab_server.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_drawing_image.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_e2e_partial_failure_cascade.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_empty_hyperlinks.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_enum_parity.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_execution_scope.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_export_docx_clean.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_export_rescue_anchors.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_field_reads_python_docx_parity.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_field_refresh.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_field_runs.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_find_replace_session_open.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_flushed_write_failures.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_http_transport.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_hyperlink_coalescing.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_image_url_data_uri.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_inline_page_break.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_inline_shape_alt_text.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_inline_shape_size.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_inline_shape_type.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_inline_shapes_floating.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_insert_deferred.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_iter_inner_content.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_latent_style_writes.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_line_clear_break.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_list_styles.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_listed_paragraph_reads.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_literal_no_break_hyphens.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_literal_soft_hyphens.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_merged_cell_identity.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_merged_cell_secondary_slot.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_merged_cells.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_missing_modules.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_nested_table_refused.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_note_reference_reads_python_docx_parity.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_oxml_shim.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_page_break.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_paragraph_delete.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_paragraph_indent_reads.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_paragraph_runs_hyperlinks.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_paragraph_text_empty_run.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_paragraph_text_len_cache.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_parfmt_clears.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_parity_misc.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_parity_round2.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_partial_failure_cascade.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_pdf_export_and_page_renders.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_phase_a_behavior.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_phase_b_headers_footers.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_phase_c_tables.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_positional_cell_id.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_postproc_cell_format_rewrite.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_postproc_cell_run_format_rewrite.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_postproc_ref_restore.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_pr19766_review_fixes.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_proxy_equality.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_ptc.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_python_docx_api_parity.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_read_run_ranges.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_rendered_page_breaks.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_repeated_node_read.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_restart_numbering.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_revisions.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_round_trip_smoke_script.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_ruby_reads_python_docx_parity.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_run_add_picture_anchor.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_run_break_inner_content.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_run_edges.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_run_formatting_wire.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_run_identity.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_run_later_runs.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_run_mark_inheritance.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_run_page_number_blocks.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_run_text_python_docx.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_run_text_refreshes_paragraph.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_run_unmodeled_toggles.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_sdk_reads_served.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_section_read_lengths.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_sections_empty_list.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_add_paragraph_style.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_add_picture.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_add_run.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_cell_add_paragraph.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_comments_add_comment.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_comments_get.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_document_audit.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_document_element.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_enum_section.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_font_audit.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_header_footer.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_hyperlink.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_inline_shape.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_insert_paragraph_before.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_misc.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_paragraph_strict.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_paragraph_style.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_paragraph_style_strict.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_parfmt.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_row_col_cell.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_run_add_break.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_run_bool_setters.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_run_style.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_run_style_strict.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_run_text.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_run_underline.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_section_audit.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_section_dimensions.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_section_onoff.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_settings.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_shared_audit.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_style.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_styles.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_table_audit.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_table_cell.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_table_dimensions.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_silent_stub_table_layout.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_smoke_integration.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_style_acceptance.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_style_delete.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_style_font.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_style_formatting_writes.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_style_metadata_writes.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_style_names.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_style_resolution.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_style_setters_contract.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_style_tab_stops.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_style_tab_stops_read.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_symbol_reads_python_docx_parity.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_tab_stop_writes.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_table_add_row_grid_row.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_table_anchors.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_table_clears.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_table_direction.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_table_length_reads.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_table_listing_reads.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_table_read_reuse.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_table_set_cell_perf.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_table_style_id_resolution.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_temporarily_unavailable.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_text_control_characters.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_tracked_revisions_offsets.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_unmapped_alignment_reads.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_uv_lock_version.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_validate_find_replace_asset_script.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_versioned_read_reuse.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_wire_contract.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_xml_attr_guard.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_xml_incompatible_text.py +0 -0
- {athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_zod_wire_contract.py +0 -0
|
@@ -1080,6 +1080,20 @@ architecture or a DOCX Studio constraint:
|
|
|
1080
1080
|
name the document lacks raises `KeyError` unless docx-studio holds Word's
|
|
1081
1081
|
definition of it (`BUILTIN_CHARACTER_STYLE_NAMES` in
|
|
1082
1082
|
`docx/styles/_table.py`: `"Strong"`, `"Intense Emphasis"`, `"Book Title"`…).
|
|
1083
|
+
A character style the uploaded file's runs name without defining it (a
|
|
1084
|
+
generator's links naming `Hyperlink`) reads as the default character
|
|
1085
|
+
style, as python-docx reads it, and the export leaves it undefined, so an
|
|
1086
|
+
unedited download is the file (owner decision, 2026-10-26, #46935 A2).
|
|
1087
|
+
The editor and the server's PDFs still draw those runs in Word's built-in
|
|
1088
|
+
style, blue and underlined. docx-studio records the import's list, and a
|
|
1089
|
+
format that gives a run one of those styles (`run.style = "Hyperlink"`):
|
|
1090
|
+
from then on the export defines it, as Word adds a style's definition when
|
|
1091
|
+
it is applied, and `Info`'s `undefinedRunStyleIds` no longer lists it, so
|
|
1092
|
+
every session reads its runs as the built-in; the SDK asks `Info` again
|
|
1093
|
+
after such a write. An edit in the editor that copies such a run (a paste,
|
|
1094
|
+
the format painter) leaves the style undefined. A room imported before
|
|
1095
|
+
the record (no `undefinedRunStyleIds`) reads them as the built-in and its
|
|
1096
|
+
export adds the definition, as before.
|
|
1083
1097
|
`Document.add_table(style=)` and `Paragraph.add_run(style=)` resolve the
|
|
1084
1098
|
style before creating anything, so a rejected style leaves the document
|
|
1085
1099
|
untouched; python-docx raises after adding the table or run to its
|
|
@@ -1258,6 +1272,30 @@ architecture or a DOCX Studio constraint:
|
|
|
1258
1272
|
changes; the owner may overrule it. Recorded in
|
|
1259
1273
|
`tests/parity/intentional_deviations.json` (`live_deviations`).
|
|
1260
1274
|
|
|
1275
|
+
- **The inner link of a nested link reads with its text.** A `w:hyperlink`
|
|
1276
|
+
inside another (the duplicate wrapper Word writes around a pasted link,
|
|
1277
|
+
each with a relationship of its own; 3 of 6,826 customer uploads) reads
|
|
1278
|
+
its inner link's runs in `Hyperlink.runs` / `text`, `Paragraph.text` and
|
|
1279
|
+
`iter_inner_content()`, as Word shows them; upstream reads only a link's
|
|
1280
|
+
own `w:r` children, so the inner text is invisible to it and
|
|
1281
|
+
`p.text = p.text.replace(...)` would delete it unseen. The same choice as
|
|
1282
|
+
inline wrappers and tracked changes. Owner decision, 2026-10-26 (#46935,
|
|
1283
|
+
A1). Recorded in `tests/parity/intentional_deviations.json`
|
|
1284
|
+
(`live_deviations`) with the synthetic fixture `hyperlinks-nested`.
|
|
1285
|
+
|
|
1286
|
+
- **An emoji written as `w16se:symEx` reads as its run's text.** Word 2016
|
|
1287
|
+
writes an emoji as the run's `mc:AlternateContent`: an `mc:Choice
|
|
1288
|
+
Requires="w16se"` holding `w16se:symEx` (its font and character), and an
|
|
1289
|
+
`mc:Fallback` holding a `w:t` of the emoji (1 of 6,826 customer uploads).
|
|
1290
|
+
`Run.text`, `iter_inner_content()` and the paragraph's text hold the emoji,
|
|
1291
|
+
as Word shows it; upstream reads only a run's own `w:t` children and reads
|
|
1292
|
+
`""`, so a script rewriting the paragraph would delete the emoji unseen.
|
|
1293
|
+
An edited paragraph's export writes the emoji in a plain `w:t`, without
|
|
1294
|
+
the `w16se:symEx` choice, so upstream then reads it there too. Owner
|
|
1295
|
+
decision, 2026-10-26 (#46935, A5). Recorded in
|
|
1296
|
+
`tests/parity/intentional_deviations.json` (`live_deviations`) with the
|
|
1297
|
+
synthetic fixture `symbols-emoji-alternate-content`.
|
|
1298
|
+
|
|
1261
1299
|
- **Two things a source writes that the model holds otherwise read as the
|
|
1262
1300
|
model holds them** (2026-10-22 SDK live parity run over 398 customer
|
|
1263
1301
|
documents). Each is recorded in
|
|
@@ -1434,6 +1472,22 @@ architecture or a DOCX Studio constraint:
|
|
|
1434
1472
|
exported file. Against a docx-studio that predates `fieldRun` reads, a
|
|
1435
1473
|
field reads as no runs and no text, as before (`tests/test_field_runs.py`).
|
|
1436
1474
|
|
|
1475
|
+
- **A header or footer run holding text beside a whole field reads as more
|
|
1476
|
+
runs.** A generator writes a page number as one `w:r` holding `Page ` and a
|
|
1477
|
+
`PAGE` field's begin, code, separate and end characters (1 of 6,826
|
|
1478
|
+
customer uploads). Upstream reads one run, `Page `. The import cuts that
|
|
1479
|
+
`w:r` into a run of the text and the field's own run (and a run of any text
|
|
1480
|
+
after the field; `RunParseOptions.cutRunsAtFields`), so the paragraph's
|
|
1481
|
+
text reads as upstream's and the editor and the server's PDFs draw it;
|
|
1482
|
+
before, the field took the whole run and the text was lost, from the reads
|
|
1483
|
+
and from an edited footer's export. `paragraph.runs` holds the extra runs,
|
|
1484
|
+
and an edited paragraph's export writes them as runs of their own: a
|
|
1485
|
+
cosmetic run split. A body run of that shape is still read the old way, as
|
|
1486
|
+
its room stores what its import read. Owner decision, 2026-10-26 (#46935,
|
|
1487
|
+
A4). Recorded in `tests/parity/intentional_deviations.json`
|
|
1488
|
+
(`live_deviations`) with the synthetic fixture
|
|
1489
|
+
`footers-text-and-field-one-run`.
|
|
1490
|
+
|
|
1437
1491
|
- **A run that holds a page number block refuses a tracked whole-run format
|
|
1438
1492
|
and two text writes.** A page number block (`w:pgNum`) reads as a run with
|
|
1439
1493
|
no text, and a run that holds text and blocks (or two blocks) reads as
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: athena-python-docx
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.42.0
|
|
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>
|
|
@@ -159,6 +159,15 @@ _latent: "weakref.WeakKeyDictionary[Any, dict[str, Any] | None]" = weakref.WeakK
|
|
|
159
159
|
#: Each session's paragraph style ids its document's source names without
|
|
160
160
|
#: defining them, as ``Info`` reports them (``undefinedStyleIds``).
|
|
161
161
|
_undefined: "weakref.WeakKeyDictionary[Any, frozenset[str]]" = weakref.WeakKeyDictionary()
|
|
162
|
+
#: Each session's character style ids the runs of its uploaded file name
|
|
163
|
+
#: without the file defining them and no write has given a run, as ``Info``
|
|
164
|
+
#: reports them (``undefinedRunStyleIds``; none from a room imported before the
|
|
165
|
+
#: record): the export leaves them undefined.
|
|
166
|
+
_undefined_runs: "weakref.WeakKeyDictionary[Any, frozenset[str]]" = weakref.WeakKeyDictionary()
|
|
167
|
+
#: Sessions whose script gave a run one of ``_undefined_runs``: docx-studio
|
|
168
|
+
#: records the write (the export defines the style from then on), so the next
|
|
169
|
+
#: read of such a style asks ``Info`` again, after the write.
|
|
170
|
+
_runs_restyled: "weakref.WeakSet[Any]" = weakref.WeakSet()
|
|
162
171
|
|
|
163
172
|
|
|
164
173
|
def _records(info: object) -> tuple[StyleRecord, ...] | None:
|
|
@@ -229,6 +238,12 @@ def style_table(session: Any) -> tuple[StyleRecord, ...] | None:
|
|
|
229
238
|
if isinstance(undefined_ids, list)
|
|
230
239
|
else frozenset()
|
|
231
240
|
)
|
|
241
|
+
undefined_run_ids: object = info.get("undefinedRunStyleIds") if isinstance(info, dict) else None
|
|
242
|
+
_undefined_runs[session] = (
|
|
243
|
+
frozenset(i for i in undefined_run_ids if isinstance(i, str))
|
|
244
|
+
if isinstance(undefined_run_ids, list)
|
|
245
|
+
else frozenset()
|
|
246
|
+
)
|
|
232
247
|
_stale.discard(session)
|
|
233
248
|
# A server that showed it writes styles still does once deletes leave its
|
|
234
249
|
# table without the entries that told: the signal holds for the session.
|
|
@@ -577,11 +592,15 @@ def style_of(
|
|
|
577
592
|
default style, else None.
|
|
578
593
|
|
|
579
594
|
A Word built-in the document does not define reads back as that built-in,
|
|
580
|
-
as ``style_id_for`` lets it be set
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
595
|
+
as ``style_id_for`` lets it be set; not a character style the runs of the
|
|
596
|
+
uploaded file already named without defining it and no write has given a
|
|
597
|
+
run (``Info``'s ``undefinedRunStyleIds``), which python-docx reads as the
|
|
598
|
+
default character style and the export leaves undefined. A document
|
|
599
|
+
without styles reads its defaults as Word's,
|
|
600
|
+
as python-docx's default ``styles.xml`` gives them. Without a style table:
|
|
601
|
+
the stored style as given, else Word's default. The style reads the
|
|
602
|
+
definition it was found as (its record), as python-docx's wraps that
|
|
603
|
+
``w:style``.
|
|
585
604
|
"""
|
|
586
605
|
from docx.styles.style import _style_of_record
|
|
587
606
|
|
|
@@ -592,7 +611,12 @@ def style_of(
|
|
|
592
611
|
name, style_id = builtin or (BabelFish.internal2ui(stored_style_id), stored_style_id)
|
|
593
612
|
return _new_style(session, name, style_id, style_type)
|
|
594
613
|
record = first_of_id(table or (), stored_style_id) if stored_style_id else None
|
|
595
|
-
if
|
|
614
|
+
if (
|
|
615
|
+
record is None
|
|
616
|
+
and builtin is not None
|
|
617
|
+
and _defined_builtin(style_type, builtin[1])
|
|
618
|
+
and not _file_left_undefined(session, stored_style_id, style_type)
|
|
619
|
+
):
|
|
596
620
|
return _new_style(session, *builtin, style_type)
|
|
597
621
|
if record is None or record.type != style_type:
|
|
598
622
|
record = default_style(table, style_type) if table else None
|
|
@@ -601,6 +625,39 @@ def style_of(
|
|
|
601
625
|
return _style_of_record(record, session)
|
|
602
626
|
|
|
603
627
|
|
|
628
|
+
def _file_left_undefined(session: Any, style_id: str | None, style_type: WD_STYLE_TYPE) -> bool:
|
|
629
|
+
"""Whether ``style_id`` is a character style the uploaded file's runs name
|
|
630
|
+
without the file defining it and no write has given a run, as ``Info``
|
|
631
|
+
reports them (``undefinedRunStyleIds``): python-docx reads such a run's
|
|
632
|
+
style as the default character style, and the export leaves the style
|
|
633
|
+
undefined. After the script gave a run one of them, ``Info`` is read again
|
|
634
|
+
first (it sends the write before it), so the answer is docx-studio's
|
|
635
|
+
record, as every later session reads it."""
|
|
636
|
+
if style_type != WD_STYLE_TYPE.CHARACTER or not style_id:
|
|
637
|
+
return False
|
|
638
|
+
try:
|
|
639
|
+
if session in _runs_restyled:
|
|
640
|
+
_runs_restyled.discard(session)
|
|
641
|
+
forget_style_table(session)
|
|
642
|
+
style_table(session)
|
|
643
|
+
return style_id in _undefined_runs.get(session, frozenset())
|
|
644
|
+
except TypeError:
|
|
645
|
+
return False
|
|
646
|
+
|
|
647
|
+
|
|
648
|
+
def _note_applied_run_style(session: Any, style_id: str | None, style_type: WD_STYLE_TYPE) -> None:
|
|
649
|
+
"""Note that the script gives a run ``style_id``, one the uploaded file's
|
|
650
|
+
runs name undefined: docx-studio records the write if it applies, so the
|
|
651
|
+
next read of such a style asks ``Info`` again."""
|
|
652
|
+
if style_type != WD_STYLE_TYPE.CHARACTER or not style_id:
|
|
653
|
+
return
|
|
654
|
+
try:
|
|
655
|
+
if style_id in _undefined_runs.get(session, frozenset()):
|
|
656
|
+
_runs_restyled.add(session)
|
|
657
|
+
except TypeError:
|
|
658
|
+
pass
|
|
659
|
+
|
|
660
|
+
|
|
604
661
|
def style_id_for(
|
|
605
662
|
session: Any,
|
|
606
663
|
style_or_name: object,
|
|
@@ -643,7 +700,10 @@ def style_id_for(
|
|
|
643
700
|
f"{owner} requires str, {kind} (with ``.style_id``/``.name``), or None; "
|
|
644
701
|
f"got {type(style_or_name).__name__} {style_or_name!r}",
|
|
645
702
|
)
|
|
646
|
-
|
|
703
|
+
if style_id == _document_default_style_id(session, style_type):
|
|
704
|
+
return None
|
|
705
|
+
_note_applied_run_style(session, style_id, style_type)
|
|
706
|
+
return style_id
|
|
647
707
|
|
|
648
708
|
|
|
649
709
|
def _style_id_of_name(session: Any, requested: str, style_type: WD_STYLE_TYPE) -> str:
|
|
@@ -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.42.0"
|
|
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"
|
|
@@ -140,6 +140,9 @@ class FakeDocState:
|
|
|
140
140
|
# The paragraph style ids the document's source names without defining
|
|
141
141
|
# them, as ``Info`` reports them beside the style table (``undefinedStyleIds``).
|
|
142
142
|
self.undefined_style_ids: list[str] | None = None
|
|
143
|
+
# The character style ids the uploaded file's runs name without defining
|
|
144
|
+
# them, as ``Info`` reports them beside the style table (``undefinedRunStyleIds``).
|
|
145
|
+
self.undefined_run_style_ids: list[str] | None = None
|
|
143
146
|
# What an older server's ``Info`` lists instead: the paragraph styles in use.
|
|
144
147
|
self.paragraph_styles_in_use: list[dict] = []
|
|
145
148
|
# ``docProps/core.xml`` as ``Info`` reports it (``includeCoreProperties``):
|
|
@@ -254,6 +257,8 @@ class FakeDocState:
|
|
|
254
257
|
info["latentStyles"] = self.latent_styles
|
|
255
258
|
if "styleTable" in info and self.undefined_style_ids is not None:
|
|
256
259
|
info["undefinedStyleIds"] = list(self.undefined_style_ids)
|
|
260
|
+
if "styleTable" in info and self.undefined_run_style_ids is not None:
|
|
261
|
+
info["undefinedRunStyleIds"] = list(self.undefined_run_style_ids)
|
|
257
262
|
if (params or {}).get("includeCoreProperties") and self.core_properties is not None:
|
|
258
263
|
info["coreProperties"] = dict(self.core_properties)
|
|
259
264
|
if self.core_properties_default:
|
|
@@ -417,6 +417,16 @@ FIXTURE_SCRIPTS: list[FixtureScript] = [
|
|
|
417
417
|
"caption.runs[4].italic = True\n"
|
|
418
418
|
),
|
|
419
419
|
),
|
|
420
|
+
FixtureScript(
|
|
421
|
+
# A run added to a footer paragraph whose one run holds "Page " and a
|
|
422
|
+
# whole PAGE field: python-docx appends a w:r after it; the SDK adds
|
|
423
|
+
# its run after the field, and the export writes the edited paragraph
|
|
424
|
+
# with the text, the field and the new run each a run of its own (the
|
|
425
|
+
# recorded run split, #46935 item A4), keeping "Page ".
|
|
426
|
+
name="fixture-footers-text-and-field-one-run-writes",
|
|
427
|
+
fixture="footers-text-and-field-one-run",
|
|
428
|
+
script=('doc.sections[0].footer.paragraphs[0].add_run(" (draft)")\n'),
|
|
429
|
+
),
|
|
420
430
|
FixtureScript(
|
|
421
431
|
# Run writes in a header whose style turns bold on and a footer whose
|
|
422
432
|
# fields are each written whole in one run, read back one `w:r` at a
|
|
@@ -711,6 +721,37 @@ FIXTURE_SCRIPTS: list[FixtureScript] = [
|
|
|
711
721
|
'last.header.paragraphs[0].add_run(" (revised)")\n'
|
|
712
722
|
),
|
|
713
723
|
),
|
|
724
|
+
FixtureScript(
|
|
725
|
+
# Runs added to the paragraphs that anchor a VML and a DrawingML text
|
|
726
|
+
# box whose text is not wrapped, and a paragraph added after them:
|
|
727
|
+
# python-docx writes the runs after the boxes' runs and keeps the
|
|
728
|
+
# boxes as they are, as does the SDK.
|
|
729
|
+
name="fixture-textboxes-no-wrap-writes",
|
|
730
|
+
fixture="textboxes-no-wrap",
|
|
731
|
+
script=(
|
|
732
|
+
'doc.paragraphs[0].add_run(" (anchor kept)").bold = True\n'
|
|
733
|
+
'doc.paragraphs[2].add_run(" (second anchor kept)")\n'
|
|
734
|
+
'doc.add_paragraph("A paragraph added after the boxes.")\n'
|
|
735
|
+
),
|
|
736
|
+
),
|
|
737
|
+
FixtureScript(
|
|
738
|
+
# Writes to the header row of a table that names a style and has no
|
|
739
|
+
# w:tblLook, which Word reads by its default look: the cells' text,
|
|
740
|
+
# a run added and one made italic, a paragraph added to a header cell
|
|
741
|
+
# and a row added. python-docx writes none of the style's bold as the
|
|
742
|
+
# runs' own and no look, nor does the SDK.
|
|
743
|
+
name="fixture-tables-default-look-writes",
|
|
744
|
+
fixture="tables-default-look",
|
|
745
|
+
script=(
|
|
746
|
+
"table = doc.tables[0]\n"
|
|
747
|
+
'table.cell(0, 1).text = "Summary"\n'
|
|
748
|
+
'table.cell(0, 0).paragraphs[0].add_run(" (code)")\n'
|
|
749
|
+
"table.cell(0, 2).paragraphs[0].runs[0].italic = True\n"
|
|
750
|
+
'table.cell(0, 2).add_paragraph("Region")\n'
|
|
751
|
+
"row = table.add_row()\n"
|
|
752
|
+
'row.cells[0].text = "Delta"\n'
|
|
753
|
+
),
|
|
754
|
+
),
|
|
714
755
|
FixtureScript(
|
|
715
756
|
# Writes to a footer part written with a header's root element and to
|
|
716
757
|
# a header part written with a footer's: python-docx edits the part's
|
{athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/parity/intentional_deviations.json
RENAMED
|
@@ -202,6 +202,46 @@
|
|
|
202
202
|
"match": "fixture-inline-tags::reads::tables.cell_paragraph_content",
|
|
203
203
|
"reason": "As fixture-inline-tags::reads::runs.*: runs inside an inline wrapper (w:smartTag, w:customXml) read as the paragraph's (owner question 47)."
|
|
204
204
|
},
|
|
205
|
+
{
|
|
206
|
+
"match": "fixture-hyperlinks-nested::reads::paragraphs.text",
|
|
207
|
+
"reason": "The inner link of a link nested in another (<w:hyperlink><w:hyperlink>, the duplicate wrapper Word writes around a pasted link) reads with its text, as Word shows it: the link's runs, the paragraph's text and inner content, and the section's blocks hold the inner link's run, where python-docx reads only a link's own runs (w:hyperlink/w:r) and a paragraph's direct w:r and w:hyperlink children, so Hyperlink.text and Paragraph.text leave the inner text out. Owner decision, 2026-10-26 (#46935, item A1): 3 of 6,826 customer uploads hold one, and with python-docx's reads a script that rewrites such a paragraph's text (p.text = p.text.replace(...)) deletes the inner link's text unseen. The same choice as owner question 47 (inline wrappers) and tracked changes (Word's final view)."
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
"match": "fixture-hyperlinks-nested::reads::paragraphs.inner_content",
|
|
211
|
+
"reason": "As fixture-hyperlinks-nested::reads::paragraphs.text: the inner link of a nested link reads with its text, as Word shows it (owner decision, 2026-10-26, #46935 item A1)."
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
"match": "fixture-hyperlinks-nested::reads::hyperlinks",
|
|
215
|
+
"reason": "As fixture-hyperlinks-nested::reads::paragraphs.text: the inner link of a nested link reads with its text, as Word shows it (owner decision, 2026-10-26, #46935 item A1)."
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
"match": "fixture-hyperlinks-nested::reads::hyperlinks.runs",
|
|
219
|
+
"reason": "As fixture-hyperlinks-nested::reads::paragraphs.text: the inner link of a nested link reads with its text, as Word shows it (owner decision, 2026-10-26, #46935 item A1)."
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
"match": "fixture-hyperlinks-nested::reads::sections.inner_content",
|
|
223
|
+
"reason": "As fixture-hyperlinks-nested::reads::paragraphs.text: the inner link of a nested link reads with its text, as Word shows it (owner decision, 2026-10-26, #46935 item A1)."
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
"match": "fixture-symbols-emoji-alternate-content::reads::runs.text",
|
|
227
|
+
"reason": "An emoji Word 2016 writes as mc:AlternateContent in its run (an mc:Choice Requires=\"w16se\" holding w16se:symEx, an mc:Fallback holding a w:t of the emoji) reads as the run's text, as Word shows it: the run's text and inner content, the paragraph's text and inner content and the section's blocks hold the emoji, where python-docx reads a run's text from its own w:t children only and reads \"\" for it. Owner decision, 2026-10-26 (#46935, item A5): 1 of 6,826 customer uploads holds one, and with python-docx's read a script that rewrites the paragraph's text deletes the emoji unseen."
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
"match": "fixture-symbols-emoji-alternate-content::reads::runs.inner_content",
|
|
231
|
+
"reason": "As fixture-symbols-emoji-alternate-content::reads::runs.text: an emoji written as w16se:symEx in mc:AlternateContent reads as the run's text, as Word shows it (owner decision, 2026-10-26, #46935 item A5)."
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
"match": "fixture-symbols-emoji-alternate-content::reads::paragraphs.text",
|
|
235
|
+
"reason": "As fixture-symbols-emoji-alternate-content::reads::runs.text: an emoji written as w16se:symEx in mc:AlternateContent reads as the run's text, as Word shows it (owner decision, 2026-10-26, #46935 item A5)."
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
"match": "fixture-symbols-emoji-alternate-content::reads::paragraphs.inner_content",
|
|
239
|
+
"reason": "As fixture-symbols-emoji-alternate-content::reads::runs.text: an emoji written as w16se:symEx in mc:AlternateContent reads as the run's text, as Word shows it (owner decision, 2026-10-26, #46935 item A5)."
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
"match": "fixture-symbols-emoji-alternate-content::reads::sections.inner_content",
|
|
243
|
+
"reason": "As fixture-symbols-emoji-alternate-content::reads::runs.text: an emoji written as w16se:symEx in mc:AlternateContent reads as the run's text, as Word shows it (owner decision, 2026-10-26, #46935 item A5)."
|
|
244
|
+
},
|
|
205
245
|
{
|
|
206
246
|
"match": "fixture-bidi-wrappers::reads::runs.*",
|
|
207
247
|
"reason": "Runs inside an inline wrapper (w:dir, w:bdo) read as the paragraph's runs, so the runs, their fonts and inner content, the links' runs, the paragraph's text and inner content, and the cells holding them read with the wrapped runs, where python-docx reads only a w:p's direct w:r and w:hyperlink children and cannot see their text. Decided on 2026-10-21 under the Word fidelity goal (owner question 47) and flagged to the owner, who may overrule it: 62 of 6,803 customer uploads hold text inside smart tags (842 tags), and with python-docx's reads a script that rewrites such a paragraph (p.text = p.text.replace(...)) deletes that text, which python-docx's setter clears unseen. The same choice as the recorded decision for tracked changes, which the SDK reads as Word's final view."
|
|
@@ -277,6 +317,14 @@
|
|
|
277
317
|
{
|
|
278
318
|
"match": "fixture-comments-annotation-ref-unstyled::reads::comments.runs.style",
|
|
279
319
|
"reason": "A comment's annotation reference run (w:annotationRef) that names no character style (1 of 398 customer documents, 13 of 6,826 uploads) reads in Word's CommentReference style, in which the export writes every comment's annotation run when it writes the comments part, as Word does for a comment it inserts; python-docx reads the source run's style, the default character style. The model holds no annotation mark (the parser keeps the run as an empty run nothing tells from another), so reading the source run's own formatting would need the stored comment to mark it. Confirmed by the owner, 2026-10-23."
|
|
320
|
+
},
|
|
321
|
+
{
|
|
322
|
+
"match": "fixture-footers-text-and-field-one-run*::reads::sections.footer.paragraph_reads",
|
|
323
|
+
"reason": "A footer run that holds text beside a whole field (\"Page \" and a PAGE field's begin, code, separate and end characters in one w:r, as a generator writes a page number) reads as more runs than python-docx's one: the import cuts the w:r into a run of the text and the field's own run (and a run of any text after the field), so the paragraph's text reads as python-docx's and Word's, and the editor and the server's PDFs draw it, where the field took the whole run and its text was lost. A cosmetic run split, recorded by owner decision, 2026-10-26 (#46935, item A4): 1 of 6,826 customer uploads holds one."
|
|
324
|
+
},
|
|
325
|
+
{
|
|
326
|
+
"match": "fixture-footers-text-and-field-one-run-writes::export::sections.footer.paragraph_reads",
|
|
327
|
+
"reason": "As fixture-footers-text-and-field-one-run::reads::sections.footer.paragraph_reads: a footer paragraph whose run holds \"Page \" and a whole PAGE field, edited by the script, is written back with the text and the field each a run of its own, so python-docx reads the export's paragraph as more runs, with the same text (owner decision, 2026-10-26, #46935 item A4)."
|
|
280
328
|
}
|
|
281
329
|
],
|
|
282
330
|
|
{athena_python_docx-0.41.0 → athena_python_docx-0.42.0}/tests/test_run_table_style_objects.py
RENAMED
|
@@ -139,6 +139,64 @@ class TestRunStyleReads:
|
|
|
139
139
|
|
|
140
140
|
assert run.style is None
|
|
141
141
|
|
|
142
|
+
def test_a_built_in_the_uploaded_file_named_undefined_reads_as_the_default(self) -> None:
|
|
143
|
+
# A generator's links name Hyperlink, which its styles.xml lacks:
|
|
144
|
+
# python-docx's get_by_id finds no such style and gives the default.
|
|
145
|
+
doc = _document()
|
|
146
|
+
doc._session.state().undefined_run_style_ids = ["Hyperlink"]
|
|
147
|
+
p = doc.add_paragraph()
|
|
148
|
+
p.add_run("link")
|
|
149
|
+
doc._session.state()._find_block(p._node_id).inlines[0]["run"]["rStyle"] = "Hyperlink"
|
|
150
|
+
|
|
151
|
+
assert _style(doc.paragraphs[0].runs[0].style) == (
|
|
152
|
+
"Default Paragraph Font",
|
|
153
|
+
"DefaultParagraphFont",
|
|
154
|
+
WD_STYLE_TYPE.CHARACTER,
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
def test_a_built_in_a_room_imported_before_named_undefined_reads_as_the_built_in(self) -> None:
|
|
158
|
+
# No ``undefinedRunStyleIds``: the room's export defines the style, as before.
|
|
159
|
+
doc = _document()
|
|
160
|
+
p = doc.add_paragraph()
|
|
161
|
+
p.add_run("link")
|
|
162
|
+
doc._session.state()._find_block(p._node_id).inlines[0]["run"]["rStyle"] = "Hyperlink"
|
|
163
|
+
|
|
164
|
+
assert _style(doc.paragraphs[0].runs[0].style) == ("Hyperlink", "Hyperlink", WD_STYLE_TYPE.CHARACTER)
|
|
165
|
+
|
|
166
|
+
def test_a_built_in_the_file_named_undefined_reads_as_docx_studio_records_a_write_of_it(self) -> None:
|
|
167
|
+
# docx-studio records a format that gives a run the style (the export
|
|
168
|
+
# defines it from then on) and reports it no more: the next read asks
|
|
169
|
+
# Info again, after the write, as a later session would.
|
|
170
|
+
doc = _document()
|
|
171
|
+
state = doc._session.state()
|
|
172
|
+
state.undefined_run_style_ids = ["Hyperlink"]
|
|
173
|
+
p = doc.add_paragraph()
|
|
174
|
+
p.add_run("link")
|
|
175
|
+
state._find_block(p._node_id).inlines[0]["run"]["rStyle"] = "Hyperlink"
|
|
176
|
+
assert doc.paragraphs[0].runs[0].style.style_id == "DefaultParagraphFont"
|
|
177
|
+
|
|
178
|
+
added = p.add_run(" more")
|
|
179
|
+
added.style = "Hyperlink"
|
|
180
|
+
state.undefined_run_style_ids = []
|
|
181
|
+
|
|
182
|
+
assert _sent_run_styles(doc) == ["Hyperlink"]
|
|
183
|
+
assert _style(added.style) == ("Hyperlink", "Hyperlink", WD_STYLE_TYPE.CHARACTER)
|
|
184
|
+
assert doc.paragraphs[0].runs[0].style.style_id == "Hyperlink"
|
|
185
|
+
|
|
186
|
+
def test_a_write_docx_studio_did_not_record_leaves_the_default_read(self) -> None:
|
|
187
|
+
# A format docx-studio refused or skipped records nothing: Info still
|
|
188
|
+
# reports the style, and its runs still read as the default.
|
|
189
|
+
doc = _document()
|
|
190
|
+
state = doc._session.state()
|
|
191
|
+
state.undefined_run_style_ids = ["Hyperlink"]
|
|
192
|
+
p = doc.add_paragraph()
|
|
193
|
+
p.add_run("link")
|
|
194
|
+
state._find_block(p._node_id).inlines[0]["run"]["rStyle"] = "Hyperlink"
|
|
195
|
+
|
|
196
|
+
p.add_run(" more").style = "Hyperlink"
|
|
197
|
+
|
|
198
|
+
assert doc.paragraphs[0].runs[0].style.style_id == "DefaultParagraphFont"
|
|
199
|
+
|
|
142
200
|
def test_the_style_has_a_font(self) -> None:
|
|
143
201
|
from docx.text.run import Font
|
|
144
202
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|