forked from scanny/python-pptx
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathslides.py
More file actions
238 lines (161 loc) · 7.63 KB
/
slides.py
File metadata and controls
238 lines (161 loc) · 7.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
"""Gherkin step implementations for slide collection-related features."""
from __future__ import annotations
from behave import given, then, when
from helpers import test_pptx
from pptx import Presentation
# given ===================================================
@given("a SlideLayouts object containing 2 layouts as slide_layouts")
def given_a_SlideLayouts_object_containing_2_layouts(context):
prs = Presentation(test_pptx("mst-slide-layouts"))
context.slide_layouts = prs.slide_master.slide_layouts
@given("a SlideMasters object containing 2 masters")
def given_a_SlideMasters_object_containing_2_masters(context):
prs = Presentation(test_pptx("prs-slide-masters"))
context.slide_masters = prs.slide_masters
@given("a Slides object containing 3 slides")
def given_a_Slides_object_containing_3_slides(context):
prs = Presentation(test_pptx("sld-slides"))
context.prs = prs
context.slides = prs.slides
# ---capture original slide ids for CRUD ordering assertions---
context.original_slide_ids = [s.slide_id for s in prs.slides]
# when ====================================================
@when("I call slides.add_slide()")
def when_I_call_slides_add_slide(context):
context.slide_layout = context.prs.slide_masters[0].slide_layouts[0]
context.slides.add_slide(context.slide_layout)
@when("I call slide_layouts.remove(slide_layouts[1])")
def when_I_call_slide_layouts_remove(context):
slide_layouts = context.slide_layouts
slide_layouts.remove(slide_layouts[1])
@when("I call slides.add_slide(slide_layout, index=0)")
def when_I_call_slides_add_slide_index_0(context):
layout = context.prs.slide_masters[0].slide_layouts[0]
context.new_slide = context.slides.add_slide(layout, index=0)
@when("I call slides.add_slide(slide_layout, index=2)")
def when_I_call_slides_add_slide_index_2(context):
layout = context.prs.slide_masters[0].slide_layouts[0]
context.new_slide = context.slides.add_slide(layout, index=2)
@when("I call slides.move(slides[0], 2)")
def when_I_call_slides_move(context):
context.slides.move(context.slides[0], 2)
@when("I call slides.remove(slides[1])")
def when_I_call_slides_remove(context):
context.slides.remove(context.slides[1])
@when("I call slides[1].delete()")
def when_I_call_slide_delete(context):
context.slides[1].delete()
@when("I call slides.duplicate(slides[0])")
def when_I_call_slides_duplicate_default_index(context):
context.new_slide = context.slides.duplicate(context.slides[0])
@when("I call slides.duplicate(slides[0], index=3)")
def when_I_call_slides_duplicate_index_3(context):
context.new_slide = context.slides.duplicate(context.slides[0], index=3)
@when("I call slides[1].duplicate()")
def when_I_call_slide_duplicate_alias(context):
context.new_slide = context.slides[1].duplicate()
# then ====================================================
@then("iterating produces 3 NotesSlidePlaceholder objects")
def then_iterating_produces_3_NotesSlidePlaceholder_objects(context):
idx = -1
for idx, placeholder in enumerate(context.notes_slide.placeholders):
typename = type(placeholder).__name__
assert typename == "NotesSlidePlaceholder", "got %s" % typename
assert idx == 2
@then("iterating slide_layouts produces 2 SlideLayout objects")
def then_iterating_slide_layouts_produces_2_SlideLayout_objects(context):
slide_layouts = context.slide_layouts
idx = -1
for idx, slide_layout in enumerate(slide_layouts):
assert type(slide_layout).__name__ == "SlideLayout"
assert idx == 1
@then("iterating slide_masters produces 2 SlideMaster objects")
def then_iterating_slide_masters_produces_2_SlideMaster_objects(context):
slide_masters = context.slide_masters
idx = -1
for idx, slide_master in enumerate(slide_masters):
assert type(slide_master).__name__ == "SlideMaster"
assert idx == 1
@then("iterating slides produces 3 Slide objects")
def then_iterating_slides_produces_3_Slide_objects(context):
slides = context.slides
idx = -1
for idx, slide in enumerate(slides):
assert type(slide).__name__ == "Slide"
assert idx == 2
@then("len(slides) is {count}")
def then_len_slides_is_count(context, count):
slides = context.slides
assert len(slides) == int(count)
@then("len(slide_layouts) is {n}")
def then_len_slide_layouts_is_2(context, n):
assert len(context.slide_layouts) == int(n)
@then("len(slide_masters) is 2")
def then_len_slide_masters_is_2(context):
slide_masters = context.slide_masters
assert len(slide_masters) == 2
@then("slide_layouts[1] is a SlideLayout object")
def then_slide_layouts_1_is_a_SlideLayout_object(context):
slide_layouts = context.slide_layouts
assert type(slide_layouts[1]).__name__ == "SlideLayout"
@then("slide_layouts.get_by_name(slide_layouts[1].name) is slide_layouts[1]")
def then_slide_layouts_get_by_name_is_slide_layout(context):
slide_layouts = context.slide_layouts
assert slide_layouts.get_by_name(slide_layouts[1].name) is slide_layouts[1]
@then("slide_layouts.index(slide_layouts[1]) == 1")
def then_slide_layouts_index_is_1(context):
slide_layouts = context.slide_layouts
assert slide_layouts.index(slide_layouts[1]) == 1
@then("slide_masters[1] is a SlideMaster object")
def then_slide_masters_1_is_a_SlideMaster_object(context):
slide_masters = context.slide_masters
assert type(slide_masters[1]).__name__ == "SlideMaster"
@then("slides.get(256) is slides[0]")
def then_slides_get_256_is_slides_0(context):
slides = context.slides
assert slides.get(256) is slides[0]
@then("slides.get(666, default=slides[2]) is slides[2]")
def then_slides_get_666_default_slides_2_is_slides_2(context):
slides = context.slides
assert slides.get(666, default=slides[2]) is slides[2]
@then("slides[2] is a Slide object")
def then_slides_2_is_a_Slide_object(context):
slides = context.slides
assert type(slides[2]).__name__ == "Slide"
@then("the new slide is at index {idx:d}")
def then_the_new_slide_is_at_index(context, idx):
assert context.slides[idx].slide_id == context.new_slide.slide_id, (
"expected new slide at index %d, got slide_id mismatch" % idx
)
@then("the slide order matches the original [1, 2, 0]")
def then_slide_order_matches_1_2_0(context):
o = context.original_slide_ids
expected = [o[1], o[2], o[0]]
actual = [s.slide_id for s in context.slides]
assert actual == expected, "expected %r, got %r" % (expected, actual)
@then("the surviving slide order matches the original [0, 2]")
def then_surviving_slide_order_matches_0_2(context):
o = context.original_slide_ids
expected = [o[0], o[2]]
actual = [s.slide_id for s in context.slides]
assert actual == expected, "expected %r, got %r" % (expected, actual)
@then("the duplicate is at index {idx:d}")
def then_the_duplicate_is_at_index(context, idx):
assert context.slides[idx].slide_id == context.new_slide.slide_id, (
"expected duplicate at index %d, got slide_id mismatch" % idx
)
@then("the source slide is still at index 0")
def then_source_slide_still_at_index_0(context):
assert context.slides[0].slide_id == context.original_slide_ids[0], (
"source slide moved off index 0"
)
@then("the duplicate slide_id is unique")
def then_duplicate_slide_id_is_unique(context):
assert context.new_slide.slide_id not in context.original_slide_ids, (
"duplicate slide_id collides with an existing slide"
)
@then("calling slides.duplicate(slides[0], index=99) raises IndexError")
def then_duplicate_index_99_raises(context):
import pytest
with pytest.raises(IndexError):
context.slides.duplicate(context.slides[0], index=99)