Skip to content

Commit da0587c

Browse files
author
Steve Canny
committed
opc: add OpcPackage.core_properties
Also, organize fixture components separate from fixtures.
1 parent 652fc43 commit da0587c

File tree

4 files changed

+83
-19
lines changed

4 files changed

+83
-19
lines changed

docx/opc/package.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def core_properties(self):
4141
|CoreProperties| object providing read/write access to the Dublin
4242
Core properties for this document.
4343
"""
44-
raise NotImplementedError
44+
return self._core_properties_part.core_properties
4545

4646
def iter_rels(self):
4747
"""
@@ -159,6 +159,14 @@ def save(self, pkg_file):
159159
part.before_marshal()
160160
PackageWriter.write(pkg_file, self.rels, self.parts)
161161

162+
@property
163+
def _core_properties_part(self):
164+
"""
165+
|CorePropertiesPart| object related to this package. Creates
166+
a default core properties part if one is not present (not common).
167+
"""
168+
raise NotImplementedError
169+
162170

163171
class Part(object):
164172
"""

docx/opc/parts/__init__.py

Whitespace-only changes.

docx/opc/parts/coreprops.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# encoding: utf-8
2+
3+
"""
4+
Core properties part, corresponds to ``/docProps/core.xml`` part in package.
5+
"""
6+
7+
from __future__ import (
8+
absolute_import, division, print_function, unicode_literals
9+
)
10+
11+
from ..package import XmlPart
12+
13+
14+
class CorePropertiesPart(XmlPart):
15+
"""
16+
Corresponds to part named ``/docProps/core.xml``, containing the core
17+
document properties for this document package.
18+
"""
19+
@property
20+
def core_properties(self):
21+
"""
22+
A |CoreProperties| object providing read/write access to the core
23+
properties contained in this core properties part.
24+
"""
25+
raise NotImplementedError

tests/opc/test_package.py

Lines changed: 49 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,22 @@
88

99
import pytest
1010

11+
from docx.opc.coreprops import CoreProperties
1112
from docx.opc.oxml import CT_Relationships
1213
from docx.opc.packuri import PACKAGE_URI, PackURI
1314
from docx.opc.package import (
1415
OpcPackage, Part, PartFactory, _Relationship, Relationships,
1516
Unmarshaller, XmlPart
1617
)
18+
from docx.opc.parts.coreprops import CorePropertiesPart
1719
from docx.opc.pkgreader import PackageReader
1820
from docx.oxml.xmlchemy import BaseOxmlElement
1921

2022
from ..unitutil.cxml import element
2123
from ..unitutil.mock import (
2224
call, class_mock, cls_attr_mock, function_mock, initializer_mock,
23-
instance_mock, loose_mock, method_mock, Mock, patch, PropertyMock
25+
instance_mock, loose_mock, method_mock, Mock, patch, PropertyMock,
26+
property_mock
2427
)
2528

2629

@@ -113,8 +116,53 @@ def it_can_save_to_a_pkg_file(
113116
pkg_file_, pkg._rels, parts_
114117
)
115118

119+
def it_provides_access_to_the_core_properties(self, core_props_fixture):
120+
opc_package, core_properties_ = core_props_fixture
121+
core_properties = opc_package.core_properties
122+
assert core_properties is core_properties_
123+
116124
# fixtures ---------------------------------------------
117125

126+
@pytest.fixture
127+
def core_props_fixture(
128+
self, _core_properties_part_prop_, core_properties_part_,
129+
core_properties_):
130+
opc_package = OpcPackage()
131+
_core_properties_part_prop_.return_value = core_properties_part_
132+
core_properties_part_.core_properties = core_properties_
133+
return opc_package, core_properties_
134+
135+
@pytest.fixture
136+
def relate_to_part_fixture_(self, request, pkg, rels_, reltype):
137+
rId = 'rId99'
138+
rel_ = instance_mock(request, _Relationship, name='rel_', rId=rId)
139+
rels_.get_or_add.return_value = rel_
140+
pkg._rels = rels_
141+
part_ = instance_mock(request, Part, name='part_')
142+
return pkg, part_, reltype, rId
143+
144+
@pytest.fixture
145+
def related_part_fixture_(self, request, rels_, reltype):
146+
related_part_ = instance_mock(request, Part, name='related_part_')
147+
rels_.part_with_reltype.return_value = related_part_
148+
pkg = OpcPackage()
149+
pkg._rels = rels_
150+
return pkg, reltype, related_part_
151+
152+
# fixture components -----------------------------------
153+
154+
@pytest.fixture
155+
def core_properties_(self, request):
156+
return instance_mock(request, CoreProperties)
157+
158+
@pytest.fixture
159+
def core_properties_part_(self, request):
160+
return instance_mock(request, CorePropertiesPart)
161+
162+
@pytest.fixture
163+
def _core_properties_part_prop_(self, request):
164+
return property_mock(request, OpcPackage, '_core_properties_part')
165+
118166
@pytest.fixture
119167
def PackageReader_(self, request):
120168
return class_mock(request, 'docx.opc.package.PackageReader')
@@ -171,23 +219,6 @@ def rel_attrs_(self, request):
171219
rId = 'rId99'
172220
return reltype, target_, rId
173221

174-
@pytest.fixture
175-
def relate_to_part_fixture_(self, request, pkg, rels_, reltype):
176-
rId = 'rId99'
177-
rel_ = instance_mock(request, _Relationship, name='rel_', rId=rId)
178-
rels_.get_or_add.return_value = rel_
179-
pkg._rels = rels_
180-
part_ = instance_mock(request, Part, name='part_')
181-
return pkg, part_, reltype, rId
182-
183-
@pytest.fixture
184-
def related_part_fixture_(self, request, rels_, reltype):
185-
related_part_ = instance_mock(request, Part, name='related_part_')
186-
rels_.part_with_reltype.return_value = related_part_
187-
pkg = OpcPackage()
188-
pkg._rels = rels_
189-
return pkg, reltype, related_part_
190-
191222
@pytest.fixture
192223
def rels_(self, request):
193224
return instance_mock(request, Relationships)

0 commit comments

Comments
 (0)