from __future__ import absolute_import
# Copyright (c) 2010-2017 openpyxl
import pytest
from io import BytesIO
from zipfile import ZipFile
from openpyxl.xml.functions import fromstring, tostring
from openpyxl.tests.helper import compare_xml
from openpyxl.xml.constants import (
ARC_CONTENT_TYPES,
ARC_WORKBOOK,
CONTYPES_NS,
XLSM,
XLSX,
XLTM,
XLTX,
)
@pytest.fixture
[docs]def FileExtension():
from ..manifest import FileExtension
return FileExtension
[docs]class TestFileExtension:
[docs] def test_ctor(self, FileExtension):
ext = FileExtension(
ContentType="application/xml",
Extension="xml"
)
xml = tostring(ext.to_tree())
expected = """
<Default ContentType="application/xml" Extension="xml"/>
"""
diff = compare_xml(xml, expected)
assert diff is None, diff
[docs] def test_from_xml(self, FileExtension):
src = """
<Default ContentType="application/xml" Extension="xml"/>
"""
node = fromstring(src)
ext = FileExtension.from_tree(node)
assert ext == FileExtension(ContentType="application/xml", Extension="xml")
@pytest.fixture
[docs]def Override():
from ..manifest import Override
return Override
[docs]class TestOverride:
[docs] def test_ctor(self, Override):
override = Override(
ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml",
PartName="/xl/workbook.xml"
)
xml = tostring(override.to_tree())
expected = """
<Override ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"
PartName="/xl/workbook.xml"/>
"""
diff = compare_xml(xml, expected)
assert diff is None, diff
[docs] def test_from_xml(self, Override):
src = """
<Override ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"
PartName="/xl/workbook.xml"/>
"""
node = fromstring(src)
override = Override.from_tree(node)
assert override == Override(
ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml",
PartName="/xl/workbook.xml"
)
@pytest.fixture
[docs]def Manifest():
from ..manifest import Manifest
return Manifest
[docs]class TestManifest:
[docs] def test_ctor(self, Manifest):
manifest = Manifest()
xml = tostring(manifest.to_tree())
expected = """
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
<Default ContentType="application/vnd.openxmlformats-package.relationships+xml" Extension="rels" />
<Default ContentType="application/xml" Extension="xml" />
<Override ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml"
PartName="/xl/sharedStrings.xml"/>
<Override ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml"
PartName="/xl/styles.xml"/>
<Override ContentType="application/vnd.openxmlformats-officedocument.theme+xml"
PartName="/xl/theme/theme1.xml"/>
<Override ContentType="application/vnd.openxmlformats-package.core-properties+xml"
PartName="/docProps/core.xml"/>
<Override ContentType="application/vnd.openxmlformats-officedocument.extended-properties+xml"
PartName="/docProps/app.xml"/>
</Types>
"""
diff = compare_xml(xml, expected)
assert diff is None, diff
[docs] def test_from_xml(self, datadir, Manifest):
datadir.chdir()
with open("manifest.xml") as src:
node = fromstring(src.read())
manifest = Manifest.from_tree(node)
assert len(manifest.Default) == 2
defaults = [
("application/xml", 'xml'),
("application/vnd.openxmlformats-package.relationships+xml", 'rels'),
]
assert [(ct.ContentType, ct.Extension) for ct in manifest.Default] == defaults
overrides = [
('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml',
'/xl/workbook.xml'),
('application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml',
'/xl/worksheets/sheet1.xml'),
('application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml',
'/xl/chartsheets/sheet1.xml'),
('application/vnd.openxmlformats-officedocument.theme+xml',
'/xl/theme/theme1.xml'),
('application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml',
'/xl/styles.xml'),
('application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml',
'/xl/sharedStrings.xml'),
('application/vnd.openxmlformats-officedocument.drawing+xml',
'/xl/drawings/drawing1.xml'),
('application/vnd.openxmlformats-officedocument.drawingml.chart+xml',
'/xl/charts/chart1.xml'),
('application/vnd.openxmlformats-package.core-properties+xml',
'/docProps/core.xml'),
('application/vnd.openxmlformats-officedocument.extended-properties+xml',
'/docProps/app.xml')
]
assert [(ct.ContentType, ct.PartName) for ct in manifest.Override] == overrides
[docs] def test_filenames(self, datadir, Manifest):
datadir.chdir()
with open("manifest.xml") as src:
node = fromstring(src.read())
manifest = Manifest.from_tree(node)
assert manifest.filenames == [
'/xl/workbook.xml',
'/xl/worksheets/sheet1.xml',
'/xl/chartsheets/sheet1.xml',
'/xl/theme/theme1.xml',
'/xl/styles.xml',
'/xl/sharedStrings.xml',
'/xl/drawings/drawing1.xml',
'/xl/charts/chart1.xml',
'/docProps/core.xml',
'/docProps/app.xml',
]
[docs] def test_exts(self, datadir, Manifest):
datadir.chdir()
with open("manifest.xml") as src:
node = fromstring(src.read())
manifest = Manifest.from_tree(node)
assert manifest.extensions == [
('xml', 'application/xml'),
]
[docs] def test_no_dupe_overrides(self, Manifest):
manifest = Manifest()
assert len(manifest.Override) == 5
manifest.Override.append("a")
manifest.Override.append("a")
assert len(manifest.Override) == 6
[docs] def test_no_dupe_types(self, Manifest):
manifest = Manifest()
assert len(manifest.Default) == 2
manifest.Default.append("a")
manifest.Default.append("a")
assert len(manifest.Default) == 3
[docs] def test_append(self, Manifest):
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
manifest = Manifest()
manifest.append(ws)
assert len(manifest.Override) == 6
[docs] def test_write(self, Manifest):
mf = Manifest()
from openpyxl import Workbook
wb = Workbook()
archive = ZipFile(BytesIO(), "w")
mf._write(archive, wb)
assert "/xl/workbook.xml" in mf.filenames
@pytest.mark.parametrize("file, registration",
[
('xl/media/image1.png',
'<Default ContentType="image/png" Extension="png" />'),
('xl/drawings/commentsDrawing.vml',
'<Default ContentType="application/vnd.openxmlformats-officedocument.vmlDrawing" Extension="vml" />'),
]
)
[docs] def test_vba(self, datadir, Manifest):
datadir.chdir()
from openpyxl import load_workbook
wb = load_workbook('sample.xlsm', keep_vba=True)
manifest = Manifest()
manifest._write_vba(wb)
partnames = set([t.PartName for t in manifest.Override])
expected = set([
'/xl/workbook.xml',
'/xl/worksheets/sheet1.xml',
'/xl/worksheets/sheet2.xml',
'/xl/worksheets/sheet3.xml',
'/xl/theme/theme1.xml',
'/xl/styles.xml',
'/docProps/core.xml',
'/docProps/app.xml',
'/xl/sharedStrings.xml'
])
assert partnames == expected
[docs] def test_no_defaults(self, datadir, Manifest):
"""
LibreOffice does not use the Default element
"""
xml = """
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
<Override PartName="/_rels/.rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>
</Types>
"""
node = fromstring(xml)
manifest = Manifest.from_tree(node)
exts = manifest.extensions
assert exts == []