From 2f028cbb67e25a3993c11affe1f2a756ac421838 Mon Sep 17 00:00:00 2001 From: T8y8 Date: Thu, 8 Dec 2016 12:46:36 -0800 Subject: [PATCH] Fix #117 by only attempting files with the right extension inside the archive --- tableaudocumentapi/xfile.py | 16 ++++++++++++---- test/assets/Cache.twbx | Bin 0 -> 36196 bytes test/test_xfile.py | 9 +++++++++ 3 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 test/assets/Cache.twbx diff --git a/tableaudocumentapi/xfile.py b/tableaudocumentapi/xfile.py index 3067781..cac6c09 100644 --- a/tableaudocumentapi/xfile.py +++ b/tableaudocumentapi/xfile.py @@ -52,7 +52,15 @@ def temporary_directory(*args, **kwargs): def find_file_in_zip(zip_file): - for filename in zip_file.namelist(): + '''Returns the twb/tds file from a Tableau packaged file format. Packaged + files can contain cache entries which are also valid XML, so only look for + files with a .tds or .twb extension. + ''' + + candidate_files = filter(lambda x: x.split('.')[-1] in ('twb', 'tds'), + zip_file.namelist()) + + for filename in candidate_files: with zip_file.open(filename) as xml_candidate: try: ET.parse(xml_candidate) @@ -81,10 +89,10 @@ def build_archive_file(archive_contents, zip_file): def save_into_archive(xml_tree, filename, new_filename=None): - # Saving a archive means extracting the contents into a temp folder, + # Saving an archive means extracting the contents into a temp folder, # saving the changes over the twb/tds in that folder, and then - # packaging it back up into a specifically formatted zip with the correct - # relative file paths + # packaging it back up into a zip with a very specific format + # e.g. no empty files for directories, which Windows and Mac do by default if new_filename is None: new_filename = filename diff --git a/test/assets/Cache.twbx b/test/assets/Cache.twbx new file mode 100644 index 0000000000000000000000000000000000000000..b1df6b7bb6607ccbced8233e7c60aae281431d6c GIT binary patch literal 36196 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 literal 0 HcmV?d00001 diff --git a/test/test_xfile.py b/test/test_xfile.py index 6cbe67f..259c98b 100644 --- a/test/test_xfile.py +++ b/test/test_xfile.py @@ -12,8 +12,17 @@ 'BadZip.zip' ) +TWBX_WITH_CACHE_FILES = os.path.join( + TEST_ASSET_DIR, + 'Cache.twbx' +) + class XFileEdgeTests(unittest.TestCase): def test_find_file_in_zip_no_xml_file(self): badzip = zipfile.ZipFile(BAD_ZIP_FILE) self.assertIsNone(find_file_in_zip(badzip)) + + def test_only_find_twbs(self): + twb_from_twbx_with_cache = zipfile.ZipFile(TWBX_WITH_CACHE_FILES) + self.assertEqual(find_file_in_zip(twb_from_twbx_with_cache), 'Superstore.twb') pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy