Skip to content

Commit 81e047e

Browse files
author
Steve Canny
committed
add _SerializedRelationship value type
1 parent 5be946c commit 81e047e

2 files changed

Lines changed: 73 additions & 1 deletion

File tree

opc/pkgreader.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
(OPC) package.
1313
"""
1414

15+
from opc.constants import RELATIONSHIP_TARGET_MODE as RTM
1516
from opc.oxml import oxml_fromstring
1617
from opc.packuri import PACKAGE_URI
1718
from opc.phys_pkg import PhysPkgReader
@@ -123,6 +124,49 @@ class _SerializedRelationship(object):
123124
Serialized, in this case, means any target part is referred to via its
124125
partname rather than a direct link to an in-memory |Part| object.
125126
"""
127+
def __init__(self, baseURI, rel_elm):
128+
super(_SerializedRelationship, self).__init__()
129+
self._rId = rel_elm.rId
130+
self._reltype = rel_elm.reltype
131+
self._target_mode = rel_elm.target_mode
132+
self._target_ref = rel_elm.target_ref
133+
134+
@property
135+
def is_external(self):
136+
"""
137+
True if target_mode is ``RTM.EXTERNAL``
138+
"""
139+
return self._target_mode == RTM.EXTERNAL
140+
141+
@property
142+
def reltype(self):
143+
"""Relationship type, like ``RT.OFFICE_DOCUMENT``"""
144+
return self._reltype
145+
146+
@property
147+
def rId(self):
148+
"""
149+
Relationship id, like 'rId9', corresponds to the ``Id`` attribute on
150+
the ``CT_Relationship`` element.
151+
"""
152+
return self._rId
153+
154+
@property
155+
def target_mode(self):
156+
"""
157+
String in ``TargetMode`` attribute of ``CT_Relationship`` element,
158+
one of ``RTM.INTERNAL`` or ``RTM.EXTERNAL``.
159+
"""
160+
return self._target_mode
161+
162+
@property
163+
def target_ref(self):
164+
"""
165+
String in ``Target`` attribute of ``CT_Relationship`` element, a
166+
relative part reference for internal target mode or an arbitrary URI,
167+
e.g. an HTTP URL, for external target mode.
168+
"""
169+
return self._target_ref
126170

127171

128172
class _SerializedRelationshipCollection(object):

tests/test_pkgreader.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@
1313

1414
from mock import call, Mock, patch
1515

16+
from opc.constants import RELATIONSHIP_TARGET_MODE as RTM
1617
from opc.phys_pkg import ZipPkgReader
1718
from opc.pkgreader import (
18-
_ContentTypeMap, PackageReader, _SerializedRelationshipCollection
19+
_ContentTypeMap, PackageReader, _SerializedRelationship,
20+
_SerializedRelationshipCollection
1921
)
2022

2123
from .unitutil import class_mock, initializer_mock, method_mock
@@ -179,6 +181,32 @@ def it_can_retrieve_srels_for_a_source_uri(
179181
assert retval == srels
180182

181183

184+
class Describe_SerializedRelationship(object):
185+
186+
def it_remembers_construction_values(self):
187+
# test data --------------------
188+
rel_elm = Mock(
189+
name='rel_elm', rId='rId9', reltype='ReLtYpE',
190+
target_ref='docProps/core.xml', target_mode=RTM.INTERNAL
191+
)
192+
# exercise ---------------------
193+
srel = _SerializedRelationship('/', rel_elm)
194+
# verify -----------------------
195+
assert srel.rId == 'rId9'
196+
assert srel.reltype == 'ReLtYpE'
197+
assert srel.target_ref == 'docProps/core.xml'
198+
assert srel.target_mode == RTM.INTERNAL
199+
200+
def it_knows_when_it_is_external(self):
201+
cases = (RTM.INTERNAL, RTM.EXTERNAL, 'FOOBAR')
202+
expected_values = (False, True, False)
203+
for target_mode, expected_value in zip(cases, expected_values):
204+
rel_elm = Mock(name='rel_elm', rId=None, reltype=None,
205+
target_ref=None, target_mode=target_mode)
206+
srel = _SerializedRelationship(None, rel_elm)
207+
assert srel.is_external is expected_value
208+
209+
182210
class Describe_SerializedRelationshipCollection(object):
183211

184212
@pytest.fixture

0 commit comments

Comments
 (0)