Skip to content

Commit 4bec90c

Browse files
author
Steve Canny
committed
num: add _NumberingDefinitions.__len__()
1 parent 0340c71 commit 4bec90c

File tree

6 files changed

+61
-2
lines changed

6 files changed

+61
-2
lines changed

docx/oxml/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@
3030
register_custom_element_class('w:body', CT_Body)
3131
register_custom_element_class('w:document', CT_Document)
3232

33+
from docx.oxml.parts.numbering import CT_Numbering
34+
register_custom_element_class('w:numbering', CT_Numbering)
35+
3336
from docx.oxml.table import CT_Row, CT_Tbl, CT_TblGrid, CT_TblPr, CT_Tc
3437
register_custom_element_class('w:tbl', CT_Tbl)
3538
register_custom_element_class('w:tblGrid', CT_TblGrid)

docx/oxml/parts/numbering.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,17 @@
44
Custom element classes related to the numbering part
55
"""
66

7-
from docx.oxml.shared import OxmlBaseElement
7+
from docx.oxml.shared import OxmlBaseElement, qn
88

99

1010
class CT_Numbering(OxmlBaseElement):
1111
"""
1212
``<w:numbering>`` element, the root element of a numbering part, i.e.
1313
numbering.xml
1414
"""
15+
@property
16+
def num_lst(self):
17+
"""
18+
List of <w:num> child elements.
19+
"""
20+
return self.findall(qn('w:num'))

docx/parts/numbering.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,6 @@ class _NumberingDefinitions(object):
5858
def __init__(self, numbering_elm):
5959
super(_NumberingDefinitions, self).__init__()
6060
self._numbering = numbering_elm
61+
62+
def __len__(self):
63+
return len(self._numbering.num_lst)

features/num-get-numbering-part.feature

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ Feature: Get the document numbering part
33
As a programmer using the advanced python-docx API
44
I need access to the numbering part of the document
55

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

tests/oxml/unitdata/numbering.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# encoding: utf-8
2+
3+
"""
4+
Test data builders for numbering part XML elements
5+
"""
6+
7+
from ...unitdata import BaseBuilder
8+
9+
10+
class CT_NumBuilder(BaseBuilder):
11+
__tag__ = 'w:num'
12+
__nspfxs__ = ('w',)
13+
__attrs__ = ('w:numId')
14+
15+
16+
class CT_NumberingBuilder(BaseBuilder):
17+
__tag__ = 'w:numbering'
18+
__nspfxs__ = ('w',)
19+
__attrs__ = ()
20+
21+
22+
def a_num():
23+
return CT_NumBuilder()
24+
25+
26+
def a_numbering():
27+
return CT_NumberingBuilder()

tests/parts/test_numbering.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from docx.package import Package
1616
from docx.parts.numbering import NumberingPart, _NumberingDefinitions
1717

18+
from ..oxml.unitdata.numbering import a_num, a_numbering
1819
from ..unitutil import (
1920
function_mock, class_mock, initializer_mock, instance_mock, method_mock
2021
)
@@ -138,3 +139,23 @@ def package_(self, request):
138139
@pytest.fixture
139140
def partname_(self, request):
140141
return instance_mock(request, PackURI)
142+
143+
144+
class Describe_NumberingDefinitions(object):
145+
146+
def it_knows_how_many_numbering_definitions_it_contains(
147+
self, len_fixture):
148+
numbering_definitions, numbering_definition_count = len_fixture
149+
assert len(numbering_definitions) == numbering_definition_count
150+
151+
# fixtures -------------------------------------------------------
152+
153+
@pytest.fixture(params=[0, 1, 2, 3])
154+
def len_fixture(self, request):
155+
numbering_definition_count = request.param
156+
numbering_bldr = a_numbering().with_nsdecls()
157+
for idx in range(numbering_definition_count):
158+
numbering_bldr.with_child(a_num())
159+
numbering_elm = numbering_bldr.element
160+
numbering_definitions = _NumberingDefinitions(numbering_elm)
161+
return numbering_definitions, numbering_definition_count

0 commit comments

Comments
 (0)