Skip to content

Commit c8c6249

Browse files
committed
hdr: add _BaseHeaderFooter._element
1 parent 11e0fb3 commit c8c6249

File tree

2 files changed

+44
-27
lines changed

2 files changed

+44
-27
lines changed

docx/section.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,20 @@ def _drop_definition(self):
251251
"""Remove header/footer part containing the definition of this header/footer."""
252252
raise NotImplementedError("must be implemented by each subclass")
253253

254+
@property
255+
def _element(self):
256+
"""`w:hdr` or `w:ftr` element, root of header/footer part."""
257+
return self._get_or_add_definition().element
258+
259+
def _get_or_add_definition(self):
260+
"""Return HeaderPart or FooterPart object for this section.
261+
262+
If this header/footer inherits its content, the part for the prior header/footer
263+
is returned. If the definition cannot be inherited (it belongs to the first
264+
section), a new definition is added and then returned.
265+
"""
266+
raise NotImplementedError
267+
254268
@property
255269
def _has_definition(self):
256270
"""True if this header/footer has a related part containing its definition."""
@@ -292,12 +306,7 @@ def _drop_definition(self):
292306
rId = self._sectPr.remove_headerReference(WD_HEADER_FOOTER.PRIMARY)
293307
self._document_part.drop_header_part(rId)
294308

295-
@property
296-
def _element(self):
297-
"""`w:hdr` element, root of header part."""
298-
return self._get_or_add_header_part().element
299-
300-
def _get_or_add_header_part(self):
309+
def _get_or_add_definition(self):
301310
"""Return |HeaderPart| object for this header.
302311
303312
If this header inherits its content, the header part for the prior header is
@@ -312,7 +321,7 @@ def _get_or_add_header_part(self):
312321
prior_header = self._prior_header
313322
# ---case-2: header inherits and belongs to second-or-later section---
314323
if prior_header is not None:
315-
return prior_header._get_or_add_header_part()
324+
return prior_header._get_or_add_definition()
316325
# ---case-3: header inherits, but is first header---
317326
return self._add_definition()
318327

tests/test_section.py

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,19 @@ def it_can_change_whether_it_is_linked_to_previous_header_or_footer(
387387
assert _drop_definition_.call_args_list == [call(header)] * drop_calls
388388
assert _add_definition_.call_args_list == [call(header)] * add_calls
389389

390+
def it_provides_access_to_the_hdr_or_ftr_element_to_help(
391+
self, _get_or_add_definition_, header_part_
392+
):
393+
hdr = element("w:hdr")
394+
_get_or_add_definition_.return_value = header_part_
395+
header_part_.element = hdr
396+
header = _BaseHeaderFooter(None, None)
397+
398+
hdr_elm = header._element
399+
400+
_get_or_add_definition_.assert_called_once_with(header)
401+
assert hdr_elm is hdr
402+
390403
# fixtures -------------------------------------------------------
391404

392405
@pytest.fixture(params=[(False, True), (True, False)])
@@ -416,10 +429,18 @@ def _add_definition_(self, request):
416429
def _drop_definition_(self, request):
417430
return method_mock(request, _BaseHeaderFooter, "_drop_definition")
418431

432+
@pytest.fixture
433+
def _get_or_add_definition_(self, request):
434+
return method_mock(request, _BaseHeaderFooter, "_get_or_add_definition")
435+
419436
@pytest.fixture
420437
def _has_definition_prop_(self, request):
421438
return property_mock(request, _BaseHeaderFooter, "_has_definition")
422439

440+
@pytest.fixture
441+
def header_part_(self, request):
442+
return instance_mock(request, HeaderPart)
443+
423444

424445
class Describe_Footer(object):
425446

@@ -500,27 +521,14 @@ def it_can_drop_the_related_header_part_to_help(self, document_part_):
500521
assert sectPr.xml == xml("w:sectPr{r:a=b}")
501522
document_part_.drop_header_part.assert_called_once_with("rId42")
502523

503-
def it_provides_access_to_the_hdr_element_to_help(
504-
self, _get_or_add_header_part_, header_part_
505-
):
506-
hdr = element("w:hdr")
507-
_get_or_add_header_part_.return_value = header_part_
508-
header_part_.element = hdr
509-
header = _Header(None, None)
510-
511-
hdr_elm = header._element
512-
513-
_get_or_add_header_part_.assert_called_once_with(header)
514-
assert hdr_elm is hdr
515-
516524
def it_gets_the_header_part_when_it_has_one(
517525
self, _has_definition_prop_, _header_part_prop_, header_part_
518526
):
519527
_has_definition_prop_.return_value = True
520528
_header_part_prop_.return_value = header_part_
521529
header = _Header(None, None)
522530

523-
header_part = header._get_or_add_header_part()
531+
header_part = header._get_or_add_definition()
524532

525533
assert header_part is header_part_
526534

@@ -529,12 +537,12 @@ def but_it_gets_the_prior_header_part_when_it_is_linked(
529537
):
530538
_has_definition_prop_.return_value = False
531539
_prior_header_prop_.return_value = prior_header_
532-
prior_header_._get_or_add_header_part.return_value = header_part_
540+
prior_header_._get_or_add_definition.return_value = header_part_
533541
header = _Header(None, None)
534542

535-
header_part = header._get_or_add_header_part()
543+
header_part = header._get_or_add_definition()
536544

537-
prior_header_._get_or_add_header_part.assert_called_once_with()
545+
prior_header_._get_or_add_definition.assert_called_once_with()
538546
assert header_part is header_part_
539547

540548
def and_it_adds_the_header_part_when_it_is_linked_and_the_first_section(
@@ -549,7 +557,7 @@ def and_it_adds_the_header_part_when_it_is_linked_and_the_first_section(
549557
_add_definition_.return_value = header_part_
550558
header = _Header(None, None)
551559

552-
header_part = header._get_or_add_header_part()
560+
header_part = header._get_or_add_definition()
553561

554562
_add_definition_.assert_called_once_with(header)
555563
assert header_part is header_part_
@@ -620,8 +628,8 @@ def document_part_(self, request):
620628
return instance_mock(request, DocumentPart)
621629

622630
@pytest.fixture
623-
def _get_or_add_header_part_(self, request):
624-
return method_mock(request, _Header, "_get_or_add_header_part")
631+
def _get_or_add_definition_(self, request):
632+
return method_mock(request, _Header, "_get_or_add_definition")
625633

626634
@pytest.fixture
627635
def _has_definition_prop_(self, request):

0 commit comments

Comments
 (0)