Skip to content

Commit db5a748

Browse files
author
Steve Canny
committed
add _SerializedRelationship.target_partname
1 parent 8a3cab4 commit db5a748

2 files changed

Lines changed: 45 additions & 1 deletion

File tree

opc/pkgreader.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
from opc.constants import RELATIONSHIP_TARGET_MODE as RTM
1616
from opc.oxml import oxml_fromstring
17-
from opc.packuri import PACKAGE_URI
17+
from opc.packuri import PACKAGE_URI, PackURI
1818
from opc.phys_pkg import PhysPkgReader
1919

2020

@@ -126,6 +126,7 @@ class _SerializedRelationship(object):
126126
"""
127127
def __init__(self, baseURI, rel_elm):
128128
super(_SerializedRelationship, self).__init__()
129+
self._baseURI = baseURI
129130
self._rId = rel_elm.rId
130131
self._reltype = rel_elm.reltype
131132
self._target_mode = rel_elm.target_mode
@@ -168,6 +169,23 @@ def target_ref(self):
168169
"""
169170
return self._target_ref
170171

172+
@property
173+
def target_partname(self):
174+
"""
175+
|PackURI| instance containing partname targeted by this relationship.
176+
Raises ``ValueError`` on reference if target_mode is ``'External'``.
177+
Use :attr:`target_mode` to check before referencing.
178+
"""
179+
if self.is_external:
180+
msg = ('target_partname attribute on Relationship is undefined w'
181+
'here TargetMode == "External"')
182+
raise ValueError(msg)
183+
# lazy-load _target_partname attribute
184+
if not hasattr(self, '_target_partname'):
185+
self._target_partname = PackURI.from_rel_ref(self._baseURI,
186+
self.target_ref)
187+
return self._target_partname
188+
171189

172190
class _SerializedRelationshipCollection(object):
173191
"""

tests/test_pkgreader.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,32 @@ def it_knows_when_it_is_external(self):
206206
srel = _SerializedRelationship(None, rel_elm)
207207
assert srel.is_external is expected_value
208208

209+
def it_can_calculate_its_target_partname(self):
210+
# test data --------------------
211+
cases = (
212+
('/', 'docProps/core.xml', '/docProps/core.xml'),
213+
('/ppt', 'viewProps.xml', '/ppt/viewProps.xml'),
214+
('/ppt/slides', '../slideLayouts/slideLayout1.xml',
215+
'/ppt/slideLayouts/slideLayout1.xml'),
216+
)
217+
for baseURI, target_ref, expected_partname in cases:
218+
# setup --------------------
219+
rel_elm = Mock(name='rel_elm', rId=None, reltype=None,
220+
target_ref=target_ref, target_mode=RTM.INTERNAL)
221+
# exercise -----------------
222+
srel = _SerializedRelationship(baseURI, rel_elm)
223+
# verify -------------------
224+
assert srel.target_partname == expected_partname
225+
226+
def it_raises_on_target_partname_when_external(self):
227+
rel_elm = Mock(
228+
name='rel_elm', rId='rId9', reltype='ReLtYpE',
229+
target_ref='docProps/core.xml', target_mode=RTM.EXTERNAL
230+
)
231+
srel = _SerializedRelationship('/', rel_elm)
232+
with pytest.raises(ValueError):
233+
srel.target_partname
234+
209235

210236
class Describe_SerializedRelationshipCollection(object):
211237

0 commit comments

Comments
 (0)