athena-python-pptx 0.9.0__tar.gz → 0.9.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/PKG-INFO +1 -1
  2. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/__init__.py +1 -1
  3. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/slides.py +38 -4
  4. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pyproject.toml +1 -1
  5. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/.gitignore +0 -0
  6. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/API_PARITY_REPORT.md +0 -0
  7. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/CHANGELOG.md +0 -0
  8. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/CLAUDE.md +0 -0
  9. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/DEV-GUIDE.md +0 -0
  10. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/PARITY_QUESTIONS.md +0 -0
  11. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/PUBLISHING.md +0 -0
  12. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/README.md +0 -0
  13. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/docs/API_PARITY_EXCEPTIONS.md +0 -0
  14. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/docs/athena-api.json +0 -0
  15. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/docs/athena-api.md +0 -0
  16. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/_athena_extension.py +0 -0
  17. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/_citations.py +0 -0
  18. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/_ptc.py +0 -0
  19. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/_references.py +0 -0
  20. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/action.py +0 -0
  21. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/batching.py +0 -0
  22. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/chart/__init__.py +0 -0
  23. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/chart/axis.py +0 -0
  24. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/chart/category.py +0 -0
  25. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/chart/chart.py +0 -0
  26. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/chart/data.py +0 -0
  27. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/chart/datalabel.py +0 -0
  28. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/chart/legend.py +0 -0
  29. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/chart/marker.py +0 -0
  30. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/chart/plot.py +0 -0
  31. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/chart/point.py +0 -0
  32. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/chart/series.py +0 -0
  33. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/chart/xlsx.py +0 -0
  34. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/client.py +0 -0
  35. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/commands.py +0 -0
  36. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/decorators.py +0 -0
  37. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/dml/__init__.py +0 -0
  38. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/dml/chtfmt.py +0 -0
  39. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/dml/color.py +0 -0
  40. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/dml/effect.py +0 -0
  41. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/dml/fill.py +0 -0
  42. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/dml/line.py +0 -0
  43. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/docgen.py +0 -0
  44. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/enum/__init__.py +0 -0
  45. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/enum/action.py +0 -0
  46. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/enum/chart.py +0 -0
  47. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/enum/dml.py +0 -0
  48. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/enum/lang.py +0 -0
  49. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/enum/shapes.py +0 -0
  50. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/enum/text.py +0 -0
  51. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/errors.py +0 -0
  52. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/exc.py +0 -0
  53. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/media.py +0 -0
  54. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/package.py +0 -0
  55. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/parts/__init__.py +0 -0
  56. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/parts/_base.py +0 -0
  57. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/parts/chart.py +0 -0
  58. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/parts/coreprops.py +0 -0
  59. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/parts/embeddedpackage.py +0 -0
  60. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/parts/image.py +0 -0
  61. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/parts/media.py +0 -0
  62. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/parts/presentation.py +0 -0
  63. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/parts/slide.py +0 -0
  64. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/presentation.py +0 -0
  65. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/shapes/__init__.py +0 -0
  66. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/shapes/autoshape.py +0 -0
  67. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/shapes/base.py +0 -0
  68. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/shapes/connector.py +0 -0
  69. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/shapes/freeform.py +0 -0
  70. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/shapes/graphfrm.py +0 -0
  71. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/shapes/group.py +0 -0
  72. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/shapes/picture.py +0 -0
  73. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/shapes/placeholder.py +0 -0
  74. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/shapes/shapetree.py +0 -0
  75. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/shared.py +0 -0
  76. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/slide.py +0 -0
  77. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/spec.py +0 -0
  78. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/table.py +0 -0
  79. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/text/__init__.py +0 -0
  80. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/text/fonts.py +0 -0
  81. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/text/layout.py +0 -0
  82. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/text/text.py +0 -0
  83. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/types.py +0 -0
  84. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/typing.py +0 -0
  85. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/units.py +0 -0
  86. {athena_python_pptx-0.9.0 → athena_python_pptx-0.9.1}/pptx/util.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: athena-python-pptx
3
- Version: 0.9.0
3
+ Version: 0.9.1
4
4
  Summary: Drop-in replacement for python-pptx that connects to PPTX Studio for real-time collaboration
5
5
  Project-URL: Homepage, https://github.com/pptx-studio/python-sdk
6
6
  Project-URL: Documentation, https://docs.pptx-studio.com/sdk/python
@@ -133,7 +133,7 @@ def flush_all() -> None:
133
133
  _active_buffers[:] = alive
134
134
 
135
135
 
136
- __version__ = "0.9.0"
136
+ __version__ = "0.9.1"
137
137
 
138
138
  __all__ = [
139
139
  # Main entry point
@@ -745,6 +745,7 @@ class Slide:
745
745
  notes: Optional[str] = None,
746
746
  layout_index: Optional[int] = None,
747
747
  layout_name: Optional[str] = None,
748
+ layout_path: Optional[str] = None,
748
749
  ):
749
750
  self._presentation = presentation
750
751
  self._slide_id = slide_id
@@ -756,6 +757,7 @@ class Slide:
756
757
  # Layout tracking
757
758
  self._layout_index = layout_index
758
759
  self._layout_name = layout_name
760
+ self._layout_path = layout_path
759
761
  self._layout: Optional[SlideLayout] = None
760
762
 
761
763
  # Initialize shapes collection
@@ -880,6 +882,8 @@ class Slide:
880
882
  name=self._layout_name or "Unknown",
881
883
  index=self._layout_index or 0,
882
884
  slide=self,
885
+ presentation=self._presentation,
886
+ path=getattr(self, "_layout_path", None),
883
887
  )
884
888
  return self._layout
885
889
 
@@ -910,6 +914,7 @@ class Slide:
910
914
 
911
915
  self._layout_index = layout_index
912
916
  self._layout_name = layout_name
917
+ self._layout_path = getattr(value, "_path", None) if isinstance(value, SlideLayout) else None
913
918
  self._layout = None # Reset cached layout
914
919
 
915
920
  if self._buffer:
@@ -1838,6 +1843,7 @@ class Slide:
1838
1843
  self._notes = slide_snapshot.notes
1839
1844
  self._layout_index = _parse_layout_index(slide_snapshot.layout_path)
1840
1845
  self._layout_name = slide_snapshot.layout_name
1846
+ self._layout_path = slide_snapshot.layout_path
1841
1847
  self._layout = None
1842
1848
 
1843
1849
  # Rebuild shapes collection
@@ -1890,6 +1896,7 @@ class Slides:
1890
1896
  notes=slide_snapshot.notes,
1891
1897
  layout_index=_parse_layout_index(slide_snapshot.layout_path),
1892
1898
  layout_name=slide_snapshot.layout_name,
1899
+ layout_path=slide_snapshot.layout_path,
1893
1900
  )
1894
1901
  self._slides.append(slide)
1895
1902
  self._slides_by_id[slide_snapshot.id] = slide
@@ -2644,6 +2651,7 @@ class Slides:
2644
2651
  notes=slide_snapshot.notes,
2645
2652
  layout_index=_parse_layout_index(slide_snapshot.layout_path),
2646
2653
  layout_name=slide_snapshot.layout_name,
2654
+ layout_path=slide_snapshot.layout_path,
2647
2655
  )
2648
2656
  else:
2649
2657
  slide._update_from_snapshot(slide_snapshot, snapshot.elements)
@@ -2990,11 +2998,37 @@ class SlideLayout:
2990
2998
  def slide_master(self) -> Optional["SlideMaster"]:
2991
2999
  """The :class:`SlideMaster` this layout belongs to.
2992
3000
 
2993
- Returns ``None`` if the layout was constructed without a master
2994
- reference (e.g., from the legacy hardcoded fallback set used when no
2995
- snapshot is available).
3001
+ python-pptx resolves this through the layout part's relationship to
3002
+ its master and never returns ``None``. Layout proxies here are often
3003
+ constructed without a master backreference (e.g. ``slide.slide_layout``),
3004
+ so the master is resolved lazily from the presentation's theme
3005
+ hierarchy: first by layout path, then by layout name, falling back to
3006
+ the first master. Returns ``None`` only when the deck snapshot carries
3007
+ no master data at all.
2996
3008
  """
2997
- return self._slide_master_ref
3009
+ if self._slide_master_ref is not None:
3010
+ return self._slide_master_ref
3011
+ prs = self._presentation
3012
+ if prs is None and self._slide is not None:
3013
+ prs = self._slide._presentation
3014
+ if prs is None:
3015
+ return None
3016
+ masters = prs.slide_masters
3017
+ by_name: Optional["SlideMaster"] = None
3018
+ for master in masters:
3019
+ for layout in master.slide_layouts:
3020
+ if self._path is not None and layout._path == self._path:
3021
+ self._slide_master_ref = master
3022
+ return master
3023
+ if by_name is None and self._name is not None and layout._name == self._name:
3024
+ by_name = master
3025
+ if by_name is not None:
3026
+ self._slide_master_ref = by_name
3027
+ return by_name
3028
+ if len(masters) > 0:
3029
+ self._slide_master_ref = masters[0]
3030
+ return masters[0]
3031
+ return None
2998
3032
 
2999
3033
  @property
3000
3034
  def background(self) -> "_LayoutBackground":
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "athena-python-pptx"
7
- version = "0.9.0"
7
+ version = "0.9.1"
8
8
  description = "Drop-in replacement for python-pptx that connects to PPTX Studio for real-time collaboration"
9
9
  readme = "README.md"
10
10
  license = "MIT"