Repository URL to install this package:
Version:
0.8.10 ▾
|
# encoding: utf-8
"""
Step implementations for styles-related features
"""
from behave import given, then, when
from docx import Document
from docx.enum.style import WD_STYLE_TYPE
from docx.styles.latent import _LatentStyle, LatentStyles
from docx.styles.style import BaseStyle
from docx.text.font import Font
from docx.text.parfmt import ParagraphFormat
from helpers import bool_vals, test_docx, tri_state_vals
style_types = {
'WD_STYLE_TYPE.CHARACTER': WD_STYLE_TYPE.CHARACTER,
'WD_STYLE_TYPE.PARAGRAPH': WD_STYLE_TYPE.PARAGRAPH,
'WD_STYLE_TYPE.LIST': WD_STYLE_TYPE.LIST,
'WD_STYLE_TYPE.TABLE': WD_STYLE_TYPE.TABLE,
}
# given ===================================================
@given('a document having a styles part')
def given_a_document_having_a_styles_part(context):
docx_path = test_docx('sty-having-styles-part')
context.document = Document(docx_path)
@given('a document having known styles')
def given_a_document_having_known_styles(context):
docx_path = test_docx('sty-known-styles')
document = Document(docx_path)
context.document = document
context.style_count = len(document.styles)
@given('a document having no styles part')
def given_a_document_having_no_styles_part(context):
docx_path = test_docx('sty-having-no-styles-part')
context.document = Document(docx_path)
@given('a latent style collection')
def given_a_latent_style_collection(context):
document = Document(test_docx('sty-known-styles'))
context.latent_styles = document.styles.latent_styles
@given('a latent style having a known name')
def given_a_latent_style_having_a_known_name(context):
document = Document(test_docx('sty-known-styles'))
latent_styles = list(document.styles.latent_styles)
context.latent_style = latent_styles[0] # should be 'Normal'
@given('a latent style having priority of {setting}')
def given_a_latent_style_having_priority_of_setting(context, setting):
latent_style_name = {
'42': 'Normal',
'no setting': 'Subtitle',
}[setting]
document = Document(test_docx('sty-known-styles'))
latent_styles = document.styles.latent_styles
context.latent_style = latent_styles[latent_style_name]
@given('a latent style having {prop_name} set {setting}')
def given_a_latent_style_having_prop_setting(context, prop_name, setting):
latent_style_name = {
'on': 'Normal',
'off': 'Title',
'no setting': 'Subtitle',
}[setting]
document = Document(test_docx('sty-known-styles'))
latent_styles = document.styles.latent_styles
context.latent_style = latent_styles[latent_style_name]
@given('a latent styles object with known defaults')
def given_a_latent_styles_object_with_known_defaults(context):
document = Document(test_docx('sty-known-styles'))
context.latent_styles = document.styles.latent_styles
@given('a style based on {base_style}')
def given_a_style_based_on_setting(context, base_style):
style_name = {
'no style': 'Base',
'Normal': 'Sub Normal',
'Base': 'Citation',
}[base_style]
document = Document(test_docx('sty-known-styles'))
context.styles = document.styles
context.style = document.styles[style_name]
@given('a style having a known {attr_name}')
def given_a_style_having_a_known_attr_name(context, attr_name):
docx_path = test_docx('sty-having-styles-part')
document = Document(docx_path)
context.style = document.styles['Normal']
@given('a style having hidden set {setting}')
def given_a_style_having_hidden_set_setting(context, setting):
document = Document(test_docx('sty-behav-props'))
style_name = {
'on': 'Foo',
'off': 'Bar',
'no setting': 'Baz',
}[setting]
context.style = document.styles[style_name]
@given('a style having locked set {setting}')
def given_a_style_having_locked_setting(context, setting):
document = Document(test_docx('sty-behav-props'))
style_name = {
'on': 'Foo',
'off': 'Bar',
'no setting': 'Baz',
}[setting]
context.style = document.styles[style_name]
@given('a style having next paragraph style set to {setting}')
def given_a_style_having_next_paragraph_style_setting(context, setting):
document = Document(test_docx('sty-known-styles'))
style_name = {
'Sub Normal': 'Citation',
'Foobar': 'Sub Normal',
'Base': 'Foo',
'no setting': 'Base',
}[setting]
context.styles = document.styles
context.style = document.styles[style_name]
@given('a style having priority of {setting}')
def given_a_style_having_priority_of_setting(context, setting):
document = Document(test_docx('sty-behav-props'))
style_name = {
'no setting': 'Baz',
'42': 'Foo',
}[setting]
context.style = document.styles[style_name]
@given('a style having quick-style set {setting}')
def given_a_style_having_quick_style_setting(context, setting):
document = Document(test_docx('sty-behav-props'))
style_name = {
'on': 'Foo',
'off': 'Bar',
'no setting': 'Baz',
}[setting]
context.style = document.styles[style_name]
@given('a style having unhide-when-used set {setting}')
def given_a_style_having_unhide_when_used_setting(context, setting):
document = Document(test_docx('sty-behav-props'))
style_name = {
'on': 'Foo',
'off': 'Bar',
'no setting': 'Baz',
}[setting]
context.style = document.styles[style_name]
@given('a style of type {style_type}')
def given_a_style_of_type(context, style_type):
document = Document(test_docx('sty-known-styles'))
name = {
'WD_STYLE_TYPE.CHARACTER': 'Default Paragraph Font',
'WD_STYLE_TYPE.LIST': 'No List',
'WD_STYLE_TYPE.PARAGRAPH': 'Normal',
'WD_STYLE_TYPE.TABLE': 'Normal Table',
}[style_type]
context.style = document.styles[name]
@given('the style collection of a document')
def given_the_style_collection_of_a_document(context):
document = Document(test_docx('sty-known-styles'))
context.styles = document.styles
# when =====================================================
@when('I add a latent style named \'Foobar\'')
def when_I_add_a_latent_style_named_Foobar(context):
latent_styles = context.document.styles.latent_styles
context.latent_styles = latent_styles
context.latent_style_count = len(latent_styles)
latent_styles.add_latent_style('Foobar')
@when('I assign a new name to the style')
def when_I_assign_a_new_name_to_the_style(context):
context.style.name = 'Foobar'
@when('I assign a new value to style.style_id')
def when_I_assign_a_new_value_to_style_style_id(context):
context.style.style_id = 'Foo42'
@when('I assign {value} to latent_style.{prop_name}')
def when_I_assign_value_to_latent_style_prop(context, value, prop_name):
latent_style = context.latent_style
new_value = (
tri_state_vals[value] if value in tri_state_vals else int(value)
)
setattr(latent_style, prop_name, new_value)
@when('I assign {value} to latent_styles.{prop_name}')
def when_I_assign_value_to_latent_styles_prop(context, value, prop_name):
latent_styles = context.latent_styles
new_value = bool_vals[value] if value in bool_vals else int(value)
setattr(latent_styles, prop_name, new_value)
@when('I assign {value_key} to style.base_style')
def when_I_assign_value_to_style_base_style(context, value_key):
value = {
'None': None,
'styles[\'Normal\']': context.styles['Normal'],
'styles[\'Base\']': context.styles['Base'],
}[value_key]
context.style.base_style = value
@when('I assign {value} to style.hidden')
def when_I_assign_value_to_style_hidden(context, value):
style, new_value = context.style, tri_state_vals[value]
style.hidden = new_value
@when('I assign {value} to style.locked')
def when_I_assign_value_to_style_locked(context, value):
style, new_value = context.style, bool_vals[value]
style.locked = new_value
@when('I assign {value} to style.next_paragraph_style')
def when_I_assign_value_to_style_next_paragraph_style(context, value):
styles, style = context.styles, context.style
new_value = None if value == 'None' else styles[value]
style.next_paragraph_style = new_value
@when('I assign {value} to style.priority')
def when_I_assign_value_to_style_priority(context, value):
style = context.style
new_value = None if value == 'None' else int(value)
style.priority = new_value
@when('I assign {value} to style.quick_style')
def when_I_assign_value_to_style_quick_style(context, value):
style, new_value = context.style, bool_vals[value]
style.quick_style = new_value
@when('I assign {value} to style.unhide_when_used')
def when_I_assign_value_to_style_unhide_when_used(context, value):
style, new_value = context.style, bool_vals[value]
style.unhide_when_used = new_value
@when('I call add_style(\'{name}\', {type_str}, builtin={builtin_str})')
def when_I_call_add_style(context, name, type_str, builtin_str):
styles = context.document.styles
type = style_types[type_str]
builtin = bool_vals[builtin_str]
styles.add_style(name, type, builtin=builtin)
@when('I delete a latent style')
def when_I_delete_a_latent_style(context):
latent_styles = context.document.styles.latent_styles
context.latent_styles = latent_styles
context.latent_style_count = len(latent_styles)
latent_styles['Normal'].delete()
@when('I delete a style')
def when_I_delete_a_style(context):
context.document.styles['No List'].delete()
# then =====================================================
@then('I can access a latent style by name')
def then_I_can_access_a_latent_style_by_name(context):
latent_styles = context.latent_styles
latent_style = latent_styles['Colorful Shading']
assert isinstance(latent_style, _LatentStyle)
@then('I can access a style by its UI name')
def then_I_can_access_a_style_by_its_UI_name(context):
styles = context.document.styles
style = styles['Default Paragraph Font']
assert isinstance(style, BaseStyle)
@then('I can access a style by style id')
def then_I_can_access_a_style_by_style_id(context):
styles = context.document.styles
style = styles['DefaultParagraphFont']
assert isinstance(style, BaseStyle)
@then('I can iterate over its styles')
def then_I_can_iterate_over_its_styles(context):
styles = [s for s in context.document.styles]
assert len(styles) > 0
assert all(isinstance(s, BaseStyle) for s in styles)
@then('I can iterate over the latent styles')
def then_I_can_iterate_over_the_latent_styles(context):
latent_styles = [ls for ls in context.latent_styles]
assert len(latent_styles) == 137
assert all(isinstance(ls, _LatentStyle) for ls in latent_styles)
@then('latent_style.name is the known name')
def then_latent_style_name_is_the_known_name(context):
latent_style = context.latent_style
assert latent_style.name == 'Normal'
@then('latent_style.priority is {value}')
def then_latent_style_priority_is_value(context, value):
latent_style = context.latent_style
expected_value = None if value == 'None' else int(value)
assert latent_style.priority == expected_value
@then('latent_style.{prop_name} is {value}')
def then_latent_style_prop_name_is_value(context, prop_name, value):
latent_style = context.latent_style
actual_value = getattr(latent_style, prop_name)
expected_value = tri_state_vals[value]
assert actual_value == expected_value
@then('latent_styles[\'Foobar\'] is a latent style')
def then_latentStyles_Foobar_is_a_latent_style(context):
latent_styles = context.latent_styles
latent_style = latent_styles['Foobar']
assert isinstance(latent_style, _LatentStyle)
@then('latent_styles.{prop_name} is {value}')
def then_latent_styles_prop_name_is_value(context, prop_name, value):
latent_styles = context.latent_styles
expected_value = bool_vals[value] if value in bool_vals else int(value)
actual_value = getattr(latent_styles, prop_name)
assert actual_value == expected_value
@then('len(latent_styles) is 137')
def then_len_latent_styles_is_137(context):
assert len(context.latent_styles) == 137
@then('len(styles) is {style_count_str}')
def then_len_styles_is_style_count(context, style_count_str):
assert len(context.document.styles) == int(style_count_str)
@then('style.base_style is {value_key}')
def then_style_base_style_is_value(context, value_key):
expected_value = {
'None': None,
'styles[\'Normal\']': context.styles['Normal'],
'styles[\'Base\']': context.styles['Base'],
}[value_key]
style = context.style
assert style.base_style == expected_value
@then('style.builtin is {builtin_str}')
def then_style_builtin_is_builtin(context, builtin_str):
style = context.style
builtin = bool_vals[builtin_str]
assert style.builtin == builtin
@then('style.font is the Font object for the style')
def then_style_font_is_the_Font_object_for_the_style(context):
style = context.style
font = style.font
assert isinstance(font, Font)
assert font.element is style.element
@then('style.hidden is {value}')
def then_style_hidden_is_value(context, value):
style, expected_value = context.style, tri_state_vals[value]
assert style.hidden is expected_value
@then('style.locked is {value}')
def then_style_locked_is_value(context, value):
style, expected_value = context.style, bool_vals[value]
assert style.locked is expected_value
@then('style.name is the {which} name')
def then_style_name_is_the_which_name(context, which):
expected_name = {
'known': 'Normal',
'new': 'Foobar',
}[which]
style = context.style
assert style.name == expected_name
@then('style.next_paragraph_style is {value}')
def then_style_next_paragraph_style_is_value(context, value):
style, styles = context.style, context.styles
actual_value = style.next_paragraph_style
expected_value = styles[value]
assert actual_value == expected_value, 'got %s' % actual_value
@then('style.paragraph_format is the ParagraphFormat object for the style')
def then_style_paragraph_format_is_the_ParagraphFormat_object(context):
style = context.style
paragraph_format = style.paragraph_format
assert isinstance(paragraph_format, ParagraphFormat)
assert paragraph_format.element is style.element
@then('style.priority is {value}')
def then_style_priority_is_value(context, value):
style = context.style
expected_value = None if value == 'None' else int(value)
assert style.priority == expected_value
@then('style.quick_style is {value}')
def then_style_quick_style_is_value(context, value):
style, expected_value = context.style, bool_vals[value]
assert style.quick_style is expected_value
@then('style.style_id is the {which} style id')
def then_style_style_id_is_the_which_style_id(context, which):
expected_style_id = {
'known': 'Normal',
'new': 'Foo42',
}[which]
style = context.style
assert style.style_id == expected_style_id
@then('style.type is the known type')
def then_style_type_is_the_known_type(context):
style = context.style
assert style.type == WD_STYLE_TYPE.PARAGRAPH
@then('style.type is {type_str}')
def then_style_type_is_type(context, type_str):
style = context.style
style_type = style_types[type_str]
assert style.type == style_type
@then('style.unhide_when_used is {value}')
def then_style_unhide_when_used_is_value(context, value):
style, expected_value = context.style, bool_vals[value]
assert style.unhide_when_used is expected_value
@then('styles.latent_styles is the LatentStyles object for the document')
def then_styles_latent_styles_is_the_LatentStyles_object(context):
styles = context.styles
context.latent_styles = latent_styles = styles.latent_styles
assert isinstance(latent_styles, LatentStyles)
assert latent_styles.element is styles.element.latentStyles
@then('styles[\'{name}\'] is a style')
def then_styles_name_is_a_style(context, name):
styles = context.document.styles
style = context.style = styles[name]
assert isinstance(style, BaseStyle)
@then('the deleted latent style is not in the latent styles collection')
def then_the_deleted_latent_style_is_not_in_the_collection(context):
latent_styles = context.latent_styles
try:
latent_styles['Normal']
except KeyError:
return
raise AssertionError('Latent style not deleted')
@then('the deleted style is not in the styles collection')
def then_the_deleted_style_is_not_in_the_styles_collection(context):
document = context.document
try:
document.styles['No List']
except KeyError:
return
raise AssertionError('Style not deleted')
@then('the document has one additional latent style')
def then_the_document_has_one_additional_latent_style(context):
latent_styles = context.document.styles.latent_styles
latent_style_count = len(latent_styles)
expected_count = context.latent_style_count + 1
assert latent_style_count == expected_count
@then('the document has one additional style')
def then_the_document_has_one_additional_style(context):
document = context.document
style_count = len(document.styles)
expected_style_count = context.style_count + 1
assert style_count == expected_style_count
@then('the document has one fewer latent styles')
def then_the_document_has_one_fewer_latent_styles(context):
latent_style_count = len(context.latent_styles)
expected_count = context.latent_style_count - 1
assert latent_style_count == expected_count
@then('the document has one fewer styles')
def then_the_document_has_one_fewer_styles(context):
document = context.document
style_count = len(document.styles)
expected_style_count = context.style_count - 1
assert style_count == expected_style_count