python-pptx2 2.20.0__tar.gz → 3.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/HISTORY.rst +89 -0
- {python_pptx2-2.20.0/src/python_pptx2.egg-info → python_pptx2-3.0.0}/PKG-INFO +2 -2
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/table.py +16 -11
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/tbl-cell.feature +15 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/pyproject.toml +3 -1
- python_pptx2-3.0.0/src/paper_pptx_doctor/__init__.py +135 -0
- python_pptx2-3.0.0/src/paper_pptx_doctor/__main__.py +5 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/__init__.py +1 -1
- python_pptx2-3.0.0/src/pptx2/_ownership.py +67 -0
- python_pptx2-3.0.0/src/pptx2/_transaction.py +666 -0
- python_pptx2-3.0.0/src/pptx2/_version.py +20 -0
- python_pptx2-3.0.0/src/pptx2/_zipguard.py +932 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/chart/chart.py +232 -0
- python_pptx2-3.0.0/src/pptx2/compose/__init__.py +37 -0
- python_pptx2-3.0.0/src/pptx2/compose/deck_compose.py +1203 -0
- python_pptx2-3.0.0/src/pptx2/diff.py +1116 -0
- python_pptx2-3.0.0/src/pptx2/edit.py +612 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/enum/text.py +28 -0
- python_pptx2-3.0.0/src/pptx2/errors.py +105 -0
- python_pptx2-3.0.0/src/pptx2/hf.py +344 -0
- python_pptx2-3.0.0/src/pptx2/inspect.py +1993 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/math.py +5 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/opc/package.py +236 -3
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/opc/serialized.py +62 -5
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/__init__.py +26 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/presentation.py +32 -30
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/simpletypes.py +89 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/slide.py +57 -2
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/table.py +38 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/text.py +83 -3
- python_pptx2-3.0.0/src/pptx2/package.py +876 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/parts/presentation.py +6 -11
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/presentation.py +199 -37
- python_pptx2-3.0.0/src/pptx2/rebind.py +531 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/shapes/picture.py +103 -10
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/shapes/shapetree.py +434 -65
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/SKILL.md +2 -1
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/compose.md +39 -7
- python_pptx2-3.0.0/src/pptx2/skill/references/editing.md +117 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/slide.py +580 -100
- python_pptx2-3.0.0/src/pptx2/slideops.py +444 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/table.py +530 -22
- python_pptx2-3.0.0/src/pptx2/text/bullet.py +261 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/text/text.py +239 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0/src/python_pptx2.egg-info}/PKG-INFO +2 -2
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/python_pptx2.egg-info/SOURCES.txt +59 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/python_pptx2.egg-info/entry_points.txt +1 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/python_pptx2.egg-info/requires.txt +1 -1
- python_pptx2-3.0.0/src/python_pptx2.egg-info/top_level.txt +2 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/integration/test_compose_package.py +7 -2
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/integration/test_import_slide.py +31 -19
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/opc/test_package.py +2 -2
- python_pptx2-3.0.0/tests/paper/__init__.py +1 -0
- python_pptx2-3.0.0/tests/paper/_authoring/build_fixtures.py +1279 -0
- python_pptx2-3.0.0/tests/paper/_authoring/update_goldens.py +87 -0
- python_pptx2-3.0.0/tests/paper/clock.py +30 -0
- python_pptx2-3.0.0/tests/paper/conftest.py +66 -0
- python_pptx2-3.0.0/tests/paper/contract.py +188 -0
- python_pptx2-3.0.0/tests/paper/corpus.py +145 -0
- python_pptx2-3.0.0/tests/paper/fragval.py +90 -0
- python_pptx2-3.0.0/tests/paper/idlists.py +58 -0
- python_pptx2-3.0.0/tests/paper/lo.py +87 -0
- python_pptx2-3.0.0/tests/paper/relint.py +103 -0
- python_pptx2-3.0.0/tests/paper/test_autofit.py +340 -0
- python_pptx2-3.0.0/tests/paper/test_batch.py +310 -0
- python_pptx2-3.0.0/tests/paper/test_bullets.py +312 -0
- python_pptx2-3.0.0/tests/paper/test_chart_routing.py +370 -0
- python_pptx2-3.0.0/tests/paper/test_content_type_coverage.py +218 -0
- python_pptx2-3.0.0/tests/paper/test_contract_harness.py +434 -0
- python_pptx2-3.0.0/tests/paper/test_deck_manifest.py +113 -0
- python_pptx2-3.0.0/tests/paper/test_diff.py +1361 -0
- python_pptx2-3.0.0/tests/paper/test_distribution_doctor.py +120 -0
- python_pptx2-3.0.0/tests/paper/test_edit_text.py +740 -0
- python_pptx2-3.0.0/tests/paper/test_effective_inspect.py +1082 -0
- python_pptx2-3.0.0/tests/paper/test_fields_hf.py +267 -0
- python_pptx2-3.0.0/tests/paper/test_fixture_corpus.py +894 -0
- python_pptx2-3.0.0/tests/paper/test_hf_apply.py +429 -0
- python_pptx2-3.0.0/tests/paper/test_image_replace.py +382 -0
- python_pptx2-3.0.0/tests/paper/test_import.py +1270 -0
- python_pptx2-3.0.0/tests/paper/test_inspect_text.py +84 -0
- python_pptx2-3.0.0/tests/paper/test_notes.py +150 -0
- python_pptx2-3.0.0/tests/paper/test_package_io_hardening.py +337 -0
- python_pptx2-3.0.0/tests/paper/test_package_kernel.py +736 -0
- python_pptx2-3.0.0/tests/paper/test_package_round_trip.py +298 -0
- python_pptx2-3.0.0/tests/paper/test_rebind.py +543 -0
- python_pptx2-3.0.0/tests/paper/test_save_destinations.py +355 -0
- python_pptx2-3.0.0/tests/paper/test_shape_surgery.py +403 -0
- python_pptx2-3.0.0/tests/paper/test_slide_ops.py +805 -0
- python_pptx2-3.0.0/tests/paper/test_slide_partname_allocation.py +127 -0
- python_pptx2-3.0.0/tests/paper/test_table_ops.py +945 -0
- python_pptx2-3.0.0/tests/paper/test_transaction.py +200 -0
- python_pptx2-3.0.0/tests/paper/test_walkthrough_pitchbook.py +196 -0
- python_pptx2-3.0.0/tests/paper/test_walkthrough_qbr.py +344 -0
- python_pptx2-3.0.0/tests/paper/test_zipguard_end_record.py +228 -0
- python_pptx2-3.0.0/tests/paper/test_zipguard_structural.py +316 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/parts/test_presentation.py +11 -13
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/schema/test_schema_validity.py +8 -1
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_pathlike_inputs.py +2 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_section.py +8 -1
- python_pptx2-2.20.0/src/pptx2/compose/__init__.py +0 -28
- python_pptx2-2.20.0/src/pptx2/package.py +0 -234
- python_pptx2-2.20.0/src/python_pptx2.egg-info/top_level.txt +0 -1
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/LICENSE +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/MANIFEST.in +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/README.rst +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/act-action.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/act-hyperlink.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-axis-props.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-axistitle-props.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-category-access.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-category-props.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-chart.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-charttitle-props.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-data-props.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-datalabels.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-gridlines-props.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-legend-access.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-legend-props.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-marker-props.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-plot-props.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-point-access.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-point-props.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-replace-data.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-series.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-ticklabels-props.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/dml-color.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/dml-effect.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/dml-fill.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/dml-line.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/environment.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/ph-inherit-props.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/ph-insert-shape.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/ph-phfmt-props.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/ph-placeholder-props.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/prs-coreprops.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/prs-default-template.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/prs-open-save.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/prs-presentation-props.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/shp-autoshape.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/shp-connector.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/shp-freeform.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/shp-graphicframe.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/shp-groupshape.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/shp-movie-props.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/shp-picture.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/shp-placeholder.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/shp-shapes.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/shp-shared.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/sld-background.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/sld-slide.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/sld-slides.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/action.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/axis.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/background.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/category.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/chart.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/chartdata.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/color.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/coreprops.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/datalabel.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/effect.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/fill.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/font.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/font_color.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/helpers.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/legend.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/line.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/picture.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/placeholder.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/plot.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/presentation.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/series.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/shape.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/shapes.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/slide.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/slides.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/72-dpi.tiff +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/CVS_LOGO.WMF +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/act-props.pptm +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/calibriz.ttf +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/cht-axis-props.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/cht-category-access.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/cht-chart-props.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/cht-chart-type.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/cht-charts.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/cht-datalabels.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/cht-gridlines-props.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/cht-legend-props.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/cht-legend.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/cht-marker-props.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/cht-plot-props.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/cht-point-access.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/cht-point-props.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/cht-replace-data.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/cht-series.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/cht-ticklabels-props.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/dml-effect.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/dml-fill.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/dml-line.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/ext-rels.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/[Content_Types].xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/_rels/.rels +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/docProps/app.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/docProps/core.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/docProps/thumbnail.jpeg +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/_rels/presentation.xml.rels +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/presProps.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/presentation.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/printerSettings/printerSettings1.bin +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout1.xml.rels +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout10.xml.rels +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout11.xml.rels +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout2.xml.rels +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout3.xml.rels +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout4.xml.rels +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout5.xml.rels +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout6.xml.rels +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout7.xml.rels +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout8.xml.rels +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout9.xml.rels +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout1.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout10.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout11.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout2.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout3.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout4.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout5.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout6.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout7.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout8.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout9.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideMasters/_rels/slideMaster1.xml.rels +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideMasters/slideMaster1.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slides/_rels/slide1.xml.rels +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slides/slide1.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/tableStyles.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/theme/theme1.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/viewProps.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/font-color.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/just-two-mice.mp4 +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/just-two-mice.png +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/lyt-shapes.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/minimal.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/monty-truth.png +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/mst-placeholders.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/mst-shapes.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/mst-slide-layouts.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/ph-inherit-props.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/ph-populated-placeholders.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/ph-unpopulated-placeholders.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/pic.emf +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/prs-add-slide.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/prs-notes.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/prs-properties.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/prs-slide-masters.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/python-icon.jpeg +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/python-powered.png +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/python.bmp +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/shp-access-chart.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/shp-access-ole-object.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/shp-autoshape-adjustments.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/shp-autoshape-props.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/shp-common-props.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/shp-connector-props.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/shp-embedded-docx.docx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/shp-embedded-pptx.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/shp-embedded-xlsx.xlsx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/shp-freeform.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/shp-groupshape.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/shp-movie-props.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/shp-picture.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/shp-pos-and-size.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/shp-shapes.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/sld-background.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/sld-blank.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/sld-notes.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/sld-slide.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/sld-slides.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/sonic.gif +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/tbl-cell.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/test-image-jpg-mime.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/test.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/txt-fit-text.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/txt-font-props.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/txt-font-typeface.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/txt-paragraph-spacing.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/txt-text-frame.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/txt-text.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/text.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/text_frame.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/tbl-column.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/tbl-table.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/txt-fit-text.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/txt-font-color.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/txt-font-props.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/txt-paragraph.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/txt-text.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/txt-textframe.feature +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/setup.cfg +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/_agent_friendly.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/_color.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/_slide_importer.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/_svg.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/_template_applier.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/_textstyle.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/accessibility.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/action.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/animation.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/api.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/audit.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/chart/__init__.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/chart/analytics.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/chart/axis.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/chart/category.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/chart/data.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/chart/datalabel.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/chart/legend.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/chart/marker.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/chart/palettes.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/chart/plot.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/chart/point.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/chart/quick_layouts.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/chart/series.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/chart/xlsx.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/chart/xmlwriter.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/compose/from_spec.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/design/__init__.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/design/components.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/design/figures.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/design/layout.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/design/recipes.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/design/style.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/design/tokens.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/diagrams.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/dml/__init__.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/dml/chtfmt.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/dml/color.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/dml/effect.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/dml/fill.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/dml/line.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/dml/picture.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/dml/three_d.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/enum/__init__.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/enum/action.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/enum/animation.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/enum/base.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/enum/chart.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/enum/dml.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/enum/lang.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/enum/presentation.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/enum/shapes.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/exc.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/formats.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/geometry.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/inherit.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/lint.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/mathml2omml.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/media.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/opc/__init__.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/opc/constants.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/opc/oxml.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/opc/packuri.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/opc/shared.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/opc/spec.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/action.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/chart/__init__.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/chart/axis.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/chart/chart.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/chart/datalabel.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/chart/legend.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/chart/marker.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/chart/plot.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/chart/series.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/chart/shared.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/coreprops.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/customprops.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/dml/__init__.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/dml/color.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/dml/effect.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/dml/fill.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/dml/line.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/dml/three_d.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/ns.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/shapes/__init__.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/shapes/autoshape.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/shapes/connector.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/shapes/graphfrm.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/shapes/groupshape.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/shapes/picture.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/shapes/shared.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/theme.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/xmlchemy.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/parts/__init__.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/parts/chart.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/parts/coreprops.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/parts/customprops.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/parts/diagram.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/parts/embeddedpackage.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/parts/image.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/parts/media.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/parts/slide.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/py.typed +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/render.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/section.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/shapes/__init__.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/shapes/autoshape.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/shapes/base.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/shapes/connector.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/shapes/freeform.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/shapes/graphfrm.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/shapes/group.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/shapes/placeholder.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/shared.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/__init__.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/__main__.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/animations.md +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/basics.md +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/charts.md +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/design.md +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/effects.md +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/end-to-end-deck.md +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/geometry-and-arrows.md +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/lint.md +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/math.md +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/picture-effects.md +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/render.md +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/smart-art.md +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/space-aware-authoring.md +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/tables.md +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/theme.md +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/three-d.md +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/transitions.md +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/smart_art.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/spec.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/table_styles.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/templates/default.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/templates/docx-icon.emf +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/templates/generic-icon.emf +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/templates/notes.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/templates/notesMaster.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/templates/pptx-icon.emf +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/templates/theme.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/templates/xlsx-icon.emf +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/text/__init__.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/text/fonts.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/text/layout.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/theme.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/types.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/util.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/python_pptx2.egg-info/dependency_links.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/__init__.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/__init__.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_analytics.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_axis.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_category.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_chart.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_chart_toggles.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_collision_strategy.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_data.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_datalabel.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_legend.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_marker.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_palettes.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_plot.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_point.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_quick_layouts.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_series.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_xlsx.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_xmlwriter.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/design/__init__.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/design/test_components.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/design/test_figures.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/design/test_layout.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/design/test_recipes.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/design/test_style.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/design/test_tokens.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/dml/__init__.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/dml/test_chtfmt.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/dml/test_color.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/dml/test_effect.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/dml/test_fill.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/dml/test_line.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/dml/test_three_d.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/enum/__init__.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/enum/test_base.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/enum/test_shapes.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/integration/__init__.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/integration/round_trip.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/integration/test_add_slide_layout.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/integration/test_apply_template.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/integration/test_round_trip.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/opc/__init__.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/opc/test_oxml.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/opc/test_packuri.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/opc/test_serialized.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/__init__.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/shapes/__init__.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/shapes/test_autoshape.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/shapes/test_graphfrm.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/shapes/test_groupshape.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/shapes/test_picture.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/test___init__.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/test_dml.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/test_ns.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/test_presentation.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/test_simpletypes.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/test_slide.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/test_table.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/test_theme.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/test_xmlchemy.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/unitdata/__init__.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/unitdata/dml.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/unitdata/shape.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/unitdata/text.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/parts/__init__.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/parts/test_chart.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/parts/test_coreprops.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/parts/test_customprops.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/parts/test_embeddedpackage.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/parts/test_image.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/parts/test_media.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/parts/test_slide.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/schema/__init__.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/schema/oxml_schema_validator.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/shapes/__init__.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/shapes/test_anchor.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/shapes/test_animate.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/shapes/test_autoshape.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/shapes/test_base.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/shapes/test_connector.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/shapes/test_freeform.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/shapes/test_graphfrm.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/shapes/test_group.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/shapes/test_picture.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/shapes/test_placeholder.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/shapes/test_shapetree.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_accessibility.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_action.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_animation.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_api.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_audit.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_compose_from_spec.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_diagrams.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/calibriz.ttf +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/cdw-logo.eps +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/dummy.mp4 +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/[Content_Types].xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/_rels/.rels +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/docProps/app.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/docProps/core.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/docProps/thumbnail.jpeg +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/_rels/presentation.xml.rels +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/presProps.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/presentation.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/printerSettings/printerSettings1.bin +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout1.xml.rels +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout10.xml.rels +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout11.xml.rels +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout2.xml.rels +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout3.xml.rels +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout4.xml.rels +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout5.xml.rels +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout6.xml.rels +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout7.xml.rels +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout8.xml.rels +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout9.xml.rels +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout1.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout10.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout11.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout2.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout3.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout4.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout5.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout6.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout7.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout8.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout9.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideMasters/_rels/slideMaster1.xml.rels +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideMasters/slideMaster1.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slides/_rels/slide1.xml.rels +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slides/slide1.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/tableStyles.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/theme/theme1.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/viewProps.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/minimal.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/minimal_slide.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/missing_rels_item.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/monty-truth.png +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/no-core-props.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/no-slides.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/presentation.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/python-icon.jpeg +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/python-powered.png +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/python.bmp +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/slideLayout1.xml +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/smart_art_org_chart.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-area-date.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-area-float.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-area-stacked-100.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-area-stacked.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-area.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-bar-clustered-date.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-bar-clustered-float.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-bar-clustered.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-bar-stacked-100.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-bar-stacked.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-column-clustered.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-column-stacked-100.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-column-stacked.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-line-date.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-line-float.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-line-markers-stacked-100.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-line-markers-stacked.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-line-markers.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-line-stacked-100.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-line-stacked.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-line.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x3-bubble-3d.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x3-bubble.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x3-xy-lines-no-markers.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x3-xy-lines.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x3-xy-smooth-no-markers.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x3-xy-smooth.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x3-xy.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x5-radar.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/3x1-pie-exploded.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/3x1-pie.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/3x2-doughnut-exploded.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/3x2-doughnut.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/4x2-multi-cat-bar.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/adjust-ser-count.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/cat-labels.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/content-types-xml.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/default-notes.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/default-notesMaster.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/default-theme.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/freeform.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/package-rels-xml.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/placeholders.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/presentation-rels-xml.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/relationships.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/rels-load-from-xml.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/rewrite-ser.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/timing.txt +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/test.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/test_slides.pptx +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_formats.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_geometry.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_inherit.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_lint.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_lint_on_save.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_math.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_media.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_new_features.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_package.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_powerpoint_strict_validation.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_presentation.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_render.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_render_slides_alias.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_shape_helpers.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_shared.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_skill.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_slide.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_smart_art.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_svg_picture.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_table.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_table_extras.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_theme.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_transition_morph.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_util.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/text/__init__.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/text/test_fonts.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/text/test_layout.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/text/test_text.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/unitdata.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/unitutil/__init__.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/unitutil/cxml.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/unitutil/file.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/unitutil/mock.py +0 -0
- {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tox.ini +0 -0
|
@@ -15,6 +15,95 @@ can sit beside both ``python-pptx`` (``pptx``) and ``power-pptx``
|
|
|
15
15
|
.. _`scanny/python-pptx`: https://github.com/scanny/python-pptx
|
|
16
16
|
|
|
17
17
|
|
|
18
|
+
3.0.0 (2026-09-01)
|
|
19
|
+
++++++++++++++++++
|
|
20
|
+
|
|
21
|
+
Backward-incompatible
|
|
22
|
+
.....................
|
|
23
|
+
|
|
24
|
+
* ``Presentation.import_slide`` and ``pptx2.compose.import_slide`` now
|
|
25
|
+
take the paper-pptx validating signature —
|
|
26
|
+
``import_slide(source_prs, slide, *, mode, ...)`` returning
|
|
27
|
+
``ImportReport``. The previous part-level engine (including its
|
|
28
|
+
``merge_master=`` knobs) remains available unchanged at
|
|
29
|
+
``pptx2._slide_importer.import_slide``, and the old deck-integration
|
|
30
|
+
tests exercise it directly.
|
|
31
|
+
|
|
32
|
+
Merged
|
|
33
|
+
......
|
|
34
|
+
|
|
35
|
+
* **Ported the paper-pptx agent-first structure editor** (bootstrap
|
|
36
|
+
commit 700b5f1f from ``paper-instruments/paper-pptx``, a fork of
|
|
37
|
+
python-pptx 1.0.2). python-pptx2 gains paper-pptx's whole editing,
|
|
38
|
+
inspection, and safety surface, import-renamed from ``pptx`` to
|
|
39
|
+
``pptx2``:
|
|
40
|
+
|
|
41
|
+
- ``pptx2.inspect`` — effective values with provenance
|
|
42
|
+
(``effective_font()``, ``effective_paragraph_format()``,
|
|
43
|
+
``effective_shape_format()``), visibility-complete ``inspect_text()``
|
|
44
|
+
and a deterministic ``inspect_deck()`` manifest.
|
|
45
|
+
- ``pptx2.edit`` / ``pptx2.diff`` — ``replace_text()`` that preserves
|
|
46
|
+
untouched run formatting, and ``diff_decks()`` structural diffing.
|
|
47
|
+
- ``pptx2.compose`` — paper-pptx's validating
|
|
48
|
+
``import_slide(dest, source, slide, mode=...)`` / ``append_deck()``
|
|
49
|
+
returning |ImportReport| (the older part-level engine remains at
|
|
50
|
+
``pptx2._slide_importer``); ``Presentation.import_slide`` now takes
|
|
51
|
+
the paper-pptx signature.
|
|
52
|
+
- ``pptx2.hf`` (``Presentation.apply_footers()`` / ``Slide.apply_footers()``
|
|
53
|
+
/ ``header_footers`` flags), ``pptx2.rebind``
|
|
54
|
+
(``Slide.rebind_layout()``), ``pptx2.slideops``,
|
|
55
|
+
``pptx2._transaction`` / ``_ownership`` / ``_zipguard`` /
|
|
56
|
+
``errors``, the ``paper_pptx_doctor`` CLI, and the full
|
|
57
|
+
``tests/paper`` contract suite. (The bootstrap's ``pptx2.scrub``
|
|
58
|
+
module was removed again by ported commit #14, matching upstream
|
|
59
|
+
paper-pptx.)
|
|
60
|
+
- Slide ops: ``Slides.clone/delete/move/reorder`` (``move`` and
|
|
61
|
+
``reorder`` merged with the existing python-pptx2 int/Slice APIs),
|
|
62
|
+
``SlideShapes.add_copy/delete/move`` and strict ``*_by_name``
|
|
63
|
+
addressing, ``Table.insert_row/insert_column/delete_row/delete_column``
|
|
64
|
+
with merge guards, ``Picture.replace_image()``,
|
|
65
|
+
``Chart.replace_data_safe()``, ``TextFrame.normalize_autofit()``,
|
|
66
|
+
``_Run.effective_font()``, ``_Paragraph.bullet`` (``BulletFormat``),
|
|
67
|
+
notes-text read/replace that never creates a notes slide, and an
|
|
68
|
+
atomic, deterministic (epoch-stamped) package ``save()``.
|
|
69
|
+
|
|
70
|
+
* Follow-up paper-pptx fixes ported in sequence (their commit ids in
|
|
71
|
+
ours): zipguard keeps only structural checks and drops numeric
|
|
72
|
+
resource ceilings (#15); the inspect group-depth guard is gone (#19);
|
|
73
|
+
the bootstrap's ``scrub`` module was removed again (#14);
|
|
74
|
+
``effective_paragraph_format`` resolves *inherited* bullets with
|
|
75
|
+
provenance, and deck diff reports bullet typeface/size changes (#16,
|
|
76
|
+
#27); ``Presentation.batch()`` validates once per block and
|
|
77
|
+
``save()`` refuses inside it, slide-partname allocation and
|
|
78
|
+
duplicate-partname writes are fixed (#17); packages with leading
|
|
79
|
+
bytes are refused (#21); ``save()`` accepts every upstream
|
|
80
|
+
destination (write-only handles, unseekable sinks), writing at the
|
|
81
|
+
caller's cursor and resolving symlinks for path destinations (#23);
|
|
82
|
+
untyped ZIP members refuse while unreferenced parts are accepted
|
|
83
|
+
(#24); ZIP directory entries are accepted (#25); relationship
|
|
84
|
+
refusals are retyped with remedies (#26); ``patch_save`` treats
|
|
85
|
+
semantically equivalent OPC registries (other producers' absolute
|
|
86
|
+
rels, content-type fallbacks) as unchanged (#36); table expansion is
|
|
87
|
+
composable — ``insert_row/insert_column(copy_format_from=...)`` and
|
|
88
|
+
``_Cell.extend_merge()`` (#37); text edits, layout selection,
|
|
89
|
+
placeholder reconciliation, section selection, and deck-diff
|
|
90
|
+
alignment all match by stable *identity*, refusing ambiguity instead
|
|
91
|
+
of guessing (#40–#46, #38 docs).
|
|
92
|
+
|
|
93
|
+
* The low-level slide-import engine keeps its part-level API at
|
|
94
|
+
``pptx2._slide_importer`` with the ``merge_master=`` knobs; the
|
|
95
|
+
public ``Presentation.import_slide`` /
|
|
96
|
+
``pptx2.compose.import_slide`` now take the paper-pptx
|
|
97
|
+
``(source_prs, slide, mode=...)`` signature returning
|
|
98
|
+
``ImportReport``.
|
|
99
|
+
|
|
100
|
+
* A zip-timestamp fix that benefits every save: package entries are
|
|
101
|
+
stamped with the 1980 zip epoch, so saving the same package state
|
|
102
|
+
twice produces byte-identical files, and the math-namespace
|
|
103
|
+
enrichment of slide XML only happens when a slide actually carries
|
|
104
|
+
equation markup (math-free decks round-trip byte-identically).
|
|
105
|
+
|
|
106
|
+
|
|
18
107
|
2.20.0 (2026-08-30)
|
|
19
108
|
+++++++++++++++++++
|
|
20
109
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-pptx2
|
|
3
|
-
Version:
|
|
3
|
+
Version: 3.0.0
|
|
4
4
|
Summary: Create, read, and update PowerPoint 2007+ (.pptx) files. Fork of power-pptx / python-pptx, published as python-pptx2.
|
|
5
5
|
Author: Matěj Štágl
|
|
6
6
|
Author-email: stagl@wattlescript.org
|
|
@@ -34,7 +34,7 @@ Classifier: Topic :: Software Development :: Libraries
|
|
|
34
34
|
Requires-Python: >=3.9
|
|
35
35
|
Description-Content-Type: text/x-rst
|
|
36
36
|
License-File: LICENSE
|
|
37
|
-
Requires-Dist: Pillow>=
|
|
37
|
+
Requires-Dist: Pillow>=10.3.0
|
|
38
38
|
Requires-Dist: XlsxWriter>=0.5.7
|
|
39
39
|
Requires-Dist: lxml>=3.1.0
|
|
40
40
|
Requires-Dist: typing_extensions>=4.9.0
|
|
@@ -109,9 +109,9 @@ def when_I_assign_origin_cell_eq_table_cell_0_0(context):
|
|
|
109
109
|
context.origin_cell = context.table_.cell(0, 0)
|
|
110
110
|
|
|
111
111
|
|
|
112
|
-
@when("I assign other_cell = table.cell(
|
|
113
|
-
def
|
|
114
|
-
context.other_cell = context.table_.cell(
|
|
112
|
+
@when("I assign other_cell = table.cell({row_idx:d}, {col_idx:d})")
|
|
113
|
+
def when_I_assign_other_cell_eq_table_cell(context, row_idx, col_idx):
|
|
114
|
+
context.other_cell = context.table_.cell(row_idx, col_idx)
|
|
115
115
|
|
|
116
116
|
|
|
117
117
|
@when("I assign table.first_col = True")
|
|
@@ -154,6 +154,11 @@ def when_I_call_origin_cell_merge_other_cell(context):
|
|
|
154
154
|
context.origin_cell.merge(context.other_cell)
|
|
155
155
|
|
|
156
156
|
|
|
157
|
+
@when("I call origin_cell.extend_merge(other_cell)")
|
|
158
|
+
def when_I_call_origin_cell_extend_merge_other_cell(context):
|
|
159
|
+
context.origin_cell.extend_merge(context.other_cell)
|
|
160
|
+
|
|
161
|
+
|
|
157
162
|
@when("I add a row to the table")
|
|
158
163
|
def when_I_add_a_row_to_the_table(context):
|
|
159
164
|
context.table_.rows.add_row()
|
|
@@ -217,18 +222,18 @@ def then_cell_text_eq_value(context, value):
|
|
|
217
222
|
assert actual == expected, 'cell.text == "%s"' % actual
|
|
218
223
|
|
|
219
224
|
|
|
220
|
-
@then("
|
|
221
|
-
def then_cell_span_height_eq(context, int_lit):
|
|
225
|
+
@then("{cell_ref}.span_height == {int_lit}")
|
|
226
|
+
def then_cell_span_height_eq(context, cell_ref, int_lit):
|
|
222
227
|
expected = int(int_lit)
|
|
223
|
-
actual = context.
|
|
224
|
-
assert actual
|
|
228
|
+
actual = getattr(context, cell_ref).span_height
|
|
229
|
+
assert actual == expected, "%s.span_height == %s" % (cell_ref, actual)
|
|
225
230
|
|
|
226
231
|
|
|
227
|
-
@then("
|
|
228
|
-
def then_cell_span_width_eq(context, int_lit):
|
|
232
|
+
@then("{cell_ref}.span_width == {int_lit}")
|
|
233
|
+
def then_cell_span_width_eq(context, cell_ref, int_lit):
|
|
229
234
|
expected = int(int_lit)
|
|
230
|
-
actual = context.
|
|
231
|
-
assert actual
|
|
235
|
+
actual = getattr(context, cell_ref).span_width
|
|
236
|
+
assert actual == expected, "%s.span_width == %s" % (cell_ref, actual)
|
|
232
237
|
|
|
233
238
|
|
|
234
239
|
@then("cell.vertical_anchor == {value}")
|
|
@@ -65,6 +65,21 @@ Feature: Table cell proxy objects
|
|
|
65
65
|
And other_cell.text == ""
|
|
66
66
|
|
|
67
67
|
|
|
68
|
+
Scenario: _Cell.extend_merge()
|
|
69
|
+
Given a 3x3 Table object with cells a to i as table
|
|
70
|
+
When I assign origin_cell = table.cell(0, 0)
|
|
71
|
+
And I assign other_cell = table.cell(1, 1)
|
|
72
|
+
And I call origin_cell.merge(other_cell)
|
|
73
|
+
And I assign other_cell = table.cell(2, 2)
|
|
74
|
+
And I call origin_cell.extend_merge(other_cell)
|
|
75
|
+
Then origin_cell.is_merge_origin is True
|
|
76
|
+
And other_cell.is_spanned is True
|
|
77
|
+
And origin_cell.span_height == 3
|
|
78
|
+
And origin_cell.span_width == 3
|
|
79
|
+
And origin_cell.text == "a\nb\nd\ne\nc\nf\ng\nh\ni"
|
|
80
|
+
And other_cell.text == ""
|
|
81
|
+
|
|
82
|
+
|
|
68
83
|
Scenario: Merged cell size
|
|
69
84
|
Given a 2x3 _MergeOriginCell object as cell
|
|
70
85
|
Then cell.span_height == 2
|
|
@@ -29,7 +29,7 @@ classifiers = [
|
|
|
29
29
|
"Topic :: Software Development :: Libraries",
|
|
30
30
|
]
|
|
31
31
|
dependencies = [
|
|
32
|
-
"Pillow>=
|
|
32
|
+
"Pillow>=10.3.0",
|
|
33
33
|
"XlsxWriter>=0.5.7",
|
|
34
34
|
"lxml>=3.1.0",
|
|
35
35
|
"typing_extensions>=4.9.0",
|
|
@@ -175,3 +175,5 @@ pptx2 = [
|
|
|
175
175
|
# Convenience CLI: `pptx2-skill install` ≈ `python -m pptx2.skill install`.
|
|
176
176
|
pptx2-skill = "pptx2.skill.__main__:main"
|
|
177
177
|
python-pptx2-skill = "pptx2.skill.__main__:main"
|
|
178
|
+
# paper-pptx addition: package doctor CLI.
|
|
179
|
+
paper-pptx-doctor = "paper_pptx_doctor:main"
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"""Verify that the installed ``pptx2`` import belongs to ``python-pptx2``.
|
|
2
|
+
|
|
3
|
+
Adapted from paper-pptx's distribution doctor: same wheel-integrity
|
|
4
|
+
checks (RECORD hashes for every ``pptx2`` package file), retargeted at
|
|
5
|
+
the ``python-pptx2`` distribution and its ``__version__`` sentinel.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import base64
|
|
11
|
+
import csv
|
|
12
|
+
import hashlib
|
|
13
|
+
import hmac
|
|
14
|
+
import importlib
|
|
15
|
+
import sys
|
|
16
|
+
from importlib.metadata import Distribution, PackageNotFoundError, distribution
|
|
17
|
+
from io import StringIO
|
|
18
|
+
from pathlib import Path, PurePosixPath
|
|
19
|
+
from typing import Iterable, Optional, Tuple
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class DoctorError(RuntimeError):
|
|
23
|
+
"""The installed ``pptx2`` package cannot be trusted as ``python-pptx2``."""
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
_REMEDY = "python -m pip install --force-reinstall python-pptx2"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def verify_install() -> str:
|
|
30
|
+
"""Verify distribution ownership, installed bytes, and the version sentinel.
|
|
31
|
+
|
|
32
|
+
Returns the installed ``python-pptx2`` version. Raises :class:`DoctorError`
|
|
33
|
+
without importing ``pptx2`` until its wheel-owned files have been checked.
|
|
34
|
+
"""
|
|
35
|
+
dist = _installed_distribution("python-pptx2")
|
|
36
|
+
if dist is None:
|
|
37
|
+
raise DoctorError("python-pptx2 distribution metadata is missing")
|
|
38
|
+
|
|
39
|
+
_verify_pptx_record(dist)
|
|
40
|
+
|
|
41
|
+
try:
|
|
42
|
+
pptx2 = importlib.import_module("pptx2")
|
|
43
|
+
except Exception as exc:
|
|
44
|
+
raise DoctorError(f"pptx2 cannot be imported: {exc}") from exc
|
|
45
|
+
|
|
46
|
+
sentinel = getattr(pptx2, "__version__", None)
|
|
47
|
+
if sentinel is None:
|
|
48
|
+
raise DoctorError("pptx2.__version__ is missing")
|
|
49
|
+
if sentinel != dist.version:
|
|
50
|
+
raise DoctorError(
|
|
51
|
+
"pptx2.__version__ does not match the installed python-pptx2 "
|
|
52
|
+
f"version ({sentinel!r} != {dist.version!r})"
|
|
53
|
+
)
|
|
54
|
+
return dist.version
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def main() -> int:
|
|
58
|
+
"""Console entry point for ``paper-pptx-doctor``."""
|
|
59
|
+
try:
|
|
60
|
+
version = verify_install()
|
|
61
|
+
except DoctorError as exc:
|
|
62
|
+
print(f"paper-pptx-doctor: FAIL: {exc}", file=sys.stderr)
|
|
63
|
+
print(f"Remedy: {_REMEDY}", file=sys.stderr)
|
|
64
|
+
return 1
|
|
65
|
+
print(f"paper-pptx-doctor: OK (python-pptx2 {version})")
|
|
66
|
+
return 0
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def _installed_distribution(name: str) -> Optional[Distribution]:
|
|
70
|
+
try:
|
|
71
|
+
return distribution(name)
|
|
72
|
+
except PackageNotFoundError:
|
|
73
|
+
return None
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def _verify_pptx_record(dist: Distribution) -> None:
|
|
77
|
+
record = dist.read_text("RECORD")
|
|
78
|
+
if record is None:
|
|
79
|
+
raise DoctorError("python-pptx2 RECORD is missing")
|
|
80
|
+
|
|
81
|
+
entries = tuple(
|
|
82
|
+
(relative_path, hash_spec)
|
|
83
|
+
for relative_path, hash_spec in _pptx_record_entries(record)
|
|
84
|
+
if hash_spec
|
|
85
|
+
)
|
|
86
|
+
if not entries:
|
|
87
|
+
raise DoctorError("python-pptx2 RECORD has no hashed pptx2 package files")
|
|
88
|
+
|
|
89
|
+
for relative_path, hash_spec in entries:
|
|
90
|
+
path = Path(dist.locate_file(relative_path))
|
|
91
|
+
if not path.is_file():
|
|
92
|
+
raise DoctorError(f"python-pptx2 file is missing: {relative_path}")
|
|
93
|
+
algorithm, expected = _parse_hash(hash_spec, relative_path)
|
|
94
|
+
actual = _file_digest(path, algorithm)
|
|
95
|
+
if not hmac.compare_digest(actual, expected):
|
|
96
|
+
raise DoctorError(f"python-pptx2 file hash mismatch: {relative_path}")
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def _pptx_record_entries(record: str) -> Iterable[Tuple[PurePosixPath, str]]:
|
|
100
|
+
for row in csv.reader(StringIO(record)):
|
|
101
|
+
if len(row) != 3:
|
|
102
|
+
raise DoctorError("python-pptx2 RECORD contains a malformed row")
|
|
103
|
+
raw_path, hash_spec, _size = row
|
|
104
|
+
path = PurePosixPath(raw_path)
|
|
105
|
+
if not path.parts or path.parts[0] != "pptx2":
|
|
106
|
+
continue
|
|
107
|
+
if path.is_absolute() or ".." in path.parts:
|
|
108
|
+
raise DoctorError(f"python-pptx2 RECORD contains an unsafe path: {raw_path}")
|
|
109
|
+
yield path, hash_spec
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def _parse_hash(hash_spec: str, relative_path: PurePosixPath) -> Tuple[str, str]:
|
|
113
|
+
try:
|
|
114
|
+
algorithm, expected = hash_spec.split("=", 1)
|
|
115
|
+
hashlib.new(algorithm)
|
|
116
|
+
except (TypeError, ValueError):
|
|
117
|
+
raise DoctorError(
|
|
118
|
+
f"python-pptx2 RECORD has an invalid hash for {relative_path}"
|
|
119
|
+
) from None
|
|
120
|
+
if not expected:
|
|
121
|
+
raise DoctorError(
|
|
122
|
+
f"python-pptx2 RECORD has an invalid hash for {relative_path}"
|
|
123
|
+
)
|
|
124
|
+
return algorithm, expected.rstrip("=")
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def _file_digest(path: Path, algorithm: str) -> str:
|
|
128
|
+
digest = hashlib.new(algorithm)
|
|
129
|
+
with path.open("rb") as stream:
|
|
130
|
+
for chunk in iter(lambda: stream.read(1024 * 1024), b""):
|
|
131
|
+
digest.update(chunk)
|
|
132
|
+
return base64.urlsafe_b64encode(digest.digest()).rstrip(b"=").decode("ascii")
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
__all__ = ["DoctorError", "main", "verify_install"]
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"""Attachment checks for live shape proxies used by paper-pptx operations."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def require_shape_attached(shape, *, argument: str = "shape") -> None:
|
|
7
|
+
"""Refuse a shape proxy whose XML is no longer attached to its remembered part."""
|
|
8
|
+
from pptx2.errors import TargetNotFoundError
|
|
9
|
+
|
|
10
|
+
element = getattr(shape, "_element", None)
|
|
11
|
+
try:
|
|
12
|
+
part_root = shape.part._element
|
|
13
|
+
except (AttributeError, ValueError):
|
|
14
|
+
part_root = None
|
|
15
|
+
root = element
|
|
16
|
+
while root is not None and root.getparent() is not None:
|
|
17
|
+
root = root.getparent()
|
|
18
|
+
if element is None or part_root is None or root is not part_root:
|
|
19
|
+
raise TargetNotFoundError(
|
|
20
|
+
"%s is stale: its shape was removed from the presentation" % argument
|
|
21
|
+
)
|
|
22
|
+
require_part_reachable(shape.part, argument=argument)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def require_element_attached(element, part, *, argument: str) -> None:
|
|
26
|
+
"""Refuse an element detached from the active root of its remembered part."""
|
|
27
|
+
from pptx2.errors import TargetNotFoundError
|
|
28
|
+
|
|
29
|
+
root = element
|
|
30
|
+
while root is not None and root.getparent() is not None:
|
|
31
|
+
root = root.getparent()
|
|
32
|
+
if root is not getattr(part, "_element", None):
|
|
33
|
+
raise TargetNotFoundError(
|
|
34
|
+
"%s is stale: its content was removed from the presentation" % argument
|
|
35
|
+
)
|
|
36
|
+
require_part_reachable(part, argument=argument)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def require_shape_tree_attached(shapes, *, argument: str = "target shape tree") -> None:
|
|
40
|
+
"""Refuse a shape collection that no longer wraps its part's active tree."""
|
|
41
|
+
from pptx2.errors import TargetNotFoundError
|
|
42
|
+
|
|
43
|
+
spTree = getattr(shapes, "_spTree", None)
|
|
44
|
+
part = shapes.part
|
|
45
|
+
require_element_attached(spTree, part, argument=argument)
|
|
46
|
+
live_spTree = part._element.cSld.spTree
|
|
47
|
+
if spTree is not live_spTree:
|
|
48
|
+
raise TargetNotFoundError(
|
|
49
|
+
"%s is stale: it is no longer the part's active shape tree" % argument
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def require_part_reachable(part, *, argument: str) -> None:
|
|
54
|
+
"""Refuse a part proxy no longer reachable from its package root."""
|
|
55
|
+
from pptx2.errors import TargetNotFoundError, UnsupportedStructureError
|
|
56
|
+
|
|
57
|
+
try:
|
|
58
|
+
reachable = any(candidate is part for candidate in part.package.iter_parts())
|
|
59
|
+
except (AssertionError, AttributeError, KeyError, TypeError, ValueError) as exc:
|
|
60
|
+
raise UnsupportedStructureError(
|
|
61
|
+
"cannot verify %s ownership because the package relationship graph is broken (%s)"
|
|
62
|
+
% (argument, exc)
|
|
63
|
+
) from exc
|
|
64
|
+
if not reachable:
|
|
65
|
+
raise TargetNotFoundError(
|
|
66
|
+
"%s is stale: its package part is no longer in the presentation" % argument
|
|
67
|
+
)
|