athena-python-docx 0.18.0__tar.gz → 0.18.2__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.18.0 → athena_python_docx-0.18.2}/PKG-INFO +1 -1
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/__init__.py +1 -1
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/document.py +23 -2
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/table.py +51 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/pyproject.toml +1 -1
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_commands.py +10 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_iter_inner_content.py +37 -0
- athena_python_docx-0.18.2/tests/test_positional_cell_id.py +119 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/.gitignore +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/CLAUDE.md +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/DOCX_EXEC_LAB.md +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/README.md +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/_athena_extension.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/_batching.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/_buffer.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/_execution.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/_http.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/_http_doc.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/_image_utils.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/_postproc.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/_ptc.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/_table_styles.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/_timeouts.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/api.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/bookmarks.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/charts.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/client.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/commands.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/comments.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/enum/__init__.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/enum/section.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/enum/style.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/enum/table.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/enum/text.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/errors.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/exceptions.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/fields.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/footnotes.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/math.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/opc/__init__.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/opc/coreprops.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/oxml/__init__.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/revisions.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/sdt.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/section.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/session.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/settings.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/shape.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/shared.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/styles/__init__.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/styles/style.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/styles/styles.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/text/__init__.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/text/font.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/text/hyperlink.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/text/pagebreak.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/text/paragraph.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/text/parfmt.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/text/run.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/text/tabstops.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/toc.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/docx/typing.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/scripts/docx_exec_lab.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/scripts/docx_exec_lab_examples/fast_table_fill.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/scripts/docx_exec_lab_examples/find_replace_literal.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/scripts/docx_exec_lab_server.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/scripts/publish.sh +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/scripts/release.sh +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/scripts/round_trip_smoke.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/scripts/smoke_test_block_not_found.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/scripts/validate_find_replace_asset.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/__init__.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/conftest.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/METHODOLOGY.md +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/README.md +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/__init__.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/ab_probe_cases.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/ab_probe_runner.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/auto_gen_cases.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/binary_round_trip.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/cases.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/complex_cases.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/coverage_report.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/extract.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/extreme_cases.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/fake_session.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/firm_templates/README.md +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/firm_templates/__init__.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/firm_templates/_runner.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/firm_templates/extractor.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/firm_templates/test_pw_corpus.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/firm_templates/test_pw_research_digest.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/local_runner.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/mega_cases.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshot.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/01_basic_paragraph.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/02_multiple_headings.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/03_runs_with_formatting.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/04_font_name_and_size.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/05_font_color_rgb.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/06_font_character_properties.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/07_font_subscript_superscript.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/08_font_highlight.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/09_paragraph_alignment.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/100_table_negative_indexing.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/101_table_cells_flat_iteration.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/102_text_with_embedded_special_chars.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/104_core_properties_datetime.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/105_default_one_section.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/106_heading_paragraph_format.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/107_varying_row_heights.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/10_paragraph_indents.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/11_paragraph_spacing.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/12_paragraph_keep_options.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/13_paragraph_tab_stops.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/14_run_add_tab_and_break.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/15_run_add_break_page.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/16_paragraph_clear_and_insert_before.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/17_table_basic.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/18_table_cell_text.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/19_table_row_column_sizing.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/20_table_cell_vertical_alignment.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/21_table_alignment_and_autofit.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/22_table_cell_paragraphs_iteration.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/24_table_add_row_column.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/25_table_merge_cells.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/26_section_page_setup.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/27_section_margins.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/28_section_add_new.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/29_section_headers_linked.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/30_styles_iteration.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/31_styles_lookup_and_default.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/32_styles_add_paragraph_style.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/33_core_properties_set_and_get.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/34_inline_shapes_iterate_empty.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/35_full_report.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/36_replace_text_in_paragraph.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/37_iterate_runs_and_format_all_bold.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/38_font_all_properties.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/39_large_body_100_paragraphs.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/40_large_table_10x10.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/41_unicode_and_emoji.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/42_very_long_paragraph.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/43_paragraph_text_round_trip.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/44_paragraph_alignment_round_trip.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/45_cell_text_round_trip.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/46_run_text_setter_round_trip.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/47_font_size_round_trip.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/48_font_color_round_trip.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/49_resume_layout.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/50_multi_section_doc.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/52_iterate_everything.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/53_apply_style_to_paragraphs.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/54_empty_everything.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/55_single_character_runs.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/56_everything_in_one.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/57_runs_after_multiple_text_appends.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/58_modify_runs_in_place.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/59_indent_round_trip.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/60_space_round_trip.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/61_cell_paragraph_with_runs.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/62_many_cell_paragraphs.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/63_table_style_round_trip.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/64_many_sections.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/65_20x20_table_formatted.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/66_toc_like_structure.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/67_paragraph_insert_before_chain.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/68_invoice.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/69_newsletter.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/70_add_and_iterate_back.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/71_academic_paper.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/72_legal_contract.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/73_form_with_many_tables.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/74_paragraph_with_10_runs.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/75_paragraph_negative_first_line_indent.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/76_rgbcolor_from_string.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/77_length_unit_conversions.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/78_paragraph_copy_style.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/79_bulk_cell_formatting.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/80_apply_style_after_add_run.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/81_multi_page_with_breaks.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/82_add_text_on_existing_run.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/83_clear_then_repopulate_paragraph.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/84_table_reread_row_count.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/85_header_footer_access.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/86_font_read_unset_returns_none.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/87_500_paragraph_doc.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/88_mixed_content_iteration.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/89_alignment_clear_via_none.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/90_cell_add_paragraph_styled.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/91_many_small_tables.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/92_margins_every_section.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/93_font_bool_reads_after_set.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/94_page_break_before_paragraph.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/95_paragraph_hyperlinks_empty.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/96_paragraph_contains_page_break.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/97_document_styles_by_key.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/98_style_contains_check.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/99_run_add_picture_from_bytes.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/ex02_unicode_everywhere.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/ex03_1000_paragraphs.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/ex04_50x50_table.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/ex05_long_text_in_cell.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/ex06_hundred_tiny_runs.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/ex07_every_font_boolean.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/ex08_many_continuous_sections.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/ex09_many_tab_stops.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/ex10_complex_bom.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/ex11_banded_rows_formatting.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/ex12_section_reconfigure.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/ex13_cell_with_10_paragraphs.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/ex14_styled_report_table.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/ex15_paragraph_all_format_props.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/ex16_runs_interleaved_with_breaks.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/ex17_all_break_kinds.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/ex18_read_back_large_doc.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/ex19_mutate_all_runs.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/ex20_kitchen_sink_v2.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/mega01_book_chapter.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/mega02_research_proposal.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/mega03_financial_statement.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/mega04_recipe_card.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/mega05_user_manual.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/mega06_complex_newsletter.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/mega07_budget_spreadsheet.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/mega08_product_catalog.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/mega09_signed_contract.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/mega10_api_documentation.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/rw01_official_quickstart.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/rw02_paragraph_style_list.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/rw03_character_formatting.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/rw04_section_page_setup.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/rw05_toc_pattern.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/rw06_meeting_minutes.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/rw07_dense_formatting_demo.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/rw08_table_merged_header.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/rw09_bulk_run_iteration.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/rw10_colored_grid_table.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/rw11_header_text.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/rw12_first_page_footer.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/rw13_even_page_header.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/op_snapshots/rw15_paragraph_style_instance.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/ours_spec.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/parity_crawl.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/parity_diff.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/real_world_cases.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/round_trip_tests.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/runner.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/stock_spec.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/test_e2e_against_staging.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/parity/README.md +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/parity/__init__.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/parity/baseline_gaps.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/parity/compare.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/parity/intentional_deviations.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/parity/introspect.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/parity/reports/GAP_ANALYSIS.md +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/parity/reports/gap_report.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/parity/run_parity.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/parity/snapshots/athena_latest.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/parity/snapshots/upstream_python_docx_1.2.0.json +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/parity/test_parity_gap.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_add_section_extract_items.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_athena_extensions_contract.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_athena_extensions_registry.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_batching_perf.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_block_not_found_error.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_buffer.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_cell_add_paragraph_wire_shape.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_cell_add_table_not_supported.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_cell_inner_add_hyperlink_stash.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_cell_inner_add_run_via_cell_insert.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_cell_inner_format_stash.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_cell_inner_run_format_stash.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_cell_inner_run_guard.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_cell_text_plain_fastpath.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_cell_text_replace_semantics.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_collapsed_range_format.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_command_dataclasses.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_comments.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_document_asset_id_property.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_document_clear.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_document_create.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_document_create_from_template.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_document_factory_validation.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_docx_exec_lab.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_docx_exec_lab_server.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_e2e_partial_failure_cascade.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_execution_scope.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_find_replace_session_open.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_http_transport.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_hyperlink_coalescing.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_image_url_data_uri.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_insert_deferred.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_list_styles.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_merged_cell_secondary_slot.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_merged_cells.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_oxml_shim.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_paragraph_text_len_cache.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_parity_misc.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_parity_round2.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_partial_failure_cascade.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_phase_a_behavior.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_phase_b_headers_footers.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_phase_c_tables.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_postproc_cell_format_rewrite.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_postproc_cell_run_format_rewrite.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_postproc_ref_restore.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_pr19766_review_fixes.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_ptc.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_python_docx_api_parity.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_revisions.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_add_paragraph_style.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_add_picture.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_add_run.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_cell_add_paragraph.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_comments_add_comment.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_comments_get.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_document_audit.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_document_element.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_enum_section.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_font_audit.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_header_footer.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_hyperlink.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_inline_shape.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_insert_paragraph_before.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_misc.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_paragraph_strict.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_paragraph_style.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_paragraph_style_strict.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_parfmt.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_row_col_cell.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_run_add_break.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_run_bool_setters.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_run_style.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_run_style_strict.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_run_text.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_run_underline.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_section_audit.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_section_dimensions.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_section_onoff.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_settings.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_shared_audit.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_style.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_styles.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_table_audit.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_table_cell.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_table_dimensions.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_silent_stub_table_layout.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_smoke_integration.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_style_acceptance.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_style_font.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_style_setters_contract.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_table_set_cell_perf.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_table_style_id_resolution.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_temporarily_unavailable.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_validate_find_replace_asset_script.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_wire_contract.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_xml_attr_guard.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/test_zod_wire_contract.py +0 -0
- {athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: athena-python-docx
|
|
3
|
-
Version: 0.18.
|
|
3
|
+
Version: 0.18.2
|
|
4
4
|
Summary: Drop-in replacement for python-docx that connects to Athena's Superdoc/Keryx collaborative document stack
|
|
5
5
|
Project-URL: Homepage, https://athenaintelligence.ai
|
|
6
6
|
Author-email: Athena Intelligence <engineering@athenaintelligence.ai>
|
|
@@ -463,11 +463,17 @@ class Document:
|
|
|
463
463
|
from docx.text.paragraph import Paragraph
|
|
464
464
|
|
|
465
465
|
self._ensure_open()
|
|
466
|
+
# Request the inlined run breakdown so each yielded Paragraph serves
|
|
467
|
+
# ``.text`` / ``.runs`` / ``.style`` from the one ``blocks.list`` instead
|
|
468
|
+
# of a ``get_node_by_id`` per item — without this, iterating and reading
|
|
469
|
+
# N blocks is N round-trips (each a full Y.Doc reload on docx-editor).
|
|
470
|
+
# Same prefetch as ``Document.paragraphs``; see PERFORMANCE_BATCHING_ANALYSIS.md.
|
|
466
471
|
raw: object = run_sync(
|
|
467
472
|
self._session.doc.blocks.list(
|
|
468
473
|
{
|
|
469
474
|
"nodeTypes": ["paragraph", "heading", "table"],
|
|
470
|
-
"includeText":
|
|
475
|
+
"includeText": True,
|
|
476
|
+
"includeRuns": True,
|
|
471
477
|
},
|
|
472
478
|
),
|
|
473
479
|
)
|
|
@@ -488,10 +494,18 @@ class Document:
|
|
|
488
494
|
if nt == "table":
|
|
489
495
|
yield Table(session=self._session, node_id=node_id)
|
|
490
496
|
else:
|
|
497
|
+
# Seed the read cache when the server inlined this block's runs
|
|
498
|
+
# (get_node_by_id-shaped snapshot, consumed unchanged by
|
|
499
|
+
# Paragraph._node_info). Tables / un-inlined blocks fall back to
|
|
500
|
+
# live queries.
|
|
501
|
+
snapshot: dict | None = (
|
|
502
|
+
{"node": b} if isinstance(b.get("paragraph"), dict) else None
|
|
503
|
+
)
|
|
491
504
|
yield Paragraph(
|
|
492
505
|
session=self._session,
|
|
493
506
|
node_id=node_id,
|
|
494
507
|
node_type=nt if isinstance(nt, str) else "paragraph",
|
|
508
|
+
node_info_snapshot=snapshot,
|
|
495
509
|
)
|
|
496
510
|
|
|
497
511
|
@property
|
|
@@ -2210,10 +2224,17 @@ def _extract_inserted_node_id(result: dict, *, expected_type: str) -> str:
|
|
|
2210
2224
|
if block_id:
|
|
2211
2225
|
return block_id
|
|
2212
2226
|
|
|
2213
|
-
# Shape 3 — top-level blockId or target.blockId.
|
|
2227
|
+
# Shape 3 — top-level blockId / nodeId, or target.blockId. The docx-editor
|
|
2228
|
+
# engine returns a flat ``{"changed": True, "nodeId": "<paraId>"}`` for
|
|
2229
|
+
# create ops (no SuperDoc-style nesting), so accept a top-level ``nodeId``
|
|
2230
|
+
# too — otherwise response-bearing creates (insert_paragraph_before,
|
|
2231
|
+
# add_caption) raise "did not return nodeId" even though the block was made.
|
|
2214
2232
|
top_block: object = result.get("blockId")
|
|
2215
2233
|
if isinstance(top_block, str) and top_block:
|
|
2216
2234
|
return top_block
|
|
2235
|
+
top_node: object = result.get("nodeId")
|
|
2236
|
+
if isinstance(top_node, str) and top_node:
|
|
2237
|
+
return top_node
|
|
2217
2238
|
top_target: object = result.get("target")
|
|
2218
2239
|
if isinstance(top_target, dict):
|
|
2219
2240
|
tb: str = str(top_target.get("blockId", ""))
|
|
@@ -384,6 +384,11 @@ class Table:
|
|
|
384
384
|
# ``table-auto-…`` id, followed by ``ValidationError: Cell (r,c)
|
|
385
385
|
# not found`` when a cell access hit the wrong table.
|
|
386
386
|
self._doc_index: int | None = doc_index
|
|
387
|
+
# Set True once any cell merge is applied through this proxy. The
|
|
388
|
+
# positional cell-id fast path (``_Cell._positional_cell_id``) is only
|
|
389
|
+
# valid on a uniform grid, so a merged table must fall back to the
|
|
390
|
+
# query/walk-back path that aliases secondary slots to the master.
|
|
391
|
+
self._has_merges: bool = False
|
|
387
392
|
# Header/footer part identity. ``_header_footer_ref_id`` is the
|
|
388
393
|
# relationship id (e.g. ``"rId9"``) returned by
|
|
389
394
|
# ``header_footers.parts.create`` that points the section sectPr
|
|
@@ -1490,7 +1495,48 @@ class _Cell:
|
|
|
1490
1495
|
return None
|
|
1491
1496
|
return None
|
|
1492
1497
|
|
|
1498
|
+
def _positional_cell_id(self) -> str | None:
|
|
1499
|
+
"""Compute the docx-editor cell id (``tc:tableIndex:row:col``)
|
|
1500
|
+
client-side, or return ``None`` to fall back to the query path.
|
|
1501
|
+
|
|
1502
|
+
docx-editor cell ids are purely positional — a function of the
|
|
1503
|
+
table's ``t:N`` id plus grid position — so a cell-format op
|
|
1504
|
+
(``set_shading`` / ``set_borders`` / cell properties) can build its
|
|
1505
|
+
address WITHOUT a ``tables.get_cells`` round-trip. On docx-editor
|
|
1506
|
+
every such query is a full Y.Doc reload (no session pool), so resolving
|
|
1507
|
+
~one per cell is what makes a styled table slow; this mirrors how
|
|
1508
|
+
athena-python-pptx addresses shapes by client-assigned id so the whole
|
|
1509
|
+
build buffers into one batch.
|
|
1510
|
+
|
|
1511
|
+
Reads the proxy's stored ``_node_id`` with NO round-trip. SuperDoc
|
|
1512
|
+
tables carry real (non-``t:N``) node ids → returns ``None`` so the
|
|
1513
|
+
caller queries (SuperDoc is pooled, so that read is cheap anyway). A
|
|
1514
|
+
freshly-created docx-editor table still holds a client UUID until its
|
|
1515
|
+
create flushes, so the first cell op falls back to the query (which
|
|
1516
|
+
flushes + rotates ``_node_id`` to ``t:N``) and every subsequent cell
|
|
1517
|
+
op fast-paths.
|
|
1518
|
+
|
|
1519
|
+
Gated to a **known uniform grid**: the table must have been created
|
|
1520
|
+
via :meth:`Document.add_table` (so ``_doc_index`` is set and the full
|
|
1521
|
+
structure is known) AND have no merge applied (``_has_merges``). A
|
|
1522
|
+
merge aliases each secondary slot back to the top-left master — the
|
|
1523
|
+
``_cell_info`` walk-back is what performs that mapping — so a merged
|
|
1524
|
+
table, or a read-loaded table whose merge state is unknown
|
|
1525
|
+
(``_doc_index is None``, possible template merges we can't see), must
|
|
1526
|
+
fall back to the query path to stay address-correct.
|
|
1527
|
+
"""
|
|
1528
|
+
table = self._table
|
|
1529
|
+
if getattr(table, "_doc_index", None) is None or getattr(table, "_has_merges", False):
|
|
1530
|
+
return None
|
|
1531
|
+
nid = getattr(table, "_node_id", None)
|
|
1532
|
+
if isinstance(nid, str) and nid.startswith("t:") and nid[2:].isdigit():
|
|
1533
|
+
return f"tc:{nid[2:]}:{self._row}:{self._col}"
|
|
1534
|
+
return None
|
|
1535
|
+
|
|
1493
1536
|
def _cell_id(self) -> str:
|
|
1537
|
+
positional = self._positional_cell_id()
|
|
1538
|
+
if positional is not None:
|
|
1539
|
+
return positional
|
|
1494
1540
|
info = self._cell_info()
|
|
1495
1541
|
if info is None:
|
|
1496
1542
|
raise ValidationError(
|
|
@@ -2115,6 +2161,11 @@ class _Cell:
|
|
|
2115
2161
|
},
|
|
2116
2162
|
),
|
|
2117
2163
|
)
|
|
2164
|
+
# A merge breaks the uniform-grid assumption the positional cell-id
|
|
2165
|
+
# fast path relies on, so force every subsequent cell address on this
|
|
2166
|
+
# table through the query/walk-back path that aliases secondary slots
|
|
2167
|
+
# to the master.
|
|
2168
|
+
self._table._has_merges = True
|
|
2118
2169
|
# Return the top-left cell. If self is already the top-left,
|
|
2119
2170
|
# return self so we keep cached state; otherwise build a fresh
|
|
2120
2171
|
# _Cell at the top-left address.
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "athena-python-docx"
|
|
7
|
-
version = "0.18.
|
|
7
|
+
version = "0.18.2"
|
|
8
8
|
description = "Drop-in replacement for python-docx that connects to Athena's Superdoc/Keryx collaborative document stack"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
@@ -268,6 +268,16 @@ def test_extract_inserted_node_id_shapes() -> None:
|
|
|
268
268
|
}
|
|
269
269
|
assert _extract_inserted_node_id(r3, expected_type="paragraph") == "nX"
|
|
270
270
|
|
|
271
|
+
# docx-editor engine shape — flat top-level ``nodeId`` (no SuperDoc nesting).
|
|
272
|
+
# This is what ``CreateParagraph`` returns on docx-editor; before the fix it
|
|
273
|
+
# fell through to "" and ``insert_paragraph_before`` raised on success.
|
|
274
|
+
r4 = {"changed": True, "nodeId": "87753FA6"}
|
|
275
|
+
assert _extract_inserted_node_id(r4, expected_type="paragraph") == "87753FA6"
|
|
276
|
+
|
|
277
|
+
# docx-editor also (post server-fix) emits the nested type-keyed shape.
|
|
278
|
+
r5 = {"changed": True, "nodeId": "AB12CD34", "paragraph": {"nodeId": "AB12CD34"}}
|
|
279
|
+
assert _extract_inserted_node_id(r5, expected_type="paragraph") == "AB12CD34"
|
|
280
|
+
|
|
271
281
|
# Unparseable — returns empty string
|
|
272
282
|
assert _extract_inserted_node_id({}, expected_type="paragraph") == ""
|
|
273
283
|
assert _extract_inserted_node_id("not a dict", expected_type="paragraph") == "" # type: ignore[arg-type]
|
|
@@ -35,6 +35,43 @@ def test_document_iter_inner_content_yields_paragraphs_then_table() -> None:
|
|
|
35
35
|
assert all(isinstance(i, (Paragraph, Table)) for i in items)
|
|
36
36
|
|
|
37
37
|
|
|
38
|
+
def test_iter_inner_content_prefetches_runs_no_per_item_reads() -> None:
|
|
39
|
+
"""``iter_inner_content`` requests ``includeRuns`` and seeds each yielded
|
|
40
|
+
Paragraph's snapshot, so reading ``.text`` / ``.runs`` / ``.style`` per item
|
|
41
|
+
costs no extra ``getNodeById`` — the slow path was one query per block (each a
|
|
42
|
+
full Y.Doc reload on docx-editor). Mirrors ``Document.paragraphs``."""
|
|
43
|
+
install_fake_session()
|
|
44
|
+
from docx import Document
|
|
45
|
+
from docx.text.paragraph import Paragraph
|
|
46
|
+
|
|
47
|
+
doc = Document("asset_fake")
|
|
48
|
+
doc.add_paragraph("Intro")
|
|
49
|
+
doc.add_heading("Section A", level=1)
|
|
50
|
+
doc.add_paragraph("Body")
|
|
51
|
+
|
|
52
|
+
items = list(doc.iter_inner_content())
|
|
53
|
+
|
|
54
|
+
# The listing asked the server to inline runs.
|
|
55
|
+
block_list_calls = [
|
|
56
|
+
params
|
|
57
|
+
for op, params in doc._session.calls()
|
|
58
|
+
if op == "blocks.list" and params.get("includeRuns") is True
|
|
59
|
+
]
|
|
60
|
+
assert block_list_calls
|
|
61
|
+
|
|
62
|
+
# Reading text/style/runs off the iterated paragraphs issues NO per-item reads.
|
|
63
|
+
calls_before: int = len(doc._session.calls())
|
|
64
|
+
for item in items:
|
|
65
|
+
if isinstance(item, Paragraph):
|
|
66
|
+
_ = item.text
|
|
67
|
+
_ = item.style
|
|
68
|
+
_ = list(item.runs)
|
|
69
|
+
extra_node_reads = [
|
|
70
|
+
op for op, _ in doc._session.calls()[calls_before:] if op == "getNodeById"
|
|
71
|
+
]
|
|
72
|
+
assert extra_node_reads == []
|
|
73
|
+
|
|
74
|
+
|
|
38
75
|
def test_document_paragraphs_prefetches_runs_in_one_listing() -> None:
|
|
39
76
|
"""``Document.paragraphs`` issues ONE rich ``blocks.list(includeRuns=True)``
|
|
40
77
|
and hydrates every proxy's text/style/runs from it — so iterating and reading
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"""docx-editor cell ids are positional (``tc:tableIndex:row:col``) and are
|
|
2
|
+
computed client-side — no ``tables.get_cells`` round-trip. On docx-editor each
|
|
3
|
+
such query is a full Y.Doc reload (no session pool), so a styled table that
|
|
4
|
+
calls ``set_shading`` / ``set_borders`` per cell used to pay one reload per
|
|
5
|
+
cell. SuperDoc tables (real, non-positional node ids) still resolve via the
|
|
6
|
+
query (SuperDoc is pooled, so that read is cheap).
|
|
7
|
+
|
|
8
|
+
This mirrors how athena-python-pptx addresses shapes by client-assigned id so
|
|
9
|
+
the whole build buffers into one batch instead of interleaving read-backs.
|
|
10
|
+
|
|
11
|
+
The fast path is gated to a **known uniform grid**: a table created via
|
|
12
|
+
``Document.add_table`` (``_doc_index`` set) with no merge applied
|
|
13
|
+
(``_has_merges`` falsy). A merged table aliases secondary slots back to the
|
|
14
|
+
top-left master and a read-loaded table may carry template merges we can't
|
|
15
|
+
see — both fall back to the ``tables.get_cells`` walk-back path to stay
|
|
16
|
+
address-correct.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class _CountingGetCells:
|
|
23
|
+
"""Async ``tables.get_cells`` stub that counts invocations."""
|
|
24
|
+
|
|
25
|
+
def __init__(self, cell_id: str = "superdoc_real_cell_id") -> None:
|
|
26
|
+
self.calls = 0
|
|
27
|
+
self._cell_id = cell_id
|
|
28
|
+
|
|
29
|
+
async def __call__(self, params: dict) -> dict: # noqa: ARG002
|
|
30
|
+
self.calls += 1
|
|
31
|
+
return {"cells": [{"nodeId": self._cell_id, "colspan": 1, "rowspan": 1}]}
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class _TableStub:
|
|
35
|
+
def __init__(
|
|
36
|
+
self,
|
|
37
|
+
node_id: str,
|
|
38
|
+
get_cells: _CountingGetCells,
|
|
39
|
+
*,
|
|
40
|
+
doc_index: int | None = 0,
|
|
41
|
+
has_merges: bool = False,
|
|
42
|
+
) -> None:
|
|
43
|
+
self._node_id = node_id
|
|
44
|
+
# A real ``add_table`` grid sets ``_doc_index``; read-loaded tables
|
|
45
|
+
# (``doc.tables`` / iteration) leave it ``None``. ``_has_merges`` flips
|
|
46
|
+
# True once ``_Cell.merge`` is applied.
|
|
47
|
+
self._doc_index = doc_index
|
|
48
|
+
self._has_merges = has_merges
|
|
49
|
+
doc = type("_Doc", (), {"tables": type("_T", (), {"get_cells": get_cells})()})()
|
|
50
|
+
self._session = type("_S", (), {"doc": doc})()
|
|
51
|
+
|
|
52
|
+
def _fresh_node_id(self) -> str:
|
|
53
|
+
return self._node_id
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def test_docx_editor_cell_id_is_positional_with_no_query() -> None:
|
|
57
|
+
from docx.table import _Cell
|
|
58
|
+
|
|
59
|
+
gc = _CountingGetCells()
|
|
60
|
+
table = _TableStub("t:0", gc)
|
|
61
|
+
cell = _Cell(table=table, row=1, col=2) # type: ignore[arg-type]
|
|
62
|
+
|
|
63
|
+
assert cell._cell_id() == "tc:0:1:2"
|
|
64
|
+
assert gc.calls == 0 # computed client-side, no tables.get_cells round-trip
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def test_docx_editor_cell_address_shape_no_query() -> None:
|
|
68
|
+
from docx.table import _Cell
|
|
69
|
+
|
|
70
|
+
gc = _CountingGetCells()
|
|
71
|
+
table = _TableStub("t:3", gc)
|
|
72
|
+
cell = _Cell(table=table, row=0, col=0) # type: ignore[arg-type]
|
|
73
|
+
|
|
74
|
+
assert cell._cell_address() == {
|
|
75
|
+
"kind": "block",
|
|
76
|
+
"nodeType": "tableCell",
|
|
77
|
+
"nodeId": "tc:3:0:0",
|
|
78
|
+
}
|
|
79
|
+
assert gc.calls == 0
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def test_superdoc_cell_id_falls_back_to_query() -> None:
|
|
83
|
+
from docx.table import _Cell
|
|
84
|
+
|
|
85
|
+
gc = _CountingGetCells(cell_id="superdoc_real_id")
|
|
86
|
+
# A real (non-``t:N``) node id is the SuperDoc shape → must resolve via query.
|
|
87
|
+
table = _TableStub("nodeXYZ123", gc)
|
|
88
|
+
cell = _Cell(table=table, row=0, col=0) # type: ignore[arg-type]
|
|
89
|
+
|
|
90
|
+
assert cell._cell_id() == "superdoc_real_id"
|
|
91
|
+
assert gc.calls >= 1
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def test_merged_table_falls_back_to_query() -> None:
|
|
95
|
+
from docx.table import _Cell
|
|
96
|
+
|
|
97
|
+
# A docx-editor ``t:N`` table that has had a merge applied must NOT
|
|
98
|
+
# fast-path: the positional id of a secondary slot would skip the
|
|
99
|
+
# walk-back that aliases it to the merge master.
|
|
100
|
+
gc = _CountingGetCells(cell_id="tc:0:0:0") # server resolves to the master
|
|
101
|
+
table = _TableStub("t:0", gc, has_merges=True)
|
|
102
|
+
cell = _Cell(table=table, row=0, col=1) # type: ignore[arg-type]
|
|
103
|
+
|
|
104
|
+
assert cell._cell_id() == "tc:0:0:0" # master, via the query walk-back
|
|
105
|
+
assert gc.calls >= 1
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def test_read_loaded_table_falls_back_to_query() -> None:
|
|
109
|
+
from docx.table import _Cell
|
|
110
|
+
|
|
111
|
+
# A read-loaded table (``doc.tables`` / iteration → ``_doc_index is None``)
|
|
112
|
+
# may carry template merges we can't see, so it must query rather than
|
|
113
|
+
# assume a uniform grid.
|
|
114
|
+
gc = _CountingGetCells(cell_id="tc:0:0:1")
|
|
115
|
+
table = _TableStub("t:0", gc, doc_index=None)
|
|
116
|
+
cell = _Cell(table=table, row=0, col=1) # type: ignore[arg-type]
|
|
117
|
+
|
|
118
|
+
assert cell._cell_id() == "tc:0:0:1"
|
|
119
|
+
assert gc.calls >= 1
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/scripts/smoke_test_block_not_found.py
RENAMED
|
File without changes
|
{athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/scripts/validate_find_replace_asset.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/firm_templates/README.md
RENAMED
|
File without changes
|
{athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/firm_templates/__init__.py
RENAMED
|
File without changes
|
{athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/firm_templates/_runner.py
RENAMED
|
File without changes
|
{athena_python_docx-0.18.0 → athena_python_docx-0.18.2}/tests/fidelity/firm_templates/extractor.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|