def find_converter(path): for pattern, converter in CONVERTERS: if fnmatch.fnmatch(path, pattern): conv = converter break else: conv = converters.NoopConverter() return conv
# - checks that the .pbit.extract folder is up to date with the latest .pbit (i.e. they match exactly - and the .pbit hasn't been exported but user forgot to run the extract script) # - adds a warning (with y/n continue feedback) if the .pbix has been updated *after* the latest .pbit.extract is updated. (I.e. they maybe forgot to export the latest .pbit and extract, or exported .pbit but forgot to extract.) Note that this will be obvious in the case of only a single change (as it were) - since .pbix aren't tracked, they'll see no changes to git tracked files. import zipfile import os import shutil import fnmatch import converters CONVERTERS = [ ('DataModelSchema', converters.JSONConverter('utf-16-le')), ('DiagramState', converters.JSONConverter('utf-16-le')), ('Report/Layout', converters.JSONConverter('utf-16-le')), ('Report/LinguisticSchema', converters.XMLConverter('utf-16-le', False)), ('[Content_Types].xml', converters.XMLConverter('utf-8-sig', True)), ('SecurityBindings', converters.NoopConverter()), ('Settings', converters.NoopConverter()), ('Version', converters.NoopConverter()), ('Report/StaticResources/', converters.NoopConverter()), ('DataMashup', converters.DataMashupConverter()), ('Metadata', converters.MetadataConverter()), ('*.json', converters.JSONConverter('utf-8')) ] def find_converter(path): for pattern, converter in CONVERTERS: if fnmatch.fnmatch(path, pattern): conv = converter break else:
import json import re from io import BytesIO import struct from lxml import etree import os import shutil import converters CONVERTERS = { 'DataModelSchema': converters.JSONConverter('utf-16-le'), 'DiagramState': converters.JSONConverter('utf-16-le'), 'Report/Layout': converters.JSONConverter('utf-16-le'), 'Report/LinguisticSchema': converters.XMLConverter('utf-16-le', False), '[Content_Types].xml': converters.XMLConverter('utf-8-sig', True), 'SecurityBindings': converters.NoopConverter(), 'Settings': converters.NoopConverter(), 'Version': converters.NoopConverter(), 'Report/StaticResources/': converters.NoopConverter(), 'DataMashup': converters.DataMashupConverter(), 'Metadata': converters.MetadataConverter() } def extract_pbit(pbit_path, extracted_path): """ Convert a pbit to vcs format """ # TODO: check ends in pbit # TODO: check all expected files are present (in the right order) outdir = pbit_path + '.extract'