Skip to content

Commit 9936afa

Browse files
author
Steve Canny
committed
add CT_Types.overrides
1 parent f0ca094 commit 9936afa

3 files changed

Lines changed: 78 additions & 3 deletions

File tree

opc/oxml.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,9 +149,23 @@ def target_mode(self):
149149
return self.get('TargetMode', RTM.INTERNAL)
150150

151151

152+
class CT_Types(OxmlBaseElement):
153+
"""
154+
``<Types>`` element, the container element for Default and Override
155+
elements in [Content_Types].xml.
156+
"""
157+
@property
158+
def overrides(self):
159+
try:
160+
return self.Override[:]
161+
except AttributeError:
162+
return []
163+
164+
152165
ct_namespace = element_class_lookup.get_namespace(nsmap['ct'])
153166
ct_namespace['Default'] = CT_Default
154167
ct_namespace['Override'] = CT_Override
168+
ct_namespace['Types'] = CT_Types
155169

156170
pr_namespace = element_class_lookup.get_namespace(nsmap['pr'])
157171
pr_namespace['Relationship'] = CT_Relationship

tests/test_oxml.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@
1010
"""Test suite for opc.oxml module."""
1111

1212
from opc.constants import RELATIONSHIP_TARGET_MODE as RTM
13+
from opc.oxml import CT_Override
1314

14-
from .unitdata import a_Default, an_Override, a_Relationship
15+
from .unitdata import a_Default, an_Override, a_Relationship, a_Types
1516

1617

1718
class DescribeCT_Default(object):
@@ -38,3 +39,12 @@ def it_provides_read_access_to_xml_values(self):
3839
assert rel.reltype == 'ReLtYpE'
3940
assert rel.target_ref == 'docProps/core.xml'
4041
assert rel.target_mode == RTM.INTERNAL
42+
43+
44+
class DescribeCT_Types(object):
45+
46+
def it_provides_access_to_override_child_elements(self):
47+
types = a_Types().element
48+
assert len(types.overrides) == 3
49+
for override in types.overrides:
50+
assert isinstance(override, CT_Override)

tests/unitdata.py

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ def element(self):
2222
"""Return element based on XML generated by builder"""
2323
return oxml_fromstring(self.xml)
2424

25+
def with_indent(self, indent):
26+
"""Add integer *indent* spaces at beginning of element XML"""
27+
self._indent = indent
28+
return self
29+
2530

2631
class CT_DefaultBuilder(BaseBuilder):
2732
"""
@@ -49,14 +54,27 @@ class CT_OverrideBuilder(BaseBuilder):
4954
def __init__(self):
5055
"""Establish instance variables with default values"""
5156
self._content_type = 'app/vnd.type'
57+
self._indent = 0
5258
self._namespace = ' xmlns="%s"' % NS.OPC_CONTENT_TYPES
5359
self._partname = '/part/name.xml'
5460

61+
def with_content_type(self, content_type):
62+
"""Set ContentType attribute to *content_type*"""
63+
self._content_type = content_type
64+
return self
65+
66+
def with_partname(self, partname):
67+
"""Set PartName attribute to *partname*"""
68+
self._partname = partname
69+
return self
70+
5571
@property
5672
def xml(self):
5773
"""Return Override element"""
58-
tmpl = '<Override%s PartName="%s" ContentType="%s"/>\n'
59-
return tmpl % (self._namespace, self._partname, self._content_type)
74+
tmpl = '%s<Override%s PartName="%s" ContentType="%s"/>\n'
75+
indent = ' ' * self._indent
76+
return tmpl % (indent, self._namespace, self._partname,
77+
self._content_type)
6078

6179

6280
class CT_RelationshipBuilder(BaseBuilder):
@@ -86,6 +104,34 @@ def xml(self):
86104
self._target, self.target_mode)
87105

88106

107+
class CT_TypesBuilder(BaseBuilder):
108+
"""
109+
Test data builder for CT_Types (<Types>) XML element, the root element in
110+
[Content_Types].xml files
111+
"""
112+
def __init__(self):
113+
"""Establish instance variables with default values"""
114+
self._overrides = (
115+
('/docProps/core.xml', 'app/vnd.type1'),
116+
('/ppt/presentation.xml', 'app/vnd.type2'),
117+
('/docProps/thumbnail.jpeg', 'image/jpeg'),
118+
)
119+
120+
@property
121+
def xml(self):
122+
"""
123+
Return XML string based on settings accumulated via method calls
124+
"""
125+
xml = '<Types xmlns="%s">\n' % NS.OPC_CONTENT_TYPES
126+
for partname, content_type in self._overrides:
127+
xml += (an_Override().with_partname(partname)
128+
.with_content_type(content_type)
129+
.with_indent(2)
130+
.xml)
131+
xml += '</Types>\n'
132+
return xml
133+
134+
89135
def a_Default():
90136
"""Return a CT_DefaultBuilder instance"""
91137
return CT_DefaultBuilder()
@@ -99,3 +145,8 @@ def an_Override():
99145
def a_Relationship():
100146
"""Return a CT_RelationshipBuilder instance"""
101147
return CT_RelationshipBuilder()
148+
149+
150+
def a_Types():
151+
"""Return a CT_TypesBuilder instance"""
152+
return CT_TypesBuilder()

0 commit comments

Comments
 (0)