athena-python-docx 0.45.0__tar.gz → 0.45.1__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.45.0 → athena_python_docx-0.45.1}/PKG-INFO +1 -1
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/__init__.py +1 -1
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_asset_token.py +18 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_http.py +25 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_http_doc.py +10 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/pyproject.toml +1 -1
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_asset_tokens.py +63 -5
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_public_create.py +67 -4
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/uv.lock +1 -1
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/.gitignore +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/AGENTS.md +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/CLAUDE.md +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/DOCX_EXEC_LAB.md +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/README.md +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_athena_extension.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_batching.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_buffer.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_capabilities.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_citations.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_execution.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_image_utils.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_postproc.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_proxy.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_ptc.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_public_create.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_references.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_run_order.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_table_styles.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_timeouts.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_tracked.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/_xml_text.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/api.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/blkcntnr.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/bookmarks.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/charts.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/client.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/commands.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/comments.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/document.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/drawing/__init__.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/enum/__init__.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/enum/base.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/enum/dml.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/enum/section.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/enum/shape.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/enum/style.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/enum/table.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/enum/text.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/errors.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/exceptions.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/fields.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/footnotes.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/image/__init__.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/image/exceptions.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/image/image.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/math.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/opc/__init__.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/opc/coreprops.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/oxml/__init__.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/revisions.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/sdt.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/section.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/session.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/settings.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/shape.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/shared.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/styles/__init__.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/styles/_table.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/styles/latent.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/styles/style.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/styles/styles.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/table.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/text/__init__.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/text/font.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/text/hyperlink.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/text/pagebreak.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/text/paragraph.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/text/parfmt.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/text/run.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/text/tabstops.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/toc.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/docx/typing.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/scripts/docx_exec_lab.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/scripts/docx_exec_lab_examples/fast_table_fill.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/scripts/docx_exec_lab_examples/find_replace_literal.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/scripts/docx_exec_lab_server.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/scripts/dump_wire_fixtures.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/scripts/release.sh +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/scripts/round_trip_smoke.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/scripts/smoke_test_block_not_found.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/scripts/validate_find_replace_asset.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/__init__.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/conftest.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/METHODOLOGY.md +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/README.md +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/__init__.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ab_probe/__init__.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ab_probe/agent_documents.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ab_probe/default_style_run_formatting.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ab_probe/header_footer_pictures.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ab_probe/less_used_writes.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ab_probe/merged_cell_identity.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ab_probe/paragraph_text_setter.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ab_probe/picture_runs.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ab_probe/proxy_equality.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ab_probe/return_types.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ab_probe/xml_incompatible_text.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ab_probe/zero_and_negative_indents.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ab_probe_cases.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ab_probe_runner.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/auto_gen_cases.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/binary_round_trip.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/cases.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/complex_cases.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/coverage_report.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/extract.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/extreme_cases.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/fake_session.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/firm_templates/README.md +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/firm_templates/__init__.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/firm_templates/_runner.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/firm_templates/extractor.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/firm_templates/test_pw_corpus.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/firm_templates/test_pw_research_digest.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/local_runner.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/mega_cases.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshot.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/01_basic_paragraph.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/02_multiple_headings.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/03_runs_with_formatting.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/04_font_name_and_size.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/05_font_color_rgb.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/06_font_character_properties.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/07_font_subscript_superscript.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/08_font_highlight.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/09_paragraph_alignment.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/100_table_negative_indexing.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/101_table_cells_flat_iteration.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/102_text_with_embedded_special_chars.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/104_core_properties_datetime.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/105_default_one_section.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/106_heading_paragraph_format.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/107_varying_row_heights.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/10_paragraph_indents.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/11_paragraph_spacing.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/12_paragraph_keep_options.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/13_paragraph_tab_stops.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/14_run_add_tab_and_break.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/15_run_add_break_page.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/16_paragraph_clear_and_insert_before.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/17_table_basic.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/18_table_cell_text.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/19_table_row_column_sizing.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/20_table_cell_vertical_alignment.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/21_table_alignment_and_autofit.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/22_table_cell_paragraphs_iteration.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/24_table_add_row_column.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/25_table_merge_cells.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/26_section_page_setup.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/27_section_margins.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/28_section_add_new.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/29_section_headers_linked.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/30_styles_iteration.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/31_styles_lookup_and_default.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/32_styles_add_paragraph_style.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/33_core_properties_set_and_get.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/34_inline_shapes_iterate_empty.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/35_full_report.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/36_replace_text_in_paragraph.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/37_iterate_runs_and_format_all_bold.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/38_font_all_properties.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/39_large_body_100_paragraphs.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/40_large_table_10x10.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/41_unicode_and_emoji.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/42_very_long_paragraph.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/43_paragraph_text_round_trip.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/44_paragraph_alignment_round_trip.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/45_cell_text_round_trip.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/46_run_text_setter_round_trip.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/47_font_size_round_trip.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/48_font_color_round_trip.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/49_resume_layout.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/50_multi_section_doc.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/52_iterate_everything.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/53_apply_style_to_paragraphs.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/54_empty_everything.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/55_single_character_runs.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/56_everything_in_one.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/57_runs_after_multiple_text_appends.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/58_modify_runs_in_place.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/59_indent_round_trip.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/60_space_round_trip.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/61_cell_paragraph_with_runs.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/62_many_cell_paragraphs.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/63_table_style_round_trip.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/64_many_sections.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/65_20x20_table_formatted.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/66_toc_like_structure.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/67_paragraph_insert_before_chain.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/68_invoice.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/69_newsletter.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/70_add_and_iterate_back.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/71_academic_paper.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/72_legal_contract.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/73_form_with_many_tables.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/74_paragraph_with_10_runs.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/75_paragraph_negative_first_line_indent.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/76_rgbcolor_from_string.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/77_length_unit_conversions.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/78_paragraph_copy_style.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/79_bulk_cell_formatting.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/80_apply_style_after_add_run.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/81_multi_page_with_breaks.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/82_add_text_on_existing_run.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/83_clear_then_repopulate_paragraph.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/84_table_reread_row_count.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/85_header_footer_access.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/86_font_read_unset_returns_none.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/87_500_paragraph_doc.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/88_mixed_content_iteration.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/89_alignment_clear_via_none.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/90_cell_add_paragraph_styled.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/91_many_small_tables.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/92_margins_every_section.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/93_font_bool_reads_after_set.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/94_page_break_before_paragraph.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/95_paragraph_hyperlinks_empty.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/96_paragraph_contains_page_break.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/97_document_styles_by_key.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/98_style_contains_check.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/99_run_add_picture_from_bytes.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex02_unicode_everywhere.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex03_1000_paragraphs.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex04_50x50_table.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex05_long_text_in_cell.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex06_hundred_tiny_runs.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex07_every_font_boolean.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex08_many_continuous_sections.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex09_many_tab_stops.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex10_complex_bom.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex11_banded_rows_formatting.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex12_section_reconfigure.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex13_cell_with_10_paragraphs.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex14_styled_report_table.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex15_paragraph_all_format_props.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex16_runs_interleaved_with_breaks.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex17_all_break_kinds.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex18_read_back_large_doc.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex19_mutate_all_runs.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/ex20_kitchen_sink_v2.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/mega01_book_chapter.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/mega02_research_proposal.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/mega03_financial_statement.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/mega04_recipe_card.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/mega05_user_manual.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/mega06_complex_newsletter.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/mega07_budget_spreadsheet.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/mega08_product_catalog.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/mega09_signed_contract.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/mega10_api_documentation.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw01_official_quickstart.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw02_paragraph_style_list.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw03_character_formatting.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw04_section_page_setup.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw05_toc_pattern.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw06_meeting_minutes.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw07_dense_formatting_demo.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw08_table_merged_header.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw09_bulk_run_iteration.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw10_colored_grid_table.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw11_header_text.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw12_first_page_footer.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw13_even_page_header.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw15_paragraph_style_instance.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw16_header_footer_tables.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw17_header_letterhead_filled.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw18_header_table_properties.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw19_header_table_rows_columns.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/op_snapshots/rw20_header_table_merges.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ours_spec.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/parity_crawl.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/parity_diff.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/real_world_cases.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/round_trip_tests.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/stock_spec.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/test_e2e_against_staging.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fixtures/field_reads.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fixtures/note_reference_reads.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fixtures/ruby_reads.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fixtures/symbol_reads.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/live/__init__.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/live/baseline.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/live/fixture_scripts.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/live/reader.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/live/runner.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/live/sdk_driver.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/live/stock_driver.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/live/test_live_runner.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/parity/README.md +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/parity/__init__.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/parity/baseline_gaps.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/parity/compare.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/parity/intentional_deviations.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/parity/introspect.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/parity/reports/GAP_ANALYSIS.md +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/parity/reports/gap_report.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/parity/run_parity.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/parity/snapshots/athena_latest.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/parity/snapshots/upstream_python_docx_1.2.0.json +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/parity/test_parity_gap.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_add_section.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_add_section_extract_items.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_alignment_values.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_athena_extension_creates_session_open.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_athena_extensions_contract.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_athena_extensions_registry.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_batch_chunking.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_batching_perf.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_battery_cases.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_block_not_found_error.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_buffer.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_cell_add_paragraph_wire_shape.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_cell_add_table_not_supported.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_cell_borders_spec.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_cell_fastpath_runs.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_cell_inner_add_hyperlink_stash.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_cell_inner_add_run_via_cell_insert.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_cell_inner_format_stash.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_cell_inner_run_format_stash.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_cell_inner_run_guard.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_cell_merge.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_cell_nested_tables.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_cell_paragraphs_listed.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_cell_text_plain_fastpath.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_cell_text_replace_semantics.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_citations.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_collapsed_range_format.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_color_format_theme.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_command_dataclasses.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_commands.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_comment_paragraphs.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_comments.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_comments_first_read.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_content_control_value.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_core_properties.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_create_workspace.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_document_asset_id_property.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_document_clear.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_document_create.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_document_create_from_template.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_document_factory_validation.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_document_settings_session_open.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_docx_exec_lab.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_docx_exec_lab_server.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_drawing_image.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_e2e_partial_failure_cascade.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_empty_hyperlinks.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_enum_parity.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_execution_scope.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_export_docx_clean.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_export_rescue_anchors.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_field_reads_python_docx_parity.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_field_refresh.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_field_runs.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_find_replace_session_open.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_flushed_write_failures.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_http_transport.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_hyperlink_coalescing.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_image_url_data_uri.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_inline_page_break.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_inline_shape_alt_text.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_inline_shape_size.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_inline_shape_type.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_inline_shapes_floating.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_insert_deferred.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_iter_inner_content.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_latent_style_writes.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_line_clear_break.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_list_styles.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_listed_paragraph_reads.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_literal_no_break_hyphens.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_literal_soft_hyphens.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_merged_cell_identity.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_merged_cell_secondary_slot.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_merged_cells.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_missing_modules.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_nested_table_refused.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_note_reference_reads_python_docx_parity.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_oxml_shim.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_page_break.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_paragraph_delete.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_paragraph_indent_reads.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_paragraph_runs_hyperlinks.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_paragraph_text_empty_run.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_paragraph_text_len_cache.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_parfmt_clears.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_parity_misc.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_parity_round2.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_partial_failure_cascade.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_pdf_export_and_page_renders.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_phase_a_behavior.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_phase_b_headers_footers.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_phase_c_tables.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_positional_cell_id.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_postproc_cell_format_rewrite.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_postproc_cell_run_format_rewrite.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_postproc_ref_restore.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_pr19766_review_fixes.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_proxy_equality.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_ptc.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_python_docx_api_parity.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_read_run_ranges.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_rendered_page_breaks.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_repeated_node_read.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_restart_numbering.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_revisions.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_round_trip_smoke_script.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_ruby_reads_python_docx_parity.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_run_add_picture_anchor.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_run_break_inner_content.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_run_edges.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_run_formatting_wire.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_run_identity.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_run_later_runs.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_run_mark_inheritance.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_run_page_number_blocks.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_run_table_style_objects.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_run_text_python_docx.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_run_text_refreshes_paragraph.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_run_unmodeled_toggles.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_sdk_reads_served.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_section_read_lengths.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_sections_empty_list.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_add_paragraph_style.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_add_picture.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_add_run.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_cell_add_paragraph.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_comments_add_comment.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_comments_get.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_document_audit.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_document_element.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_enum_section.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_font_audit.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_header_footer.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_hyperlink.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_inline_shape.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_insert_paragraph_before.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_misc.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_paragraph_strict.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_paragraph_style.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_paragraph_style_strict.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_parfmt.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_row_col_cell.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_run_add_break.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_run_bool_setters.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_run_style.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_run_style_strict.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_run_text.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_run_underline.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_section_audit.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_section_dimensions.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_section_onoff.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_settings.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_shared_audit.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_style.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_styles.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_table_audit.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_table_cell.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_table_dimensions.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_silent_stub_table_layout.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_smoke_integration.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_style_acceptance.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_style_delete.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_style_font.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_style_formatting_writes.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_style_metadata_writes.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_style_names.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_style_resolution.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_style_setters_contract.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_style_tab_stops.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_style_tab_stops_read.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_symbol_reads_python_docx_parity.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_tab_stop_writes.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_table_add_row_grid_row.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_table_anchors.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_table_clears.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_table_direction.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_table_length_reads.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_table_listing_reads.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_table_read_reuse.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_table_set_cell_perf.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_table_style_id_resolution.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_temporarily_unavailable.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_text_control_characters.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_tracked_revisions_offsets.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_unmapped_alignment_reads.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_uv_lock_version.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_validate_find_replace_asset_script.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_versioned_read_reuse.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_wire_contract.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_xml_attr_guard.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_xml_incompatible_text.py +0 -0
- {athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/test_zod_wire_contract.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: athena-python-docx
|
|
3
|
-
Version: 0.45.
|
|
3
|
+
Version: 0.45.1
|
|
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>
|
|
@@ -17,6 +17,14 @@ Creating a document (``Document.create``, its upload) keeps the key of 1, 2 or
|
|
|
17
17
|
API creates it instead (``docx._public_create``). A token goes only to its own
|
|
18
18
|
document's routes.
|
|
19
19
|
|
|
20
|
+
An Athena runtime credential (a computer's, a session VM's or a notebook
|
|
21
|
+
kernel's ``ATHENA_API_KEY``: ``athcomp_``, ``athsvm_``, ``athnb_``) is never
|
|
22
|
+
sent to DOCX Studio, which takes none, nor to Athena's older creation routes
|
|
23
|
+
outside its public API: a call that would send one (another document's routes,
|
|
24
|
+
an Athena without the studio-token route, no ``ATHENA_API_URL``, a create or an
|
|
25
|
+
upload Athena's public API cannot take) refuses before any request, naming what
|
|
26
|
+
to set (:func:`is_runtime_credential`).
|
|
27
|
+
|
|
20
28
|
A token is minted once per (agora, key, asset, access) for the whole process,
|
|
21
29
|
again 90 seconds before it expires, and once more when the studio answers 401.
|
|
22
30
|
A read mints a read-only token (``{"access": "view"}``: the version check, the
|
|
@@ -70,6 +78,16 @@ PUBLIC_API_PREFIX = "/api/v0"
|
|
|
70
78
|
VIEW = "view"
|
|
71
79
|
EDIT = "edit"
|
|
72
80
|
|
|
81
|
+
#: How the credentials Athena mints for a runtime begin: a computer's, a session
|
|
82
|
+
#: VM's and a notebook kernel's own ``ATHENA_API_KEY``. Only Athena's public API
|
|
83
|
+
#: takes one; a studio never does.
|
|
84
|
+
RUNTIME_CREDENTIAL_PREFIXES = ("athcomp_", "athsvm_", "athnb_")
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def is_runtime_credential(key: str | None) -> bool:
|
|
88
|
+
"""Whether ``key`` is a credential Athena minted for a runtime, which no studio takes."""
|
|
89
|
+
return bool(key) and str(key).startswith(RUNTIME_CREDENTIAL_PREFIXES)
|
|
90
|
+
|
|
73
91
|
#: Minted again this long before Athena's ``expires_at_ms``.
|
|
74
92
|
REFRESH_BEFORE_EXPIRY_SECONDS = 90.0
|
|
75
93
|
#: The longest a token is held, whatever the local clock says (Athena's lifetime).
|
|
@@ -54,6 +54,29 @@ def _resolve_api_key(api_key: str | None) -> str | None:
|
|
|
54
54
|
return api_key or os.environ.get(_API_KEY_ENV) or os.environ.get("ATHENA_API_KEY")
|
|
55
55
|
|
|
56
56
|
|
|
57
|
+
def _refuse_runtime_credential(*, key: str | None, action: str) -> None:
|
|
58
|
+
"""Refuse, before any request, to send an Athena runtime credential where
|
|
59
|
+
Athena's public API could not take the call.
|
|
60
|
+
|
|
61
|
+
A computer's, session VM's or notebook's own ``ATHENA_API_KEY`` is accepted
|
|
62
|
+
only by Athena's public API (``/api/v0``). Reaching this point means that
|
|
63
|
+
API could not take the create (no ``ATHENA_API_URL``, or an Athena older
|
|
64
|
+
than its creation routes), and DOCX Studio and agora's older routes refuse
|
|
65
|
+
the credential.
|
|
66
|
+
"""
|
|
67
|
+
from docx._asset_token import is_runtime_credential
|
|
68
|
+
|
|
69
|
+
if is_runtime_credential(key):
|
|
70
|
+
raise AuthenticationError(
|
|
71
|
+
f"Cannot {action}: ATHENA_API_KEY here is an Athena runtime credential (a "
|
|
72
|
+
"computer's, session's or notebook's own key), which only Athena's public "
|
|
73
|
+
"API accepts, and that API could not take this call (ATHENA_API_URL is "
|
|
74
|
+
"unset, or that Athena predates it). Set ATHENA_API_URL, or set "
|
|
75
|
+
"ATHENA_DOCX_API_KEY (or pass api_key=) to an Athena API key DOCX Studio "
|
|
76
|
+
"accepts.",
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
|
|
57
80
|
def _derive_agora_base_url(docx_base_url: str) -> str | None:
|
|
58
81
|
"""Best-effort derive an Agora base URL from a docx-studio base URL.
|
|
59
82
|
|
|
@@ -153,6 +176,7 @@ def create_empty_document(
|
|
|
153
176
|
"Pass api_key= to Document.create() or set the env var "
|
|
154
177
|
"(or set ATHENA_API_KEY as a fallback).",
|
|
155
178
|
)
|
|
179
|
+
_refuse_runtime_credential(key=resolved_key, action="create the document on DOCX Studio")
|
|
156
180
|
|
|
157
181
|
url: str = resolved_base.rstrip("/") + "/docs/empty"
|
|
158
182
|
# The document is born as its creator's: its first write is signed as the
|
|
@@ -406,6 +430,7 @@ def upload_document(
|
|
|
406
430
|
"Pass api_key= to Document.create() or set the env var "
|
|
407
431
|
"(or set ATHENA_API_KEY as a fallback).",
|
|
408
432
|
)
|
|
433
|
+
_refuse_runtime_credential(key=resolved_key, action="upload the document through agora")
|
|
409
434
|
|
|
410
435
|
if not os.path.exists(docx_path):
|
|
411
436
|
raise SessionError(f"DOCX file not found: {docx_path}")
|
|
@@ -51,6 +51,7 @@ from docx._asset_token import (
|
|
|
51
51
|
SigningUnavailable,
|
|
52
52
|
StudioToken,
|
|
53
53
|
TokenMinter,
|
|
54
|
+
is_runtime_credential,
|
|
54
55
|
)
|
|
55
56
|
from docx._batching import call_abandoned, note_progress
|
|
56
57
|
from docx._buffer import CommandBuffer, keep_reported_message
|
|
@@ -1155,6 +1156,15 @@ class HttpClient:
|
|
|
1155
1156
|
is sent once more with a newly minted one: docx-studio refused it before
|
|
1156
1157
|
acting on it, so nothing is applied twice."""
|
|
1157
1158
|
bearer, grant = self._bearer(asset_id=asset_id, access=access)
|
|
1159
|
+
if grant is None and is_runtime_credential(bearer):
|
|
1160
|
+
raise AuthenticationError(
|
|
1161
|
+
f"DOCX Studio takes no Athena runtime credential, and this client "
|
|
1162
|
+
f"carries no token of {asset_id}. ATHENA_API_KEY here is a computer's, "
|
|
1163
|
+
"session's or notebook's own key, which only Athena's public API "
|
|
1164
|
+
"accepts. Open the document by its asset id (asset_...) with "
|
|
1165
|
+
"ATHENA_API_URL set, or set ATHENA_DOCX_API_KEY (or pass api_key=) to "
|
|
1166
|
+
"an Athena API key DOCX Studio accepts."
|
|
1167
|
+
)
|
|
1158
1168
|
try:
|
|
1159
1169
|
return send(bearer)
|
|
1160
1170
|
except AuthenticationError as exc:
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "athena-python-docx"
|
|
7
|
-
version = "0.45.
|
|
7
|
+
version = "0.45.1"
|
|
8
8
|
description = "Drop-in replacement for python-docx that connects to Athena's DOCX Studio collaborative document stack"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
@@ -38,6 +38,8 @@ ASSET = "asset_8eaf4c95-0d4e-4f4e-9a8f-0b1c2d3e4f50"
|
|
|
38
38
|
OTHER = "asset_1c2d3e4f-0d4e-4f4e-9a8f-0b1c2d3e4f51"
|
|
39
39
|
# Shaped like the scoped credentials Athena puts in ATHENA_API_KEY.
|
|
40
40
|
SCOPED_KEY = "athcomp_scoped-credential"
|
|
41
|
+
# A person's Athena API key, which DOCX Studio takes as it is.
|
|
42
|
+
PERSON_KEY = "person-api-key"
|
|
41
43
|
MINT_URL = f"{AGORA}/api/v0/assets/{ASSET}/studio-token"
|
|
42
44
|
|
|
43
45
|
|
|
@@ -231,12 +233,34 @@ def test_without_athena_api_url_athena_api_key_is_the_bearer_as_before(
|
|
|
231
233
|
world: _World, monkeypatch: pytest.MonkeyPatch
|
|
232
234
|
) -> None:
|
|
233
235
|
monkeypatch.delenv("ATHENA_API_URL")
|
|
236
|
+
monkeypatch.setenv("ATHENA_API_KEY", PERSON_KEY)
|
|
234
237
|
world.studio.append(_applied())
|
|
235
238
|
|
|
236
239
|
_batch(_client())
|
|
237
240
|
|
|
238
241
|
assert world.mint_calls() == []
|
|
239
|
-
assert [call.bearer for call in world.studio_calls()] == [
|
|
242
|
+
assert [call.bearer for call in world.studio_calls()] == [PERSON_KEY]
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
@pytest.mark.parametrize("prefix", ["athcomp_", "athsvm_", "athnb_"])
|
|
246
|
+
def test_a_runtime_credential_never_goes_to_the_studio(
|
|
247
|
+
world: _World, monkeypatch: pytest.MonkeyPatch, prefix: str
|
|
248
|
+
) -> None:
|
|
249
|
+
# Without ATHENA_API_URL nothing mints a token, and DOCX Studio takes no
|
|
250
|
+
# computer's, session VM's or notebook's own key: refused before sending.
|
|
251
|
+
monkeypatch.delenv("ATHENA_API_URL")
|
|
252
|
+
monkeypatch.setenv("ATHENA_API_KEY", f"{prefix}credential")
|
|
253
|
+
client = _client()
|
|
254
|
+
|
|
255
|
+
with pytest.raises(AuthenticationError, match="takes no Athena runtime credential") as caught:
|
|
256
|
+
_batch(client)
|
|
257
|
+
with pytest.raises(AuthenticationError, match="takes no Athena runtime credential"):
|
|
258
|
+
client.get_layout(ASSET)
|
|
259
|
+
with pytest.raises(AuthenticationError, match="takes no Athena runtime credential"):
|
|
260
|
+
_batch(_client(api_key=f"{prefix}credential"))
|
|
261
|
+
|
|
262
|
+
assert "ATHENA_DOCX_API_KEY" in str(caught.value)
|
|
263
|
+
assert world.calls == []
|
|
240
264
|
|
|
241
265
|
|
|
242
266
|
@pytest.mark.parametrize(
|
|
@@ -284,15 +308,34 @@ def test_a_token_goes_only_to_its_own_documents_routes(world: _World) -> None:
|
|
|
284
308
|
client = _client()
|
|
285
309
|
|
|
286
310
|
_batch(client)
|
|
287
|
-
|
|
311
|
+
# Another document gets no token, and the scoped key is never sent to the
|
|
312
|
+
# studio in its place.
|
|
313
|
+
with pytest.raises(AuthenticationError, match="takes no Athena runtime credential"):
|
|
314
|
+
_batch(client, OTHER)
|
|
288
315
|
|
|
289
316
|
assert [(call.url, call.bearer) for call in world.studio_calls()] == [
|
|
290
317
|
(f"{STUDIO}/docs/{ASSET}/commands", f"aat_{ASSET}_edit_1"),
|
|
291
|
-
(f"{STUDIO}/docs/{OTHER}/commands", SCOPED_KEY),
|
|
292
318
|
]
|
|
293
319
|
assert len(world.mint_calls()) == 1
|
|
294
320
|
|
|
295
321
|
|
|
322
|
+
def test_with_a_person_key_another_documents_routes_keep_the_key(
|
|
323
|
+
world: _World, monkeypatch: pytest.MonkeyPatch
|
|
324
|
+
) -> None:
|
|
325
|
+
monkeypatch.setenv("ATHENA_API_KEY", PERSON_KEY)
|
|
326
|
+
world.mints.append(world.mint_ok())
|
|
327
|
+
world.studio.append(_applied())
|
|
328
|
+
client = _client()
|
|
329
|
+
|
|
330
|
+
_batch(client)
|
|
331
|
+
_batch(client, OTHER)
|
|
332
|
+
|
|
333
|
+
assert [(call.url, call.bearer) for call in world.studio_calls()] == [
|
|
334
|
+
(f"{STUDIO}/docs/{ASSET}/commands", f"aat_{ASSET}_edit_1"),
|
|
335
|
+
(f"{STUDIO}/docs/{OTHER}/commands", PERSON_KEY),
|
|
336
|
+
]
|
|
337
|
+
|
|
338
|
+
|
|
296
339
|
# --- read and write access -----------------------------------------------------
|
|
297
340
|
|
|
298
341
|
|
|
@@ -452,7 +495,10 @@ def test_a_503_falls_back_to_a_studio_key_set_since(
|
|
|
452
495
|
assert len(world.mint_calls()) == 1
|
|
453
496
|
|
|
454
497
|
|
|
455
|
-
def test_an_athena_without_the_mint_route_gets_athena_api_key_as_before(
|
|
498
|
+
def test_an_athena_without_the_mint_route_gets_athena_api_key_as_before(
|
|
499
|
+
world: _World, monkeypatch: pytest.MonkeyPatch
|
|
500
|
+
) -> None:
|
|
501
|
+
monkeypatch.setenv("ATHENA_API_KEY", PERSON_KEY)
|
|
456
502
|
# An Athena older than the route: FastAPI's bare 404 for a path no route matches.
|
|
457
503
|
world.mints.append(_response(404, {"detail": "Not Found"}))
|
|
458
504
|
world.studio.extend([_response(200, {"pageCount": 1, "pages": []}), _applied()])
|
|
@@ -462,7 +508,19 @@ def test_an_athena_without_the_mint_route_gets_athena_api_key_as_before(world: _
|
|
|
462
508
|
_batch(client)
|
|
463
509
|
|
|
464
510
|
assert len(world.mint_calls()) == 1
|
|
465
|
-
assert [call.bearer for call in world.studio_calls()] == [
|
|
511
|
+
assert [call.bearer for call in world.studio_calls()] == [PERSON_KEY, PERSON_KEY]
|
|
512
|
+
|
|
513
|
+
|
|
514
|
+
def test_an_athena_without_the_mint_route_never_gets_the_scoped_key_sent_on(
|
|
515
|
+
world: _World,
|
|
516
|
+
) -> None:
|
|
517
|
+
world.mints.append(_response(404, {"detail": "Not Found"}))
|
|
518
|
+
client = _client()
|
|
519
|
+
|
|
520
|
+
with pytest.raises(AuthenticationError, match="takes no Athena runtime credential"):
|
|
521
|
+
client.get_layout(ASSET)
|
|
522
|
+
|
|
523
|
+
assert world.studio_calls() == []
|
|
466
524
|
|
|
467
525
|
|
|
468
526
|
def test_athenas_own_asset_not_found_stays_final(world: _World) -> None:
|
|
@@ -31,6 +31,8 @@ STUDIO = "https://docx.example.com"
|
|
|
31
31
|
AGORA = "https://agora.example.com"
|
|
32
32
|
ASSET = "asset_8eaf4c95-0d4e-4f4e-9a8f-0b1c2d3e4f50"
|
|
33
33
|
SCOPED_KEY = "athcomp_scoped-credential"
|
|
34
|
+
# A person's Athena API key, which DOCX Studio takes as it is.
|
|
35
|
+
PERSON_KEY = "person-api-key"
|
|
34
36
|
CREATE_URL = f"{AGORA}/api/v0/assets/create"
|
|
35
37
|
FROM_FILE_URL = f"{AGORA}/api/v0/assets/create-from-file"
|
|
36
38
|
CREATED = {"asset_id": ASSET, "title": "Memo", "workspace_id": "ws_1"}
|
|
@@ -187,7 +189,7 @@ def test_the_sandbox_workspace_and_the_agent_run_are_named(
|
|
|
187
189
|
[
|
|
188
190
|
({"ATHENA_DOCX_API_KEY": "studio-key"}, None, "studio-key"),
|
|
189
191
|
({}, "explicit-key", "explicit-key"),
|
|
190
|
-
({"ATHENA_API_URL": None}, None,
|
|
192
|
+
({"ATHENA_API_URL": None, "ATHENA_API_KEY": PERSON_KEY}, None, PERSON_KEY),
|
|
191
193
|
],
|
|
192
194
|
)
|
|
193
195
|
def test_a_studio_key_an_explicit_key_or_no_api_url_keep_docx_studio(
|
|
@@ -216,7 +218,53 @@ def test_a_studio_key_an_explicit_key_or_no_api_url_keep_docx_studio(
|
|
|
216
218
|
assert sent[0].get_header("Authorization") == f"Bearer {expected_bearer}"
|
|
217
219
|
|
|
218
220
|
|
|
219
|
-
|
|
221
|
+
@pytest.mark.parametrize("prefix", ["athcomp_", "athsvm_", "athnb_"])
|
|
222
|
+
def test_without_athena_api_url_a_runtime_credential_never_goes_to_docx_studio(
|
|
223
|
+
athena: _Athena, monkeypatch: pytest.MonkeyPatch, prefix: str, docx_file: Path
|
|
224
|
+
) -> None:
|
|
225
|
+
monkeypatch.delenv("ATHENA_API_URL")
|
|
226
|
+
monkeypatch.setenv("ATHENA_API_KEY", f"{prefix}credential")
|
|
227
|
+
|
|
228
|
+
with patch("docx._http.urllib.request.urlopen") as urlopen:
|
|
229
|
+
with pytest.raises(AuthenticationError, match="Athena runtime credential"):
|
|
230
|
+
create_empty_document(name="Memo")
|
|
231
|
+
with pytest.raises(AuthenticationError, match="Athena runtime credential"):
|
|
232
|
+
upload_document(docx_path=str(docx_file), agora_base_url=AGORA)
|
|
233
|
+
|
|
234
|
+
urlopen.assert_not_called()
|
|
235
|
+
assert athena.calls == []
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
def test_an_athena_without_the_word_document_type_never_gets_a_runtime_credential(
|
|
239
|
+
athena: _Athena,
|
|
240
|
+
) -> None:
|
|
241
|
+
athena.answers.append(
|
|
242
|
+
_response(
|
|
243
|
+
422,
|
|
244
|
+
{
|
|
245
|
+
"detail": [
|
|
246
|
+
{
|
|
247
|
+
"type": "value_error",
|
|
248
|
+
"loc": ["body", "asset_type"],
|
|
249
|
+
"msg": "Value error, Unsupported asset type: 'word_document'.",
|
|
250
|
+
}
|
|
251
|
+
]
|
|
252
|
+
},
|
|
253
|
+
)
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
with patch("docx._http.urllib.request.urlopen") as urlopen:
|
|
257
|
+
with pytest.raises(AuthenticationError, match="Athena runtime credential"):
|
|
258
|
+
create_empty_document(name="Memo")
|
|
259
|
+
|
|
260
|
+
urlopen.assert_not_called()
|
|
261
|
+
assert len(athena.calls) == 1
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
def test_an_athena_without_the_word_document_type_gets_docx_studio(
|
|
265
|
+
athena: _Athena, monkeypatch: pytest.MonkeyPatch
|
|
266
|
+
) -> None:
|
|
267
|
+
monkeypatch.setenv("ATHENA_API_KEY", PERSON_KEY)
|
|
220
268
|
athena.answers.append(
|
|
221
269
|
_response(
|
|
222
270
|
422,
|
|
@@ -242,7 +290,7 @@ def test_an_athena_without_the_word_document_type_gets_docx_studio(athena: _Athe
|
|
|
242
290
|
|
|
243
291
|
assert created["asset_id"] == ASSET
|
|
244
292
|
assert [request.full_url for request in sent] == [f"{STUDIO}/docs/empty"]
|
|
245
|
-
assert sent[0].get_header("Authorization") == f"Bearer {
|
|
293
|
+
assert sent[0].get_header("Authorization") == f"Bearer {PERSON_KEY}"
|
|
246
294
|
|
|
247
295
|
|
|
248
296
|
@pytest.mark.parametrize(
|
|
@@ -324,10 +372,25 @@ def test_document_create_from_a_file_goes_through_athena(
|
|
|
324
372
|
assert athena.calls[0].params == {"title": "Memo"}
|
|
325
373
|
|
|
326
374
|
|
|
375
|
+
def test_an_athena_without_create_from_file_never_gets_a_runtime_credential(
|
|
376
|
+
athena: _Athena,
|
|
377
|
+
docx_file: Path,
|
|
378
|
+
) -> None:
|
|
379
|
+
athena.answers.append(_response(405, {"detail": "Method Not Allowed"}))
|
|
380
|
+
|
|
381
|
+
with patch("docx._http.urllib.request.urlopen") as urlopen:
|
|
382
|
+
with pytest.raises(AuthenticationError, match="Athena runtime credential"):
|
|
383
|
+
upload_document(docx_path=str(docx_file), agora_base_url=AGORA)
|
|
384
|
+
|
|
385
|
+
urlopen.assert_not_called()
|
|
386
|
+
|
|
387
|
+
|
|
327
388
|
def test_an_athena_without_create_from_file_gets_the_agora_upload(
|
|
328
389
|
athena: _Athena,
|
|
329
390
|
docx_file: Path,
|
|
391
|
+
monkeypatch: pytest.MonkeyPatch,
|
|
330
392
|
) -> None:
|
|
393
|
+
monkeypatch.setenv("ATHENA_API_KEY", PERSON_KEY)
|
|
331
394
|
# /assets/{asset_id} takes GET and PATCH only, so an older Athena answers 405.
|
|
332
395
|
athena.answers.append(_response(405, {"detail": "Method Not Allowed"}))
|
|
333
396
|
sent: list[Any] = []
|
|
@@ -345,7 +408,7 @@ def test_an_athena_without_create_from_file_gets_the_agora_upload(
|
|
|
345
408
|
f"{AGORA}/api/docx-studio/assets",
|
|
346
409
|
f"{AGORA}/api/docx-studio/assets/{ASSET}/import",
|
|
347
410
|
]
|
|
348
|
-
assert sent[0].get_header("Authorization") == f"Bearer {
|
|
411
|
+
assert sent[0].get_header("Authorization") == f"Bearer {PERSON_KEY}"
|
|
349
412
|
|
|
350
413
|
|
|
351
414
|
def test_a_file_athena_cannot_import_raises(athena: _Athena, docx_file: Path) -> None:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.45.0 → athena_python_docx-0.45.1}/scripts/smoke_test_block_not_found.py
RENAMED
|
File without changes
|
{athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/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
|
{athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ab_probe/agent_documents.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ab_probe/less_used_writes.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ab_probe/picture_runs.py
RENAMED
|
File without changes
|
{athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ab_probe/proxy_equality.py
RENAMED
|
File without changes
|
{athena_python_docx-0.45.0 → athena_python_docx-0.45.1}/tests/fidelity/ab_probe/return_types.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|