Skip to content

Commit c96e946

Browse files
author
Steve Canny
committed
doc: rewrite DocumentPart.get_or_add_image()
Was get_or_add_image_part(). Return value changed.
1 parent f1368d2 commit c96e946

File tree

2 files changed

+28
-55
lines changed

2 files changed

+28
-55
lines changed

docx/parts/document.py

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -50,20 +50,11 @@ def get_or_add_image(self, image_descriptor):
5050
*rId* is the key for the relationship between this document part and
5151
the image part, reused if already present, newly created if not.
5252
"""
53-
raise NotImplementedError
54-
55-
def get_or_add_image_part(self, image_descriptor):
56-
"""
57-
Return an ``(image_part, rId)`` 2-tuple for the image identified by
58-
*image_descriptor*. *image_part* is an |Image| instance corresponding
59-
to the image, newly created if no matching image part is found. *rId*
60-
is the key for the relationship between this document part and the
61-
image part, reused if already present, newly created if not.
62-
"""
63-
image_parts = self._package.image_parts
64-
image_part = image_parts.get_or_add_image_part(image_descriptor)
53+
image_part = self._package.image_parts.get_or_add_image_part(
54+
image_descriptor
55+
)
6556
rId = self.relate_to(image_part, RT.IMAGE)
66-
return (image_part, rId)
57+
return rId, image_part.image
6758

6859
def get_style(self, style_id, style_type):
6960
"""

tests/parts/test_document.py

Lines changed: 24 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from docx.image.image import Image
1212
from docx.opc.constants import RELATIONSHIP_TYPE as RT
1313
from docx.opc.coreprops import CoreProperties
14-
from docx.package import ImageParts, Package
14+
from docx.package import Package
1515
from docx.parts.document import DocumentPart
1616
from docx.parts.image import ImagePart
1717
from docx.parts.numbering import NumberingPart
@@ -35,6 +35,16 @@ def it_can_save_the_package_to_a_file(self, save_fixture):
3535
document.save(file_)
3636
document._package.save.assert_called_once_with(file_)
3737

38+
def it_can_get_or_add_an_image(self, get_image_fixture):
39+
document_part, path, image_part_, rId_, image_ = get_image_fixture
40+
41+
rId, image = document_part.get_or_add_image(path)
42+
43+
image_parts = document_part._package.image_parts
44+
image_parts.get_or_add_image_part.assert_called_once_with(path)
45+
document_part.relate_to.assert_called_once_with(image_part_, RT.IMAGE)
46+
assert (rId, image) == (rId_, image_)
47+
3848
def it_provides_access_to_the_document_styles(self, styles_fixture):
3949
document_part, styles_ = styles_fixture
4050
styles = document_part.styles
@@ -67,18 +77,6 @@ def it_creates_numbering_part_if_not_present(self, nmprt_create_fixture):
6777
)
6878
assert numbering_part is numbering_part_
6979

70-
def it_can_add_an_image_part_to_the_document(
71-
self, get_or_add_image_fixture):
72-
(document, image_descriptor_, image_parts_, relate_to_, image_part_,
73-
rId_) = get_or_add_image_fixture
74-
image_part, rId = document.get_or_add_image_part(image_descriptor_)
75-
image_parts_.get_or_add_image_part.assert_called_once_with(
76-
image_descriptor_
77-
)
78-
relate_to_.assert_called_once_with(image_part_, RT.IMAGE)
79-
assert image_part is image_part_
80-
assert rId == rId_
81-
8280
def it_knows_the_next_available_xml_id(self, next_id_fixture):
8381
document, expected_id = next_id_fixture
8482
assert document.next_id == expected_id
@@ -137,6 +135,17 @@ def core_props_fixture(self, package_, core_properties_):
137135
package_.core_properties = core_properties_
138136
return document_part, core_properties_
139137

138+
@pytest.fixture
139+
def get_image_fixture(self, package_, image_part_, image_, relate_to_):
140+
document_part = DocumentPart(None, None, None, package_)
141+
path, rId_ = 'foobar.png', 'rId42'
142+
143+
package_.image_parts.get_or_add_image_part.return_value = image_part_
144+
relate_to_.return_value = rId_
145+
image_part_.image = image_
146+
147+
return document_part, path, image_part_, rId_, image_
148+
140149
@pytest.fixture
141150
def get_style_fixture(self, styles_prop_, style_):
142151
document_part = DocumentPart(None, None, None, None)
@@ -236,17 +245,6 @@ def styles_part_get_fixture(self, part_related_by_, styles_part_):
236245
def core_properties_(self, request):
237246
return instance_mock(request, CoreProperties)
238247

239-
@pytest.fixture
240-
def get_or_add_image_fixture(
241-
self, request, package_, image_descriptor_, image_parts_,
242-
relate_to_, image_part_, rId_):
243-
package_.image_parts = image_parts_
244-
document = DocumentPart(None, None, None, package_)
245-
return (
246-
document, image_descriptor_, image_parts_, relate_to_,
247-
image_part_, rId_
248-
)
249-
250248
@pytest.fixture
251249
def get_or_add_image_(self, request):
252250
return method_mock(request, DocumentPart, 'get_or_add_image')
@@ -255,20 +253,10 @@ def get_or_add_image_(self, request):
255253
def image_(self, request):
256254
return instance_mock(request, Image)
257255

258-
@pytest.fixture
259-
def image_descriptor_(self, request):
260-
return instance_mock(request, str)
261-
262256
@pytest.fixture
263257
def image_part_(self, request):
264258
return instance_mock(request, ImagePart)
265259

266-
@pytest.fixture
267-
def image_parts_(self, request, image_part_):
268-
image_parts_ = instance_mock(request, ImageParts)
269-
image_parts_.get_or_add_image_part.return_value = image_part_
270-
return image_parts_
271-
272260
@pytest.fixture
273261
def InlineShapes_(self, request):
274262
return class_mock(request, 'docx.parts.document.InlineShapes')
@@ -298,14 +286,8 @@ def part_related_by_(self, request):
298286
return method_mock(request, DocumentPart, 'part_related_by')
299287

300288
@pytest.fixture
301-
def relate_to_(self, request, rId_):
302-
relate_to_ = method_mock(request, DocumentPart, 'relate_to')
303-
relate_to_.return_value = rId_
304-
return relate_to_
305-
306-
@pytest.fixture
307-
def rId_(self, request):
308-
return instance_mock(request, str)
289+
def relate_to_(self, request):
290+
return method_mock(request, DocumentPart, 'relate_to')
309291

310292
@pytest.fixture
311293
def style_(self, request):

0 commit comments

Comments
 (0)