diff --git a/tableaudocumentapi/datasource.py b/tableaudocumentapi/datasource.py index 63157e9..a34cba5 100644 --- a/tableaudocumentapi/datasource.py +++ b/tableaudocumentapi/datasource.py @@ -137,6 +137,7 @@ def __init__(self, dsxml, filename=None): self._name = self._datasourceXML.get('name') or self._datasourceXML.get( 'formatted-name') # TDS files don't have a name attribute self._version = self._datasourceXML.get('version') + self._caption = self._datasourceXML.get('caption', '') self._connection_parser = ConnectionParser( self._datasourceXML, version=self._version) self._connections = self._connection_parser.get_connections() @@ -207,6 +208,20 @@ def name(self): def version(self): return self._version + @property + def caption(self): + return self._caption + + @caption.setter + def caption(self, value): + self._datasourceXML.set('caption', value) + self._caption = value + + @caption.deleter + def caption(self): + del self._datasourceXML.attrib['caption'] + self._caption = '' + ########### # connections ########### diff --git a/test/assets/datasource_test.tds b/test/assets/datasource_test.tds index 5f280eb..407127d 100644 --- a/test/assets/datasource_test.tds +++ b/test/assets/datasource_test.tds @@ -1,5 +1,6 @@ - + diff --git a/test/test_datasource.py b/test/test_datasource.py index baf5bc3..838bc55 100644 --- a/test/test_datasource.py +++ b/test/test_datasource.py @@ -1,5 +1,9 @@ -import unittest +import os import os.path +import shutil +import tempfile +import unittest + from tableaudocumentapi import Datasource, Workbook @@ -22,6 +26,19 @@ class DataSourceFieldsTDS(unittest.TestCase): def setUp(self): self.ds = Datasource.from_file(TEST_TDS_FILE) + self.to_delete = set() + + def cleanUp(self): + for path in self.to_delete: + if os.path.isdir(path): + shutil.rmtree(path, ignore_errors=True) + elif os.path.isfile(path): + os.unlink(path) + + def get_temp_file(self, filename): + tempdir = tempfile.mkdtemp('tda-datasource') + self.to_delete.add(tempdir) + return os.path.join(tempdir, filename) def test_datasource_returns_correct_fields(self): self.assertIsNotNone(self.ds.fields) @@ -63,6 +80,30 @@ def test_datasource_field_description(self): self.assertIsNotNone(actual) self.assertTrue(u'muted gray' in actual) + def test_datasource_caption(self): + actual = self.ds.caption + self.assertIsNotNone(actual) + self.assertEqual(actual, 'foo') + + def test_datasource_can_set_caption(self): + filename = self.get_temp_file('test_datasource_can_set_caption') + self.ds.caption = 'bar' + self.ds.save_as(filename) + + actual = Datasource.from_file(filename) + self.assertIsNotNone(actual) + self.assertIsNotNone(actual.caption) + self.assertEqual(actual.caption, 'bar') + + def test_datasource_can_remove_caption(self): + filename = self.get_temp_file('test_datasource_can_remove_caption') + del self.ds.caption + self.ds.save_as(filename) + + actual = Datasource.from_file(filename) + self.assertIsNotNone(actual) + self.assertEqual(actual.caption, '') + def test_datasource_clear_repository_location(self): filename = os.path.join(TEST_ASSET_DIR, 'clear-repository-test.tds')