Skip to content

Commit e573716

Browse files
ondrej-111scanny
authored andcommitted
hdr: add _Header.is_linked_to_previous setter
1 parent 801e3fb commit e573716

File tree

2 files changed

+59
-4
lines changed

2 files changed

+59
-4
lines changed

docx/section.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,25 @@ def is_linked_to_previous(self):
240240
# ---absence of a header (definition) part indicates "linked" behavior---
241241
return not self._has_header_part
242242

243+
@is_linked_to_previous.setter
244+
def is_linked_to_previous(self, value):
245+
new_state = bool(value)
246+
# ---do nothing when value is not being changed---
247+
if new_state == self.is_linked_to_previous:
248+
return
249+
if new_state is True:
250+
self._drop_header_part()
251+
else:
252+
self._add_header_part()
253+
254+
def _add_header_part(self):
255+
"""Return newly-added header part."""
256+
raise NotImplementedError
257+
258+
def _drop_header_part(self):
259+
"""Remove header definition associated with this section."""
260+
raise NotImplementedError
261+
243262
@property
244263
def _has_header_part(self):
245264
"""True if a header is explicitly defined for this section."""

tests/test_section.py

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from docx.shared import Inches
1313

1414
from .unitutil.cxml import element, xml
15-
from .unitutil.mock import call, class_mock, instance_mock, property_mock
15+
from .unitutil.mock import call, class_mock, instance_mock, method_mock, property_mock
1616

1717

1818
class DescribeSections(object):
@@ -360,16 +360,32 @@ def header_(self, request):
360360
class Describe_Header(object):
361361

362362
def it_knows_when_its_linked_to_the_previous_header(
363-
self, is_linked_fixture, _has_header_part_prop_
363+
self, is_linked_get_fixture, _has_header_part_prop_
364364
):
365-
has_header_part, expected_value = is_linked_fixture
365+
has_header_part, expected_value = is_linked_get_fixture
366366
_has_header_part_prop_.return_value = has_header_part
367367
header = _Header(None, None)
368368

369369
is_linked = header.is_linked_to_previous
370370

371371
assert is_linked is expected_value
372372

373+
def it_can_change_whether_it_is_linked_to_previous_header(
374+
self,
375+
is_linked_set_fixture,
376+
_has_header_part_prop_,
377+
_drop_header_part_,
378+
_add_header_part_,
379+
):
380+
has_header_part, new_value, drop_calls, add_calls = is_linked_set_fixture
381+
_has_header_part_prop_.return_value = has_header_part
382+
header = _Header(None, None)
383+
384+
header.is_linked_to_previous = new_value
385+
386+
assert _drop_header_part_.call_args_list == [call(header)] * drop_calls
387+
assert _add_header_part_.call_args_list == [call(header)] * add_calls
388+
373389
def it_knows_when_it_has_a_header_part_to_help(self, has_header_part_fixture):
374390
sectPr, expected_value = has_header_part_fixture
375391
header = _Header(sectPr, None)
@@ -391,12 +407,32 @@ def has_header_part_fixture(self, request):
391407
return sectPr, expected_value
392408

393409
@pytest.fixture(params=[(False, True), (True, False)])
394-
def is_linked_fixture(self, request):
410+
def is_linked_get_fixture(self, request):
395411
has_header_part, expected_value = request.param
396412
return has_header_part, expected_value
397413

414+
@pytest.fixture(
415+
params=[
416+
(False, True, 0, 0),
417+
(True, False, 0, 0),
418+
(True, True, 1, 0),
419+
(False, False, 0, 1),
420+
]
421+
)
422+
def is_linked_set_fixture(self, request):
423+
has_header_part, new_value, drop_calls, add_calls = request.param
424+
return has_header_part, new_value, drop_calls, add_calls
425+
398426
# fixture components ---------------------------------------------
399427

428+
@pytest.fixture
429+
def _add_header_part_(self, request):
430+
return method_mock(request, _Header, "_add_header_part", autospec=True)
431+
432+
@pytest.fixture
433+
def _drop_header_part_(self, request):
434+
return method_mock(request, _Header, "_drop_header_part", autospec=True)
435+
400436
@pytest.fixture
401437
def _has_header_part_prop_(self, request):
402438
return property_mock(request, _Header, "_has_header_part")

0 commit comments

Comments
 (0)