Skip to content

Commit 4b1aaa6

Browse files
committed
feat: add MultipleMasterLayoutsError exception and enhance get_master_layout function to handle multiple master layouts
1 parent 1c70903 commit 4b1aaa6

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

src/tppt/exception.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,3 +73,15 @@ def __init__(self, slide_master_name: str) -> None:
7373
@property
7474
def message(self) -> str:
7575
return f"No slide with MasterLayout tag found in {self.slide_master_name}"
76+
77+
78+
class MultipleMasterLayoutsError(TpptException, ValueError):
79+
"""Multiple master layouts defined."""
80+
81+
def __init__(self, slide_master_name: str, layout_names: list[str]) -> None:
82+
self.slide_master_name = slide_master_name
83+
self.layout_names = layout_names
84+
85+
@property
86+
def message(self) -> str:
87+
return f"Multiple master layouts defined in {self.slide_master_name}: {', '.join(self.layout_names)}"

src/tppt/slide_master.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from tppt.exception import (
66
MasterLayoutNotFoundError,
7+
MultipleMasterLayoutsError,
78
SlideMasterAttributeMustBeSlideLayoutError,
89
SlideMasterAttributeNotFoundError,
910
)
@@ -107,15 +108,25 @@ class DefaultSlideMaster(SlideMaster):
107108

108109
def get_master_layout(slide_master: type[SlideMaster]) -> type[SlideLayout]:
109110
"""Get the slide tagged with MasterLayout."""
111+
master_layouts = []
112+
master_layout_names = []
113+
110114
for attr_name, annotation in slide_master.__annotations__.items():
111115
origin = get_origin(annotation)
112116
if origin is Annotated:
113117
args = get_args(annotation)
114118
# Check the class name instead of directly checking the type of args[1]
115119
if len(args) > 1 and args[1].__class__.__name__ == "MasterLayout":
116-
return getattr(slide_master, attr_name)
120+
master_layouts.append(getattr(slide_master, attr_name))
121+
master_layout_names.append(attr_name)
122+
123+
if not master_layouts:
124+
raise MasterLayoutNotFoundError(slide_master.__name__)
125+
126+
if len(master_layouts) > 1:
127+
raise MultipleMasterLayoutsError(slide_master.__name__, master_layout_names)
117128

118-
raise MasterLayoutNotFoundError(slide_master.__name__)
129+
return master_layouts[0]
119130

120131

121132
def get_layouts(slide_master: type[SlideMaster]) -> list[type[SlideLayout]]:

0 commit comments

Comments
 (0)