X Tutup
Skip to content

Commit 382073e

Browse files
author
Steve Canny
committed
doc: add DocumentPart.numbering_part
1 parent ba72289 commit 382073e

File tree

3 files changed

+53
-1
lines changed

3 files changed

+53
-1
lines changed

docx/parts/document.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
from ..blkcntnr import BlockItemContainer
1414
from ..document import Document
15+
from .numbering import NumberingPart
1516
from ..opc.constants import RELATIONSHIP_TYPE as RT
1617
from ..opc.part import XmlPart
1718
from ..section import Section
@@ -98,6 +99,20 @@ def next_id(self):
9899
if n not in used_ids:
99100
return n
100101

102+
@lazyproperty
103+
def numbering_part(self):
104+
"""
105+
A |NumberingPart| object providing access to the numbering
106+
definitions for this document. Creates an empty numbering part if one
107+
is not present.
108+
"""
109+
try:
110+
return self.part_related_by(RT.NUMBERING)
111+
except KeyError:
112+
numbering_part = NumberingPart.new()
113+
self.relate_to(numbering_part, RT.NUMBERING)
114+
return numbering_part
115+
101116
@property
102117
def paragraphs(self):
103118
"""

features/num-access-numbering-part.feature

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ Feature: Access the document numbering part
44
I need access to the numbering part of the document
55

66

7-
@wip
87
Scenario: Get an existing numbering part from document
98
Given a document having a numbering part
109
When I get the numbering part from the document

tests/parts/test_document.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from docx.package import ImageParts, Package
1616
from docx.parts.document import _Body, DocumentPart, InlineShapes, Sections
1717
from docx.parts.image import ImagePart
18+
from docx.parts.numbering import NumberingPart
1819
from docx.parts.styles import StylesPart
1920
from docx.section import Section
2021
from docx.shape import InlineShape
@@ -74,6 +75,21 @@ def it_provides_access_to_the_inline_shapes_in_the_document(
7475
InlineShapes_.assert_called_once_with(body_elm, document)
7576
assert inline_shapes is InlineShapes_.return_value
7677

78+
def it_provides_access_to_the_numbering_part(self, nmprt_get_fixture):
79+
document_part, numbering_part_ = nmprt_get_fixture
80+
numbering_part = document_part.numbering_part
81+
document_part.part_related_by.assert_called_once_with(RT.NUMBERING)
82+
assert numbering_part is numbering_part_
83+
84+
def it_creates_numbering_part_if_not_present(self, nmprt_create_fixture):
85+
document_part, NumberingPart_, numbering_part_ = nmprt_create_fixture
86+
numbering_part = document_part.numbering_part
87+
NumberingPart_.new.assert_called_once_with()
88+
document_part.relate_to.assert_called_once_with(
89+
numbering_part_, RT.NUMBERING
90+
)
91+
assert numbering_part is numbering_part_
92+
7793
def it_can_add_an_image_part_to_the_document(
7894
self, get_or_add_image_fixture):
7995
(document, image_descriptor_, image_parts_, relate_to_, image_part_,
@@ -182,6 +198,20 @@ def next_id_fixture(self, request):
182198
document = DocumentPart(None, None, document_elm, None)
183199
return document, expected_id
184200

201+
@pytest.fixture
202+
def nmprt_create_fixture(self, part_related_by_, relate_to_,
203+
NumberingPart_, numbering_part_):
204+
document_part = DocumentPart(None, None, None, None)
205+
part_related_by_.side_effect = KeyError
206+
NumberingPart_.new.return_value = numbering_part_
207+
return document_part, NumberingPart_, numbering_part_
208+
209+
@pytest.fixture
210+
def nmprt_get_fixture(self, part_related_by_, numbering_part_):
211+
document_part = DocumentPart(None, None, None, None)
212+
part_related_by_.return_value = numbering_part_
213+
return document_part, numbering_part_
214+
185215
@pytest.fixture
186216
def paragraphs_fixture(self, document_part_body_, body_, paragraphs_):
187217
document_part = DocumentPart(None, None, None, None)
@@ -271,6 +301,14 @@ def image_parts_(self, request, image_part_):
271301
def InlineShapes_(self, request):
272302
return class_mock(request, 'docx.parts.document.InlineShapes')
273303

304+
@pytest.fixture
305+
def NumberingPart_(self, request):
306+
return class_mock(request, 'docx.parts.document.NumberingPart')
307+
308+
@pytest.fixture
309+
def numbering_part_(self, request):
310+
return instance_mock(request, NumberingPart)
311+
274312
@pytest.fixture
275313
def p_(self, request):
276314
return instance_mock(request, Paragraph)

0 commit comments

Comments
 (0)
X Tutup