athena-python-docx 0.35.0__tar.gz → 0.37.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.35.0 → athena_python_docx-0.37.0}/AGENTS.md +15 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/PKG-INFO +1 -1
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/__init__.py +1 -1
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/_proxy.py +26 -2
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/commands.py +11 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/oxml/__init__.py +1 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/styles/latent.py +21 -4
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/styles/style.py +29 -10
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/table.py +12 -3
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/text/paragraph.py +9 -3
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/text/run.py +155 -51
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/text/tabstops.py +26 -3
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/pyproject.toml +1 -1
- athena_python_docx-0.37.0/tests/fidelity/ab_probe/agent_documents.py +133 -0
- athena_python_docx-0.37.0/tests/fidelity/ab_probe/picture_runs.py +101 -0
- athena_python_docx-0.37.0/tests/fidelity/ab_probe/return_types.py +44 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/99_run_add_picture_from_bytes.json +1 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_cell_inner_run_guard.py +5 -7
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_drawing_image.py +179 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_enum_parity.py +3 -1
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_latent_style_writes.py +21 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_run_identity.py +13 -11
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_run_later_runs.py +32 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_style_tab_stops.py +35 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_tab_stop_writes.py +21 -0
- athena_python_docx-0.37.0/tests/test_table_add_row_grid_row.py +36 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/uv.lock +1 -1
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/.gitignore +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/CLAUDE.md +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/DOCX_EXEC_LAB.md +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/README.md +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/_athena_extension.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/_batching.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/_buffer.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/_capabilities.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/_citations.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/_execution.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/_http.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/_http_doc.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/_image_utils.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/_postproc.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/_ptc.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/_references.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/_run_order.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/_table_styles.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/_timeouts.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/_tracked.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/_xml_text.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/api.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/blkcntnr.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/bookmarks.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/charts.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/client.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/comments.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/document.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/drawing/__init__.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/enum/__init__.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/enum/base.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/enum/dml.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/enum/section.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/enum/shape.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/enum/style.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/enum/table.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/enum/text.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/errors.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/exceptions.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/fields.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/footnotes.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/image/__init__.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/image/exceptions.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/image/image.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/math.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/opc/__init__.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/opc/coreprops.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/revisions.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/sdt.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/section.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/session.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/settings.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/shape.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/shared.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/styles/__init__.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/styles/_table.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/styles/styles.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/text/__init__.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/text/font.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/text/hyperlink.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/text/pagebreak.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/text/parfmt.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/toc.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/docx/typing.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/scripts/docx_exec_lab.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/scripts/docx_exec_lab_examples/fast_table_fill.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/scripts/docx_exec_lab_examples/find_replace_literal.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/scripts/docx_exec_lab_server.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/scripts/dump_wire_fixtures.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/scripts/release.sh +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/scripts/round_trip_smoke.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/scripts/smoke_test_block_not_found.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/scripts/validate_find_replace_asset.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/__init__.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/conftest.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/METHODOLOGY.md +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/README.md +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/__init__.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/ab_probe/__init__.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/ab_probe/default_style_run_formatting.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/ab_probe/header_footer_pictures.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/ab_probe/less_used_writes.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/ab_probe/merged_cell_identity.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/ab_probe/paragraph_text_setter.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/ab_probe/proxy_equality.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/ab_probe/xml_incompatible_text.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/ab_probe/zero_and_negative_indents.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/ab_probe_cases.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/ab_probe_runner.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/auto_gen_cases.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/binary_round_trip.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/cases.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/complex_cases.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/coverage_report.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/extract.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/extreme_cases.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/fake_session.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/firm_templates/README.md +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/firm_templates/__init__.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/firm_templates/_runner.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/firm_templates/extractor.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/firm_templates/test_pw_corpus.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/firm_templates/test_pw_research_digest.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/local_runner.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/mega_cases.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshot.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/01_basic_paragraph.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/02_multiple_headings.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/03_runs_with_formatting.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/04_font_name_and_size.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/05_font_color_rgb.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/06_font_character_properties.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/07_font_subscript_superscript.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/08_font_highlight.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/09_paragraph_alignment.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/100_table_negative_indexing.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/101_table_cells_flat_iteration.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/102_text_with_embedded_special_chars.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/104_core_properties_datetime.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/105_default_one_section.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/106_heading_paragraph_format.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/107_varying_row_heights.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/10_paragraph_indents.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/11_paragraph_spacing.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/12_paragraph_keep_options.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/13_paragraph_tab_stops.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/14_run_add_tab_and_break.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/15_run_add_break_page.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/16_paragraph_clear_and_insert_before.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/17_table_basic.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/18_table_cell_text.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/19_table_row_column_sizing.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/20_table_cell_vertical_alignment.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/21_table_alignment_and_autofit.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/22_table_cell_paragraphs_iteration.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/24_table_add_row_column.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/25_table_merge_cells.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/26_section_page_setup.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/27_section_margins.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/28_section_add_new.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/29_section_headers_linked.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/30_styles_iteration.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/31_styles_lookup_and_default.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/32_styles_add_paragraph_style.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/33_core_properties_set_and_get.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/34_inline_shapes_iterate_empty.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/35_full_report.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/36_replace_text_in_paragraph.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/37_iterate_runs_and_format_all_bold.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/38_font_all_properties.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/39_large_body_100_paragraphs.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/40_large_table_10x10.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/41_unicode_and_emoji.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/42_very_long_paragraph.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/43_paragraph_text_round_trip.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/44_paragraph_alignment_round_trip.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/45_cell_text_round_trip.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/46_run_text_setter_round_trip.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/47_font_size_round_trip.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/48_font_color_round_trip.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/49_resume_layout.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/50_multi_section_doc.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/52_iterate_everything.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/53_apply_style_to_paragraphs.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/54_empty_everything.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/55_single_character_runs.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/56_everything_in_one.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/57_runs_after_multiple_text_appends.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/58_modify_runs_in_place.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/59_indent_round_trip.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/60_space_round_trip.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/61_cell_paragraph_with_runs.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/62_many_cell_paragraphs.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/63_table_style_round_trip.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/64_many_sections.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/65_20x20_table_formatted.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/66_toc_like_structure.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/67_paragraph_insert_before_chain.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/68_invoice.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/69_newsletter.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/70_add_and_iterate_back.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/71_academic_paper.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/72_legal_contract.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/73_form_with_many_tables.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/74_paragraph_with_10_runs.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/75_paragraph_negative_first_line_indent.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/76_rgbcolor_from_string.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/77_length_unit_conversions.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/78_paragraph_copy_style.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/79_bulk_cell_formatting.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/80_apply_style_after_add_run.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/81_multi_page_with_breaks.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/82_add_text_on_existing_run.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/83_clear_then_repopulate_paragraph.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/84_table_reread_row_count.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/85_header_footer_access.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/86_font_read_unset_returns_none.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/87_500_paragraph_doc.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/88_mixed_content_iteration.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/89_alignment_clear_via_none.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/90_cell_add_paragraph_styled.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/91_many_small_tables.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/92_margins_every_section.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/93_font_bool_reads_after_set.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/94_page_break_before_paragraph.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/95_paragraph_hyperlinks_empty.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/96_paragraph_contains_page_break.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/97_document_styles_by_key.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/98_style_contains_check.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/ex02_unicode_everywhere.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/ex03_1000_paragraphs.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/ex04_50x50_table.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/ex05_long_text_in_cell.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/ex06_hundred_tiny_runs.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/ex07_every_font_boolean.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/ex08_many_continuous_sections.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/ex09_many_tab_stops.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/ex10_complex_bom.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/ex11_banded_rows_formatting.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/ex12_section_reconfigure.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/ex13_cell_with_10_paragraphs.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/ex14_styled_report_table.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/ex15_paragraph_all_format_props.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/ex16_runs_interleaved_with_breaks.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/ex17_all_break_kinds.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/ex18_read_back_large_doc.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/ex19_mutate_all_runs.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/ex20_kitchen_sink_v2.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/mega01_book_chapter.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/mega02_research_proposal.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/mega03_financial_statement.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/mega04_recipe_card.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/mega05_user_manual.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/mega06_complex_newsletter.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/mega07_budget_spreadsheet.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/mega08_product_catalog.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/mega09_signed_contract.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/mega10_api_documentation.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/rw01_official_quickstart.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/rw02_paragraph_style_list.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/rw03_character_formatting.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/rw04_section_page_setup.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/rw05_toc_pattern.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/rw06_meeting_minutes.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/rw07_dense_formatting_demo.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/rw08_table_merged_header.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/rw09_bulk_run_iteration.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/rw10_colored_grid_table.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/rw11_header_text.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/rw12_first_page_footer.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/rw13_even_page_header.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/rw15_paragraph_style_instance.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/rw16_header_footer_tables.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/rw17_header_letterhead_filled.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/rw18_header_table_properties.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/rw19_header_table_rows_columns.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/op_snapshots/rw20_header_table_merges.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/ours_spec.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/parity_crawl.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/parity_diff.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/real_world_cases.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/round_trip_tests.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/stock_spec.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fidelity/test_e2e_against_staging.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fixtures/field_reads.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fixtures/note_reference_reads.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fixtures/ruby_reads.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/fixtures/symbol_reads.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/live/__init__.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/live/baseline.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/live/fixture_scripts.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/live/reader.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/live/runner.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/live/sdk_driver.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/live/stock_driver.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/live/test_live_runner.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/parity/README.md +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/parity/__init__.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/parity/baseline_gaps.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/parity/compare.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/parity/intentional_deviations.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/parity/introspect.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/parity/reports/GAP_ANALYSIS.md +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/parity/reports/gap_report.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/parity/run_parity.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/parity/snapshots/athena_latest.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/parity/snapshots/upstream_python_docx_1.2.0.json +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/parity/test_parity_gap.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_add_section.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_add_section_extract_items.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_alignment_values.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_athena_extension_creates_session_open.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_athena_extensions_contract.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_athena_extensions_registry.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_batch_chunking.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_batching_perf.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_battery_cases.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_block_not_found_error.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_buffer.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_cell_add_paragraph_wire_shape.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_cell_add_table_not_supported.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_cell_borders_spec.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_cell_fastpath_runs.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_cell_inner_add_hyperlink_stash.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_cell_inner_add_run_via_cell_insert.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_cell_inner_format_stash.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_cell_inner_run_format_stash.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_cell_merge.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_cell_nested_tables.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_cell_paragraphs_listed.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_cell_text_plain_fastpath.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_cell_text_replace_semantics.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_citations.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_collapsed_range_format.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_color_format_theme.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_command_dataclasses.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_commands.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_comment_paragraphs.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_comments.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_comments_first_read.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_content_control_value.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_core_properties.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_document_asset_id_property.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_document_clear.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_document_create.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_document_create_from_template.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_document_factory_validation.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_document_settings_session_open.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_docx_exec_lab.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_docx_exec_lab_server.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_e2e_partial_failure_cascade.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_empty_hyperlinks.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_execution_scope.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_export_docx_clean.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_export_rescue_anchors.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_field_reads_python_docx_parity.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_field_refresh.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_field_runs.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_find_replace_session_open.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_flushed_write_failures.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_http_transport.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_hyperlink_coalescing.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_image_url_data_uri.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_inline_page_break.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_inline_shape_alt_text.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_inline_shape_size.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_inline_shape_type.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_inline_shapes_floating.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_insert_deferred.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_iter_inner_content.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_line_clear_break.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_list_styles.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_merged_cell_identity.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_merged_cell_secondary_slot.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_merged_cells.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_missing_modules.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_nested_table_refused.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_note_reference_reads_python_docx_parity.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_oxml_shim.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_page_break.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_paragraph_delete.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_paragraph_indent_reads.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_paragraph_runs_hyperlinks.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_paragraph_text_empty_run.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_paragraph_text_len_cache.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_parfmt_clears.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_parity_misc.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_parity_round2.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_partial_failure_cascade.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_pdf_export_and_page_renders.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_phase_a_behavior.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_phase_b_headers_footers.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_phase_c_tables.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_positional_cell_id.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_postproc_cell_format_rewrite.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_postproc_cell_run_format_rewrite.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_postproc_ref_restore.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_pr19766_review_fixes.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_proxy_equality.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_ptc.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_python_docx_api_parity.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_read_run_ranges.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_rendered_page_breaks.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_repeated_node_read.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_restart_numbering.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_revisions.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_round_trip_smoke_script.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_ruby_reads_python_docx_parity.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_run_add_picture_anchor.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_run_break_inner_content.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_run_edges.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_run_formatting_wire.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_run_mark_inheritance.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_run_page_number_blocks.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_run_table_style_objects.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_run_text_python_docx.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_run_text_refreshes_paragraph.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_run_unmodeled_toggles.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_sdk_reads_served.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_section_read_lengths.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_add_paragraph_style.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_add_picture.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_add_run.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_cell_add_paragraph.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_comments_add_comment.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_comments_get.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_document_audit.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_document_element.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_enum_section.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_font_audit.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_header_footer.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_hyperlink.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_inline_shape.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_insert_paragraph_before.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_misc.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_paragraph_strict.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_paragraph_style.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_paragraph_style_strict.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_parfmt.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_row_col_cell.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_run_add_break.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_run_bool_setters.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_run_style.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_run_style_strict.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_run_text.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_run_underline.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_section_audit.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_section_dimensions.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_section_onoff.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_settings.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_shared_audit.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_style.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_styles.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_table_audit.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_table_cell.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_table_dimensions.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_silent_stub_table_layout.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_smoke_integration.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_style_acceptance.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_style_delete.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_style_font.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_style_formatting_writes.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_style_metadata_writes.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_style_names.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_style_setters_contract.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_style_tab_stops_read.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_symbol_reads_python_docx_parity.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_table_anchors.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_table_clears.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_table_direction.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_table_read_reuse.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_table_set_cell_perf.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_table_style_id_resolution.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_temporarily_unavailable.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_text_control_characters.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_tracked_revisions_offsets.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_unmapped_alignment_reads.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_uv_lock_version.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_validate_find_replace_asset_script.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_wire_contract.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_xml_attr_guard.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_xml_incompatible_text.py +0 -0
- {athena_python_docx-0.35.0 → athena_python_docx-0.37.0}/tests/test_zod_wire_contract.py +0 -0
|
@@ -121,6 +121,21 @@ pinned by focused tests and documented in
|
|
|
121
121
|
`horz_dpi`, `width`, `scaled_dimensions`, …). A picture in a table cell or
|
|
122
122
|
a header has no id to read its image by, so `.image` raises `ValueError`;
|
|
123
123
|
an older docx-studio does not report pictures, so they are not runs there.
|
|
124
|
+
`Run.add_picture` puts the picture in that run, as python-docx appends the
|
|
125
|
+
`w:drawing` to its `w:r`: after what the run holds, and text `add_text`
|
|
126
|
+
adds goes after it. Against a docx-studio that reports
|
|
127
|
+
`capabilities.pictureRuns`, `CreateImage` carries `runEdge: "append"` (the
|
|
128
|
+
run's identity as `add_text` names it), the run's record holds the picture
|
|
129
|
+
(`pictureRun`), and the run reads as one run whose pictures stand at their
|
|
130
|
+
places in its text (`pictures`), so `iter_inner_content()` yields its text
|
|
131
|
+
and each `Drawing` in order (with Word's rendered page breaks where the read
|
|
132
|
+
places them among the pictures, `afterPictures`), a whole-run format takes
|
|
133
|
+
its pictures too, and `run.text = ...` takes every one of them out
|
|
134
|
+
(`wholeRun`). A picture's run (no text) formats its picture at once, named
|
|
135
|
+
by its identity (`laterRuns`), so `r = p.add_run(); r.bold = True;
|
|
136
|
+
r.add_picture(img)` writes the bold `w:rPr` beside the `w:drawing`. An older
|
|
137
|
+
docx-studio puts the picture in a run of its own (`tests/test_drawing_image.py`,
|
|
138
|
+
battery `ab_probe/picture_runs.py`).
|
|
124
139
|
- **A run holding only a page or column break yields `""` from
|
|
125
140
|
`Run.iter_inner_content()`,** as python-docx reads a `w:br` of type `page`
|
|
126
141
|
or `column` as empty text; an empty run (a comment reference's) yields
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: athena-python-docx
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.37.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>
|
|
@@ -1,11 +1,35 @@
|
|
|
1
1
|
"""python-docx's ``ElementProxy`` equality, for the SDK's proxies of the
|
|
2
2
|
objects python-docx wraps in one: styles, the styles part, settings, a
|
|
3
|
-
paragraph's or a style's paragraph format, a run's or a style's font
|
|
3
|
+
paragraph's or a style's paragraph format, a run's or a style's font, tab
|
|
4
|
+
stops and the latent styles."""
|
|
4
5
|
|
|
5
6
|
from __future__ import annotations
|
|
6
7
|
|
|
7
8
|
import weakref
|
|
8
|
-
from
|
|
9
|
+
from collections.abc import Iterator
|
|
10
|
+
from typing import Any, Generic, TypeVar
|
|
11
|
+
|
|
12
|
+
_T = TypeVar("_T")
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class IdentityWeakSet(Generic[_T]):
|
|
16
|
+
"""A set of objects held weakly, by identity: a ``weakref.WeakSet`` hashes
|
|
17
|
+
its members, and a proxy that compares by its element
|
|
18
|
+
(:class:`ElementProxyEquality`) is not hashable, as in python-docx."""
|
|
19
|
+
|
|
20
|
+
__slots__ = ("_members",)
|
|
21
|
+
|
|
22
|
+
def __init__(self) -> None:
|
|
23
|
+
self._members: "weakref.WeakValueDictionary[int, _T]" = weakref.WeakValueDictionary()
|
|
24
|
+
|
|
25
|
+
def add(self, item: _T) -> None:
|
|
26
|
+
self._members[id(item)] = item
|
|
27
|
+
|
|
28
|
+
def __iter__(self) -> Iterator[_T]:
|
|
29
|
+
return iter(list(self._members.values()))
|
|
30
|
+
|
|
31
|
+
def __len__(self) -> int:
|
|
32
|
+
return len(self._members)
|
|
9
33
|
|
|
10
34
|
|
|
11
35
|
class ElementProxyEquality:
|
|
@@ -140,6 +140,10 @@ class CreateImage(Command):
|
|
|
140
140
|
at: dict[str, Any]
|
|
141
141
|
client_node_id: str | None = None
|
|
142
142
|
run: dict[str, Any] | None = None
|
|
143
|
+
# ``"append"`` (``Run.add_picture`` against a docx-studio that reports
|
|
144
|
+
# ``capabilities.pictureRuns``): the picture ends the run that ends at the
|
|
145
|
+
# anchor's offset, in that run's ``w:r``, as python-docx appends it.
|
|
146
|
+
run_edge: str | None = None
|
|
143
147
|
|
|
144
148
|
|
|
145
149
|
@dataclass
|
|
@@ -561,10 +565,17 @@ class SetSectionLinkToPrevious(Command):
|
|
|
561
565
|
|
|
562
566
|
@dataclass
|
|
563
567
|
class TablesInsertRow(Command):
|
|
568
|
+
"""``grid_row`` is python-docx's ``Table.add_row()``: the row goes after
|
|
569
|
+
the table's last one, with a cell for each grid column as wide as the
|
|
570
|
+
column, holding one empty paragraph, and nothing of the rows above.
|
|
571
|
+
Without it, the row is Word's Insert Row next to ``row_index``. A
|
|
572
|
+
docx-studio that predates the field ignores it."""
|
|
573
|
+
|
|
564
574
|
node_id: str
|
|
565
575
|
row_index: int
|
|
566
576
|
position: str # "above" | "below"
|
|
567
577
|
count: int = 1
|
|
578
|
+
grid_row: bool | None = None
|
|
568
579
|
|
|
569
580
|
|
|
570
581
|
@dataclass
|
|
@@ -92,6 +92,7 @@ _XML_ELEMENT_ATTRS: frozenset[str] = frozenset(
|
|
|
92
92
|
"_tc", # _Cell._tc
|
|
93
93
|
"_tbl", # Table._tbl
|
|
94
94
|
"_tr", # _Row._tr
|
|
95
|
+
"_t", # _Text._t (the ``w:t`` Run.add_text added)
|
|
95
96
|
"element", # Run.element / Paragraph.element / Document.element
|
|
96
97
|
"_element", # private alias used by some python-docx forks
|
|
97
98
|
},
|
|
@@ -23,6 +23,7 @@ import warnings
|
|
|
23
23
|
import weakref
|
|
24
24
|
from typing import TYPE_CHECKING, Any, Iterator
|
|
25
25
|
|
|
26
|
+
from docx._proxy import ElementProxyEquality, IdentityWeakSet
|
|
26
27
|
from docx.styles import BabelFish
|
|
27
28
|
|
|
28
29
|
if TYPE_CHECKING:
|
|
@@ -52,12 +53,12 @@ _XML_INCOMPATIBLE_MESSAGE = (
|
|
|
52
53
|
# Session -> every live ``_LatentStyle``, read or added: deleting one moves the
|
|
53
54
|
# others of its name after it up one place (:func:`_removed`), as python-docx's
|
|
54
55
|
# are elements a deletion elsewhere does not move. The sets hold them weakly.
|
|
55
|
-
_LIVE: "weakref.WeakKeyDictionary[Any,
|
|
56
|
+
_LIVE: "weakref.WeakKeyDictionary[Any, IdentityWeakSet[_LatentStyle]]" = weakref.WeakKeyDictionary()
|
|
56
57
|
|
|
57
58
|
|
|
58
59
|
def _track(latent_style: "_LatentStyle") -> None:
|
|
59
60
|
try:
|
|
60
|
-
_LIVE.setdefault(latent_style._session,
|
|
61
|
+
_LIVE.setdefault(latent_style._session, IdentityWeakSet()).add(latent_style)
|
|
61
62
|
except TypeError: # no session, or one that takes no weak reference
|
|
62
63
|
return
|
|
63
64
|
|
|
@@ -67,6 +68,7 @@ def _removed(deleted: "_LatentStyle", name: Any) -> None:
|
|
|
67
68
|
that name after it move up one place, and another object of the same
|
|
68
69
|
exception is out of the document, writing nothing to it, as python-docx's
|
|
69
70
|
removed element is."""
|
|
71
|
+
deleted._element = removed = object()
|
|
70
72
|
try:
|
|
71
73
|
live = _LIVE.get(deleted._session)
|
|
72
74
|
except TypeError:
|
|
@@ -78,6 +80,7 @@ def _removed(deleted: "_LatentStyle", name: Any) -> None:
|
|
|
78
80
|
continue
|
|
79
81
|
if other._occurrence == deleted._occurrence:
|
|
80
82
|
other._detached = True
|
|
83
|
+
other._element = removed
|
|
81
84
|
elif other._occurrence > deleted._occurrence:
|
|
82
85
|
other._occurrence -= 1
|
|
83
86
|
|
|
@@ -140,13 +143,17 @@ def _int(text: object) -> int | None:
|
|
|
140
143
|
return None
|
|
141
144
|
|
|
142
145
|
|
|
143
|
-
class LatentStyles:
|
|
146
|
+
class LatentStyles(ElementProxyEquality):
|
|
144
147
|
"""The default behaviors for latent styles in this document, and the
|
|
145
148
|
|_LatentStyle| objects that override them for a named latent style."""
|
|
146
149
|
|
|
147
150
|
def __init__(self, *, session: "Session | None" = None) -> None:
|
|
148
151
|
self._session: "Session | None" = session
|
|
149
152
|
|
|
153
|
+
def _proxy_element(self) -> tuple[object, ...]:
|
|
154
|
+
# python-docx's LatentStyles wraps the styles part's w:latentStyles.
|
|
155
|
+
return ("w:latentStyles", self._session)
|
|
156
|
+
|
|
150
157
|
def _read(self, prop: str | None) -> dict[str, Any]:
|
|
151
158
|
"""The latent styles docx-studio reports; a read of ``prop`` from one
|
|
152
159
|
that reports none warns (iterating, an empty collection, does not)."""
|
|
@@ -246,7 +253,7 @@ class LatentStyles:
|
|
|
246
253
|
self._set_default("load_count", "count", None if value is None else int(value))
|
|
247
254
|
|
|
248
255
|
|
|
249
|
-
class _LatentStyle:
|
|
256
|
+
class _LatentStyle(ElementProxyEquality):
|
|
250
257
|
"""A ``w:lsdException``: display behaviors for a built-in style the
|
|
251
258
|
document does not define yet, overriding the |LatentStyles| defaults."""
|
|
252
259
|
|
|
@@ -260,8 +267,18 @@ class _LatentStyle:
|
|
|
260
267
|
#: Removed through another object of the same exception: like
|
|
261
268
|
#: python-docx's element out of the part, it writes nothing to the document.
|
|
262
269
|
self._detached = False
|
|
270
|
+
#: The exception it held once removed, which its other objects hold too.
|
|
271
|
+
self._element: object | None = None
|
|
263
272
|
_track(self)
|
|
264
273
|
|
|
274
|
+
def _proxy_element(self) -> tuple[object, ...]:
|
|
275
|
+
# python-docx's _LatentStyle wraps its w:lsdException: the exception
|
|
276
|
+
# of its name at its place among them, or, removed, that exception, as
|
|
277
|
+
# its other objects are.
|
|
278
|
+
if self._detached or self._exception is None:
|
|
279
|
+
return ("w:lsdException", self._element if self._element is not None else id(self))
|
|
280
|
+
return ("w:lsdException", self._session, self._exception.get("name"), self._occurrence)
|
|
281
|
+
|
|
265
282
|
def _target(self) -> dict[str, Any]:
|
|
266
283
|
"""The exception's address in ``EditLatentStyles``."""
|
|
267
284
|
name = self._exception.get("name")
|
|
@@ -35,6 +35,7 @@ from docx._batching import run_sync
|
|
|
35
35
|
from docx._buffer import writes_unapplied
|
|
36
36
|
from docx._proxy import (
|
|
37
37
|
ElementProxyEquality,
|
|
38
|
+
IdentityWeakSet,
|
|
38
39
|
style_definition,
|
|
39
40
|
style_deleted,
|
|
40
41
|
style_element,
|
|
@@ -910,11 +911,13 @@ class _StyleParagraphFormat(ElementProxyEquality):
|
|
|
910
911
|
|
|
911
912
|
_TAB_STOPS_REASON = "does not write this style's tab stops: it predates styleTabStops, or does not write the style's formatting"
|
|
912
913
|
|
|
913
|
-
# Session -> style
|
|
914
|
-
# write moves the others to their new places in
|
|
915
|
-
# (``_StyleTabStops._moved``), as python-docx's are elements
|
|
916
|
-
# another does not move.
|
|
917
|
-
|
|
914
|
+
# Session -> style definition (``style_element``) -> every live tab stop of
|
|
915
|
+
# that style, read or added: a write moves the others to their new places in
|
|
916
|
+
# the style's list (``_StyleTabStops._moved``), as python-docx's are elements
|
|
917
|
+
# that a change to another does not move. By the definition, not the id: a
|
|
918
|
+
# renamed style keeps its stops, and one made after a style of its id was
|
|
919
|
+
# deleted holds none of the deleted one's. The sets hold them weakly.
|
|
920
|
+
_LIVE_TAB_STOPS: "weakref.WeakKeyDictionary[Any, dict[tuple[object, ...], IdentityWeakSet[_StyleTabStop]]]" = (
|
|
918
921
|
weakref.WeakKeyDictionary()
|
|
919
922
|
)
|
|
920
923
|
|
|
@@ -926,7 +929,7 @@ _REMOVED = "removed"
|
|
|
926
929
|
_CLEARED = "cleared"
|
|
927
930
|
|
|
928
931
|
|
|
929
|
-
class _StyleTabStop:
|
|
932
|
+
class _StyleTabStop(ElementProxyEquality):
|
|
930
933
|
"""One tab stop of a style's ``w:tabs``, as python-docx's ``TabStop``
|
|
931
934
|
reads it: ``position`` a ``Length``, ``alignment`` a
|
|
932
935
|
``WD_TAB_ALIGNMENT`` (a cleared tab's is ``CLEAR``), ``leader`` a
|
|
@@ -938,7 +941,7 @@ class _StyleTabStop:
|
|
|
938
941
|
to another tab stop moves, as python-docx's ``w:tab`` element stays itself;
|
|
939
942
|
one the style no longer holds writes nothing, as a removed element."""
|
|
940
943
|
|
|
941
|
-
__slots__ = ("__weakref__", "_detached", "_entry", "_index", "_owner")
|
|
944
|
+
__slots__ = ("__weakref__", "_detached", "_element", "_entry", "_index", "_owner")
|
|
942
945
|
|
|
943
946
|
def __init__(
|
|
944
947
|
self, entry: dict[str, Any], owner: "_StyleTabStops | None" = None, index: int | None = None
|
|
@@ -947,9 +950,19 @@ class _StyleTabStop:
|
|
|
947
950
|
self._owner: "_StyleTabStops | None" = owner
|
|
948
951
|
self._index: int | None = index
|
|
949
952
|
self._detached: str | None = None
|
|
953
|
+
# The w:tab it held once out of the style, which its other objects hold too.
|
|
954
|
+
self._element: object | None = None
|
|
950
955
|
if owner is not None and index is not None:
|
|
951
956
|
owner._track(self)
|
|
952
957
|
|
|
958
|
+
def _proxy_element(self) -> tuple[object, ...]:
|
|
959
|
+
# python-docx's TabStop wraps its w:tab: a stop at its place in the
|
|
960
|
+
# style's list is that w:tab; one out of the style is the w:tab taken
|
|
961
|
+
# out, as are its other objects.
|
|
962
|
+
if self._owner is not None and self._index is not None and not self._detached:
|
|
963
|
+
return ("w:tab", *style_element(self._owner._style), self._index)
|
|
964
|
+
return ("w:tab", self._element if self._element is not None else id(self))
|
|
965
|
+
|
|
953
966
|
def _wire(self) -> dict[str, Any]:
|
|
954
967
|
"""This tab stop as ``SetStyleFormatting``'s ``tabStops`` takes it."""
|
|
955
968
|
leader = self._entry.get("leader")
|
|
@@ -1010,7 +1023,7 @@ class _StyleTabStop:
|
|
|
1010
1023
|
)
|
|
1011
1024
|
|
|
1012
1025
|
|
|
1013
|
-
class _StyleTabStops:
|
|
1026
|
+
class _StyleTabStops(ElementProxyEquality):
|
|
1014
1027
|
"""``ParagraphStyle.paragraph_format.tab_stops``: python-docx's
|
|
1015
1028
|
``TabStops`` over the style's own ``w:tabs``.
|
|
1016
1029
|
|
|
@@ -1030,6 +1043,10 @@ class _StyleTabStops:
|
|
|
1030
1043
|
def __init__(self, style: "BaseStyle") -> None:
|
|
1031
1044
|
self._style: "BaseStyle" = style
|
|
1032
1045
|
|
|
1046
|
+
def _proxy_element(self) -> tuple[object, ...]:
|
|
1047
|
+
# python-docx's TabStops wraps the style's w:pPr (its paragraph format wraps the w:style).
|
|
1048
|
+
return ("w:pPr", *style_element(self._style))
|
|
1049
|
+
|
|
1033
1050
|
def _stashed(self) -> list:
|
|
1034
1051
|
kept = self._style._overrides
|
|
1035
1052
|
if "parfmt.tab_stops" not in kept:
|
|
@@ -1052,7 +1069,7 @@ class _StyleTabStops:
|
|
|
1052
1069
|
styles = _LIVE_TAB_STOPS.setdefault(self._style._session, {})
|
|
1053
1070
|
except TypeError: # no session, or one that takes no weak reference
|
|
1054
1071
|
return
|
|
1055
|
-
styles.setdefault(self._style
|
|
1072
|
+
styles.setdefault(style_element(self._style), IdentityWeakSet()).add(stop)
|
|
1056
1073
|
|
|
1057
1074
|
def _moved(
|
|
1058
1075
|
self,
|
|
@@ -1066,15 +1083,17 @@ class _StyleTabStops:
|
|
|
1066
1083
|
new place) gives one, or out of the style (``why``) where ``place``
|
|
1067
1084
|
gives none."""
|
|
1068
1085
|
try:
|
|
1069
|
-
live = (_LIVE_TAB_STOPS.get(self._style._session) or {}).get(self._style
|
|
1086
|
+
live = (_LIVE_TAB_STOPS.get(self._style._session) or {}).get(style_element(self._style))
|
|
1070
1087
|
except TypeError:
|
|
1071
1088
|
return
|
|
1089
|
+
gone: dict[int, object] = {}
|
|
1072
1090
|
for stop in list(live or ()):
|
|
1073
1091
|
if stop._detached or stop._index is None:
|
|
1074
1092
|
continue
|
|
1075
1093
|
new = place(stop._index)
|
|
1076
1094
|
if new is None:
|
|
1077
1095
|
stop._detached = why
|
|
1096
|
+
stop._element = gone.setdefault(stop._index, object())
|
|
1078
1097
|
continue
|
|
1079
1098
|
stop._index = new
|
|
1080
1099
|
if entries and new in entries:
|
|
@@ -321,6 +321,7 @@ if TYPE_CHECKING:
|
|
|
321
321
|
WD_TABLE_ALIGNMENT,
|
|
322
322
|
WD_TABLE_DIRECTION,
|
|
323
323
|
)
|
|
324
|
+
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
|
|
324
325
|
from docx.styles.style import ParagraphStyle, _TableStyle
|
|
325
326
|
from docx.text.paragraph import Paragraph
|
|
326
327
|
|
|
@@ -1052,6 +1053,11 @@ class Table:
|
|
|
1052
1053
|
}
|
|
1053
1054
|
if source_index is not None:
|
|
1054
1055
|
params["copyFormatFrom"] = source_index
|
|
1056
|
+
else:
|
|
1057
|
+
# python-docx's row: a cell for each grid column, as wide as the
|
|
1058
|
+
# column, and nothing of the last row (its height, grid skips,
|
|
1059
|
+
# header flag or cell formatting).
|
|
1060
|
+
params["gridRow"] = True
|
|
1055
1061
|
run_sync(self._session.doc.tables.insert_row(params))
|
|
1056
1062
|
# Keep the bounds-check cache current so the next ``cell()``
|
|
1057
1063
|
# access still hits the fast path.
|
|
@@ -1224,14 +1230,17 @@ class Table:
|
|
|
1224
1230
|
run_sync(self._session.doc.tables.set_style(params))
|
|
1225
1231
|
|
|
1226
1232
|
@property
|
|
1227
|
-
def alignment(self) -> "
|
|
1228
|
-
|
|
1233
|
+
def alignment(self) -> "WD_PARAGRAPH_ALIGNMENT | None":
|
|
1234
|
+
"""The table's ``w:jc``, as python-docx 1.2.0 reads it: through the
|
|
1235
|
+
paragraph ``CT_Jc``, so a member of ``WD_PARAGRAPH_ALIGNMENT``, which
|
|
1236
|
+
compares equal to the ``WD_TABLE_ALIGNMENT`` member of its value."""
|
|
1237
|
+
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
|
|
1229
1238
|
|
|
1230
1239
|
info: object = run_sync(
|
|
1231
1240
|
self._session.doc.tables.get_properties({"nodeId": self._fresh_node_id()}),
|
|
1232
1241
|
)
|
|
1233
1242
|
if isinstance(info, dict):
|
|
1234
|
-
return
|
|
1243
|
+
return WD_PARAGRAPH_ALIGNMENT.from_docx_studio(info.get("alignment"))
|
|
1235
1244
|
return None
|
|
1236
1245
|
|
|
1237
1246
|
@alignment.setter
|
|
@@ -245,9 +245,15 @@ def _node_text(session: "Session", node_id: str, *, final: bool = False) -> str:
|
|
|
245
245
|
|
|
246
246
|
def _picture_run_data(inline: dict, drawing: dict) -> dict:
|
|
247
247
|
"""The run data of a picture's inline (``{drawing}``): its ``w:r`` holds the
|
|
248
|
-
picture and no text,
|
|
249
|
-
which stand before its drawing (``renderedPageBreaks``)
|
|
250
|
-
|
|
248
|
+
picture and no text, the rendered page breaks docx-studio reads in it,
|
|
249
|
+
which stand before its drawing (``renderedPageBreaks``), and the run's
|
|
250
|
+
formatting it reads (its ``w:rPr``, which python-docx reads beside the
|
|
251
|
+
``w:drawing``)."""
|
|
252
|
+
from docx.text.run import _RUN_READ_KEYS
|
|
253
|
+
|
|
254
|
+
data: dict = {key: value for key, value in inline.items() if key in _RUN_READ_KEYS}
|
|
255
|
+
data["text"] = ""
|
|
256
|
+
data["drawing"] = drawing
|
|
251
257
|
breaks: object = inline.get("renderedPageBreaks")
|
|
252
258
|
if isinstance(breaks, list):
|
|
253
259
|
data["renderedPageBreaks"] = breaks
|