Skip to content

Commit e43b7b9

Browse files
author
Steve Canny
committed
add _Relationship value type
1 parent 042c313 commit e43b7b9

File tree

2 files changed

+71
-2
lines changed

2 files changed

+71
-2
lines changed

opc/package.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,37 @@ class _Relationship(object):
129129
"""
130130
def __init__(self, rId, reltype, target, baseURI, external=False):
131131
super(_Relationship, self).__init__()
132+
self._rId = rId
133+
self._reltype = reltype
134+
self._target = target
135+
self._baseURI = baseURI
136+
self._is_external = bool(external)
137+
138+
@property
139+
def is_external(self):
140+
return self._is_external
141+
142+
@property
143+
def reltype(self):
144+
return self._reltype
145+
146+
@property
147+
def rId(self):
148+
return self._rId
149+
150+
@property
151+
def target_part(self):
152+
if self._is_external:
153+
raise ValueError("target_part property on _Relationship is undef"
154+
"ined when target mode is External")
155+
return self._target
156+
157+
@property
158+
def target_ref(self):
159+
if self._is_external:
160+
return self._target
161+
else:
162+
return self._target.partname.relative_ref(self._baseURI)
132163

133164

134165
class RelationshipCollection(object):

tests/test_package.py

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,10 @@
1414
from mock import call, Mock
1515

1616
from opc.package import (
17-
OpcPackage, Part, PartFactory, RelationshipCollection, Unmarshaller
17+
OpcPackage, Part, PartFactory, _Relationship, RelationshipCollection,
18+
Unmarshaller
1819
)
19-
from opc.packuri import PACKAGE_URI
20+
from opc.packuri import PACKAGE_URI, PackURI
2021

2122
from .unitutil import class_mock, method_mock
2223

@@ -132,6 +133,43 @@ def it_constructs_a_part_instance(self, Part_):
132133
assert part == Part_.return_value
133134

134135

136+
class Describe_Relationship(object):
137+
138+
def it_remembers_construction_values(self):
139+
# test data --------------------
140+
rId = 'rId9'
141+
reltype = 'reltype'
142+
target = Mock(name='target_part')
143+
external = False
144+
# exercise ---------------------
145+
rel = _Relationship(rId, reltype, target, None, external)
146+
# verify -----------------------
147+
assert rel.rId == rId
148+
assert rel.reltype == reltype
149+
assert rel.target_part == target
150+
assert rel.is_external == external
151+
152+
def it_should_raise_on_target_part_access_on_external_rel(self):
153+
rel = _Relationship(None, None, None, None, external=True)
154+
with pytest.raises(ValueError):
155+
rel.target_part
156+
157+
def it_should_have_target_ref_for_external_rel(self):
158+
rel = _Relationship(None, None, 'target', None, external=True)
159+
assert rel.target_ref == 'target'
160+
161+
def it_should_have_relative_ref_for_internal_rel(self):
162+
"""
163+
Internal relationships (TargetMode == 'Internal' in the XML) should
164+
have a relative ref, e.g. '../slideLayouts/slideLayout1.xml', for
165+
the target_ref attribute.
166+
"""
167+
part = Mock(name='part', partname=PackURI('/ppt/media/image1.png'))
168+
baseURI = '/ppt/slides'
169+
rel = _Relationship(None, None, part, baseURI) # external=False
170+
assert rel.target_ref == '../media/image1.png'
171+
172+
135173
class DescribeRelationshipCollection(object):
136174

137175
@pytest.fixture

0 commit comments

Comments
 (0)