🌐 AI搜索 & 代理 主页
Skip to content

Commit 64e9836

Browse files
committed
hdr: add FooterPart.new()
1 parent 7f4e820 commit 64e9836

File tree

2 files changed

+48
-2
lines changed

2 files changed

+48
-2
lines changed

docx/parts/hdrftr.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,14 @@ class FooterPart(XmlPart):
1717
@classmethod
1818
def new(cls, package):
1919
"""Return newly created footer part."""
20+
partname = package.next_partname("/word/footer%d.xml")
21+
content_type = CT.WML_FOOTER
22+
element = parse_xml(cls._default_footer_xml())
23+
return cls(partname, content_type, element, package)
24+
25+
@classmethod
26+
def _default_footer_xml(cls):
27+
"""Return bytes containing XML for a default footer part."""
2028
raise NotImplementedError
2129

2230

tests/parts/test_hdrftr.py

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,50 @@
99
from docx.opc.constants import CONTENT_TYPE as CT, RELATIONSHIP_TYPE as RT
1010
from docx.opc.part import PartFactory
1111
from docx.package import Package
12-
from docx.parts.hdrftr import HeaderPart
12+
from docx.parts.hdrftr import FooterPart, HeaderPart
1313

1414
from ..unitutil.cxml import element
1515
from ..unitutil.mock import function_mock, initializer_mock, instance_mock, method_mock
1616

1717

18+
class DescribeFooterPart(object):
19+
20+
def it_can_create_a_new_footer_part(
21+
self, package_, _default_footer_xml_, parse_xml_, _init_
22+
):
23+
ftr = element("w:ftr")
24+
package_.next_partname.return_value = "/word/footer24.xml"
25+
_default_footer_xml_.return_value = "<w:ftr>"
26+
parse_xml_.return_value = ftr
27+
28+
footer_part = FooterPart.new(package_)
29+
30+
package_.next_partname.assert_called_once_with("/word/footer%d.xml")
31+
_default_footer_xml_.assert_called_once_with()
32+
parse_xml_.assert_called_once_with("<w:ftr>")
33+
_init_.assert_called_once_with(
34+
footer_part, "/word/footer24.xml", CT.WML_FOOTER, ftr, package_
35+
)
36+
37+
# fixture components ---------------------------------------------
38+
39+
@pytest.fixture
40+
def _default_footer_xml_(self, request):
41+
return method_mock(request, FooterPart, "_default_footer_xml", autospec=False)
42+
43+
@pytest.fixture
44+
def _init_(self, request):
45+
return initializer_mock(request, FooterPart)
46+
47+
@pytest.fixture
48+
def package_(self, request):
49+
return instance_mock(request, Package)
50+
51+
@pytest.fixture
52+
def parse_xml_(self, request):
53+
return function_mock(request, "docx.parts.hdrftr.parse_xml")
54+
55+
1856
class DescribeHeaderPart(object):
1957

2058
def it_is_used_by_loader_to_construct_header_part(
@@ -73,7 +111,7 @@ def header_part_(self, request):
73111

74112
@pytest.fixture
75113
def _init_(self, request):
76-
return initializer_mock(request, HeaderPart, autospec=True)
114+
return initializer_mock(request, HeaderPart)
77115

78116
@pytest.fixture
79117
def package_(self, request):

0 commit comments

Comments
 (0)