# -*- coding: utf-8 -*-
#
# unitdata.py
#
# Copyright (C) 2013 Steve Canny scanny@cisco.com
#
# This module is part of python-opc and is released under the MIT License:
# http://www.opensource.org/licenses/mit-license.php
"""Test data builders for unit tests"""
from opc.constants import NAMESPACE as NS
from opc.oxml import oxml_fromstring
class BaseBuilder(object):
"""
Provides common behavior for all data builders.
"""
@property
def element(self):
"""Return element based on XML generated by builder"""
return oxml_fromstring(self.xml)
def with_indent(self, indent):
"""Add integer *indent* spaces at beginning of element XML"""
self._indent = indent
return self
class CT_DefaultBuilder(BaseBuilder):
"""
Test data builder for CT_Default (Default) XML element that appears in
`[Content_Types].xml`.
"""
def __init__(self):
"""Establish instance variables with default values"""
self._content_type = 'application/xml'
self._extension = 'xml'
self._indent = 0
self._namespace = ' xmlns="%s"' % NS.OPC_CONTENT_TYPES
def with_content_type(self, content_type):
"""Set ContentType attribute to *content_type*"""
self._content_type = content_type
return self
def with_extension(self, extension):
"""Set Extension attribute to *extension*"""
self._extension = extension
return self
def without_namespace(self):
"""Don't include an 'xmlns=' attribute"""
self._namespace = ''
return self
@property
def xml(self):
"""Return Default element"""
tmpl = '%s\n'
indent = ' ' * self._indent
return tmpl % (indent, self._namespace, self._extension,
self._content_type)
class CT_OverrideBuilder(BaseBuilder):
"""
Test data builder for CT_Override (Override) XML element that appears in
`[Content_Types].xml`.
"""
def __init__(self):
"""Establish instance variables with default values"""
self._content_type = 'app/vnd.type'
self._indent = 0
self._namespace = ' xmlns="%s"' % NS.OPC_CONTENT_TYPES
self._partname = '/part/name.xml'
def with_content_type(self, content_type):
"""Set ContentType attribute to *content_type*"""
self._content_type = content_type
return self
def with_partname(self, partname):
"""Set PartName attribute to *partname*"""
self._partname = partname
return self
def without_namespace(self):
"""Don't include an 'xmlns=' attribute"""
self._namespace = ''
return self
@property
def xml(self):
"""Return Override element"""
tmpl = '%s\n'
indent = ' ' * self._indent
return tmpl % (indent, self._namespace, self._partname,
self._content_type)
class CT_RelationshipBuilder(BaseBuilder):
"""
Test data builder for CT_Relationship (Relationship) XML element that
appears in .rels files
"""
def __init__(self):
"""Establish instance variables with default values"""
self._rId = 'rId9'
self._reltype = 'ReLtYpE'
self._target = 'docProps/core.xml'
self._target_mode = None
self._indent = 0
self._namespace = ' xmlns="%s"' % NS.OPC_RELATIONSHIPS
def with_rId(self, rId):
"""Set Id attribute to *rId*"""
self._rId = rId
return self
def with_reltype(self, reltype):
"""Set Type attribute to *reltype*"""
self._reltype = reltype
return self
def with_target(self, target):
"""Set XXX attribute to *target*"""
self._target = target
return self
def with_target_mode(self, target_mode):
"""Set TargetMode attribute to *target_mode*"""
self._target_mode = None if target_mode == 'Internal' else target_mode
return self
def without_namespace(self):
"""Don't include an 'xmlns=' attribute"""
self._namespace = ''
return self
@property
def target_mode(self):
if self._target_mode is None:
return ''
return ' TargetMode="%s"' % self._target_mode
@property
def xml(self):
"""Return Relationship element"""
tmpl = '%s\n'
indent = ' ' * self._indent
return tmpl % (indent, self._namespace, self._rId, self._reltype,
self._target, self.target_mode)
class CT_RelationshipsBuilder(BaseBuilder):
"""
Test data builder for CT_Relationships (Relationships) XML element, the
root element in .rels files.
"""
def __init__(self):
"""Establish instance variables with default values"""
self._rels = (
('rId1', 'http://reltype1', 'docProps/core.xml', 'Internal'),
('rId2', 'http://linktype', 'http://some/link', 'External'),
('rId3', 'http://reltype2', '../slides/slide1.xml', 'Internal'),
)
@property
def xml(self):
"""
Return XML string based on settings accumulated via method calls.
"""
xml = '\n' % NS.OPC_RELATIONSHIPS
for rId, reltype, target, target_mode in self._rels:
xml += (a_Relationship().with_rId(rId)
.with_reltype(reltype)
.with_target(target)
.with_target_mode(target_mode)
.with_indent(2)
.without_namespace()
.xml)
xml += '\n'
return xml
class CT_TypesBuilder(BaseBuilder):
"""
Test data builder for CT_Types () XML element, the root element in
[Content_Types].xml files
"""
def __init__(self):
"""Establish instance variables with default values"""
self._defaults = (
('xml', 'application/xml'),
('jpeg', 'image/jpeg'),
)
self._empty = False
self._overrides = (
('/docProps/core.xml', 'app/vnd.type1'),
('/ppt/presentation.xml', 'app/vnd.type2'),
('/docProps/thumbnail.jpeg', 'image/jpeg'),
)
def empty(self):
self._empty = True
return self
@property
def xml(self):
"""
Return XML string based on settings accumulated via method calls
"""
if self._empty:
return '\n' % NS.OPC_CONTENT_TYPES
xml = '\n' % NS.OPC_CONTENT_TYPES
for extension, content_type in self._defaults:
xml += (a_Default().with_extension(extension)
.with_content_type(content_type)
.with_indent(2)
.without_namespace()
.xml)
for partname, content_type in self._overrides:
xml += (an_Override().with_partname(partname)
.with_content_type(content_type)
.with_indent(2)
.without_namespace()
.xml)
xml += '\n'
return xml
def a_Default():
"""Return a CT_DefaultBuilder instance"""
return CT_DefaultBuilder()
def an_Override():
"""Return a CT_OverrideBuilder instance"""
return CT_OverrideBuilder()
def a_Relationship():
"""Return a CT_RelationshipBuilder instance"""
return CT_RelationshipBuilder()
def a_Relationships():
"""Return a CT_RelationshipsBuilder instance"""
return CT_RelationshipsBuilder()
def a_Types():
"""Return a CT_TypesBuilder instance"""
return CT_TypesBuilder()