Skip to content

Commit 97f27d0

Browse files
author
Steve Canny
committed
oxml: add unit tests for register_element_cls()
renamed from register_custom_element_class()
1 parent eb36411 commit 97f27d0

2 files changed

Lines changed: 78 additions & 56 deletions

File tree

docx/oxml/__init__.py

Lines changed: 54 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def parse_xml(xml):
2929
return root_element
3030

3131

32-
def register_custom_element_class(tag, cls):
32+
def register_element_cls(tag, cls):
3333
"""
3434
Register *cls* to be constructed when the oxml parser encounters an
3535
element with matching *tag*. *tag* is a string of the form
@@ -65,70 +65,70 @@ def OxmlElement(nsptag_str, attrs=None, nsmap=None):
6565
CT_Blip, CT_BlipFillProperties, CT_GraphicalObject,
6666
CT_GraphicalObjectData, CT_Inline, CT_Picture, CT_PositiveSize2D
6767
)
68-
register_custom_element_class('a:blip', CT_Blip)
69-
register_custom_element_class('a:graphic', CT_GraphicalObject)
70-
register_custom_element_class('a:graphicData', CT_GraphicalObjectData)
71-
register_custom_element_class('pic:blipFill', CT_BlipFillProperties)
72-
register_custom_element_class('pic:pic', CT_Picture)
73-
register_custom_element_class('wp:extent', CT_PositiveSize2D)
74-
register_custom_element_class('wp:inline', CT_Inline)
68+
register_element_cls('a:blip', CT_Blip)
69+
register_element_cls('a:graphic', CT_GraphicalObject)
70+
register_element_cls('a:graphicData', CT_GraphicalObjectData)
71+
register_element_cls('pic:blipFill', CT_BlipFillProperties)
72+
register_element_cls('pic:pic', CT_Picture)
73+
register_element_cls('wp:extent', CT_PositiveSize2D)
74+
register_element_cls('wp:inline', CT_Inline)
7575

7676
from docx.oxml.parts.document import CT_Body, CT_Document
77-
register_custom_element_class('w:body', CT_Body)
78-
register_custom_element_class('w:document', CT_Document)
77+
register_element_cls('w:body', CT_Body)
78+
register_element_cls('w:document', CT_Document)
7979

8080
from docx.oxml.parts.numbering import (
8181
CT_Num, CT_Numbering, CT_NumLvl, CT_NumPr
8282
)
83-
register_custom_element_class('w:abstractNumId', CT_DecimalNumber)
84-
register_custom_element_class('w:ilvl', CT_DecimalNumber)
85-
register_custom_element_class('w:lvlOverride', CT_NumLvl)
86-
register_custom_element_class('w:num', CT_Num)
87-
register_custom_element_class('w:numId', CT_DecimalNumber)
88-
register_custom_element_class('w:numPr', CT_NumPr)
89-
register_custom_element_class('w:numbering', CT_Numbering)
83+
register_element_cls('w:abstractNumId', CT_DecimalNumber)
84+
register_element_cls('w:ilvl', CT_DecimalNumber)
85+
register_element_cls('w:lvlOverride', CT_NumLvl)
86+
register_element_cls('w:num', CT_Num)
87+
register_element_cls('w:numId', CT_DecimalNumber)
88+
register_element_cls('w:numPr', CT_NumPr)
89+
register_element_cls('w:numbering', CT_Numbering)
9090

9191
from docx.oxml.parts.styles import CT_Style, CT_Styles
92-
register_custom_element_class('w:style', CT_Style)
93-
register_custom_element_class('w:styles', CT_Styles)
92+
register_element_cls('w:style', CT_Style)
93+
register_element_cls('w:styles', CT_Styles)
9494

9595
from docx.oxml.table import CT_Row, CT_Tbl, CT_TblGrid, CT_TblPr, CT_Tc
96-
register_custom_element_class('w:tbl', CT_Tbl)
97-
register_custom_element_class('w:tblGrid', CT_TblGrid)
98-
register_custom_element_class('w:tblPr', CT_TblPr)
99-
register_custom_element_class('w:tblStyle', CT_String)
100-
register_custom_element_class('w:tc', CT_Tc)
101-
register_custom_element_class('w:tr', CT_Row)
96+
register_element_cls('w:tbl', CT_Tbl)
97+
register_element_cls('w:tblGrid', CT_TblGrid)
98+
register_element_cls('w:tblPr', CT_TblPr)
99+
register_element_cls('w:tblStyle', CT_String)
100+
register_element_cls('w:tc', CT_Tc)
101+
register_element_cls('w:tr', CT_Row)
102102

103103
from docx.oxml.text import (
104104
CT_Br, CT_P, CT_PPr, CT_R, CT_RPr, CT_Text, CT_Underline
105105
)
106-
register_custom_element_class('w:b', CT_OnOff)
107-
register_custom_element_class('w:bCs', CT_OnOff)
108-
register_custom_element_class('w:br', CT_Br)
109-
register_custom_element_class('w:caps', CT_OnOff)
110-
register_custom_element_class('w:cs', CT_OnOff)
111-
register_custom_element_class('w:dstrike', CT_OnOff)
112-
register_custom_element_class('w:emboss', CT_OnOff)
113-
register_custom_element_class('w:i', CT_OnOff)
114-
register_custom_element_class('w:iCs', CT_OnOff)
115-
register_custom_element_class('w:imprint', CT_OnOff)
116-
register_custom_element_class('w:noProof', CT_OnOff)
117-
register_custom_element_class('w:oMath', CT_OnOff)
118-
register_custom_element_class('w:outline', CT_OnOff)
119-
register_custom_element_class('w:p', CT_P)
120-
register_custom_element_class('w:pPr', CT_PPr)
121-
register_custom_element_class('w:pStyle', CT_String)
122-
register_custom_element_class('w:r', CT_R)
123-
register_custom_element_class('w:rPr', CT_RPr)
124-
register_custom_element_class('w:rStyle', CT_String)
125-
register_custom_element_class('w:rtl', CT_OnOff)
126-
register_custom_element_class('w:shadow', CT_OnOff)
127-
register_custom_element_class('w:smallCaps', CT_OnOff)
128-
register_custom_element_class('w:snapToGrid', CT_OnOff)
129-
register_custom_element_class('w:specVanish', CT_OnOff)
130-
register_custom_element_class('w:strike', CT_OnOff)
131-
register_custom_element_class('w:t', CT_Text)
132-
register_custom_element_class('w:u', CT_Underline)
133-
register_custom_element_class('w:vanish', CT_OnOff)
134-
register_custom_element_class('w:webHidden', CT_OnOff)
106+
register_element_cls('w:b', CT_OnOff)
107+
register_element_cls('w:bCs', CT_OnOff)
108+
register_element_cls('w:br', CT_Br)
109+
register_element_cls('w:caps', CT_OnOff)
110+
register_element_cls('w:cs', CT_OnOff)
111+
register_element_cls('w:dstrike', CT_OnOff)
112+
register_element_cls('w:emboss', CT_OnOff)
113+
register_element_cls('w:i', CT_OnOff)
114+
register_element_cls('w:iCs', CT_OnOff)
115+
register_element_cls('w:imprint', CT_OnOff)
116+
register_element_cls('w:noProof', CT_OnOff)
117+
register_element_cls('w:oMath', CT_OnOff)
118+
register_element_cls('w:outline', CT_OnOff)
119+
register_element_cls('w:p', CT_P)
120+
register_element_cls('w:pPr', CT_PPr)
121+
register_element_cls('w:pStyle', CT_String)
122+
register_element_cls('w:r', CT_R)
123+
register_element_cls('w:rPr', CT_RPr)
124+
register_element_cls('w:rStyle', CT_String)
125+
register_element_cls('w:rtl', CT_OnOff)
126+
register_element_cls('w:shadow', CT_OnOff)
127+
register_element_cls('w:smallCaps', CT_OnOff)
128+
register_element_cls('w:snapToGrid', CT_OnOff)
129+
register_element_cls('w:specVanish', CT_OnOff)
130+
register_element_cls('w:strike', CT_OnOff)
131+
register_element_cls('w:t', CT_Text)
132+
register_element_cls('w:u', CT_Underline)
133+
register_element_cls('w:vanish', CT_OnOff)
134+
register_element_cls('w:webHidden', CT_OnOff)

tests/oxml/test__init__.py

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010

1111
from lxml import etree
1212

13-
from docx.oxml import oxml_parser, parse_xml, register_custom_element_class
13+
from docx.oxml import oxml_parser, parse_xml, register_element_cls
14+
from docx.oxml.ns import qn
1415
from docx.oxml.shared import OxmlBaseElement
1516

1617

@@ -55,7 +56,7 @@ def it_accepts_unicode_providing_there_is_no_encoding_declaration(self):
5556
parse_xml(xml_text)
5657

5758
def it_uses_registered_element_classes(self, xml_bytes):
58-
register_custom_element_class('a:foo', CustElmCls)
59+
register_element_cls('a:foo', CustElmCls)
5960
element = parse_xml(xml_bytes)
6061
assert isinstance(element, CustElmCls)
6162

@@ -71,6 +72,27 @@ def xml_bytes(self):
7172
).encode('utf-8')
7273

7374

75+
class DescribeRegisterElementCls(object):
76+
77+
def it_determines_class_used_for_elements_with_matching_tagname(
78+
self, xml_text):
79+
register_element_cls('a:foo', CustElmCls)
80+
foo = parse_xml(xml_text)
81+
assert type(foo) is CustElmCls
82+
assert type(foo.find(qn('a:bar'))) is etree._Element
83+
84+
# fixture components ---------------------------------------------
85+
86+
@pytest.fixture
87+
def xml_text(self):
88+
return (
89+
'<a:foo xmlns:a="http://schemas.openxmlformats.org/drawingml/200'
90+
'6/main">\n'
91+
' <a:bar>foøbår</a:bar>\n'
92+
'</a:foo>\n'
93+
)
94+
95+
7496
# ===========================================================================
7597
# static fixture
7698
# ===========================================================================

0 commit comments

Comments
 (0)