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.
Files changed (680) hide show
  1. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/HISTORY.rst +89 -0
  2. {python_pptx2-2.20.0/src/python_pptx2.egg-info → python_pptx2-3.0.0}/PKG-INFO +2 -2
  3. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/table.py +16 -11
  4. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/tbl-cell.feature +15 -0
  5. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/pyproject.toml +3 -1
  6. python_pptx2-3.0.0/src/paper_pptx_doctor/__init__.py +135 -0
  7. python_pptx2-3.0.0/src/paper_pptx_doctor/__main__.py +5 -0
  8. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/__init__.py +1 -1
  9. python_pptx2-3.0.0/src/pptx2/_ownership.py +67 -0
  10. python_pptx2-3.0.0/src/pptx2/_transaction.py +666 -0
  11. python_pptx2-3.0.0/src/pptx2/_version.py +20 -0
  12. python_pptx2-3.0.0/src/pptx2/_zipguard.py +932 -0
  13. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/chart/chart.py +232 -0
  14. python_pptx2-3.0.0/src/pptx2/compose/__init__.py +37 -0
  15. python_pptx2-3.0.0/src/pptx2/compose/deck_compose.py +1203 -0
  16. python_pptx2-3.0.0/src/pptx2/diff.py +1116 -0
  17. python_pptx2-3.0.0/src/pptx2/edit.py +612 -0
  18. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/enum/text.py +28 -0
  19. python_pptx2-3.0.0/src/pptx2/errors.py +105 -0
  20. python_pptx2-3.0.0/src/pptx2/hf.py +344 -0
  21. python_pptx2-3.0.0/src/pptx2/inspect.py +1993 -0
  22. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/math.py +5 -0
  23. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/opc/package.py +236 -3
  24. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/opc/serialized.py +62 -5
  25. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/__init__.py +26 -0
  26. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/presentation.py +32 -30
  27. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/simpletypes.py +89 -0
  28. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/slide.py +57 -2
  29. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/table.py +38 -0
  30. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/text.py +83 -3
  31. python_pptx2-3.0.0/src/pptx2/package.py +876 -0
  32. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/parts/presentation.py +6 -11
  33. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/presentation.py +199 -37
  34. python_pptx2-3.0.0/src/pptx2/rebind.py +531 -0
  35. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/shapes/picture.py +103 -10
  36. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/shapes/shapetree.py +434 -65
  37. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/SKILL.md +2 -1
  38. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/compose.md +39 -7
  39. python_pptx2-3.0.0/src/pptx2/skill/references/editing.md +117 -0
  40. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/slide.py +580 -100
  41. python_pptx2-3.0.0/src/pptx2/slideops.py +444 -0
  42. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/table.py +530 -22
  43. python_pptx2-3.0.0/src/pptx2/text/bullet.py +261 -0
  44. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/text/text.py +239 -0
  45. {python_pptx2-2.20.0 → python_pptx2-3.0.0/src/python_pptx2.egg-info}/PKG-INFO +2 -2
  46. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/python_pptx2.egg-info/SOURCES.txt +59 -0
  47. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/python_pptx2.egg-info/entry_points.txt +1 -0
  48. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/python_pptx2.egg-info/requires.txt +1 -1
  49. python_pptx2-3.0.0/src/python_pptx2.egg-info/top_level.txt +2 -0
  50. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/integration/test_compose_package.py +7 -2
  51. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/integration/test_import_slide.py +31 -19
  52. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/opc/test_package.py +2 -2
  53. python_pptx2-3.0.0/tests/paper/__init__.py +1 -0
  54. python_pptx2-3.0.0/tests/paper/_authoring/build_fixtures.py +1279 -0
  55. python_pptx2-3.0.0/tests/paper/_authoring/update_goldens.py +87 -0
  56. python_pptx2-3.0.0/tests/paper/clock.py +30 -0
  57. python_pptx2-3.0.0/tests/paper/conftest.py +66 -0
  58. python_pptx2-3.0.0/tests/paper/contract.py +188 -0
  59. python_pptx2-3.0.0/tests/paper/corpus.py +145 -0
  60. python_pptx2-3.0.0/tests/paper/fragval.py +90 -0
  61. python_pptx2-3.0.0/tests/paper/idlists.py +58 -0
  62. python_pptx2-3.0.0/tests/paper/lo.py +87 -0
  63. python_pptx2-3.0.0/tests/paper/relint.py +103 -0
  64. python_pptx2-3.0.0/tests/paper/test_autofit.py +340 -0
  65. python_pptx2-3.0.0/tests/paper/test_batch.py +310 -0
  66. python_pptx2-3.0.0/tests/paper/test_bullets.py +312 -0
  67. python_pptx2-3.0.0/tests/paper/test_chart_routing.py +370 -0
  68. python_pptx2-3.0.0/tests/paper/test_content_type_coverage.py +218 -0
  69. python_pptx2-3.0.0/tests/paper/test_contract_harness.py +434 -0
  70. python_pptx2-3.0.0/tests/paper/test_deck_manifest.py +113 -0
  71. python_pptx2-3.0.0/tests/paper/test_diff.py +1361 -0
  72. python_pptx2-3.0.0/tests/paper/test_distribution_doctor.py +120 -0
  73. python_pptx2-3.0.0/tests/paper/test_edit_text.py +740 -0
  74. python_pptx2-3.0.0/tests/paper/test_effective_inspect.py +1082 -0
  75. python_pptx2-3.0.0/tests/paper/test_fields_hf.py +267 -0
  76. python_pptx2-3.0.0/tests/paper/test_fixture_corpus.py +894 -0
  77. python_pptx2-3.0.0/tests/paper/test_hf_apply.py +429 -0
  78. python_pptx2-3.0.0/tests/paper/test_image_replace.py +382 -0
  79. python_pptx2-3.0.0/tests/paper/test_import.py +1270 -0
  80. python_pptx2-3.0.0/tests/paper/test_inspect_text.py +84 -0
  81. python_pptx2-3.0.0/tests/paper/test_notes.py +150 -0
  82. python_pptx2-3.0.0/tests/paper/test_package_io_hardening.py +337 -0
  83. python_pptx2-3.0.0/tests/paper/test_package_kernel.py +736 -0
  84. python_pptx2-3.0.0/tests/paper/test_package_round_trip.py +298 -0
  85. python_pptx2-3.0.0/tests/paper/test_rebind.py +543 -0
  86. python_pptx2-3.0.0/tests/paper/test_save_destinations.py +355 -0
  87. python_pptx2-3.0.0/tests/paper/test_shape_surgery.py +403 -0
  88. python_pptx2-3.0.0/tests/paper/test_slide_ops.py +805 -0
  89. python_pptx2-3.0.0/tests/paper/test_slide_partname_allocation.py +127 -0
  90. python_pptx2-3.0.0/tests/paper/test_table_ops.py +945 -0
  91. python_pptx2-3.0.0/tests/paper/test_transaction.py +200 -0
  92. python_pptx2-3.0.0/tests/paper/test_walkthrough_pitchbook.py +196 -0
  93. python_pptx2-3.0.0/tests/paper/test_walkthrough_qbr.py +344 -0
  94. python_pptx2-3.0.0/tests/paper/test_zipguard_end_record.py +228 -0
  95. python_pptx2-3.0.0/tests/paper/test_zipguard_structural.py +316 -0
  96. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/parts/test_presentation.py +11 -13
  97. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/schema/test_schema_validity.py +8 -1
  98. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_pathlike_inputs.py +2 -0
  99. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_section.py +8 -1
  100. python_pptx2-2.20.0/src/pptx2/compose/__init__.py +0 -28
  101. python_pptx2-2.20.0/src/pptx2/package.py +0 -234
  102. python_pptx2-2.20.0/src/python_pptx2.egg-info/top_level.txt +0 -1
  103. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/LICENSE +0 -0
  104. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/MANIFEST.in +0 -0
  105. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/README.rst +0 -0
  106. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/act-action.feature +0 -0
  107. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/act-hyperlink.feature +0 -0
  108. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-axis-props.feature +0 -0
  109. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-axistitle-props.feature +0 -0
  110. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-category-access.feature +0 -0
  111. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-category-props.feature +0 -0
  112. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-chart.feature +0 -0
  113. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-charttitle-props.feature +0 -0
  114. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-data-props.feature +0 -0
  115. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-datalabels.feature +0 -0
  116. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-gridlines-props.feature +0 -0
  117. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-legend-access.feature +0 -0
  118. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-legend-props.feature +0 -0
  119. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-marker-props.feature +0 -0
  120. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-plot-props.feature +0 -0
  121. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-point-access.feature +0 -0
  122. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-point-props.feature +0 -0
  123. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-replace-data.feature +0 -0
  124. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-series.feature +0 -0
  125. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/cht-ticklabels-props.feature +0 -0
  126. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/dml-color.feature +0 -0
  127. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/dml-effect.feature +0 -0
  128. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/dml-fill.feature +0 -0
  129. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/dml-line.feature +0 -0
  130. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/environment.py +0 -0
  131. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/ph-inherit-props.feature +0 -0
  132. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/ph-insert-shape.feature +0 -0
  133. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/ph-phfmt-props.feature +0 -0
  134. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/ph-placeholder-props.feature +0 -0
  135. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/prs-coreprops.feature +0 -0
  136. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/prs-default-template.feature +0 -0
  137. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/prs-open-save.feature +0 -0
  138. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/prs-presentation-props.feature +0 -0
  139. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/shp-autoshape.feature +0 -0
  140. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/shp-connector.feature +0 -0
  141. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/shp-freeform.feature +0 -0
  142. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/shp-graphicframe.feature +0 -0
  143. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/shp-groupshape.feature +0 -0
  144. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/shp-movie-props.feature +0 -0
  145. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/shp-picture.feature +0 -0
  146. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/shp-placeholder.feature +0 -0
  147. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/shp-shapes.feature +0 -0
  148. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/shp-shared.feature +0 -0
  149. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/sld-background.feature +0 -0
  150. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/sld-slide.feature +0 -0
  151. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/sld-slides.feature +0 -0
  152. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/action.py +0 -0
  153. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/axis.py +0 -0
  154. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/background.py +0 -0
  155. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/category.py +0 -0
  156. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/chart.py +0 -0
  157. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/chartdata.py +0 -0
  158. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/color.py +0 -0
  159. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/coreprops.py +0 -0
  160. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/datalabel.py +0 -0
  161. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/effect.py +0 -0
  162. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/fill.py +0 -0
  163. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/font.py +0 -0
  164. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/font_color.py +0 -0
  165. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/helpers.py +0 -0
  166. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/legend.py +0 -0
  167. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/line.py +0 -0
  168. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/picture.py +0 -0
  169. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/placeholder.py +0 -0
  170. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/plot.py +0 -0
  171. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/presentation.py +0 -0
  172. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/series.py +0 -0
  173. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/shape.py +0 -0
  174. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/shapes.py +0 -0
  175. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/slide.py +0 -0
  176. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/slides.py +0 -0
  177. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/72-dpi.tiff +0 -0
  178. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/CVS_LOGO.WMF +0 -0
  179. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/act-props.pptm +0 -0
  180. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/calibriz.ttf +0 -0
  181. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/cht-axis-props.pptx +0 -0
  182. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/cht-category-access.pptx +0 -0
  183. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/cht-chart-props.pptx +0 -0
  184. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/cht-chart-type.pptx +0 -0
  185. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/cht-charts.pptx +0 -0
  186. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/cht-datalabels.pptx +0 -0
  187. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/cht-gridlines-props.pptx +0 -0
  188. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/cht-legend-props.pptx +0 -0
  189. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/cht-legend.pptx +0 -0
  190. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/cht-marker-props.pptx +0 -0
  191. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/cht-plot-props.pptx +0 -0
  192. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/cht-point-access.pptx +0 -0
  193. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/cht-point-props.pptx +0 -0
  194. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/cht-replace-data.pptx +0 -0
  195. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/cht-series.pptx +0 -0
  196. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/cht-ticklabels-props.pptx +0 -0
  197. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/dml-effect.pptx +0 -0
  198. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/dml-fill.pptx +0 -0
  199. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/dml-line.pptx +0 -0
  200. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/ext-rels.pptx +0 -0
  201. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/[Content_Types].xml +0 -0
  202. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/_rels/.rels +0 -0
  203. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/docProps/app.xml +0 -0
  204. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/docProps/core.xml +0 -0
  205. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/docProps/thumbnail.jpeg +0 -0
  206. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/_rels/presentation.xml.rels +0 -0
  207. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/presProps.xml +0 -0
  208. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/presentation.xml +0 -0
  209. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/printerSettings/printerSettings1.bin +0 -0
  210. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout1.xml.rels +0 -0
  211. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout10.xml.rels +0 -0
  212. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout11.xml.rels +0 -0
  213. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout2.xml.rels +0 -0
  214. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout3.xml.rels +0 -0
  215. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout4.xml.rels +0 -0
  216. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout5.xml.rels +0 -0
  217. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout6.xml.rels +0 -0
  218. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout7.xml.rels +0 -0
  219. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout8.xml.rels +0 -0
  220. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout9.xml.rels +0 -0
  221. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout1.xml +0 -0
  222. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout10.xml +0 -0
  223. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout11.xml +0 -0
  224. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout2.xml +0 -0
  225. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout3.xml +0 -0
  226. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout4.xml +0 -0
  227. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout5.xml +0 -0
  228. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout6.xml +0 -0
  229. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout7.xml +0 -0
  230. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout8.xml +0 -0
  231. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout9.xml +0 -0
  232. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideMasters/_rels/slideMaster1.xml.rels +0 -0
  233. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slideMasters/slideMaster1.xml +0 -0
  234. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slides/_rels/slide1.xml.rels +0 -0
  235. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/slides/slide1.xml +0 -0
  236. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/tableStyles.xml +0 -0
  237. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/theme/theme1.xml +0 -0
  238. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/extracted-pptx/ppt/viewProps.xml +0 -0
  239. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/font-color.pptx +0 -0
  240. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/just-two-mice.mp4 +0 -0
  241. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/just-two-mice.png +0 -0
  242. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/lyt-shapes.pptx +0 -0
  243. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/minimal.pptx +0 -0
  244. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/monty-truth.png +0 -0
  245. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/mst-placeholders.pptx +0 -0
  246. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/mst-shapes.pptx +0 -0
  247. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/mst-slide-layouts.pptx +0 -0
  248. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/ph-inherit-props.pptx +0 -0
  249. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/ph-populated-placeholders.pptx +0 -0
  250. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/ph-unpopulated-placeholders.pptx +0 -0
  251. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/pic.emf +0 -0
  252. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/prs-add-slide.pptx +0 -0
  253. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/prs-notes.pptx +0 -0
  254. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/prs-properties.pptx +0 -0
  255. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/prs-slide-masters.pptx +0 -0
  256. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/python-icon.jpeg +0 -0
  257. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/python-powered.png +0 -0
  258. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/python.bmp +0 -0
  259. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/shp-access-chart.pptx +0 -0
  260. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/shp-access-ole-object.pptx +0 -0
  261. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/shp-autoshape-adjustments.pptx +0 -0
  262. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/shp-autoshape-props.pptx +0 -0
  263. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/shp-common-props.pptx +0 -0
  264. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/shp-connector-props.pptx +0 -0
  265. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/shp-embedded-docx.docx +0 -0
  266. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/shp-embedded-pptx.pptx +0 -0
  267. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/shp-embedded-xlsx.xlsx +0 -0
  268. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/shp-freeform.pptx +0 -0
  269. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/shp-groupshape.pptx +0 -0
  270. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/shp-movie-props.pptx +0 -0
  271. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/shp-picture.pptx +0 -0
  272. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/shp-pos-and-size.pptx +0 -0
  273. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/shp-shapes.pptx +0 -0
  274. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/sld-background.pptx +0 -0
  275. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/sld-blank.pptx +0 -0
  276. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/sld-notes.pptx +0 -0
  277. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/sld-slide.pptx +0 -0
  278. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/sld-slides.pptx +0 -0
  279. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/sonic.gif +0 -0
  280. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/tbl-cell.pptx +0 -0
  281. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/test-image-jpg-mime.pptx +0 -0
  282. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/test.pptx +0 -0
  283. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/txt-fit-text.pptx +0 -0
  284. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/txt-font-props.pptx +0 -0
  285. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/txt-font-typeface.pptx +0 -0
  286. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/txt-paragraph-spacing.pptx +0 -0
  287. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/txt-text-frame.pptx +0 -0
  288. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/test_files/txt-text.pptx +0 -0
  289. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/text.py +0 -0
  290. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/steps/text_frame.py +0 -0
  291. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/tbl-column.feature +0 -0
  292. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/tbl-table.feature +0 -0
  293. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/txt-fit-text.feature +0 -0
  294. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/txt-font-color.feature +0 -0
  295. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/txt-font-props.feature +0 -0
  296. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/txt-paragraph.feature +0 -0
  297. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/txt-text.feature +0 -0
  298. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/features/txt-textframe.feature +0 -0
  299. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/setup.cfg +0 -0
  300. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/_agent_friendly.py +0 -0
  301. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/_color.py +0 -0
  302. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/_slide_importer.py +0 -0
  303. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/_svg.py +0 -0
  304. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/_template_applier.py +0 -0
  305. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/_textstyle.py +0 -0
  306. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/accessibility.py +0 -0
  307. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/action.py +0 -0
  308. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/animation.py +0 -0
  309. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/api.py +0 -0
  310. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/audit.py +0 -0
  311. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/chart/__init__.py +0 -0
  312. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/chart/analytics.py +0 -0
  313. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/chart/axis.py +0 -0
  314. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/chart/category.py +0 -0
  315. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/chart/data.py +0 -0
  316. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/chart/datalabel.py +0 -0
  317. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/chart/legend.py +0 -0
  318. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/chart/marker.py +0 -0
  319. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/chart/palettes.py +0 -0
  320. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/chart/plot.py +0 -0
  321. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/chart/point.py +0 -0
  322. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/chart/quick_layouts.py +0 -0
  323. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/chart/series.py +0 -0
  324. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/chart/xlsx.py +0 -0
  325. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/chart/xmlwriter.py +0 -0
  326. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/compose/from_spec.py +0 -0
  327. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/design/__init__.py +0 -0
  328. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/design/components.py +0 -0
  329. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/design/figures.py +0 -0
  330. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/design/layout.py +0 -0
  331. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/design/recipes.py +0 -0
  332. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/design/style.py +0 -0
  333. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/design/tokens.py +0 -0
  334. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/diagrams.py +0 -0
  335. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/dml/__init__.py +0 -0
  336. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/dml/chtfmt.py +0 -0
  337. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/dml/color.py +0 -0
  338. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/dml/effect.py +0 -0
  339. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/dml/fill.py +0 -0
  340. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/dml/line.py +0 -0
  341. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/dml/picture.py +0 -0
  342. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/dml/three_d.py +0 -0
  343. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/enum/__init__.py +0 -0
  344. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/enum/action.py +0 -0
  345. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/enum/animation.py +0 -0
  346. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/enum/base.py +0 -0
  347. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/enum/chart.py +0 -0
  348. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/enum/dml.py +0 -0
  349. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/enum/lang.py +0 -0
  350. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/enum/presentation.py +0 -0
  351. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/enum/shapes.py +0 -0
  352. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/exc.py +0 -0
  353. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/formats.py +0 -0
  354. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/geometry.py +0 -0
  355. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/inherit.py +0 -0
  356. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/lint.py +0 -0
  357. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/mathml2omml.py +0 -0
  358. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/media.py +0 -0
  359. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/opc/__init__.py +0 -0
  360. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/opc/constants.py +0 -0
  361. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/opc/oxml.py +0 -0
  362. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/opc/packuri.py +0 -0
  363. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/opc/shared.py +0 -0
  364. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/opc/spec.py +0 -0
  365. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/action.py +0 -0
  366. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/chart/__init__.py +0 -0
  367. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/chart/axis.py +0 -0
  368. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/chart/chart.py +0 -0
  369. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/chart/datalabel.py +0 -0
  370. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/chart/legend.py +0 -0
  371. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/chart/marker.py +0 -0
  372. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/chart/plot.py +0 -0
  373. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/chart/series.py +0 -0
  374. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/chart/shared.py +0 -0
  375. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/coreprops.py +0 -0
  376. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/customprops.py +0 -0
  377. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/dml/__init__.py +0 -0
  378. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/dml/color.py +0 -0
  379. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/dml/effect.py +0 -0
  380. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/dml/fill.py +0 -0
  381. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/dml/line.py +0 -0
  382. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/dml/three_d.py +0 -0
  383. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/ns.py +0 -0
  384. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/shapes/__init__.py +0 -0
  385. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/shapes/autoshape.py +0 -0
  386. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/shapes/connector.py +0 -0
  387. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/shapes/graphfrm.py +0 -0
  388. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/shapes/groupshape.py +0 -0
  389. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/shapes/picture.py +0 -0
  390. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/shapes/shared.py +0 -0
  391. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/theme.py +0 -0
  392. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/oxml/xmlchemy.py +0 -0
  393. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/parts/__init__.py +0 -0
  394. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/parts/chart.py +0 -0
  395. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/parts/coreprops.py +0 -0
  396. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/parts/customprops.py +0 -0
  397. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/parts/diagram.py +0 -0
  398. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/parts/embeddedpackage.py +0 -0
  399. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/parts/image.py +0 -0
  400. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/parts/media.py +0 -0
  401. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/parts/slide.py +0 -0
  402. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/py.typed +0 -0
  403. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/render.py +0 -0
  404. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/section.py +0 -0
  405. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/shapes/__init__.py +0 -0
  406. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/shapes/autoshape.py +0 -0
  407. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/shapes/base.py +0 -0
  408. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/shapes/connector.py +0 -0
  409. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/shapes/freeform.py +0 -0
  410. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/shapes/graphfrm.py +0 -0
  411. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/shapes/group.py +0 -0
  412. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/shapes/placeholder.py +0 -0
  413. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/shared.py +0 -0
  414. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/__init__.py +0 -0
  415. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/__main__.py +0 -0
  416. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/animations.md +0 -0
  417. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/basics.md +0 -0
  418. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/charts.md +0 -0
  419. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/design.md +0 -0
  420. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/effects.md +0 -0
  421. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/end-to-end-deck.md +0 -0
  422. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/geometry-and-arrows.md +0 -0
  423. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/lint.md +0 -0
  424. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/math.md +0 -0
  425. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/picture-effects.md +0 -0
  426. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/render.md +0 -0
  427. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/smart-art.md +0 -0
  428. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/space-aware-authoring.md +0 -0
  429. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/tables.md +0 -0
  430. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/theme.md +0 -0
  431. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/three-d.md +0 -0
  432. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/skill/references/transitions.md +0 -0
  433. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/smart_art.py +0 -0
  434. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/spec.py +0 -0
  435. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/table_styles.py +0 -0
  436. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/templates/default.pptx +0 -0
  437. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/templates/docx-icon.emf +0 -0
  438. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/templates/generic-icon.emf +0 -0
  439. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/templates/notes.xml +0 -0
  440. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/templates/notesMaster.xml +0 -0
  441. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/templates/pptx-icon.emf +0 -0
  442. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/templates/theme.xml +0 -0
  443. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/templates/xlsx-icon.emf +0 -0
  444. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/text/__init__.py +0 -0
  445. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/text/fonts.py +0 -0
  446. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/text/layout.py +0 -0
  447. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/theme.py +0 -0
  448. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/types.py +0 -0
  449. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/pptx2/util.py +0 -0
  450. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/src/python_pptx2.egg-info/dependency_links.txt +0 -0
  451. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/__init__.py +0 -0
  452. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/__init__.py +0 -0
  453. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_analytics.py +0 -0
  454. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_axis.py +0 -0
  455. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_category.py +0 -0
  456. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_chart.py +0 -0
  457. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_chart_toggles.py +0 -0
  458. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_collision_strategy.py +0 -0
  459. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_data.py +0 -0
  460. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_datalabel.py +0 -0
  461. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_legend.py +0 -0
  462. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_marker.py +0 -0
  463. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_palettes.py +0 -0
  464. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_plot.py +0 -0
  465. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_point.py +0 -0
  466. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_quick_layouts.py +0 -0
  467. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_series.py +0 -0
  468. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_xlsx.py +0 -0
  469. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/chart/test_xmlwriter.py +0 -0
  470. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/design/__init__.py +0 -0
  471. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/design/test_components.py +0 -0
  472. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/design/test_figures.py +0 -0
  473. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/design/test_layout.py +0 -0
  474. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/design/test_recipes.py +0 -0
  475. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/design/test_style.py +0 -0
  476. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/design/test_tokens.py +0 -0
  477. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/dml/__init__.py +0 -0
  478. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/dml/test_chtfmt.py +0 -0
  479. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/dml/test_color.py +0 -0
  480. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/dml/test_effect.py +0 -0
  481. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/dml/test_fill.py +0 -0
  482. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/dml/test_line.py +0 -0
  483. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/dml/test_three_d.py +0 -0
  484. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/enum/__init__.py +0 -0
  485. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/enum/test_base.py +0 -0
  486. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/enum/test_shapes.py +0 -0
  487. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/integration/__init__.py +0 -0
  488. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/integration/round_trip.py +0 -0
  489. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/integration/test_add_slide_layout.py +0 -0
  490. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/integration/test_apply_template.py +0 -0
  491. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/integration/test_round_trip.py +0 -0
  492. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/opc/__init__.py +0 -0
  493. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/opc/test_oxml.py +0 -0
  494. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/opc/test_packuri.py +0 -0
  495. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/opc/test_serialized.py +0 -0
  496. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/__init__.py +0 -0
  497. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/shapes/__init__.py +0 -0
  498. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/shapes/test_autoshape.py +0 -0
  499. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/shapes/test_graphfrm.py +0 -0
  500. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/shapes/test_groupshape.py +0 -0
  501. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/shapes/test_picture.py +0 -0
  502. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/test___init__.py +0 -0
  503. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/test_dml.py +0 -0
  504. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/test_ns.py +0 -0
  505. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/test_presentation.py +0 -0
  506. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/test_simpletypes.py +0 -0
  507. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/test_slide.py +0 -0
  508. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/test_table.py +0 -0
  509. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/test_theme.py +0 -0
  510. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/test_xmlchemy.py +0 -0
  511. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/unitdata/__init__.py +0 -0
  512. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/unitdata/dml.py +0 -0
  513. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/unitdata/shape.py +0 -0
  514. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/oxml/unitdata/text.py +0 -0
  515. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/parts/__init__.py +0 -0
  516. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/parts/test_chart.py +0 -0
  517. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/parts/test_coreprops.py +0 -0
  518. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/parts/test_customprops.py +0 -0
  519. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/parts/test_embeddedpackage.py +0 -0
  520. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/parts/test_image.py +0 -0
  521. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/parts/test_media.py +0 -0
  522. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/parts/test_slide.py +0 -0
  523. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/schema/__init__.py +0 -0
  524. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/schema/oxml_schema_validator.py +0 -0
  525. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/shapes/__init__.py +0 -0
  526. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/shapes/test_anchor.py +0 -0
  527. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/shapes/test_animate.py +0 -0
  528. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/shapes/test_autoshape.py +0 -0
  529. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/shapes/test_base.py +0 -0
  530. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/shapes/test_connector.py +0 -0
  531. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/shapes/test_freeform.py +0 -0
  532. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/shapes/test_graphfrm.py +0 -0
  533. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/shapes/test_group.py +0 -0
  534. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/shapes/test_picture.py +0 -0
  535. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/shapes/test_placeholder.py +0 -0
  536. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/shapes/test_shapetree.py +0 -0
  537. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_accessibility.py +0 -0
  538. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_action.py +0 -0
  539. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_animation.py +0 -0
  540. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_api.py +0 -0
  541. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_audit.py +0 -0
  542. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_compose_from_spec.py +0 -0
  543. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_diagrams.py +0 -0
  544. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/calibriz.ttf +0 -0
  545. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/cdw-logo.eps +0 -0
  546. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/dummy.mp4 +0 -0
  547. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/[Content_Types].xml +0 -0
  548. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/_rels/.rels +0 -0
  549. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/docProps/app.xml +0 -0
  550. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/docProps/core.xml +0 -0
  551. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/docProps/thumbnail.jpeg +0 -0
  552. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/_rels/presentation.xml.rels +0 -0
  553. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/presProps.xml +0 -0
  554. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/presentation.xml +0 -0
  555. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/printerSettings/printerSettings1.bin +0 -0
  556. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout1.xml.rels +0 -0
  557. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout10.xml.rels +0 -0
  558. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout11.xml.rels +0 -0
  559. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout2.xml.rels +0 -0
  560. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout3.xml.rels +0 -0
  561. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout4.xml.rels +0 -0
  562. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout5.xml.rels +0 -0
  563. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout6.xml.rels +0 -0
  564. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout7.xml.rels +0 -0
  565. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout8.xml.rels +0 -0
  566. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout9.xml.rels +0 -0
  567. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout1.xml +0 -0
  568. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout10.xml +0 -0
  569. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout11.xml +0 -0
  570. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout2.xml +0 -0
  571. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout3.xml +0 -0
  572. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout4.xml +0 -0
  573. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout5.xml +0 -0
  574. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout6.xml +0 -0
  575. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout7.xml +0 -0
  576. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout8.xml +0 -0
  577. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout9.xml +0 -0
  578. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideMasters/_rels/slideMaster1.xml.rels +0 -0
  579. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slideMasters/slideMaster1.xml +0 -0
  580. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slides/_rels/slide1.xml.rels +0 -0
  581. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/slides/slide1.xml +0 -0
  582. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/tableStyles.xml +0 -0
  583. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/theme/theme1.xml +0 -0
  584. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/expanded_pptx/ppt/viewProps.xml +0 -0
  585. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/minimal.pptx +0 -0
  586. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/minimal_slide.xml +0 -0
  587. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/missing_rels_item.pptx +0 -0
  588. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/monty-truth.png +0 -0
  589. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/no-core-props.pptx +0 -0
  590. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/no-slides.pptx +0 -0
  591. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/presentation.xml +0 -0
  592. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/python-icon.jpeg +0 -0
  593. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/python-powered.png +0 -0
  594. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/python.bmp +0 -0
  595. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/slideLayout1.xml +0 -0
  596. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/smart_art_org_chart.pptx +0 -0
  597. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-area-date.txt +0 -0
  598. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-area-float.txt +0 -0
  599. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-area-stacked-100.txt +0 -0
  600. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-area-stacked.txt +0 -0
  601. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-area.txt +0 -0
  602. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-bar-clustered-date.txt +0 -0
  603. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-bar-clustered-float.txt +0 -0
  604. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-bar-clustered.txt +0 -0
  605. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-bar-stacked-100.txt +0 -0
  606. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-bar-stacked.txt +0 -0
  607. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-column-clustered.txt +0 -0
  608. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-column-stacked-100.txt +0 -0
  609. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-column-stacked.txt +0 -0
  610. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-line-date.txt +0 -0
  611. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-line-float.txt +0 -0
  612. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-line-markers-stacked-100.txt +0 -0
  613. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-line-markers-stacked.txt +0 -0
  614. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-line-markers.txt +0 -0
  615. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-line-stacked-100.txt +0 -0
  616. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-line-stacked.txt +0 -0
  617. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x2-line.txt +0 -0
  618. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x3-bubble-3d.txt +0 -0
  619. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x3-bubble.txt +0 -0
  620. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x3-xy-lines-no-markers.txt +0 -0
  621. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x3-xy-lines.txt +0 -0
  622. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x3-xy-smooth-no-markers.txt +0 -0
  623. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x3-xy-smooth.txt +0 -0
  624. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x3-xy.txt +0 -0
  625. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/2x5-radar.txt +0 -0
  626. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/3x1-pie-exploded.txt +0 -0
  627. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/3x1-pie.txt +0 -0
  628. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/3x2-doughnut-exploded.txt +0 -0
  629. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/3x2-doughnut.txt +0 -0
  630. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/4x2-multi-cat-bar.txt +0 -0
  631. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/adjust-ser-count.txt +0 -0
  632. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/cat-labels.txt +0 -0
  633. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/content-types-xml.txt +0 -0
  634. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/default-notes.txt +0 -0
  635. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/default-notesMaster.txt +0 -0
  636. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/default-theme.txt +0 -0
  637. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/freeform.txt +0 -0
  638. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/package-rels-xml.txt +0 -0
  639. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/placeholders.txt +0 -0
  640. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/presentation-rels-xml.txt +0 -0
  641. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/relationships.txt +0 -0
  642. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/rels-load-from-xml.txt +0 -0
  643. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/rewrite-ser.txt +0 -0
  644. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/snippets/timing.txt +0 -0
  645. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/test.pptx +0 -0
  646. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_files/test_slides.pptx +0 -0
  647. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_formats.py +0 -0
  648. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_geometry.py +0 -0
  649. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_inherit.py +0 -0
  650. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_lint.py +0 -0
  651. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_lint_on_save.py +0 -0
  652. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_math.py +0 -0
  653. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_media.py +0 -0
  654. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_new_features.py +0 -0
  655. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_package.py +0 -0
  656. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_powerpoint_strict_validation.py +0 -0
  657. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_presentation.py +0 -0
  658. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_render.py +0 -0
  659. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_render_slides_alias.py +0 -0
  660. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_shape_helpers.py +0 -0
  661. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_shared.py +0 -0
  662. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_skill.py +0 -0
  663. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_slide.py +0 -0
  664. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_smart_art.py +0 -0
  665. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_svg_picture.py +0 -0
  666. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_table.py +0 -0
  667. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_table_extras.py +0 -0
  668. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_theme.py +0 -0
  669. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_transition_morph.py +0 -0
  670. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/test_util.py +0 -0
  671. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/text/__init__.py +0 -0
  672. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/text/test_fonts.py +0 -0
  673. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/text/test_layout.py +0 -0
  674. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/text/test_text.py +0 -0
  675. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/unitdata.py +0 -0
  676. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/unitutil/__init__.py +0 -0
  677. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/unitutil/cxml.py +0 -0
  678. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/unitutil/file.py +0 -0
  679. {python_pptx2-2.20.0 → python_pptx2-3.0.0}/tests/unitutil/mock.py +0 -0
  680. {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: 2.20.0
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>=3.3.2
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(1, 1)")
113
- def when_I_assign_other_cell_eq_table_cell_1_1(context):
114
- context.other_cell = context.table_.cell(1, 1)
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("cell.span_height == {int_lit}")
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.cell.span_height
224
- assert actual is expected, "cell.span_height == %s" % 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("cell.span_width == {int_lit}")
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.cell.span_width
231
- assert actual is expected, "cell.span_width == %s" % 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>=3.3.2",
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,5 @@
1
+ """Run ``paper-pptx-doctor`` with ``python -m paper_pptx_doctor``."""
2
+
3
+ from . import main
4
+
5
+ raise SystemExit(main())
@@ -57,7 +57,7 @@ from pptx2.parts.slide import (
57
57
  if TYPE_CHECKING:
58
58
  from pptx2.opc.package import Part
59
59
 
60
- __version__ = "2.20.0"
60
+ __version__ = "3.0.0"
61
61
 
62
62
  sys.modules["pptx2.exceptions"] = exceptions
63
63
  del sys
@@ -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
+ )