1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
"""Step implementations for graphical object (shape) related features."""
import hashlib
from behave import given, then, when
from docx import Document
from docx.enum.shape import WD_INLINE_SHAPE
from docx.shape import InlineShape
from docx.shared import Inches
from helpers import test_docx
# given ===================================================
@given("an inline shape collection containing five shapes")
def given_an_inline_shape_collection_containing_five_shapes(context):
docx_path = test_docx("shp-inline-shape-access")
document = Document(docx_path)
context.inline_shapes = document.inline_shapes
@given("an inline shape of known dimensions")
def given_inline_shape_of_known_dimensions(context):
document = Document(test_docx("shp-inline-shape-access"))
context.inline_shape = document.inline_shapes[0]
@given("an inline shape known to be {shp_of_type}")
def given_inline_shape_known_to_be_shape_of_type(context, shp_of_type):
inline_shape_idx = {
"an embedded picture": 0,
"a linked picture": 1,
"a link+embed picture": 2,
"a smart art diagram": 3,
"a chart": 4,
}[shp_of_type]
docx_path = test_docx("shp-inline-shape-access")
document = Document(docx_path)
context.inline_shape = document.inline_shapes[inline_shape_idx]
# when =====================================================
@when("I change the dimensions of the inline shape")
def when_change_dimensions_of_inline_shape(context):
inline_shape = context.inline_shape
inline_shape.width = Inches(1)
inline_shape.height = Inches(0.5)
# then =====================================================
@then("I can access each inline shape by index")
def then_can_access_each_inline_shape_by_index(context):
inline_shapes = context.inline_shapes
for idx in range(2):
inline_shape = inline_shapes[idx]
assert isinstance(inline_shape, InlineShape)
@then("I can iterate over the inline shape collection")
def then_can_iterate_over_inline_shape_collection(context):
inline_shapes = context.inline_shapes
shape_count = 0
for inline_shape in inline_shapes:
shape_count += 1
assert isinstance(inline_shape, InlineShape)
expected_count = 5
assert shape_count == expected_count, "expected %d, got %d" % (
expected_count,
shape_count,
)
@then("its inline shape type is {shape_type}")
def then_inline_shape_type_is_shape_type(context, shape_type):
expected_value = {
"WD_INLINE_SHAPE.CHART": WD_INLINE_SHAPE.CHART,
"WD_INLINE_SHAPE.LINKED_PICTURE": WD_INLINE_SHAPE.LINKED_PICTURE,
"WD_INLINE_SHAPE.PICTURE": WD_INLINE_SHAPE.PICTURE,
"WD_INLINE_SHAPE.SMART_ART": WD_INLINE_SHAPE.SMART_ART,
}[shape_type]
inline_shape = context.inline_shape
assert inline_shape.type == expected_value
@then("the dimensions of the inline shape match the known values")
def then_dimensions_of_inline_shape_match_known_values(context):
inline_shape = context.inline_shape
assert inline_shape.width == 1778000, "got %s" % inline_shape.width
assert inline_shape.height == 711200, "got %s" % inline_shape.height
@then("the dimensions of the inline shape match the new values")
def then_dimensions_of_inline_shape_match_new_values(context):
inline_shape = context.inline_shape
assert inline_shape.width == 914400, "got %s" % inline_shape.width
assert inline_shape.height == 457200, "got %s" % inline_shape.height
@then("the document contains the inline picture")
def then_the_document_contains_the_inline_picture(context):
document = context.document
picture_shape = document.inline_shapes[0]
blip = picture_shape._inline.graphic.graphicData.pic.blipFill.blip
rId = blip.embed
image_part = document.part.related_parts[rId]
image_sha1 = hashlib.sha1(image_part.blob).hexdigest()
expected_sha1 = "79769f1e202add2e963158b532e36c2c0f76a70c"
assert image_sha1 == expected_sha1, "image SHA1 doesn't match, expected %s, got %s" % (
expected_sha1,
image_sha1,
)
@then("the length of the inline shape collection is 5")
def then_len_of_inline_shape_collection_is_5(context):
inline_shapes = context.inline_shapes
shape_count = len(inline_shapes)
assert shape_count == 5, "got %s" % shape_count
@then("the picture has its native width and height")
def then_picture_has_native_width_and_height(context):
picture = context.picture
assert picture.width == 1905000, "got %d" % picture.width
assert picture.height == 2717800, "got %d" % picture.height
@then("picture.height is {inches} inches")
def then_picture_height_is_value(context, inches):
expected_value = {
"2.14": 1956816,
"2.5": 2286000,
}[inches]
picture = context.picture
assert picture.height == expected_value, "got %d" % picture.height
@then("picture.width is {inches} inches")
def then_picture_width_is_value(context, inches):
expected_value = {
"1.05": 961402,
"1.75": 1600200,
}[inches]
picture = context.picture
assert picture.width == expected_value, "got %d" % picture.width
|